Skip to content

Commit 64e9922

Browse files
Merge pull request KelvinTegelaar#1459 from Jr7468/ProxyAddresses
Created a function to remove proxy addresses, and set primary smtp ad…
2 parents 65ac022 + 11dca75 commit 64e9922

File tree

1 file changed

+147
-0
lines changed

1 file changed

+147
-0
lines changed
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
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

Comments
 (0)