/** @file * @author Edouard DUPIN * @copyright 2018, Edouard DUPIN, all right reserved * @license PROPRIETARY (see license file) */ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { Location } from '@angular/common'; import { SessionService } from 'common/service'; import { createLoginState, createPasswordState, getLoginType, isNullOrUndefined } from 'common/utils'; import { AdminUserService, ApplicationService } from 'app/service'; import { SpecificTokenResponse } from 'app/service/application'; @Component({ selector: 'app-sign-in', templateUrl: './sign-in.html', styleUrls: ['./sign-in.less'], }) export class SignInScene implements OnInit { public loginState: boolean|string = false; public login: string = ''; public passwordState: boolean|string = false; public password: string = ''; public loginButtonDisabled: boolean = true; public error: string = ''; public loginType: string = 'Username/E-mail'; public rememberMe: boolean = true; public loginButtonIsClicked: boolean = false; private ssoApplicationId: string | undefined; private ssoReturnData: string | undefined; private ssoApplicationReturnUrl: string | undefined; public ssoReady: boolean = true; constructor( private router: Router, private route: ActivatedRoute, private locate: Location, private sessionService: SessionService, private applicationService: ApplicationService, private adminUserService: AdminUserService ) {} ngOnInit() { const ssoApplicationId = this.route.snapshot.paramMap.get('applicationId'); if (isNullOrUndefined(ssoApplicationId)) { this.ssoApplicationId = undefined; } else { this.ssoApplicationId = ssoApplicationId; } const ssoReturnData = this.route.snapshot.paramMap.get('dataReturn'); if (isNullOrUndefined(ssoReturnData)) { this.ssoReturnData = undefined; } else { this.ssoReturnData = ssoReturnData; } // TODO: check auto-reconnection !!! let self = this; if (this.sessionService.islogged() == true && self.loginButtonIsClicked === false) { // in theory it is the inly one case possible, the system loading page after retreiving session .... if (!isNullOrUndefined(self.ssoApplicationId)) { // detect an auto-relog... self.transferToApplicationThatRequiredTheSSO(); } } else { this.sessionService.change.subscribe(isConnected => { console.log( `receive event from session ...${isConnected} , ssoApplicationI=${self.ssoApplicationId}, loginButtonIsClicked=${self.loginButtonIsClicked}` ); if (isConnected === true && self.loginButtonIsClicked === false) { if (!isNullOrUndefined(self.ssoApplicationId)) { // detect an auto-relog... self.transferToApplicationThatRequiredTheSSO(); } } }); } } updateButtonVisibility(): void { if (this.loginState === true && this.passwordState === true) { this.loginButtonDisabled = false; } else { this.loginButtonDisabled = true; } this.error = ''; } checkRememberMe(newValue: boolean): void { this.rememberMe = newValue; this.updateButtonVisibility(); } /** * Check the login writing rules */ checkLogin(newValue: string): void { this.login = newValue; this.loginState = createLoginState(this.login); this.loginType = getLoginType(this.login); this.updateButtonVisibility(); } /** * Check the password writing rules */ checkPassword(newValue: string): void { this.password = newValue; this.passwordState = createPasswordState(this.password); this.updateButtonVisibility(); } onLogin(): void { this.loginButtonIsClicked = true; let self = this; this.adminUserService .login(this.login, this.password, this.rememberMe) .then(() => { // go to the home page //console.log(`Request Sign-in for other application ... ==> ${self.ssoApplicationId}`); if (!isNullOrUndefined(self.ssoApplicationId)) { self.transferToApplicationThatRequiredTheSSO(); } else { self.router.navigate(['home']); } }) .catch((error: any) => { self.error = `Wrong e-mail/login or password: ${error}`; }); } private transferToApplicationThatRequiredTheSSO(): void { let self = this; this.applicationService .getApplicationSpecificToken(this.ssoApplicationId) .then((result: SpecificTokenResponse) => { self.transferToApplicationThatRequiredTheSSO2(result.url, result.jwt); }) .catch((error: any) => { self.error = `Can not retreive the application interface`; }); } private transferToApplicationThatRequiredTheSSO2(url: string, token: string): void { if (url.slice(-1) === '/') { url = url.slice(0, -1); } if (isNullOrUndefined(this.ssoReturnData)) { this.ssoApplicationReturnUrl = `${url}/aG9tZQ/${this.rememberMe}/`; } else { this.ssoApplicationReturnUrl = `${url}/${this.ssoReturnData}/${this.rememberMe}/`; } //console.log(`generate in new URL: ${this.ssoApplicationReturnUrl + token}`); //this.router.navigate([ this.ssoApplicationReturnUrl+"aBeautifullToken" ], { replaceUrl: true }); window.location.href = this.ssoApplicationReturnUrl + token; } onCancel(): void { //console.log(`onCancel ... '${ this.login }':'${ this.password }'`); // go to the home page if (this.ssoApplicationId !== undefined) { //this.ssoApplicationReturnUrl = this.generateBaseSSOReturn(this.ssoApplicationId, this.rememberMe); //window.location.href = this.ssoApplicationReturnUrl + "__CANCEL__"; // we can not do it anymore ==> need to be logged to know the remotre adresses !!! Otherwise it is a "security fail" this.router.navigate(['home']); } else { this.locate.back(); } } }