{"version":3,"file":"dbg-riskit-angular-auth.mjs","sources":["../../../../pkg/dbg-riskit/angular-auth/src/lib/auth.config.ts","../../../../pkg/dbg-riskit/angular-auth/src/lib/jwt.helper.ts","../../../../pkg/dbg-riskit/angular-auth/src/lib/auth.storage.service.ts","../../../../pkg/dbg-riskit/angular-auth/src/lib/auth.http.interceptor.ts","../../../../pkg/dbg-riskit/angular-auth/src/lib/request.utils.ts","../../../../pkg/dbg-riskit/angular-auth/src/lib/nonce.generator.ts","../../../../pkg/dbg-riskit/angular-auth/src/lib/well.known.service.ts","../../../../pkg/dbg-riskit/angular-auth/src/lib/auth.service.ts","../../../../pkg/dbg-riskit/angular-auth/src/lib/auth.routing.flow.service.ts","../../../../pkg/dbg-riskit/angular-auth/src/lib/auth.routing.guard.ts","../../../../pkg/dbg-riskit/angular-auth/src/lib/auth.module.ts","../../../../pkg/dbg-riskit/angular-auth/src/lib/config.reader.ts","../../../../pkg/dbg-riskit/angular-auth/src/dbg-riskit-angular-auth.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport type AuthFlowNames =\n    'openid-connect/authorization-code' |\n    'openid-connect/implicit' |\n    'openid-connect/hybrid' |\n    'openid-connect/direct';\n\nexport class AuthFlow {\n    private static readonly CONSTANTS_MAP: { [key: string]: AuthFlow } = {};\n    public static readonly AUTHORIZATION_CODE = new AuthFlow('openid-connect/authorization-code');\n    public static readonly IMPLICIT = new AuthFlow('openid-connect/implicit');\n    public static readonly HYBRID = new AuthFlow('openid-connect/hybrid');\n    public static readonly DIRECT = new AuthFlow('openid-connect/direct');\n\n    private constructor(private readonly _type: string) {\n        AuthFlow.CONSTANTS_MAP[_type] = this;\n    }\n\n    public get type(): string {\n        return this._type;\n    }\n\n    public static byType(type: AuthFlowNames): AuthFlow {\n        return AuthFlow.CONSTANTS_MAP[type];\n    }\n}\n\nexport type AuthSpecScopes = 'profile' | 'group' | 'email' | 'address' | 'phone';\n\nexport interface AuthConfig {\n    loginRoute: string;\n    afterLoginRedirectRoute: string;\n    wellKnown: string;\n    clientID: string;\n    clientSecret?: string;\n    flow: AuthFlow;\n    useNonce?: boolean;\n    scope?: Array<AuthSpecScopes | string>;\n}\n\nexport const AUTH_CONFIG = new InjectionToken<AuthConfig>('risk.authConfig');\n","/**\n * Helper class to decode and find JWT expiration.\n */\nimport {base64decode, base64encode} from '@dbg-riskit/common';\nimport {TokenData} from './token.responses';\n\n// @dynamic\nexport class JwtHelper {\n\n    public static decodeToken(token: string): TokenData {\n        const parts = token.split('.');\n\n        if (parts.length !== 3) {\n            throw new Error('JWT must have 3 parts');\n        }\n\n        const decoded = base64decode(parts[1]);\n        if (!decoded) {\n            throw new Error('Cannot decode the token');\n        }\n\n        return JSON.parse(decoded);\n    }\n\n    public static getTokenExpirationDate(token: string,\n                                         property: keyof Pick<TokenData, 'exp' | 'iat'> = 'exp'\n    ): Date | null {\n        const decoded = JwtHelper.decodeToken(token);\n\n        if (!decoded.hasOwnProperty(property)) {\n            return null;\n        }\n\n        const date = new Date(0); // The 0 here is the key, which sets the date to the epoch\n        date.setUTCSeconds(decoded[property]);\n\n        return date;\n    }\n\n    public static isTokenExpired(token: string, offsetSeconds?: number): boolean {\n        const date = JwtHelper.getTokenExpirationDate(token);\n        return JwtHelper.isBefore(date, offsetSeconds);\n    }\n\n    public static isBefore(date: Date | null, offsetSeconds?: number): boolean {\n        offsetSeconds = offsetSeconds || 0;\n\n        if (date == null) {\n            return false;\n        }\n\n        // Token expired?\n        return date.valueOf() < (new Date().valueOf() + (offsetSeconds * 1000));\n    }\n}\n\nexport function encodeTestToken(payload: TokenData): string {\n    // Don't actually check or care about the header or signature in angular2-jwt\n    return `.${base64encode(JSON.stringify(payload))}.`;\n}\n","import {Injectable} from '@angular/core';\n\nimport {LocalStorage, Logger, Maybe} from '@dbg-riskit/common';\n\nimport {JwtHelper} from './jwt.helper';\n\n@Injectable()\nexport class AuthStorageService {\n\n    @LocalStorage('id_token', 'auth')\n    public idToken?: string | null;\n\n    @LocalStorage('access_token', 'auth')\n    public accessToken?: string | null;\n\n    @LocalStorage('refresh_token', 'auth')\n    public refreshToken?: string | null;\n\n    @LocalStorage('sync_diff', 'auth')\n    private _timeSyncDiff?: number | null;\n\n    @LocalStorage('nonce', 'auth')\n    public nonce?: string | null;\n\n    @LocalStorage('req_path', 'auth')\n    public authRequestedPath?: string | null;\n\n    public constructor(private readonly logger: Logger) {\n    }\n\n    public syncTime(): void {\n        const now = Math.floor((new Date().valueOf()) / 1000);\n        const computeDiff = (token: Maybe<string>, currDiff = 0): number => {\n            if (token) {\n                const tokenData = JwtHelper.decodeToken(token);\n                if (tokenData.iat) {\n                    const diff = tokenData.iat - now;\n                    if (Math.abs(diff) > Math.abs(currDiff)) {\n                        return diff;\n                    }\n                }\n            }\n            return currDiff;\n        };\n\n        this._timeSyncDiff = computeDiff(this.idToken);\n        this._timeSyncDiff = computeDiff(this.accessToken, this._timeSyncDiff);\n        this._timeSyncDiff = computeDiff(this.refreshToken, this._timeSyncDiff);\n        this._timeSyncDiff = Math.floor(this._timeSyncDiff || 0);\n    }\n\n    private get exp(): Date | null {\n        const computeExpiration = (token: Maybe<string>, date: Date | null = null): Date | null => {\n            if (token) {\n                const tokenExp = JwtHelper.getTokenExpirationDate(token);\n                if (date == null || tokenExp == null) {\n                    return tokenExp;\n                }\n\n                if (date > tokenExp) {\n                    return tokenExp;\n                }\n            }\n            return date;\n        };\n\n        let exp = computeExpiration(this.idToken);\n        exp = computeExpiration(this.accessToken, exp);\n        return computeExpiration(this.refreshToken, exp);\n    }\n\n    public get refresh_in(): number {\n        const exp = this.exp;\n        const now = new Date();\n        if (!exp) {\n            return 1;\n        }\n\n        const syncDiff = this._timeSyncDiff || 0;\n\n        const expFromNow = Math.floor((exp.valueOf() - now.valueOf()) / 1000) - syncDiff;\n        const refreshIn = expFromNow - 60; // Refresh at least a minute before\n        this.logger.info(`Tokens will refresh in ${refreshIn}s.`);\n\n        return refreshIn > 0 ? (refreshIn * 1000) : 1;\n    }\n\n    public clear() {\n        this.idToken = null;\n        this.accessToken = null;\n        this.refreshToken = null;\n        this._timeSyncDiff = null;\n        this.nonce = null;\n    }\n}\n","import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {Injectable} from '@angular/core';\nimport {HttpRequestHeaders} from '@dbg-riskit/angular-http';\nimport {AuthTokenType, Maybe} from '@dbg-riskit/common';\nimport {defer, Observable} from 'rxjs';\nimport {AuthStorageService} from './auth.storage.service';\n\nexport class AuthConfigConsts {\n    public static DEFAULT_HEADER_NAME = 'Authorization';\n    public static HEADER_PREFIX_BEARER = 'Bearer ';\n}\n\n@Injectable()\nexport class AuthHttpInterceptor implements HttpInterceptor {\n\n    public constructor(private readonly authStorage: AuthStorageService) {\n    }\n\n    public intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n        return defer(() => {\n            if (request.headers instanceof HttpRequestHeaders) {\n                const tokenType = request.headers.tokenType;\n                switch (tokenType) {\n                    case AuthTokenType.API:\n                        return handleInterception(this.authStorage.idToken, request, next);\n                    case AuthTokenType.AUTH:\n                        return handleInterception(this.authStorage.accessToken, request, next);\n                    default:\n                        return next.handle(request);\n                }\n            }\n            return next.handle(request);\n        });\n    }\n}\n\nfunction handleInterception(token: Maybe<string>, request: HttpRequest<unknown>,\n                            next: HttpHandler): Observable<HttpEvent<unknown>> {\n    if (token) {\n        request = request.clone({\n            setHeaders: {\n                [AuthConfigConsts.DEFAULT_HEADER_NAME]: `${AuthConfigConsts.HEADER_PREFIX_BEARER}${token}`\n            }\n        });\n    }\n    return next.handle(request);\n}\n","import {Location} from '@angular/common';\n\nexport interface OpenIDQueryParams {\n    error: string | null;\n    errorDesc: string | null;\n    code: string | null;\n    id_token: string | null;\n    access_token: string | null;\n}\n\n// @dynamic\nexport class RequestUtils {\n\n    public static get locationHref(): string {\n        return window.location.href;\n    }\n\n    public static set locationHref(href: string) {\n        window.location.href = href;\n    }\n\n    private static getURLPath(href: string) {\n        const link: HTMLAnchorElement = document.createElement('a');\n        link.href = href;\n        return link.pathname;\n    }\n\n    public static getOrigin(): string {\n        const port = window.location.port ? `:${window.location.port}` : '';\n        return window.location.origin || (`${window.location.protocol}//${window.location.hostname}${port}`);\n    }\n\n    public static getBaseURL(location: Location, relativeURL = '/'): string {\n        let baseURL = '';\n        if (location) {\n            baseURL = RequestUtils.getURLPath(location.prepareExternalUrl('/'));\n        }\n        if (!baseURL.startsWith('/')) {\n            baseURL = '/' + baseURL;\n        }\n        if (!baseURL.endsWith('/')) {\n            baseURL += '/';\n        }\n        if (relativeURL.startsWith('/')) {\n            relativeURL = relativeURL.substring(1);\n        }\n\n        const origin = RequestUtils.getOrigin();\n        return origin + baseURL + relativeURL;\n    }\n\n    public static getQueryParam(name: string): string | null {\n        const url = RequestUtils.locationHref;\n        name = name.replace(/[\\[\\]]/g, '\\\\$&');\n        const regex = new RegExp(`[?#&]${name}(=([^&#]*)|&|#|$)`);\n        const results = regex.exec(url);\n        if (!results) {\n            return null;\n        }\n        if (!results[2]) {\n            return '';\n        }\n        return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n    }\n\n    public static getOpenIDQueryParams(): OpenIDQueryParams {\n        const error = RequestUtils.getQueryParam('error');\n        const errorDesc = RequestUtils.getQueryParam('error_description');\n        const code = RequestUtils.getQueryParam('code');\n        const idToken = RequestUtils.getQueryParam('id_token');\n        const accessToken = RequestUtils.getQueryParam('access_token');\n        return {\n            error,\n            errorDesc,\n            code,\n            id_token    : idToken,\n            access_token: accessToken\n        };\n    }\n\n    public static hasOpenIDQueryParams(): boolean {\n        const params = RequestUtils.getOpenIDQueryParams();\n        return params.error != null\n               || params.errorDesc != null\n               || params.code != null\n               || params.id_token != null\n               || params.access_token != null;\n    }\n}\n","import {secureRandom} from '@dbg-riskit/common';\nimport {defer, Observable, of} from 'rxjs';\n\n// @dynamic\nexport class NonceGenerator {\n\n    public static generateNonce(): Observable<string> {\n        return defer(() => {\n            const guidHolder = 'xxx-xxyxxxxx4xxxyxxxxxx-xxxx4xxx';\n            const hex = '0123456789abcdef';\n            let r = 0;\n            let guidResponse = '';\n            for (const placeHolder of guidHolder) {\n                if (placeHolder !== '-' && placeHolder !== '4') {\n                    // each x and y needs to be random\n                    r = Math.floor(secureRandom() * 16);\n                }\n\n                if (placeHolder === 'x') {\n                    guidResponse += hex[r];\n                } else if (placeHolder === 'y') {\n\n                    /* eslint-disable no-bitwise */\n\n                    // clock-seq-and-reserved first hex is filtered and remaining hex values are random\n                    r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??\n                    r |= 0x8; // set pos 3 to 1 as 1???\n\n                    /* eslint-enable */\n\n                    guidResponse += hex[r];\n                } else {\n                    guidResponse += placeHolder;\n                }\n            }\n            return of(guidResponse);\n        });\n    }\n}\n","import {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';\nimport {Inject, Injectable} from '@angular/core';\nimport {CONTENT_TYPE} from '@dbg-riskit/common';\nimport {Observable} from 'rxjs';\nimport {map, shareReplay} from 'rxjs/operators';\nimport {AUTH_CONFIG, AuthConfig} from './auth.config';\n\nexport interface WellKnown {\n    endpoints: {\n        auth: string;\n        token: string;\n        logout: string;\n    };\n    issuer: string;\n}\n\n@Injectable()\nexport class WellKnownService {\n\n    private readonly _wellKnown: Observable<WellKnown>;\n\n    public constructor(private readonly http: HttpClient,\n                       @Inject(AUTH_CONFIG) private readonly authConfig: AuthConfig) {\n        const params = new HttpParams();\n        params.append('_', Date.now().toFixed(0));\n        this._wellKnown = this.http.get<{\n            authorization_endpoint: string;\n            token_endpoint: string;\n            end_session_endpoint: string;\n            issuer: string;\n        }>(this.authConfig.wellKnown, {\n            params,\n            headers: new HttpHeaders({\n                accept: CONTENT_TYPE.APPLICATION_JSON\n            })\n        }).pipe(\n            map((wellKnown) => (\n                    {\n                        endpoints: {\n                            auth  : wellKnown.authorization_endpoint,\n                            token : wellKnown.token_endpoint,\n                            logout: wellKnown.end_session_endpoint\n                        },\n                        issuer   : wellKnown.issuer\n                    }\n                )\n            ),\n            shareReplay(1)\n        );\n    }\n\n    public get wellKnown(): Observable<WellKnown> {\n        return this._wellKnown;\n    }\n}\n","import {Location} from '@angular/common';\nimport {Inject, Injectable} from '@angular/core';\nimport {AuthProvider, AuthTokenType, ErrorType, ReplaySubjectExt, toString, UserInfo} from '@dbg-riskit/common';\nimport {HttpService} from '@dbg-riskit/angular-http';\nimport {EMPTY, Observable, of, throwError} from 'rxjs';\nimport {catchError, defaultIfEmpty, first, map, shareReplay, switchMap, tap} from 'rxjs/operators';\nimport {AUTH_CONFIG, AuthConfig, AuthFlow} from './auth.config';\nimport {AuthStorageService} from './auth.storage.service';\nimport {JwtHelper} from './jwt.helper';\nimport {NonceGenerator} from './nonce.generator';\nimport {OpenIDQueryParams, RequestUtils} from './request.utils';\nimport {AuthResponse, TokenData} from './token.responses';\nimport {WellKnown, WellKnownService} from './well.known.service';\n\nexport const AUTH_CHECK_INTERVAL = 60000;\n\nconst OPEN_ID_SCOPE = 'openid';\nconst DEFAULT_OPEN_ID_SCOPES = ['profile', 'email', 'address', 'phone'];\n\nconst UNSUPPORTED_AUTH_FLOW_TYPE = 'Unsupported auth flow type!';\n\nfunction unsupportedFlowTypeError(): Error {\n    return new Error(UNSUPPORTED_AUTH_FLOW_TYPE);\n}\n\n@Injectable()\nexport class AuthService implements AuthProvider {\n\n    private readonly _loggedInStream: ReplaySubjectExt<boolean> = new ReplaySubjectExt<boolean>(1);\n\n    private tokenData?: UserInfo;\n\n    private refreshTimeout?: NodeJS.Timer | null;\n    private authCheckInterval?: NodeJS.Timer | null;\n\n    private readonly redirectURL: string;\n    private readonly openIDScope: string;\n    private readonly _initService: Observable<WellKnown>;\n\n    public constructor(@Inject(AUTH_CONFIG) private readonly authConfig: AuthConfig,\n                       private readonly wellKnownService: WellKnownService,\n                       private readonly http: HttpService,\n                       private readonly storage: AuthStorageService,\n                       location: Location) {\n\n        // Use false only if === false\n        this.authConfig.useNonce = this.authConfig.useNonce !== false;\n\n        this.redirectURL = RequestUtils.getBaseURL(location, this.authConfig.loginRoute);\n        this.openIDScope = [OPEN_ID_SCOPE].concat(this.authConfig.scope || DEFAULT_OPEN_ID_SCOPES).join(' ');\n\n        // Try to load tokens and process them\n        this._initService = this.wellKnownService.wellKnown.pipe(\n            switchMap((wellKnown: WellKnown) => this.processToken({\n                    id_token     : this.storage.idToken,\n                    access_token : this.storage.accessToken,\n                    refresh_token: this.storage.refreshToken\n                }, false) // Do not sync time as we are now in the future ;)\n                    .pipe(\n                        catchError(() => this.tryToRefresh()),\n                        defaultIfEmpty(0),\n                        map(() => wellKnown)\n                    )\n            ),\n            shareReplay(1)\n        );\n    }\n\n    public get loggedIn(): Observable<boolean> {\n        return this._initService.pipe(\n            map(() => !!this.tokenData)\n        );\n    }\n\n    public get userProfile(): Observable<UserInfo | undefined> {\n        return this._initService.pipe(\n            map(() => this.tokenData)\n        );\n    }\n\n    public get loggedInStream(): Observable<boolean> {\n        return this._loggedInStream.asObservable();\n    }\n\n    public emitLoginStatusChange(status: boolean) {\n        if (this._loggedInStream.lastValue !== status) {\n            this._loggedInStream.next(status);\n        }\n    }\n\n    // <editor-fold defaultstate=\"collapsed\" desc=\"Indirect login\">\n\n    public loginViaAuthService(): Observable<boolean> {\n        return this.wellKnownService.wellKnown.pipe(\n            switchMap((wellKnown: WellKnown) =>\n                NonceGenerator.generateNonce().pipe(\n                    map((nonce) => ({\n                        wellKnown,\n                        nonce\n                    }))\n                )\n            ),\n            map(({wellKnown, nonce}) => {\n                let responseType: string;\n                switch (this.authConfig.flow) {\n                    case AuthFlow.AUTHORIZATION_CODE:\n                        responseType = 'code';\n                        break;\n                    case AuthFlow.IMPLICIT:\n                        responseType = 'id_token token';\n                        break;\n                    case AuthFlow.HYBRID:\n                        responseType = 'code id_token';\n                        break;\n                    default:\n                        throw unsupportedFlowTypeError();\n                }\n                let location = `${wellKnown.endpoints.auth\n                }?response_type=${encodeURIComponent(responseType)\n                }&scope=${encodeURIComponent(this.openIDScope)\n                }&client_id=${encodeURIComponent(this.authConfig.clientID)\n                }&redirect_uri=${encodeURIComponent(this.redirectURL)}`;\n                if (this.authConfig.useNonce) {\n                    this.storage.nonce = nonce;\n                    location += `&nonce=${encodeURIComponent(nonce)}`;\n                }\n                RequestUtils.locationHref = location;\n                return true;\n            })\n        );\n    }\n\n    public checkLocationForLoginData(): Observable<boolean> {\n        return this.wellKnownService.wellKnown.pipe(\n            switchMap(() => {\n                const params = RequestUtils.getOpenIDQueryParams();\n\n                if (params.error) {\n                    return throwError({\n                        message  : `(${params.error}) ${params.errorDesc}`,\n                        status   : 500,\n                        errorType: ErrorType.AUTH\n                    });\n                }\n\n                switch (this.authConfig.flow) {\n                    case AuthFlow.HYBRID:\n                        return this.checkParametersHybridFlow(params);\n                    case AuthFlow.AUTHORIZATION_CODE:\n                        return this.checkParametersAuthCodeFlow(params);\n                    case AuthFlow.IMPLICIT:\n                        return this.checkParametersImplicitFlow(params);\n                    default:\n                        return throwError(unsupportedFlowTypeError());\n                }\n            })\n        );\n    }\n\n    private checkParametersHybridFlow(params: OpenIDQueryParams) {\n        if (!params.id_token || !params.code) {\n            return throwError({\n                message  : 'Authentication server did not sent required data.',\n                status   : 500,\n                errorType: ErrorType.AUTH\n            });\n        }\n        // Login using token first\n        return this.processToken({\n            id_token: params.id_token\n        }).pipe(\n            tap(() => {\n                // Request permanent token + refresh token\n                this.requestTokenBasedOnCode(params.code!, this.redirectURL).pipe(\n                    catchError(() => this.logout())\n                ).subscribe((tokenValid: boolean) => {\n                    if (!tokenValid) {\n                        this.logout().pipe(first()).subscribe();\n                    }\n                });\n            })\n        );\n    }\n\n    private checkParametersAuthCodeFlow(params: OpenIDQueryParams) {\n        if (!params.code) {\n            return throwError({\n                message  : 'Authentication server did not send required data.',\n                status   : 500,\n                errorType: ErrorType.AUTH\n            });\n        }\n        // Request token + refresh token\n        return this.requestTokenBasedOnCode(params.code, this.redirectURL);\n    }\n\n    private checkParametersImplicitFlow(params: OpenIDQueryParams) {\n        if (!params.id_token || !params.access_token) {\n            return throwError({\n                message  : 'Authentication server did not send required data.',\n                status   : 500,\n                errorType: ErrorType.AUTH\n            });\n        }\n        // Login using id_token and access_token. Refresh is not permited here\n        return this.processToken({\n            id_token    : params.id_token,\n            access_token: params.access_token\n        });\n    }\n\n    private requestTokenBasedOnCode(code: string, redirectURI: string): Observable<boolean> {\n        return this.wellKnownService.wellKnown.pipe(\n            switchMap((wellKnown: WellKnown) => this.http.post<AuthResponse>({\n                resourceURL: wellKnown.endpoints.token,\n                data       : HttpService.toHttpParams({\n                    code,\n                    redirect_uri : redirectURI,\n                    grant_type   : 'authorization_code',\n                    nonce        : this.authConfig.useNonce ? this.storage.nonce : null,\n                    client_id    : this.authConfig.clientID,\n                    client_secret: this.authConfig.clientSecret\n                }),\n                tokenType  : AuthTokenType.NONE,\n                endpoint   : '' // Do not use any prefix\n            })),\n            switchMap((response: AuthResponse) => this.processToken(response))\n        );\n    }\n\n    // </editor-fold>\n\n    // <editor-fold defaultstate=\"collapsed\" desc=\"Direct login\">\n\n    public directLogin(username: string, password: string): Observable<boolean> {\n        return this.wellKnownService.wellKnown.pipe(\n            switchMap((wellKnown: WellKnown) => this.http.post<AuthResponse>({\n                resourceURL: wellKnown.endpoints.token,\n                data       : HttpService.toHttpParams({\n                    username,\n                    password,\n                    grant_type   : 'password',\n                    scope        : this.openIDScope,\n                    client_id    : this.authConfig.clientID,\n                    client_secret: this.authConfig.clientSecret\n                }),\n                tokenType  : AuthTokenType.NONE,\n                endpoint   : '' // Do not use any prefix\n            })),\n            switchMap((response: AuthResponse) => this.processToken(response))\n        );\n    }\n\n    // </editor-fold>\n\n    public processToken(response: AuthResponse, syncTime = true): Observable<boolean> {\n        return this.wellKnownService.wellKnown.pipe(\n            switchMap(() => {\n                if (this.validateResponseNonce(response)) {\n                    return throwError({\n                        status   : 401,\n                        message  : 'Non-matching nonce.',\n                        errorType: ErrorType.AUTH\n                    });\n                }\n                if (AuthService.validateResponseTokenType(response)) {\n                    return throwError({\n                        status   : 401,\n                        message  : 'Invalid token type.',\n                        errorType: ErrorType.AUTH\n                    });\n                }\n\n                return this.storeTokensIfValid(response, syncTime);\n            })\n        );\n    }\n\n    private validateResponseNonce(response: AuthResponse) {\n        return this.authConfig.useNonce && response.nonce && response.nonce !== this.storage.nonce;\n    }\n\n    private static validateResponseTokenType(response: AuthResponse) {\n        return response.token_type && response.token_type.toLocaleLowerCase() !== 'bearer';\n    }\n\n    private storeTokensIfValid(response: AuthResponse, syncTime: boolean) {\n        if (response.id_token == null) {\n            return throwError({\n                status   : 401,\n                message  : 'Authentication failed. Server did not generate a token.',\n                errorType: ErrorType.AUTH\n            });\n        }\n\n        this.storage.idToken = response.id_token;\n        const chain = this.validateToken(response.id_token).pipe(\n            tap((tokenData: TokenData) => {\n                this.tokenData = tokenData;\n            })\n        );\n        if (response.access_token != null) {\n            chain.pipe(switchMap(() => this.validateToken(response.access_token!)));\n        }\n        return chain.pipe(\n            map(() => {\n                // store username and token in local storage to keep user logged in between page refreshes\n                this.storage.idToken = response.id_token;\n                this.storage.accessToken = response.access_token;\n                if (response.refresh_token) {\n                    this.storage.refreshToken = response.refresh_token;\n                }\n                if (syncTime) {\n                    // Sync our local time with the auth server time as we need to refresh tokens\n                    // at correct time point. We use token iat here as this is the\n                    // \"current server time\" - \"request duration (ignored as it is small, max. few sec.)\".\n                    this.storage.syncTime();\n                }\n                this.afterLogin();\n                return true;\n            })\n        );\n    }\n\n    private afterLogin(): void {\n        switch (this.authConfig.flow) {\n            case AuthFlow.DIRECT:\n            case AuthFlow.AUTHORIZATION_CODE:\n                this.setupAuthCheck();\n                this.setupTokenRefresh();\n                this.emitLoginStatusChange(true);\n                break;\n            case AuthFlow.HYBRID:\n                if (this.storage.accessToken) {\n                    this.setupAuthCheck();\n                    this.setupTokenRefresh();\n                }\n                this.emitLoginStatusChange(true);\n                break;\n            case AuthFlow.IMPLICIT:\n                this.setupAuthCheck();\n                this.emitLoginStatusChange(true);\n                break;\n            default:\n                throw unsupportedFlowTypeError();\n        }\n    }\n\n    public logout(): Observable<never> {\n        const logout = () => {\n            // remove user from local storage and clear http auth header\n            delete this.tokenData;\n            this.storage.clear();\n            this.disableAuthCheck();\n            this.disableTokenRefresh();\n            this.emitLoginStatusChange(false);\n            return EMPTY;\n        };\n        const idToken = this.storage.idToken;\n        if (idToken) {\n            // Send logout request first...\n            return this.wellKnownService.wellKnown.pipe(\n                switchMap((wellKnown: WellKnown) => this.http.get<void>({\n                    resourceURL: wellKnown.endpoints.logout,\n                    params     : {\n                        id_token_hint: idToken\n                    },\n                    tokenType  : AuthTokenType.NONE,\n                    endpoint   : '' // Do not use any prefix\n                })),\n                catchError(logout),\n                switchMap(logout)\n            );\n        } else {\n            return this.wellKnownService.wellKnown.pipe(\n                catchError(logout),\n                switchMap(logout)\n            );\n        }\n    }\n\n    // <editor-fold defaultstate=\"collapsed\" desc=\"Periodic Auth check\">\n\n    private setupAuthCheck() {\n        this.disableAuthCheck();\n        this.authCheckInterval = setInterval(() => this.checkAuth(), AUTH_CHECK_INTERVAL);\n    }\n\n    private disableAuthCheck() {\n        if (this.authCheckInterval != null) {\n            clearInterval(this.authCheckInterval);\n            this.authCheckInterval = null;\n        }\n    }\n\n    private checkAuth(): void {\n        this.wellKnownService.wellKnown.pipe(\n            switchMap(() => {\n                if (!this.tokenData\n                    || !this.storage.idToken\n                    || !this.storage.accessToken\n                    || this.storage.refresh_in <= 0) {\n                    return this.logout();\n                }\n                return of(true);\n            })\n        ).subscribe();\n    }\n\n    // </editor-fold>\n\n    // <editor-fold defaultstate=\"collapsed\" desc=\"Token refresh\">\n\n    private setupTokenRefresh(): void {\n        this.disableTokenRefresh();\n        this.refreshTimeout = setTimeout(() => this.refreshToken(), this.storage.refresh_in);\n    }\n\n    private disableTokenRefresh(): void {\n        if (this.refreshTimeout != null) {\n            clearTimeout(this.refreshTimeout);\n            this.refreshTimeout = null;\n        }\n    }\n\n    private tryToRefresh(): Observable<boolean> {\n        return this.wellKnownService.wellKnown.pipe(\n            switchMap((wellKnown: WellKnown) => {\n                if (!this.storage.refreshToken) {\n                    return throwError({\n                        message  : 'Could not refresh. Not logged in!',\n                        status   : 500,\n                        errorType: ErrorType.AUTH\n                    });\n                }\n                return this.http.post<AuthResponse>({\n                    resourceURL: wellKnown.endpoints.token,\n                    data       : HttpService.toHttpParams({\n                        grant_type   : 'refresh_token',\n                        client_id    : this.authConfig.clientID,\n                        client_secret: this.authConfig.clientSecret,\n                        refresh_token: this.storage.refreshToken\n                    }),\n                    tokenType  : AuthTokenType.NONE,\n                    endpoint   : '' // Do not use any prefix\n                });\n            }),\n            switchMap((response: AuthResponse) => this.processToken(response)),\n            catchError(() => of(false))\n        );\n    }\n\n    private refreshToken(): void {\n        this.tryToRefresh().pipe(\n            switchMap((refreshed: boolean) => {\n                if (!refreshed) {\n                    return this.logout();\n                }\n                return EMPTY;\n            })\n        ).subscribe();\n    }\n\n    // </editor-fold>\n\n    // <editor-fold defaultstate=\"collapsed\" desc=\"Token validation\">\n\n    private validateToken(token: string): Observable<TokenData> {\n        return this.wellKnownService.wellKnown.pipe(\n            switchMap((wellKnown: WellKnown) => {\n\n                function throwCatchedError(err: unknown) {\n                    return throwError({\n                        status   : 500,\n                        message  : err ? toString(err) : 'Error parsing token from auth response!',\n                        errorType: ErrorType.AUTH\n                    });\n                }\n\n                try {\n                    const tokenData: TokenData = JwtHelper.decodeToken(token);\n\n                    // Check expiration\n                    return AuthService.checkTokenExpiration(token).pipe(\n                        // Check nonce\n                        switchMap(() => this.checkTokenNonce(tokenData)),\n\n                        // Check issuer\n                        switchMap(() => AuthService.checkTokenIssuer(tokenData, wellKnown)),\n\n                        // Check audience\n                        switchMap(() => this.checkTokenAudience(tokenData)),\n\n                        map(() => tokenData),\n                        catchError(throwCatchedError)\n                    );\n                } catch (err) {\n                    return throwCatchedError(err);\n                }\n            }));\n    }\n\n    private static checkTokenExpiration(token: string): Observable<void> {\n        if (JwtHelper.isTokenExpired(token)) {\n            return throwError({\n                status   : 500,\n                message  : 'Invalid token expiration!',\n                errorType: ErrorType.AUTH\n            });\n        }\n        return of(undefined);\n    }\n\n    private checkTokenNonce(tokenData: TokenData): Observable<void> {\n        if (this.authConfig.useNonce) {\n            switch (this.authConfig.flow) {\n                case AuthFlow.AUTHORIZATION_CODE:\n                case AuthFlow.HYBRID:\n                case AuthFlow.IMPLICIT:\n                    if (tokenData.nonce !== this.storage.nonce) {\n                        return throwError({\n                            status   : 500,\n                            message  : 'Non-matching nonce!',\n                            errorType: ErrorType.AUTH\n                        });\n                    }\n                    break;\n                case AuthFlow.DIRECT:\n                    // No check here - nonce not supported\n                    break;\n                default:\n                    return throwError({\n                        status   : 500,\n                        message  : UNSUPPORTED_AUTH_FLOW_TYPE,\n                        errorType: ErrorType.AUTH\n                    });\n            }\n        }\n\n        return of(undefined);\n    }\n\n    private static checkTokenIssuer(tokenData: TokenData, wellKnown: WellKnown): Observable<void> {\n        if (tokenData.iss !== wellKnown.issuer) {\n            return throwError({\n                status   : 500,\n                message  : 'Invalid token issuer!',\n                errorType: ErrorType.AUTH\n            });\n        }\n\n        return of(undefined);\n    }\n\n    private checkTokenAudience(tokenData: TokenData): Observable<void> {\n        if (Array.isArray(tokenData.aud)) {\n            if (!tokenData.aud.some((aud: string) => aud === this.authConfig.clientID)\n                || tokenData.azp !== this.authConfig.clientID) {\n                return throwError({\n                    status   : 500,\n                    message  : 'Invalid token audience!',\n                    errorType: ErrorType.AUTH\n                });\n            }\n\n        } else if (tokenData.aud !== this.authConfig.clientID) {\n            return throwError({\n                status   : 500,\n                message  : 'Invalid token audience!',\n                errorType: ErrorType.AUTH\n            });\n        }\n\n        return of(undefined);\n    }\n\n    // </editor-fold>\n}\n","import {Inject, Injectable} from '@angular/core';\nimport {Router, RouterStateSnapshot} from '@angular/router';\nimport {HttpService} from '@dbg-riskit/angular-http';\nimport {defer, EMPTY, merge, Observable, of} from 'rxjs';\nimport {defaultIfEmpty, first, map, switchMap} from 'rxjs/operators';\nimport {AUTH_CONFIG, AuthConfig, AuthFlow} from './auth.config';\nimport {AuthService} from './auth.service';\nimport {AuthStorageService} from './auth.storage.service';\nimport {RequestUtils} from './request.utils';\nimport {WellKnownService} from './well.known.service';\n\n@Injectable()\nexport class AuthRoutingFlowService {\n\n    public constructor(private readonly router: Router,\n                       private readonly http: HttpService,\n                       private readonly authService: AuthService,\n                       private readonly storage: AuthStorageService,\n                       @Inject(AUTH_CONFIG) private readonly authConfig: AuthConfig,\n                       private readonly wellKnownService: WellKnownService) {\n\n        // Subscribe for login changes so we do correct navigation after logout\n        this.authService.loggedIn\n            .subscribe(\n                () => {\n                    try {\n                        merge(this.http.unauthorized.pipe(map(() => false)),\n                            this.authService.loggedInStream)\n                            .subscribe((loggedIn: boolean) => {\n                                if (!loggedIn) {\n                                    this.logout().pipe(first()).subscribe();\n                                }\n                            });\n                    } catch (ignore) {\n                        // Happens in tests only\n                    }\n                });\n    }\n\n    public get authFlow(): AuthFlow {\n        return this.authConfig.flow;\n    }\n\n    public get authorizationCodeFlow(): boolean {\n        return this.authFlow === AuthFlow.AUTHORIZATION_CODE;\n    }\n\n    public get implicitFlow(): boolean {\n        return this.authFlow === AuthFlow.IMPLICIT;\n    }\n\n    public get hybridFlow(): boolean {\n        return this.authFlow === AuthFlow.HYBRID;\n    }\n\n    public get directFlow(): boolean {\n        return this.authFlow === AuthFlow.DIRECT;\n    }\n\n    public logout(state?: RouterStateSnapshot): Observable<boolean> {\n        return this.authService.loggedIn.pipe(\n            switchMap((res: boolean) => {\n                if (res) {\n                    return this.authService.logout();\n                }\n                return EMPTY;\n            }),\n            defaultIfEmpty(0),\n            switchMap(() => {\n                this.storeRequestedPath(state);\n                return this.doLogin();\n            })\n        );\n    }\n\n    public login(username?: string, password?: string): Observable<boolean> {\n        return defer(() => {\n            switch (this.authFlow) {\n                case AuthFlow.DIRECT:\n                    if (username == null || password == null) {\n                        throw new Error('Username and password expexted!');\n                    }\n                    return this.authService.directLogin(username, password).pipe(\n                        switchMap((res: boolean) => this.loginRedirect(res))\n                    );\n                case AuthFlow.AUTHORIZATION_CODE:\n                case AuthFlow.IMPLICIT:\n                case AuthFlow.HYBRID:\n                    return this.doLogin();\n                default:\n                    throw new Error('Unsupported auth flow detected!');\n            }\n        });\n    }\n\n    public loginViaService(): Observable<boolean> {\n        return this.authService.loggedIn.pipe(\n            switchMap((res: boolean) => {\n                switch (this.authFlow) {\n                    case AuthFlow.AUTHORIZATION_CODE:\n                    case AuthFlow.IMPLICIT:\n                    case AuthFlow.HYBRID:\n                        if (res) {\n                            return this.loginRedirect(res);\n                        }\n                        if (!RequestUtils.hasOpenIDQueryParams()) {\n                            return this.doLogin().pipe(map(() => res));\n                        }\n                        return this.authService.checkLocationForLoginData().pipe(\n                            switchMap((loggedIn: boolean) => this.loginRedirect(loggedIn))\n                        );\n                    case AuthFlow.DIRECT:\n                        return of(true);\n                    default:\n                        throw new Error('Unknown auth flow detected!');\n                }\n            })\n        );\n    }\n\n    public storeRequestedPath(state: RouterStateSnapshot = this.router.routerState.snapshot): void {\n        if (state.url.startsWith(this.authConfig.loginRoute)) {\n            this.storage.authRequestedPath = null;\n        } else {\n            this.storage.authRequestedPath = state.url;\n        }\n    }\n\n    private loginRedirect(res: boolean): Observable<boolean> {\n        return this.wellKnownService.wellKnown.pipe(\n            switchMap(() => {\n                if (res) {\n                    if (this.storage.authRequestedPath) {\n                        this.router.navigateByUrl(this.storage.authRequestedPath);\n                        this.storage.authRequestedPath = null;\n                    } else {\n                        this.router.navigate([this.authConfig.afterLoginRedirectRoute]);\n                    }\n                    return of(res);\n                } else {\n                    return this.doLogin().pipe(map(() => res));\n                }\n            })\n        );\n    }\n\n    private doLogin(): Observable<boolean> {\n        switch (this.authFlow) {\n            case  AuthFlow.DIRECT:\n                return this.wellKnownService.wellKnown.pipe(\n                    map(() => {\n                        this.router.navigate([this.authConfig.loginRoute]);\n                        return true;\n                    })\n                );\n            case AuthFlow.AUTHORIZATION_CODE:\n            case AuthFlow.IMPLICIT:\n            case AuthFlow.HYBRID:\n                return this.authService.loginViaAuthService();\n            default:\n                throw new Error('Unknown auth flow detected!');\n        }\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {ActivatedRouteSnapshot, CanActivate, CanActivateChild, RouterStateSnapshot} from '@angular/router';\nimport {Observable, of} from 'rxjs';\nimport {map, switchMap} from 'rxjs/operators';\nimport {AuthRoutingFlowService} from './auth.routing.flow.service';\nimport {AuthService} from './auth.service';\n\n@Injectable()\nexport class AuthGuard implements CanActivate, CanActivateChild {\n\n    public constructor(private readonly authService: AuthService,\n                       private readonly authRoutingFlowService: AuthRoutingFlowService) {\n    }\n\n    public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {\n        return this.authService.loggedIn.pipe(\n            switchMap((res: boolean) => {\n                if (res) {\n                    return of(true);\n                }\n\n                return this.authRoutingFlowService.logout(state).pipe(\n                    map(() => false)\n                );\n            })\n        );\n    }\n\n    public canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {\n        return this.canActivate(childRoute, state);\n    }\n}\n","import {HTTP_INTERCEPTORS} from '@angular/common/http';\nimport {InjectionToken, ModuleWithProviders, NgModule, Optional, SkipSelf} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\nimport {AUTH_PROVIDER} from '@dbg-riskit/angular-common';\nimport {HttpConfig, HttpModule} from '@dbg-riskit/angular-http';\nimport {LoggingModule} from '@dbg-riskit/angular-logging';\n\nimport {AUTH_CONFIG, AuthConfig} from './auth.config';\nimport {AuthHttpInterceptor} from './auth.http.interceptor';\nimport {AuthRoutingFlowService} from './auth.routing.flow.service';\nimport {AuthGuard} from './auth.routing.guard';\nimport {AuthService} from './auth.service';\nimport {AuthStorageService} from './auth.storage.service';\nimport {WellKnownService} from './well.known.service';\n\n// AoT workaround - we have to provide it using factory to prevent compiler from replacing\n// \"window.prop\" expressions.\nexport const TMP_HTTP_CONFIG = new InjectionToken<HttpConfig>('risk.auth.tmp_http_provider');\n\n@NgModule({\n    imports  : [\n        RouterModule,\n        HttpModule,\n        LoggingModule\n    ],\n    providers: [\n        AuthStorageService,\n        AuthService,\n        AuthGuard,\n        AuthRoutingFlowService,\n        WellKnownService,\n        {\n            provide    : AUTH_PROVIDER,\n            useExisting: AuthService\n        },\n        {\n            provide : HTTP_INTERCEPTORS,\n            useClass: AuthHttpInterceptor,\n            multi   : true\n        }\n    ]\n})\nexport class AuthModule {\n\n    public constructor(@Optional() @SkipSelf() parentModule: AuthModule) {\n        if (parentModule) {\n            throw new Error(\n                'AuthModule is already loaded. Import it in the AppModule only');\n        }\n    }\n\n    // AoT workaround - we have to provide it using factory to prevent compiler from replacing\n    // \"window.prop\" expressions.\n    public static forAuthConfig(config: () => AuthConfig): ModuleWithProviders<AuthModule> {\n        return {\n            ngModule : AuthModule,\n            providers: [\n                {\n                    provide   : AUTH_CONFIG,\n                    useFactory: config\n                }\n            ]\n        };\n    }\n}\n","import {AuthConfig, AuthFlow, AuthFlowNames, AuthSpecScopes} from './auth.config';\n\ndeclare namespace window {\n    let authWellKnownEndpoint: string;\n    let authClientID: string;\n    let authClientSecret: string;\n    let authUseNonce: boolean;\n    let authScopes: AuthSpecScopes[];\n    let authFlow: AuthFlowNames;\n}\n\nexport type PartialAuthConfig = Pick<AuthConfig, Exclude<keyof AuthConfig, 'loginRoute' | 'afterLoginRedirectRoute'>>;\n\nexport function readAuthConfig(): PartialAuthConfig {\n    return {\n        wellKnown   : window.authWellKnownEndpoint,\n        clientID    : window.authClientID,\n        clientSecret: window.authClientSecret,\n        flow        : AuthFlow.byType(window.authFlow),\n        scope       : window.authScopes,\n        useNonce    : window.authUseNonce == null ? true : window.authUseNonce\n    };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.AuthStorageService","i1.WellKnownService","i3.AuthStorageService","i5.WellKnownService","i1.AuthService","i2.AuthRoutingFlowService"],"mappings":"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"}