Skip to content

Commit 95c2e55

Browse files
authored
Merge pull request #302 from KelvinTegelaar/dev
[pull] dev from KelvinTegelaar:dev
2 parents 0a3a864 + b95612f commit 95c2e55

File tree

92 files changed

+3404
-748
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

92 files changed

+3404
-748
lines changed

Config/standards.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1722,6 +1722,35 @@
17221722
"powershellEquivalent": "New-ProtectionAlert and Set-ProtectionAlert",
17231723
"recommendedBy": []
17241724
},
1725+
{
1726+
"name": "standards.SafeLinksTemplatePolicy",
1727+
"label": "SafeLinks Policy Template",
1728+
"cat": "Templates",
1729+
"multiple": false,
1730+
"disabledFeatures": {
1731+
"report": false,
1732+
"warn": false,
1733+
"remediate": false
1734+
},
1735+
"impact": "Medium Impact",
1736+
"addedDate": "2025-04-29",
1737+
"helpText": "Deploy and manage SafeLinks policy templates to protect against malicious URLs in emails and Office documents.",
1738+
"addedComponent": [
1739+
{
1740+
"type": "autoComplete",
1741+
"multiple": true,
1742+
"creatable": false,
1743+
"name": "standards.SafeLinksTemplatePolicy.TemplateIds",
1744+
"label": "Select SafeLinks Policy Templates",
1745+
"api": {
1746+
"url": "/api/ListSafeLinksPolicyTemplates",
1747+
"labelField": "TemplateName",
1748+
"valueField": "GUID",
1749+
"queryKey": "ListSafeLinksPolicyTemplates"
1750+
}
1751+
}
1752+
]
1753+
},
17251754
{
17261755
"name": "standards.SafeLinksPolicy",
17271756
"cat": "Defender Standards",

Modules/CIPPCore/Public/Add-CIPPGroupMember.ps1

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,22 @@ function Add-CIPPGroupMember(
77
[string]$APIName = 'Add Group Member'
88
) {
99
try {
10-
if ($member -like '*#EXT#*') { $member = [System.Web.HttpUtility]::UrlEncode($member) }
11-
$MemberIDs = 'https://graph.microsoft.com/v1.0/directoryObjects/' + (New-GraphGetRequest -uri "https://graph.microsoft.com/beta/users/$($member)" -tenantid $TenantFilter).id
12-
$addmemberbody = "{ `"[email protected]`": $(ConvertTo-Json @($MemberIDs)) }"
10+
if ($Member -like '*#EXT#*') { $Member = [System.Web.HttpUtility]::UrlEncode($Member) }
11+
$MemberIDs = 'https://graph.microsoft.com/v1.0/directoryObjects/' + (New-GraphGetRequest -uri "https://graph.microsoft.com/beta/users/$($Member)" -tenantid $TenantFilter).id
12+
$AddMemberBody = "{ `"[email protected]`": $(ConvertTo-Json @($MemberIDs)) }"
1313
if ($GroupType -eq 'Distribution list' -or $GroupType -eq 'Mail-Enabled Security') {
14-
$Params = @{ Identity = $GroupId; Member = $member; BypassSecurityGroupManagerCheck = $true }
15-
$null = New-ExoRequest -tenantid $TenantFilter -cmdlet 'Add-DistributionGroupMember' -cmdParams $params -UseSystemMailbox $true
14+
$Params = @{ Identity = $GroupId; Member = $Member; BypassSecurityGroupManagerCheck = $true }
15+
$null = New-ExoRequest -tenantid $TenantFilter -cmdlet 'Add-DistributionGroupMember' -cmdParams $Params -UseSystemMailbox $true
1616
} else {
17-
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/groups/$($GroupId)" -tenantid $TenantFilter -type patch -body $addmemberbody -Verbose
17+
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/groups/$($GroupId)" -tenantid $TenantFilter -type patch -body $AddMemberBody -Verbose
1818
}
19-
$Message = "Successfully added user $($Member) to $($GroupId)."
20-
Write-LogMessage -headers $Headers -API $APIName -tenant $TenantFilter -message $Message -Sev 'Info'
21-
return $message
19+
$Results = "Successfully added user $($Member) to $($GroupId)."
20+
Write-LogMessage -headers $Headers -API $APIName -tenant $TenantFilter -message $Results -Sev 'Info'
21+
return $Results
2222
} catch {
23-
$message = "Failed to add user $($Member) to $($GroupId) - $($_.Exception.Message)"
24-
Write-LogMessage -headers $Headers -API $APIName -tenant $TenantFilter -message $message -Sev 'error' -LogData (Get-CippException -Exception $_)
25-
return $message
23+
$ErrorMessage = Get-CippException -Exception $_
24+
$Results = "Failed to add user $($Member) to $($GroupId) - $($ErrorMessage.NormalizedError)"
25+
Write-LogMessage -headers $Headers -API $APIName -tenant $TenantFilter -message $Results -Sev 'error' -LogData $ErrorMessage
26+
throw $Results
2627
}
2728
}

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Administration/Invoke-ExecModifyCalPerms.ps1

Lines changed: 27 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ Function Invoke-ExecModifyCalPerms {
1212

1313
$APIName = $Request.Params.CIPPEndpoint
1414
Write-LogMessage -headers $Request.Headers -API $APINAME-message 'Accessed this API' -Sev 'Debug'
15-
15+
1616
$Username = $request.body.userID
1717
$Tenantfilter = $request.body.tenantfilter
1818
$Permissions = $request.body.permissions
1919

2020
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Processing request for user: $Username, tenant: $Tenantfilter" -Sev 'Debug'
2121

22-
if ($username -eq $null) {
22+
if ($username -eq $null) {
2323
Write-LogMessage -headers $Request.Headers -API $APINAME-message 'Username is null' -Sev 'Error'
2424
$body = [pscustomobject]@{'Results' = @('Username is required') }
2525
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
@@ -28,12 +28,11 @@ Function Invoke-ExecModifyCalPerms {
2828
})
2929
return
3030
}
31-
31+
3232
try {
3333
$userid = (New-GraphGetRequest -uri "https://graph.microsoft.com/beta/users/$($username)" -tenantid $Tenantfilter).id
3434
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Retrieved user ID: $userid" -Sev 'Debug'
35-
}
36-
catch {
35+
} catch {
3736
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Failed to get user ID: $($_.Exception.Message)" -Sev 'Error'
3837
$body = [pscustomobject]@{'Results' = @("Failed to get user ID: $($_.Exception.Message)") }
3938
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
@@ -50,8 +49,7 @@ Function Invoke-ExecModifyCalPerms {
5049
if ($Permissions -is [PSCustomObject]) {
5150
if ($Permissions.PSObject.Properties.Name -match '^\d+$') {
5251
$Permissions = $Permissions.PSObject.Properties.Value
53-
}
54-
else {
52+
} else {
5553
$Permissions = @($Permissions)
5654
}
5755
}
@@ -60,13 +58,14 @@ Function Invoke-ExecModifyCalPerms {
6058

6159
foreach ($Permission in $Permissions) {
6260
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Processing permission: $($Permission | ConvertTo-Json)" -Sev 'Debug'
63-
61+
6462
$PermissionLevel = $Permission.PermissionLevel.value ?? $Permission.PermissionLevel
6563
$Modification = $Permission.Modification
6664
$CanViewPrivateItems = $Permission.CanViewPrivateItems ?? $false
67-
68-
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Permission Level: $PermissionLevel, Modification: $Modification, CanViewPrivateItems: $CanViewPrivateItems" -Sev 'Debug'
69-
65+
$FolderName = $Permission.FolderName ?? 'Calendar'
66+
67+
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Permission Level: $PermissionLevel, Modification: $Modification, CanViewPrivateItems: $CanViewPrivateItems, FolderName: $FolderName" -Sev 'Debug'
68+
7069
# Handle UserID as array or single value
7170
$TargetUsers = @($Permission.UserID | ForEach-Object { $_.value ?? $_ })
7271

@@ -75,48 +74,24 @@ Function Invoke-ExecModifyCalPerms {
7574
foreach ($TargetUser in $TargetUsers) {
7675
try {
7776
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Processing target user: $TargetUser" -Sev 'Debug'
78-
79-
if ($Modification -eq 'Remove') {
80-
try {
81-
$CalPerms = New-ExoRequest -Anchor $username -tenantid $Tenantfilter -cmdlet 'Remove-MailboxFolderPermission' -cmdParams @{
82-
Identity = "$($userid):\Calendar"
83-
User = $TargetUser
84-
Confirm = $false
85-
}
86-
$null = $results.Add("Removed $($TargetUser) from $($username) Calendar permissions")
87-
}
88-
catch {
89-
$null = $results.Add("No existing permissions to remove for $($TargetUser)")
90-
}
91-
}
92-
else {
93-
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Setting permissions with AccessRights: $PermissionLevel" -Sev 'Debug'
94-
95-
$cmdParams = @{
96-
Identity = "$($userid):\Calendar"
97-
User = $TargetUser
98-
AccessRights = $PermissionLevel
99-
Confirm = $false
100-
}
101-
102-
if ($CanViewPrivateItems) {
103-
$cmdParams['SharingPermissionFlags'] = 'Delegate,CanViewPrivateItems'
104-
}
105-
106-
try {
107-
# Try Add first
108-
$CalPerms = New-ExoRequest -Anchor $username -tenantid $Tenantfilter -cmdlet 'Add-MailboxFolderPermission' -cmdParams $cmdParams
109-
$null = $results.Add("Granted $($TargetUser) $($PermissionLevel) access to $($username) Calendar$($CanViewPrivateItems ? ' with access to private items' : '')")
110-
}
111-
catch {
112-
# If Add fails, try Set
113-
$CalPerms = New-ExoRequest -Anchor $username -tenantid $Tenantfilter -cmdlet 'Set-MailboxFolderPermission' -cmdParams $cmdParams
114-
$null = $results.Add("Updated $($TargetUser) $($PermissionLevel) access to $($username) Calendar$($CanViewPrivateItems ? ' with access to private items' : '')")
115-
}
77+
$Params = @{
78+
APIName = $APIName
79+
Headers = $Request.Headers
80+
RemoveAccess = if ($Modification -eq 'Remove') { $TargetUser } else { $null }
81+
TenantFilter = $Tenantfilter
82+
UserID = $userid
83+
folderName = $FolderName
84+
UserToGetPermissions = $TargetUser
85+
LoggingName = $TargetUser
86+
Permissions = $PermissionLevel
87+
CanViewPrivateItems = $CanViewPrivateItems
11688
}
89+
90+
$Result = Set-CIPPCalendarPermission @Params
91+
92+
$null = $results.Add($Result)
11793
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Successfully executed $($PermissionLevel) permission modification for $($TargetUser) on $($username)" -Sev 'Info' -tenant $TenantFilter
118-
}
119-
catch {
94+
} catch {
12095
$HasErrors = $true
12196
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Could not execute $($PermissionLevel) permission modification for $($TargetUser) on $($username). Error: $($_.Exception.Message)" -Sev 'Error' -tenant $TenantFilter
12297
$null = $results.Add("Could not execute $($PermissionLevel) permission modification for $($TargetUser) on $($username). Error: $($_.Exception.Message)")
@@ -137,4 +112,4 @@ Function Invoke-ExecModifyCalPerms {
137112
StatusCode = if ($HasErrors) { [HttpStatusCode]::InternalServerError } else { [HttpStatusCode]::OK }
138113
Body = $Body
139114
})
140-
}
115+
}

0 commit comments

Comments
 (0)