Skip to content

Commit 7b9a398

Browse files
authored
[Az.RecoveryServices.Backup] Handling breaking change for SecureToken in Get-AzAccessToken command (#27406)
1 parent e0d3f83 commit 7b9a398

26 files changed

+423
-60
lines changed

src/RecoveryServices/RecoveryServices.Backup.Helpers/HelperUtils.cs

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
using ResourceManagerModel = Microsoft.Azure.Management.Internal.Resources.Models;
2222
using ServiceClientModel = Microsoft.Azure.Management.RecoveryServices.Backup.Models;
2323
using CrrModel = Microsoft.Azure.Management.RecoveryServices.Backup.CrossRegionRestore.Models;
24-
using Newtonsoft.Json;
24+
using Microsoft.WindowsAzure.Commands.Common;
2525

2626
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers
2727
{
@@ -413,5 +413,42 @@ public static List<T> GetPagedRMList<T>(
413413

414414
return resources;
415415
}
416+
417+
#region Common Helper Functions
418+
/// <summary>
419+
/// Helper function to return one of Token or SecureToken after decryption
420+
/// </summary>
421+
/// <param name="token"></param>
422+
/// <param name="secureToken"></param>
423+
/// <returns></returns>
424+
/// <exception cref="ArgumentException"></exception>
425+
public static string GetPlainToken(string token, System.Security.SecureString secureToken)
426+
{
427+
bool hasToken = !string.IsNullOrEmpty(token);
428+
bool hasSecureToken = secureToken != null && secureToken.Length > 0;
429+
430+
if (hasToken || hasSecureToken)
431+
{
432+
if (hasToken && hasSecureToken)
433+
{
434+
throw new ArgumentException(Resources.BothTokenProvided);
435+
}
436+
else if (hasToken)
437+
{
438+
Logger.Instance.WriteWarning(Resources.TokenParameterDepricate);
439+
return token;
440+
}
441+
else
442+
{
443+
var plainToken = secureToken.ConvertToString();
444+
Logger.Instance.WriteDebug("Converted secure token");
445+
return plainToken;
446+
}
447+
}
448+
Logger.Instance.WriteDebug("plainToken returning empty");
449+
return "";
450+
}
451+
452+
#endregion
416453
}
417454
}

src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.Designer.cs

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.resx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -886,4 +886,10 @@ Please contact Microsoft for further assistance.</value>
886886
<data name="InvalidSoftDeleteFeatureStateException" xml:space="preserve">
887887
<value>Setting SoftDeleteFeatureState to 'AlwaysON' will automatically set HybridBackupSecurityFeature to AlwaysON. Please remove the DisableHybridBackupSecurityFeature parameter or use a different value for the SoftDeleteFeatureState parameter.</value>
888888
</data>
889+
<data name="BothTokenProvided" xml:space="preserve">
890+
<value>Both Token and SecureToken parameters cannot be provided together</value>
891+
</data>
892+
<data name="TokenParameterDepricate" xml:space="preserve">
893+
<value>The Token parameter is deprecated and will be removed in future versions. Please use SecureToken instead</value>
894+
</data>
889895
</root>

src/RecoveryServices/RecoveryServices.Backup.Test/ScenarioTests/IaasVm/ItemTests.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ function Test-AzureVMMUA
339339
$vmName = "VM;iaasvmcontainerv2;hiagarg;hiaganewvm2"
340340
$vmFriendlyName = "hiaganewvm2"
341341
# $resGuardId = "/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/iaasvm-pstest-rg/providers/Microsoft.DataProtection/resourceGuards/mua-pstest-rguard"
342-
$resGuardId = "/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/hiagarg/providers/Microsoft.DataProtection/ResourceGuards/test1-rGuard"
342+
$resGuardId = "/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/hiagarg/providers/Microsoft.DataProtection/ResourceGuards/test1-rGuard" # HiagaPSTest1
343343
$lowerRetentionPolicy = "mua-vm-lowerDailyRet"
344344

345345
try

src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Item/DisableAzureRmRecoveryServicesBackupProtection.cs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,22 @@ public SwitchParameter RemoveRecoveryPoints
5959
/// If this option is used, all the data backed up for this item will
6060
/// expire as per the protection policy retention settings
6161
/// </summary>
62-
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.Item.SuspendBackupOption)]
62+
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.Item.SuspendBackupOption)]
6363
public SwitchParameter RetainRecoveryPointsAsPerPolicy { get; set; }
6464

65+
/// <summary>
66+
/// Parameter deprecated. Please use SecureToken instead.
67+
/// </summary>
68+
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.ResourceGuard.TokenDepricated, ValueFromPipeline = false)]
69+
[ValidateNotNullOrEmpty]
70+
public string Token;
71+
6572
/// <summary>
6673
/// Auxiliary access token for authenticating critical operation to resource guard subscription
6774
/// </summary>
6875
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.ResourceGuard.AuxiliaryAccessToken, ValueFromPipeline = false)]
6976
[ValidateNotNullOrEmpty]
70-
public string Token;
77+
public System.Security.SecureString SecureToken;
7178

7279
/// <summary>
7380
/// Prevents the confirmation dialog when specified.
@@ -93,12 +100,13 @@ public override void ExecuteCmdlet()
93100
string vaultName = resourceIdentifier.ResourceName;
94101
string resourceGroupName = resourceIdentifier.ResourceGroupName;
95102

96-
if (Token != "" && Token != null && !this.DeleteBackupData && RetainRecoveryPointsAsPerPolicy.IsPresent)
103+
string plainToken = HelperUtils.GetPlainToken(Token, SecureToken);
104+
if (plainToken != "" && plainToken != null && !this.DeleteBackupData && RetainRecoveryPointsAsPerPolicy.IsPresent)
97105
{
98106
throw new ArgumentException(String.Format(Resources.DisableWithRetainBackupNotCrititcal));
99107
}
100108

101-
if(DeleteBackupData && RetainRecoveryPointsAsPerPolicy.IsPresent)
109+
if (DeleteBackupData && RetainRecoveryPointsAsPerPolicy.IsPresent)
102110
{
103111
throw new AzPSArgumentException(String.Format(Resources.CantRemoveAndRetainRPsSimultaneously), "RetainRecoveryPointsAsPerPolicy");
104112
}
@@ -110,14 +118,14 @@ public override void ExecuteCmdlet()
110118
{ VaultParams.ResourceGroupName, resourceGroupName },
111119
{ ItemParams.Item, Item },
112120
{ ItemParams.DeleteBackupData, this.DeleteBackupData },
113-
{ ResourceGuardParams.Token, Token },
121+
{ ResourceGuardParams.Token, plainToken },
114122
}, ServiceClientAdapter);
115123

116124
IPsBackupProvider psBackupProvider =
117125
providerManager.GetProviderInstance(Item.WorkloadType,
118126
Item.BackupManagementType);
119-
120-
if(DeleteBackupData)
127+
128+
if (DeleteBackupData)
121129
{
122130
#region Archived RPs
123131
// Fetch RecoveryPoints in Archive Tier, if yes throw warning and confirmation prompt
@@ -131,13 +139,13 @@ public override void ExecuteCmdlet()
131139
var restorePointQueryType = "FullAndDifferential";
132140

133141
string queryFilterString = QueryBuilder.Instance.GetQueryString(new ServiceClientModel.BmsrpQueryObject()
134-
{
142+
{
135143
RestorePointQueryType = restorePointQueryType,
136144
ExtendedInfo = true
137145
});
138146
queryFilter = new ODataQuery<ServiceClientModel.BmsrpQueryObject>();
139147
queryFilter.Filter = queryFilterString;
140-
}
148+
}
141149

142150
var rpListResponse = ServiceClientAdapter.GetRecoveryPoints(
143151
containerUri,
@@ -171,7 +179,7 @@ public override void ExecuteCmdlet()
171179
else
172180
{
173181
var itemResponse = psBackupProvider.DisableProtectionWithDeleteData();
174-
182+
175183
// Track Response and display job details
176184
HandleCreatedJob(
177185
itemResponse,
@@ -206,7 +214,6 @@ public override void ExecuteCmdlet()
206214
}
207215
);
208216
}, ShouldProcess(Item.Name, VerbsLifecycle.Disable));
209-
210-
}
217+
}
211218
}
212219
}

src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Item/EnableAzureRmRecoveryServicesBackupProtection.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,19 @@ public class EnableAzureRmRecoveryServicesBackupProtection : RSBackupVaultCmdlet
9999
[ValidateNotNullOrEmpty]
100100
public ItemBase Item { get; set; }
101101

102+
/// <summary>
103+
/// Parameter deprecated. Please use SecureToken instead
104+
/// </summary>
105+
[Parameter(Mandatory = false, ParameterSetName = ModifyProtectionParameterSet, HelpMessage = ParamHelpMsgs.ResourceGuard.TokenDepricated, ValueFromPipeline = false)]
106+
[ValidateNotNullOrEmpty]
107+
public string Token;
108+
102109
/// <summary>
103110
/// Parameter to authorize operations protected by cross tenant resource guard. Use command (Get-AzAccessToken -TenantId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx").Token to fetch authorization token for different tenant.
104111
/// </summary>
105112
[Parameter(Mandatory = false, ParameterSetName = ModifyProtectionParameterSet, HelpMessage = ParamHelpMsgs.ResourceGuard.AuxiliaryAccessToken, ValueFromPipeline = false)]
106113
[ValidateNotNullOrEmpty]
107-
public string Token;
114+
public System.Security.SecureString SecureToken;
108115

109116
/// <summary>
110117
/// List of Disk LUNs to include in backup
@@ -164,6 +171,8 @@ public override void ExecuteCmdlet()
164171
shouldProcessName = Item.Name;
165172
isMUAOperation = true;
166173
}
174+
175+
string plainToken = HelperUtils.GetPlainToken(Token, SecureToken);
167176

168177
if (ShouldProcess(shouldProcessName, VerbsLifecycle.Enable))
169178
{
@@ -258,7 +267,7 @@ public override void ExecuteCmdlet()
258267
{ ItemParams.ExclusionDisksList, ExclusionDisksList },
259268
{ ItemParams.ResetExclusionSettings, ResetExclusionSettings },
260269
{ ItemParams.ExcludeAllDataDisks, ExcludeAllDataDisks.IsPresent },
261-
{ ResourceGuardParams.Token, Token },
270+
{ ResourceGuardParams.Token, plainToken },
262271
{ ResourceGuardParams.IsMUAOperation, isMUAOperation },
263272
}, ServiceClientAdapter);
264273

src/RecoveryServices/RecoveryServices.Backup/Cmdlets/ProtectionPolicy/SetAzureRmRecoveryServicesBackupProtectionPolicy.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,14 @@ public class SetAzureRmRecoveryServicesBackupProtectionPolicy : RSBackupVaultCmd
4343
[ValidateNotNullOrEmpty]
4444
public PolicyBase Policy { get; set; }
4545

46-
[Parameter(Mandatory = false, ValueFromPipeline = false, HelpMessage = ParamHelpMsgs.ResourceGuard.AuxiliaryAccessToken, ParameterSetName = ModifyPolicyParamSet)]
46+
[Parameter(Mandatory = false, ValueFromPipeline = false, HelpMessage = ParamHelpMsgs.ResourceGuard.TokenDepricated, ParameterSetName = ModifyPolicyParamSet)]
4747
[ValidateNotNullOrEmpty]
4848
public string Token;
4949

50+
[Parameter(Mandatory = false, ValueFromPipeline = false, HelpMessage = ParamHelpMsgs.ResourceGuard.AuxiliaryAccessToken, ParameterSetName = ModifyPolicyParamSet)]
51+
[ValidateNotNullOrEmpty]
52+
public System.Security.SecureString SecureToken;
53+
5054
/// <summary>
5155
/// Retention policy object to be modified
5256
/// </summary>
@@ -215,6 +219,8 @@ public override void ExecuteCmdlet()
215219
}
216220
}
217221

222+
string plainToken = HelperUtils.GetPlainToken(Token, SecureToken);
223+
218224
PsBackupProviderManager providerManager = new PsBackupProviderManager(
219225
new Dictionary<System.Enum, object>()
220226
{
@@ -224,7 +230,7 @@ public override void ExecuteCmdlet()
224230
{ PolicyParams.RetentionPolicy, RetentionPolicy },
225231
{ PolicyParams.SchedulePolicy, SchedulePolicy },
226232
{ PolicyParams.FixForInconsistentItems, FixForInconsistentItems.IsPresent },
227-
{ ResourceGuardParams.Token, Token },
233+
{ ResourceGuardParams.Token, plainToken },
228234
{ ResourceGuardParams.IsMUAOperation, isMUAOperation },
229235
{ PolicyParams.ExistingPolicy, servicePolicy},
230236
{ PolicyParams.TieringPolicy, tieringDetails},

src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Restore/RestoreAzureRMRecoveryServicesBackupItem.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
using System.Collections.Generic;
2424
using System.Linq;
2525
using System.Management.Automation;
26+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers;
2627

2728
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets
2829
{
@@ -323,11 +324,17 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
323324
public SwitchParameter RestoreToEdgeZone { get; set; }
324325

325326
/// <summary>
326-
/// Parameter to authorize operations protected by cross tenant resource guard. Use command (Get-AzAccessToken -TenantId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx").Token to fetch authorization token for different tenant.
327+
/// Parameter deprecated. Please use SecureToken instead
327328
/// </summary>
328-
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.ResourceGuard.AuxiliaryAccessToken, ValueFromPipeline = false)]
329+
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.ResourceGuard.TokenDepricated, ValueFromPipeline = false)]
329330
public string Token;
330331

332+
/// <summary>
333+
/// Parameter to authorize operations protected by cross tenant resource guard. Use command (Get-AzAccessToken -TenantId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx").Token to fetch authorization token for different tenant.
334+
/// </summary>
335+
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.ResourceGuard.AuxiliaryAccessToken, ValueFromPipeline = false)]
336+
public System.Security.SecureString SecureToken;
337+
331338
[Parameter(Mandatory = false, ParameterSetName = AzureManagedVMCreateNewParameterSet,
332339
HelpMessage = ParamHelpMsgs.RestoreVM.DiskAccessOption)]
333340
[Parameter(Mandatory = false, ParameterSetName = AzureManagedVMReplaceExistingParameterSet,
@@ -403,6 +410,8 @@ public override void ExecuteCmdlet()
403410
RestoreType = "OriginalLocation";
404411
}
405412

413+
string plainToken = HelperUtils.GetPlainToken(Token, SecureToken);
414+
406415
providerParameters.Add(VaultParams.VaultName, vaultName);
407416
providerParameters.Add(VaultParams.ResourceGroupName, resourceGroupName);
408417
providerParameters.Add(VaultParams.VaultLocation, VaultLocation);
@@ -428,7 +437,7 @@ public override void ExecuteCmdlet()
428437
providerParameters.Add(RestoreVMBackupItemParams.TargetSubnetName, TargetSubnetName);
429438
providerParameters.Add(RestoreVMBackupItemParams.TargetSubscriptionId, TargetSubscriptionId);
430439
providerParameters.Add(RestoreVMBackupItemParams.RestoreToEdgeZone, RestoreToEdgeZone.IsPresent);
431-
providerParameters.Add(ResourceGuardParams.Token, Token);
440+
providerParameters.Add(ResourceGuardParams.Token, plainToken);
432441
providerParameters.Add(ResourceGuardParams.IsMUAOperation, true);
433442

434443
if (DiskEncryptionSetId != null)

src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Vault/RemoveAzureRmRecoveryServicesResourceGuardMapping.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using System.Management.Automation;
1717
using Microsoft.Azure.Management.Internal.Resources.Utilities.Models;
1818
using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ServiceClientAdapterNS;
19+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers;
1920

2021
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets
2122
{
@@ -27,10 +28,14 @@ public class RemoveAzureRmRecoveryServicesResourceGuardMapping : RSBackupVaultCm
2728
{
2829
internal const string DeleteAzureResourceGuardMapping = "DeleteAzureResourceGuardMapping";
2930

30-
[Parameter(Mandatory = false, ValueFromPipeline = false, ParameterSetName = DeleteAzureResourceGuardMapping, HelpMessage = ParamHelpMsgs.ResourceGuard.AuxiliaryAccessToken)]
31+
[Parameter(Mandatory = false, ValueFromPipeline = false, ParameterSetName = DeleteAzureResourceGuardMapping, HelpMessage = ParamHelpMsgs.ResourceGuard.TokenDepricated)]
3132
[ValidateNotNullOrEmpty]
3233
public string Token;
3334

35+
[Parameter(Mandatory = false, ValueFromPipeline = false, ParameterSetName = DeleteAzureResourceGuardMapping, HelpMessage = ParamHelpMsgs.ResourceGuard.AuxiliaryAccessToken)]
36+
[ValidateNotNullOrEmpty]
37+
public System.Security.SecureString SecureToken;
38+
3439
public override void ExecuteCmdlet()
3540
{
3641
ExecutionBlock(() =>
@@ -42,7 +47,10 @@ public override void ExecuteCmdlet()
4247
string resourceGroupName = resourceIdentifier.ResourceGroupName;
4348

4449
string resourceGuardMappingName = "VaultProxy";
45-
Rest.Azure.AzureOperationResponse result = ServiceClientAdapter.DeleteResourceGuardMapping(vaultName, resourceGroupName, resourceGuardMappingName, Token);
50+
51+
string plainToken = HelperUtils.GetPlainToken(Token, SecureToken);
52+
53+
Rest.Azure.AzureOperationResponse result = ServiceClientAdapter.DeleteResourceGuardMapping(vaultName, resourceGroupName, resourceGuardMappingName, plainToken);
4654
WriteObject(result);
4755
}
4856
catch (Exception exception)

0 commit comments

Comments
 (0)