Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
b884978
Round 1
Zacgoose Jun 2, 2025
9026bc0
Round 2
Zacgoose Jun 3, 2025
b501fae
State Fixes
Zacgoose Jun 3, 2025
94852b0
Enabled fixes
Zacgoose Jun 3, 2025
9dce385
Revert to State from Enabled
Zacgoose Jun 3, 2025
f61ef18
Added IsValid
Zacgoose Jun 3, 2025
bc9e588
forgive me for I have sinned
Zacgoose Jun 3, 2025
b86fdd5
Template name and description fixes
Zacgoose Jun 3, 2025
567889d
remove logging
Zacgoose Jun 3, 2025
57b6ad6
Safe Links Policy - Management, Standards, and Templates
Zacgoose Jun 2, 2025
2cb4772
Merge branch 'safelinkspolicy' of https://github.com/Zacgoose/CIPP-AP…
Zacgoose Jun 3, 2025
e054811
Account for all AccessRight permissions when removing permissions, al…
Zacgoose Jun 6, 2025
a64063e
If compare fails, catch and StateIsCorrect = false
ngms-psh Jun 10, 2025
26efa2f
+= words
kris6673 Jun 9, 2025
f4609bb
remove unused old endpoints
kris6673 Jun 9, 2025
d319566
Refactor logging and fix some variable casing
kris6673 Jun 9, 2025
f726407
rename to fit function naming standards
kris6673 Jun 9, 2025
3fa17c2
refactor a few functions to add error handling
kris6673 Jun 9, 2025
40b91b3
Enhance logging and permission handling in Invoke-ExecModifyCalPerms …
Jr7468 Jun 10, 2025
431d1f5
Refactored to use Set-CIPPCalendarPermission
Jr7468 Jun 10, 2025
d72c74b
Merge pull request #1495 from kris6673/fix-modernize-endpoints
KelvinTegelaar Jun 10, 2025
0348180
Merge pull request #1494 from ngms-psh/issue4247
KelvinTegelaar Jun 10, 2025
0120edf
Merge pull request #1496 from Jr7468/dev
KelvinTegelaar Jun 10, 2025
5ccd2b7
backtics to splat.
KelvinTegelaar Jun 10, 2025
f1dd576
Merge pull request #1471 from Zacgoose/safelinkspolicy
KelvinTegelaar Jun 10, 2025
b95612f
Merge pull request #1483 from Zacgoose/mailbox-perms-fix
KelvinTegelaar Jun 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions Config/standards.json
Original file line number Diff line number Diff line change
Expand Up @@ -1722,6 +1722,35 @@
"powershellEquivalent": "New-ProtectionAlert and Set-ProtectionAlert",
"recommendedBy": []
},
{
"name": "standards.SafeLinksTemplatePolicy",
"label": "SafeLinks Policy Template",
"cat": "Templates",
"multiple": false,
"disabledFeatures": {
"report": false,
"warn": false,
"remediate": false
},
"impact": "Medium Impact",
"addedDate": "2025-04-29",
"helpText": "Deploy and manage SafeLinks policy templates to protect against malicious URLs in emails and Office documents.",
"addedComponent": [
{
"type": "autoComplete",
"multiple": true,
"creatable": false,
"name": "standards.SafeLinksTemplatePolicy.TemplateIds",
"label": "Select SafeLinks Policy Templates",
"api": {
"url": "/api/ListSafeLinksPolicyTemplates",
"labelField": "TemplateName",
"valueField": "GUID",
"queryKey": "ListSafeLinksPolicyTemplates"
}
}
]
},
{
"name": "standards.SafeLinksPolicy",
"cat": "Defender Standards",
Expand Down
25 changes: 13 additions & 12 deletions Modules/CIPPCore/Public/Add-CIPPGroupMember.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,22 @@ function Add-CIPPGroupMember(
[string]$APIName = 'Add Group Member'
) {
try {
if ($member -like '*#EXT#*') { $member = [System.Web.HttpUtility]::UrlEncode($member) }
$MemberIDs = 'https://graph.microsoft.com/v1.0/directoryObjects/' + (New-GraphGetRequest -uri "https://graph.microsoft.com/beta/users/$($member)" -tenantid $TenantFilter).id
$addmemberbody = "{ `"members@odata.bind`": $(ConvertTo-Json @($MemberIDs)) }"
if ($Member -like '*#EXT#*') { $Member = [System.Web.HttpUtility]::UrlEncode($Member) }
$MemberIDs = 'https://graph.microsoft.com/v1.0/directoryObjects/' + (New-GraphGetRequest -uri "https://graph.microsoft.com/beta/users/$($Member)" -tenantid $TenantFilter).id
$AddMemberBody = "{ `"members@odata.bind`": $(ConvertTo-Json @($MemberIDs)) }"
if ($GroupType -eq 'Distribution list' -or $GroupType -eq 'Mail-Enabled Security') {
$Params = @{ Identity = $GroupId; Member = $member; BypassSecurityGroupManagerCheck = $true }
$null = New-ExoRequest -tenantid $TenantFilter -cmdlet 'Add-DistributionGroupMember' -cmdParams $params -UseSystemMailbox $true
$Params = @{ Identity = $GroupId; Member = $Member; BypassSecurityGroupManagerCheck = $true }
$null = New-ExoRequest -tenantid $TenantFilter -cmdlet 'Add-DistributionGroupMember' -cmdParams $Params -UseSystemMailbox $true
} else {
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/groups/$($GroupId)" -tenantid $TenantFilter -type patch -body $addmemberbody -Verbose
$null = New-GraphPostRequest -uri "https://graph.microsoft.com/beta/groups/$($GroupId)" -tenantid $TenantFilter -type patch -body $AddMemberBody -Verbose
}
$Message = "Successfully added user $($Member) to $($GroupId)."
Write-LogMessage -headers $Headers -API $APIName -tenant $TenantFilter -message $Message -Sev 'Info'
return $message
$Results = "Successfully added user $($Member) to $($GroupId)."
Write-LogMessage -headers $Headers -API $APIName -tenant $TenantFilter -message $Results -Sev 'Info'
return $Results
} catch {
$message = "Failed to add user $($Member) to $($GroupId) - $($_.Exception.Message)"
Write-LogMessage -headers $Headers -API $APIName -tenant $TenantFilter -message $message -Sev 'error' -LogData (Get-CippException -Exception $_)
return $message
$ErrorMessage = Get-CippException -Exception $_
$Results = "Failed to add user $($Member) to $($GroupId) - $($ErrorMessage.NormalizedError)"
Write-LogMessage -headers $Headers -API $APIName -tenant $TenantFilter -message $Results -Sev 'error' -LogData $ErrorMessage
throw $Results
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ Function Invoke-ExecModifyCalPerms {

$APIName = $Request.Params.CIPPEndpoint
Write-LogMessage -headers $Request.Headers -API $APINAME-message 'Accessed this API' -Sev 'Debug'

$Username = $request.body.userID
$Tenantfilter = $request.body.tenantfilter
$Permissions = $request.body.permissions

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

if ($username -eq $null) {
if ($username -eq $null) {
Write-LogMessage -headers $Request.Headers -API $APINAME-message 'Username is null' -Sev 'Error'
$body = [pscustomobject]@{'Results' = @('Username is required') }
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
Expand All @@ -28,12 +28,11 @@ Function Invoke-ExecModifyCalPerms {
})
return
}

try {
$userid = (New-GraphGetRequest -uri "https://graph.microsoft.com/beta/users/$($username)" -tenantid $Tenantfilter).id
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Retrieved user ID: $userid" -Sev 'Debug'
}
catch {
} catch {
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Failed to get user ID: $($_.Exception.Message)" -Sev 'Error'
$body = [pscustomobject]@{'Results' = @("Failed to get user ID: $($_.Exception.Message)") }
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
Expand All @@ -50,8 +49,7 @@ Function Invoke-ExecModifyCalPerms {
if ($Permissions -is [PSCustomObject]) {
if ($Permissions.PSObject.Properties.Name -match '^\d+$') {
$Permissions = $Permissions.PSObject.Properties.Value
}
else {
} else {
$Permissions = @($Permissions)
}
}
Expand All @@ -60,13 +58,14 @@ Function Invoke-ExecModifyCalPerms {

foreach ($Permission in $Permissions) {
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Processing permission: $($Permission | ConvertTo-Json)" -Sev 'Debug'

$PermissionLevel = $Permission.PermissionLevel.value ?? $Permission.PermissionLevel
$Modification = $Permission.Modification
$CanViewPrivateItems = $Permission.CanViewPrivateItems ?? $false

Write-LogMessage -headers $Request.Headers -API $APINAME-message "Permission Level: $PermissionLevel, Modification: $Modification, CanViewPrivateItems: $CanViewPrivateItems" -Sev 'Debug'

$FolderName = $Permission.FolderName ?? 'Calendar'

Write-LogMessage -headers $Request.Headers -API $APINAME-message "Permission Level: $PermissionLevel, Modification: $Modification, CanViewPrivateItems: $CanViewPrivateItems, FolderName: $FolderName" -Sev 'Debug'

# Handle UserID as array or single value
$TargetUsers = @($Permission.UserID | ForEach-Object { $_.value ?? $_ })

Expand All @@ -75,48 +74,24 @@ Function Invoke-ExecModifyCalPerms {
foreach ($TargetUser in $TargetUsers) {
try {
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Processing target user: $TargetUser" -Sev 'Debug'

if ($Modification -eq 'Remove') {
try {
$CalPerms = New-ExoRequest -Anchor $username -tenantid $Tenantfilter -cmdlet 'Remove-MailboxFolderPermission' -cmdParams @{
Identity = "$($userid):\Calendar"
User = $TargetUser
Confirm = $false
}
$null = $results.Add("Removed $($TargetUser) from $($username) Calendar permissions")
}
catch {
$null = $results.Add("No existing permissions to remove for $($TargetUser)")
}
}
else {
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Setting permissions with AccessRights: $PermissionLevel" -Sev 'Debug'

$cmdParams = @{
Identity = "$($userid):\Calendar"
User = $TargetUser
AccessRights = $PermissionLevel
Confirm = $false
}

if ($CanViewPrivateItems) {
$cmdParams['SharingPermissionFlags'] = 'Delegate,CanViewPrivateItems'
}

try {
# Try Add first
$CalPerms = New-ExoRequest -Anchor $username -tenantid $Tenantfilter -cmdlet 'Add-MailboxFolderPermission' -cmdParams $cmdParams
$null = $results.Add("Granted $($TargetUser) $($PermissionLevel) access to $($username) Calendar$($CanViewPrivateItems ? ' with access to private items' : '')")
}
catch {
# If Add fails, try Set
$CalPerms = New-ExoRequest -Anchor $username -tenantid $Tenantfilter -cmdlet 'Set-MailboxFolderPermission' -cmdParams $cmdParams
$null = $results.Add("Updated $($TargetUser) $($PermissionLevel) access to $($username) Calendar$($CanViewPrivateItems ? ' with access to private items' : '')")
}
$Params = @{
APIName = $APIName
Headers = $Request.Headers
RemoveAccess = if ($Modification -eq 'Remove') { $TargetUser } else { $null }
TenantFilter = $Tenantfilter
UserID = $userid
folderName = $FolderName
UserToGetPermissions = $TargetUser
LoggingName = $TargetUser
Permissions = $PermissionLevel
CanViewPrivateItems = $CanViewPrivateItems
}

$Result = Set-CIPPCalendarPermission @Params

$null = $results.Add($Result)
Write-LogMessage -headers $Request.Headers -API $APINAME-message "Successfully executed $($PermissionLevel) permission modification for $($TargetUser) on $($username)" -Sev 'Info' -tenant $TenantFilter
}
catch {
} catch {
$HasErrors = $true
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
$null = $results.Add("Could not execute $($PermissionLevel) permission modification for $($TargetUser) on $($username). Error: $($_.Exception.Message)")
Expand All @@ -137,4 +112,4 @@ Function Invoke-ExecModifyCalPerms {
StatusCode = if ($HasErrors) { [HttpStatusCode]::InternalServerError } else { [HttpStatusCode]::OK }
Body = $Body
})
}
}
Loading