1+ using namespace System.Net
2+
3+ Function Invoke-SetUserAliases {
4+ <#
5+ . FUNCTIONALITY
6+ Entrypoint
7+ . ROLE
8+ Identity.User.ReadWrite
9+ #>
10+ [CmdletBinding ()]
11+ param ($Request , $TriggerMetadata )
12+
13+ $APIName = $Request.Params.CIPPEndpoint
14+ $Headers = $Request.Headers
15+ Write-LogMessage - headers $Headers - API $ApiName - message ' Accessed this API' - Sev ' Debug'
16+
17+ $UserObj = $Request.Body
18+ if ([string ]::IsNullOrWhiteSpace($UserObj.id )) {
19+ $body = @ {' Results' = @ (' Failed to manage aliases. No user ID provided' ) }
20+ Push-OutputBinding - Name Response - Value ([HttpResponseContext ]@ {
21+ StatusCode = [HttpStatusCode ]::BadRequest
22+ Body = $Body
23+ })
24+ return
25+ }
26+
27+ $Results = [System.Collections.Generic.List [object ]]::new()
28+ $Aliases = if ($UserObj.AddedAliases ) { ($UserObj.AddedAliases -split ' ,' ).ForEach ({ $_.Trim () }) }
29+ $RemoveAliases = if ($UserObj.RemovedAliases ) { ($UserObj.RemovedAliases -split ' ,' ).ForEach ({ $_.Trim () }) }
30+
31+ try {
32+ if ($Aliases -or $RemoveAliases -or $UserObj.MakePrimary ) {
33+ # Get current mailbox
34+ $CurrentMailbox = New-ExoRequest - tenantid $UserObj.tenantFilter - cmdlet ' Get-Mailbox' - cmdParams @ { Identity = $UserObj.id } - UseSystemMailbox $true
35+
36+ if (-not $CurrentMailbox ) {
37+ throw ' Could not find mailbox for user'
38+ }
39+
40+ $CurrentProxyAddresses = @ ($CurrentMailbox.EmailAddresses )
41+ Write-Host " Current proxy addresses: $ ( $CurrentProxyAddresses -join ' , ' ) "
42+ $NewProxyAddresses = @ ($CurrentProxyAddresses )
43+
44+ # Handle setting primary address
45+ if ($UserObj.MakePrimary ) {
46+ $PrimaryAddress = $UserObj.MakePrimary
47+ Write-Host " Attempting to set primary address: $PrimaryAddress "
48+
49+ # Normalize the primary address format
50+ if ($PrimaryAddress -notlike ' SMTP:*' ) {
51+ $PrimaryAddress = " SMTP:$ ( $PrimaryAddress -replace ' ^smtp:' , ' ' ) "
52+ }
53+ Write-Host " Normalized primary address: $PrimaryAddress "
54+
55+ # Check if the address exists in the current addresses (case-insensitive)
56+ $ExistingAddress = $CurrentProxyAddresses | Where-Object {
57+ $current = $_.ToLower ()
58+ $target = $PrimaryAddress.ToLower ()
59+ Write-Host " Comparing: '$current ' with '$target '"
60+ $current -eq $target
61+ }
62+
63+ if (-not $ExistingAddress ) {
64+ Write-Host " Available addresses: $ ( $CurrentProxyAddresses -join ' , ' ) "
65+ throw " Cannot set primary address. Address $ ( $PrimaryAddress -replace ' ^SMTP:' , ' ' ) not found in user's addresses."
66+ }
67+
68+ # Convert all current SMTP addresses to lowercase (secondary)
69+ $NewProxyAddresses = $NewProxyAddresses | ForEach-Object {
70+ if ($_ -like ' SMTP:*' ) {
71+ $_.ToLower ()
72+ }
73+ else {
74+ $_
75+ }
76+ }
77+
78+ # Remove any existing version of the address (case-insensitive)
79+ $NewProxyAddresses = $NewProxyAddresses | Where-Object {
80+ $_.ToLower () -ne $PrimaryAddress.ToLower ()
81+ }
82+ # Add the new primary address at the beginning
83+ $NewProxyAddresses = @ ($PrimaryAddress ) + $NewProxyAddresses
84+
85+ Write-LogMessage - API $ApiName - tenant ($UserObj.tenantFilter ) - headers $Headers - message " Set primary address for $ ( $CurrentMailbox.DisplayName ) " - Sev Info
86+ $null = $results.Add (' Success. Set new primary address.' )
87+ }
88+
89+ # Remove specified aliases
90+ if ($RemoveAliases ) {
91+ foreach ($Alias in $RemoveAliases ) {
92+ # Normalize the alias format
93+ if ($Alias -notlike ' smtp:*' ) {
94+ $Alias = " smtp:$Alias "
95+ }
96+ # Remove the alias case-insensitively
97+ $NewProxyAddresses = $NewProxyAddresses | Where-Object {
98+ $_.ToLower () -ne $Alias.ToLower ()
99+ }
100+ }
101+ Write-LogMessage - API $ApiName - tenant ($UserObj.tenantFilter ) - headers $Headers - message " Removed Aliases from $ ( $CurrentMailbox.DisplayName ) " - Sev Info
102+ $null = $results.Add (' Success. Removed specified aliases from user.' )
103+ }
104+
105+ # Add new aliases
106+ if ($Aliases ) {
107+ $AliasesToAdd = @ ()
108+ foreach ($Alias in $Aliases ) {
109+ # Normalize the alias format
110+ if ($Alias -notlike ' smtp:*' ) {
111+ $Alias = " smtp:$Alias "
112+ }
113+ # Check if the alias exists case-insensitively
114+ if (-not ($NewProxyAddresses | Where-Object { $_.ToLower () -eq $Alias.ToLower () })) {
115+ $AliasesToAdd = $AliasesToAdd + $Alias
116+ }
117+ }
118+ if ($AliasesToAdd.Count -gt 0 ) {
119+ $NewProxyAddresses = $NewProxyAddresses + $AliasesToAdd
120+ Write-LogMessage - API $ApiName - tenant ($UserObj.tenantFilter ) - headers $Headers - message " Added Aliases to $ ( $CurrentMailbox.DisplayName ) " - Sev Info
121+ $null = $results.Add (' Success. Added new aliases to user.' )
122+ }
123+ }
124+
125+ # Update the mailbox with new proxy addresses
126+ $Params = @ {
127+ Identity = $UserObj.id
128+ EmailAddresses = $NewProxyAddresses
129+ }
130+ $null = New-ExoRequest - tenantid $UserObj.tenantFilter - cmdlet ' Set-Mailbox' - cmdParams $Params - UseSystemMailbox $true
131+ }
132+ else {
133+ $null = $results.Add (' No alias changes specified.' )
134+ }
135+ }
136+ catch {
137+ $ErrorMessage = Get-CippException - Exception $_
138+ Write-LogMessage - API $ApiName - tenant ($UserObj.tenantFilter ) - headers $Headers - message " Alias management failed. $ ( $ErrorMessage.NormalizedError ) " - Sev Error - LogData $ErrorMessage
139+ $null = $results.Add (" Failed to manage aliases: $ ( $ErrorMessage.NormalizedError ) " )
140+ }
141+
142+ $body = @ {' Results' = @ ($results ) }
143+ Push-OutputBinding - Name Response - Value ([HttpResponseContext ]@ {
144+ StatusCode = [HttpStatusCode ]::OK
145+ Body = $Body
146+ })
147+ }
0 commit comments