From 0b4a7090ae2990edd471c7adc6604344c0d2948c Mon Sep 17 00:00:00 2001 From: Ashwaq Hasan Jaafar Date: Wed, 20 Nov 2019 16:34:22 +0300 Subject: [PATCH] fix `Finger/FaceID login --- .../confirm-login/confirm-login.component.ts | 456 +++++++++++++++++- .../authentication/sms-page/sms-page.page.ts | 244 +++++++++- 2 files changed, 673 insertions(+), 27 deletions(-) diff --git a/Mohem/src/app/authentication/confirm-login/confirm-login.component.ts b/Mohem/src/app/authentication/confirm-login/confirm-login.component.ts index 3eb241b9..9e697fd4 100644 --- a/Mohem/src/app/authentication/confirm-login/confirm-login.component.ts +++ b/Mohem/src/app/authentication/confirm-login/confirm-login.component.ts @@ -1,379 +1,789 @@ import { Component, OnInit } from '@angular/core'; + import {ButtonSettings} from "src/app/hmg-common/ui/button/models/button-settingsl"; + import {TranslatorService} from "src/app/hmg-common/services/translator/translator.service"; + import { CommonService } from 'src/app/hmg-common/services/common/common.service'; + import { LoginRequest } from 'src/app/hmg-common/services/authentication/models/login.request'; + import { AuthenticationService } from 'src/app/hmg-common/services/authentication/authentication.service'; + import { SharedDataService } from 'src/app/hmg-common/services/shared-data-service/shared-data.service'; + import { SendActivationByType } from '../models/sendActivationByType'; + import { FingerprintAIO } from '@ionic-native/fingerprint-aio/ngx'; + import { GetLoginInfoRequest } from "../../hmg-common/services/authentication/models/get-login-info.request"; + import { GetLoginInfoResponse } from "../../hmg-common/services/authentication/models/get-login-info.response"; + import { SMSCheckRequest } from "src/app/hmg-common/services/authentication/models/smscheck.request"; + import { SMSCheckResponse } from "src/app/hmg-common/services/authentication/models/smscheck.response"; + import { PushService } from 'src/app/hmg-common/services/push/push.service'; +import { Platform } from '@ionic/angular'; + + + + @Component({ + selector: 'app-confirm-login', + templateUrl: './confirm-login.component.html', + styleUrls: ['./confirm-login.component.scss'], + }) + export class ConfirmLoginComponent implements OnInit { + public logo = "assets/imgs/CS.png"; + public buttons:any=[]; + isFaceorFinger: any; + onlySMSBox: any = true; + loginData:any; + selectedOption: any; + lastLogin: any; + loginTokenID:any + deviceToken:any; + + constructor( + public ts: TranslatorService, + public cs: CommonService, + public authService: AuthenticationService, + public sharedData: SharedDataService, + private faio: FingerprintAIO, + public pushService: PushService, + public platform: Platform, + + + + + + ) { + this.loginData= this.sharedData.getSharedData(AuthenticationService.LOGIN_DATA, false); + console.log(this.loginData); + this.deviceToken= this.cs.sharedService.getSharedData(AuthenticationService.DEVICE_TOKEN, false); + console.log("deviceToken :"+this.deviceToken); + //if device token undefind + if(this.deviceToken == undefined){ + this.deviceToken = localStorage.getItem("deviceToken"); + + } + this.lastLogin = this.cs.sharedService.getSharedData(AuthenticationService.LAST_LOGIN, false); + + } + + ngOnInit() { + //**checkIfAvailable FAIO **// + this.checkIfAvailable(); + //**getSharedData of IMEI_USER_DATA and REGISTER_DATA_FOR_LOGIIN to set defult value **// + + // this.setDefault(); + + + this.button(); + } + + checkIfAvailable() { + this.faio.isAvailable().then( + options => { + this.isFaceorFinger = options; - if (this.isFaceorFinger === 'finger' && this.lastLogin === 1) { - this.selectedOption = 2; - this.cs.presentConfirmDialog( - this.ts.trPK("login", "biometric-support"), - () => { - this.presentBiometricDialog(); - this.cs.sharedService.setSharedData( - this.selectedOption, - AuthenticationService.LAST_LOGIN - ); - }, - () => { } - ); - } + + // && this.lastLogin === 1 + + // if (this.isFaceorFinger === 'finger' || this.isFaceorFinger === 'biometric') { + + // this.selectedOption = 2; + + // this.cs.presentConfirmDialog( + + // this.ts.trPK("login", "biometric-support"), + + // () => { + + // this.presentBiometricDialog(); + + // this.cs.sharedService.setSharedData( + + // this.selectedOption, + + // AuthenticationService.LAST_LOGIN + + // ); + + // }, + + // () => { } + + // ); + + // } + this.button(); + }, + () => { + this.isFaceorFinger = null; + this.button(); + } + ); + } + + button() { + console.log("button"); + + this.buttons = [ + [{ + title: "login,verify-with-fingerprint", + url: null, + icon: "assets/icon/login/102.png", + settings: new ButtonSettings(true, true, true, true), + value: 2, - disabled: this.isFaceorFinger === "finger" ? false : true, + + disabled: this.isFaceorFinger === "finger" || this.isFaceorFinger === "biometric" ? false : true, + visible: this.onlySMSBox + }, + { + title: "login,verify-with-faceid", + url: null, + icon: "assets/icon/login/101.png", + settings: new ButtonSettings(true, true, true, true), + value: 3, - disabled: this.isFaceorFinger === "face" ? false : true, + + disabled: this.isFaceorFinger === "face" ? false : true, + visible: this.onlySMSBox + }, + { + title: "login,verify-with-whatsapp", + url: null, + icon: "assets/icon/login/104.png", + settings: new ButtonSettings(true, true, true, true), + value: 4, + visible: true + }, + { + title: "login,verify-with-sms", + url: null, + icon: "assets/icon/login/103.png", + settings: new ButtonSettings(true, true, true, true), + value: 1, + visible: true + } + ] + ]; + } + + confirm(el: any) { + console.log("confirm:"+ el ); + this.selectedOption = this.selectedOption && !this.onlySMSBox ? this.selectedOption : el.value; + switch (el.value) { + case 1: + console.log(el.value); + this.loginWithSMS(el); + break; + case 2: + console.log(el.value); + + this.loginWithFingurePrint(el); + break; + case 3: + console.log(el.value); + + this.faceReconization(el); + break; + case 4: + console.log(el.value); + + this.loginWithWhatsapp(el); + break; + default: + break; + } + this.cs.sharedService.setSharedData( + this.selectedOption, + AuthenticationService.LAST_LOGIN + ); + } + + loginWithSMS(el) { + console.log("loginWithSMS: "+ el); + + if (!el.disabled) { + + // if (this.user && !this.registerd_data) { + //calling because i dont have token id which required to the send activation code + /// this.checkUserAuthentication(1); + // this.checkUserAuthentication(); *** + + // } else { + if (this.loginData.LogInTokenID) { + this.sendActivationCode(1); + } else { + // this.checkUserAuthentication(1); + // this.checkUserAuthentication();** + + } + // } + } + } + + loginWithWhatsapp(el) { + if (!el.disabled) { + // if (this.user && !this.registerd_data) { + //calling because i dont have token id which required to the send activation code + // this.checkUserAuthentication(2); + // } else { + if (this.loginData.LogInTokenID) { + this.sendActivationCode(2); + } else { + // this.checkUserAuthentication(2); + } + // } + } + } + + public sendActivationCode(type: number) { + let request = new SendActivationByType(); + this.authService.setPublicFields(request); + request.OTP_SendType = type; + request.MobileNumber = this.loginData.MobileNumber; + request.IsMobileFingerPrint =0; + request.P_USER_NAME=this.loginData.P_USER_NAME; + request.LogInTokenID =this.loginData.LogInTokenID; + request.P_LEGISLATION_CODE ="SA"; + // request.VersionID ="2.0"; + + + + // request.LanguageID = imeiData && imeiData.PreferredLanguage || request.LanguageID; + this.authService + .sendActivationCodeByType( + request, + () => { }, + this.ts.trPK("general", "ok") + ) + .subscribe((result: any) => { + if (result.isSMSSent) { + this.cs.sharedService.setSharedData({ + MobileNumber: this.loginData.mobileNumber, + loginType: this.selectedOption + }, + SMSCheckRequest.SHARED_DATA + ); + + this.cs.openSMSPage(); + } + }); + } + + loginWithFingurePrint(el: any) { + if (!el.disabled) { + this.startBiometricLoginIfAvailable(); + } + } + faceReconization(el: any) { + if (!el.disabled) { + this.startBiometricLoginIfAvailable(); + } + } + + private startBiometricLoginIfAvailable() { + // this.setting.isBiometricsEnabled().then(result => { + // console.log(result); + this.faio.isAvailable().then( + options => { + // if biometric supported + //if (result) { + // ask if login with face or finger + this.presentBiometricDialog(); + // } else { + // //ask to enable biometric + // this.getPermissionToActivateBiometric(); + // } + }, + () => { + alert("not avaliable ") + // if biometric not supported do nothing unless + // user session time out from last login + // if (AuthenticationService.isRequireRelogin()) { + // this.initializeInputsFromSessionTimeOut(user); + // } + // this.hideSplashScreen(true); + } + ); + //}); + } + + private presentBiometricDialog() { + this.faio + .show({ - clientId: "Fingerprint Authetnciation", - clientSecret: "Ate343_9347lajF", // Only necessary for Android - disableBackup: true, // Only for Android(optional) - localizedFallbackTitle: this.ts.trPK("general", "use-pin"), // Only for iOS - localizedReason: this.ts.trPK("general", "auth-please") // Only for iOS + + + + + + title: 'Biometric Authetnciation', // (Android Only) | optional | Default: " Biometric Sign On" + + // subtitle: 'Coolest Plugin ever' ,// (Android Only) | optional | Default: null + + // description: this.ts.trPK("general", "auth-please"),// optional | Default: null + + fallbackButtonTitle: this.ts.trPK("general", "use-pin"), // optional | When disableBackup is false defaults to "Use Pin". + + // When disableBackup is true defaults to "Cancel" + + disableBackup:true, // optional | default: false + + + + + + // clientId: "Fingerprint Authetnciation", + + // clientSecret: "Ate343_9347lajF", // Only necessary for Android + + // disableBackup: true, // Only for Android(optional) + + // localizedFallbackTitle: this.ts.trPK("general", "use-pin"), // Only for iOS + + // localizedReason: this.ts.trPK("general", "auth-please") // Only for iOS + }) + .then((result: any) => { + console.log("1"); + // this.deviceToken= this.cs.sharedService.getSharedData(AuthenticationService.DEVICE_TOKEN, false); + let request = new GetLoginInfoRequest(); + this.authService.setPublicFields(request); + request.MobileNumber = this.loginData.MobileNumber; + request.P_USER_NAME=this.loginData.P_USER_NAME; + request.UserName=this.loginData.P_USER_NAME; + request.LogInTokenID =this.loginData.LogInTokenID; + request.CompanyID =1;//cs=1 , HMG=2 + request.DeviceType= this.cs.getDeviceType(); + request.DeviceToken=this.deviceToken; + + this.getMobileInfo(request); + }) + .catch((error: any) => { + console.log(error); + }); + } + + private getMobileInfo(request: GetLoginInfoRequest) { + console.log("2"); + + this.authService.getLoginInfo(request,() => { },this.ts.trPK("general", "ok")).subscribe((result: GetLoginInfoResponse) => { + console.log("authService.getLoginInfo"); + if(result.Mohemm_GetPatientID_List.length > 0){ + if ( result.Mohemm_GetPatientID_List[0].LoginType == 2 || result.Mohemm_GetPatientID_List[0].LoginType == 3) { + this.loginTokenID = result.LogInTokenID; + this.checkSMS(); + } else { + + this.onlySMSBox = false; + this.button(); + } + }else { + this.onlySMSBox = false; + this.button(); + + } + }); + } + + public checkSMS() { + const data = this.sharedData.getSharedData(AuthenticationService.LOGIN_DATA, false); + const request = new SMSCheckRequest(); + + request.LogInTokenID = data.LogInTokenID; + request.activationCode = ""; + request.P_USER_NAME = data.P_USER_NAME; + request.MobileNumber = data.MobileNumber; + + this.authService + .checkSMS(request, () => {}, this.ts.trPK("general", "ok")) + .subscribe((result: SMSCheckResponse) => { + console.log(result); + if (this.cs.validResponse(result)) { + AuthenticationService.servicePrivilage=result.Privilege_List; + this.authService.setAuthenticatedUser(result).subscribe(() => { - this.insertMobileLogin(); + + if (this.platform.is("mobile")) { + + this.insertMobileLogin(); + + } + this.cs.openHome(); + }); + } + }); + } + + + public insertMobileLogin(){ + let request = new GetLoginInfoRequest(); + this.authService.setPublicFields(request); + request.MobileNumber = this.loginData.MobileNumber; + request.P_USER_NAME=this.loginData.P_USER_NAME; + request.UserName=this.loginData.P_USER_NAME; + request.LogInTokenID =this.loginData.LogInTokenID; + request.CompanyID =1;//CompanyID + request.DeviceType= this.cs.getDeviceType(); + request.DeviceToken=this.deviceToken; + //request.TokenID= + request.LoginType=this.selectedOption; + + this.authService + .insertMobileLoginInfo( + request, + () => { }, + this.ts.trPK("general", "ok") + ) + .subscribe((result: any) => { + console.log(result); + + console.log("succssful insertMobileLoginInfo" ); + }); + + } -} \ No newline at end of file + + +}​ \ No newline at end of file diff --git a/Mohem/src/app/authentication/sms-page/sms-page.page.ts b/Mohem/src/app/authentication/sms-page/sms-page.page.ts index f2dd4a85..2172f349 100644 --- a/Mohem/src/app/authentication/sms-page/sms-page.page.ts +++ b/Mohem/src/app/authentication/sms-page/sms-page.page.ts @@ -1,226 +1,462 @@ + import { Component, OnInit } from "@angular/core"; + import { ElementRef } from "@angular/core"; -import { NavController } from "@ionic/angular"; + +import { NavController, Platform } from "@ionic/angular"; + import { TranslatorService } from "src/app/hmg-common/services/translator/translator.service"; + import { CommonService } from "src/app/hmg-common/services/common/common.service"; + import { SharedDataService } from "src/app/hmg-common/services/shared-data-service/shared-data.service"; + import { SMSCheckRequest } from "src/app/hmg-common/services/authentication/models/smscheck.request"; + import { LoginModel } from "../models/LoginModel"; + import { AuthenticationService } from "src/app/hmg-common/services/authentication/authentication.service"; + import { SMSCheckResponse } from "src/app/hmg-common/services/authentication/models/smscheck.response"; + import { Password } from "../models/password"; + import { GetLoginInfoRequest } from 'src/app/hmg-common/services/authentication/models/get-login-info.request'; + + @Component({ + selector: "app-sms-page", + templateUrl: "./sms-page.page.html", + styleUrls: ["./sms-page.page.scss"] + }) + export class SmsPageComponent implements OnInit { + public static LOGIN_DATA = "LOGIN_DATA"; + Channel: number = 0; + activationCode: string; + P_SESSION_ID: number; + P_USER_NAME: string; + timeInSeconds: any; + time: any; + runTimer: any; + hasStarted: any; + hasFinished: any; + remainingTime: any; + displayTime: any; + loginTokenID: string; + public isForgetPwd: boolean = false; + public isExpiredPwd: boolean = false; + public count: number = 0; + private loginData = new LoginModel(); + public deviceToken:any; + public loginTypeData:any; + constructor( + public navCtrl: NavController, + public translate: TranslatorService, + public common: CommonService, + private elementRef: ElementRef, + public authService: AuthenticationService, - public sharedData: SharedDataService + + public sharedData: SharedDataService, + + public platform: Platform, + + + ) {} + + ngOnInit() { + this.count = 0; + this.initTimer(); + this.startTimer(); + this.isForgetPwd = + this.sharedData.getSharedData(Password.IS_FORGET_PSW) || false; + this.isExpiredPwd = + this.sharedData.getSharedData(Password.IS_EXPIRED_PSW) || false; + this.loginData= this.sharedData.getSharedData(AuthenticationService.LOGIN_DATA, false); + console.log("loginData : "+ this.loginData); + this.deviceToken= this.common.sharedService.getSharedData(AuthenticationService.DEVICE_TOKEN, false); + if(this.deviceToken == undefined){ + this.deviceToken = localStorage.getItem("deviceToken"); + + } + console.log("deviceToken :"+this.deviceToken); + this.loginTypeData= this.common.sharedService.getSharedData(SMSCheckRequest.SHARED_DATA, false); + console.log("loginType :"+this.loginTypeData.loginType); + + + } + + initTimer() { + // Pomodoro is usually for 25 minutes + if (!this.timeInSeconds) { + this.timeInSeconds = 600; + } + + this.time = this.timeInSeconds; + this.runTimer = false; + this.hasStarted = false; + this.hasFinished = false; + this.remainingTime = this.timeInSeconds; + + this.displayTime = this.common.getSecondsAsDigitalClock(this.remainingTime); + } + + startTimer() { + this.runTimer = true; + this.hasStarted = true; + this.timerTick(); + } + + pauseTimer() { + this.runTimer = false; + } + + resumeTimer() { + this.startTimer(); + } + + timerTick() { + setTimeout(() => { + if (!this.runTimer) { + return; + } + this.remainingTime--; + this.displayTime = this.common.getSecondsAsDigitalClock( + this.remainingTime + ); + if (this.remainingTime > 0) { + this.timerTick(); + } else { + this.hasFinished = true; + this.pauseTimer(); + this.navCtrl.pop(); + } + }, 1000); + } + + ionViewWillLeave() { + this.pauseTimer(); + } + + checkOTPLength(){ + console.log(this.activationCode.length); + if(this.activationCode.length==4){ + this.checkVerificationCode(); + } + } + checkVerificationCode() { + if (this.count < 3) { + if ( + this.activationCode == undefined || + this.activationCode == null || + this.activationCode == "" + ) { + // this.common.showAlert(this.translate.translate('verificationcode.emptyCode')); + } else { + this.count = this.count + 1; + if (this.isForgetPwd || this.isExpiredPwd) { + this.checkForgetPwdSMS(); + } else { + this.checkSMS(); + } + } + } else { + let msg: string = this.translate.trPK("general", "noOfTriesLogin"); + this.common.JustAlertDialog(this.translate.trPK("general", "ok"), msg); + } + } + + public checkSMS() { + // alert("checkSMS in page") + const data = this.sharedData.getSharedData(AuthenticationService.LOGIN_DATA, false); + const request = new SMSCheckRequest(); + + request.LogInTokenID = data.LogInTokenID; + request.activationCode = this.activationCode; + request.P_USER_NAME = data.P_USER_NAME; + request.MobileNumber = data.MobileNumber; + + this.authService + .checkSMS(request, () => {}, this.translate.trPK("general", "ok")) + .subscribe((result: SMSCheckResponse) => { + console.log(result); + if (this.common.validResponse(result)) { + AuthenticationService.servicePrivilage=result.Privilege_List; + this.authService.setAuthenticatedUser(result).subscribe(() => { + //call insert Mobile Login - this.insertMobileLogin(); + + + + if (this.platform.is("mobile")) { + + this.insertMobileLogin(); + + } + this.common.openHome(); + + }); + } + }); + } + + public insertMobileLogin(){ + // alert("insertMobileLogin"); + let request = new GetLoginInfoRequest(); + this.authService.setPublicFields(request); + request.MobileNumber = this.loginData.MobileNumber; + request.P_USER_NAME=this.loginData.P_USER_NAME; + request.UserName=this.loginData.P_USER_NAME; + request.LogInTokenID =this.loginData.LogInTokenID; + request.CompanyID =1;//CompanyID + request.DeviceType= this.common.getDeviceType(); + request.DeviceToken=this.deviceToken; + request.LoginType=this.loginTypeData.loginType; + this.authService + .insertMobileLoginInfo( + request, + () => { }, + this.translate.trPK("general", "ok") + ) + .subscribe((result: any) => { + + console.log("successful insertMobileLogin" ); + }); + } + + public checkForgetPwdSMS() { + const data = this.sharedData.getSharedData(AuthenticationService.LOGIN_DATA, false); + const request = new SMSCheckRequest(); + + request.LogInTokenID = data.LogInTokenID; + request.activationCode = this.activationCode; + request.P_USER_NAME = data.P_USER_NAME; + console.log(data.LogInTokenID); + console.log(data.P_USER_NAME); + + this.authService + .checkForgetSMS(request, () => {}, this.translate.trPK("general", "ok")) + .subscribe((result: SMSCheckResponse) => { + console.log(result); + if (this.common.validResponse(result)) { + console.log(result); + if (this.isForgetPwd) { + this.common.openForgotPassword(); + } + if(this.isExpiredPwd) { + this.sharedData.setSharedData(true,Password.IS_EXPIRED_PSW); + this.common.openChangePassword(); + } + } + }); + } -} + +} \ No newline at end of file