src/cmdlets/common/ConsentHelper.ps1

# Copyright 2019, Adam Edwards
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

. (import-script DisplayTypeFormatter)

ScriptClass ConsentHelper {
    static {
        const CONSENT_DISPLAY_TYPE GraphConsentDisplayType
        $formatter = $null

        function __initialize {
            $this.formatter = new-so DisplayTypeFormatter $CONSENT_DISPLAY_TYPE 'PermissionType', 'StartTime', 'GrantedTo', 'Permission'
            __RegisterDisplayType
        }

        function ToDisplayableObject($object, $targetAppId, $targetServicePrincipalId) {
            $consentEntries = @()
            $isOAuth2PermissionGrant = !(!($object | gm -erroraction ignore clientid))

            if ( $isOAuth2PermissionGrant ) {
                $startTime = if ( $object | gm startTime -erroraction ignore ) { $object.startTime }
                $expiryTime = if ( $object | gm expiryTime -erroraction ignore ) { $object.expiryTime }
                $startTimeOffset = if ( $startTime ) { $::.DisplayTypeFormatter |=> UtcTimeStringToDateTimeOffset $startTime $true }
                $expiryTimeOffset = if ( $expiryTime ) { $::.DisplayTypeFormatter |=> UtcTimeStringToDateTimeOffset $expiryTime $true }
                $grantedTo = if ( $object.consentType -eq 'AllPrincipals' ) { 'AllPrincipals' } else { $object.PrincipalId }
                $scopes = $object.scope -split ' '

                foreach ( $scope in $scopes ) {
                    if ( $scope ) {
                        $consentEntries += [PSCustomObject] @{
                            AppId = $targetAppId
                            PermissionType = 'Delegated'
                            Permission = $scope
                            GrantedTo = $grantedTo
                            ServicePrincipalId = $targetServicePrincipalId
                            StartTime = $startTimeOffset
                            GraphResource = $object
                        }
                    }
                }
            } else {
                $roleName = $::.ScopeHelper |=> GraphPermissionIdToName $object.appRoleId role $null $true
                $permissionDisplayName = if ( $roleName ) {
                    $roleName
                } else {
                    $appRoleId
                }

                $creationTimeOffset = if ( $object | gm creationTimeStamp -erroraction ignore ) {
                    $::.DisplayTypeFormatter |=> UtcTimeStringToDateTimeOffset $object.creationTimestamp $true
                }

                $principalId = if ( $object | gm PrincipalId -erroraction ignore ) {
                    $object.PrincipalId
                }

                $consentEntries += [PSCustomObject] @{
                    AppId = $targetAppId
                    PermissionType = 'Application'
                    Permission = $permissionDisplayName
                    GrantedTo = $object.PrincipalId
                    ServicePrincipalId = $targetServicePrincipalId
                    StartTime = $creationTimeOffset
                    GraphResource = $object
                }
            }

            foreach ( $consentEntry in $consentEntries ) {
                $consentEntry.pstypenames.insert(0, $CONSENT_DISPLAY_TYPE)
                $consentEntry.pstypenames.Add('GraphResponseObject')
                $consentEntry
            }
        }

        function __RegisterDisplayType {
            $typeProperties = @(
                'AppId'
                'PermissionType'
                'Permission'
                'GrantedTo'
                'ServicePrincipalId'
                'StartTime'
            )

            $::.DisplayTypeFormatter |=> RegisterDisplayType $CONSENT_DISPLAY_TYPE $typeProperties $true
        }
    }
}

$::.ConsentHelper |=> __initialize