diff --git a/ng6-seed/angular.json b/ng6-seed/angular.json index 4b9753c..6a93d7c 100755 --- a/ng6-seed/angular.json +++ b/ng6-seed/angular.json @@ -82,7 +82,8 @@ "replace": "src/environments/environment.ts", "with": "src/environments/environment.stage.ts" } - ] + ], + "serviceWorker": true }, "test": { "fileReplacements": [ @@ -90,7 +91,8 @@ "replace": "src/environments/environment.ts", "with": "src/environments/environment.stage.ts" } - ] + ], + "serviceWorker": true } } }, diff --git a/ng6-seed/cert.pem b/ng6-seed/cert.pem new file mode 100644 index 0000000..1740c57 --- /dev/null +++ b/ng6-seed/cert.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgIJALp8pgcPInoDMA0GCSqGSIb3DQEBCwUAMFExCzAJBgNV +BAYTAklOMRMwEQYDVQQIDApUYW1pbCBOYWR1MRAwDgYDVQQHDAdDaGVubmFpMQ4w +DAYDVQQKDAVWZW5iYTELMAkGA1UECwwCSVQwHhcNMjAxMTE2MTIxMDI3WhcNMzAx +MTE0MTIxMDI3WjBRMQswCQYDVQQGEwJJTjETMBEGA1UECAwKVGFtaWwgTmFkdTEQ +MA4GA1UEBwwHQ2hlbm5haTEOMAwGA1UECgwFVmVuYmExCzAJBgNVBAsMAklUMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9Abu9StEo1KrngOXi53hQN3W +lJUELHjRLtz+246W8/l+U2SQ8pvh/UsvS/T+2Ymtwkrn8+pLik+7abrMOFaYpW8i +LdbLtBDZHMrP/SkKv3SN3bIQQVtyWzMwoPtmOzvRuxyyvkWjwp3qIcLmLe104Z0D +myy4bG69lmgHY6tH9VPRzPSdMuJSETPZlTCec035CHauXub1kn33PWS/J6ZWzQV2 +j2Cdp/U22qaRtv8mqqhgy85ytHddxzJs65Ea0Bf3zUaQwFLEFTHYKgdo+wzY3OC+ +969xZA+zqh1WMWPSGikyMS113ECM/vt/0o2p2Uvj+H2Up/z5xC3li76NBQ4CRwID +AQABo1AwTjAdBgNVHQ4EFgQUsqEFNzWzQuQswW7/EmqLFC9ovO0wHwYDVR0jBBgw +FoAUsqEFNzWzQuQswW7/EmqLFC9ovO0wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B +AQsFAAOCAQEAJsP1FxUT9N3SQDIiXMzId0cEMSfeqrTEJRLruQj2LvooPnvoheF1 +CEgp+YDEbFphKfmYVb8e5B3P/xCqoNRrWZDgufXLhZbvo5KCufMt6z1gPJSMVt4c +/ChSqHonzlodz+w3gueHDkgs4bxK41E15BUhlIH4qGYuSoGPjmP2799aWIfX98k8 +bjzRoqKEQzSZDjkrwpHdcbqm5XuxR19tYB7rbPawjPVyjIehZ5IkibxFdjJ9k01M +sETsdfXlyDZHUlyX0SA39eqUO4f7AXsidleHExYbolhQ82HpYJANXHFzmA5c9kLk +K2QQH8yTjqirZkQW6QB9HYYrxHTkNM4SLw== +-----END CERTIFICATE----- diff --git a/ng6-seed/key.pem b/ng6-seed/key.pem new file mode 100644 index 0000000..ee34a22 --- /dev/null +++ b/ng6-seed/key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0Bu71K0SjUque +A5eLneFA3daUlQQseNEu3P7bjpbz+X5TZJDym+H9Sy9L9P7Zia3CSufz6kuKT7tp +usw4VpilbyIt1su0ENkcys/9KQq/dI3dshBBW3JbMzCg+2Y7O9G7HLK+RaPCneoh +wuYt7XThnQObLLhsbr2WaAdjq0f1U9HM9J0y4lIRM9mVMJ5zTfkIdq5e5vWSffc9 +ZL8nplbNBXaPYJ2n9TbappG2/yaqqGDLznK0d13HMmzrkRrQF/fNRpDAUsQVMdgq +B2j7DNjc4L73r3FkD7OqHVYxY9IaKTIxLXXcQIz++3/SjanZS+P4fZSn/PnELeWL +vo0FDgJHAgMBAAECggEAcX0T/uN7jXVyKQ/EmAL58l/5XqqbAU/DAUd4I4YCAD9F +F+WKX7pNdK5Vtb6gE22raNPLYi3RqeaA46AjQAROA4pW2/isTfcT8gcEidlfjUDY +hYU9eBfebDm3YPbqSZv9Y0bqfgEHMwicDc2FnVB07kRGnBFFR/CMrXl+DkVnNtk3 +EBDxGjEja0MpQe/uVAwscCCqKG/Ra+wbRPoRHCdpT8UTLYfd5Tbz7lTMtKoPVQyy +Svm0OfrDSCNksagJGLZgJMVQQr2W+4EGhL91pkysBIX/Gu+pV6nTWGpwlB3tjPOw +4e4SwcWhX75kQLXRtjQYM7okq7Y/Gs3KdgdYTOS9UQKBgQD+wYs512yuiCfKwiss +uOZyJGKUoNWQhy1CfzzvX2BvxW0DcwGcWLq4xsJtXEK4AvG3ZRwdssxF2Im38Vas +28TFLyhkYM/gHLwmrcWczab77jXMM12BPQBvz4iwC90+BtHnBEbNNkkj7h8FFwOf +qqNBcHzpKbBoSMn4uloDqimE6QKBgQD1N/pZU9S89NimeLPrTHibW3j/gJ6R8LO7 +NaG1eV3JM9bhrFM3qQJTXYEW8gQ4b+z1uCKx+Mgz+D7JJMF7lH6H0XM5P6d/JTxm +6RpPOV01iuBe2ULkisg/4QQqY0F47iWuShja7WgxqVNyMrcZG4S92Neemg0DTKqT +vuQPKT6PrwKBgQDcQsy0cuyVrkTxSpX3sdoVAB53sONVdXqNTuOJdyYzHTgWzl2r +JxAx6C98TFOnM2x4CySXDNsO3Jyd/DzbcZwcfJxoxUeV1mJa8s2zuB9THO9IoXSL +5Ak3ovDkfS2Jjm33Vjw8+12bgisxxGcuqmNClhZ5pcDPOXfe5IglOP9y2QKBgDDl +dJoTSTxUZk7ripTErtfrqXjpILVhFbWiwBf7l2PjXlmpjv5uSPRulKsKnyTRzKJC +kUiDnwgd3AcnuRz3QzO55AvqUW/c8OpkWMarXZarlonTMK95rOxv5fC90fRXKFRU +mhgtdrVQWj9PNYtgHVvtvTD27tlVlD3Ztof/ZWYpAoGARlt6y7u87M8rI7ROz2xJ +EX/vvsq8+/NAkW4NSXC7ETJ4bjhvigG4/vN/gNdAZpw3NGaDaNZNaIOIIoYZ+pNL +JYnNOCfWfbu15tZGDOeQcArY8gHUjH63W2/da3c/SRvfP5rASmtk1mjOf0G8E3/v +JY3AbidYmdex3n0792PRuMI= +-----END PRIVATE KEY----- diff --git a/ng6-seed/ngsw-config.json b/ng6-seed/ngsw-config.json index fa9410f..6153e9c 100644 --- a/ng6-seed/ngsw-config.json +++ b/ng6-seed/ngsw-config.json @@ -19,6 +19,10 @@ "resources": { "files": [ "/assets/**" + ], + "urls": [ + "https://fonts.googleapis.com/**", + "https://fonts.gstatic.com/**" ] } } diff --git a/ng6-seed/src/app/AwsService/cognito.service.ts b/ng6-seed/src/app/AwsService/cognito.service.ts index d6e804d..fe1bbfc 100755 --- a/ng6-seed/src/app/AwsService/cognito.service.ts +++ b/ng6-seed/src/app/AwsService/cognito.service.ts @@ -126,23 +126,29 @@ isloggin:boolean = false; // } refresh() { let tokenexp:boolean; - this.getCurrentUser().getSession(function (err, session) { + return Observable.create(observer=>{ + console.log("Current user check in token refresh fun",this.getCurrentUser()) + return this.getCurrentUser().getSession(function (err, session) { if (err) { + console.log("Error Refreshing token",err); } else { if (session.isValid()) { tokenexp = session.isValid(); of(tokenexp) - + console.log("CognitoUtil: refreshed successfully"); } else { - tokenexp = session.isValid(); + tokenexp = session.isValid(); + console.log("CognitoUtil: refreshed but session is still not valid"); } } - return tokenexp; + observer.next(tokenexp) + observer.complete() }); +}); } getAccessToken(){ this.refresh(); diff --git a/ng6-seed/src/app/_guard/req-token.interceptor.ts b/ng6-seed/src/app/_guard/req-token.interceptor.ts new file mode 100755 index 0000000..efc34e0 --- /dev/null +++ b/ng6-seed/src/app/_guard/req-token.interceptor.ts @@ -0,0 +1,260 @@ +import { Injectable, Injector } from '@angular/core'; +import { + HttpRequest, + HttpHandler, + HttpInterceptor, + HttpSentEvent, + HttpHeaderResponse, + HttpProgressEvent, + HttpResponse, + HttpUserEvent, + HttpEvent +} from '@angular/common/http'; +// import { AuthGuard } from './auth.guard'; +import { Observable, of, BehaviorSubject, throwError} from 'rxjs'; + +// import { Router } from '@angular/router'; + +import { switchMap, tap, catchError, finalize } from 'rxjs/operators'; +import { HttpErrorResponse } from "@angular/common/http"; +import { Router } from '@angular/router'; +import { CognitoService } from 'app/AwsService/cognito.service'; +import { LoaderService } from 'app/shared/loaderService/loader.service'; +import { environment } from '../../environments/environment'; +import { AwsService } from 'app/AwsService/aws.service'; + + + +@Injectable({ + providedIn: 'root' +}) +export class ReqTokenInterceptor implements HttpInterceptor{ + + constructor( private router: Router,public shared:CognitoService,private loaderService:LoaderService,private awsService:AwsService) { + + } + isRefreshingToken: boolean = false; + tokenSubject: BehaviorSubject = new BehaviorSubject(null); + + addToken(req: HttpRequest, token: string): HttpRequest { + + return req.clone({ + setHeaders: { + 'Authorization': environment.authorization, + 'Token': token + } + }) + } +// addToken1(req: HttpRequest, token: string): HttpRequest { + +// console.log("Token 1",token,req); +// return req.clone({ setHeaders: {'Authorization': environment.authorization, +// 'Token':token, +// // 'From':'2', +// }}) +// } +intercept(req: HttpRequest, next: HttpHandler): Observable | HttpUserEvent> { + + let token:any = this.shared.getAccessToken() ||""; + // console.log("Token From Interceptor >>",cognitoService.getToken()) + if(token!=''){ + token=token.getIdToken().getJwtToken() + } + this.showLoader(); + // return next.handle(this.addToken(req, token)).pipe( + // catchError(error => { + // this.onEnd(); + // console.log("Initial Error",error); + // if (error instanceof HttpErrorResponse) { + // if((error).status) { + // return this.handle401Error(req,next,error) + // } + // else{ + // return this.handle401Error(req,next,error) + // } + // } else { + // console.log("observable error") + // return Observable.throw(error); + // } + // })); + return next.handle(this.addToken(req, token)).pipe( + catchError(error => { + console.log("Initial Error",error); + if (error instanceof HttpErrorResponse) { + if((error).status) { + return this.handle401Error(req,next,error) + } + else{ + return this.handle401Error(req,next,error) + } + } else { + console.log("observable error") + return Observable.throw(error); + } + }), + finalize(()=>{ + this.onEnd() + }) + ) + } + + handle401Error(req: HttpRequest, next: HttpHandler,err) { + console.log("err",err) + console.log("entered",this.isRefreshingToken,this.tokenSubject); + + if (err instanceof HttpErrorResponse) { + + if(err.status == 401 && err.error.error.toLowerCase() == 'invalid token!'){ + console.log("Refreshing Token",err.status) + if (!this.isRefreshingToken) { + this.isRefreshingToken = true; + + // Reset here so that the following requests wait until the token + // comes back from the refreshToken call. + this.tokenSubject.next(null); + console.log("STARTING TOKEN REFRESH") + // return this.shared.refresh() + // .subscribe((newToken: string) => { + // console.log("new",newToken) + // if (newToken) { + // let token:any = this.shared.getAccessToken() ||""; + // this.tokenSubject.next( token.getIdToken().getJwtToken()); + // console.log(this.tokenSubject); + // return next.handle(this.addToken1(req, token.getIdToken().getJwtToken())) + // // .pipe(tap((event:HttpEvent)=>{ + // // if (event instanceof HttpResponse) { + // // this.onEnd(); + // // } + // // }, + // // (err: any) => { + // // this.handleError('role',err); + // // console.log("Error on Refresh token",err) + // // this.onEnd(); + // // })); + // } + + // // If we don't get a new token, we are in trouble so logout. + // return this.awsService.logout(); + // },err=>console.log("Error refresh",err)) + return this.shared.refresh().pipe( + switchMap((newToken: string) =>{ + console.log("New Token",newToken) + if(newToken){ + this.isRefreshingToken=false + this.tokenSubject.next(newToken); + let token:any = this.shared.getAccessToken() ||""; + this.showLoader(); + return next.handle(this.addToken(req, token.getIdToken().getJwtToken())).pipe(tap((event:HttpEvent)=>{ + if (event instanceof HttpResponse) { + this.onEnd(); + } + }, + (err: any) => { + this.handleError('role',err); + console.log("Error on Refresh token",err) + this.onEnd(); + })); + } + + return this.awsService.logout(); + }) + ) + + // .catch(error => { + // // If there is an exception calling 'refreshToken', bad news so logout. + // return this.logoutUser(); + // }) + // .finally(() => { + // this.isRefreshingToken = false; + // }); + } else { + console.log("Else Part 1201") + // return this.tokenSubject + // // .filter(token => token != null) + // .take(1) + // .switchMap(token => { + let token:any = this.shared.getAccessToken() ||""; + this.showLoader(); + return next.handle(this.addToken(req,token.getIdToken().getJwtToken())).pipe(tap((event:HttpEvent)=>{ + if (event instanceof HttpResponse) { + this.onEnd(); + } + }, + (err: any) => { + this.handleError('role',err); + console.log("Error on Refresh token",err) + this.onEnd(); + })); + // }); + } + } + else{ + // return Observable.throw("Observable throw",err); + return this.handleError('',err) + } +} + else{ + return Observable.throw("Observable throw",err); + } +} + + +private handleError (operation = 'operation', error?: T) { + // return (error: any): Observable => { + console.log("d",error) + if(error instanceof HttpErrorResponse){ + // this.onEnd(); + console.log("Error from interceptor >>>",error) + console.error("Error: " + error.status); + if(error.status == 401){ + localStorage.clear(); + this.router.navigate(['/authentication/login']); + } + else if(error.status == 404){ + this.router.navigate(['/error/404']); + } + else if(error.status == 503){ + this.router.navigate(['/error/503']); + } + else if(error.status == 0){ + console.log("NO Internet") + this.router.navigate(['/error/404']); + } + else{ + // alert("Please Check your Internet connection"); + let errorMessage = ''; + let type : number; + if (error.error instanceof ErrorEvent) { + // client-side error + errorMessage = `Error: ${error.error.message}`; + type = 1; + } else { + // server-side error + errorMessage = `Error Code: ${error.status}\nMessage: ${error.message}`; + type = 2; + } + + return throwError({error_status :type == 2 ? error.status : '', + error_message:error.message, + error_text :type == 2 ? error.statusText : '', + html_format :errorMessage, + error_type :type, + }); + } + return throwError(error); + } + // }; +} + // }; + // } + + private onEnd(): void { + this.hideLoader(); + } + private showLoader(): void { + this.loaderService.show(); + } + private hideLoader(): void { + this.loaderService.hide(); + } +} \ No newline at end of file diff --git a/ng6-seed/src/app/app.component.ts b/ng6-seed/src/app/app.component.ts index 264d073..177f062 100755 --- a/ng6-seed/src/app/app.component.ts +++ b/ng6-seed/src/app/app.component.ts @@ -16,7 +16,8 @@ export class AppComponent { window.addEventListener('beforeinstallprompt', event => { this.promptEvent = event; // this.Pwa.promptEvent=event - alert(event); + console.log("beforeinstall Prompt Listener",event); + // alert("Install as App"); }); } } diff --git a/ng6-seed/src/app/app.module.ts b/ng6-seed/src/app/app.module.ts index 09d40fb..c445327 100755 --- a/ng6-seed/src/app/app.module.ts +++ b/ng6-seed/src/app/app.module.ts @@ -51,6 +51,7 @@ import { HttpLoaderComponent } from './layouts/http-loader/http-loader.component import { AdvanceFilterComponent } from './sales-pd/advance-filter/advance-filter.component'; import { ServiceWorkerModule } from '@angular/service-worker'; import { environment } from '../environments/environment'; +import { ReqTokenInterceptor } from './_guard/req-token.interceptor'; export function HttpLoaderFactory(http: HttpClient) { return new TranslateHttpLoader(http); } @@ -122,7 +123,7 @@ export function createTranslateLoader(http: HttpClient) { // }, { provide:HTTP_INTERCEPTORS, - useClass: TokenInterceptor, + useClass: ReqTokenInterceptor, multi: true } ], diff --git a/ng6-seed/src/app/layouts/admin/admin-layout.component.html b/ng6-seed/src/app/layouts/admin/admin-layout.component.html index f401e35..99f6263 100755 --- a/ng6-seed/src/app/layouts/admin/admin-layout.component.html +++ b/ng6-seed/src/app/layouts/admin/admin-layout.component.html @@ -15,7 +15,7 @@