Skip to content

Commit 74898a8

Browse files
authored
Merge pull request #4228 from wisexp/preview
apply scope check for all Role related commands
2 parents 718845f + a7c49c9 commit 74898a8

File tree

23 files changed

+6410
-1259
lines changed

23 files changed

+6410
-1259
lines changed

src/ResourceManager/Resources/Commands.Resources.Test/Commands.Resources.Test.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,9 @@
674674
<None Include="SessionRecords\Microsoft.Azure.Commands.Resources.Test.ScenarioTests.RoleDefinitionTests\RdPositiveScenarios.json">
675675
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
676676
</None>
677+
<None Include="SessionRecords\Microsoft.Azure.Commands.Resources.Test.ScenarioTests.RoleDefinitionTests\RdValidateInputParameters.json">
678+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
679+
</None>
677680
<None Include="SessionRecords\Microsoft.Azure.Commands.Resources.Test.ScenarioTests.RoleDefinitionTests\RoleDefinitionCreateTests.json">
678681
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
679682
</None>

src/ResourceManager/Resources/Commands.Resources.Test/RoleAssignment/RoleAssignmentUnitTests.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ private void VerifyInvalidScope(string scope, string error)
1111
{
1212
try
1313
{
14-
AuthorizationClient.ValidateScope(scope);
14+
AuthorizationClient.ValidateScope(scope, false);
1515
Assert.True(false);
1616
}
1717
catch(ArgumentException ex)
@@ -22,7 +22,7 @@ private void VerifyInvalidScope(string scope, string error)
2222

2323
private void VerifyValidScope(string scope)
2424
{
25-
AuthorizationClient.ValidateScope(scope);
25+
AuthorizationClient.ValidateScope(scope, false);
2626
}
2727

2828
[Fact]
@@ -57,6 +57,10 @@ public void VerifyValidScopes()
5757
{
5858
VerifyValidScope(scope);
5959
}
60+
61+
// verify empty scope
62+
63+
AuthorizationClient.ValidateScope(null, true);
6064
}
6165
}
6266
}

src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/RoleAssignmentTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,10 @@ public void RaByResource()
8383
[Trait(Category.AcceptanceType, Category.CheckIn)]
8484
public void RaValidateInputParameters()
8585
{
86-
ResourcesController.NewInstance.RunPsTest("Test-RaValidateInputParameters");
86+
var instance = ResourcesController.NewInstance;
87+
instance.RunPsTest("Test-RaValidateInputParameters Get-AzureRmRoleAssignment");
88+
instance.RunPsTest("Test-RaValidateInputParameters New-AzureRmRoleAssignment");
89+
instance.RunPsTest("Test-RaValidateInputParameters Remove-AzureRmRoleAssignment");
8790
}
8891

8992
[Fact]

src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/RoleAssignmentTests.ps1

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,6 @@ function Test-RaNegativeScenarios
5757
# Bad SPN
5858
$badSpn = 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'
5959
Assert-Throws { Get-AzureRmRoleAssignment -ServicePrincipalName $badSpn } $badObjectResult
60-
61-
# Bad Scope
62-
$badScope = '/subscriptions/'+ $subscription[0].Id +'/providers/nonexistent'
63-
$badScopeException = "InvalidResourceNamespace: The resource namespace 'nonexistent' is invalid."
64-
Assert-Throws { Get-AzureRmRoleAssignment -Scope $badScope } $badScopeException
6560
}
6661

6762
<#
@@ -173,7 +168,7 @@ function Test-RaByResource
173168
.SYNOPSIS
174169
Tests validate input parameters
175170
#>
176-
function Test-RaValidateInputParameters
171+
function Test-RaValidateInputParameters ($cmdName)
177172
{
178173
# Setup
179174
Add-Type -Path ".\\Microsoft.Azure.Commands.Resources.dll"
@@ -190,32 +185,31 @@ function Test-RaValidateInputParameters
190185
# Check if Scope is valid.
191186
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/Should be 'ResourceGroups'/any group name"
192187
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/Should be 'ResourceGroups'/any group name' should begin with '/subscriptions/<subid>/resourceGroups'."
193-
Assert-Throws { New-AzureRmRoleAssignment -Scope $scope -ObjectId $groups[0].Id.Guid -RoleDefinitionName $definitionName } $invalidScope
188+
Assert-Throws { invoke-expression ($cmdName + " -Scope `"" + $scope + "`" -ObjectId " + $groups[0].Id.Guid + " -RoleDefinitionName " + $definitionName) } $invalidScope
194189

195190
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups"
196191
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups' should have even number of parts."
197-
Assert-Throws { New-AzureRmRoleAssignment -Scope $scope -ObjectId $groups[0].Id.Guid -RoleDefinitionName $definitionName } $invalidScope
192+
Assert-Throws { &$cmdName -Scope $scope -ObjectId $groups[0].Id.Guid -RoleDefinitionName $definitionName } $invalidScope
198193

199194
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/"
200195
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/' should not have any empty part."
201-
Assert-Throws { New-AzureRmRoleAssignment -Scope $scope -ObjectId $groups[0].Id.Guid -RoleDefinitionName $definitionName } $invalidScope
196+
Assert-Throws { &$cmdName -Scope $scope -ObjectId $groups[0].Id.Guid -RoleDefinitionName $definitionName } $invalidScope
202197

203198
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Should be 'Providers'/any provider name"
204199
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Should be 'Providers'/any provider name' should begin with '/subscriptions/<subid>/resourceGroups/<groupname>/providers'."
205-
Assert-Throws { New-AzureRmRoleAssignment -Scope $scope -ObjectId $groups[0].Id.Guid -RoleDefinitionName $definitionName } $invalidScope
200+
Assert-Throws { &$cmdName -Scope $scope -ObjectId $groups[0].Id.Guid -RoleDefinitionName $definitionName } $invalidScope
206201

207202
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Providers/providername"
208203
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Providers/providername' should have at least one pair of resource type and resource name. e.g. '/subscriptions/<subid>/resourceGroups/<groupname>/providers/<providername>/<resourcetype>/<resourcename>'."
209-
Assert-Throws { New-AzureRmRoleAssignment -Scope $scope -ObjectId $groups[0].Id.Guid -RoleDefinitionName $definitionName } $invalidScope
204+
Assert-Throws { &$cmdName -Scope $scope -ObjectId $groups[0].Id.Guid -RoleDefinitionName $definitionName } $invalidScope
210205

211206
# Check if ResourceType is valid
212-
[Microsoft.Azure.Commands.Resources.Models.Authorization.AuthorizationClient]::RoleAssignmentNames.Enqueue("4FAB3AF0-E7CF-4305-97D1-23A65EDCE8E6")
213207
Assert-AreEqual $resource.ResourceType "Microsoft.Sql/servers"
214208

215209
# Below invalid resource type should not return 'Not supported api version'.
216210
$resource.ResourceType = "Microsoft.Sql/"
217-
$invalidResourceType = "Scope '/subscriptions/4004a9fd-d58e-48dc-aeb2-4a4aec58606f/resourceGroups/testrg16987/providers/Microsoft.Sql/testserver13673' should have even number of parts."
218-
Assert-Throws { New-AzureRmRoleAssignment `
211+
$invalidResourceType = "Scope '/subscriptions/4004a9fd-d58e-48dc-aeb2-4a4aec58606f/resourceGroups/testrg19972/providers/Microsoft.Sql/testserver1342' should have even number of parts."
212+
Assert-Throws { &$cmdName `
219213
-ObjectId $groups[0].Id.Guid `
220214
-RoleDefinitionName $definitionName `
221215
-ResourceGroupName $resource.ResourceGroupName `

src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/RoleDefinitionTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,16 @@ public void RDGetScenario()
6262
{
6363
ResourcesController.NewInstance.RunPsTest("Test-RDGet");
6464
}
65+
66+
[Fact]
67+
[Trait(Category.AcceptanceType, Category.CheckIn)]
68+
public void RdValidateInputParameters()
69+
{
70+
var instance = ResourcesController.NewInstance;
71+
instance.RunPsTest("Test-RdValidateInputParameters Get-AzureRmRoleDefinition");
72+
instance.RunPsTest("Test-RdValidateInputParameters Remove-AzureRmRoleDefinition");
73+
instance.RunPsTest("Test-RdValidateInputParameters2 New-AzureRmRoleDefinition");
74+
instance.RunPsTest("Test-RdValidateInputParameters2 Set-AzureRmRoleDefinition");
75+
}
6576
}
6677
}

src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/RoleDefinitionTests.ps1

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,82 @@ function Test-RDGet
237237
# delete roles
238238
$deletedRd = Remove-AzureRmRoleDefinition -Id $roleDefResourceScope.Id -Scope $resourceScope -Force -PassThru
239239
Assert-AreEqual $roleDefResourceScope.Name $deletedRd.Name
240+
}
241+
242+
<#
243+
.SYNOPSIS
244+
Tests validate input parameters
245+
#>
246+
function Test-RdValidateInputParameters ($cmdName)
247+
{
248+
# Setup
249+
Add-Type -Path ".\\Microsoft.Azure.Commands.Resources.dll"
250+
251+
# Note: All below scenarios are invalid, we'll expect an exception during scope validation so the ID parameter doesn't need to be a valid one.
252+
253+
# Test
254+
# Check if Scope is valid.
255+
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/Should be 'ResourceGroups'/any group name"
256+
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/Should be 'ResourceGroups'/any group name' should begin with '/subscriptions/<subid>/resourceGroups'."
257+
Assert-Throws { invoke-expression ($cmdName + " -Scope `"" + $scope + "`" -Id D46245F8-7E18-4499-8E1F-784A6DA5BE25") } $invalidScope
258+
259+
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups"
260+
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups' should have even number of parts."
261+
Assert-Throws { &$cmdName -Scope $scope -Id D46245F8-7E18-4499-8E1F-784A6DA5BE25} $invalidScope
262+
263+
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/"
264+
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/' should not have any empty part."
265+
Assert-Throws { &$cmdName -Scope $scope -Id D46245F8-7E18-4499-8E1F-784A6DA5BE25} $invalidScope
266+
267+
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Should be 'Providers'/any provider name"
268+
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Should be 'Providers'/any provider name' should begin with '/subscriptions/<subid>/resourceGroups/<groupname>/providers'."
269+
Assert-Throws { &$cmdName -Scope $scope -Id D46245F8-7E18-4499-8E1F-784A6DA5BE25} $invalidScope
270+
271+
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Providers/providername"
272+
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Providers/providername' should have at least one pair of resource type and resource name. e.g. '/subscriptions/<subid>/resourceGroups/<groupname>/providers/<providername>/<resourcetype>/<resourcename>'."
273+
Assert-Throws { &$cmdName -Scope $scope -Id D46245F8-7E18-4499-8E1F-784A6DA5BE25} $invalidScope
274+
}
275+
276+
277+
<#
278+
.SYNOPSIS
279+
Tests validate input parameters
280+
#>
281+
function Test-RdValidateInputParameters2 ($cmdName)
282+
{
283+
# Setup
284+
Add-Type -Path ".\\Microsoft.Azure.Commands.Resources.dll"
285+
286+
# Note: All below scenarios are invalid, we'll expect an exception during scope validation so the ID parameter doesn't need to be a valid one.
287+
288+
$roleDef = Get-AzureRmRoleDefinition -Name "Reader"
289+
$roleDef.Name = "CustomRole_99CC0F56-7395-4097-A31E-CC63874AC5EF"
290+
$roleDef.Description = "Test Get RD"
291+
292+
# Test
293+
# Check if Scope is valid.
294+
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/Should be 'ResourceGroups'/any group name"
295+
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/Should be 'ResourceGroups'/any group name' should begin with '/subscriptions/<subid>/resourceGroups'."
296+
$roleDef.AssignableScopes[0] = $scope;
297+
Assert-Throws { &$cmdName -Role $roleDef } $invalidScope
298+
299+
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups"
300+
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups' should have even number of parts."
301+
$roleDef.AssignableScopes[0] = $scope;
302+
Assert-Throws { &$cmdName -Role $roleDef } $invalidScope
303+
304+
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/"
305+
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/' should not have any empty part."
306+
$roleDef.AssignableScopes[0] = $scope;
307+
Assert-Throws { &$cmdName -Role $roleDef } $invalidScope
308+
309+
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Should be 'Providers'/any provider name"
310+
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Should be 'Providers'/any provider name' should begin with '/subscriptions/<subid>/resourceGroups/<groupname>/providers'."
311+
$roleDef.AssignableScopes[0] = $scope;
312+
Assert-Throws { &$cmdName -Role $roleDef } $invalidScope
313+
314+
$scope = "/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Providers/providername"
315+
$invalidScope = "Scope '/subscriptions/e9ee799d-6ab2-4084-b952-e7c86344bbab/ResourceGroups/groupname/Providers/providername' should have at least one pair of resource type and resource name. e.g. '/subscriptions/<subid>/resourceGroups/<groupname>/providers/<providername>/<resourcetype>/<resourcename>'."
316+
$roleDef.AssignableScopes[0] = $scope;
317+
Assert-Throws { &$cmdName -Role $roleDef } $invalidScope
240318
}

src/ResourceManager/Resources/Commands.Resources.Test/SessionRecords/Microsoft.Azure.Commands.Resources.Test.ScenarioTests.RoleAssignmentTests/RaByResource.json

Lines changed: 1127 additions & 218 deletions
Large diffs are not rendered by default.

src/ResourceManager/Resources/Commands.Resources.Test/SessionRecords/Microsoft.Azure.Commands.Resources.Test.ScenarioTests.RoleAssignmentTests/RaByResourceGroup.json

Lines changed: 1311 additions & 145 deletions
Large diffs are not rendered by default.

src/ResourceManager/Resources/Commands.Resources.Test/SessionRecords/Microsoft.Azure.Commands.Resources.Test.ScenarioTests.RoleAssignmentTests/RaByScope.json

Lines changed: 1394 additions & 183 deletions
Large diffs are not rendered by default.

src/ResourceManager/Resources/Commands.Resources.Test/SessionRecords/Microsoft.Azure.Commands.Resources.Test.ScenarioTests.RoleAssignmentTests/RaByServicePrincipal.json

Lines changed: 239 additions & 179 deletions
Large diffs are not rendered by default.

src/ResourceManager/Resources/Commands.Resources.Test/SessionRecords/Microsoft.Azure.Commands.Resources.Test.ScenarioTests.RoleAssignmentTests/RaByUpn.json

Lines changed: 1334 additions & 165 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)