Skip to content

Commit 180fbc0

Browse files
authored
[Storage] Support local user ACL and list paging/filtering (#25488)
* local user ACL; list local user paging and filtering * add samples
1 parent a155e32 commit 180fbc0

File tree

9 files changed

+939
-444
lines changed

9 files changed

+939
-444
lines changed

src/Storage/Storage.Management.Test/ScenarioTests/StorageAccountTests.ps1

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2731,6 +2731,7 @@ function Test-AzureStorageLocalUserSftp
27312731
# create local user
27322732
$userName1 = "testuser1"
27332733
$userName2 = "testuser2"
2734+
$userName3 = "testuser3"
27342735
$sshkey1 = New-AzStorageLocalUserSshPublicKey -Key "ssh-rsa keykeykeykeykey=" -Description "sshpulickey name1"
27352736
$sshkey2 = New-AzStorageLocalUserSshPublicKey -Key "ssh-rsa keykeykeykeykew=" -Description "sshpulickey name2"
27362737
$permissionScope1 = New-AzStorageLocalUserPermissionScope -Permission rwd -Service blob -ResourceName container1
@@ -2761,9 +2762,14 @@ function Test-AzureStorageLocalUserSftp
27612762
Assert-AreEqual "/dir1" $localuser2.HomeDirectory;
27622763
Assert-Null $localuser2.PermissionScopes;
27632764
Assert-Null $localuser2.SshAuthorizedKeys;
2764-
2765+
$localuser3 = Set-AzStorageLocalUser -ResourceGroupName $rgname -StorageAccountName $stoname -UserName $userName3 -HomeDirectory "/" -PermissionScope $permissionScope1 -GroupId 100 -AllowAclAuthorization $true
2766+
Assert-AreEqual $userName3 $localuser3.Name;
2767+
Assert-AreEqual 100 $localuser3.GroupId
2768+
Assert-AreEqual $true $localuser3.AllowAclAuthorization
2769+
Assert-NotNull $localuser3.UserId
2770+
27652771
# update local user
2766-
$localuser2 = Set-AzStorageLocalUser -ResourceGroupName $rgname -StorageAccountName $stoname -UserName $userName2 -HomeDirectory "/dir2" -HasSharedKey $true -HasSshKey $true -HasSshPassword $true `
2772+
$localuser2 = Set-AzStorageLocalUser -ResourceGroupName $rgname -StorageAccountName $stoname -UserName $userName2 -GroupID 201 -AllowAclAuthorization $false -HomeDirectory "/dir2" -HasSharedKey $true -HasSshKey $true -HasSshPassword $true `
27672773
-SshAuthorizedKey (@{
27682774
Description="sshpulickey name3";
27692775
Key="ssh-rsa keykeykeykeykew=";
@@ -2799,13 +2805,16 @@ function Test-AzureStorageLocalUserSftp
27992805
Assert-AreEqual "sshpulickey name3" $localuser2.SshAuthorizedKeys[0].Description;
28002806
Assert-AreEqual "ssh-rsa keykeykeykeykew=" $localuser2.SshAuthorizedKeys[1].Key;
28012807
Assert-AreEqual "sshpulickey name4" $localuser2.SshAuthorizedKeys[1].Description;
2808+
Assert-AreEqual $false $localuser2.AllowAclAuthorization;
2809+
Assert-AreEqual 201 $localuser2.GroupId;
2810+
Assert-NotNull $localuser2.UserId
28022811

28032812
# get single local user
28042813
$localuser1 = Get-AzStorageLocalUser -ResourceGroupName $rgname -StorageAccountName $stoname -UserName $userName1
28052814
Assert-AreEqual $userName1 $localuser1.Name;
28062815
Assert-AreEqual $true $localuser1.HasSharedKey;
28072816
Assert-AreEqual $true $localuser1.HasSshKey;
2808-
Assert-AreEqual $true $localuser1.HasSshPassword;
2817+
# Assert-AreEqual $true $localuser1.HasSshPassword;
28092818
Assert-AreEqual "/" $localuser1.HomeDirectory;
28102819
Assert-AreEqual 2 $localuser1.PermissionScopes.Count;
28112820
Assert-AreEqual "rwd" $localuser1.PermissionScopes[0].Permissions;
@@ -2818,9 +2827,16 @@ function Test-AzureStorageLocalUserSftp
28182827

28192828
#list all local users
28202829
$localusers = Get-AzStorageLocalUser -ResourceGroupName $rgname -StorageAccountName $stoname
2821-
Assert-AreEqual 2 $localusers.Count;
2830+
Assert-AreEqual 3 $localusers.Count;
28222831
Assert-AreEqual $userName1 $localusers[0].Name;
28232832
Assert-AreEqual $userName2 $localusers[1].Name;
2833+
Assert-AreEqual $userName3 $localusers[2].Name;
2834+
2835+
$localusers = Get-AzStorageLocalUser -ResourceGroupName $rgname -StorageAccountName $stoname -MaxPageSize 10 -Filter "startswith(name, test)"
2836+
Assert-AreEqual 3 $localusers.Count;
2837+
Assert-AreEqual $userName1 $localusers[0].Name;
2838+
Assert-AreEqual $userName2 $localusers[1].Name;
2839+
Assert-AreEqual $userName3 $localusers[2].Name;
28242840

28252841
# get public key
28262842
$key = Get-AzStorageLocalUserKey -ResourceGroupName $rgname -StorageAccountName $stoname -UserName $userName1
@@ -2838,8 +2854,9 @@ function Test-AzureStorageLocalUserSftp
28382854
# remove local user
28392855
Remove-AzStorageLocalUser -ResourceGroupName $rgname -StorageAccountName $stoname -UserName $userName1
28402856
$localusers = Get-AzStorageLocalUser -ResourceGroupName $rgname -StorageAccountName $stoname
2841-
Assert-AreEqual 1 $localusers.Count;
2857+
Assert-AreEqual 2 $localusers.Count;
28422858
Assert-AreEqual $userName2 $localusers[0].Name;
2859+
Assert-AreEqual $userName3 $localusers[1].Name;
28432860

28442861
#clean up
28452862
Remove-AzStorageAccount -Force -ResourceGroupName $rgname -Name $stoname;

src/Storage/Storage.Management.Test/SessionRecords/Microsoft.Azure.Commands.Management.Storage.Test.ScenarioTests.StorageAccountTests/TestAzureStorageLocalUserSftp.json

Lines changed: 758 additions & 416 deletions
Large diffs are not rendered by default.

src/Storage/Storage.Management/ChangeLog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
- Additional information about change #1
1919
-->
2020
## Upcoming Release
21+
* Supported local user ACL and list local user paging/filtering
22+
- `Set-AzStorageLocalUser`
23+
- `Get-AzStorageLocalUser`
2124

2225
## Version 7.1.0
2326
* Fixed the issue that Azure.Core.AccessToken is used before assigned.

src/Storage/Storage.Management/Models/PSLocalUser.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public PSLocalUser(LocalUser user, string ResourceGroupName, string StorageAccou
3939
this.HasSshPassword = user.HasSshPassword;
4040
this.SshAuthorizedKeys = PSSshPublicKey.GetPSSshPublicKeys(user.SshAuthorizedKeys);
4141
this.PermissionScopes = PSPermissionScope.GetPSPermissionScopes(user.PermissionScopes);
42+
this.GroupId = user.GroupId;
43+
this.AllowAclAuthorization = user.AllowAclAuthorization;
44+
this.UserId = user.UserId;
4245
}
4346

4447

@@ -52,6 +55,8 @@ public LocalUser ParseLocalUser()
5255
user.HasSshPassword = this.HasSshPassword;
5356
user.SshAuthorizedKeys = PSSshPublicKey.ParseSshPublicKeyss(this.SshAuthorizedKeys);
5457
user.PermissionScopes = PSPermissionScope.ParsePermissionScopes(this.PermissionScopes);
58+
user.GroupId = this.GroupId;
59+
user.AllowAclAuthorization = this.AllowAclAuthorization;
5560
return user;
5661
}
5762

@@ -77,6 +82,9 @@ public LocalUser ParseLocalUser()
7782
public bool? HasSshPassword { get; set; }
7883
public PSSshPublicKey[] SshAuthorizedKeys { get; set; }
7984
public PSPermissionScope[] PermissionScopes { get; set; }
85+
public int? GroupId { get; set; }
86+
public bool? AllowAclAuthorization { get; set; }
87+
public int? UserId { get; set; }
8088
}
8189

8290
//wrapper of SshPublicKey

src/Storage/Storage.Management/Storage.Management.format.ps1xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,6 +1434,18 @@
14341434
<Alignment>Left</Alignment>
14351435
<Label>PermissionScopes</Label>
14361436
</TableColumnHeader>
1437+
<TableColumnHeader>
1438+
<Alignment>Left</Alignment>
1439+
<Label>UserId</Label>
1440+
</TableColumnHeader>
1441+
<TableColumnHeader>
1442+
<Alignment>Left</Alignment>
1443+
<Label>GroupId</Label>
1444+
</TableColumnHeader>
1445+
<TableColumnHeader>
1446+
<Alignment>Left</Alignment>
1447+
<Label>AllowAclAuthorization</Label>
1448+
</TableColumnHeader>
14371449
</TableHeaders>
14381450
<TableRowEntries>
14391451
<TableRowEntry>
@@ -1467,6 +1479,18 @@
14671479
<!--PropertyName>PermissionScopes</PropertyName-->
14681480
<ScriptBlock>if (($_.PermissionScopes -ne $null) -and ($_.PermissionScopes.Count -ne 0)) {if ($_.PermissionScopes.Count -eq 1) {"[" + $_.PermissionScopes[0].ResourceName + "]"} else {"[" + $_.PermissionScopes[0].ResourceName + ",...]"}} else {$null}</ScriptBlock>
14691481
</TableColumnItem>
1482+
<TableColumnItem>
1483+
<Alignment>Left</Alignment>
1484+
<PropertyName>UserId</PropertyName>
1485+
</TableColumnItem>
1486+
<TableColumnItem>
1487+
<Alignment>Left</Alignment>
1488+
<PropertyName>GroupId</PropertyName>
1489+
</TableColumnItem>
1490+
<TableColumnItem>
1491+
<Alignment>Left</Alignment>
1492+
<PropertyName>AllowAclAuthorization</PropertyName>
1493+
</TableColumnItem>
14701494
</TableColumnItems>
14711495
</TableRowEntry>
14721496
</TableRowEntries>

src/Storage/Storage.Management/StorageAccount/GetAzureStorageLocalUser.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,17 @@ public class GetAzureStorageLocalUserCommand : StorageFileBaseCmdlet
6262
[ValidateNotNullOrEmpty]
6363
public string UserName { get; set; }
6464

65+
[Parameter(Mandatory = false,
66+
HelpMessage = "The maximum number of local users that will be included in the list response")]
67+
[ValidateNotNullOrEmpty]
68+
public int? MaxPageSize { get; set; }
69+
70+
[Parameter(Mandatory = false,
71+
HelpMessage = "The filter of username. When specified, only usernames starting with the filter will be listed. The filter must be in format: startswith(name, <prefix>)")]
72+
[ValidateNotNullOrEmpty]
73+
public string Filter { get; set; }
74+
75+
6576
public override void ExecuteCmdlet()
6677
{
6778
base.ExecuteCmdlet();
@@ -81,7 +92,7 @@ public override void ExecuteCmdlet()
8192
{
8293
var users = this.StorageClient.LocalUsers.List(
8394
this.ResourceGroupName,
84-
this.StorageAccountName);
95+
this.StorageAccountName, this.MaxPageSize, this.Filter);
8596

8697
if (users != null)
8798
{

src/Storage/Storage.Management/StorageAccount/SetAzureStorageLocalUser.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,18 @@ public bool HasSshPassword
128128
}
129129
private bool? hasSshPassword = null;
130130

131+
[Parameter(
132+
Mandatory = false,
133+
HelpMessage = "An identifier for associating a group of users.")]
134+
[ValidateNotNullOrEmpty]
135+
public int? GroupId { get; set; }
136+
137+
[Parameter(
138+
Mandatory = false,
139+
HelpMessage = "Indicates whether ACL authorization is allowed for this user. Set it to false to disallow using ACL authorization.")]
140+
[ValidateNotNullOrEmpty]
141+
public bool? AllowAclAuthorization { get; set; }
142+
131143
public override void ExecuteCmdlet()
132144
{
133145
base.ExecuteCmdlet();
@@ -152,7 +164,9 @@ public override void ExecuteCmdlet()
152164
HasSshKey = this.hasSshKey,
153165
HasSshPassword = this.hasSshPassword,
154166
PermissionScopes = this.PermissionScope,
155-
SshAuthorizedKeys = this.SshAuthorizedKey
167+
SshAuthorizedKeys = this.SshAuthorizedKey,
168+
GroupId = this.GroupId,
169+
AllowAclAuthorization = this.AllowAclAuthorization,
156170
};
157171

158172
LocalUser localUser = this.StorageClient.LocalUsers.CreateOrUpdate(

src/Storage/Storage.Management/help/Get-AzStorageLocalUser.md

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ Gets a specified local user or lists all local users in a storage account.
1515
### AccountName (Default)
1616
```
1717
Get-AzStorageLocalUser [-ResourceGroupName] <String> [-StorageAccountName] <String> [-UserName <String>]
18-
[-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
18+
[-MaxPageSize <Int32>] [-Filter <String>] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
1919
```
2020

2121
### AccountObject
2222
```
23-
Get-AzStorageLocalUser -StorageAccount <PSStorageAccount> [-UserName <String>]
24-
[-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
23+
Get-AzStorageLocalUser -StorageAccount <PSStorageAccount> [-UserName <String>] [-MaxPageSize <Int32>]
24+
[-Filter <String>] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
2525
```
2626

2727
## DESCRIPTION
@@ -40,9 +40,9 @@ $localUser
4040
4141
ResourceGroupName: myresourcegroup, StorageAccountName: mystorageaccount
4242
43-
Name Sid HomeDirectory HasSharedKey HasSshKey HasSshPassword PermissionScopes
44-
---- --- ------------- ------------ --------- -------------- ----------------
45-
testuser1 S-1-2-0-0000000000-000000000-0000000000-0000 / True True True [container1,...]
43+
Name Sid HomeDirectory HasSharedKey HasSshKey HasSshPassword PermissionScopes UserId GroupId AllowAclAuthorization
44+
---- --- ------------- ------------ --------- -------------- ---------------- ------ ------- ---------------------
45+
testuser1 S-1-2-0-0000000000-000000000-0000000000-0000 / True True True [container1,...] 1000
4646
4747
$localUser.PermissionScopes
4848
@@ -62,14 +62,30 @@ Get-AzStorageLocalUser -ResourceGroupName "myresourcegroup" -AccountName "mystor
6262
```output
6363
ResourceGroupName: myresourcegroup, StorageAccountName: mystorageaccount
6464
65-
Name Sid HomeDirectory HasSharedKey HasSshKey HasSshPassword PermissionScopes SshAuthorizedKeys
66-
---- --- ------------- ------------ --------- -------------- ---------------- -----------------
67-
testuser1 S-1-2-0-0000000000-000000000-0000000000-0000 / True True True [container1,...]
68-
testuser2 S-1-2-0-0000000000-000000000-0000000000-0002 /dir True True False
65+
Name Sid HomeDirectory HasSharedKey HasSshKey HasSshPassword PermissionScopes UserId GroupId AllowAclAuthorization
66+
---- --- ------------- ------------ --------- -------------- ---------------- ------ ------- ---------------------
67+
testuser1 S-1-2-0-0000000000-000000000-0000000000-0000 / True True True [container1,...] 1000
68+
testuser2 S-1-2-0-0000000000-000000000-0000000000-0002 /dir True True False 1001
6969
```
7070

7171
This command lists all local users in a storage account.
7272

73+
### Example 3: List local users with a max page size and filter
74+
```powershell
75+
Get-AzStorageLocalUser -ResourceGroupName "myresourcegroup" -AccountName "mystorageaccount" -MaxPageSize 3 -Filter "startswith(name, test)"
76+
```
77+
78+
```output
79+
ResourceGroupName: myresourcegroup, StorageAccountName: mystorageaccount
80+
81+
Name Sid HomeDirectory HasSharedKey HasSshKey HasSshPassword PermissionScopes UserId GroupId AllowAclAuthorization
82+
---- --- ------------- ------------ --------- -------------- ---------------- ------ ------- ---------------------
83+
testuser1 S-1-2-0-0000000000-000000000-0000000000-0000 / True True True [container1,...] 1000
84+
testuser2 S-1-2-0-0000000000-000000000-0000000000-0002 /dir True True False 1001
85+
testuser3 S-1-2-0-0000000000-000000000-0000000000-0003 / True True False 1001 100 True
86+
```
87+
This command lists local users that names start with "test", with a max page size of 3 included in the list response.
88+
7389
## PARAMETERS
7490

7591
### -DefaultProfile
@@ -87,6 +103,36 @@ Accept pipeline input: False
87103
Accept wildcard characters: False
88104
```
89105
106+
### -Filter
107+
The filter of username. When specified, only usernames starting with the filter will be listed. The filter must be in format: startswith(name, <prefix>)
108+
109+
```yaml
110+
Type: System.String
111+
Parameter Sets: (All)
112+
Aliases:
113+
114+
Required: False
115+
Position: Named
116+
Default value: None
117+
Accept pipeline input: False
118+
Accept wildcard characters: False
119+
```
120+
121+
### -MaxPageSize
122+
The maximum number of local users that will be included in the list response
123+
124+
```yaml
125+
Type: System.Nullable`1[System.Int32]
126+
Parameter Sets: (All)
127+
Aliases:
128+
129+
Required: False
130+
Position: Named
131+
Default value: None
132+
Accept pipeline input: False
133+
Accept wildcard characters: False
134+
```
135+
90136
### -ResourceGroupName
91137
Resource Group Name.
92138

0 commit comments

Comments
 (0)