{"version":3,"file":"myrmidon-auth-jwt-login.mjs","sources":["../../../../projects/myrmidon/auth-jwt-login/src/lib/components/auth-jwt-login/auth-jwt-login.component.ts","../../../../projects/myrmidon/auth-jwt-login/src/lib/components/auth-jwt-login/auth-jwt-login.component.html","../../../../projects/myrmidon/auth-jwt-login/src/lib/services/auth-jwt.service.ts","../../../../projects/myrmidon/auth-jwt-login/src/lib/services/auth-jwt-admin-guard.service.ts","../../../../projects/myrmidon/auth-jwt-login/src/lib/services/auth-jwt-guard.service.ts","../../../../projects/myrmidon/auth-jwt-login/src/lib/services/jwt.interceptor.ts","../../../../projects/myrmidon/auth-jwt-login/src/lib/services/auth-jwt.interceptor.ts","../../../../projects/myrmidon/auth-jwt-login/src/lib/services/jwt-admin-guard.ts","../../../../projects/myrmidon/auth-jwt-login/src/lib/services/jwt-guard.ts","../../../../projects/myrmidon/auth-jwt-login/src/lib/services/gravatar.service.ts","../../../../projects/myrmidon/auth-jwt-login/src/lib/pipes/gravatar.pipe.ts","../../../../projects/myrmidon/auth-jwt-login/src/public-api.ts","../../../../projects/myrmidon/auth-jwt-login/src/myrmidon-auth-jwt-login.ts"],"sourcesContent":["import {\n  Component,\n  input,\n  inject,\n  output,\n  signal,\n  computed,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { form, FormField, FormRoot, required, disabled } from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\n\nexport interface Credentials {\n  name: string;\n  password: string;\n  returnUrl?: string;\n}\n\n/**\n * Login form for JWT authentication.\n */\n@Component({\n  selector: 'auth-jwt-login',\n  templateUrl: './auth-jwt-login.component.html',\n  styleUrls: ['./auth-jwt-login.component.css'],\n  imports: [\n    FormField,\n    FormRoot,\n    MatButtonModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatIconModule,\n    MatProgressBarModule,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AuthJwtLoginComponent {\n  private _returnUrl: string;\n\n  // input\n  public readonly forgot = input<boolean>(false);\n  public readonly validating = input<boolean>(false);\n  public readonly error = input<string | undefined | null>();\n  // output\n  public readonly loginRequest = output<Credentials>();\n  public readonly resetRequest = output();\n\n  protected readonly formModel = signal({ name: '', password: '' });\n  protected readonly userForm = form(\n    this.formModel,\n    (p) => {\n      required(p.name);\n      required(p.password);\n      disabled(p, { when: () => this.validating() });\n    },\n    {\n      submission: {\n        action: async () => {\n          this.loginRequest.emit({\n            name: this.formModel().name,\n            password: this.formModel().password,\n            returnUrl: this._returnUrl,\n          });\n        },\n      },\n    }\n  );\n\n  public readonly hidePassword = signal<boolean>(true);\n  public readonly busy = computed(() => this.validating() && !this.error());\n  public readonly errorMessage = computed(() => this.error() || undefined);\n\n  constructor() {\n    this._returnUrl = inject(ActivatedRoute).snapshot.queryParams['returnUrl'];\n  }\n\n  public requestReset(): void {\n    this.resetRequest.emit();\n  }\n}\n","<form [formRoot]=\"userForm\" autocomplete=\"on\">\n  <div>\n    <mat-form-field>\n      <mat-label i18n=\"auth-jwt-login\">name</mat-label>\n      <input\n        type=\"text\"\n        autocomplete=\"username\"\n        matInput\n        [formField]=\"userForm.name\"\n      />\n      <mat-icon matSuffix>account_circle</mat-icon>\n    </mat-form-field>\n  </div>\n\n  <div>\n    <mat-form-field>\n      <mat-label i18n=\"auth-jwt-login\">password</mat-label>\n      <input\n        [type]=\"hidePassword() ? 'password' : 'text'\"\n        autocomplete=\"current-password\"\n        matInput\n        [formField]=\"userForm.password\"\n      />\n      <button\n        type=\"button\"\n        mat-icon-button\n        matSuffix\n        (click)=\"hidePassword.set(!hidePassword())\"\n        i18n-aria-label=\"auth-jwt-login\"\n        aria-label=\"Hide password\"\n        [attr.aria-pressed]=\"hidePassword()\"\n      >\n        <mat-icon>{{\n          hidePassword() ? \"visibility_off\" : \"visibility\"\n        }}</mat-icon>\n      </button>\n    </mat-form-field>\n  </div>\n\n  @if (errorMessage()) {\n    <div class=\"loginError\">{{ errorMessage() }}</div>\n  }\n\n  <div>\n    @if (busy()) {\n      <mat-progress-bar id=\"progress\" mode=\"indeterminate\" />\n    }\n  </div>\n\n  <div class=\"loginButtons\">\n    <button\n      type=\"submit\"\n      mat-flat-button\n      color=\"primary\"\n      class=\"mat-primary\"\n      [disabled]=\"!userForm().valid()\"\n    >\n      <mat-icon>check_circle</mat-icon>\n      <ng-container i18n=\"auth-jwt-login\">login</ng-container>\n    </button>\n  </div>\n\n  @if (forgot()) {\n    <div class=\"tip\">\n      <a mat-button (click)=\"requestReset()\" i18n=\"auth-jwt-login\"\n        >Forgot password?</a\n      >\n    </div>\n  }\n</form>\n","import { Observable, BehaviorSubject } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\n\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport {\r\n  EnvService,\r\n  ErrorService,\r\n  LocalStorageService,\r\n} from '@myrmidon/ngx-tools';\r\n\r\n// https://github.com/cornflourblue/angular-7-registration-login-example-cli/blob/master/src/app/_services/authentication.service.ts\r\n\r\n/**\r\n * Authenticated user data. You can expand this interface to add more data.\r\n */\r\nexport interface User {\r\n  userName: string;\r\n  email: string;\r\n  roles: string[];\r\n  emailConfirmed?: boolean;\r\n  firstName?: string;\r\n  lastName?: string;\r\n  lockoutEnabled?: boolean;\r\n  lockoutEnd?: Date;\r\n}\r\n\r\n/**\r\n * Login result.\r\n */\r\nexport interface LoginResult {\r\n  token: string;\r\n  expiration: Date;\r\n}\r\n\r\nexport const STORAGE_AUTH_USER_KEY = 'auth-jwt.user';\r\nexport const STORAGE_AUTH_TOKEN_KEY = 'auth-jwt.token';\r\n\r\n/**\r\n * JWT-based authentication service.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class AuthJwtService {\r\n  private readonly _http = inject(HttpClient);\r\n  private readonly _localStorage = inject(LocalStorageService);\r\n  private readonly _error = inject(ErrorService);\r\n  private readonly _env = inject(EnvService);\r\n\r\n  private readonly _currentUserSubject: BehaviorSubject<User | null>;\r\n\r\n  /**\r\n   * The current user observable.\r\n   */\r\n  public readonly currentUser$: Observable<User | null>;\r\n\r\n  /**\r\n   * The current user latest value.\r\n   */\r\n  public get currentUserValue(): User | null {\r\n    return this._currentUserSubject.value;\r\n  }\r\n\r\n  constructor() {\r\n    const _localStorage = this._localStorage;\r\n\r\n    this._currentUserSubject = new BehaviorSubject<User | null>(\r\n      _localStorage.retrieve<User>(STORAGE_AUTH_USER_KEY, true)\r\n    );\r\n    this.currentUser$ = this._currentUserSubject.asObservable();\r\n  }\r\n\r\n  /**\r\n   * Logs the specified user in.\r\n   * @param name: user name.\r\n   * @param password: password.\r\n   */\r\n  public login(name: string, password: string): Observable<User> {\r\n    return this._http\r\n      .post<LoginResult>(\r\n        this._env.get('apiUrl') + `auth/login`,\r\n        {\r\n          Username: name,\r\n          Password: password,\r\n        },\r\n        {\r\n          headers: new HttpHeaders({\r\n            'Content-Type': 'application/json',\r\n          }),\r\n        }\r\n      )\r\n      .pipe(\r\n        map((result: LoginResult) => {\r\n          const helper = new JwtHelperService();\r\n          const token = helper.decodeToken(result.token);\r\n          this._localStorage.store(STORAGE_AUTH_TOKEN_KEY, result, true);\r\n          // get user info from token\r\n          const user: User = {\r\n            userName:\r\n              token[\r\n                'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name'\r\n              ],\r\n            email:\r\n              token[\r\n                'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'\r\n              ],\r\n            roles:\r\n              token[\r\n                'http://schemas.microsoft.com/ws/2008/06/identity/claims/role'\r\n              ],\r\n            emailConfirmed: token.vfd === true || token.vfd === 'true',\r\n            firstName:\r\n              token[\r\n                'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname'\r\n              ],\r\n            lastName:\r\n              token[\r\n                'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname'\r\n              ],\r\n          };\r\n          this._currentUserSubject.next(user);\r\n          this.updateCurrentUser(user);\r\n          return user;\r\n        }),\r\n        catchError(this._error.handleError)\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Logs out the current user if any.\r\n   */\r\n  public logout(): Observable<any> {\r\n    this._localStorage.remove(STORAGE_AUTH_USER_KEY, true);\r\n    this._localStorage.remove(STORAGE_AUTH_TOKEN_KEY, true);\r\n    this._currentUserSubject.next(null);\r\n    const options = {\r\n      headers: this.createAuthHeaders({\r\n        'Content-Type': 'application/json',\r\n      }),\r\n    };\r\n    return this._http\r\n      .get(this._env.get('apiUrl') + 'auth/logout', options)\r\n      .pipe(catchError(this._error.handleError));\r\n  }\r\n\r\n  /**\r\n   * True it the user is authenticated, and eventually verified.\r\n   * @param verifiedOnly true to return true only if the user is verified.\r\n   * @returns true if authenticated (and eventually verified).\r\n   */\r\n  public isAuthenticated(verifiedOnly: boolean): boolean {\r\n    if (!this.currentUserValue) {\r\n      return false;\r\n    }\r\n\r\n    // check token expiration\r\n    const result: LoginResult | null = this._localStorage.retrieve(\r\n      STORAGE_AUTH_TOKEN_KEY,\r\n      true\r\n    );\r\n    if (!result) {\r\n      return false;\r\n    }\r\n    if (result.expiration) {\r\n      if (this.getUTCDate().valueOf() - result.expiration.valueOf() < 60) {\r\n        return false;\r\n      }\r\n    }\r\n\r\n    // check confirmation, if requested\r\n    if (!verifiedOnly) {\r\n      return true;\r\n    }\r\n    return this.currentUserValue?.emailConfirmed || false;\r\n  }\r\n\r\n  /**\r\n   * Update data about the current user.\r\n   * @param user user data.\r\n   */\r\n  public updateCurrentUser(user: User) {\r\n    this._localStorage.store(STORAGE_AUTH_USER_KEY, user, true);\r\n  }\r\n\r\n  /**\r\n   * Checks if the current user is in the specified role.\r\n   * @param role The role to check for.\r\n   */\r\n  public isCurrentUserInRole(role: string) {\r\n    const user = this.currentUserValue;\r\n    if (!user || !user.roles) {\r\n      return false;\r\n    }\r\n    return user.roles.indexOf(role) > -1;\r\n  }\r\n\r\n  /**\r\n   * Create headers with bearer authentication. You can use this method as a shortcut\r\n   * for building headers for authenticated requests.\r\n   * @param headers content of headers to be merged\r\n   * with the authentication headers.\r\n   * @returns headers.\r\n   */\r\n  public createAuthHeaders(headers?: { [name: string]: any }): HttpHeaders {\r\n    // create headers\r\n    const auth = new HttpHeaders();\r\n    if (headers) {\r\n      for (const key in headers) {\r\n        if (headers.hasOwnProperty(key)) {\r\n          auth.append(key, headers[key]);\r\n        }\r\n      }\r\n    }\r\n\r\n    // append authentication\r\n    const loginResult: LoginResult | null = this._localStorage.retrieve(\r\n      STORAGE_AUTH_TOKEN_KEY,\r\n      true\r\n    );\r\n    if (loginResult) {\r\n      auth.append('Authorization', 'Bearer ' + loginResult.token);\r\n    }\r\n    return auth;\r\n  }\r\n\r\n  /**\r\n   * Get the Authorization header value.\r\n   * @returns string The value for the Authorization header, or empty string if not authorized.\r\n   */\r\n  public getAuthHeader(): string {\r\n    const loginResult: LoginResult | null = this._localStorage.retrieve(\r\n      STORAGE_AUTH_TOKEN_KEY,\r\n      true\r\n    );\r\n    if (!loginResult) {\r\n      return '';\r\n    }\r\n    return 'Bearer ' + loginResult.token;\r\n  }\r\n\r\n  /**\r\n   * Gets the UTC date from the specified local date.\r\n   * @param date local date\r\n   */\r\n  public getUTCDate(date?: Date): Date {\r\n    if (!date) {\r\n      date = new Date();\r\n    }\r\n    return new Date(\r\n      date.getUTCFullYear(),\r\n      date.getUTCMonth(),\r\n      date.getUTCDate(),\r\n      date.getUTCHours(),\r\n      date.getUTCMinutes(),\r\n      date.getUTCSeconds()\r\n    );\r\n  }\r\n}\r\n","// https://angular.io/docs/ts/latest/guide/router.html\r\nimport { Injectable, inject } from '@angular/core';\r\nimport {\r\n  Router,\r\n  ActivatedRouteSnapshot,\r\n  RouterStateSnapshot,\r\n} from '@angular/router';\r\n\r\nimport { AuthJwtService } from './auth-jwt.service';\r\n\r\n/**\r\n * Guard for admin users. This assumes that the login route\r\n * to redirect to is /login.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class AuthJwtAdminGuardService {\r\n  private _router = inject(Router);\r\n  private _authService = inject(AuthJwtService);\r\n\r\n  private redirectToLogin(url: string): void {\r\n    this._router.navigate(['/login'], {\r\n      queryParams: {\r\n        returnUrl: url,\r\n      },\r\n    });\r\n  }\r\n\r\n  public canActivate(\r\n    route: ActivatedRouteSnapshot,\r\n    state: RouterStateSnapshot\r\n  ): boolean {\r\n    // if not authenticated, redirect to login\r\n    if (!this._authService.isAuthenticated(false)) {\r\n      this.redirectToLogin(state.url);\r\n      return false;\r\n    }\r\n    // if authenticated but not verified, redirect to login\r\n    if (!this._authService.currentUserValue?.emailConfirmed) {\r\n      this._router.navigate(['/login']);\r\n      console.warn('User not verified');\r\n      return false;\r\n    }\r\n    // else activate only if admin\r\n    const user = this._authService.currentUserValue;\r\n    const ok = user && user.roles?.some((r) => r === 'admin');\r\n    if (!ok) {\r\n      console.warn('Unauthorized user');\r\n    }\r\n    return ok;\r\n  }\r\n}\r\n","// https://angular.io/docs/ts/latest/guide/router.html\r\nimport { Injectable, inject } from '@angular/core';\r\nimport {\r\n  Router,\r\n  ActivatedRouteSnapshot,\r\n  RouterStateSnapshot,\r\n} from '@angular/router';\r\nimport { AuthJwtService } from './auth-jwt.service';\r\n\r\n/**\r\n * Guard for authenticated users. This assumes that the login route\r\n * to redirect to is /login.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class AuthJwtGuardService {\r\n  private _router = inject(Router);\r\n  private _authService = inject(AuthJwtService);\r\n\r\n  private redirectToLogin(url: string): void {\r\n    this._router.navigate(['/login'], {\r\n      queryParams: {\r\n        returnUrl: url,\r\n      },\r\n    });\r\n  }\r\n\r\n  public canActivate(\r\n    route: ActivatedRouteSnapshot,\r\n    state: RouterStateSnapshot\r\n  ): boolean {\r\n    // if not authenticated, redirect to login\r\n    if (!this._authService.isAuthenticated(false)) {\r\n      this.redirectToLogin(state.url);\r\n      return false;\r\n    }\r\n    // if authenticated but not verified, redirect to login\r\n    if (!this._authService.currentUserValue?.emailConfirmed) {\r\n      this.redirectToLogin(state.url);\r\n      console.warn('User not verified');\r\n      return false;\r\n    }\r\n    return true;\r\n  }\r\n}\r\n","import { inject, InjectionToken } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, take, tap } from 'rxjs/operators';\r\nimport {\r\n  HttpEvent,\r\n  HttpRequest,\r\n  HttpErrorResponse,\r\n  HttpHandlerFn,\r\n} from '@angular/common/http';\r\nimport { Router } from '@angular/router';\r\n\r\nimport { AuthJwtService } from './auth-jwt.service'; // Adjust path\r\n\r\n/**\r\n * An Injection Token to provide a list of URL prefixes that should be excluded\r\n * from JWT authentication by the AuthJwtInterceptor.\r\n * Requests to URLs starting with any of these prefixes will not have the\r\n * Authorization header added.\r\n */\r\nexport const AUTH_JWT_EXCLUDED_URLS = new InjectionToken<string[]>(\r\n  'auth.jwt.excluded.urls',\r\n  {\r\n    providedIn: 'root',\r\n    factory: () => [],\r\n  }\r\n);\r\n\r\n/**\r\n * Intercept the specified HTTP request adding the Authorization header to it,\r\n * and handling 401 errors by logging out and redirecting to the login route.\r\n * If the request is a JSONP request, it is not intercepted.\r\n *\r\n * To use this from your app, configure the providers like:\r\n *\r\n * ```ts\r\n * provideHttpClient(\r\n *   withInterceptors([jwtInterceptor]),\r\n *   withInterceptorsFromDi() // if you also use class-based interceptors\r\n * );\r\n *\r\n * // In your app.config.ts or a feature module:\r\n * providers: [\r\n *   {\r\n *     provide: AUTH_JWT_EXCLUDED_URLS,\r\n *     useValue: [\r\n *       'https://viaf.org/viaf/AutoSuggest',\r\n *       'https://another-public-api.com'\r\n *     ]\r\n *   }\r\n * ]\r\n * ```\r\n *\r\n * @param req The request.\r\n * @param next The next handler.\r\n * @returns Observable<HttpEvent<unknown>> The observable of the HTTP event.\r\n */\r\nexport function jwtInterceptor(\r\n  req: HttpRequest<unknown>,\r\n  next: HttpHandlerFn\r\n): Observable<HttpEvent<unknown>> {\r\n  if (req.method === 'JSONP') {\r\n    return next(req);\r\n  }\r\n\r\n  // inject the excluded URLs list\r\n  const excludedUrls = inject(AUTH_JWT_EXCLUDED_URLS);\r\n\r\n  // check if the current request URL starts with any of the excluded URLs\r\n  const isExcluded = excludedUrls.some((url) => req.url.startsWith(url));\r\n\r\n  // if the URL is excluded, just pass the request to the next handler without adding the token\r\n  if (isExcluded) {\r\n    return next(req);\r\n  }\r\n\r\n  const auth = inject(AuthJwtService);\r\n  const authHeader = auth.getAuthHeader();\r\n  if (!authHeader) {\r\n    return next(req);\r\n  }\r\n\r\n  // clone the request to add the new header\r\n  const authReq = req.clone({\r\n    headers: req.headers.set('Authorization', authHeader),\r\n  });\r\n  // pass on the cloned request instead of the original request\r\n  return next(authReq).pipe(\r\n    catchError((err: HttpErrorResponse) => {\r\n      // on 401 logout and redirect to the login route\r\n      if (err.status === 401) {\r\n        console.warn('Unauthorized request');\r\n        return auth.logout().pipe(\r\n          take(1),\r\n          tap(() => {\r\n            const router = inject(Router);\r\n            router.navigate(['login']);\r\n          })\r\n        );\r\n      }\r\n      // re-throw other errors\r\n      return throwError(() => err);\r\n    })\r\n  );\r\n}\r\n","import { Injectable, Injector, inject } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, take, tap } from 'rxjs/operators';\r\nimport {\r\n  HttpEvent,\r\n  HttpInterceptor,\r\n  HttpHandler,\r\n  HttpRequest,\r\n  HttpErrorResponse,\r\n  HttpHandlerFn,\r\n} from '@angular/common/http';\r\nimport { Router } from '@angular/router';\r\n\r\nimport { AuthJwtService } from './auth-jwt.service';\r\nimport { AUTH_JWT_EXCLUDED_URLS } from './jwt.interceptor';\r\n\r\n// https://angular.io/guide/http\r\n// https://medium.com/@ryanchenkie_40935/angular-authentication-using-the-http-client-and-http-interceptors-2f9d1540eb8\r\n\r\n/**\r\n * Interceptor to add Bearer authorization header.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class AuthJwtInterceptor implements HttpInterceptor {\r\n  private _injector = inject(Injector);\r\n  private _excludedUrls: string[];\r\n\r\n  constructor() {\r\n    // Inject the excluded URLs in the constructor\r\n    // For class-based interceptors, directly injecting the token in the constructor\r\n    // is the standard way.\r\n    this._excludedUrls = this._injector.get(AUTH_JWT_EXCLUDED_URLS);\r\n  }\r\n\r\n  /**\r\n   * Intercept the specified HTTP request adding the Authorization header to it.\r\n   * If the request is a JSONP request, it is not intercepted.\r\n   *\r\n   * @param req HttpRequest<any> The original request.\r\n   * @param next HttpHandler The next request handler.\r\n   */\r\n  public intercept(\r\n    req: HttpRequest<unknown>,\r\n    next: HttpHandler\r\n  ): Observable<HttpEvent<unknown>> {\r\n    if (req.method === 'JSONP') {\r\n      return next.handle(req);\r\n    }\r\n\r\n    // check if the current request URL starts with any of the excluded URLs\r\n    const isExcluded = this._excludedUrls.some((url) =>\r\n      req.url.startsWith(url)\r\n    );\r\n\r\n    // if the URL is excluded, just pass the request to the next handler\r\n    if (isExcluded) {\r\n      return next.handle(req);\r\n    }\r\n\r\n    // get the auth header from the service\r\n    // note that we do not inject the AuthService in constructor,\r\n    // to avoid infinite recursion:\r\n    // see https://github.com/angular/angular/issues/18224#issuecomment-316957213\r\n    const auth = this._injector.get(AuthJwtService);\r\n    const authHeader = auth.getAuthHeader();\r\n    if (!authHeader) {\r\n      return next.handle(req);\r\n    }\r\n\r\n    // clone the request to add the new header\r\n    const authReq = req.clone({\r\n      headers: req.headers.set('Authorization', authHeader),\r\n    });\r\n    // pass on the cloned request instead of the original request\r\n    // https://medium.com/@ryanchenkie_40935/angular-authentication-using-the-http-client-and-http-interceptors-2f9d1540eb8\r\n    return next.handle(authReq).pipe(\r\n      tap(\r\n        (event: HttpEvent<any>) => {},\r\n        (err) => {\r\n          if (err instanceof HttpErrorResponse) {\r\n            if (err.status === 401) {\r\n              // logout and redirect to the login route\r\n              console.warn('Unauthorized request');\r\n              auth\r\n                .logout()\r\n                .pipe(take(1))\r\n                .subscribe((_) => {\r\n                  const router = this._injector.get(Router);\r\n                  router.navigate(['login']);\r\n                });\r\n            }\r\n          }\r\n        }\r\n      )\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * Intercept the specified HTTP request adding the Authorization header to it,\r\n * and handling 401 errors by logging out and redirecting to the login route.\r\n * If the request is a JSONP request, it is not intercepted.\r\n * To use this from your app, configure the providers like:\r\n *\r\n * ```ts\r\n * provideHttpClient(withInterceptors([authJwtInterceptor]))\r\n * ```\r\n *\r\n * @param req The request.\r\n * @param next The next handler.\r\n * @returns Observable<HttpEvent<unknown>> The observable of the HTTP event.\r\n */\r\nexport function authJwtInterceptor(\r\n  req: HttpRequest<unknown>,\r\n  next: HttpHandlerFn\r\n): Observable<HttpEvent<unknown>> {\r\n  if (req.method === 'JSONP') {\r\n    return next(req);\r\n  }\r\n\r\n  const auth = inject(AuthJwtService);\r\n  const authHeader = auth.getAuthHeader();\r\n  if (!authHeader) {\r\n    return next(req);\r\n  }\r\n\r\n  // clone the request to add the new header\r\n  const authReq = req.clone({\r\n    headers: req.headers.set('Authorization', authHeader),\r\n  });\r\n  // pass on the cloned request instead of the original request\r\n  return next(authReq).pipe(\r\n    catchError((err: HttpErrorResponse) => {\r\n      // on 401 logout and redirect to the login route\r\n      if (err.status === 401) {\r\n        console.warn('Unauthorized request');\r\n        return auth.logout().pipe(\r\n          take(1),\r\n          tap(() => {\r\n            const router = inject(Router);\r\n            router.navigate(['login']);\r\n          })\r\n        );\r\n      }\r\n      // re-throw other errors\r\n      return throwError(() => err);\r\n    })\r\n  );\r\n}\r\n","import { inject } from '@angular/core';\r\nimport {\r\n  Router,\r\n  ActivatedRouteSnapshot,\r\n  RouterStateSnapshot,\r\n  CanActivateFn,\r\n} from '@angular/router';\r\n\r\nimport { AuthJwtService } from '../services/auth-jwt.service';\r\n\r\n/**\r\n * Functional guard for admin users.\r\n *\r\n * To migrate from the class-based AuthJwtAdminGuardService:\r\n *\r\n * OLD (class-based):\r\n * ```ts\r\n * {\r\n *   path: 'admin',\r\n *   component: AdminComponent,\r\n *   canActivate: [AuthJwtAdminGuardService]\r\n * }\r\n * ```\r\n *\r\n * NEW (functional):\r\n * ```ts\r\n * {\r\n *   path: 'admin',\r\n *   component: AdminComponent,\r\n *   canActivate: [jwtAdminGuard]\r\n * }\r\n * ```\r\n */\r\nexport const jwtAdminGuard: CanActivateFn = (\r\n  route: ActivatedRouteSnapshot,\r\n  state: RouterStateSnapshot\r\n): boolean => {\r\n  const router = inject(Router);\r\n  const authService = inject(AuthJwtService);\r\n\r\n  const redirectToLogin = (url: string): void => {\r\n    router.navigate(['/login'], {\r\n      queryParams: {\r\n        returnUrl: url,\r\n      },\r\n    });\r\n  };\r\n\r\n  // if not authenticated, redirect to login\r\n  if (!authService.isAuthenticated(false)) {\r\n    redirectToLogin(state.url);\r\n    return false;\r\n  }\r\n\r\n  // if authenticated but not verified, redirect to login\r\n  if (!authService.currentUserValue?.emailConfirmed) {\r\n    router.navigate(['/login']);\r\n    console.warn('User not verified');\r\n    return false;\r\n  }\r\n\r\n  // else activate only if admin\r\n  const user = authService.currentUserValue;\r\n  const ok = user && user.roles?.some((r) => r === 'admin');\r\n  if (!ok) {\r\n    console.warn('Unauthorized user');\r\n  }\r\n  return ok;\r\n};\r\n","import { inject } from '@angular/core';\r\nimport {\r\n  Router,\r\n  ActivatedRouteSnapshot,\r\n  RouterStateSnapshot,\r\n  CanActivateFn,\r\n} from '@angular/router';\r\n\r\nimport { AuthJwtService } from '../services/auth-jwt.service';\r\n\r\n/**\r\n * Functional guard for authenticated users.\r\n *\r\n * To migrate from the class-based AuthJwtGuardService:\r\n *\r\n * OLD (class-based):\r\n * ```ts\r\n * {\r\n *   path: 'protected',\r\n *   component: ProtectedComponent,\r\n *   canActivate: [AuthJwtGuardService]\r\n * }\r\n * ```\r\n *\r\n * NEW (functional):\r\n * ```ts\r\n * {\r\n *   path: 'protected',\r\n *   component: ProtectedComponent,\r\n *   canActivate: [jwtGuard]\r\n * }\r\n * ```\r\n */\r\nexport const jwtGuard: CanActivateFn = (\r\n  route: ActivatedRouteSnapshot,\r\n  state: RouterStateSnapshot\r\n): boolean => {\r\n  const router = inject(Router);\r\n  const authService = inject(AuthJwtService);\r\n\r\n  const redirectToLogin = (url: string): void => {\r\n    router.navigate(['/login'], {\r\n      queryParams: {\r\n        returnUrl: url,\r\n      },\r\n    });\r\n  };\r\n\r\n  // if not authenticated, redirect to login\r\n  if (!authService.isAuthenticated(false)) {\r\n    redirectToLogin(state.url);\r\n    return false;\r\n  }\r\n\r\n  // if authenticated but not verified, redirect to login\r\n  if (!authService.currentUserValue?.emailConfirmed) {\r\n    redirectToLogin(state.url);\r\n    console.warn('User not verified');\r\n    return false;\r\n  }\r\n\r\n  return true;\r\n};\r\n","import { Injectable } from '@angular/core';\r\n\r\n// npm i ts-md5\r\nimport { Md5 } from 'ts-md5';\r\n\r\n/**\r\n * Options for generating Gravatar URLs.\r\n */\r\nexport interface GravatarOptions {\r\n  /**\r\n   * The domain of the Gravatar service.\r\n   */\r\n  cdn?: string;\r\n  /**\r\n   * Default image to use if the Gravatar does not exist.\r\n   */\r\n  d?: string;\r\n  /**\r\n   * Alias for `d`.\r\n   */\r\n  default?: string;\r\n  /**\r\n   * If set to any value, the default image is always loaded.\r\n   */\r\n  f?: string;\r\n  /**\r\n   * Alias for `f`.\r\n   */\r\n  forcedefault?: string;\r\n  /**\r\n   * The file format of the Gravatar image. It can be 'jpg', 'png', etc.\r\n   */\r\n  format?: string;\r\n  /**\r\n   * The protocol to use for the Gravatar URL. It can be 'http' or 'https'.\r\n   */\r\n  protocol?: 'http' | 'https';\r\n  /**\r\n   * The rating of the Gravatar image. It can be 'g', 'pg', 'r', etc.\r\n   */\r\n  r?: string;\r\n  /**\r\n   * Alias for `r`.\r\n   */\r\n  rating?: string;\r\n  /**\r\n   * The size of the Gravatar image in pixels (1-512).\r\n   */\r\n  s?: string;\r\n  /**\r\n   * Alias for `s`.\r\n   */\r\n  size?: string;\r\n}\r\n\r\n/**\r\n * Gravatar service.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class GravatarService {\r\n  private generateUrl(\r\n    email: string,\r\n    type: 'avatar' | 'profile',\r\n    options: GravatarOptions\r\n  ): string {\r\n    const hash = Md5.hashStr(email.trim().toLowerCase());\r\n    const base = options?.cdn || `//www.gravatar.com/${type}`;\r\n    const params = new URLSearchParams(\r\n      Object.entries(options || {}).reduce((acc, [key, value]) => {\r\n        if (value !== undefined) {\r\n          acc[key as keyof GravatarOptions] = value;\r\n        }\r\n        return acc;\r\n      }, {} as { [key in keyof GravatarOptions]: string })\r\n    ).toString();\r\n\r\n    const proto = options.protocol ? options.protocol + ':' : '';\r\n    return `${proto}${base}/${hash}${\r\n      options?.format ? '.' + options.format : ''\r\n    }${params ? '?' + params : ''}`;\r\n  }\r\n\r\n  /**\r\n   * Builds the URL to the Gravatar avatar corresponding to the specified email\r\n   * address.\r\n   * @param email The email address.\r\n   * @param options The Gravatar options.\r\n   * @param profile True to build the profile URL instead of the avatar URL.\r\n   * @returns The URL or null if the email is not defined.\r\n   */\r\n  public buildGravatarUrl(\r\n    email: string | undefined | null,\r\n    options?: GravatarOptions,\r\n    profile = false\r\n  ): string | null {\r\n    if (!email) {\r\n      return null;\r\n    }\r\n    return this.generateUrl(\r\n      email,\r\n      profile ? 'profile' : 'avatar',\r\n      options || {\r\n        size: '32',\r\n      }\r\n    );\r\n  }\r\n}\r\n","import { Pipe, PipeTransform, inject } from '@angular/core';\r\n\r\nimport { GravatarService } from '../services/gravatar.service';\r\n\r\n/**\r\n * Gravatar pipe.\r\n * Generates a Gravatar URL from an email address.\r\n * @example {{ url | gravatar:32 }}\r\n */\r\n@Pipe({ name: 'gravatar' })\r\nexport class GravatarPipe implements PipeTransform {\r\n  private _gravatar = inject(GravatarService);\r\n\r\n  /**\r\n   * Generates a Gravatar URL from an email address.\r\n   *\r\n   * @param value The email address.\r\n   * @param size The desired size, default 80.\r\n   * @returns The URL to the Gravatar avatar.\r\n   */\r\n  transform(\r\n    value: string | null | undefined,\r\n    size: number = 32,\r\n    rating: string | undefined = undefined,\r\n    protocol: 'http' | 'https' | undefined = undefined,\r\n    profile = false,\r\n    defaultImage: string | undefined = undefined,\r\n    format: string | undefined = undefined,\r\n    cdn: string | undefined = undefined\r\n  ): string | null {\r\n    if (value) {\r\n      return this._gravatar.buildGravatarUrl(\r\n        value,\r\n        {\r\n          cdn,\r\n          default: defaultImage,\r\n          format,\r\n          protocol,\r\n          rating,\r\n          size: size.toString(),\r\n        },\r\n        profile\r\n      );\r\n    } else {\r\n      return null;\r\n    }\r\n  }\r\n}\r\n","/*\r\n * Public API Surface of auth-jwt-login\r\n */\r\n\r\nexport * from './lib/components/auth-jwt-login/auth-jwt-login.component';\r\n\r\nexport * from './lib/services/auth-jwt.service';\r\n\r\nexport * from './lib/services/auth-jwt-admin-guard.service';\r\nexport * from './lib/services/auth-jwt-guard.service';\r\nexport * from './lib/services/auth-jwt.interceptor';\r\n\r\nexport * from './lib/services/jwt-admin-guard';\r\nexport * from './lib/services/jwt-guard';\r\nexport * from './lib/services/jwt.interceptor';\r\n\r\nexport * from './lib/services/gravatar.service';\r\nexport * from './lib/pipes/gravatar.pipe';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}