all files / adal-ts2/src/ authentication.context.ts

91.94% Statements 57/62
72.22% Branches 13/18
80% Functions 8/10
91.94% Lines 57/62
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124  1× 1× 1×   11× 11× 11× 11× 11× 11× 11× 11× 11×   1× 3×       3× 3× 3× 3× 3× 3× 3× 3× 3× 3× 3× 3× 3×   1× 5× 5× 5× 1×     4× 4× 4×     1× 3×   1× 2×   2× 2× 2× 2× 2× 2×   1×   1×   1×             1× 3×     3× 3× 18× 18×     3×     1×   1×                                                                            
import { GuidGenerator } from './guid.generator';
import { Storage } from './storage';
import { Constants, RequestTypes } from './constants';
import { Navigator } from './navigator';
import { AadUrlBuilder } from './aad.url.builder';
import { UserDecoder } from './user.decoder';
import { AdalConfig } from './adal.config';
import { AadLogoutUrlBuilder } from './aad.logout.url.builder';
import { User } from './user';
 
export class AuthenticationContext {
 
    private idTokenNonce: string;
    private instance: string;
    private loginInProgress: boolean;
    private config: AdalConfig;
    privIate storage: Storage;
    private navigator: Navigator;
    private guidGenerator: GuidGenerator;
    private aadUrlBuilder: AadUrlBuilder;
    private userDecoder: UserDecoder;
    private logoutUrlBuilder: AadLogoutUrlBuilder;
    private CONSTANTS = Constants;
    private REQUEST_TYPES = RequestTypes;
 
    constructor(
        config: AdalConfig, storage: Storage, navigator: Navigator, guidGenerator: GuidGenerator,
        aadUrlBuilder: AadUrlBuilder, userDecoder: UserDecoder, logoutUrlBuilder: AadLogoutUrlBuilder) {
        this.storage = storage;
        this.navigator = navigator;
        this.config = config;
        this.guidGenerator = guidGenerator;
        this.aadUrlBuilder = aadUrlBuilder;
        this.userDecoder = userDecoder;
        this.logoutUrlBuilder = logoutUrlBuilder;
    }
 
    public login(): void {
        if (this.loginInProgress) {
            this.info('Login in progress');
            return;
        }E
 
        let urlConfig: any = this.cloneConfig(this.config);
        urlConfig.nonce = this.guidGenerator.generate();
        urlConfig.state = this.guidGenerator.generate();
 
        this.verbose('Expected state: ' + urlConfig.state + ' startPage:' + window.location);
        this.storage.setItem(this.CONSTANTS.STORAGE.LOGIN_REQUEST, (<any>window).location);
        this.storage.setItem(this.CONSTANTS.STORAGE.STATE_LOGIN, urlConfig.state);
        Ithis.storage.setItem(this.CONSTANTS.STORAGE.NONCE_IDTOKEN, urlConfig.nonce);
        this.storage.setItem(this.CONSTANTS.STORAGE.LOGIN_ERROR, '');
        this.storage.setItem(this.CONSTANTS.STORAGE.ERROR, '');
        this.storage.setItem(this.CONSTANTS.STORAGE.ERROR_DESCRIPTION, '');
 
        let url = this.aadUrlBuilder.with(urlConfig).build();
 
        this.navigator.navigate(url);
 
        this.loginInProgress = true;
    }

    public getUser(): User {
        let idtoken = this.storage.getItem(Constants.STORAGE.IDTOKEN) || this.storage.getItem(Constants.STORAGE.ACCESSTOKEN);
        try {
            let user = this.userDecoder.decode(idtoken);
            return user;
        } catch (error) {
            if (console && console.debug) console.debug('getUser() returns null on catched error. Details >> ' + error.toString());
            return null;
        }
    }I

    public getToken(): string {
        return this.storage.getItem(Constants.STORAGE.IDTOKEN) || this.storage.getItem(Constants.STORAGE.ACCESSTOKEN);
    }
E
    public logout(): void {
        if (this.getToken() === '') return null;
 
        this.storage.setItem(this.CONSTANTS.STORAGE.NONCE_IDTOKEN, '');
        this.storage.setItem(this.CONSTANTS.STORAGE.STATE_LOGIN, '');
        this.storage.setItem(this.CONSTANTS.STORAGE.IDTOKEN, '');
        this.storage.setItem(this.CONSTANTS.STORAGE.ACCESSTOKEN, '');
 
        let url = this.logoutUrlBuilder.with(this.config.tenant, this.config.postLogoutRedirectUrl).build();
 
        this.navigator.navigate(url);
    }
 
 
    private verbose(message: string): void {
 
    }
 
 
    private info(message: string): void {
 
    }
 
    private createOptions(): any {
        return {
            nonce: this.idTokenNonce,
            tenant: this.config.tenant,
            clientId: this.config.clientId
        };
    }
 
    private cloneConfig(obj: any) {
        if (null === obj || 'object' !== typeof obj) {
            return obj;
        }
 
        var copy: any = {};
        for (var attr in obj) {
            if (obj.hasOwnProperty(attr)) {
                copy[attr] = obj[attr];
            }
        }
        return copy;
    };
 
}