import {CryptoService, HttpService, LocalData, LocalDataService} from "@haventec/common-js/ts"; export class AuthService { private username: string; private accessToken: string; private basePath: string; private userActivateUrl = '/authentication/activate/user'; private loginUrl = '/authentication/login'; private logoutUrl = '/authentication/logout'; private forgotpinUrl = 'NotUsed'; private reprovisionUrl = 'NotUsed'; private tenantCreateUrl = 'NotUsed'; private createOrganisationUrl = '/organisation'; private http: HttpService; constructor( public domainUrl: string, private localDataService: LocalDataService ) { this.http = new HttpService(); this.basePath = domainUrl; } getRandomSalt(username: string) : any { let self : any = this; return new Promise((resolve, reject) => { let salt = this.localDataService.getLocalData(username).saltBits; if (salt) { resolve(salt); } else { let saltBits = CryptoService.random(); this.localDataService.setSaltBits(username, JSON.stringify(saltBits)); resolve(JSON.stringify(saltBits)); } }); } getLocalDataService() { return this.localDataService; } getAccessToken() { if ( !this.accessToken ) { this.username = this.getUsername(); this.accessToken = this.localDataService.getLocalData(this.username).accessToken; } return this.accessToken; } setAccessToken(t) { this.accessToken = t; let localData : LocalData = this.localDataService.getLocalData(this.username); localData.accessToken = t; this.localDataService.setLocalData(this.username, localData); } getUsername() { if ( !this.username ) { this.username = this.localDataService.getUsername(); } return this.username; } accessTokenIsValid() { let accessToken = this.getAccessToken(); if ( accessToken ) { return true; } else { return false; } } login(username: string, pin: string) { let self : any = this; let localData : LocalData = self.localDataService.getLocalData(username); return new Promise((resolve, reject) => { self.loginMain(username, pin, localData.deviceUuid, localData.authKey).then(function (response) { self.localDataService.setUsername(username); let localData : LocalData = self.localDataService.getLocalData(username); localData.authKey = response['authKey']; if (response && response['deviceUuid']) { localData.deviceUuid = response['deviceUuid']; } if ( response && response['accessToken'] ) { localData.accessToken = response['accessToken']['token']; } localData.dataTime = new Date(); self.localDataService.setLocalData(username, localData); resolve(response); }).catch(function (error) { reject(error); }); }); } activate(username: string, pin: string, deviceName: string, activationToken: string) { let self : any = this; return new Promise((resolve, reject) => { self.activateMain(username, pin, deviceName, activationToken).then(function (response) { self.localDataService.setUsername(username); let localData : LocalData = self.localDataService.getLocalData(username); localData.authKey = response['authKey']; localData.deviceUuid = response['deviceUuid']; if ( response && response['accessToken'] ) { localData.accessToken = response['accessToken']['token']; } localData.dataTime = new Date(); self.localDataService.setLocalData(username, localData); resolve(response); }).catch(function (error) { reject(error); }); }); } forgotpin(username: string, pin: string) { let self : any = this; let localData : LocalData = self.localDataService.getLocalData(username); return new Promise((resolve, reject) => { self.forgotpinMain(username, localData.applicationUuid, localData.deviceUuid, localData.authKey).then(function (response) { resolve(response); }).catch(function (error) { reject(error); }); }); } logout() { let self : any = this; let username = self.localDataService.getUsername(); let localData : LocalData = self.localDataService.getLocalData(username); return new Promise((resolve, reject) => { self.logoutMain(username, localData.deviceUuid).then(function (response) { if ( localData ) { localData.accessToken = undefined; self.localDataService.setLocalData(username, localData); } resolve(response); }).catch(function (error) { reject(error); }); }); } reprovision(username: string, pin: string, requestId: string, activationToken: string) { let self : any = this; let localData : LocalData = self.localDataService.getLocalData(username); return new Promise((resolve, reject) => { self.reprovisionMain(requestId, activationToken, username, pin, localData.applicationUuid, localData.deviceUuid, localData.authKey).then(function (response) { self.localDataService.setUsername(username); let localData : LocalData = self.localDataService.getLocalData(username); localData.connectorUuid = response['connectorUuid']; localData.deviceUuid = response['deviceUuid']; localData.authKey = response['authKey']; if ( response && response['accessToken'] ) { localData.accessToken = response['accessToken']['token']; } localData.dataTime = new Date(); self.localDataService.setLocalData(username, localData); resolve(response); }).catch(function (error) { reject(error); }); }); } tenantCreate(tenantName: string, username: string, email: string, pin: string) { let self : any = this; let localData : LocalData = self.localDataService.getLocalData(username); return new Promise((resolve, reject) => { self.tenantCreateMain(tenantName, username, email, pin).then(function (response) { self.localDataService.setUsername(username); let localData : LocalData = self.localDataService.getLocalData(username); localData.applicationUuid = response['applicationUuid']; localData.connectorUuid = response['connectorUuid']; localData.connectorName = tenantName; localData.deviceUuid = response['deviceUuid']; localData.authKey = response['authKey']; if ( response && response['accessToken'] ) { localData.accessToken = response['accessToken']['token']; } localData.dataTime = new Date(); self.localDataService.setLocalData(username, localData); resolve(response); }).catch(function (error) { reject(error); }); }); } createOrganisation(organisationName: string, username: string, email: string) { let self : any = this; let localData : LocalData = self.localDataService.getLocalData(username); return new Promise((resolve, reject) => { self.createOrganisationMain(organisationName, username, email).then(function (response) { resolve(response); }).catch(function (error) { reject(error); }); }); } activateMain(username: string, pin: string, deviceName: string, activationToken: string = null) { let self : any = this; return new Promise((resolve, reject) => { let inputData: any; self.getRandomSalt(username).then(function (saltBits: string) { let base64Hash512 = CryptoService.getBase64Hash512SaltedPin(pin, saltBits); var url = self.basePath + self.userActivateUrl; inputData = { "username": username, "deviceName": deviceName, "activationToken": activationToken, "hashedPin": base64Hash512 }; let body = JSON.stringify(inputData); self.http.postNoAuth(url, body).then(function(response) { resolve(response); }).catch(function(error) { reject(error); }); }).catch(function (error) { reject(error); }); }) } loginMain(username: string, pin: string, deviceUuid: string, authKey: string) { let self : any = this; return new Promise((resolve, reject) => { let inputData: any; self.getRandomSalt(username).then(function (saltBits: string) { let base64Hash512 = CryptoService.getBase64Hash512SaltedPin(pin, saltBits); var url = self.basePath + self.loginUrl; inputData = { "deviceUuid": deviceUuid, "authKey": authKey, "hashedPin": base64Hash512, "username": username }; let body = JSON.stringify(inputData); self.http.postNoAuth(url, body).then(function(response) { resolve(response); }).catch(function(error) { reject(error); }); }).catch(function (error) { reject(error); }); }) } logoutMain(username: string, deviceUuid: string) { let self : any = this; return new Promise((resolve, reject) => { let inputData: any; var url = self.basePath + self.logoutUrl; inputData = { "deviceUuid": deviceUuid, "username": username }; let body = JSON.stringify(inputData); self.http.postNoAuth(url, body).then(function(response) { resolve(response); }).catch(function(error) { reject(error); }); }) } forgotpinMain(username: string, applicationUuid: string, deviceUuid: string, authKey: string) { let self : any = this; return new Promise((resolve, reject) => { let inputData: any; var url = self.basePath + self.forgotpinUrl; inputData = { "username": username, "applicationUuid": applicationUuid, "deviceUuid": deviceUuid, "authKey": authKey }; let body = JSON.stringify(inputData); self.http.postNoAuth(url, body).then(function(response) { resolve(response); }).catch(function(error) { reject(error); }); }) } reprovisionMain(requestId: string, activationToken: string, username: string, pin: string, applicationUuid: string, deviceUuid: string, authKey: string) { let self : any = this; return new Promise((resolve, reject) => { let inputData: any; var url = self.basePath + self.reprovisionUrl; inputData = { "requestId": requestId, "activationToken": activationToken, "username": username, "hashedPin": pin, "applicationUuid": applicationUuid, "deviceUuid": deviceUuid, "authKey": authKey }; let body = JSON.stringify(inputData); self.http.postNoAuth(url, body).then(function(response) { resolve(response); }).catch(function(error) { reject(error); }); }) } tenantCreateMain(tenantName: string, username: string, email: string, pin: string) { let self : any = this; return new Promise((resolve, reject) => { let inputData: any; self.getRandomSalt(username).then(function (saltBits: string) { let base64Hash512 = self.cryptoService.getBase64Hash512SaltedPin(pin, saltBits); // Create new user request var url = self.basePath + self.tenantCreateUrl; inputData = { "tenantName": tenantName, "username": username, "email": email, "pin": base64Hash512 }; let body = JSON.stringify(inputData); self.http.postNoAuth(url, body).then(function(response) { resolve(response); }).catch(function(error) { reject(error); }); }).catch(function(error) { reject(error); }); }); } createOrganisationMain(organisationName: string, username: string, email: string) { let self : any = this; return new Promise((resolve, reject) => { let inputData: any; self.getRandomSalt(username).then(function (saltBits: string) { // Create new user request var url = self.basePath + self.createOrganisationUrl; inputData = { "organisationName": organisationName, "username": username, "email": email, }; let body = JSON.stringify(inputData); self.http.postNoAuth(url, body).then(function(response) { resolve(response); }).catch(function(error) { reject(error); }); }).catch(function(error) { reject(error); }); }); } }