@@ -4,26 +4,35 @@ function Test-CIPPAccess {
44 [switch ]$TenantList ,
55 [switch ]$GroupList
66 )
7+ # Initialize per-call profiling
8+ $AccessTimings = @ {}
9+ $AccessTotalSw = [System.Diagnostics.Stopwatch ]::StartNew()
710 if ($Request.Params.CIPPEndpoint -eq ' ExecSAMSetup' ) { return $true }
811
912 # Get function help
1013 $FunctionName = ' Invoke-{0}' -f $Request.Params.CIPPEndpoint
1114
1215 if ($FunctionName -ne ' Invoke-me' ) {
16+ $swHelp = [System.Diagnostics.Stopwatch ]::StartNew()
1317 try {
1418 $Help = Get-Help $FunctionName - ErrorAction Stop
1519 } catch {
1620 Write-Warning " Function '$FunctionName ' not found"
1721 }
22+ $swHelp.Stop ()
23+ $AccessTimings [' GetHelp' ] = $swHelp.Elapsed.TotalMilliseconds
1824 }
1925
2026 # Check help for role
2127 $APIRole = $Help.Role
2228
2329 # Get default roles from config
30+ $swRolesLoad = [System.Diagnostics.Stopwatch ]::StartNew()
2431 $CIPPCoreModuleRoot = Get-Module - Name CIPPCore | Select-Object - ExpandProperty ModuleBase
2532 $CIPPRoot = (Get-Item $CIPPCoreModuleRoot ).Parent.Parent
2633 $BaseRoles = Get-Content - Path $CIPPRoot \Config\cipp- roles.json | ConvertFrom-Json
34+ $swRolesLoad.Stop ()
35+ $AccessTimings [' LoadBaseRoles' ] = $swRolesLoad.Elapsed.TotalMilliseconds
2736 $DefaultRoles = @ (' superadmin' , ' admin' , ' editor' , ' readonly' , ' anonymous' , ' authenticated' )
2837
2938 if ($APIRole -eq ' Public' ) {
@@ -32,6 +41,7 @@ function Test-CIPPAccess {
3241
3342 if ($Request.Headers .' x-ms-client-principal-idp' -eq ' aad' -and $Request.Headers .' x-ms-client-principal-name' -match ' ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' ) {
3443 $Type = ' APIClient'
44+ $swApiClient = [System.Diagnostics.Stopwatch ]::StartNew()
3545 # Direct API Access
3646 $ForwardedFor = $Request.Headers .' x-forwarded-for' -split ' ,' | Select-Object - First 1
3747 $IPRegex = ' ^(?<IP>(?:\d{1,3}(?:\.\d{1,3}){3}|\[[0-9a-fA-F:]+\]|[0-9a-fA-F:]+))(?::\d+)?$'
@@ -92,14 +102,20 @@ function Test-CIPPAccess {
92102 } | ConvertTo-Json - Depth 5 )
93103 })
94104 }
105+ $swApiClient.Stop ()
106+ $AccessTimings [' ApiClientBranch' ] = $swApiClient.Elapsed.TotalMilliseconds
95107
96108 } else {
97109 $Type = ' User'
110+ $swUserBranch = [System.Diagnostics.Stopwatch ]::StartNew()
98111 $User = [System.Text.Encoding ]::UTF8.GetString([System.Convert ]::FromBase64String($Request.Headers .' x-ms-client-principal' )) | ConvertFrom-Json
99112
100113 # Check for roles granted via group membership
101114 if (($User.userRoles | Measure-Object ).Count -eq 2 -and $User.userRoles -contains ' authenticated' -and $User.userRoles -contains ' anonymous' ) {
115+ $swResolveUserRoles = [System.Diagnostics.Stopwatch ]::StartNew()
102116 $User = Test-CIPPAccessUserRole - User $User
117+ $swResolveUserRoles.Stop ()
118+ $AccessTimings [' ResolveUserRoles' ] = $swResolveUserRoles.Elapsed.TotalMilliseconds
103119 }
104120
105121 # Write-Information ($User | ConvertTo-Json -Depth 5)
@@ -117,7 +133,10 @@ function Test-CIPPAccess {
117133 })
118134 }
119135
136+ $swPermsMe = [System.Diagnostics.Stopwatch ]::StartNew()
120137 $Permissions = Get-CippAllowedPermissions - UserRoles $User.userRoles
138+ $swPermsMe.Stop ()
139+ $AccessTimings [' GetPermissions(me)' ] = $swPermsMe.Elapsed.TotalMilliseconds
121140 return ([HttpResponseContext ]@ {
122141 StatusCode = [HttpStatusCode ]::OK
123142 Body = (
@@ -187,8 +206,12 @@ function Test-CIPPAccess {
187206 if (@ (' admin' , ' superadmin' ) -contains $BaseRole.Name ) {
188207 return $true
189208 } else {
209+ $swTenantsLoad = [System.Diagnostics.Stopwatch ]::StartNew()
190210 $Tenants = Get-Tenants - IncludeErrors
211+ $swTenantsLoad.Stop ()
212+ $AccessTimings [' LoadTenants' ] = $swTenantsLoad.Elapsed.TotalMilliseconds
191213 $PermissionsFound = $false
214+ $swRolePerms = [System.Diagnostics.Stopwatch ]::StartNew()
192215 $PermissionSet = foreach ($CustomRole in $CustomRoles ) {
193216 try {
194217 Get-CIPPRolePermissions - Role $CustomRole
@@ -198,9 +221,12 @@ function Test-CIPPAccess {
198221 continue
199222 }
200223 }
224+ $swRolePerms.Stop ()
225+ $AccessTimings [' GetRolePermissions' ] = $swRolePerms.Elapsed.TotalMilliseconds
201226
202227 if ($PermissionsFound ) {
203228 if ($TenantList.IsPresent ) {
229+ $swTenantList = [System.Diagnostics.Stopwatch ]::StartNew()
204230 $LimitedTenantList = foreach ($Permission in $PermissionSet ) {
205231 if ((($Permission.AllowedTenants | Measure-Object ).Count -eq 0 -or $Permission.AllowedTenants -contains ' AllTenants' ) -and (($Permission.BlockedTenants | Measure-Object ).Count -eq 0 )) {
206232 @ (' AllTenants' )
@@ -240,8 +266,11 @@ function Test-CIPPAccess {
240266 $ExpandedAllowedTenants | Where-Object { $ExpandedBlockedTenants -notcontains $_ }
241267 }
242268 }
269+ $swTenantList.Stop ()
270+ $AccessTimings [' BuildTenantList' ] = $swTenantList.Elapsed.TotalMilliseconds
243271 return @ ($LimitedTenantList | Sort-Object - Unique)
244272 } elseif ($GroupList.IsPresent ) {
273+ $swGroupList = [System.Diagnostics.Stopwatch ]::StartNew()
245274 Write-Information " Getting allowed groups for roles: $ ( $CustomRoles -join ' , ' ) "
246275 $LimitedGroupList = foreach ($Permission in $PermissionSet ) {
247276 if ((($Permission.AllowedTenants | Measure-Object ).Count -eq 0 -or $Permission.AllowedTenants -contains ' AllTenants' ) -and (($Permission.BlockedTenants | Measure-Object ).Count -eq 0 )) {
@@ -254,11 +283,14 @@ function Test-CIPPAccess {
254283 }
255284 }
256285 }
286+ $swGroupList.Stop ()
287+ $AccessTimings [' BuildGroupList' ] = $swGroupList.Elapsed.TotalMilliseconds
257288 return @ ($LimitedGroupList | Sort-Object - Unique)
258289 }
259290
260291 $TenantAllowed = $false
261292 $APIAllowed = $false
293+ $swPermissionEval = [System.Diagnostics.Stopwatch ]::StartNew()
262294 foreach ($Role in $PermissionSet ) {
263295 foreach ($Perm in $Role.Permissions ) {
264296 if ($Perm -match $APIRole ) {
@@ -329,6 +361,8 @@ function Test-CIPPAccess {
329361 }
330362 }
331363 }
364+ $swPermissionEval.Stop ()
365+ $AccessTimings [' EvaluatePermissions' ] = $swPermissionEval.Elapsed.TotalMilliseconds
332366
333367 if (! $APIAllowed ) {
334368 throw " Access to this CIPP API endpoint is not allowed, you do not have the required permission: $APIRole "
@@ -392,10 +426,22 @@ function Test-CIPPAccess {
392426 }
393427 return $true
394428 }
429+ $swUserBranch.Stop ()
430+ $AccessTimings [' UserBranch' ] = $swUserBranch.Elapsed.TotalMilliseconds
395431 }
396432
397433 if ($TenantList.IsPresent ) {
434+ $AccessTotalSw.Stop ()
435+ $AccessTimings [' Total' ] = $AccessTotalSw.Elapsed.TotalMilliseconds
436+ $AccessTimingsRounded = [ordered ]@ {}
437+ foreach ($Key in ($AccessTimings.Keys | Sort-Object )) { $AccessTimingsRounded [$Key ] = [math ]::Round($AccessTimings [$Key ], 2 ) }
438+ Write-Information " #### Access Timings #### $ ( $AccessTimingsRounded | ConvertTo-Json - Compress) "
398439 return @ (' AllTenants' )
399440 }
441+ $AccessTotalSw.Stop ()
442+ $AccessTimings [' Total' ] = $AccessTotalSw.Elapsed.TotalMilliseconds
443+ $AccessTimingsRounded = [ordered ]@ {}
444+ foreach ($Key in ($AccessTimings.Keys | Sort-Object )) { $AccessTimingsRounded [$Key ] = [math ]::Round($AccessTimings [$Key ], 2 ) }
445+ Write-Information " #### Access Timings #### $ ( $AccessTimingsRounded | ConvertTo-Json - Compress) "
400446 return $true
401447}
0 commit comments