@@ -4,56 +4,54 @@ function Test-CIPPAccess {
44 [switch ]$TenantList ,
55 [switch ]$GroupList
66 )
7- # Initialize per-call profiling
7+
88 $AccessTimings = @ {}
99 $AccessTotalSw = [System.Diagnostics.Stopwatch ]::StartNew()
1010 if ($Request.Params.CIPPEndpoint -eq ' ExecSAMSetup' ) { return $true }
11-
12- # Get function help
1311 $FunctionName = ' Invoke-{0}' -f $Request.Params.CIPPEndpoint
1412
1513 $SwPermissions = [System.Diagnostics.Stopwatch ]::StartNew()
16- if (-not $global :CIPPFunctionPermissions ) {
14+ if (-not $script :CIPPFunctionPermissions ) {
1715 $CIPPCoreModule = Get-Module - Name CIPPCore
1816 if ($CIPPCoreModule ) {
19- $PermissionsFileJson = Join-Path $CIPPCoreModule.ModuleBase ' lib' ' data' ' function-permissions.json'
20-
21- if (Test-Path $PermissionsFileJson ) {
17+ $CIPPCoreModuleRoot = $CIPPCoreModule.ModuleBase
18+ $CIPPRoot = (Get-Item $CIPPCoreModuleRoot ).Parent.Parent
19+ $MetadataPath = Join-Path $CIPPRoot ' Config\function-metadata.psd1'
20+ if (Test-Path $MetadataPath ) {
2221 try {
23- $jsonData = Get-Content - Path $PermissionsFileJson - Raw | ConvertFrom-Json - AsHashtable
24- $global :CIPPFunctionPermissions = [System.Collections.Hashtable ]::new([StringComparer ]::OrdinalIgnoreCase)
25- foreach ($key in $jsonData.Keys ) {
26- $global :CIPPFunctionPermissions [$key ] = $jsonData [$key ]
27- }
28- Write-Debug " Loaded $ ( $global :CIPPFunctionPermissions.Count ) function permissions from JSON cache"
22+ $metadata = Import-PowerShellDataFile - Path $MetadataPath
23+ $script :CIPPFunctionPermissions = $metadata.Functions
24+ Write-Debug " Loaded $ ( $script :CIPPFunctionPermissions.Count ) function permissions from metadata cache"
2925 } catch {
30- Write-Warning " Failed to load function permissions from JSON : $ ( $_.Exception.Message ) "
26+ Write-Warning " Failed to load function permissions from metadata : $ ( $_.Exception.Message ) "
3127 }
28+ } else {
29+ Write-Warning " Metadata file not found at $MetadataPath "
3230 }
3331 }
3432 }
3533 $SwPermissions.Stop ()
3634 $AccessTimings [' FunctionPermissions' ] = $SwPermissions.Elapsed.TotalMilliseconds
3735
3836 if ($FunctionName -ne ' Invoke-me' ) {
39- $swHelp = [System.Diagnostics.Stopwatch ]::StartNew()
40- if ($global :CIPPFunctionPermissions -and $global :CIPPFunctionPermissions.ContainsKey ($FunctionName )) {
41- $PermissionData = $global :CIPPFunctionPermissions [$FunctionName ]
37+ $swMeta = [System.Diagnostics.Stopwatch ]::StartNew()
38+ if ($script :CIPPFunctionPermissions -and $script :CIPPFunctionPermissions.ContainsKey ($FunctionName )) {
39+ $PermissionData = $script :CIPPFunctionPermissions [$FunctionName ]
4240 $APIRole = $PermissionData [' Role' ]
4341 $Functionality = $PermissionData [' Functionality' ]
44- Write-Debug " Loaded function permission data from cache for '$FunctionName ': Role='$APIRole ', Functionality='$Functionality '"
42+ Write-Debug " Loaded function permission data from metadata for '$FunctionName ': Role='$APIRole ', Functionality='$Functionality '"
4543 } else {
4644 try {
4745 $Help = Get-Help $FunctionName - ErrorAction Stop
4846 $APIRole = $Help.Role
4947 $Functionality = $Help.Functionality
5048 Write-Debug " Loaded function permission data via Get-Help for '$FunctionName ': Role='$APIRole ', Functionality='$Functionality '"
5149 } catch {
52- Write-Warning " Function '$FunctionName ' not found"
50+ Write-Warning " Function '$FunctionName ' not found in metadata cache or via Get-Help "
5351 }
5452 }
55- $swHelp .Stop ()
56- $AccessTimings [' GetHelp ' ] = $swHelp .Elapsed.TotalMilliseconds
53+ $swMeta .Stop ()
54+ $AccessTimings [' MetadataLookup ' ] = $swMeta .Elapsed.TotalMilliseconds
5755 }
5856
5957 # Get default roles from config
@@ -120,6 +118,13 @@ function Test-CIPPAccess {
120118 }
121119 if ($Request.Params.CIPPEndpoint -eq ' me' ) {
122120 $Permissions = Get-CippAllowedPermissions - UserRoles $CustomRoles
121+ $swApiClient.Stop ()
122+ $AccessTotalSw.Stop ()
123+ $AccessTimings [' ApiClientBranch' ] = $swApiClient.Elapsed.TotalMilliseconds
124+ $AccessTimings [' Total' ] = $AccessTotalSw.Elapsed.TotalMilliseconds
125+ $AccessTimingsRounded = [ordered ]@ {}
126+ foreach ($Key in ($AccessTimings.Keys | Sort-Object )) { $AccessTimingsRounded [$Key ] = [math ]::Round($AccessTimings [$Key ], 2 ) }
127+ Write-Information " #### Access Timings #### $ ( $AccessTimingsRounded | ConvertTo-Json - Compress) "
123128 return ([HttpResponseContext ]@ {
124129 StatusCode = [HttpStatusCode ]::OK
125130 Body = (
@@ -153,6 +158,13 @@ function Test-CIPPAccess {
153158 if ($Request.Params.CIPPEndpoint -eq ' me' ) {
154159
155160 if (! $User.userRoles ) {
161+ $swUserBranch.Stop ()
162+ $AccessTotalSw.Stop ()
163+ $AccessTimings [' UserBranch' ] = $swUserBranch.Elapsed.TotalMilliseconds
164+ $AccessTimings [' Total' ] = $AccessTotalSw.Elapsed.TotalMilliseconds
165+ $AccessTimingsRounded = [ordered ]@ {}
166+ foreach ($Key in ($AccessTimings.Keys | Sort-Object )) { $AccessTimingsRounded [$Key ] = [math ]::Round($AccessTimings [$Key ], 2 ) }
167+ Write-Information " #### Access Timings #### $ ( $AccessTimingsRounded | ConvertTo-Json - Compress) "
156168 return ([HttpResponseContext ]@ {
157169 StatusCode = [HttpStatusCode ]::OK
158170 Body = (
@@ -167,6 +179,13 @@ function Test-CIPPAccess {
167179 $Permissions = Get-CippAllowedPermissions - UserRoles $User.userRoles
168180 $swPermsMe.Stop ()
169181 $AccessTimings [' GetPermissions(me)' ] = $swPermsMe.Elapsed.TotalMilliseconds
182+ $swUserBranch.Stop ()
183+ $AccessTotalSw.Stop ()
184+ $AccessTimings [' UserBranch' ] = $swUserBranch.Elapsed.TotalMilliseconds
185+ $AccessTimings [' Total' ] = $AccessTotalSw.Elapsed.TotalMilliseconds
186+ $AccessTimingsRounded = [ordered ]@ {}
187+ foreach ($Key in ($AccessTimings.Keys | Sort-Object )) { $AccessTimingsRounded [$Key ] = [math ]::Round($AccessTimings [$Key ], 2 ) }
188+ Write-Information " #### Access Timings #### $ ( $AccessTimingsRounded | ConvertTo-Json - Compress) "
170189 return ([HttpResponseContext ]@ {
171190 StatusCode = [HttpStatusCode ]::OK
172191 Body = (
@@ -465,13 +484,13 @@ function Test-CIPPAccess {
465484 $AccessTimings [' Total' ] = $AccessTotalSw.Elapsed.TotalMilliseconds
466485 $AccessTimingsRounded = [ordered ]@ {}
467486 foreach ($Key in ($AccessTimings.Keys | Sort-Object )) { $AccessTimingsRounded [$Key ] = [math ]::Round($AccessTimings [$Key ], 2 ) }
468- Write-Debug " #### Access Timings #### $ ( $AccessTimingsRounded | ConvertTo-Json - Compress) "
487+ Write-Information " #### Access Timings #### $ ( $AccessTimingsRounded | ConvertTo-Json - Compress) "
469488 return @ (' AllTenants' )
470489 }
471490 $AccessTotalSw.Stop ()
472491 $AccessTimings [' Total' ] = $AccessTotalSw.Elapsed.TotalMilliseconds
473492 $AccessTimingsRounded = [ordered ]@ {}
474493 foreach ($Key in ($AccessTimings.Keys | Sort-Object )) { $AccessTimingsRounded [$Key ] = [math ]::Round($AccessTimings [$Key ], 2 ) }
475- Write-Debug " #### Access Timings #### $ ( $AccessTimingsRounded | ConvertTo-Json - Compress) "
494+ Write-Information " #### Access Timings #### $ ( $AccessTimingsRounded | ConvertTo-Json - Compress) "
476495 return $true
477496}
0 commit comments