{"version":3,"file":"c8y-ngx-components-auth-configuration.mjs","sources":["../../auth-configuration/basic-settings/basic-settings.model.ts","../../auth-configuration/basic-settings/basic-auth-settings.component.ts","../../auth-configuration/basic-settings/basic-auth-settings.component.html","../../auth-configuration/auth-configuration.guard.ts","../../auth-configuration/basic-settings/typed-option.ts","../../auth-configuration/basic-settings/tenant-login-option.mapper.ts","../../auth-configuration/basic-settings/auth-configuration.service.ts","../../auth-configuration/basic-settings/login-settings.component.ts","../../auth-configuration/basic-settings/login-settings.component.html","../../auth-configuration/basic-settings/session-configuration.component.ts","../../auth-configuration/basic-settings/session-configuration.component.html","../../auth-configuration/basic-settings/tfa-settings.component.ts","../../auth-configuration/basic-settings/tfa-settings.component.html","../../auth-configuration/basic-settings/auth-configuration.component.ts","../../auth-configuration/basic-settings/auth-configuration.component.html","../../auth-configuration/basic-settings/basic-settings.service.ts","../../auth-configuration/basic-settings/basic-settings.guard.ts","../../auth-configuration/basic-settings/basic-settings.module.ts","../../auth-configuration/sso-configuration/sso-configuration.model.ts","../../auth-configuration/sso-configuration/sso-configuration.service.ts","../../auth-configuration/sso-configuration/template-parts/request-configuration.model.ts","../../auth-configuration/sso-configuration/template-parts/signature-configuration.model.ts","../../auth-configuration/sso-configuration/template-parts/external-token-config.model.ts","../../auth-configuration/sso-configuration/templates/custom-configuration-mapper.ts","../../auth-configuration/sso-configuration/templates/sso-configuration.mapper.ts","../../auth-configuration/sso-configuration/templates/template.component.ts","../../auth-configuration/sso-configuration/template-parts/request-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/request-configuration.component.html","../../auth-configuration/sso-configuration/template-parts/user-id-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/user-id-configuration.component.html","../../auth-configuration/sso-configuration/template-parts/external-token-config.component.ts","../../auth-configuration/sso-configuration/template-parts/external-token-config.component.html","../../auth-configuration/sso-configuration/template-parts/basic-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/basic-configuration.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/paginated-list-group.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/paginated-list-group.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/dynamic-accesss-mapping-relations.model.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/child-predicates.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/child-predicates.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/dynamic-access-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/dynamic-access-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-modal.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-modal.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/access-mapping/access-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/access-mapping/access-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/user-data-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/user-data-mapping.component.html","../../auth-configuration/sso-configuration/template-parts/signature-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/signature-configuration.component.html","../../auth-configuration/sso-configuration/templates/custom-template.component.ts","../../auth-configuration/sso-configuration/templates/custom-template.component.html","../../auth-configuration/sso-configuration/templates/aad-configuration-mapper.ts","../../auth-configuration/sso-configuration/template-parts/logout-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/logout-configuration.component.html","../../auth-configuration/sso-configuration/templates/aad-template.component.ts","../../auth-configuration/sso-configuration/templates/aad-template.component.html","../../auth-configuration/sso-configuration/templates/key-cloak-configuration-mapper.ts","../../auth-configuration/sso-configuration/templates/key-cloak-template.component.ts","../../auth-configuration/sso-configuration/templates/key-cloak-template.component.html","../../auth-configuration/sso-configuration/sso-configuration.component.ts","../../auth-configuration/sso-configuration/sso-configuration.component.html","../../auth-configuration/sso-configuration/sso-configuration.guard.ts","../../auth-configuration/sso-configuration/sso-configuration.module.ts","../../auth-configuration/factories/tabs.factory.ts","../../auth-configuration/factories/navigation.factory.ts","../../auth-configuration/pattern-messages.data.ts","../../auth-configuration/auth-configuration.module.ts","../../auth-configuration/c8y-ngx-components-auth-configuration.ts"],"sourcesContent":["import {\n  IAuthenticationRestrictions,\n  ITenantLoginOption,\n  TenantLoginOptionType\n} from '@c8y/client';\n\nexport interface TenantLoginOption\n  extends Omit<\n    ITenantLoginOption,\n    | 'authenticationRestrictions'\n    | 'self'\n    | 'strengthValidity'\n    | 'tfaStrategy'\n    | 'greenMinLength'\n    | 'enforceStrength'\n    | 'strengthValidity'\n    | '_type'\n  > {\n  authenticationRestrictions?: AuthenticationRestrictions;\n}\n\nexport interface AuthenticationRestrictions\n  extends Omit<IAuthenticationRestrictions, 'trustedUserAgents' | 'forbiddenUserAgents'> {\n  trustedUserAgents: UserAgent[];\n  forbiddenUserAgents: UserAgent[];\n}\n\nexport class UserAgent {\n  readonly _id: string;\n  value: string;\n\n  constructor(value: string) {\n    this._id = this.uniqueId();\n    this.value = value;\n  }\n\n  get id() {\n    return this._id;\n  }\n\n  private uniqueId() {\n    const dateString = Date.now().toString(36);\n    const randomString = Math.random().toString(36).substr(2);\n    return dateString + randomString;\n  }\n}\n\nexport function isOauthInternal(tenantLoginOption: TenantLoginOption) {\n  return tenantLoginOption.type === TenantLoginOptionType.OAUTH2_INTERNAL;\n}\n\nexport function isBasic(tenantLoginOption: TenantLoginOption) {\n  return tenantLoginOption.type === TenantLoginOptionType.BASIC;\n}\n","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { TenantLoginOptionType } from '@c8y/client';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport { UserAgent, AuthenticationRestrictions, isBasic } from './basic-settings.model';\nimport { NgIf, NgFor } from '@angular/common';\nimport { FormGroupComponent, C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-basic-auth-settings',\n  templateUrl: './basic-auth-settings.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [NgIf, FormGroupComponent, FormsModule, NgFor, C8yTranslatePipe]\n})\nexport class BasicAuthSettingsComponent {\n  @Input()\n  authConfiguration: AuthConfiguration;\n\n  preferredLoginOptionType: TenantLoginOptionType = TenantLoginOptionType.BASIC;\n\n  tenantLoginOptionTypeEnum = TenantLoginOptionType;\n\n  constructor(private controlContainer: ControlContainer) {}\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n      this.preferredLoginOptionType =\n        changes.authConfiguration.currentValue.preferredLoginOptionType;\n    }\n  }\n\n  ngDoCheck() {\n    if (this.preferredLoginOptionType !== this.authConfiguration.preferredLoginOptionType) {\n      this.preferredLoginOptionType = this.authConfiguration.preferredLoginOptionType;\n      if (this.preferredLoginOptionType === TenantLoginOptionType.BASIC) {\n        this.forbiddenWebBrowsers = false;\n      }\n    }\n  }\n\n  get forbiddenWebBrowsers() {\n    return this.authenticationRestrictions.forbiddenClients.includes('WEB_BROWSERS');\n  }\n\n  set forbiddenWebBrowsers(value: boolean) {\n    this.authenticationRestrictions.forbiddenClients = value ? ['WEB_BROWSERS'] : [];\n  }\n\n  forbiddenUserAgentsRemove(id) {\n    this.authenticationRestrictions.forbiddenUserAgents = this.remove(\n      this.authenticationRestrictions.forbiddenUserAgents,\n      id\n    );\n    this.controlContainer.control.markAsDirty();\n  }\n\n  trustedUserAgentsRemove(id) {\n    this.authenticationRestrictions.trustedUserAgents = this.remove(\n      this.authenticationRestrictions.trustedUserAgents,\n      id\n    );\n    this.controlContainer.control.markAsDirty();\n  }\n\n  get authenticationRestrictions(): AuthenticationRestrictions {\n    return this.authConfiguration.loginOptions.find(isBasic).authenticationRestrictions;\n  }\n\n  add(collection) {\n    collection.push(new UserAgent(''));\n  }\n\n  private remove(collection, id) {\n    const newArray = collection.filter(obj => obj.id !== id);\n    if (!newArray.length) {\n      newArray.push(new UserAgent(''));\n    }\n    return newArray;\n  }\n}\n","<div\n  class=\"card-block separator-top\"\n  *ngIf=\"authConfiguration.preferredLoginOptionType !== 'BASIC'\"\n>\n  <div class=\"col-sm-2\">\n    <div class=\"h4 text-normal text-right text-left-xs\">\n      {{ 'Basic Auth restrictions' | translate }}\n    </div>\n  </div>\n\n  <div class=\"col-sm-9\">\n    <div class=\"row\">\n      <div class=\"col-sm-6\">\n        <c8y-form-group>\n          <label class=\"c8y-switch\" title=\"{{ 'Forbidden for web browsers' | translate }}\">\n            <input type=\"checkbox\" name=\"forbiddenWebBrowsers\" [(ngModel)]=\"forbiddenWebBrowsers\" />\n            <span></span>\n            <span>{{ 'Forbidden for web browsers' | translate }}</span>\n          </label>\n          <div\n            class=\"alert alert-warning\"\n            *ngIf=\"\n              preferredLoginOptionType === tenantLoginOptionTypeEnum.BASIC && forbiddenWebBrowsers\n            \"\n          >\n            {{\n              'You are about to forbid browsers from using Basic authentication. This will prevent users from using web applications on your tenant because you are going to set Basic authentication as the preferred login mode.'\n                | translate\n            }}\n          </div>\n        </c8y-form-group>\n      </div>\n    </div>\n\n    <div class=\"row\">\n      <div class=\"col-sm-6\">\n        <label title=\"{{ 'Forbidden user agents' | translate }}\">\n          {{ 'Forbidden user agents' | translate }}\n        </label>\n        <div\n          class=\"input-group m-t-8\"\n          *ngFor=\"\n            let forbiddenUserAgent of authenticationRestrictions.forbiddenUserAgents;\n            last as isLast;\n            first as isFirst\n          \"\n        >\n          <input\n            type=\"text\"\n            [name]=\"'forbiddenUserAgent' + forbiddenUserAgent.id\"\n            [(ngModel)]=\"forbiddenUserAgent.value\"\n            class=\"form-control\"\n            data-cy=\"c8y-basic-auth--forbidden-agent\"\n            placeholder=\"{{ 'e.g.' | translate }} forbidden-agent\"\n          />\n          <div class=\"input-group-btn col-sm-2\">\n            <button\n              *ngIf=\"!(isFirst && isLast && forbiddenUserAgent.value === '')\"\n              title=\"{{ 'Remove' | translate }}\"\n              [name]=\"'forbiddenUserAgentRemove' + forbiddenUserAgent.id\"\n              type=\"button\"\n              class=\"btn btn-dot text-primary\"\n              (click)=\"forbiddenUserAgentsRemove(forbiddenUserAgent.id)\"\n            >\n              <i class=\"dlt-c8y-icon-minus-circle text-danger\"></i>\n            </button>\n            <button\n              title=\"{{ 'Add' | translate }}\"\n              type=\"button\"\n              class=\"btn btn-dot text-primary\"\n              (click)=\"add(authenticationRestrictions.forbiddenUserAgents)\"\n              *ngIf=\"isLast\"\n            >\n              <i class=\"dlt-c8y-icon-plus-circle\"></i>\n            </button>\n          </div>\n        </div>\n      </div>\n      <div class=\"col-sm-6\">\n        <label title=\"{{ 'Trusted user agents' | translate }}\">\n          {{ 'Trusted user agents' | translate }}\n        </label>\n        <div\n          class=\"input-group m-t-8\"\n          *ngFor=\"\n            let trustedUserAgent of authenticationRestrictions.trustedUserAgents;\n            last as isLast;\n            first as isFirst\n          \"\n        >\n          <input\n            type=\"text\"\n            [name]=\"'trustedUserAgent' + trustedUserAgent.id\"\n            class=\"form-control\"\n            placeholder=\"{{ 'e.g.' | translate }} trusted-agent\"\n            data-cy=\"c8y-basic-auth--trusted-agent\"\n            [(ngModel)]=\"trustedUserAgent.value\"\n          />\n          <div class=\"input-group-btn col-sm-2\">\n            <button\n              *ngIf=\"!(isFirst && isLast && trustedUserAgent.value === '')\"\n              title=\"{{ 'Remove' | translate }}\"\n              [name]=\"'trustedUserAgentRemove' + trustedUserAgent.id\"\n              type=\"button\"\n              class=\"btn btn-dot btn-dot--danger text-primary\"\n              (click)=\"trustedUserAgentsRemove(trustedUserAgent.id)\"\n            >\n              <i class=\"dlt-c8y-icon-minus-circle\"></i>\n            </button>\n            <button\n              title=\"{{ 'Add' | translate }}\"\n              type=\"button\"\n              (click)=\"add(authenticationRestrictions.trustedUserAgents)\"\n              class=\"btn btn-dot text-primary\"\n              *ngIf=\"isLast\"\n            >\n              <i class=\"dlt-c8y-icon-plus-circle\"></i>\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n","import { Injectable } from '@angular/core';\n\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable()\nexport class AuthConfigurationGuard {\n  constructor(private permissions: Permissions) {}\n\n  canActivate(): boolean {\n    return this.permissions.hasAnyRole([\n      Permissions.ROLE_TENANT_ADMIN,\n      Permissions.ROLE_TENANT_MANAGEMENT_ADMIN\n    ]);\n  }\n}\n","import { ISystemOption, ITenantOption } from '@c8y/client';\nimport { isString } from 'lodash-es';\n\nexport class TypedOption implements ISystemOption, ITenantOption {\n  constructor(\n    public category: string,\n    public key: string,\n    public type: 'string' | 'boolean' | 'number',\n    public defaultValue?: string | boolean | number,\n    public value?: string\n  ) {}\n\n  apply(option: ISystemOption | ITenantOption) {\n    this.category = option.category;\n    this.key = option.key;\n    this.value = option.value;\n  }\n\n  getValue() {\n    try {\n      return this.getValueByType();\n    } catch (ex) {\n      return this.defaultValue;\n    }\n  }\n\n  private getValueByType() {\n    switch (this.type) {\n      case 'boolean':\n        return this.value.toLowerCase() === 'true';\n      case 'number':\n        return this.parseNumberValue(this.value);\n      case 'string':\n        return this.parseStringValue(this.value);\n      default:\n        throw new TypeError();\n    }\n  }\n\n  private parseNumberValue(stringValue: string) {\n    const value = Number.parseInt(stringValue, 10);\n    if (typeof value !== 'number' || isNaN(value)) {\n      throw new Error();\n    }\n    return value;\n  }\n\n  private parseStringValue(value: string) {\n    if (!isString(value)) {\n      throw new Error();\n    }\n    return value;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport {\n  UserAgent,\n  AuthenticationRestrictions,\n  TenantLoginOption,\n  isBasic,\n  isOauthInternal\n} from './basic-settings.model';\nimport { ITenantLoginOption, IAuthenticationRestrictions } from '@c8y/client';\nimport { defaults, isEmpty, omitBy, omit } from 'lodash-es';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class TenantLoginOptionMapper {\n  mapTo(tenantLoginOption: ITenantLoginOption): TenantLoginOption {\n    const loginOption: TenantLoginOption = omit(\n      this.prapareTenantLoginOption(tenantLoginOption),\n      'authenticationRestrictions'\n    );\n    if (isBasic(loginOption)) {\n      loginOption.authenticationRestrictions = this.mapAuthenticationRestrictionsTo(\n        tenantLoginOption.authenticationRestrictions\n      );\n    }\n    return loginOption;\n  }\n\n  mapFrom(\n    originalLoginOption: TenantLoginOption,\n    newLoginOption: TenantLoginOption\n  ): ITenantLoginOption {\n    if (isBasic(originalLoginOption)) {\n      return this.mapBasicLoginOption(originalLoginOption, newLoginOption);\n    }\n    if (isOauthInternal(originalLoginOption)) {\n      return this.mapOauthInternalLoginOption(originalLoginOption, newLoginOption);\n    }\n    throw new Error(\n      `TenantLoginOptionMapper: The tenant login option cannot be mapped. Login option with type: ${originalLoginOption.type} is not supported.`\n    );\n  }\n\n  private mapAuthenticationRestrictionsTo(\n    authenticationRestrictions: IAuthenticationRestrictions\n  ): AuthenticationRestrictions {\n    const restrictions = defaults({}, omitBy(authenticationRestrictions, isEmpty), {\n      forbiddenUserAgents: [''],\n      trustedUserAgents: [''],\n      forbiddenClients: []\n    });\n    restrictions.forbiddenUserAgents = restrictions.forbiddenUserAgents.map(\n      val => new UserAgent(val)\n    );\n    restrictions.trustedUserAgents = restrictions.trustedUserAgents.map(val => new UserAgent(val));\n    return restrictions;\n  }\n\n  private mapBasicLoginOption(\n    originalLoginOption: TenantLoginOption,\n    newLoginOption: TenantLoginOption\n  ) {\n    const loginOption = omit(originalLoginOption, ['sessionConfiguration']);\n    loginOption.authenticationRestrictions = this.mapAuthenticationRestrictionsFrom(\n      newLoginOption.authenticationRestrictions\n    );\n    return loginOption;\n  }\n\n  private mapOauthInternalLoginOption(\n    originalLoginOption: TenantLoginOption,\n    newLoginOption: TenantLoginOption\n  ) {\n    const loginOption = omit(originalLoginOption, ['authenticationRestrictions']);\n    newLoginOption.sessionConfiguration !== null\n      ? (loginOption.sessionConfiguration = newLoginOption.sessionConfiguration)\n      : delete loginOption.sessionConfiguration;\n    return loginOption;\n  }\n\n  private mapAuthenticationRestrictionsFrom(\n    authenticationRestrictions: AuthenticationRestrictions\n  ): IAuthenticationRestrictions {\n    return {\n      trustedUserAgents: authenticationRestrictions.trustedUserAgents\n        .filter(({ value }) => value)\n        .map(({ value }) => value),\n      forbiddenUserAgents: authenticationRestrictions.forbiddenUserAgents\n        .filter(({ value }) => value)\n        .map(({ value }) => value),\n      forbiddenClients: authenticationRestrictions.forbiddenClients.filter(value => value)\n    };\n  }\n\n  private prapareTenantLoginOption(tenantLoginOption: ITenantLoginOption): TenantLoginOption {\n    return omit(tenantLoginOption, [\n      'self',\n      'strengthValidity',\n      'tfaStrategy',\n      'greenMinLength',\n      'enforceStrength',\n      'strengthValidity',\n      '_type'\n    ]);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport {\n  GrantType,\n  IResult,\n  ITenantLoginOption,\n  ITenantOption,\n  SystemOptionsService,\n  TenantLoginOptionsService,\n  TenantLoginOptionType,\n  TenantOptionsService,\n  TenantService,\n  TfaStrategy,\n  UserManagementSource\n} from '@c8y/client';\nimport { catchError, map } from 'rxjs/operators';\nimport { forkJoin, from, Observable, of } from 'rxjs';\nimport { defaults } from 'lodash-es';\nimport { AuthConfiguration, Options } from './auth-configuration.model';\nimport { AppStateService, TenantUiService } from '@c8y/ngx-components';\nimport { TypedOption } from './typed-option';\nimport { TenantLoginOption } from './basic-settings.model';\nimport { TenantLoginOptionMapper } from './tenant-login-option.mapper';\n\n@Injectable()\nexport class AuthConfigurationService {\n  private systemOptionsWithDefaultValue: TypedOption[] = [\n    new TypedOption('password', 'limit.validity', 'number', null),\n    new TypedOption('password', 'enforce.strength', 'boolean', false),\n    new TypedOption('two-factor-authentication', 'tenant-scope-settings.enabled', 'boolean', false),\n    new TypedOption('two-factor-authentication', 'enabled', 'boolean', false),\n    // note: this definition is inconsistent with backend and is overridden in getSystemOptions$\n    new TypedOption('two-factor-authentication', 'enforced', 'boolean', false),\n    new TypedOption('two-factor-authentication', 'enforced.group', 'string', '')\n  ];\n\n  private tenantOptionsWithDefaultValue: TypedOption[] = [\n    new TypedOption('password', 'limit.validity', 'number', 0),\n    new TypedOption('password', 'strength.validity', 'boolean', false),\n    new TypedOption('two-factor-authentication', 'enabled', 'boolean', false),\n    new TypedOption('two-factor-authentication', 'token.validity', 'number', 43200), // 30 days\n    new TypedOption('two-factor-authentication', 'pin.validity', 'number', 30),\n    new TypedOption('two-factor-authentication', 'enforced', 'boolean', false),\n    new TypedOption('two-factor-authentication', 'strategy', 'string', 'SMS'),\n    new TypedOption('oauth.internal', 'basic-token.lifespan.seconds', 'number', null),\n    new TypedOption('configuration', 'tenant.login.ignore-case', 'boolean', false)\n  ];\n\n  constructor(\n    private tenantLoginOptionsService: TenantLoginOptionsService,\n    private tenantOptionsService: TenantOptionsService,\n    private systemOptionsService: SystemOptionsService,\n    private appState: AppStateService,\n    private tenantUiService: TenantUiService,\n    private tenantLoginOptionMapper: TenantLoginOptionMapper,\n    private tenantService: TenantService\n  ) {}\n\n  getAuthConfiguration$(): Observable<AuthConfiguration> {\n    const loginOptions$ = this.getLoginOptions$();\n    return forkJoin({\n      loginOptions: this.map(loginOptions$),\n      tenantOptions: this.getTenantOptions$(),\n      systemOptions: this.getSystemOptions$(),\n      smsGatewayAvailable: this.isSmsApplicationAvailable$(),\n      preferredLoginOptionType: this.getPreferredLoginOptionType$(loginOptions$)\n    });\n  }\n\n  save(newAuthConfiguration: AuthConfiguration, previousAuthConfiguration: AuthConfiguration) {\n    const tenantOptions = this.prepareTenantOptions(\n      newAuthConfiguration,\n      previousAuthConfiguration\n    );\n    const updateTenantOptions = tenantOptions.map(tenantOption => {\n      const fixedOption = this.fixTfaStrategy(tenantOption);\n      if (fixedOption) {\n        return fixedOption;\n      }\n      return this.tenantOptionsService.create(tenantOption);\n    });\n    const basicLoginOption = this.prepareBasicLoginOption(\n      newAuthConfiguration,\n      previousAuthConfiguration\n    );\n    const oauthInternalLoginOption = this.prepareOauthInternalLoginOption(\n      newAuthConfiguration,\n      previousAuthConfiguration\n    );\n\n    return Promise.all([\n      this.saveOrUpdateLoginOption(basicLoginOption),\n      this.saveOrUpdateLoginOption(oauthInternalLoginOption),\n      ...updateTenantOptions\n    ]);\n  }\n\n  private map(loginOptions$: Observable<ITenantLoginOption[]>): Observable<TenantLoginOption[]> {\n    return loginOptions$.pipe(\n      map(loginOptions =>\n        loginOptions.map(loginOption => this.tenantLoginOptionMapper.mapTo(loginOption))\n      )\n    );\n  }\n\n  private saveOrUpdateLoginOption(\n    loginOption: ITenantLoginOption\n  ): Promise<IResult<ITenantLoginOption>> {\n    return loginOption.id\n      ? this.tenantLoginOptionsService.update(loginOption)\n      : this.tenantLoginOptionsService.create(loginOption);\n  }\n\n  private prepareBasicLoginOption(\n    newAuthConfiguration: AuthConfiguration,\n    previousAuthConfiguration: AuthConfiguration\n  ): ITenantLoginOption {\n    const basicLoginOption = this.originalLoginOptionWithDefaults(\n      previousAuthConfiguration,\n      TenantLoginOptionType.BASIC\n    );\n    basicLoginOption.visibleOnLoginPage = this.visibleOnLoginPage(\n      newAuthConfiguration,\n      TenantLoginOptionType.BASIC\n    );\n    return this.tenantLoginOptionMapper.mapFrom(\n      basicLoginOption,\n      this.getLoginOptionFromAuthConfiguration(newAuthConfiguration, TenantLoginOptionType.BASIC)\n    );\n  }\n\n  private prepareOauthInternalLoginOption(\n    newAuthConfiguration: AuthConfiguration,\n    previousAuthConfiguration: AuthConfiguration\n  ): ITenantLoginOption {\n    const oauthInternalLoginOption = this.originalLoginOptionWithDefaults(\n      previousAuthConfiguration,\n      TenantLoginOptionType.OAUTH2_INTERNAL\n    );\n    oauthInternalLoginOption.visibleOnLoginPage = this.visibleOnLoginPage(\n      newAuthConfiguration,\n      TenantLoginOptionType.OAUTH2_INTERNAL\n    );\n    return this.tenantLoginOptionMapper.mapFrom(\n      oauthInternalLoginOption,\n      this.getLoginOptionFromAuthConfiguration(\n        newAuthConfiguration,\n        TenantLoginOptionType.OAUTH2_INTERNAL\n      )\n    );\n  }\n\n  private originalLoginOptionWithDefaults(\n    previousAuthConfiguration: AuthConfiguration,\n    loginOptionType: TenantLoginOptionType\n  ): TenantLoginOption {\n    return defaults(\n      {},\n      this.getLoginOptionFromAuthConfiguration(previousAuthConfiguration, loginOptionType),\n      this.getDefaultLoginOption(loginOptionType)\n    );\n  }\n\n  private getLoginOptionFromAuthConfiguration(\n    authConfiguration: AuthConfiguration,\n    loginOptionType: TenantLoginOptionType\n  ) {\n    return authConfiguration.loginOptions.find(loginOption => loginOption.type === loginOptionType);\n  }\n\n  private visibleOnLoginPage(\n    authConfiguration: AuthConfiguration,\n    loginOptionType: TenantLoginOptionType\n  ): boolean {\n    return authConfiguration.preferredLoginOptionType === loginOptionType;\n  }\n\n  private prepareTenantOptions(\n    newAuthConfiguration: AuthConfiguration,\n    previousAuthConfiguration: AuthConfiguration\n  ): ITenantOption[] {\n    const getValue = (authCfg, tenantOption) =>\n      authCfg.tenantOptions[tenantOption.category][tenantOption.key];\n    const hasChanged = tenantOption =>\n      getValue(newAuthConfiguration, tenantOption) !==\n      getValue(previousAuthConfiguration, tenantOption);\n\n    return this.tenantOptionsWithDefaultValue\n      .filter(tenantOption => getValue(newAuthConfiguration, tenantOption) !== null)\n      .filter(tenantOption => hasChanged(tenantOption))\n      .map(tenantOption => ({\n        category: tenantOption.category,\n        key: tenantOption.key,\n        value: getValue(newAuthConfiguration, tenantOption).toString()\n      }));\n  }\n\n  private getLoginOptions$(): Observable<ITenantLoginOption[]> {\n    return forkJoin([\n      this.getLoginOption(TenantLoginOptionType.OAUTH2),\n      this.getLoginOption(TenantLoginOptionType.BASIC),\n      this.getLoginOption(TenantLoginOptionType.OAUTH2_INTERNAL)\n    ]).pipe(map(loginOptions => loginOptions.filter(loginOption => !!loginOption)));\n  }\n\n  private getLoginOption(\n    tenantLoginOptionType: TenantLoginOptionType\n  ): Observable<ITenantLoginOption> {\n    return from(this.tenantLoginOptionsService.detail(tenantLoginOptionType)).pipe(\n      map(res => res.data),\n      catchError(() =>\n        tenantLoginOptionType !== TenantLoginOptionType.OAUTH2\n          ? of(this.getDefaultLoginOption(tenantLoginOptionType))\n          : of(null)\n      )\n    );\n  }\n\n  private getPreferredLoginOptionType$(\n    loginOptions$: Observable<ITenantLoginOption[]>\n  ): Observable<TenantLoginOptionType> {\n    return loginOptions$.pipe(\n      map(loginOptions => {\n        return this.tenantUiService.getPreferredLoginOption(loginOptions).type;\n      })\n    );\n  }\n\n  private getTenantOptions$(): Observable<Options> {\n    return forkJoin(\n      this.tenantOptionsWithDefaultValue.map((option: TypedOption) =>\n        from(this.tenantOptionsService.detail(option)).pipe(\n          map(res => {\n            option.apply(res.data);\n            return option;\n          }),\n          catchError(() => of(option))\n        )\n      )\n    ).pipe(map(options => this.getOptionsObject(options)));\n  }\n\n  private getSystemOptions$(): Observable<Options> {\n    return forkJoin(\n      this.systemOptionsWithDefaultValue.map((option: TypedOption) => {\n        const fixedOption = this.fixTfaEnforcedSystemOption(option);\n        if (fixedOption) {\n          return fixedOption;\n        }\n\n        return from(this.systemOptionsService.detail(option)).pipe(\n          map(res => {\n            option.apply(res.data);\n            return option;\n          }),\n          catchError(() => of(option))\n        );\n      })\n    ).pipe(map(options => this.getOptionsObject(options)));\n  }\n\n  /**\n   * Returns an observable with fixed `two-factor-authentication.enforced` system option or null.\n   * This method fixes problem with inconsistent value. System option `two-factor-authentication.enforced` is list of tenants when UI using boolean value.\n   * This part will be removed after implementing new endpoint in MTM-50490.\n   */\n  private fixTfaEnforcedSystemOption(option: TypedOption): Observable<TypedOption> {\n    if (option.category === 'two-factor-authentication' && option.key === 'enforced') {\n      return from(this.tenantService.getTfaSettings(this.tenantUiService.currentTenant)).pipe(\n        map(tfaSettings => {\n          option.value = tfaSettings.enforcedOnSystemLevel.toString();\n          return option;\n        })\n      );\n    }\n    return null;\n  }\n\n  /**\n   * Returns a promise or null.\n   * This method is needed now, because simply changing TFA strategy tenant option does not trigger all the necessary backend logic to apply the change, therefore, we need to call tenant's `/tfa` endpoint, which applies the change for all users in the tenant.\n   * Within MTM-50490, we're going to simplify the process further by replacing multiple requests with one new endpoint that will handle saving of all authentication settings.\n   */\n  private fixTfaStrategy(option: ITenantOption): Promise<IResult<null>> {\n    if (option.category === 'two-factor-authentication' && option.key === 'strategy') {\n      const strategy: TfaStrategy = option.value === 'SMS' ? TfaStrategy.SMS : TfaStrategy.TOTP;\n      return this.tenantService.updateTfaStrategy(this.tenantUiService.currentTenant, strategy);\n    }\n    return null;\n  }\n\n  private isSmsApplicationAvailable$(): Observable<boolean> {\n    return from(this.appState.isApplicationAvailable('sms-gateway'));\n  }\n\n  private getOptionsObject(options: TypedOption[]) {\n    return options.reduce((optionsObject, option) => {\n      optionsObject[option.category] = optionsObject[option.category] || {};\n      optionsObject[option.category][option.key] = option.getValue();\n      return optionsObject;\n    }, {});\n  }\n\n  private getDefaultLoginOption(tenantLoginOptionType: TenantLoginOptionType): ITenantLoginOption {\n    return {\n      userManagementSource: UserManagementSource.INTERNAL,\n      grantType: GrantType.PASSWORD,\n      providerName: 'Cumulocity',\n      visibleOnLoginPage: false,\n      type: tenantLoginOptionType\n    };\n  }\n}\n","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  TenantUiService,\n  FormGroupComponent,\n  C8yTranslateDirective,\n  RequiredInputPlaceholderDirective,\n  MinValidationDirective,\n  MaxValidationDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { TenantLoginOptionType } from '@c8y/client';\nimport { NgIf } from '@angular/common';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\n\n@Component({\n  selector: 'c8y-login-settings',\n  templateUrl: './login-settings.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    NgIf,\n    FormGroupComponent,\n    PopoverDirective,\n    FormsModule,\n    C8yTranslateDirective,\n    RequiredInputPlaceholderDirective,\n    MinValidationDirective,\n    MaxValidationDirective,\n    C8yTranslatePipe\n  ]\n})\nexport class LoginSettingsComponent {\n  PREFERRED_LOGIN_MODE_POPOVER = gettext(\n    'Main difference is the storage of the authentication information. With Basic Auth, it is saved in a session storage and with OAI-Secure in a HttpOnly cookie. OAI-Secure grant is recommended as the authentication information is not accessible via JavaScript. Single sign-on redirect allows a user to login with a single 3rd-party authorization server using the OAuth2 protocol.'\n  );\n  ENFORCED_BY_PLATFORM_POPOVER = gettext('The setting is enforced on the platform level.');\n  IGNORE_CASE_SENSITIVITY_POPOVER = gettext(\n    'If selected, the letter case of the username does not matter during login.'\n  );\n\n  @Input()\n  authConfiguration: AuthConfiguration;\n\n  isOauth2: boolean;\n  tenantLoginOptionTypeEnum = TenantLoginOptionType;\n\n  private PASSWORD_CATEGORY = 'password';\n  private LIMIT_VALIDITY_KEY = 'limit.validity';\n  private TENANT_STRENGTH_VALIDITY_KEY = 'strength.validity';\n  private SYSTEM_STRENGTH_VALIDITY_KEY = 'enforce.strength';\n\n  constructor(private tenantUiService: TenantUiService) {}\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n      this.isOauth2 = !!changes.authConfiguration.currentValue.loginOptions.find(\n        this.tenantUiService.isOauth2\n      );\n    }\n  }\n\n  get systemPasswordLimitValidity() {\n    return this.authConfiguration.systemOptions[this.PASSWORD_CATEGORY][this.LIMIT_VALIDITY_KEY];\n  }\n\n  get passwordLimitValidity() {\n    return this.systemPasswordLimitValidity !== null\n      ? this.systemPasswordLimitValidity\n      : this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][this.LIMIT_VALIDITY_KEY];\n  }\n\n  set passwordLimitValidity(value) {\n    if (this.systemPasswordLimitValidity === null) {\n      this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][this.LIMIT_VALIDITY_KEY] = value;\n    }\n  }\n\n  get systemPasswordEnforceStrength() {\n    return this.authConfiguration.systemOptions[this.PASSWORD_CATEGORY][\n      this.SYSTEM_STRENGTH_VALIDITY_KEY\n    ];\n  }\n\n  get passwordEnforceStrength() {\n    return this.systemPasswordEnforceStrength\n      ? this.systemPasswordEnforceStrength\n      : this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][\n          this.TENANT_STRENGTH_VALIDITY_KEY\n        ];\n  }\n\n  set passwordEnforceStrength(value) {\n    if (!this.systemPasswordEnforceStrength) {\n      this.authConfiguration.tenantOptions[this.PASSWORD_CATEGORY][\n        this.TENANT_STRENGTH_VALIDITY_KEY\n      ] = value;\n    }\n  }\n\n  get tenantLoginIgnoreCase() {\n    return this.authConfiguration.tenantOptions['configuration']['tenant.login.ignore-case'];\n  }\n\n  set tenantLoginIgnoreCase(value) {\n    this.authConfiguration.tenantOptions['configuration']['tenant.login.ignore-case'] = value;\n  }\n}\n","<div class=\"card-block separator-top overflow-auto\" *ngIf=\"authConfiguration\">\n  <div class=\"col-sm-2\">\n    <div class=\"h4 text-normal text-right text-left-xs\">{{ 'Login settings' | translate }}</div>\n  </div>\n\n  <div class=\"col-sm-9\">\n    <div class=\"row m-b-8\">\n      <c8y-form-group class=\"col-sm-6\">\n        <label>\n          {{ 'Preferred login mode' | translate }}\n          <button\n            class=\"btn-help btn-help--sm\"\n            type=\"button\"\n            [attr.aria-label]=\"'Help' | translate\"\n            popover=\"{{ PREFERRED_LOGIN_MODE_POPOVER | translate }}\"\n            placement=\"right\"\n            triggers=\"focus\"\n            container=\"body\"\n          ></button>\n        </label>\n        <div class=\"c8y-select-wrapper\">\n          <select\n            [attr.aria-label]=\"'Auth type' | translate\"\n            class=\"form-control\"\n            id=\"preferredLoginOptionType\"\n            name=\"preferredLoginOptionType\"\n            [(ngModel)]=\"authConfiguration.preferredLoginOptionType\"\n          >\n            <option value=\"{{ tenantLoginOptionTypeEnum.BASIC }}\" translate>Basic Auth</option>\n            <option value=\"{{ tenantLoginOptionTypeEnum.OAUTH2_INTERNAL }}\" translate>\n              OAI-Secure\n            </option>\n            <option value=\"{{ tenantLoginOptionTypeEnum.OAUTH2 }}\" [disabled]=\"!isOauth2\" translate>\n              Single sign-on redirect\n            </option>\n          </select>\n        </div>\n      </c8y-form-group>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-sm-6\">\n        <c8y-form-group>\n          <label title=\"{{ 'Password validity limit' | translate }}\">\n            {{ 'Password validity limit' | translate }}\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{ ENFORCED_BY_PLATFORM_POPOVER | translate }}\"\n              placement=\"bottom\"\n              triggers=\"focus\"\n              *ngIf=\"systemPasswordLimitValidity\"\n            ></button>\n          </label>\n          <div class=\"input-group\">\n            <input\n              type=\"number\"\n              name=\"passwordLimitValidity\"\n              class=\"form-control text-right\"\n              [(ngModel)]=\"passwordLimitValidity\"\n              min=\"0\"\n              max=\"999999\"\n              step=\"1\"\n              required\n              [disabled]=\"systemPasswordLimitValidity\"\n            />\n            <span class=\"input-group-addon\" translate>days</span>\n          </div>\n          <p class=\"help-block\">\n            {{ 'Default: 0 (unlimited validity)' | translate }}\n          </p>\n        </c8y-form-group>\n      </div>\n      <div class=\"col-sm-6\">\n        <c8y-form-group>\n          <label title=\"{{ 'Password strength' | translate }}\">\n            {{ 'Password strength' | translate }}\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{ ENFORCED_BY_PLATFORM_POPOVER | translate }}\"\n              placement=\"bottom\"\n              triggers=\"focus\"\n              *ngIf=\"systemPasswordEnforceStrength\"\n            ></button>\n          </label>\n          <div>\n            <label\n              title=\"{{ 'Enforce that all passwords are strong' | translate }}\"\n              class=\"c8y-switch\"\n            >\n              <input\n                type=\"checkbox\"\n                name=\"passwordEnforceStrength\"\n                data-cy=\"c8y-form-group--password-enforce-toggle-btn\"\n                [(ngModel)]=\"passwordEnforceStrength\"\n                [disabled]=\"systemPasswordEnforceStrength\"\n              />\n              <span></span>\n              <span>{{ 'Enforce strong passwords (green)' | translate }}</span>\n            </label>\n          </div>\n        </c8y-form-group>\n      </div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-sm-6\">\n        <c8y-form-group>\n          <label\n            title=\"{{ 'Ignore case when logging in' | translate }}\"\n            data-cy=\"c8y-authentication-configuration--ignore-case-when-logging-in\"\n            class=\"c8y-switch\"\n          >\n            <input\n              type=\"checkbox\"\n              name=\"tenantLoginIgnoreCase\"\n              [(ngModel)]=\"tenantLoginIgnoreCase\"\n            />\n            <span></span>\n            <span>{{ 'Ignore case when logging in' | translate }}</span>\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{ IGNORE_CASE_SENSITIVITY_POPOVER | translate }}\"\n              placement=\"right\"\n              triggers=\"focus\"\n              container=\"body\"\n            ></button>\n          </label>\n        </c8y-form-group>\n      </div>\n    </div>\n  </div>\n</div>\n","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { ISessionConfiguration, TenantLoginOptionType } from '@c8y/client';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport { defaults, cloneDeep, isFinite } from 'lodash-es';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  TenantUiService,\n  FormGroupComponent,\n  RequiredInputPlaceholderDirective,\n  MinValidationDirective,\n  C8yTranslateDirective,\n  MessagesComponent,\n  MessageDirective,\n  MaxValidationDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isOauthInternal } from './basic-settings.model';\nimport { NgIf } from '@angular/common';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\n\n@Component({\n  selector: 'c8y-session-configuration',\n  templateUrl: './session-configuration.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    NgIf,\n    FormGroupComponent,\n    FormsModule,\n    PopoverDirective,\n    RequiredInputPlaceholderDirective,\n    MinValidationDirective,\n    C8yTranslateDirective,\n    MessagesComponent,\n    MessageDirective,\n    MaxValidationDirective,\n    C8yTranslatePipe\n  ]\n})\nexport class SessionConfigurationComponent {\n  @Input()\n  authConfiguration: AuthConfiguration;\n  tenantLoginOptionTypeEnum = TenantLoginOptionType;\n  ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE = gettext(\n    'The value must be greater than \"Token lifespan\" and not less than {{ minAbsoluteTimeout }}.'\n  );\n  RENEWAL_TIMEOUT_VALIDATION_MESSAGE = gettext('The value must be less than \"Token lifespan\".');\n  MAX_TOKEN_LIFESPAN_VALIDATION_MESSAGE = gettext(\n    'The value must be less than \"Session absolute timeout\".'\n  );\n  MIN_TOKEN_LIFESPAN_VALIDATION_MESSAGE = gettext(\n    'The value must be greater than \"Session renewal timeout\".'\n  );\n\n  USER_AGENT_VALIDATION_REQUIRED_POPOVER = gettext(\n    'If selected, then every request needs to use the same \"User-Agent\" header as the first request which initiated the session.'\n  );\n\n  private MIN_ABSOLUTE_TIMEOUT: number = 15 * 60;\n  private originalSessionConfiguration;\n  private previousTokenLifespan;\n\n  constructor(\n    private tenantUiService: TenantUiService,\n    private translateService: TranslateService\n  ) {\n    this.ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE = this.translateService.instant(\n      this.ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE,\n      { minAbsoluteTimeout: this.MIN_ABSOLUTE_TIMEOUT }\n    );\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n      const oauthInternal =\n        changes.authConfiguration.currentValue.loginOptions.find(isOauthInternal) || {};\n      this.originalSessionConfiguration = cloneDeep(oauthInternal.sessionConfiguration);\n      this.sessionConfiguration = oauthInternal.sessionConfiguration;\n      this.previousTokenLifespan =\n        this.authConfiguration.tenantOptions['oauth.internal']['basic-token.lifespan.seconds'];\n    }\n  }\n\n  get renewalTimeoutSeconds(): number {\n    const sessionConfiguration = this.sessionConfiguration;\n    return this.convertToSeconds(sessionConfiguration.renewalTimeoutMillis);\n  }\n\n  set renewalTimeoutSeconds(value: number) {\n    this.sessionConfiguration.renewalTimeoutMillis = this.convertToMillis(value);\n  }\n\n  get absoluteTimeoutSeconds(): number {\n    const sessionConfiguration = this.sessionConfiguration;\n    return this.convertToSeconds(sessionConfiguration.absoluteTimeoutMillis);\n  }\n\n  set absoluteTimeoutSeconds(value: number) {\n    this.sessionConfiguration.absoluteTimeoutMillis = this.convertToMillis(value);\n  }\n\n  get maximumNumberOfParallelSessions(): number {\n    return this.sessionConfiguration.maximumNumberOfParallelSessions;\n  }\n\n  set maximumNumberOfParallelSessions(value: number) {\n    this.sessionConfiguration.maximumNumberOfParallelSessions = value;\n  }\n\n  get userAgentValidationRequired(): boolean {\n    return this.sessionConfiguration.userAgentValidationRequired;\n  }\n\n  set userAgentValidationRequired(value: boolean) {\n    this.sessionConfiguration.userAgentValidationRequired = value;\n  }\n\n  get basicTokenLifespan() {\n    return this.authConfiguration.tenantOptions['oauth.internal']['basic-token.lifespan.seconds'];\n  }\n\n  set basicTokenLifespan(value) {\n    this.authConfiguration.tenantOptions['oauth.internal']['basic-token.lifespan.seconds'] = value;\n  }\n\n  get useSessionConfiguration() {\n    return !!this.sessionConfiguration;\n  }\n\n  set useSessionConfiguration(value) {\n    this.sessionConfiguration = value\n      ? defaults({}, this.originalSessionConfiguration, {\n          absoluteTimeoutMillis: 1209600000, // 14 days\n          renewalTimeoutMillis: 86400000, // 1 day\n          maximumNumberOfParallelSessions: 5,\n          userAgentValidationRequired: false\n        })\n      : null;\n    this.basicTokenLifespan = this.previousTokenLifespan || 172800; // 2 days\n  }\n\n  get absoluteTimeoutConstraints() {\n    return {\n      min: Math.max(this.MIN_ABSOLUTE_TIMEOUT, this.basicTokenLifespan + 1)\n    };\n  }\n\n  get renewalTimeoutConstraints() {\n    return {\n      min: this.MIN_ABSOLUTE_TIMEOUT / 2,\n      max: this.basicTokenLifespan ? this.basicTokenLifespan - 1 : null\n    };\n  }\n\n  get basicTokenLifespanConstraints() {\n    return {\n      min: this.renewalTimeoutSeconds ? this.renewalTimeoutSeconds + 1 : null,\n      max: this.absoluteTimeoutSeconds ? this.absoluteTimeoutSeconds - 1 : null\n    };\n  }\n\n  get sessionConfiguration(): ISessionConfiguration {\n    return this.authConfiguration.loginOptions.find(isOauthInternal).sessionConfiguration;\n  }\n\n  set sessionConfiguration(value: ISessionConfiguration) {\n    this.authConfiguration.loginOptions.find(isOauthInternal).sessionConfiguration = value;\n  }\n\n  private convertToMillis(seconds: number): number {\n    return isFinite(seconds) ? seconds * 1000 : null;\n  }\n\n  private convertToSeconds(milliseconds: number): number {\n    return isFinite(milliseconds) ? Math.ceil(milliseconds / 1000) : null;\n  }\n}\n","<div\n  class=\"card-block separator-top overflow-auto\"\n  *ngIf=\"authConfiguration.preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\"\n>\n  <div class=\"col-sm-2\">\n    <div class=\"h4 text-normal text-right text-left-xs\">\n      {{ 'OAI-Secure session configuration' | translate }}\n    </div>\n  </div>\n\n  <div class=\"col-sm-9\">\n    <div class=\"row\">\n      <div class=\"col-sm-6\">\n        <c8y-form-group>\n          <label class=\"c8y-switch\" title=\"{{ 'Use session configuration' | translate }}\">\n            <input\n              type=\"checkbox\"\n              name=\"useSessionConfiguration\"\n              [(ngModel)]=\"useSessionConfiguration\"\n            />\n            <span></span>\n            <span>{{ 'Use session configuration' | translate }}</span>\n          </label>\n        </c8y-form-group>\n      </div>\n    </div>\n\n    <fieldset *ngIf=\"sessionConfiguration\">\n      <div class=\"row\">\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label class=\"c8y-switch\" title=\"{{ 'User agent validation required' | translate }}\">\n              <input\n                type=\"checkbox\"\n                name=\"userAgentValidationRequired\"\n                [(ngModel)]=\"userAgentValidationRequired\"\n              />\n              <span></span>\n              <span>{{ 'User agent validation required' | translate }}</span>\n              <button\n                class=\"btn-help btn-help--sm\"\n                type=\"button\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{ USER_AGENT_VALIDATION_REQUIRED_POPOVER | translate }}\"\n                placement=\"right\"\n                triggers=\"focus\"\n                container=\"body\"\n              ></button>\n            </label>\n          </c8y-form-group>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label title=\"{{ 'Session absolute timeout' | translate }}\">\n              {{ 'Session absolute timeout' | translate }}\n            </label>\n            <div class=\"input-group\">\n              <input\n                type=\"number\"\n                name=\"absoluteTimeoutSeconds\"\n                class=\"form-control text-right\"\n                [(ngModel)]=\"absoluteTimeoutSeconds\"\n                [required]=\"useSessionConfiguration\"\n                [min]=\"absoluteTimeoutConstraints.min\"\n                step=\"1\"\n              />\n              <span class=\"input-group-addon\" translate>seconds</span>\n            </div>\n            <c8y-messages>\n              <c8y-message\n                name=\"min\"\n                text=\"{{ ABSOLUTE_TIMEOUT_VALIDATION_MESSAGE | translate }}\"\n              ></c8y-message>\n            </c8y-messages>\n          </c8y-form-group>\n        </div>\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label title=\"{{ 'Session renewal timeout' | translate }}\">\n              {{ 'Session renewal timeout' | translate }}\n            </label>\n            <div class=\"input-group\">\n              <input\n                type=\"number\"\n                name=\"renewalTimeoutSeconds\"\n                class=\"form-control text-right\"\n                [(ngModel)]=\"renewalTimeoutSeconds\"\n                [required]=\"useSessionConfiguration\"\n                [max]=\"renewalTimeoutConstraints.max\"\n                [min]=\"renewalTimeoutConstraints.min\"\n                step=\"1\"\n              />\n              <span class=\"input-group-addon\" translate>seconds</span>\n            </div>\n            <c8y-messages>\n              <c8y-message\n                name=\"max\"\n                text=\"{{ RENEWAL_TIMEOUT_VALIDATION_MESSAGE | translate }}\"\n              ></c8y-message>\n            </c8y-messages>\n          </c8y-form-group>\n        </div>\n      </div>\n\n      <div class=\"row\">\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label title=\"{{ 'Maximum parallel sessions per user' | translate }}\">\n              {{ 'Maximum parallel sessions per user' | translate }}\n            </label>\n            <div class=\"input-group\">\n              <input\n                type=\"number\"\n                name=\"maximumNumberOfParallelSessions\"\n                class=\"form-control text-right\"\n                [(ngModel)]=\"maximumNumberOfParallelSessions\"\n                [required]=\"useSessionConfiguration\"\n                [min]=\"1\"\n                step=\"1\"\n              />\n              <span class=\"input-group-addon\" translate>sessions</span>\n            </div>\n          </c8y-form-group>\n        </div>\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label title=\"{{ 'Token lifespan' | translate }}\">\n              {{ 'Token lifespan' | translate }}\n            </label>\n            <div class=\"input-group\">\n              <input\n                type=\"number\"\n                name=\"basicTokenLifespan\"\n                class=\"form-control text-right\"\n                [(ngModel)]=\"basicTokenLifespan\"\n                [required]=\"useSessionConfiguration\"\n                [max]=\"basicTokenLifespanConstraints.max\"\n                [min]=\"basicTokenLifespanConstraints.min\"\n                step=\"1\"\n              />\n              <span class=\"input-group-addon\" translate>seconds</span>\n            </div>\n            <c8y-messages>\n              <c8y-message\n                name=\"max\"\n                text=\"{{ MAX_TOKEN_LIFESPAN_VALIDATION_MESSAGE | translate }}\"\n              ></c8y-message>\n              <c8y-message\n                name=\"min\"\n                text=\"{{ MIN_TOKEN_LIFESPAN_VALIDATION_MESSAGE | translate }}\"\n              ></c8y-message>\n            </c8y-messages>\n          </c8y-form-group>\n        </div>\n      </div>\n    </fieldset>\n  </div>\n</div>\n","// tslint:disable:no-string-literal\nimport { Component, Input, SimpleChanges } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  FormGroupComponent,\n  C8yTranslateDirective,\n  RequiredInputPlaceholderDirective,\n  MaxValidationDirective,\n  MinValidationDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { isEmpty } from 'lodash-es';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport { TfaStrategy, TenantLoginOptionType } from '@c8y/client';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { NgIf, NgSwitch, NgSwitchCase } from '@angular/common';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\n\nenum TfaStateEnum {\n  TFA_UNDEFINED_BY_SYSTEM,\n  TFA_ENFORCED_FOR_GROUP,\n  TFA_ENABLED_BY_SYSTEM,\n  TFA_ENFORCED_BY_SYSTEM\n}\n\n@Component({\n  selector: 'c8y-auth-tfa',\n  templateUrl: './tfa-settings.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    NgIf,\n    FormGroupComponent,\n    FormsModule,\n    NgSwitch,\n    NgSwitchCase,\n    PopoverDirective,\n    C8yTranslateDirective,\n    RequiredInputPlaceholderDirective,\n    MaxValidationDirective,\n    MinValidationDirective,\n    C8yTranslatePipe\n  ]\n})\nexport class TfaSettingsComponent {\n  @Input()\n  authConfiguration: AuthConfiguration;\n\n  preferredLoginOptionType: TenantLoginOptionType = TenantLoginOptionType.BASIC;\n\n  smsGatewayAvailable: boolean;\n\n  tfaStateEnum = TfaStateEnum;\n  tfaStrategyEnum = TfaStrategy;\n  tenantLoginOptionTypeEnum = TenantLoginOptionType;\n\n  TOTP_REQUIRES_OAUTH_POPOVER = gettext('TOTP requires OAI-Secure login mode.');\n  SMS_APP_NOT_SUBSCRIBED_POPOVER = gettext(\n    'SMS strategy requires messaging application to be subscribed.'\n  );\n\n  TFA_IS_ENFORCED_BY_SYSTEM_POPOVER = gettext('The setting is enforced on the platform level.');\n  TFA_IS_ENABLED_BY_SYSTEM_POPOVER = gettext('The setting is enabled on the platform level.');\n  TOKEN_VALIDITY_DETERMINED_BY_JWT_POPOVER = gettext(\n    \"In OAI-Secure login mode, the token's validity limit is determined by the JWT token and cannot be edited here.\"\n  );\n  TFA_IS_ENABLED_BY_ENFORCE_FOR_GROUP_POPOVER = gettext(\n    'The setting is enabled on the platform level because it is enforced for particular roles.'\n  );\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.authConfiguration && changes.authConfiguration.currentValue) {\n      this.smsGatewayAvailable = changes.authConfiguration.currentValue.smsGatewayAvailable;\n      this.preferredLoginOptionType =\n        changes.authConfiguration.currentValue.preferredLoginOptionType;\n    }\n  }\n\n  ngDoCheck() {\n    if (this.preferredLoginOptionType !== this.authConfiguration.preferredLoginOptionType) {\n      this.preferredLoginOptionType = this.authConfiguration.preferredLoginOptionType;\n      this.tenantTfaStrategy = this.tfaBySmsCanBeSet ? TfaStrategy.SMS : TfaStrategy.TOTP;\n    }\n  }\n\n  get tenantTfaTokenValidity() {\n    return this.authConfiguration.tenantOptions['two-factor-authentication']['token.validity'];\n  }\n\n  set tenantTfaTokenValidity(value) {\n    this.authConfiguration.tenantOptions['two-factor-authentication']['token.validity'] = value;\n  }\n\n  get tenantTfaPinValidity() {\n    return this.authConfiguration.tenantOptions['two-factor-authentication']['pin.validity'];\n  }\n\n  set tenantTfaPinValidity(value) {\n    this.authConfiguration.tenantOptions['two-factor-authentication']['pin.validity'] = value;\n  }\n\n  get tenantTfaEnabled() {\n    return this.authConfiguration.tenantOptions['two-factor-authentication']['enabled'];\n  }\n\n  set tenantTfaEnabled(value) {\n    this.authConfiguration.tenantOptions['two-factor-authentication']['enabled'] = value;\n  }\n\n  get tenantTfaEnforced() {\n    return this.authConfiguration.tenantOptions['two-factor-authentication']['enforced'];\n  }\n\n  set tenantTfaEnforced(value) {\n    this.authConfiguration.tenantOptions['two-factor-authentication']['enforced'] = value;\n  }\n\n  get tenantTfaStrategy() {\n    return this.authConfiguration.tenantOptions['two-factor-authentication']['strategy'];\n  }\n\n  set tenantTfaStrategy(value) {\n    this.authConfiguration.tenantOptions['two-factor-authentication']['strategy'] = value;\n  }\n\n  get systemTfaEnforcedGroup() {\n    return this.authConfiguration.systemOptions['two-factor-authentication']['enforced.group'];\n  }\n\n  get systemTfaTenantScopeSettingEnabled() {\n    return this.authConfiguration.systemOptions['two-factor-authentication'][\n      'tenant-scope-settings.enabled'\n    ];\n  }\n\n  get systemTfaEnabled() {\n    return this.authConfiguration.systemOptions['two-factor-authentication']['enabled'];\n  }\n\n  get systemTfaEnforced() {\n    return this.authConfiguration.systemOptions['two-factor-authentication']['enforced'];\n  }\n\n  get tfaState() {\n    if (this.systemTfaEnforced) {\n      return this.tfaStateEnum.TFA_ENFORCED_BY_SYSTEM;\n    }\n    if (!isEmpty(this.systemTfaEnforcedGroup)) {\n      return this.tfaStateEnum.TFA_ENFORCED_FOR_GROUP;\n    }\n    if (this.systemTfaEnabled) {\n      return this.tfaStateEnum.TFA_ENABLED_BY_SYSTEM;\n    }\n    return this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM;\n  }\n\n  get tfaBySmsCanBeSet() {\n    return (\n      (this.tfaState !== this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM || this.tenantTfaEnabled) &&\n      this.smsGatewayAvailable\n    );\n  }\n\n  get tfaByTotpCanBeSet() {\n    return (\n      (this.tfaState !== this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM || this.tenantTfaEnabled) &&\n      this.preferredLoginOptionType === TenantLoginOptionType.OAUTH2_INTERNAL\n    );\n  }\n}\n","<div\n  class=\"card-block separator-top\"\n  *ngIf=\"preferredLoginOptionType !== tenantLoginOptionTypeEnum.OAUTH2\"\n>\n  <div class=\"col-sm-2\">\n    <div class=\"h4 text-normal text-right text-left-xs\">\n      {{ 'Two-factor authentication' | translate }}\n    </div>\n  </div>\n\n  <div class=\"col-sm-9\">\n    <c8y-form-group>\n      <label\n        class=\"c8y-switch\"\n        title=\"{{ 'Enable two-factor authentication' | translate }}\"\n        *ngIf=\"\n          tfaState === tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM;\n          else enabledOrEnforcedOnSystemLevelTemplate\n        \"\n      >\n        <input type=\"checkbox\" [(ngModel)]=\"tenantTfaEnabled\" name=\"tenantTfaEnabled\" />\n        <span></span>\n        <span>{{ 'Enable' | translate }}</span>\n      </label>\n\n      <ng-template #enabledOrEnforcedOnSystemLevelTemplate>\n        <div [ngSwitch]=\"tfaState\">\n          <span *ngSwitchCase=\"tfaStateEnum.TFA_ENABLED_BY_SYSTEM\">\n            {{ 'Two-factor authentication is enabled on all users' | translate }}\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{ TFA_IS_ENABLED_BY_SYSTEM_POPOVER | translate }}\"\n              placement=\"bottom\"\n              triggers=\"focus\"\n            ></button>\n          </span>\n          <div *ngSwitchCase=\"tfaStateEnum.TFA_ENFORCED_BY_SYSTEM\">\n            <span>\n              {{ 'Two-factor authentication is enforced on all users' | translate }}\n              <button\n                class=\"btn-help btn-help--sm\"\n                type=\"button\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n                placement=\"bottom\"\n                triggers=\"focus\"\n              ></button>\n            </span>\n          </div>\n          <div *ngSwitchCase=\"tfaStateEnum.TFA_ENFORCED_FOR_GROUP\">\n            <span>\n              <span translate [translateParams]=\"{ role: systemTfaEnforcedGroup }\" ngNonBindable>\n                Two-factor authentication is enabled on all users and enforced on users with role\n                {{ role }}.\n              </span>\n              <button\n                class=\"btn-help btn-help--sm\"\n                type=\"button\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{ TFA_IS_ENABLED_BY_ENFORCE_FOR_GROUP_POPOVER | translate }}\"\n                placement=\"bottom\"\n                triggers=\"focus\"\n              ></button>\n            </span>\n          </div>\n        </div>\n      </ng-template>\n    </c8y-form-group>\n\n    <fieldset *ngIf=\"tfaBySmsCanBeSet || tfaByTotpCanBeSet\">\n      <div class=\"row\">\n        <c8y-form-group class=\"col-sm-6\">\n          <label title=\"{{ 'TFA strategy' | translate }}\">\n            {{ 'TFA strategy' | translate }}\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{ SMS_APP_NOT_SUBSCRIBED_POPOVER | translate }}\"\n              placement=\"bottom\"\n              triggers=\"focus\"\n              *ngIf=\"!tfaBySmsCanBeSet\"\n            ></button>\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{ TOTP_REQUIRES_OAUTH_POPOVER | translate }}\"\n              placement=\"bottom\"\n              triggers=\"focus\"\n              *ngIf=\"!tfaByTotpCanBeSet\"\n            ></button>\n          </label>\n\n          <div class=\"c8y-select-wrapper\">\n            <select\n              [attr.aria-label]=\"'TFA' | translate\"\n              class=\"form-control\"\n              [(ngModel)]=\"tenantTfaStrategy\"\n              name=\"tenantTfaStrategy\"\n            >\n              <option value=\"{{ tfaStrategyEnum.SMS }}\" translate [disabled]=\"!tfaBySmsCanBeSet\">\n                SMS based\n              </option>\n              <option value=\"{{ tfaStrategyEnum.TOTP }}\" translate [disabled]=\"!tfaByTotpCanBeSet\">\n                TOTP\n              </option>\n            </select>\n            <span></span>\n          </div>\n        </c8y-form-group>\n      </div>\n\n      <div\n        class=\"row\"\n        *ngIf=\"\n          tenantTfaStrategy === tfaStrategyEnum.TOTP &&\n          tfaState !== tfaStateEnum.TFA_ENFORCED_BY_SYSTEM\n        \"\n      >\n        <label title=\"{{ 'Enforcement' | translate }}\">{{ 'Enforcement' | translate }}</label>\n        <div class=\"form-control-static\">\n          <label\n            title=\"{{ 'Enforce two-factor authentication on all users' | translate }}\"\n            class=\"c8y-switch\"\n          >\n            <input type=\"checkbox\" name=\"tenantTfaEnforced\" [(ngModel)]=\"tenantTfaEnforced\" />\n            <span></span>\n            <span>{{ 'Enforce two-factor authentication on all users' | translate }}</span>\n          </label>\n        </div>\n      </div>\n\n      <div class=\"row\" *ngIf=\"tenantTfaStrategy === tfaStrategyEnum.SMS\">\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label title=\"{{ 'Token validity limit' | translate }}\">\n              {{ 'Token validity limit' | translate }}\n              <button\n                class=\"btn-help btn-help--sm\"\n                type=\"button\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n                placement=\"right\"\n                triggers=\"focus\"\n                *ngIf=\"!systemTfaTenantScopeSettingEnabled\"\n              ></button>\n              <button\n                class=\"btn-help btn-help--sm\"\n                type=\"button\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{ TOKEN_VALIDITY_DETERMINED_BY_JWT_POPOVER | translate }}\"\n                placement=\"right\"\n                triggers=\"focus\"\n                *ngIf=\"\n                  systemTfaTenantScopeSettingEnabled &&\n                  preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\n                \"\n              ></button>\n            </label>\n            <div class=\"input-group\">\n              <input\n                type=\"number\"\n                class=\"form-control text-right\"\n                name=\"tenantTfaTokenValidity\"\n                [(ngModel)]=\"tenantTfaTokenValidity\"\n                [disabled]=\"\n                  !systemTfaTenantScopeSettingEnabled ||\n                  preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\n                \"\n                [required]=\"systemTfaTenantScopeSettingEnabled\"\n                [max]=\"999999\"\n                [min]=\"0\"\n              />\n              <span class=\"input-group-addon\" translate>minutes</span>\n            </div>\n          </c8y-form-group>\n        </div>\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label title=\"{{ 'Verification code validity limit' | translate }}\">\n              {{ 'Verification code validity limit' | translate }}\n              <button\n                class=\"btn-help btn-help--sm\"\n                type=\"button\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n                placement=\"right\"\n                triggers=\"focus\"\n                *ngIf=\"!systemTfaTenantScopeSettingEnabled\"\n              ></button>\n            </label>\n            <div class=\"input-group\">\n              <input\n                type=\"number\"\n                class=\"form-control text-right\"\n                name=\"tenantTfaPinValidity\"\n                [(ngModel)]=\"tenantTfaPinValidity\"\n                [disabled]=\"!systemTfaTenantScopeSettingEnabled\"\n                [required]=\"systemTfaTenantScopeSettingEnabled\"\n                [max]=\"999999\"\n                [min]=\"0\"\n              />\n              <span class=\"input-group-addon\" translate>minutes</span>\n            </div>\n          </c8y-form-group>\n        </div>\n      </div>\n    </fieldset>\n    <div\n      *ngIf=\"\n        preferredLoginOptionType !== tenantLoginOptionTypeEnum.OAUTH2_INTERNAL &&\n        !smsGatewayAvailable\n      \"\n    >\n      <div class=\"alert alert-warning\">\n        <strong>{{ 'None of TFA strategy can be set.' | translate }}</strong>\n        <br />\n        {{ SMS_APP_NOT_SUBSCRIBED_POPOVER | translate }}\n        <br />\n        {{ TOTP_REQUIRES_OAUTH_POPOVER | translate }}\n      </div>\n    </div>\n  </div>\n</div>\n","import { Component, OnInit, EventEmitter } from '@angular/core';\nimport { AuthConfigurationService } from './auth-configuration.service';\nimport {\n  AlertService,\n  ModalService,\n  SimplifiedAuthService,\n  TitleComponent,\n  BreadcrumbComponent,\n  BreadcrumbItemComponent,\n  ActionBarItemComponent,\n  IconDirective,\n  HelpComponent,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { cloneDeep } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { tap, switchMap, shareReplay } from 'rxjs/operators';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { NgClass, NgIf, AsyncPipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { LoginSettingsComponent } from './login-settings.component';\nimport { BasicAuthSettingsComponent } from './basic-auth-settings.component';\nimport { SessionConfigurationComponent } from './session-configuration.component';\nimport { TfaSettingsComponent } from './tfa-settings.component';\n\n@Component({\n  selector: 'c8y-auth-configuration',\n  templateUrl: './auth-configuration.component.html',\n  imports: [\n    TitleComponent,\n    BreadcrumbComponent,\n    BreadcrumbItemComponent,\n    ActionBarItemComponent,\n    IconDirective,\n    NgClass,\n    HelpComponent,\n    FormsModule,\n    NgIf,\n    LoginSettingsComponent,\n    BasicAuthSettingsComponent,\n    SessionConfigurationComponent,\n    TfaSettingsComponent,\n    C8yTranslatePipe,\n    AsyncPipe\n  ]\n})\nexport class AuthConfigurationComponent implements OnInit {\n  reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n  reload: EventEmitter<void> = new EventEmitter();\n  authConfiguration: AuthConfiguration;\n\n  private authConfiguration$: Observable<AuthConfiguration> = this.reload.pipe(\n    tap(() => this.reloading$.next(true)),\n    switchMap(() => this.authConfigurationService.getAuthConfiguration$()),\n    tap(() => this.reloading$.next(false)),\n    shareReplay(1)\n  );\n  private previousAuthConfiguration: AuthConfiguration;\n  private authConfigurationSubscription: Subscription;\n\n  constructor(\n    private authConfigurationService: AuthConfigurationService,\n    private modalService: ModalService,\n    private authService: SimplifiedAuthService,\n    private alertService: AlertService\n  ) {}\n\n  ngOnInit() {\n    this.authConfigurationSubscription = this.authConfiguration$.subscribe(\n      (authConfiguration: AuthConfiguration) => {\n        this.authConfiguration = authConfiguration;\n        this.previousAuthConfiguration = cloneDeep(this.authConfiguration);\n      }\n    );\n    this.loadAuthConfig();\n  }\n\n  loadAuthConfig() {\n    this.reload.next();\n  }\n\n  ngOnDestroy(): void {\n    this.authConfigurationSubscription.unsubscribe();\n  }\n\n  async save() {\n    try {\n      await this.modalService.confirmLogout();\n      await this.authConfigurationService.save(\n        this.authConfiguration,\n        this.previousAuthConfiguration\n      );\n      await this.authService.logout(true);\n    } catch (ex) {\n      if (ex) {\n        this.alertService.addServerFailure(ex);\n      }\n    }\n  }\n}\n","<c8y-title>{{ 'Authentication' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    [icon]=\"'cog'\"\n    [label]=\"'Settings' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [icon]=\"'cog'\"\n    [label]=\"'Authentication' | translate\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    class=\"btn btn-link\"\n    title=\"{{ 'Reload' | translate }}\"\n    (click)=\"loadAuthConfig()\"\n  >\n    <i\n      c8yIcon=\"refresh\"\n      [ngClass]=\"{ 'icon-spin': reloading$ | async }\"\n    ></i>\n    {{ 'Reload' | translate }}\n  </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/authentication/basic-settings/#basic-settings\"></c8y-help>\n\n<form\n  class=\"card card--fullpage\"\n  #authConfigurationForm=\"ngForm\"\n  novalidate\n>\n  <div class=\"card-header separator\">\n    <div class=\"card-title\">\n      {{ 'Authentication' | translate }}\n    </div>\n  </div>\n  <div\n    class=\"inner-scroll\"\n    *ngIf=\"authConfiguration\"\n  >\n    <c8y-login-settings [authConfiguration]=\"authConfiguration\"></c8y-login-settings>\n    <c8y-basic-auth-settings [authConfiguration]=\"authConfiguration\"></c8y-basic-auth-settings>\n    <c8y-session-configuration [authConfiguration]=\"authConfiguration\"></c8y-session-configuration>\n    <c8y-auth-tfa [authConfiguration]=\"authConfiguration\"></c8y-auth-tfa>\n  </div>\n  <div class=\"card-footer separator\">\n    <button\n      class=\"btn btn-primary\"\n      title=\"{{ 'Save' | translate }}\"\n      type=\"submit\"\n      (click)=\"save()\"\n      [disabled]=\"!authConfigurationForm.form.valid || authConfigurationForm.form.pristine\"\n    >\n      {{ 'Save' | translate }}\n    </button>\n  </div>\n</form>\n","import { inject, Injectable } from '@angular/core';\nimport { HttpStatusCode } from '@angular/common/http';\nimport { defer, Observable, of } from 'rxjs';\nimport { catchError, map, shareReplay } from 'rxjs/operators';\nimport { TenantLoginOptionsService, TenantLoginOptionType } from '@c8y/client';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class BasicSettingsService {\n  private loginOptionsService = inject(TenantLoginOptionsService);\n  private showTab$: Observable<boolean> = defer(() =>\n    Promise.all([\n      this.loginOptionsService.detail(TenantLoginOptionType.BASIC),\n      this.loginOptionsService.detail(TenantLoginOptionType.OAUTH2_INTERNAL)\n    ])\n  ).pipe(\n    map(() => true),\n    catchError(({ res }) => {\n      // do not display tab if any login option fails with forbidden error:\n      if (res?.status === HttpStatusCode.Forbidden) {\n        return of(false);\n      }\n      return of(true);\n    }),\n    shareReplay(1)\n  );\n\n  shouldShowTab$(): Observable<boolean> {\n    return this.showTab$;\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BasicSettingsService } from './basic-settings.service';\n\n@Injectable()\nexport class BasicSettingsGuard {\n  private basicSettingsService = inject(BasicSettingsService);\n\n  canActivate(): Observable<boolean> {\n    return this.basicSettingsService.shouldShowTab$();\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { CoreModule, hookRoute } from '@c8y/ngx-components';\nimport { BasicAuthSettingsComponent } from './basic-auth-settings.component';\nimport { AuthConfigurationGuard } from '../auth-configuration.guard';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { AuthConfigurationService } from './auth-configuration.service';\nimport { AuthConfigurationComponent } from './auth-configuration.component';\nimport { TfaSettingsComponent } from './tfa-settings.component';\nimport { SessionConfigurationComponent } from './session-configuration.component';\nimport { LoginSettingsComponent } from './login-settings.component';\nimport { TenantLoginOptionMapper } from './tenant-login-option.mapper';\nimport { BasicSettingsGuard } from './basic-settings.guard';\n\n@NgModule({\n  exports: [],\n  imports: [\n    CoreModule,\n    PopoverModule,\n    SessionConfigurationComponent,\n    LoginSettingsComponent,\n    BasicAuthSettingsComponent,\n    AuthConfigurationComponent,\n    TfaSettingsComponent\n  ],\n  providers: [\n    AuthConfigurationService,\n    TenantLoginOptionMapper,\n    BasicSettingsGuard,\n    hookRoute({\n      path: 'auth-configuration/basic_settings',\n      component: AuthConfigurationComponent,\n      canActivate: [AuthConfigurationGuard, BasicSettingsGuard]\n    })\n  ]\n})\nexport class BasicSettingsModule {}\n","import { ITenantLoginOption } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport enum TemplateType {\n  CUSTOM = 'CUSTOM',\n  AZURE = 'AZURE',\n  KEYCLOAK = 'KEYCLOAK'\n}\n\nexport const templateTypeConfig = {\n  [TemplateType.CUSTOM]: {\n    name: 'CUSTOM',\n    value: 'CUSTOM',\n    label: gettext('Custom')\n  },\n  [TemplateType.AZURE]: {\n    name: 'AZURE',\n    value: 'AZURE',\n    label: gettext('Azure AD')\n  },\n  [TemplateType.KEYCLOAK]: {\n    name: 'KEYCLOAK',\n    value: 'KEYCLOAK',\n    label: gettext('Keycloak')\n  }\n};\n\nexport enum ValidationMethod {\n  USERINFO = 'USERINFO',\n  INTROSPECTION = 'INTROSPECTION'\n}\n\nexport interface AccessTokenToUserDataMappings {\n  firstNameClaimName?: string;\n  lastNameClaimName?: string;\n  emailClaimName?: string;\n  phoneNumberClaimName?: string;\n}\n\nexport interface SSORequestParams {\n  [key: string]: string;\n}\n\nexport interface Headers {\n  [key: string]: string;\n}\n\nexport interface OnNewUser {\n  dynamicMapping: DynamicMapping;\n}\n\nexport interface Configuration {\n  mapRolesOnlyForNewUser: boolean;\n  manageRolesOnlyFromAccessMapping: boolean;\n  mapFromIdToken: boolean;\n}\n\nexport interface ChildPredicate {\n  operator: 'EQ' | 'NEQ' | 'GT' | 'LT' | 'GTE' | 'LTE' | 'IN';\n  parameterPath: string;\n  value: string;\n}\n\nexport interface WhenItemsAreMapped {\n  childPredicates: ChildPredicate[];\n  operator: 'AND';\n}\n\nexport interface AccessMapping {\n  thenApplications: number[];\n  thenGroups: number[];\n  when: WhenItemsAreMapped;\n}\n\nexport interface DynamicMapping {\n  configuration?: Configuration;\n  mappings: AccessMapping[];\n  inventoryMappings: InventoryMapping[];\n}\n\nexport interface InventoryMapping {\n  when: WhenItemsAreMapped;\n  thenInventoryRoles: InventoryRole[];\n}\n\nexport interface InventoryRole {\n  roleIds: number[];\n  managedObject: string;\n}\n\nexport interface MapRolesOnlyForNewUser {\n  configuration: Configuration;\n}\n\nexport interface CustomSignatureVerificationConfig {\n  certIdFromField: boolean;\n  certIdField?: string;\n  certificates?: {\n    [certIdValue: string]: Certificate;\n  };\n}\n\nexport interface Certificate {\n  alg: 'PCKS' | 'RSA';\n  publicKey: string;\n  validFrom?: Date;\n  validTill?: Date;\n}\n\nexport interface AadSignatureVerificationConfig {\n  publicKeyDiscoveryUrl: string;\n}\n\nexport interface JwksSignatureVerificationConfig {\n  jwksUri: string;\n}\n\nexport interface AdfsSignatureVerificationConfig {\n  manifestUrl: string;\n}\n\nexport interface SignatureVerificationConfig {\n  manual?: CustomSignatureVerificationConfig;\n  aad?: AadSignatureVerificationConfig;\n  jwks?: JwksSignatureVerificationConfig;\n  adfsManifest?: AdfsSignatureVerificationConfig;\n  template?: string;\n}\n\nexport interface SSORequest {\n  body?: string;\n  headers: Headers;\n  method: string;\n  operation: string;\n  requestParams: SSORequestParams;\n  url?: string;\n}\n\nexport interface UserIdConfig {\n  jwtField?: string;\n  constantValue?: string;\n  useConstantValue: boolean;\n}\n\nexport interface ExternalTokenConfig {\n  enabled: boolean;\n  userOrAppIdConfig?: UserIdConfig;\n  validationMethod?: ValidationMethod;\n  validationRequired?: boolean;\n  tokenValidationRequest?: SSORequest;\n  accessTokenValidityCheckIntervalInMinutes?: number;\n}\n\nexport interface SsoConfiguration extends ITenantLoginOption {\n  accessTokenToUserDataMappings: AccessTokenToUserDataMappings;\n  audience: string;\n  authorizationRequest: SSORequest;\n  buttonName: string;\n  clientId: string;\n  id?: string;\n  issuer: string;\n  logoutRequest: SSORequest;\n  onNewUser: OnNewUser;\n  providerName: string;\n  redirectToPlatform: string;\n  refreshRequest: SSORequest;\n  self?: string;\n  signatureVerificationConfig: SignatureVerificationConfig;\n  template: TemplateType;\n  tokenRequest: SSORequest;\n  userIdConfig: UserIdConfig;\n  visibleOnLoginPage: boolean;\n  externalTokenConfig?: ExternalTokenConfig;\n  useIdToken: boolean;\n}\n","import { Injectable } from '@angular/core';\nimport {\n  GrantType,\n  ITenantLoginOption,\n  TenantLoginOptionsService,\n  TenantLoginOptionType,\n  UserManagementSource\n} from '@c8y/client';\nimport { SsoConfiguration, TemplateType } from './sso-configuration.model';\nimport { defer, Observable, of, throwError } from 'rxjs';\nimport { catchError, map, shareReplay, take } from 'rxjs/operators';\nimport { HttpStatusCode } from '@angular/common/http';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class SsoConfigurationService {\n  private ssoConfiguration$: Observable<ITenantLoginOption> = defer(() =>\n    this.loginOptionsService.detail(TenantLoginOptionType.OAUTH2)\n  ).pipe(\n    map(res => res.data),\n    catchError(({ res }) => {\n      if (res.status === HttpStatusCode.Forbidden) return throwError(() => new Error());\n      else return of(this.defaultConfiguration);\n    }),\n    shareReplay({ bufferSize: 1, windowTime: 1000, refCount: true }),\n    take(1)\n  );\n\n  private defaultConfiguration: SsoConfiguration = {\n    authorizationRequest: {\n      body: '',\n      headers: {},\n      method: 'GET',\n      operation: 'REDIRECT',\n      requestParams: {\n        response_type: 'code',\n        client_id: '${clientId}',\n        redirect_uri: '${redirectUri}',\n        scope: ''\n      }\n    },\n    tokenRequest: {\n      body: 'grant_type=authorization_code&code=${code}&redirect_uri=${redirectUri}&client_id=${clientId}',\n      headers: {},\n      method: 'POST',\n      operation: 'EXECUTE',\n      requestParams: {\n        response_type: 'code',\n        client_id: '${clientId}',\n        redirect_uri: '${redirectUri}',\n        scope: ''\n      }\n    },\n    refreshRequest: {\n      body: 'grant_type=refresh_token&refresh_token=${refreshToken}&client_id=${clientId}',\n      headers: {\n        Authorization: ''\n      },\n      method: 'POST',\n      operation: 'EXECUTE',\n      requestParams: {\n        response_type: 'refresh',\n        client_id: '${clientId}'\n      }\n    },\n    logoutRequest: {\n      headers: {},\n      method: 'POST',\n      operation: 'REDIRECT',\n      requestParams: {}\n    },\n    type: TenantLoginOptionType.OAUTH2,\n    grantType: GrantType.AUTHORIZATION_CODE,\n    userManagementSource: UserManagementSource.REMOTE,\n    onNewUser: {\n      dynamicMapping: {\n        mappings: [],\n        inventoryMappings: [],\n        configuration: {\n          mapRolesOnlyForNewUser: false,\n          manageRolesOnlyFromAccessMapping: false,\n          mapFromIdToken: false\n        }\n      }\n    },\n    userIdConfig: {\n      jwtField: '',\n      useConstantValue: true\n    },\n    signatureVerificationConfig: {\n      manual: {\n        certIdFromField: false\n      }\n    },\n    template: TemplateType.CUSTOM,\n    clientId: '',\n    audience: '',\n    issuer: '',\n    buttonName: '',\n    redirectToPlatform: '',\n    providerName: '',\n    visibleOnLoginPage: true,\n    accessTokenToUserDataMappings: {},\n    externalTokenConfig: {\n      enabled: false\n    },\n    useIdToken: false\n  };\n\n  constructor(private loginOptionsService: TenantLoginOptionsService) {}\n\n  getSsoConfiguration$(): Observable<ITenantLoginOption> {\n    return this.ssoConfiguration$;\n  }\n\n  save(ssoConfiguration: SsoConfiguration, terminateUserSessions = true) {\n    return this.loginOptionsService.save(ssoConfiguration, { terminateUserSessions });\n  }\n\n  shouldShowTab$(): Observable<boolean> {\n    return this.getSsoConfiguration$().pipe(\n      map(() => true),\n      catchError(() => of(false)),\n      shareReplay(1)\n    );\n  }\n}\n","import { SSORequestParams, Headers, SSORequest } from '../sso-configuration.model';\nimport { map, pickBy, identity } from 'lodash-es';\n\nexport class RequestConfiguration {\n  body?: string;\n  headers: RequestConfigurationDynamicArray;\n  method: string;\n  operation: string;\n  requestParams: RequestConfigurationDynamicArray;\n  url?: string;\n\n  constructor(requestConfiguration: SSORequest) {\n    this.headers = new RequestConfigurationDynamicArray(requestConfiguration.headers);\n    this.method = requestConfiguration.method;\n    this.operation = requestConfiguration.operation;\n    this.requestParams = new RequestConfigurationDynamicArray(requestConfiguration.requestParams);\n    this.body = requestConfiguration.body;\n    this.url = requestConfiguration.url;\n  }\n\n  toRequest(): SSORequest {\n    return pickBy(\n      {\n        body: this.method === 'GET' ? '' : this.body,\n        headers: this.headers.toObject(),\n        method: this.method,\n        operation: this.operation,\n        requestParams: this.requestParams.toObject(),\n        url: this.url\n      },\n      identity\n    ) as SSORequest;\n  }\n}\n\n// tslint:disable-next-line:max-classes-per-file\nexport class RequestConfigurationDynamicArray extends Array {\n  constructor(obj: SSORequestParams | Headers) {\n    super();\n    this.push(\n      ...map(obj, (value, key) => ({\n        key,\n        value\n      }))\n    );\n  }\n\n  toObject(): { [key: string]: string } {\n    return this.reduce((obj, element) => {\n      obj[element.key] = element.value;\n      return obj;\n    }, {});\n  }\n}\n","import {\n  AadSignatureVerificationConfig,\n  AdfsSignatureVerificationConfig,\n  CustomSignatureVerificationConfig,\n  JwksSignatureVerificationConfig,\n  SignatureVerificationConfig\n} from '../sso-configuration.model';\nimport { pick, findKey, get, has, reduce, map, omit } from 'lodash-es';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport enum AlgorithmType {\n  PCKS = 'PCKS',\n  RSA = 'RSA'\n}\n\nexport const algorithmTypeConfig = {\n  [AlgorithmType.PCKS]: {\n    name: 'PCKS',\n    value: 'PCKS',\n    label: gettext('X.509 certificate (PEM format)')\n  },\n  [AlgorithmType.RSA]: {\n    name: 'RSA',\n    value: 'RSA',\n    label: gettext('RSA public key (X.509 Subject Public Key Info)')\n  }\n};\n\nexport enum CertificateType {\n  CUSTOM = 'CUSTOM',\n  AZURE = 'AZURE',\n  ADFS = 'ADFS',\n  JWKS = 'JWKS'\n}\n\nexport const certificateTypeConfig = {\n  [CertificateType.CUSTOM]: {\n    name: 'CUSTOM',\n    label: gettext('Custom'),\n    value: 'CUSTOM',\n    signatureVerificationConfigFragment: 'manual',\n    ordinal: 0\n  },\n  [CertificateType.AZURE]: {\n    name: 'AZURE',\n    label: 'Azure',\n    value: 'AZURE',\n    signatureVerificationConfigFragment: 'aad',\n    ordinal: 1\n  },\n  [CertificateType.ADFS]: {\n    name: 'ADFS',\n    label: gettext('ADFS manifest'),\n    value: 'ADFS',\n    signatureVerificationConfigFragment: 'adfsManifest',\n    ordinal: 2\n  },\n  [CertificateType.JWKS]: {\n    name: 'JWKS',\n    label: 'JWKS',\n    value: 'JWKS',\n    signatureVerificationConfigFragment: 'jwks',\n    ordinal: 3\n  }\n};\n\nexport interface CustomCertificate {\n  alg: AlgorithmType;\n  key: string;\n  publicKey: string;\n  validFrom?: Date;\n  validTill?: Date;\n}\n\nexport class SignatureConfiguration {\n  manual?: CustomSignatureVerification;\n  aad?: AadSignatureVerificationConfig;\n  jwks?: JwksSignatureVerificationConfig;\n  adfsManifest?: AdfsSignatureVerificationConfig;\n  certificateTypeChosen: CertificateType;\n\n  constructor(signatureVerificationConfig: SignatureVerificationConfig) {\n    this.manual = new CustomSignatureVerification(\n      signatureVerificationConfig.manual || { certIdFromField: false }\n    );\n    this.aad = signatureVerificationConfig.aad || { publicKeyDiscoveryUrl: '' };\n    this.jwks = signatureVerificationConfig.jwks || { jwksUri: '' };\n    this.adfsManifest = signatureVerificationConfig.adfsManifest || { manifestUrl: '' };\n    this.certificateTypeChosen = this.getCertificateType(signatureVerificationConfig);\n  }\n\n  toSignatureVerificationConfig(): SignatureVerificationConfig {\n    const result = {\n      manual: this.manual.toManual(),\n      aad: this.aad,\n      jwks: this.jwks,\n      adfsManifest: this.adfsManifest\n    };\n    return pick(\n      result,\n      certificateTypeConfig[this.certificateTypeChosen].signatureVerificationConfigFragment\n    );\n  }\n\n  getCertificateType(signatureVerificationConfig: SignatureVerificationConfig): CertificateType {\n    const templateCertificateType = findKey(certificateTypeConfig, certificateType =>\n      has(signatureVerificationConfig, certificateType.signatureVerificationConfigFragment)\n    );\n    return templateCertificateType || CertificateType.CUSTOM;\n  }\n}\n\n// tslint:disable-next-line:max-classes-per-file\nclass CustomSignatureVerification {\n  certIdFromField: boolean;\n  certIdField: string;\n  customCertificates: CustomCertificate[] = [];\n\n  constructor(manual: CustomSignatureVerificationConfig) {\n    this.certIdFromField = manual.certIdFromField;\n    this.certIdField = manual.certIdField;\n    this.customCertificates = this.getCustomCertificates(manual);\n  }\n\n  getCustomCertificates(manual: CustomSignatureVerificationConfig) {\n    const certificates = get(manual, 'certificates', []);\n    const customCertificates = map(certificates, (certificate, key) => ({\n      ...certificate,\n      key,\n      validFrom: new Date(certificate.validFrom),\n      validTill: new Date(certificate.validTill)\n    }));\n    if (customCertificates.length === 0) {\n      const newCustomCertificate = { alg: 'RSA' };\n      customCertificates.push(newCustomCertificate);\n    }\n    return customCertificates;\n  }\n\n  addCustomCertificate() {\n    const newCustomCertificate = { alg: AlgorithmType.RSA, key: '', publicKey: '' };\n    this.customCertificates.push(newCustomCertificate);\n  }\n\n  removeCustomCertificate(customCertificate: CustomCertificate) {\n    const indexOfCustomCertificate = this.customCertificates.indexOf(customCertificate);\n    this.customCertificates.splice(indexOfCustomCertificate, 1);\n  }\n\n  toManual(): CustomSignatureVerificationConfig {\n    const manual: CustomSignatureVerificationConfig = this.getManualSignatureVerificationConfig();\n    manual.certificates = this.getSignatureCertificates();\n    return manual;\n  }\n\n  getSignatureCertificates() {\n    if (this.customCertificates.length < 2) {\n      this.customCertificates[0].key = 'default';\n    }\n    return reduce(\n      this.customCertificates,\n      (signatureCertificates, customCertificate) => ({\n        ...signatureCertificates,\n        [customCertificate.key]: {\n          alg: customCertificate.alg,\n          publicKey: customCertificate.publicKey,\n          validFrom: customCertificate.validFrom,\n          validTill: customCertificate.validTill\n        }\n      }),\n      {}\n    );\n  }\n\n  getManualSignatureVerificationConfig() {\n    let manual = {\n      certIdFromField: this.customCertificates.length > 1,\n      certIdField: this.certIdField\n    };\n    if (!manual.certIdFromField) {\n      manual = omit(manual, 'certIdField');\n    }\n    return manual;\n  }\n}\n","import {\n  ExternalTokenConfig,\n  SSORequest,\n  UserIdConfig,\n  ValidationMethod\n} from '../sso-configuration.model';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { RequestConfiguration } from './request-configuration.model';\n\nexport const validationMethodConfig = {\n  [ValidationMethod.INTROSPECTION]: {\n    name: 'INTROSPECTION',\n    value: 'INTROSPECTION',\n    label: gettext('Introspection`Method of validating access token from external IAM system`'),\n    defaults: {\n      method: 'POST',\n      body: 'token=${accessToken}&client_id=${clientId}&client_secret=',\n      url: '',\n      headers: {},\n      operation: 'EXECUTE',\n      requestParams: {}\n    }\n  },\n  [ValidationMethod.USERINFO]: {\n    name: 'USERINFO',\n    value: 'USERINFO',\n    label: gettext('User info`Method of validating access token from external IAM system`'),\n    defaults: {\n      url: '',\n      method: 'GET',\n      body: '',\n      headers: { Authorization: 'Bearer ${accessToken}' },\n      operation: 'EXECUTE',\n      requestParams: {}\n    }\n  }\n};\n\nconst defaultTokenValidationRequest: SSORequest = {\n  body: 'token=${accessToken}&client_id=${clientId}&client_secret=',\n  url: '',\n  headers: {},\n  method: 'POST',\n  operation: 'EXECUTE',\n  requestParams: {}\n};\n\nconst defaultUserIdConfig: UserIdConfig = {\n  jwtField: '',\n  useConstantValue: true\n};\n\nexport class ExternalToken {\n  userOrAppIdConfig: UserIdConfig;\n  validationMethod: ValidationMethod;\n  validationRequired: boolean;\n  enabled: boolean;\n  tokenValidationRequest: RequestConfiguration;\n  accessTokenValidityCheckIntervalInMinutes: number;\n\n  constructor(externalTokenConfig: ExternalTokenConfig) {\n    const _externalTokenConfig = Object.assign({ enabled: false }, externalTokenConfig);\n    this.userOrAppIdConfig = _externalTokenConfig.userOrAppIdConfig || defaultUserIdConfig;\n    this.validationMethod = _externalTokenConfig.validationMethod || ValidationMethod.INTROSPECTION;\n    this.validationRequired = _externalTokenConfig.validationRequired;\n    this.enabled = _externalTokenConfig.enabled;\n    this.tokenValidationRequest = new RequestConfiguration(\n      _externalTokenConfig.tokenValidationRequest || defaultTokenValidationRequest\n    );\n    this.accessTokenValidityCheckIntervalInMinutes =\n      _externalTokenConfig.accessTokenValidityCheckIntervalInMinutes || 1;\n  }\n\n  toExternalTokenConfig(): ExternalTokenConfig {\n    if (!this.enabled) {\n      return { enabled: this.enabled };\n    }\n    const externalTokenConfig: ExternalTokenConfig = {\n      userOrAppIdConfig: this.userOrAppIdConfig,\n      validationRequired: this.validationRequired,\n      enabled: this.enabled\n    };\n    if (this.validationRequired) {\n      externalTokenConfig.validationMethod = this.validationMethod;\n      externalTokenConfig.tokenValidationRequest = this.tokenValidationRequest.toRequest();\n      externalTokenConfig.accessTokenValidityCheckIntervalInMinutes =\n        this.accessTokenValidityCheckIntervalInMinutes;\n    }\n    return externalTokenConfig;\n  }\n}\n","import { SsoConfiguration, TemplateType } from '../sso-configuration.model';\nimport { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { GrantType, TenantLoginOptionType } from '@c8y/client';\nimport { CustomSsoConfiguration } from './custom.model';\nimport { RequestConfiguration } from '../template-parts/request-configuration.model';\nimport {\n  CertificateType,\n  SignatureConfiguration\n} from '../template-parts/signature-configuration.model';\nimport { Injectable } from '@angular/core';\nimport { ExternalToken } from '../template-parts/external-token-config.model';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class CustomConfigurationMapper implements SsoConfigurationMapper<CustomSsoConfiguration> {\n  mapFrom(templateModel: CustomSsoConfiguration): SsoConfiguration {\n    const ssoConfiguration: SsoConfiguration = {\n      accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings,\n      audience: templateModel.audience,\n      authorizationRequest: templateModel.authorizationRequest.toRequest(),\n      buttonName: templateModel.buttonName,\n      clientId: templateModel.clientId,\n      issuer: templateModel.issuer,\n      logoutRequest: templateModel.logoutRequest.toRequest(),\n      onNewUser: templateModel.onNewUser,\n      providerName: templateModel.providerName,\n      redirectToPlatform: templateModel.redirectToPlatform || null,\n      refreshRequest: templateModel.refreshRequest.toRequest(),\n      signatureVerificationConfig:\n        templateModel.signatureVerificationConfig.toSignatureVerificationConfig(),\n      template: TemplateType.CUSTOM,\n      tokenRequest: templateModel.tokenRequest.toRequest(),\n      userIdConfig: templateModel.userIdConfig,\n      userManagementSource: templateModel.userManagementSource,\n      visibleOnLoginPage: templateModel.visibleOnLoginPage,\n      type: TenantLoginOptionType.OAUTH2,\n      grantType: GrantType.AUTHORIZATION_CODE,\n      externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig(),\n      useIdToken: templateModel.useIdToken\n    };\n    return ssoConfiguration;\n  }\n\n  mapTo(ssoConfiguration: SsoConfiguration): CustomSsoConfiguration {\n    return {\n      accessTokenToUserDataMappings: ssoConfiguration.accessTokenToUserDataMappings,\n      audience: ssoConfiguration.audience,\n      authorizationRequest: new RequestConfiguration(ssoConfiguration.authorizationRequest),\n      buttonName: ssoConfiguration.buttonName,\n      clientId: ssoConfiguration.clientId,\n      issuer: ssoConfiguration.issuer,\n      logoutRequest: new RequestConfiguration(ssoConfiguration.logoutRequest),\n      onNewUser: ssoConfiguration.onNewUser,\n      providerName: ssoConfiguration.providerName,\n      redirectToPlatform: ssoConfiguration.redirectToPlatform,\n      refreshRequest: new RequestConfiguration(ssoConfiguration.refreshRequest),\n      signatureVerificationConfig: new SignatureConfiguration(\n        ssoConfiguration.signatureVerificationConfig\n      ),\n      template: TemplateType.CUSTOM,\n      tokenRequest: new RequestConfiguration(ssoConfiguration.tokenRequest),\n      userIdConfig: ssoConfiguration.userIdConfig,\n      userManagementSource: ssoConfiguration.userManagementSource,\n      visibleOnLoginPage: ssoConfiguration.visibleOnLoginPage,\n      certificateType: CertificateType.CUSTOM,\n      externalTokenConfig: new ExternalToken(ssoConfiguration.externalTokenConfig),\n      useIdToken: ssoConfiguration.useIdToken\n    };\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { SsoConfiguration } from '../sso-configuration.model';\n\n@Injectable({ providedIn: 'root' })\nexport abstract class SsoConfigurationMapper<T> {\n  abstract mapTo: (ssoConfiguration: SsoConfiguration) => T;\n  abstract mapFrom: (templateModel: T) => SsoConfiguration;\n}\n","import { Input, Output, EventEmitter, Component, SimpleChanges } from '@angular/core';\nimport { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { SsoConfiguration } from '../sso-configuration.model';\nimport { Observable, Subscription } from 'rxjs';\nimport { IApplication, IIdentified, IUserGroup } from '@c8y/client';\n\n@Component({\n  template: '',\n  standalone: true\n})\nexport abstract class TemplateComponent<T> {\n  templateModel: T;\n  @Input() apps: IApplication[];\n  @Input() groups: IUserGroup[];\n  @Input() inventoryRoles: IIdentified[];\n  @Input() ssoConfiguration: SsoConfiguration;\n  @Input() ssoConfigurationChangeTrigger: Observable<void>;\n  @Output() ssoConfigurationChange = new EventEmitter<SsoConfiguration>();\n\n  triggerSubscription: Subscription;\n\n  protected constructor(protected configurationMapper: SsoConfigurationMapper<T>) {}\n\n  ngOnInit() {\n    this.triggerSubscription = this.ssoConfigurationChangeTrigger.subscribe(() => {\n      this.emitSsoConfiguration();\n    });\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.ssoConfiguration && changes.ssoConfiguration.currentValue) {\n      this.mapSsoConfiguration(changes.ssoConfiguration.currentValue);\n    }\n  }\n\n  ngOnDestroy() {\n    this.triggerSubscription.unsubscribe();\n  }\n\n  private mapSsoConfiguration(ssoConfiguration) {\n    this.templateModel = this.configurationMapper.mapTo(ssoConfiguration) as T;\n  }\n\n  private emitSsoConfiguration() {\n    const ssoConfiguration = this.configurationMapper.mapFrom(this.templateModel);\n    if (this.ssoConfiguration.id) {\n      ssoConfiguration.id = this.ssoConfiguration.id;\n    }\n    this.ssoConfigurationChange.emit(ssoConfiguration);\n  }\n}\n","import { Component, Input } from '@angular/core';\nimport {\n  memoize,\n  FormGroupComponent,\n  C8yTranslateDirective,\n  RequiredInputPlaceholderDirective,\n  DefaultValidationDirective,\n  IconDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { pull } from 'lodash-es';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport { NgIf, NgClass, NgFor } from '@angular/common';\n\n@Component({\n  selector: 'c8y-request-configuration',\n  templateUrl: './request-configuration.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    FormsModule,\n    NgIf,\n    NgClass,\n    FormGroupComponent,\n    C8yTranslateDirective,\n    RequiredInputPlaceholderDirective,\n    DefaultValidationDirective,\n    NgFor,\n    IconDirective,\n    C8yTranslatePipe\n  ]\n})\nexport class RequestConfigurationComponent {\n  @Input() templateModel;\n  @Input() requestName: string;\n  @Input() requestType:\n    | 'authorizationRequest'\n    | 'tokenRequest'\n    | 'refreshRequest'\n    | 'logoutRequest'\n    | 'tokenValidationRequest';\n\n  constructor(private controlContainer: ControlContainer) {}\n\n  @memoize()\n  shouldShow(field: string) {\n    return field in this.templateModel;\n  }\n\n  get requestConfiguration() {\n    return this.templateModel[this.requestType];\n  }\n\n  addCustomValue(array) {\n    const customValue = {\n      key: '',\n      value: ''\n    };\n    array.push(customValue);\n  }\n\n  removeCustomValue(array, customValue) {\n    pull(array, customValue);\n    this.controlContainer.control.markAsDirty();\n  }\n\n  get showBody() {\n    return this.requestConfiguration.method === 'POST' && this.requestType !== 'logoutRequest';\n  }\n}\n","<fieldset\n  class=\"p-24\"\n  ngModelGroup=\"{{ requestName }}\"\n  id=\"{{ requestType }}\"\n>\n  <div class=\"row\">\n    <div\n      class=\"col-xs-12 col-sm-3 col-md-2 m-b-xs-8\"\n      *ngIf=\"requestType !== 'tokenValidationRequest'\"\n    >\n      <div class=\"h4 text-normal text-right text-left-xs\">\n        {{ requestName }}\n      </div>\n    </div>\n\n    <div\n      [ngClass]=\"\n        requestType !== 'tokenValidationRequest' ? 'col-xs-12 col-sm-9 col-md-10 col-lg-9' : ''\n      \"\n      *ngIf=\"templateModel\"\n    >\n      <fieldset [ngClass]=\"requestType === 'tokenValidationRequest' ? 'c8y-fieldset p-24' : ''\">\n        <legend *ngIf=\"requestType === 'tokenValidationRequest'\">\n          {{ requestName }}\n        </legend>\n\n        <c8y-form-group>\n          <label\n            [for]=\"requestType + 'url'\"\n            class=\"control-label\"\n            translate\n          >\n            URL\n          </label>\n          <input\n            type=\"url\"\n            class=\"form-control\"\n            name=\"url\"\n            [id]=\"requestType + 'url'\"\n            [(ngModel)]=\"requestConfiguration.url\"\n            [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'http://www.example.com/' }\"\n            c8yDefaultValidation=\"httpUrl\"\n            [required]=\"requestType !== 'logoutRequest'\"\n          />\n        </c8y-form-group>\n\n        <c8y-form-group *ngIf=\"showBody\">\n          <label\n            [for]=\"requestType + 'body'\"\n            class=\"control-label\"\n            translate\n          >\n            Body\n          </label>\n          <input\n            type=\"text\"\n            class=\"form-control\"\n            name=\"body\"\n            [id]=\"requestType + 'body'\"\n            [(ngModel)]=\"requestConfiguration.body\"\n            required\n          />\n        </c8y-form-group>\n      </fieldset>\n\n      <fieldset\n        class=\"c8y-fieldset p-24\"\n        *ngIf=\"requestType !== 'logoutRequest'\"\n      >\n        <legend translate>Headers</legend>\n        <div\n          class=\"tight-grid visible-md visible-lg\"\n          *ngIf=\"requestConfiguration.headers.length > 0\"\n        >\n          <div class=\"col-md-6\">\n            <p class=\"text-medium\">\n              {{ 'Key' | translate }}\n            </p>\n          </div>\n          <div class=\"col-md-5\">\n            <p class=\"text-medium\">\n              {{ 'Value' | translate }}\n            </p>\n          </div>\n        </div>\n        <div\n          class=\"tight-grid\"\n          data-cy=\"c8y-authentication-single-sign-on--request-header\"\n          *ngFor=\"let header of requestConfiguration.headers; index as headerIndex\"\n        >\n          <div class=\"col-md-6\">\n            <c8y-form-group>\n              <label\n                [for]=\"requestType + 'headerKey' + headerIndex\"\n                class=\"visible-sm visible-xs\"\n                translate\n              >\n                Key\n              </label>\n              <input\n                class=\"form-control\"\n                [name]=\"'headerKey' + headerIndex\"\n                [id]=\"requestType + 'headerKey' + headerIndex\"\n                [(ngModel)]=\"header.key\"\n                [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'Authorization' }\"\n                required\n              />\n            </c8y-form-group>\n          </div>\n          <div class=\"col-md-5\">\n            <c8y-form-group>\n              <label\n                [for]=\"requestType + 'headerValue' + headerIndex\"\n                class=\"visible-sm visible-xs\"\n                translate\n              >\n                Value\n              </label>\n              <input\n                class=\"form-control\"\n                [name]=\"'headerValue' + headerIndex\"\n                [id]=\"requestType + 'headerValue' + headerIndex\"\n                [(ngModel)]=\"header.value\"\n                [placeholder]=\"\n                  'e.g. {{ example }}' | translate: { example: 'Basic USY7jW9jb2RlX2=' }\n                \"\n                required\n              />\n            </c8y-form-group>\n          </div>\n          <div class=\"col-md-1\">\n            <c8y-form-group>\n              <button\n                class=\"btn btn-link hidden-xs hidden-sm\"\n                type=\"button\"\n                title=\"{{ 'Remove' | translate }}\"\n                (click)=\"removeCustomValue(requestConfiguration.headers, header)\"\n              >\n                <i\n                  c8yIcon=\"minus-circle\"\n                  class=\"text-danger\"\n                ></i>\n              </button>\n              <button\n                class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n                title=\"{{ 'Remove' | translate }}\"\n                type=\"button\"\n                (click)=\"removeCustomValue(requestConfiguration.headers, header)\"\n              >\n                <i c8yIcon=\"minus-circle\"></i>\n                <span translate>Remove</span>\n              </button>\n            </c8y-form-group>\n          </div>\n        </div>\n        <button\n          class=\"btn btn-default m-t-8\"\n          type=\"button\"\n          title=\"{{ 'Add header' | translate }}\"\n          (click)=\"addCustomValue(requestConfiguration.headers)\"\n        >\n          <i\n            c8yIcon=\"plus-circle\"\n            class=\"m-r-4\"\n          ></i>\n          <span translate>Add header</span>\n        </button>\n      </fieldset>\n\n      <fieldset class=\"c8y-fieldset p-24\">\n        <legend translate>Request parameters</legend>\n        <div\n          class=\"tight-grid visible-md visible-lg\"\n          *ngIf=\"requestConfiguration.requestParams.length > 0\"\n        >\n          <div class=\"col-md-6\">\n            <p class=\"text-medium\">\n              {{ 'Key' | translate }}\n            </p>\n          </div>\n          <div class=\"col-md-5\">\n            <p class=\"text-medium\">\n              {{ 'Value' | translate }}\n            </p>\n          </div>\n        </div>\n        <div\n          class=\"tight-grid\"\n          data-cy=\"c8y-authentication-single-sign-on--request-parameter\"\n          *ngFor=\"let requestParam of requestConfiguration.requestParams; index as paramIndex\"\n        >\n          <div class=\"col-md-6\">\n            <c8y-form-group>\n              <label\n                [for]=\"requestType + 'paramKey' + paramIndex\"\n                class=\"visible-sm visible-xs\"\n                translate\n              >\n                Key\n              </label>\n              <input\n                class=\"form-control\"\n                [name]=\"'paramKey' + paramIndex\"\n                [id]=\"requestType + 'paramKey' + paramIndex\"\n                [(ngModel)]=\"requestParam.key\"\n                [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'client_id' }\"\n                required\n              />\n            </c8y-form-group>\n          </div>\n\n          <div class=\"col-md-5\">\n            <c8y-form-group>\n              <label\n                [for]=\"requestType + 'paramValue' + paramIndex\"\n                class=\"visible-sm visible-xs\"\n                translate\n              >\n                Value\n              </label>\n              <input\n                class=\"form-control\"\n                [name]=\"'paramValue' + paramIndex\"\n                [id]=\"requestType + 'paramValue' + paramIndex\"\n                [(ngModel)]=\"requestParam.value\"\n                [placeholder]=\"'e.g. {{ example }}' | translate: { example: '${clientId}' }\"\n                required\n              />\n            </c8y-form-group>\n          </div>\n\n          <div class=\"col-md-1\">\n            <c8y-form-group>\n              <button\n                class=\"btn btn-link hidden-xs hidden-sm\"\n                type=\"button\"\n                title=\"{{ 'Remove' | translate }}\"\n                (click)=\"removeCustomValue(requestConfiguration.requestParams, requestParam)\"\n              >\n                <i\n                  c8yIcon=\"minus-circle\"\n                  class=\"text-danger\"\n                ></i>\n              </button>\n\n              <button\n                class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n                type=\"button\"\n                title=\"{{ 'Remove' | translate }}\"\n                (click)=\"removeCustomValue(requestConfiguration.requestParams, requestParam)\"\n              >\n                <i c8yIcon=\"minus-circle\"></i>\n                <span translate>Remove</span>\n              </button>\n            </c8y-form-group>\n          </div>\n        </div>\n\n        <button\n          class=\"btn btn-default m-t-8\"\n          type=\"button\"\n          title=\"{{ 'Add request parameter' | translate }}\"\n          (click)=\"addCustomValue(requestConfiguration.requestParams)\"\n        >\n          <i\n            c8yIcon=\"plus-circle\"\n            class=\"m-r-4\"\n          ></i>\n          <span translate>Add request parameter</span>\n        </button>\n      </fieldset>\n    </div>\n  </div>\n</fieldset>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport {\n  memoize,\n  C8yTranslateDirective,\n  FormGroupComponent,\n  RequiredInputPlaceholderDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { NgClass, NgIf } from '@angular/common';\n\n@Component({\n  selector: 'c8y-user-id-configuration',\n  templateUrl: './user-id-configuration.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    NgClass,\n    NgIf,\n    C8yTranslateDirective,\n    FormGroupComponent,\n    RequiredInputPlaceholderDirective,\n    FormsModule,\n    C8yTranslatePipe\n  ]\n})\nexport class UserIdConfigurationComponent implements OnInit {\n  private static id = 0;\n\n  @Input() userIdConfig;\n  @Input() withHeader = true;\n\n  componentId = 0;\n\n  @memoize()\n  shouldShow(field: string) {\n    return field in this.userIdConfig;\n  }\n\n  ngOnInit(): void {\n    this.componentId = ++UserIdConfigurationComponent.id;\n  }\n}\n","<div [ngClass]=\"withHeader ? 'p-24' : 'd-contents'\">\n  <div [ngClass]=\"withHeader ? 'row' : 'd-contents'\">\n    <div\n      class=\"col-xs-12 col-sm-3 col-md-2\"\n      *ngIf=\"withHeader\"\n    >\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        User ID\n      </div>\n    </div>\n    <fieldset\n      [ngClass]=\"withHeader ? 'col-xs-12 col-sm-9 col-md-10 col-lg-9' : 'c8y-fieldset p-24'\"\n    >\n      <legend *ngIf=\"!withHeader\">\n        {{ 'User/App ID' | translate }}\n      </legend>\n\n      <div class=\"row\">\n        <div class=\"col-sm-6\">\n          <c8y-form-group *ngIf=\"userIdConfig.useConstantValue\">\n            <label\n              class=\"control-label\"\n              [for]=\"'constantValue' + componentId\"\n              translate\n            >\n              Constant value\n            </label>\n            <input\n              class=\"form-control\"\n              type=\"text\"\n              required\n              [id]=\"'constantValue' + componentId\"\n              [name]=\"'constantValue' + componentId\"\n              [(ngModel)]=\"userIdConfig.constantValue\"\n            />\n          </c8y-form-group>\n          <c8y-form-group *ngIf=\"!userIdConfig.useConstantValue\">\n            <label\n              class=\"control-label\"\n              [for]=\"'jwtField' + componentId\"\n              translate\n            >\n              JWT field\n            </label>\n            <input\n              class=\"form-control\"\n              type=\"text\"\n              required\n              [id]=\"'jwtField' + componentId\"\n              [name]=\"'jwtField' + componentId\"\n              [(ngModel)]=\"userIdConfig.jwtField\"\n              [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'upn' }\"\n            />\n          </c8y-form-group>\n        </div>\n        <div class=\"col-sm-6\">\n          <div\n            class=\"form-group\"\n            *ngIf=\"shouldShow('useConstantValue')\"\n          >\n            <div\n              class=\"form-group\"\n              *ngIf=\"shouldShow('useConstantValue')\"\n            >\n              <label\n                class=\"c8y-switch m-t-24\"\n                data-cy=\"c8y-authentication--external-token-configuration-constant-value-switcher\"\n                title=\"{{ 'Use constant value' | translate }}\"\n                [for]=\"'useConstantValue' + componentId\"\n              >\n                <input\n                  type=\"checkbox\"\n                  [name]=\"'useConstantValue' + componentId\"\n                  [id]=\"'useConstantValue' + componentId\"\n                  [(ngModel)]=\"userIdConfig.useConstantValue\"\n                />\n                <span></span>\n                <span class=\"control-label\">{{ 'Use constant value' | translate }}</span>\n              </label>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n  </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport { validationMethodConfig } from './external-token-config.model';\nimport { RequestConfiguration } from './request-configuration.model';\nimport {\n  C8yTranslateDirective,\n  FormGroupComponent,\n  RequiredInputPlaceholderDirective,\n  MinValidationDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { NgIf, NgFor, KeyValuePipe } from '@angular/common';\nimport { CollapseDirective } from 'ngx-bootstrap/collapse';\nimport { UserIdConfigurationComponent } from './user-id-configuration.component';\nimport { RequestConfigurationComponent } from './request-configuration.component';\n\n@Component({\n  selector: 'c8y-external-token-config',\n  templateUrl: './external-token-config.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    C8yTranslateDirective,\n    NgIf,\n    FormsModule,\n    CollapseDirective,\n    UserIdConfigurationComponent,\n    NgFor,\n    RequestConfigurationComponent,\n    FormGroupComponent,\n    RequiredInputPlaceholderDirective,\n    MinValidationDirective,\n    C8yTranslatePipe,\n    KeyValuePipe\n  ]\n})\nexport class ExternalTokenConfigComponent {\n  @Input() templateModel;\n\n  validationMethods = validationMethodConfig;\n\n  get externalTokenConfig() {\n    return this.templateModel.externalTokenConfig;\n  }\n\n  onValidationMethodChange(event) {\n    this.externalTokenConfig.validationMethod = event;\n    this.externalTokenConfig.tokenValidationRequest = new RequestConfiguration(\n      this.validationMethods[event].defaults\n    );\n  }\n}\n","<div class=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        External token configuration\n      </div>\n    </div>\n\n    <div\n      class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\"\n      *ngIf=\"templateModel\"\n    >\n      <label\n        class=\"c8y-switch\"\n        data-cy=\"c8y-authentication--external-token-configuration-switcher\"\n        title=\"{{ 'Allow authentication with access token from external IAM system' | translate }}\"\n      >\n        <input\n          id=\"enabled\"\n          name=\"enabled\"\n          type=\"checkbox\"\n          [(ngModel)]=\"externalTokenConfig.enabled\"\n        />\n        <span></span>\n        <span class=\"control-label\">\n          {{ 'Allow authentication with access token from external IAM system' | translate }}\n        </span>\n      </label>\n\n      <div\n        class=\"collapse\"\n        [collapse]=\"!externalTokenConfig.enabled\"\n        [isAnimated]=\"true\"\n      >\n        <ng-container *ngIf=\"externalTokenConfig.enabled\">\n          <c8y-user-id-configuration\n            [userIdConfig]=\"externalTokenConfig.userOrAppIdConfig\"\n            [withHeader]=\"false\"\n          ></c8y-user-id-configuration>\n\n          <label\n            class=\"c8y-switch\"\n            title=\"{{ 'Validate access token' | translate }}\"\n            for=\"validationRequired\"\n          >\n            <input\n              id=\"validationRequired\"\n              name=\"validationRequired\"\n              type=\"checkbox\"\n              [(ngModel)]=\"externalTokenConfig.validationRequired\"\n            />\n            <span></span>\n            <span class=\"control-label\">{{ 'Validate access token' | translate }}</span>\n          </label>\n          <div\n            class=\"collapse\"\n            [collapse]=\"!externalTokenConfig.validationRequired\"\n            [isAnimated]=\"true\"\n          >\n            <ng-container *ngIf=\"externalTokenConfig.validationRequired\">\n              <div class=\"row\">\n                <div class=\"col-sm-6 m-t-16\">\n                  <label\n                    class=\"control-label\"\n                    for=\"validationMethod\"\n                    translate\n                  >\n                    Validation method\n                  </label>\n                  <div class=\"c8y-select-wrapper\">\n                    <select\n                      class=\"form-control\"\n                      id=\"validationMethod\"\n                      name=\"validationMethod\"\n                      [ngModel]=\"externalTokenConfig.validationMethod\"\n                      (ngModelChange)=\"onValidationMethodChange($event)\"\n                    >\n                      <option\n                        *ngFor=\"let validationMethod of validationMethods | keyvalue\"\n                        [ngValue]=\"validationMethod.key\"\n                      >\n                        {{ validationMethod.value.label | translate }}\n                      </option>\n                    </select>\n                    <span></span>\n                  </div>\n                </div>\n              </div>\n              <div class=\"row\">\n                <c8y-request-configuration\n                  [templateModel]=\"externalTokenConfig\"\n                  [requestName]=\"'Token validation request' | translate\"\n                  [requestType]=\"'tokenValidationRequest'\"\n                ></c8y-request-configuration>\n              </div>\n              <div class=\"row\">\n                <div class=\"col-sm-6 m-l-8\">\n                  <c8y-form-group>\n                    <label\n                      class=\"control-label\"\n                      for=\"accessTokenValidityCheckIntervalInMinutes\"\n                      translate\n                    >\n                      Access token validation frequency\n                    </label>\n                    <div class=\"input-group\">\n                      <input\n                        class=\"form-control\"\n                        id=\"accessTokenValidityCheckIntervalInMinutes\"\n                        name=\"accessTokenValidityCheckIntervalInMinutes\"\n                        type=\"number\"\n                        required\n                        [(ngModel)]=\"externalTokenConfig.accessTokenValidityCheckIntervalInMinutes\"\n                        [placeholder]=\"'e.g. {{ example }}' | translate: { example: '1' }\"\n                        step=\"1\"\n                        [min]=\"1\"\n                      />\n                      <span\n                        class=\"input-group-addon\"\n                        translate\n                      >\n                        minutes\n                      </span>\n                    </div>\n                  </c8y-form-group>\n                </div>\n              </div>\n            </ng-container>\n          </div>\n        </ng-container>\n      </div>\n    </div>\n  </div>\n</div>\n","import { Component, Input, OnChanges } from '@angular/core';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  memoize,\n  C8yTranslateDirective,\n  FormGroupComponent,\n  RequiredInputPlaceholderDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { TenantService } from '@c8y/client';\nimport { NgIf } from '@angular/common';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\n\n@Component({\n  selector: 'c8y-basic-configuration',\n  templateUrl: './basic-configuration.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    C8yTranslateDirective,\n    NgIf,\n    FormGroupComponent,\n    RequiredInputPlaceholderDirective,\n    FormsModule,\n    PopoverDirective,\n    C8yTranslatePipe\n  ]\n})\nexport class BasicConfigurationComponent implements OnChanges {\n  @Input() templateModel;\n\n  REDIRECT_TO_THE_USER_INTERFACE_APPLICATION_TOOLTIP = gettext(\n    \"The redirect URL is automatically set to the application used by the user. In case of an error, it will be correctly displayed on the application's page.\"\n  );\n\n  redirectToPlatformWarningParams: { defaultRedirectUrl: string; host?: string };\n  flowControlledByUI = false;\n  redirectToPlatform = '';\n\n  constructor(private tenantService: TenantService) {}\n\n  @memoize()\n  shouldShow(field: string) {\n    return field in this.templateModel;\n  }\n\n  async ngOnChanges() {\n    const currentTenant = (await this.tenantService.current()).data;\n    const { domainName } = currentTenant;\n    this.redirectToPlatformWarningParams = {\n      host: `https://${domainName}`,\n      defaultRedirectUrl: `https://${domainName}/tenant/oauth`\n    };\n    this.redirectToPlatform = this.templateModel.redirectToPlatform || '';\n    this.flowControlledByUI = !this.templateModel.redirectToPlatform;\n  }\n}\n","<fieldset class=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2 m-b-xs-8\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        Basic\n      </div>\n    </div>\n\n    <div\n      class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\"\n      *ngIf=\"templateModel\"\n    >\n      <div class=\"row\">\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('keyCloakAddress')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"keyCloakAddress\"\n              translate\n            >\n              Keycloak address\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"keyCloakAddress\"\n              name=\"keyCloakAddress\"\n              type=\"url\"\n              required\n              [(ngModel)]=\"templateModel.keyCloakAddress\"\n              [placeholder]=\"'e.g. {{ example }}' | translate : { example: 'https://example.de' }\"\n            />\n          </c8y-form-group>\n        </div>\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('aadAddress')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"aadAddress\"\n              translate\n            >\n              Azure AD address\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"aadAddress\"\n              name=\"aadAddress\"\n              type=\"url\"\n              required\n              [(ngModel)]=\"templateModel.aadAddress\"\n              [placeholder]=\"\n                'e.g. {{ example }}' | translate : { example: 'https://login.microsoftonline.de' }\n              \"\n            />\n          </c8y-form-group>\n        </div>\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('tenant')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"tenant\"\n              translate\n            >\n              Tenant\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"tenant\"\n              name=\"tenant\"\n              required\n              [(ngModel)]=\"templateModel.tenant\"\n              [placeholder]=\"'e.g. {{ example }}' | translate : { example: 'c8y.onmicrosoft.de' }\"\n            />\n          </c8y-form-group>\n        </div>\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('applicationId')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"applicationId\"\n              translate\n            >\n              Application ID\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"applicationId\"\n              name=\"applicationId\"\n              required\n              [(ngModel)]=\"templateModel.applicationId\"\n            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('realmName')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"realmName\"\n              translate\n            >\n              Realm name\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"realmName\"\n              name=\"realmName\"\n              required\n              [(ngModel)]=\"templateModel.realmName\"\n            />\n          </c8y-form-group>\n        </div>\n      </div>\n\n      <div class=\"row\" *ngIf=\"shouldShow('redirectToPlatform')\">\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"redirectToPlatform\"\n            >\n              {{ 'Redirect URL' | translate }}\n              <button\n                class=\"btn-help\"\n                [attr.aria-label]=\"'Help' | translate\"\n                [popover]=\"helpContent\"\n                placement=\"bottom\"\n                triggers=\"focus\"\n                type=\"button\"\n                [adaptivePosition]=\"false\"\n                *ngIf=\"\n                  !flowControlledByUI &&\n                  redirectToPlatformWarningParams &&\n                  templateModel.redirectToPlatform !=\n                    redirectToPlatformWarningParams.defaultRedirectUrl\n                \"\n              ></button>\n              <ng-template #helpContent>\n                <span\n                  ngNonBindable\n                  translate\n                  [translateParams]=\"redirectToPlatformWarningParams\"\n                >\n                  For correct application behavior you can use only \"{{ host }}\" or \"{{\n                    defaultRedirectUrl\n                  }}\", the latter one is recommended.\n                </span>\n              </ng-template>\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"redirectToPlatform\"\n              name=\"redirectToPlatform\"\n              type=\"url\"\n              [required]=\"!flowControlledByUI\"\n              [disabled]=\"flowControlledByUI\"\n              [(ngModel)]=\"templateModel.redirectToPlatform\"\n              [placeholder]=\"\n                'e.g. {{ example }}'\n                  | translate\n                    : {\n                        example:\n                          redirectToPlatformWarningParams?.defaultRedirectUrl ||\n                          'https://tenant.domain.com'\n                      }\n              \"\n            />\n          </c8y-form-group>\n        </div>\n        <div class=\"col-sm-6\">\n          <div\n            class=\"form-group\"\n          >\n            <label\n              class=\"c8y-switch m-t-24\"\n              title=\"{{ 'Redirect to the user interface application`SSO authentication`' | translate }}\"\n              for=\"flowControlledByUI\"\n            >\n              <input\n                type=\"checkbox\"\n                name=\"flowControlledByUI\"\n                id=\"flowControlledByUI\"\n                [(ngModel)]=\"flowControlledByUI\"\n                (change)=\"templateModel.redirectToPlatform = flowControlledByUI ? '' : redirectToPlatform\"\n              />\n              <span></span>\n              <span class=\"control-label\">{{ 'Redirect to the user interface application`SSO authentication`' | translate }}</span>\n              <button\n                type=\"button\"\n                class=\"btn-help\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{ REDIRECT_TO_THE_USER_INTERFACE_APPLICATION_TOOLTIP | translate }}\"\n                placement=\"right\"\n                triggers=\"focus\"\n                container=\"body\"\n              ></button>\n            </label>\n          </div>\n        </div>\n        <div class=\"col-sm-12\">\n          <div *ngIf=\"flowControlledByUI && redirectToPlatform != ''\">\n            <div class=\"alert alert-warning max-width-100 m-b-32\"\n                 ngNonBindable\n                 translate\n                 [translateParams]=\"{\n                      redirectURI: '<tenant_domain>/apps/*'\n                    }\">\n              Make sure that \"Valid Redirect URIs\" in the authorization server is set to \"{{ redirectURI }}\" or to the full URIs of the used applications if the authorization server does not support patterns.\n            </div>\n          </div>\n          <div *ngIf=\"!flowControlledByUI && redirectToPlatform === ''\">\n            <div class=\"alert alert-warning max-width-100 m-b-32\"\n                 ngNonBindable\n                 translate\n                 [translateParams]=\"{\n                      redirectURI: '<tenant_domain>/tenant/oauth'\n                    }\">\n              Make sure that \"Valid Redirect URIs\" in the authorization server is set to \"{{ redirectURI }}\".\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('clientSecret')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"clientSecret\"\n              translate\n            >\n              Client secret\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"clientSecret\"\n              name=\"clientSecret\"\n              required\n              [(ngModel)]=\"templateModel.clientSecret\"\n            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('clientId')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"clientId\"\n              translate\n            >\n              Client ID\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"clientId\"\n              name=\"clientId\"\n              required\n              [(ngModel)]=\"templateModel.clientId\"\n              [placeholder]=\"\n                'e.g. {{ example }}' | translate : { example: '254234981c-78a8-4588…' }\n              \"\n            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('issuer')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"issuer\"\n              translate\n            >\n              Token issuer\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"issuer\"\n              name=\"issuer\"\n              required\n              [(ngModel)]=\"templateModel.issuer\"\n              [placeholder]=\"\n                'e.g. {{ example }}'\n                  | translate : { example: 'https://login.microsoftonline.de/237652-3727' }\n              \"\n            />\n          </c8y-form-group>\n        </div>\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('scopeId')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"scopeId\"\n              translate\n            >\n              Scope ID\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"scopeId\"\n              name=\"scopeId\"\n              [(ngModel)]=\"templateModel.scopeId\"\n              [placeholder]=\"'e.g. {{ example }}' | translate: { example: '237652-3727' }\"\n            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('buttonName')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"buttonName\"\n              translate\n            >\n              Button name\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"buttonName\"\n              name=\"buttonName\"\n              required\n              [(ngModel)]=\"templateModel.buttonName\"\n              [placeholder]=\"'e.g. Log in with Azure AD' | translate\"\n            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('providerName')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"providerName\"\n              translate\n            >\n              Provider name\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"providerName\"\n              name=\"providerName\"\n              required\n              [(ngModel)]=\"templateModel.providerName\"\n              [placeholder]=\"'e.g. {{ example }}' | translate : { example: 'Azure AD' }\"\n            />\n          </c8y-form-group>\n        </div>\n\n        <div\n          class=\"col-sm-6\"\n          *ngIf=\"shouldShow('audience')\"\n        >\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"audience\"\n              translate\n            >\n              Audience\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"audience\"\n              name=\"audience\"\n              required\n              [(ngModel)]=\"templateModel.audience\"\n              [placeholder]=\"\n                'e.g. {{ example }}' | translate : { example: 'https://test.example.com' }\n              \"\n            />\n          </c8y-form-group>\n        </div>\n      </div>\n\n      <div\n        class=\"row\"\n        *ngIf=\"shouldShow('visibleOnLoginPage')\"\n      >\n        <div class=\"col-sm-6\">\n          <label\n            class=\"c8y-switch\"\n            title=\"{{ 'Visible on login page' | translate }}\"\n            for=\"visibleOnLoginPage\"\n          >\n            <input\n              id=\"visibleOnLoginPage\"\n              name=\"visibleOnLoginPage\"\n              type=\"checkbox\"\n              [(ngModel)]=\"templateModel.visibleOnLoginPage\"\n            />\n            <span></span>\n            <span class=\"control-label\">{{ 'Visible on login page' | translate }}</span>\n          </label>\n        </div>\n      </div>\n    </div>\n  </div>\n</fieldset>\n","import {\n  Component,\n  ContentChild,\n  Input,\n  TemplateRef,\n  ElementRef,\n  AfterViewInit,\n  inject,\n  ChangeDetectorRef,\n  Renderer2,\n  OnInit,\n  OnChanges\n} from '@angular/core';\nimport { PageChangedEvent, PaginationModule } from 'ngx-bootstrap/pagination';\nimport { CoreModule } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-paginated-list-group',\n  templateUrl: './paginated-list-group.component.html',\n  standalone: true,\n  imports: [CoreModule, PaginationModule]\n})\nexport class PaginatedListGroupComponent<T> implements OnInit, OnChanges, AfterViewInit {\n  @Input() items: T[] = [];\n  @Input() itemsPerPage = 5;\n  @ContentChild(TemplateRef) itemTemplate: TemplateRef<any>;\n\n  currentPage = 1;\n  currentPageItems: T[] = [];\n\n  private cdr = inject(ChangeDetectorRef);\n  private host = inject(ElementRef);\n  private renderer = inject(Renderer2);\n\n  ngOnInit() {\n    this.updateCurrentPageItems();\n  }\n\n  ngOnChanges() {\n    this.updateCurrentPageItems();\n  }\n\n  ngAfterViewInit() {\n    if (!this.itemTemplate) {\n      throw new Error('c8y-paginated-list-group requires an <ng-template> to be provided.');\n    }\n    this.updateCurrentPageItems();\n  }\n\n  pageChanged(event: PageChangedEvent) {\n    this.currentPage = event.page;\n    this.itemsPerPage = event.itemsPerPage;\n    this.updateCurrentPageItems();\n    this.cdr.detectChanges();\n\n    // keep the pagination component in view after page change:\n    const pagination = this.host.nativeElement.querySelector('pagination');\n    if (pagination.scrollIntoView) {\n      pagination.scrollIntoView({ behavior: 'smooth', block: 'center' });\n    }\n  }\n\n  updateCurrentPageItems() {\n    this.currentPageItems = this.items.slice(\n      (this.currentPage - 1) * this.itemsPerPage,\n      this.currentPage * this.itemsPerPage\n    );\n  }\n\n  getItemIndex(item: T): number {\n    return this.items.indexOf(item);\n  }\n\n  goToLastItem() {\n    const lastPage = Math.ceil(this.items.length / this.itemsPerPage) || 1;\n    this.currentPage = lastPage;\n    this.updateCurrentPageItems();\n    this.cdr.detectChanges();\n\n    const root = this.host.nativeElement;\n    const listItems = root.querySelectorAll('c8y-li:not(.sticky-bottom)');\n    if (listItems.length > 0) {\n      const lastItem = listItems[listItems.length - 1];\n      if (lastItem.scrollIntoView) {\n        lastItem.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n      this.renderer.addClass(lastItem, 'highlighted');\n      setTimeout(() => this.renderer.removeClass(lastItem, 'highlighted'), 2000);\n    }\n  }\n}\n","<div\n  class=\"container-fluid\"\n  *ngIf=\"items.length > 0\"\n>\n  <c8y-list-group>\n    <c8y-li *ngFor=\"let item of currentPageItems; let i = index\">\n      <ng-container\n        *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item, index: getItemIndex(item) }\"\n      ></ng-container>\n    </c8y-li>\n    <c8y-li class=\"sticky-bottom\">\n      <pagination\n        [totalItems]=\"items.length\"\n        [(ngModel)]=\"currentPage\"\n        [ngModelOptions]=\"{ standalone: true }\"\n        [itemsPerPage]=\"itemsPerPage\"\n        (pageChanged)=\"pageChanged($event)\"\n        [maxSize]=\"10\"\n        [boundaryLinks]=\"true\"\n        previousText=\"&nbsp;\"\n        nextText=\"&nbsp;\"\n        firstText=\"&laquo;\"\n        lastText=\"&raquo;\"\n      ></pagination>\n    </c8y-li>\n  </c8y-list-group>\n</div>\n","import { gettext } from '@c8y/ngx-components/gettext';\n\nexport const relations = [\n  {\n    name: 'EQ',\n    value: 'EQ',\n    label: '=',\n    ordinal: 0\n  },\n  {\n    name: 'NEQ',\n    value: 'NEQ',\n    label: '!=',\n    ordinal: 1\n  },\n  {\n    name: 'GT',\n    value: 'GT',\n    label: '>',\n    ordinal: 2\n  },\n  {\n    name: 'LT',\n    value: 'LT',\n    label: '<',\n    ordinal: 3\n  },\n  {\n    name: 'GTE',\n    value: 'GTE',\n    label: '>=',\n    ordinal: 4\n  },\n  {\n    name: 'LTE',\n    value: 'LTE',\n    label: '<=',\n    ordinal: 5\n  },\n  {\n    name: 'IN',\n    value: 'IN',\n    label: gettext('in`value-range`'),\n    ordinal: 6\n  }\n];\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport { pull } from 'lodash-es';\nimport { relations } from './dynamic-accesss-mapping-relations.model';\nimport { ChildPredicate } from '../../sso-configuration.model';\nimport {\n  C8yTranslateDirective,\n  FormGroupComponent,\n  RequiredInputPlaceholderDirective,\n  IconDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { NgFor, NgIf } from '@angular/common';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n  selector: 'c8y-sso-child-predicates',\n  templateUrl: './child-predicates.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    C8yTranslateDirective,\n    NgFor,\n    FormGroupComponent,\n    RequiredInputPlaceholderDirective,\n    FormsModule,\n    TooltipDirective,\n    IconDirective,\n    NgIf,\n    C8yTranslatePipe\n  ]\n})\nexport class ChildPredicatesComponent {\n  @Input() childPredicates: ChildPredicate[];\n  @Input() accessMappingIndex: string;\n  @Output() onRemoveAllChildPredicates: EventEmitter<null> = new EventEmitter();\n\n  relations = relations;\n\n  constructor(private controlContainer: ControlContainer) {}\n\n  removeChildPredicate(childPredicate: ChildPredicate) {\n    pull(this.childPredicates, childPredicate);\n    if (this.childPredicates.length === 0) {\n      this.onRemoveAllChildPredicates.emit();\n    }\n    this.controlContainer.control.markAsDirty();\n  }\n\n  addChildPredicate() {\n    this.childPredicates.push({\n      operator: 'EQ',\n      parameterPath: '',\n      value: ''\n    });\n  }\n}\n","<fieldset class=\"c8y-fieldset p-16\">\n  <legend>{{ 'When' | translate }}</legend>\n  <div class=\"tight-grid hidden-sm hidden-xs\">\n    <div class=\"col-md-4\">\n      <label translate>Key</label>\n    </div>\n    <div class=\"col-md-2\">\n      <label translate>Operator`logical`</label>\n    </div>\n    <div class=\"col-md-4\">\n      <label translate>Value</label>\n    </div>\n  </div>\n  <div\n    class=\"tight-grid\"\n    *ngFor=\"let childPredicate of childPredicates; last as isLast; index as idx\"\n  >\n    <div class=\"col-md-4\">\n      <c8y-form-group>\n        <label\n          [for]=\"'parameterPath' + accessMappingIndex + idx\"\n          class=\"visible-sm visible-xs\"\n          translate\n        >\n          Key\n        </label>\n        <input\n          [name]=\"'parameterPath' + accessMappingIndex + idx\"\n          [id]=\"'parameterPath' + accessMappingIndex + idx\"\n          type=\"text\"\n          class=\"form-control\"\n          [(ngModel)]=\"childPredicate.parameterPath\"\n          placeholder=\"{{ 'Key' | translate }}\"\n          required\n        />\n      </c8y-form-group>\n    </div>\n    <div class=\"col-md-2\">\n      <c8y-form-group>\n        <label\n          [for]=\"'operator' + accessMappingIndex + idx\"\n          class=\"visible-sm visible-xs\"\n          translate\n        >\n          Operator`logical`\n        </label>\n        <div class=\"c8y-select-wrapper\">\n          <select\n            class=\"form-control\"\n            [name]=\"'operator' + accessMappingIndex + idx\"\n            [id]=\"'operator' + accessMappingIndex + idx\"\n            [(ngModel)]=\"childPredicate.operator\"\n            required\n          >\n            <option\n              *ngFor=\"let relation of relations\"\n              [ngValue]=\"relation.value\"\n            >\n              {{ relation.label | translate }}\n            </option>\n          </select>\n          <span></span>\n        </div>\n      </c8y-form-group>\n    </div>\n    <div class=\"col-md-4\">\n      <c8y-form-group>\n        <label\n          [for]=\"'value' + accessMappingIndex + idx\"\n          class=\"visible-sm visible-xs\"\n          translate\n        >\n          Value\n        </label>\n        <input\n          [id]=\"'value' + accessMappingIndex + idx\"\n          [name]=\"'value' + accessMappingIndex + idx\"\n          type=\"text\"\n          class=\"form-control\"\n          [(ngModel)]=\"childPredicate.value\"\n          placeholder=\"{{ 'Value' | translate }}\"\n          required\n        />\n      </c8y-form-group>\n    </div>\n    <div class=\"col-md-1\">\n      <c8y-form-group>\n        <button\n          class=\"btn btn-dot btn-dot--danger hidden-xs hidden-sm\"\n          name=\"removeButton\"\n          (click)=\"removeChildPredicate(childPredicate)\"\n          tooltip=\"{{ 'Remove' | translate }}\"\n          [attr.aria-label]=\"'Remove' | translate\"\n          [delay]=\"300\"\n          type=\"button\"\n        >\n          <i c8yIcon=\"minus-circle\"></i>\n        </button>\n        <button\n          name=\"removeButton\"\n          class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n          (click)=\"removeChildPredicate(childPredicate)\"\n          title=\"{{ 'Remove' | translate }}\"\n          type=\"button\"\n        >\n          <i c8yIcon=\"minus-circle\"></i>\n          <span translate>Remove</span>\n        </button>\n      </c8y-form-group>\n    </div>\n    <div class=\"col-md-1\">\n      <c8y-form-group *ngIf=\"isLast\">\n        <button\n          title=\"{{ 'and' | translate }}\"\n          class=\"btn btn-default btn-block btn-sm\"\n          (click)=\"addChildPredicate()\"\n          type=\"button\"\n          translate\n        >\n          and\n        </button>\n      </c8y-form-group>\n    </div>\n  </div>\n</fieldset>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { IApplication, IUserGroup } from '@c8y/client';\nimport { AccessMapping } from '../../sso-configuration.model';\nimport { NgIf } from '@angular/common';\nimport { ChildPredicatesComponent } from './child-predicates.component';\nimport { SelectLegacyComponent, C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-sso-dynamic-access-mapping',\n  templateUrl: './dynamic-access-mapping.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [NgIf, ChildPredicatesComponent, SelectLegacyComponent, C8yTranslatePipe]\n})\nexport class DynamicAccessMappingComponent {\n  @Input() groups: IUserGroup[];\n  selectedGroups: IUserGroup[];\n\n  @Input() apps: IApplication[];\n  selectedApps: IApplication[];\n\n  @Input() accessMapping: AccessMapping;\n  @Output() onRemoveAccessMapping: EventEmitter<AccessMapping> = new EventEmitter();\n\n  @Input() accessMappingIndex: number;\n\n  constructor(public controlContainer: ControlContainer) {}\n\n  ngOnChanges(): void {\n    if (this.accessMapping && this.apps && this.groups) {\n      this.setSelectedItems();\n    }\n  }\n\n  onRemoveAllChildPredicates() {\n    this.onRemoveAccessMapping.emit(this.accessMapping);\n  }\n\n  getIds(selectedItems) {\n    return selectedItems.map(item => parseInt(item.id, 10));\n  }\n\n  private setSelectedItems() {\n    if (this.accessMapping) {\n      if (this.accessMapping.thenGroups) {\n        this.selectedGroups = this.groups.filter(item =>\n          this.accessMapping.thenGroups.includes(item.id)\n        );\n      }\n      if (this.accessMapping.thenApplications) {\n        this.selectedApps = this.apps.filter(item =>\n          this.accessMapping.thenApplications.includes(+item.id)\n        );\n      }\n    }\n  }\n}\n","<fieldset class=\"c8y-fieldset p-8\">\n  <div *ngIf=\"accessMapping.when.childPredicates.length != 0\">\n    <c8y-sso-child-predicates\n      [childPredicates]=\"accessMapping.when.childPredicates\"\n      [accessMappingIndex]=\"'am' + accessMappingIndex\"\n      (onRemoveAllChildPredicates)=\"onRemoveAllChildPredicates()\"\n    ></c8y-sso-child-predicates>\n\n    <fieldset class=\"c8y-fieldset p-16\">\n      <legend>\n        {{ 'Provide access to' | translate }}\n      </legend>\n      <div class=\"row\">\n        <div class=\"col-sm-6\">\n          <div\n            class=\"form-group\"\n            title=\"{{ 'Default global roles' | translate }}\"\n          >\n            <label\n              class=\"control-label\"\n              [for]=\"'groups' + accessMappingIndex\"\n            >\n              {{ 'Default global roles' | translate }}\n            </label>\n            <c8y-select-legacy\n              [id]=\"'groups' + accessMappingIndex\"\n              [items]=\"groups\"\n              [selected]=\"selectedGroups\"\n              [disableApplyOnNoSelection]=\"true\"\n              (onChange)=\"\n                controlContainer.control.markAsDirty();\n                selectedGroups = $event;\n                accessMapping.thenGroups = getIds($event)\n              \"\n              [addDropdownContainerToBody]=\"true\"\n            ></c8y-select-legacy>\n          </div>\n        </div>\n        <div class=\"col-sm-6\">\n          <div\n            class=\"form-group\"\n            title=\"{{ 'Default applications' | translate }}\"\n          >\n            <label\n              class=\"control-label\"\n              [for]=\"'apps' + accessMappingIndex\"\n            >\n              {{ 'Default applications' | translate }}\n            </label>\n            <c8y-select-legacy\n              [id]=\"'apps' + accessMappingIndex\"\n              [items]=\"apps\"\n              [selected]=\"selectedApps\"\n              [disableApplyOnNoSelection]=\"true\"\n              (onChange)=\"\n                controlContainer.control.markAsDirty();\n                selectedApps = $event;\n                accessMapping.thenApplications = getIds($event)\n              \"\n              [addDropdownContainerToBody]=\"true\"\n            ></c8y-select-legacy>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n  </div>\n</fieldset>\n","import { Component, EventEmitter } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { IIdentified } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { AssetSelectorComponent } from '@c8y/ngx-components/assets-navigator';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n  selector: 'c8y-sso-inventory-roles-modal',\n  templateUrl: './inventory-roles-modal.component.html',\n  imports: [IconDirective, AssetSelectorComponent, FormsModule, C8yTranslatePipe]\n})\nexport class InventoryRolesModalComponent {\n  selectedGroups: IIdentified[];\n\n  resultEmitter: EventEmitter<IIdentified[]> = new EventEmitter<IIdentified[]>();\n\n  label = gettext('Groups');\n\n  constructor(public modal: BsModalRef) {}\n\n  dismiss() {\n    this.modal.hide();\n  }\n\n  select() {\n    this.resultEmitter.emit(this.selectedGroups);\n    this.modal.hide();\n  }\n}\n","<div class=\"viewport-modal\">\n  <div class=\"modal-header dialog-header\">\n    <i c8yIcon=\"c8y-group-open\"></i>\n    <h4 id=\"modal-title\">{{ 'Select from inventory' | translate }}</h4>\n  </div>\n  <div class=\"modal-inner-scroll\">\n    <div\n      id=\"modal-body\"\n      class=\"bg-component\"\n    >\n      <c8y-asset-selector\n        class=\"d-contents\"\n        [(ngModel)]=\"selectedGroups\"\n        [config]=\"{\n          label: label,\n          showFilter: true,\n          multi: true,\n          groupsSelectable: true,\n          columnHeaders: false,\n          singleColumn: true,\n          groupsOnly: true\n        }\"\n      ></c8y-asset-selector>\n    </div>\n  </div>\n\n  <div class=\"modal-footer\">\n    <button\n      class=\"btn btn-default\"\n      type=\"button\"\n      title=\"{{ 'Cancel' | translate }}\"\n      (click)=\"dismiss()\"\n    >\n      {{ 'Cancel' | translate }}\n    </button>\n    <button\n      class=\"btn btn-primary\"\n      type=\"button\"\n      title=\"{{ 'Select' | translate }}\"\n      (click)=\"select()\"\n    >\n      {{ 'Select' | translate }}\n    </button>\n  </div>\n</div>\n","import { Component, Output, Input, EventEmitter } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { InventoryMapping, InventoryRole } from '../../sso-configuration.model';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { InventoryRolesModalComponent } from './inventory-roles-modal.component';\nimport { take, tap } from 'rxjs/operators';\nimport { IIdentified } from '@c8y/client';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { ChildPredicatesComponent } from './child-predicates.component';\nimport {\n  C8yTranslateDirective,\n  IconDirective,\n  SelectLegacyComponent,\n  C8yTranslatePipe,\n  MoNamePipe\n} from '@c8y/ngx-components';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n  selector: 'c8y-sso-inventory-roles-mapping',\n  templateUrl: './inventory-roles-mapping.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    NgIf,\n    ChildPredicatesComponent,\n    C8yTranslateDirective,\n    NgFor,\n    IconDirective,\n    SelectLegacyComponent,\n    TooltipDirective,\n    C8yTranslatePipe,\n    AsyncPipe,\n    MoNamePipe\n  ]\n})\nexport class InventoryRolesMappingComponent {\n  @Input() inventoryMapping: InventoryMapping;\n  @Input() inventoryMappingIndex: number;\n\n  @Input() inventoryRoles: IIdentified[] = [];\n  selectedInventoryRoles: IIdentified[] = [];\n\n  @Output() onRemoveInventoryMapping: EventEmitter<InventoryMapping> = new EventEmitter();\n\n  constructor(\n    public controlContainer: ControlContainer,\n    private bsModal: BsModalService\n  ) {}\n\n  ngOnChanges(): void {\n    this.setSelectedInventoryRoles();\n  }\n\n  onRemoveAllChildPredicates() {\n    this.onRemoveInventoryMapping.emit(this.inventoryMapping);\n  }\n\n  getIds(selectedItems: IIdentified[]) {\n    return selectedItems.map(item => item.id);\n  }\n\n  removeInventoryRole(inventoryRole: InventoryRole) {\n    this.inventoryMapping.thenInventoryRoles = this.inventoryMapping.thenInventoryRoles.filter(\n      value => value.managedObject !== inventoryRole.managedObject\n    );\n    delete this.selectedInventoryRoles[inventoryRole.managedObject];\n  }\n\n  addInventoryRoles() {\n    const currentlySelectedGroups: IIdentified[] = this.inventoryMapping.thenInventoryRoles.map(\n      inventoryRole => ({ id: inventoryRole.managedObject })\n    );\n    const modal = this.bsModal.show(InventoryRolesModalComponent, {\n      ignoreBackdropClick: true,\n      class: 'modal-sm',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      initialState: {\n        selectedGroups: currentlySelectedGroups\n      }\n    });\n    modal.content.resultEmitter\n      .pipe(\n        take(1),\n        tap(() => this.controlContainer.control.markAsDirty())\n      )\n      .subscribe(selectedGroups => {\n        const newSelectedGroups = selectedGroups.filter(\n          group => !currentlySelectedGroups.some(({ id }) => id === group.id)\n        );\n        const newInventoryRoles: InventoryRole[] = newSelectedGroups.map(\n          group => ({ managedObject: group.id, roleIds: [] }) as InventoryRole\n        );\n        this.inventoryMapping.thenInventoryRoles =\n          this.inventoryMapping.thenInventoryRoles.concat(newInventoryRoles);\n      });\n  }\n\n  private setSelectedInventoryRoles() {\n    if (this.inventoryMapping && this.inventoryMapping.thenInventoryRoles && this.inventoryRoles) {\n      this.inventoryMapping.thenInventoryRoles.forEach(inventoryRole => {\n        this.selectedInventoryRoles[inventoryRole.managedObject] = this.inventoryRoles.filter(\n          item => inventoryRole.roleIds.includes(+item.id)\n        );\n      });\n    }\n  }\n}\n","<fieldset class=\"c8y-fieldset p-t-8 p-b-8 p-l-16 p-r-16\">\n  <div *ngIf=\"inventoryMapping.when.childPredicates.length !== 0\">\n    <c8y-sso-child-predicates\n      [childPredicates]=\"inventoryMapping.when.childPredicates\"\n      [accessMappingIndex]=\"'irm' + inventoryMappingIndex\"\n      (onRemoveAllChildPredicates)=\"onRemoveAllChildPredicates()\"\n    ></c8y-sso-child-predicates>\n    <fieldset class=\"c8y-fieldset p-16\">\n      <legend>\n        {{ 'Provide inventory roles' | translate }}\n      </legend>\n      <div\n        class=\"p-l-8 p-r-8\"\n        *ngIf=\"inventoryMapping.thenInventoryRoles.length !== 0\"\n      >\n        <div class=\"tight-grid p-b-8 separator-bottom hidden-sm hidden-xs\">\n          <div class=\"col-md-5\">\n            <label translate>Groups</label>\n          </div>\n          <div class=\"col-md-6\">\n            <label translate>Inventory roles</label>\n          </div>\n        </div>\n        <div\n          class=\"tight-grid d-flex-md a-i-center p-t-8 p-b-8 separator-bottom\"\n          *ngFor=\"let inventoryRole of inventoryMapping.thenInventoryRoles; index as idx\"\n        >\n          <div class=\"col-md-5\">\n            <div class=\"d-flex a-i-center\">\n              <!-- TODO:\n                We need to retrive the icon here, for groups there are 3 possible icons:\n                • Regular group\n                • Remote group\n                • Smartgroup\n                Besides groups, there's also Assets from DTM, in which each asset has a different icon\n              -->\n              <i\n                class=\"m-r-8 text-16\"\n                c8yIcon=\"c8y-group\"\n              ></i>\n              <span\n                class=\"text-truncate\"\n                title=\"{{ inventoryRole.managedObject | moName | async }}\"\n              >\n                {{ inventoryRole.managedObject | moName | async }}\n              </span>\n            </div>\n          </div>\n          <div class=\"col-md-6\">\n            <div\n              class=\"form-group m-b-0\"\n              title=\"{{ 'Inventory roles' | translate }}\"\n            >\n              <c8y-select-legacy\n                [id]=\"'ir' + idx + '_' + 'irm' + inventoryMappingIndex\"\n                [items]=\"inventoryRoles\"\n                [selected]=\"selectedInventoryRoles[inventoryRole.managedObject]\"\n                [disableApplyOnNoSelection]=\"true\"\n                (onChange)=\"\n                  controlContainer.control.markAsDirty();\n                  selectedInventoryRoles[inventoryRole.managedObject] = $event;\n                  inventoryRole.roleIds = getIds($event)\n                \"\n                [addDropdownContainerToBody]=\"true\"\n              ></c8y-select-legacy>\n            </div>\n          </div>\n          <div class=\"col-md-1\">\n            <button\n              class=\"btn btn-dot btn-dot--danger hidden-xs hidden-sm\"\n              [attr.aria-label]=\"'Remove' | translate\"\n              tooltip=\"{{ 'Remove' | translate }}\"\n              name=\"removeButton\"\n              type=\"button\"\n              (click)=\"controlContainer.control.markAsDirty(); removeInventoryRole(inventoryRole)\"\n              [delay]=\"300\"\n            >\n              <i c8yIcon=\"minus-circle\"></i>\n            </button>\n            <button\n              class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n              title=\"{{ 'Remove' | translate }}\"\n              name=\"removeButton\"\n              type=\"button\"\n              (click)=\"controlContainer.control.markAsDirty(); removeInventoryRole(inventoryRole)\"\n            >\n              <i c8yIcon=\"minus-circle\"></i>\n              <span translate>Remove</span>\n            </button>\n          </div>\n        </div>\n      </div>\n\n      <button\n        class=\"btn btn-default m-t-16\"\n        title=\"{{ 'Add inventory roles' | translate }}\"\n        id=\"add-inventory-roles-button\"\n        type=\"button\"\n        (click)=\"addInventoryRoles()\"\n      >\n        <i\n          class=\"m-r-4\"\n          c8yIcon=\"plus-circle\"\n        ></i>\n        {{ 'Add inventory roles' | translate }}\n      </button>\n    </fieldset>\n  </div>\n</fieldset>\n","import { ChangeDetectorRef, Component, Input, ViewChild } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  C8yTranslateDirective,\n  FormGroupComponent,\n  EmptyStateComponent,\n  IconDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { defaultsDeep } from 'lodash-es';\nimport { IApplication, IIdentified, IUserGroup } from '@c8y/client';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { InventoryMapping, AccessMapping } from '../../sso-configuration.model';\nimport { PaginatedListGroupComponent } from './paginated-list-group.component';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { NgIf } from '@angular/common';\nimport { DynamicAccessMappingComponent } from './dynamic-access-mapping.component';\nimport { InventoryRolesMappingComponent } from './inventory-roles-mapping.component';\n\n@Component({\n  selector: 'c8y-sso-access-mapping',\n  templateUrl: './access-mapping.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    C8yTranslateDirective,\n    FormGroupComponent,\n    PopoverDirective,\n    NgIf,\n    EmptyStateComponent,\n    PaginatedListGroupComponent,\n    DynamicAccessMappingComponent,\n    IconDirective,\n    InventoryRolesMappingComponent,\n    C8yTranslatePipe\n  ]\n})\nexport class AccessMappingComponent {\n  @Input() apps: IApplication[];\n  @Input() groups: IUserGroup[];\n  @Input() inventoryRoles: IIdentified[];\n  @Input() templateModel;\n\n  @ViewChild('paginatedAccessMappings')\n  paginatedAccessMappings: PaginatedListGroupComponent<AccessMapping>;\n\n  @ViewChild('paginatedInventoryMappings')\n  paginatedInventoryMappings: PaginatedListGroupComponent<InventoryMapping>;\n\n  USE_ACCESS_MAPPING_ON_USER_CREATION_TOOLTIP = gettext(\n    'The access mapping will be executed only once during the first login, then the administrator can edit the user roles. During the next login, these mappings will not be executed.'\n  );\n  USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION = gettext(\n    'Use dynamic access mapping only on user creation'\n  );\n\n  UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_TOOLTIP = gettext(\n    'The access mapping will be executed only once during the first login, then the administrator can edit the user roles. During the next login only the roles listed in the access mappings will be updated.'\n  );\n  UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION = gettext(\n    'Roles selected in the rules below will be reassigned to a user on each log in and other ones will be unchanged'\n  );\n\n  CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_TOOLTIP = gettext(\n    'The access mapping will be executed during the first login. The administrator cannot edit the SSO user roles. During the next login all the roles will be cleared and the mapping will be executed again.'\n  );\n  CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION = gettext(\n    'Roles selected in the rules below will be reassigned to a user on each log in and other ones will be cleared'\n  );\n\n  RETRIVE_FROM_ACCESS_TOKEN = gettext('Retrieve from Access token');\n  RETRIVE_FROM_ID_TOKEN = gettext('Retrieve from ID token');\n\n  constructor(\n    private controlContainer: ControlContainer,\n    private cdr: ChangeDetectorRef\n  ) {}\n\n  ngOnChanges(): void {\n    if (this.templateModel && this.apps && this.groups) {\n      this.setDynamicMapping();\n    }\n  }\n\n  addAccessMapping() {\n    const emptyMapping: AccessMapping = {\n      when: {\n        operator: 'AND',\n        childPredicates: [{ parameterPath: '', operator: 'EQ', value: '' }]\n      },\n      thenGroups: [],\n      thenApplications: []\n    };\n    const accessMappings = this.templateModel.onNewUser.dynamicMapping.mappings;\n    this.templateModel.onNewUser.dynamicMapping.mappings = [...accessMappings, emptyMapping];\n    this.cdr.detectChanges(); // Ensure items are updated in the pagination component before navigating\n    this.paginatedAccessMappings.goToLastItem();\n  }\n\n  addInventoryMapping() {\n    const emptyInventoryMapping: InventoryMapping = {\n      when: {\n        operator: 'AND',\n        childPredicates: [{ parameterPath: '', operator: 'EQ', value: '' }]\n      },\n      thenInventoryRoles: []\n    };\n    const inventoryMappings = this.templateModel.onNewUser.dynamicMapping.inventoryMappings;\n    this.templateModel.onNewUser.dynamicMapping.inventoryMappings = [\n      ...inventoryMappings,\n      emptyInventoryMapping\n    ];\n    this.cdr.detectChanges(); // Ensure items are updated in the pagination component before navigating\n    this.paginatedInventoryMappings.goToLastItem();\n  }\n\n  onRemove(accessMapping: AccessMapping) {\n    const accessMappings = this.templateModel.onNewUser.dynamicMapping.mappings;\n    this.templateModel.onNewUser.dynamicMapping.mappings = accessMappings.filter(\n      mapping => mapping !== accessMapping\n    );\n  }\n\n  onRemoveInventoryMapping(inventoryMapping: InventoryMapping) {\n    const inventoryMappings = this.templateModel.onNewUser.dynamicMapping.inventoryMappings;\n    this.templateModel.onNewUser.dynamicMapping.inventoryMappings = inventoryMappings.filter(\n      mapping => mapping !== inventoryMapping\n    );\n  }\n\n  setDynamicMappingConfiguration(\n    mapRolesOnlyForNewUser: boolean,\n    manageRolesOnlyFromAccessMapping = false\n  ) {\n    this.dynamicMappingConfiguration.mapRolesOnlyForNewUser = mapRolesOnlyForNewUser;\n    this.dynamicMappingConfiguration.manageRolesOnlyFromAccessMapping =\n      manageRolesOnlyFromAccessMapping;\n    this.controlContainer.control.markAsDirty();\n  }\n\n  get mapRolesOnlyForNewUser() {\n    return this.dynamicMappingConfiguration.mapRolesOnlyForNewUser;\n  }\n\n  get manageRolesOnlyFromAccessMapping() {\n    return this.dynamicMappingConfiguration.manageRolesOnlyFromAccessMapping;\n  }\n\n  get mapFromIdToken() {\n    return this.dynamicMappingConfiguration.mapFromIdToken;\n  }\n\n  setMapFromIdToken(mapFromIdToken) {\n    this.dynamicMappingConfiguration.mapFromIdToken = mapFromIdToken;\n    this.controlContainer.control.markAsDirty();\n  }\n\n  private get dynamicMappingConfiguration() {\n    return this.templateModel.onNewUser.dynamicMapping.configuration;\n  }\n\n  private setDynamicMapping() {\n    defaultsDeep(this.templateModel.onNewUser, {\n      dynamicMapping: {\n        mappings: [],\n        inventoryMappings: [],\n        configuration: {\n          mapRolesOnlyForNewUser: false,\n          manageRolesOnlyFromAccessMapping: false\n        }\n      }\n    });\n    const { configuration } = this.templateModel.onNewUser.dynamicMapping;\n    const { mapRolesOnlyForNewUser, manageRolesOnlyFromAccessMapping, mapFromIdToken } =\n      configuration;\n    configuration.mapFromIdToken =\n      mapFromIdToken !== undefined\n        ? mapFromIdToken\n        : mapRolesOnlyForNewUser === false && manageRolesOnlyFromAccessMapping === false;\n  }\n}\n","<div class=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        Access mapping\n      </div>\n    </div>\n\n    <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n      <fieldset class=\"c8y-fieldset p-24\">\n        <legend>{{ 'Source of dynamic access mapping' | translate }}</legend>\n        <c8y-form-group>\n          <label\n            class=\"c8y-radio input-sm\"\n            title=\"{{ RETRIVE_FROM_ACCESS_TOKEN | translate }}\"\n          >\n            <input\n              name=\"dynamicAccessMappingSource\"\n              type=\"radio\"\n              data-cy=\"dynamic-access-mapping-from-access-token\"\n              [checked]=\"!mapFromIdToken\"\n              (change)=\"setMapFromIdToken(false)\"\n            />\n            <span></span>\n            <span>{{ RETRIVE_FROM_ACCESS_TOKEN | translate }}</span>\n          </label>\n          <label\n            class=\"c8y-radio input-sm\"\n            title=\"{{ RETRIVE_FROM_ID_TOKEN | translate }}\"\n          >\n            <input\n              name=\"dynamicAccessMappingSource\"\n              type=\"radio\"\n              data-cy=\"dynamic-access-mapping-from-id-token\"\n              [checked]=\"mapFromIdToken\"\n              (change)=\"setMapFromIdToken(true)\"\n            />\n            <span></span>\n            <span>{{ RETRIVE_FROM_ID_TOKEN | translate }}</span>\n          </label>\n        </c8y-form-group>\n      </fieldset>\n\n      <fieldset class=\"c8y-fieldset p-24\">\n        <legend>{{ 'Dynamic access mapping principle' | translate }}</legend>\n        <c8y-form-group>\n          <label\n            class=\"c8y-radio input-sm\"\n            title=\"{{ USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION | translate }}\"\n          >\n            <input\n              name=\"dynamicAccessMappingConfiguration\"\n              type=\"radio\"\n              data-cy=\"c8y-inventory-roles-mapping--on-user-creation\"\n              [checked]=\"mapRolesOnlyForNewUser\"\n              (change)=\"setDynamicMappingConfiguration(true)\"\n            />\n            <span></span>\n            <span>{{ USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION | translate }}</span>\n            <button\n              class=\"btn-help\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{ USE_ACCESS_MAPPING_ON_USER_CREATION_TOOLTIP | translate }}\"\n              placement=\"right\"\n              triggers=\"focus\"\n              container=\"body\"\n              type=\"button\"\n            ></button>\n          </label>\n          <label\n            class=\"c8y-radio input-sm\"\n            title=\"{{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION | translate }}\"\n          >\n            <input\n              name=\"dynamicAccessMappingConfiguration\"\n              type=\"radio\"\n              data-cy=\"c8y-inventory-roles-mapping--other-ones-will-be-unchanged\"\n              [checked]=\"!mapRolesOnlyForNewUser && manageRolesOnlyFromAccessMapping\"\n              (change)=\"setDynamicMappingConfiguration(false, true)\"\n            />\n            <span></span>\n            <span>\n              {{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION | translate }}\n            </span>\n            <button\n              class=\"btn-help\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{\n                UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_TOOLTIP | translate\n              }}\"\n              placement=\"right\"\n              triggers=\"focus\"\n              container=\"body\"\n              type=\"button\"\n            ></button>\n          </label>\n          <label\n            class=\"c8y-radio input-sm\"\n            title=\"{{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION | translate }}\"\n          >\n            <input\n              name=\"dynamicAccessMappingConfiguration\"\n              type=\"radio\"\n              data-cy=\"c8y-inventory-roles-mapping--other-ones-will-be-cleared\"\n              [checked]=\"!mapRolesOnlyForNewUser && !manageRolesOnlyFromAccessMapping\"\n              (change)=\"setDynamicMappingConfiguration(false, false)\"\n            />\n            <span></span>\n            <span>\n              {{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION | translate }}\n            </span>\n            <button\n              class=\"btn-help\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_TOOLTIP | translate }}\"\n              placement=\"right\"\n              triggers=\"focus\"\n              container=\"body\"\n              type=\"button\"\n            ></button>\n          </label>\n        </c8y-form-group>\n      </fieldset>\n      <fieldset class=\"c8y-fieldset p-16\">\n        <legend>{{ 'Dynamic access mapping' | translate }}</legend>\n        <c8y-ui-empty-state\n          [icon]=\"'list'\"\n          [title]=\"'No access mapping rules defined.' | translate\"\n          [subtitle]=\"'Click below to add a new mapping.' | translate\"\n          *ngIf=\"templateModel.onNewUser.dynamicMapping.mappings.length === 0\"\n          [horizontal]=\"true\"\n        ></c8y-ui-empty-state>\n        <div\n          class=\"container-fluid\"\n          *ngIf=\"templateModel.onNewUser.dynamicMapping.mappings.length > 0\"\n        >\n          <c8y-paginated-list-group\n            #paginatedAccessMappings\n            [items]=\"templateModel.onNewUser.dynamicMapping.mappings\"\n          >\n            <ng-template\n              let-accessMapping\n              let-index=\"index\"\n            >\n              <c8y-sso-dynamic-access-mapping\n                [accessMapping]=\"accessMapping\"\n                (onRemoveAccessMapping)=\"onRemove(accessMapping)\"\n                [apps]=\"apps\"\n                [groups]=\"groups\"\n                [accessMappingIndex]=\"index\"\n              ></c8y-sso-dynamic-access-mapping>\n            </ng-template>\n          </c8y-paginated-list-group>\n        </div>\n        <div class=\"p-t-16\">\n          <button\n            class=\"btn btn-default\"\n            title=\"{{ 'Add access mapping' | translate }}\"\n            id=\"add-access-mapping-button\"\n            type=\"button\"\n            (click)=\"addAccessMapping()\"\n          >\n            <i\n              class=\"m-r-4\"\n              c8yIcon=\"plus-circle\"\n            ></i>\n            {{ 'Add access mapping' | translate }}\n          </button>\n        </div>\n      </fieldset>\n      <fieldset class=\"c8y-fieldset p-16\">\n        <legend>\n          {{ 'Inventory roles mapping' | translate }}\n        </legend>\n        <c8y-ui-empty-state\n          [icon]=\"'list'\"\n          [title]=\"'No inventory roles mapping rules defined.' | translate\"\n          [subtitle]=\"'Click below to add a new mapping.' | translate\"\n          *ngIf=\"templateModel.onNewUser.dynamicMapping.inventoryMappings.length === 0\"\n          [horizontal]=\"true\"\n        ></c8y-ui-empty-state>\n        <div\n          class=\"container-fluid\"\n          *ngIf=\"templateModel.onNewUser.dynamicMapping.inventoryMappings.length > 0\"\n        >\n          <c8y-paginated-list-group\n            #paginatedInventoryMappings\n            [items]=\"templateModel.onNewUser.dynamicMapping.inventoryMappings\"\n          >\n            <ng-template\n              let-inventoryMapping\n              let-index=\"index\"\n            >\n              <c8y-sso-inventory-roles-mapping\n                [inventoryRoles]=\"inventoryRoles\"\n                [inventoryMapping]=\"inventoryMapping\"\n                (onRemoveInventoryMapping)=\"onRemoveInventoryMapping(inventoryMapping)\"\n                [inventoryMappingIndex]=\"index\"\n              ></c8y-sso-inventory-roles-mapping>\n            </ng-template>\n          </c8y-paginated-list-group>\n        </div>\n        <div class=\"p-t-16\">\n          <button\n            class=\"btn btn-default\"\n            title=\"{{ 'Add inventory roles mapping' | translate }}\"\n            id=\"add-inventory-mapping-button\"\n            type=\"button\"\n            (click)=\"addInventoryMapping()\"\n          >\n            <i\n              class=\"m-r-4\"\n              c8yIcon=\"plus-circle\"\n            ></i>\n            {{ 'Add inventory roles mapping' | translate }}\n          </button>\n        </div>\n      </fieldset>\n    </div>\n  </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { C8yTranslateDirective, FormGroupComponent, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\n\n@Component({\n  selector: 'c8y-sso-user-data-mapping',\n  templateUrl: './user-data-mapping.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    C8yTranslateDirective,\n    FormGroupComponent,\n    PopoverDirective,\n    FormsModule,\n    C8yTranslatePipe\n  ]\n})\nexport class UserDataMappingComponent {\n  @Input() templateModel;\n  CLAIM_NAMES = gettext('Token claims can be checked in Audit Logs under Single sign-on type.');\n\n  RETRIVE_FROM_ACCESS_TOKEN = gettext('Retrieve from Access token');\n  RETRIVE_FROM_ID_TOKEN = gettext('Retrieve from ID token');\n\n  constructor(private controlContainer: ControlContainer) {}\n\n  ngAfterContentInit() {\n    if (!this.templateModel.accessTokenToUserDataMappings) {\n      this.templateModel.accessTokenToUserDataMappings = {};\n    }\n  }\n\n  get useIdToken() {\n    return this.templateModel.useIdToken || false;\n  }\n\n  setUseIdToken(useIdToken) {\n    this.templateModel.useIdToken = useIdToken;\n    this.controlContainer.control.markAsDirty();\n  }\n}\n","<div class=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        User data mappings\n      </div>\n    </div>\n\n    <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n      <fieldset class=\"c8y-fieldset p-24\">\n        <legend>{{ 'Source of user data mapping' | translate }}</legend>\n        <c8y-form-group>\n          <label\n            title=\"{{ RETRIVE_FROM_ACCESS_TOKEN | translate }}\"\n            class=\"c8y-radio input-sm\"\n          >\n            <input\n              type=\"radio\"\n              name=\"userAccessMappingSource\"\n              data-cy=\"user-access-mapping-from-access-token\"\n              [checked]=\"!useIdToken\"\n              (change)=\"setUseIdToken(false)\"\n            />\n            <span></span>\n            <span>{{ RETRIVE_FROM_ACCESS_TOKEN | translate }}</span>\n          </label>\n          <label\n            title=\"{{ RETRIVE_FROM_ID_TOKEN | translate }}\"\n            class=\"c8y-radio input-sm\"\n          >\n            <input\n              type=\"radio\"\n              name=\"userAccessMappingSource\"\n              data-cy=\"user-access-mapping-from-id-token\"\n              [checked]=\"useIdToken\"\n              (change)=\"setUseIdToken(true)\"\n            />\n            <span></span>\n            <span>{{ RETRIVE_FROM_ID_TOKEN | translate }}</span>\n          </label>\n        </c8y-form-group>\n      </fieldset>\n\n      <fieldset class=\"c8y-fieldset p-24\">\n        <legend>\n          {{ 'Claim names' | translate }}\n          <button\n            class=\"btn-help btn-help--sm\"\n            type=\"button\"\n            [attr.aria-label]=\"'Help' | translate\"\n            popover=\"{{ CLAIM_NAMES | translate }}\"\n            placement=\"right\"\n            triggers=\"focus\"\n          ></button>\n        </legend>\n\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <c8y-form-group>\n              <label\n                for=\"firstName\"\n                class=\"control-label\"\n                translate\n              >\n                First name\n              </label>\n              <input\n                class=\"form-control\"\n                name=\"firstName\"\n                id=\"firstName\"\n                [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.firstNameClaimName\"\n                [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'given_name' }\"\n              />\n            </c8y-form-group>\n          </div>\n          <div class=\"col-sm-6\">\n            <c8y-form-group>\n              <label\n                for=\"lastName\"\n                class=\"control-label\"\n                translate\n              >\n                Last name\n              </label>\n              <input\n                class=\"form-control\"\n                name=\"lastName\"\n                id=\"lastName\"\n                [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.lastNameClaimName\"\n                [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'family_name' }\"\n              />\n            </c8y-form-group>\n          </div>\n        </div>\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <c8y-form-group>\n              <label\n                for=\"email\"\n                class=\"control-label\"\n                translate\n              >\n                Email\n              </label>\n              <input\n                class=\"form-control\"\n                name=\"email\"\n                id=\"email\"\n                [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.emailClaimName\"\n                [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'email' }\"\n              />\n            </c8y-form-group>\n          </div>\n          <div class=\"col-sm-6\">\n            <c8y-form-group>\n              <label\n                for=\"phoneNumber\"\n                class=\"control-label\"\n                translate\n              >\n                Phone number\n              </label>\n              <input\n                class=\"form-control\"\n                name=\"phoneNumber\"\n                id=\"phoneNumber\"\n                [(ngModel)]=\"templateModel.accessTokenToUserDataMappings.phoneNumberClaimName\"\n                [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'phone_number' }\"\n              />\n            </c8y-form-group>\n          </div>\n        </div>\n      </fieldset>\n    </div>\n  </div>\n</div>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  DateFormatService,\n  memoize,\n  C8yTranslateDirective,\n  FormGroupComponent,\n  RequiredInputPlaceholderDirective,\n  IconDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport {\n  algorithmTypeConfig,\n  CertificateType,\n  certificateTypeConfig,\n  CustomCertificate\n} from './signature-configuration.model';\nimport { NgIf, NgFor, KeyValuePipe } from '@angular/common';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { BsDatepickerInputDirective, BsDatepickerDirective } from 'ngx-bootstrap/datepicker';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n  selector: 'c8y-sso-signature-configuration',\n  templateUrl: './signature-configuration.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    C8yTranslateDirective,\n    NgIf,\n    FormsModule,\n    NgFor,\n    FormGroupComponent,\n    RequiredInputPlaceholderDirective,\n    PopoverDirective,\n    BsDatepickerInputDirective,\n    BsDatepickerDirective,\n    IconDirective,\n    TooltipDirective,\n    C8yTranslatePipe,\n    KeyValuePipe\n  ]\n})\nexport class SignatureConfigurationComponent implements OnInit {\n  @Input() templateModel;\n\n  certificateType = CertificateType;\n  certificateTypes = certificateTypeConfig;\n\n  algorithmTypes = algorithmTypeConfig;\n\n  dateInputFormat: string;\n\n  CERTIFICATE_ID_FIELD_POPOVER = gettext(\n    'This is the name of the field in the token whose value will be used to select one of the certificates below which has matching \"Certificate ID value\".'\n  );\n\n  constructor(\n    protected controlContainer: ControlContainer,\n    private dateFormatService: DateFormatService\n  ) {}\n\n  ngOnInit(): void {\n    this.dateInputFormat = this.dateFormatService.getDateFormat();\n  }\n\n  @memoize()\n  shouldShow(field: string) {\n    return field in this.templateModel;\n  }\n\n  removeCustomCertificate(customCertificate: CustomCertificate) {\n    this.templateModel.signatureVerificationConfig.manual.removeCustomCertificate(\n      customCertificate\n    );\n    this.controlContainer.control.markAsDirty();\n  }\n}\n","<div class=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        Signature verification\n      </div>\n    </div>\n    <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n      <div\n        *ngIf=\"shouldShow('certificateType')\"\n        class=\"form-group p-relative\"\n      >\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <label\n              for=\"certificateType\"\n              class=\"control-label\"\n              translate\n            >\n              Verifier\n            </label>\n            <div class=\"c8y-select-wrapper\">\n              <select\n                class=\"form-control\"\n                id=\"certificateType\"\n                name=\"certificateType\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.certificateTypeChosen\"\n              >\n                <option\n                  *ngFor=\"let certificateType of certificateTypes | keyvalue\"\n                  [ngValue]=\"certificateType.key\"\n                >\n                  {{ certificateType.value.label | translate }}\n                </option>\n              </select>\n              <span></span>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div\n        id=\"adfs\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.ADFS\n        \"\n        class=\"row\"\n      >\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label\n              for=\"adfsManifestUrl\"\n              class=\"control-label\"\n              translate\n            >\n              ADFS manifest URL\n            </label>\n            <input\n              type=\"url\"\n              class=\"form-control\"\n              required\n              [placeholder]=\"\n                'e.g. {{ example }}'\n                  | translate\n                    : {\n                        example: 'https://adfs.tenant.com/federationmetadata/federationmetadata.xml'\n                      }\n              \"\n              [(ngModel)]=\"templateModel.signatureVerificationConfig.adfsManifest.manifestUrl\"\n              name=\"adfsManifestUrl\"\n              id=\"adfsManifestUrl\"\n            />\n          </c8y-form-group>\n        </div>\n      </div>\n\n      <div\n        id=\"add\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.AZURE\n        \"\n      >\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <c8y-form-group>\n              <label\n                for=\"publicKeyDiscoveryUrl\"\n                class=\"control-label\"\n                translate\n              >\n                Public key discovery URL\n              </label>\n              <input\n                type=\"url\"\n                id=\"publicKeyDiscoveryUrl\"\n                class=\"form-control\"\n                required\n                [placeholder]=\"\n                  'e.g. {{ example }}'\n                    | translate\n                      : { example: 'https://login.microsoftonline.de/tenant/discovery/keys' }\n                \"\n                name=\"publicKeyDiscoveryUrl\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.aad.publicKeyDiscoveryUrl\"\n              />\n            </c8y-form-group>\n          </div>\n        </div>\n      </div>\n\n      <div\n        id=\"jwks\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.JWKS\n        \"\n      >\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <c8y-form-group>\n              <label\n                for=\"jwksPublicKeyDiscoveryUrl\"\n                class=\"control-label\"\n                translate\n              >\n                JWKS URL\n              </label>\n              <input\n                type=\"url\"\n                class=\"form-control\"\n                id=\"jwksPublicKeyDiscoveryUrl\"\n                required\n                [placeholder]=\"\n                  'e.g. {{ example }}' | translate: { example: 'http://www.example.com/' }\n                \"\n                name=\"jwksUri\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.jwks.jwksUri\"\n              />\n            </c8y-form-group>\n          </div>\n        </div>\n      </div>\n\n      <div\n        id=\"manual\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.CUSTOM\n        \"\n      >\n        <fieldset\n          class=\"c8y-fieldset p-24\"\n          *ngIf=\"templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\"\n        >\n          <legend>\n            {{ 'Manual' | translate }}\n          </legend>\n          <div class=\"row\">\n            <div class=\"col-md-6\">\n              <label\n                for=\"certIdField\"\n                class=\"control-label\"\n              >\n                {{ 'Certificate ID field' | translate }}\n                <button\n                  class=\"btn-help btn-help--sm\"\n                  type=\"button\"\n                  [attr.aria-label]=\"'Help' | translate\"\n                  popover=\"{{ CERTIFICATE_ID_FIELD_POPOVER | translate }}\"\n                  placement=\"right\"\n                  triggers=\"focus\"\n                ></button>\n              </label>\n              <input\n                type=\"text\"\n                class=\"form-control\"\n                name=\"certIdField\"\n                id=\"certIdField\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.manual.certIdField\"\n                required\n              />\n            </div>\n          </div>\n        </fieldset>\n\n        <fieldset class=\"c8y-fieldset p-24\">\n          <legend>\n            {{ 'Certificates' | translate }}\n          </legend>\n          <fieldset\n            class=\"c8y-fieldset p-16\"\n            *ngFor=\"\n              let customCertificate of templateModel.signatureVerificationConfig.manual\n                .customCertificates;\n              index as crtIndex\n            \"\n          >\n            <div class=\"row\">\n              <div\n                class=\"col-sm-6\"\n                *ngIf=\"\n                  templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\n                \"\n              >\n                <c8y-form-group>\n                  <label\n                    [for]=\"'customCertificateValue' + crtIndex\"\n                    class=\"control-label\"\n                    translate\n                  >\n                    Certificate ID value\n                  </label>\n                  <input\n                    [name]=\"'customCertificateValue' + crtIndex\"\n                    [id]=\"'customCertificateValue' + crtIndex\"\n                    type=\"text\"\n                    class=\"form-control\"\n                    [(ngModel)]=\"customCertificate.key\"\n                    required\n                  />\n                </c8y-form-group>\n              </div>\n              <div class=\"col-sm-6\">\n                <c8y-form-group>\n                  <label class=\"control-label\">\n                    {{ 'Type' | translate }}\n                  </label>\n                  <label\n                    title=\"{{ algorithmType.value.label | translate }}\"\n                    class=\"c8y-radio input-sm\"\n                    *ngFor=\"let algorithmType of algorithmTypes | keyvalue; index as algIndex\"\n                  >\n                    <input\n                      type=\"radio\"\n                      [name]=\"'alg' + crtIndex + algIndex\"\n                      [value]=\"algorithmType.key\"\n                      [(ngModel)]=\"customCertificate.alg\"\n                    />\n                    <span></span>\n                    <span>{{ algorithmType.value.label | translate }}</span>\n                  </label>\n                </c8y-form-group>\n              </div>\n            </div>\n\n            <div class=\"row\">\n              <div class=\"col-md-5\">\n                <c8y-form-group>\n                  <label\n                    class=\"control-label\"\n                    [for]=\"'publicKey' + crtIndex\"\n                    *ngIf=\"customCertificate.alg === algorithmTypes.PCKS.value\"\n                    translate\n                  >\n                    Certificate in PEM format\n                  </label>\n                  <label\n                    class=\"control-label\"\n                    [for]=\"'publicKey' + crtIndex\"\n                    *ngIf=\"customCertificate.alg === algorithmTypes.RSA.value\"\n                    translate\n                  >\n                    Public key in PEM format\n                  </label>\n                  <input\n                    [name]=\"'publicKey' + crtIndex\"\n                    [id]=\"'publicKey' + crtIndex\"\n                    type=\"text\"\n                    class=\"form-control\"\n                    [(ngModel)]=\"customCertificate.publicKey\"\n                    required\n                  />\n                </c8y-form-group>\n              </div>\n              <div class=\"col-md-3\">\n                <div class=\"form-group datepicker\">\n                  <c8y-form-group>\n                    <label\n                      [for]=\"'validFromPicker' + crtIndex\"\n                      class=\"control-label\"\n                    >\n                      {{ 'Valid from' | translate }}\n                    </label>\n                    <input\n                      [name]=\"'validFromPicker' + crtIndex\"\n                      [id]=\"'validFromPicker' + crtIndex\"\n                      [(ngModel)]=\"customCertificate.validFrom\"\n                      class=\"form-control\"\n                      [attr.aria-label]=\"'Date from' | translate\"\n                      placeholder=\"{{ 'Date from' | translate }}\"\n                      [bsConfig]=\"{ customTodayClass: 'today', adaptivePosition: true, dateInputFormat: dateInputFormat }\"\n                      [maxDate]=\"customCertificate.validTill\"\n                      bsDatepicker\n                      required\n                    />\n                  </c8y-form-group>\n                </div>\n              </div>\n              <div class=\"col-md-3\">\n                <div class=\"form-group datepicker\">\n                  <c8y-form-group>\n                    <label\n                      [for]=\"'validTillPicker' + crtIndex\"\n                      class=\"control-label\"\n                    >\n                      {{ 'Valid till' | translate }}\n                    </label>\n                    <input\n                      [name]=\"'validTillPicker' + crtIndex\"\n                      [id]=\"'validTillPicker' + crtIndex\"\n                      [(ngModel)]=\"customCertificate.validTill\"\n                      class=\"form-control\"\n                      placeholder=\"{{ 'Date to' | translate }}\"\n                      [attr.aria-label]=\"'Date to' | translate\"\n                      [bsConfig]=\"{ customTodayClass: 'today', adaptivePosition: true, dateInputFormat: dateInputFormat }\"\n                      bsDatepicker\n                      [minDate]=\"customCertificate.validFrom\"\n                      required\n                    />\n                  </c8y-form-group>\n                </div>\n              </div>\n              <div\n                class=\"col-md-1\"\n                *ngIf=\"\n                  templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\n                \"\n              >\n                <label>&nbsp;</label>\n                <button\n                  class=\"btn btn-danger btn-sm visible-xs visible-sm\"\n                  type=\"button\"\n                  title=\"{{ 'Delete certificate' | translate }}\"\n                  (click)=\"removeCustomCertificate(customCertificate)\"\n                >\n                  <i\n                    c8yIcon=\"minus-circle\"\n                    class=\"m-r-4\"\n                  ></i>\n                  <span>{{ 'Delete certificate' | translate }}</span>\n                </button>\n\n                <button\n                  class=\"btn btn-dot btn-dot--danger visible-md visible-lg\"\n                  type=\"button\"\n                  tooltip=\"{{ 'Delete certificate' | translate }}\"\n                  placement=\"top\"\n                  [adaptivePosition]=\"false\"\n                  [attr.aria-label]=\"'Delete certificate' | translate\"\n                  [delay]=\"300\"\n                  (click)=\"removeCustomCertificate(customCertificate)\"\n                >\n                  <i c8yIcon=\"minus-circle\"></i>\n                </button>\n              </div>\n            </div>\n          </fieldset>\n          <button\n            class=\"btn btn-default m-t-8\"\n            type=\"button\"\n            title=\"{{ 'Add certificate' | translate }}\"\n            (click)=\"templateModel.signatureVerificationConfig.manual.addCustomCertificate()\"\n            name=\"addCertificate\"\n          >\n            <i\n              c8yIcon=\"plus-circle\"\n              class=\"m-r-4\"\n            ></i>\n            <span>{{ 'Add certificate' | translate }}</span>\n          </button>\n        </fieldset>\n      </div>\n    </div>\n  </div>\n</div>\n","import { Component } from '@angular/core';\nimport { CustomConfigurationMapper } from './custom-configuration-mapper';\nimport { TemplateComponent } from './template.component';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { CustomSsoConfiguration } from './custom.model';\nimport { NgIf } from '@angular/common';\nimport { RequestConfigurationComponent } from '../template-parts/request-configuration.component';\nimport { ExternalTokenConfigComponent } from '../template-parts/external-token-config.component';\nimport { BasicConfigurationComponent } from '../template-parts/basic-configuration.component';\nimport { AccessMappingComponent } from '../template-parts/access-mapping/access-mapping.component';\nimport { UserDataMappingComponent } from '../template-parts/user-data-mapping.component';\nimport { UserIdConfigurationComponent } from '../template-parts/user-id-configuration.component';\nimport { SignatureConfigurationComponent } from '../template-parts/signature-configuration.component';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-custom-template',\n  templateUrl: './custom-template.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    NgIf,\n    RequestConfigurationComponent,\n    ExternalTokenConfigComponent,\n    BasicConfigurationComponent,\n    AccessMappingComponent,\n    UserDataMappingComponent,\n    UserIdConfigurationComponent,\n    SignatureConfigurationComponent,\n    C8yTranslatePipe\n  ]\n})\nexport class CustomTemplateComponent extends TemplateComponent<CustomSsoConfiguration> {\n  constructor(private customConfigurationMapper: CustomConfigurationMapper) {\n    super(customConfigurationMapper);\n  }\n}\n","<ng-container *ngIf=\"templateModel\">\n  <c8y-request-configuration\n    [templateModel]=\"templateModel\"\n    [requestName]=\"'Authorization request' | translate\"\n    [requestType]=\"'authorizationRequest'\"\n  ></c8y-request-configuration>\n  <hr />\n  <c8y-request-configuration\n    [templateModel]=\"templateModel\"\n    [requestName]=\"'Token request' | translate\"\n    [requestType]=\"'tokenRequest'\"\n  ></c8y-request-configuration>\n  <hr />\n  <c8y-request-configuration\n    [templateModel]=\"templateModel\"\n    [requestName]=\"'Refresh request' | translate\"\n    [requestType]=\"'refreshRequest'\"\n  ></c8y-request-configuration>\n  <hr />\n  <c8y-request-configuration\n    [templateModel]=\"templateModel\"\n    [requestName]=\"'Logout request' | translate\"\n    [requestType]=\"'logoutRequest'\"\n  ></c8y-request-configuration>\n  <hr />\n  <c8y-external-token-config [templateModel]=\"templateModel\"></c8y-external-token-config>\n  <hr />\n  <c8y-basic-configuration [templateModel]=\"templateModel\"></c8y-basic-configuration>\n  <hr />\n  <c8y-sso-access-mapping\n    [templateModel]=\"templateModel\"\n    [apps]=\"apps\"\n    [groups]=\"groups\"\n    [inventoryRoles]=\"inventoryRoles\"\n  ></c8y-sso-access-mapping>\n  <hr />\n  <c8y-sso-user-data-mapping [templateModel]=\"templateModel\"></c8y-sso-user-data-mapping>\n  <c8y-user-id-configuration\n    [userIdConfig]=\"templateModel.userIdConfig\"\n  ></c8y-user-id-configuration>\n  <hr />\n  <c8y-sso-signature-configuration\n    [templateModel]=\"templateModel\"\n  ></c8y-sso-signature-configuration>\n</ng-container>\n","import { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { AadConfiguration } from './aad.model';\nimport { SsoConfiguration, TemplateType } from '../sso-configuration.model';\nimport {\n  cloneDeep,\n  pick,\n  defaults,\n  at,\n  map,\n  defaultsDeep,\n  has,\n  head,\n  reject,\n  isUndefined,\n  get\n} from 'lodash-es';\nimport { GrantType, TenantLoginOptionType, UserManagementSource } from '@c8y/client';\nimport { SignatureConfiguration } from '../template-parts/signature-configuration.model';\nimport { Injectable } from '@angular/core';\nimport { ExternalToken } from '../template-parts/external-token-config.model';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AadConfigurationMapper implements SsoConfigurationMapper<AadConfiguration> {\n  private defaults = {\n    visibleOnLoginPage: true\n  };\n\n  private urlPattern = /^(.+)\\/((.+?)\\/oauth2\\/(authorize|token))$/;\n\n  mapFrom(templateModel: AadConfiguration): SsoConfiguration {\n    const baseUrl = `${templateModel.aadAddress}/${templateModel.tenant}/oauth2`;\n\n    const ssoConfiguration: SsoConfiguration = {\n      audience: templateModel.applicationId,\n      clientId: templateModel.applicationId,\n      logoutRequest: templateModel.redirectAfterLogout\n        ? {\n            method: 'POST',\n            url: `${baseUrl}/logout`,\n            requestParams: {\n              post_logout_redirect_uri: templateModel.redirectAfterLogoutUrl\n            },\n            headers: {},\n            body: '',\n            operation: 'REDIRECT'\n          }\n        : {\n            method: 'POST',\n            headers: {},\n            operation: 'REDIRECT',\n            requestParams: {}\n          },\n      authorizationRequest: {\n        method: 'GET',\n        url: `${baseUrl}/authorize`,\n        requestParams: {\n          ...(templateModel.scopeId && { scope: templateModel.scopeId }),\n          redirect_uri: '${redirectUri}',\n          client_id: '${clientId}',\n          response_type: 'code'\n        },\n        headers: {},\n        body: '',\n        operation: 'REDIRECT'\n      },\n      tokenRequest: {\n        method: 'POST',\n        url: `${baseUrl}/token`,\n        requestParams: {},\n        headers: {},\n        body: this.getQueryString({\n          grant_type: 'authorization_code',\n          code: '${code}',\n          redirect_uri: '${redirectUri}',\n          resource: '${clientId}',\n          client_id: '${clientId}',\n          client_secret: encodeURIComponent(templateModel.clientSecret)\n        }),\n        operation: 'EXECUTE'\n      },\n      refreshRequest: {\n        method: 'POST',\n        url: `${baseUrl}/token`,\n        requestParams: {},\n        headers: {},\n        body: this.getQueryString({\n          grant_type: 'refresh_token',\n          refresh_token: '${refreshToken}',\n          resource: '${clientId}',\n          client_id: '${clientId}',\n          client_secret: encodeURIComponent(templateModel.clientSecret)\n        }),\n        operation: 'EXECUTE'\n      },\n      buttonName: templateModel.buttonName,\n      providerName: 'Azure AD',\n      issuer: templateModel.issuer,\n      onNewUser: templateModel.onNewUser,\n      accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings,\n      redirectToPlatform: templateModel.redirectToPlatform || null,\n      template: TemplateType.AZURE,\n      userIdConfig: {\n        useConstantValue: false,\n        jwtField: templateModel.userIdConfig.jwtField\n      },\n      visibleOnLoginPage: templateModel.visibleOnLoginPage,\n      signatureVerificationConfig:\n        templateModel.signatureVerificationConfig.toSignatureVerificationConfig(),\n      userManagementSource: UserManagementSource.REMOTE,\n      type: TenantLoginOptionType.OAUTH2,\n      grantType: GrantType.AUTHORIZATION_CODE,\n      externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig(),\n      useIdToken: templateModel.useIdToken\n    };\n    return ssoConfiguration;\n  }\n\n  mapTo(ssoConfiguration: SsoConfiguration): AadConfiguration {\n    const ssoConfigurationForAad: SsoConfiguration = cloneDeep(ssoConfiguration);\n\n    const applicationsId = at(ssoConfigurationForAad, ['audience', 'clientId']);\n    this.setupDefaults(ssoConfigurationForAad);\n    this.setupUserIdConfig(ssoConfigurationForAad);\n    this.setupSignatureVerificationConfig(ssoConfigurationForAad);\n\n    const aadConfiguration: AadConfiguration = {\n      aadAddress: this.getAadAddress(ssoConfigurationForAad),\n      tenant: this.getTenant(ssoConfigurationForAad),\n      applicationId: this.getFirstDefined(applicationsId),\n      redirectToPlatform: ssoConfigurationForAad.redirectToPlatform,\n      clientSecret: this.getClientSecret(ssoConfigurationForAad),\n      issuer: ssoConfigurationForAad.issuer,\n      buttonName: ssoConfigurationForAad.buttonName,\n      scopeId: this.getScopeId(ssoConfiguration),\n      visibleOnLoginPage: ssoConfigurationForAad.visibleOnLoginPage,\n      redirectAfterLogout: this.getRedirectAfterLogout(ssoConfigurationForAad),\n      redirectAfterLogoutUrl: this.getRedirectAfterLogoutUrl(ssoConfigurationForAad),\n      accessTokenToUserDataMappings: ssoConfigurationForAad.accessTokenToUserDataMappings,\n      userIdConfig: {\n        jwtField: ssoConfigurationForAad.userIdConfig.jwtField\n      },\n      publicKeyDiscoveryUrl:\n        ssoConfigurationForAad.signatureVerificationConfig.aad.publicKeyDiscoveryUrl,\n      signatureVerificationConfig: new SignatureConfiguration(\n        ssoConfigurationForAad.signatureVerificationConfig\n      ),\n      onNewUser: ssoConfigurationForAad.onNewUser,\n      externalTokenConfig: new ExternalToken(ssoConfigurationForAad.externalTokenConfig),\n      useIdToken: ssoConfiguration.useIdToken\n    };\n    return aadConfiguration;\n  }\n\n  private setupDefaults(ssoConfiguration) {\n    defaults(ssoConfiguration, this.defaults);\n  }\n\n  private getAadAddress(ssoConfiguration) {\n    const urls = this.getUrlsFromRequests(ssoConfiguration);\n\n    const aadAddresses = map(urls, url => this.getAadAddressFromUrl(url));\n    return this.getFirstDefined(aadAddresses);\n  }\n\n  private getTenant(ssoConfiguration) {\n    const urls = this.getUrlsFromRequests(ssoConfiguration);\n\n    const tenants = map(urls, url => this.getTenantFromUrl(url));\n    return this.getFirstDefined(tenants);\n  }\n\n  private getUrlsFromRequests(ssoConfiguration) {\n    return at(ssoConfiguration, [\n      'authorizationRequest.url',\n      'tokenRequest.url',\n      'refreshRequest.url'\n    ]);\n  }\n\n  private getAadAddressFromUrl(url) {\n    const [, aadAddress] = (url || '').match(this.urlPattern) || [];\n    return aadAddress;\n  }\n\n  private getTenantFromUrl(url) {\n    const [, , , tenant] = (url || '').match(this.urlPattern) || [];\n    return tenant;\n  }\n\n  private getClientSecret(ssoConfiguration) {\n    const bodies = at(ssoConfiguration, ['tokenRequest.body', 'refreshRequest.body']);\n    const clientSecrets = map(bodies, body => this.getClientSecretFromBody(body));\n    return this.getFirstDefined(clientSecrets);\n  }\n\n  private getClientSecretFromBody(body) {\n    const [, clientSecret] = (body || '').match(/client_secret=([^&]+)/) || [];\n    return clientSecret ? decodeURIComponent(clientSecret) : undefined;\n  }\n\n  private setupUserIdConfig(ssoConfiguration) {\n    defaultsDeep(ssoConfiguration, { userIdConfig: { jwtField: 'upn' } });\n  }\n\n  private setupSignatureVerificationConfig(ssoConfiguration) {\n    defaultsDeep(ssoConfiguration, {\n      signatureVerificationConfig: { aad: { publicKeyDiscoveryUrl: '' } }\n    });\n    ssoConfiguration.signatureVerificationConfig = pick(\n      ssoConfiguration.signatureVerificationConfig,\n      'aad'\n    );\n  }\n\n  private getRedirectAfterLogout(ssoConfiguration): boolean {\n    return has(ssoConfiguration, 'logoutRequest.requestParams.post_logout_redirect_uri')\n      ? true\n      : false;\n  }\n\n  private getRedirectAfterLogoutUrl(ssoConfiguration): string {\n    return ssoConfiguration.logoutRequest.requestParams.post_logout_redirect_uri\n      ? ssoConfiguration.logoutRequest.requestParams.post_logout_redirect_uri\n      : null;\n  }\n\n  private getFirstDefined(values) {\n    return head(reject(values, isUndefined));\n  }\n\n  private getQueryString(params) {\n    return map(params, (value, key) => `${key}=${value}`).join('&');\n  }\n\n  private getScopeId(ssoConfiguration: SsoConfiguration): string {\n    return get(ssoConfiguration, 'authorizationRequest.requestParams.scope', null);\n  }\n}\n","import { Component, Input } from '@angular/core';\nimport { ControlContainer, NgForm, FormsModule } from '@angular/forms';\nimport {\n  C8yTranslateDirective,\n  FormGroupComponent,\n  RequiredInputPlaceholderDirective,\n  DefaultValidationDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { NgIf } from '@angular/common';\n\n@Component({\n  selector: 'c8y-sso-logout-configuration',\n  templateUrl: './logout-configuration.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    C8yTranslateDirective,\n    FormGroupComponent,\n    FormsModule,\n    NgIf,\n    RequiredInputPlaceholderDirective,\n    DefaultValidationDirective,\n    C8yTranslatePipe\n  ]\n})\nexport class LogoutConfigurationComponent {\n  @Input() templateModel;\n}\n","<div class=\"col-md-12 p-t-16\">\n  <div class=\"row m-l-8 m-r-8\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2\">\n      <div class=\"h4 text-normal text-right text-left-xs\" translate>Logout configuration</div>\n    </div>\n    <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n      <c8y-form-group>\n        <label\n          for=\"redirectAfterLogout\"\n          title=\"{{ 'Redirect after logout' | translate }}\"\n          class=\"c8y-switch\"\n        >\n          <input\n            type=\"checkbox\"\n            [(ngModel)]=\"templateModel.redirectAfterLogout\"\n            name=\"redirectAfterLogout\"\n            id=\"redirectAfterLogout\"\n          />\n          <span></span>\n          <span class=\"control-label\">{{ 'Redirect after logout' | translate }}</span>\n        </label>\n      </c8y-form-group>\n\n      <c8y-form-group *ngIf=\"templateModel.redirectAfterLogout\">\n        <label for=\"redirectAfterLogoutUrl\" class=\"control-label\" translate>Redirect URL</label>\n        <input\n          class=\"form-control\"\n          name=\"redirectAfterLogoutUrl\"\n          id=\"redirectAfterLogoutUrl\"\n          type=\"url\"\n          [(ngModel)]=\"templateModel.redirectAfterLogoutUrl\"\n          placeholder=\"{{ 'e.g. https://my-tenant.cumulocity.com/apps/cockpit' | translate }}\"\n          c8yDefaultValidation=\"httpUrl\"\n          required\n        />\n      </c8y-form-group>\n    </div>\n  </div>\n</div>\n","import { Component } from '@angular/core';\nimport { TemplateComponent } from './template.component';\nimport { AadConfigurationMapper } from './aad-configuration-mapper';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { AadConfiguration } from './aad.model';\nimport { NgIf } from '@angular/common';\nimport { BasicConfigurationComponent } from '../template-parts/basic-configuration.component';\nimport { LogoutConfigurationComponent } from '../template-parts/logout-configuration.component';\nimport { ExternalTokenConfigComponent } from '../template-parts/external-token-config.component';\nimport { AccessMappingComponent } from '../template-parts/access-mapping/access-mapping.component';\nimport { UserDataMappingComponent } from '../template-parts/user-data-mapping.component';\nimport { UserIdConfigurationComponent } from '../template-parts/user-id-configuration.component';\nimport { SignatureConfigurationComponent } from '../template-parts/signature-configuration.component';\n\n@Component({\n  selector: 'c8y-aad-template',\n  templateUrl: './aad-template.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    NgIf,\n    BasicConfigurationComponent,\n    LogoutConfigurationComponent,\n    ExternalTokenConfigComponent,\n    AccessMappingComponent,\n    UserDataMappingComponent,\n    UserIdConfigurationComponent,\n    SignatureConfigurationComponent\n  ]\n})\nexport class AadTemplateComponent extends TemplateComponent<AadConfiguration> {\n  constructor(private aadConfigurationMapper: AadConfigurationMapper) {\n    super(aadConfigurationMapper);\n  }\n}\n","<div *ngIf=\"templateModel\">\n  <c8y-basic-configuration [templateModel]=\"templateModel\"></c8y-basic-configuration>\n  <hr />\n  <c8y-sso-logout-configuration [templateModel]=\"templateModel\"></c8y-sso-logout-configuration>\n  <hr />\n  <c8y-external-token-config [templateModel]=\"templateModel\"></c8y-external-token-config>\n  <hr />\n  <c8y-sso-access-mapping\n    [templateModel]=\"templateModel\"\n    [apps]=\"apps\"\n    [groups]=\"groups\"\n    [inventoryRoles]=\"inventoryRoles\"\n  ></c8y-sso-access-mapping>\n  <hr />\n  <c8y-sso-user-data-mapping [templateModel]=\"templateModel\"></c8y-sso-user-data-mapping>\n  <c8y-user-id-configuration\n    [userIdConfig]=\"templateModel.userIdConfig\"\n  ></c8y-user-id-configuration>\n  <hr />\n  <c8y-sso-signature-configuration\n    [templateModel]=\"templateModel\"\n  ></c8y-sso-signature-configuration>\n</div>\n","import { SsoConfigurationMapper } from './sso-configuration.mapper';\nimport { KeyCloakConfiguration } from './key-cloak.model';\nimport { SsoConfiguration, TemplateType } from '../sso-configuration.model';\nimport { at, get, head, isUndefined, map, reject } from 'lodash-es';\nimport { GrantType, TenantLoginOptionType, UserManagementSource } from '@c8y/client';\nimport { RequestConfiguration } from '../template-parts/request-configuration.model';\nimport { Injectable } from '@angular/core';\nimport { ExternalToken } from '../template-parts/external-token-config.model';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class KeyCloakConfigurationMapper implements SsoConfigurationMapper<KeyCloakConfiguration> {\n  private urlPattern = /^(.+)\\/auth\\/realms\\/((.+?))$/;\n\n  mapFrom(templateModel: KeyCloakConfiguration): SsoConfiguration {\n    const ssoConfiguration: SsoConfiguration = {\n      template: TemplateType.KEYCLOAK,\n      buttonName: templateModel.buttonName,\n      userIdConfig: templateModel.userIdConfig,\n      userManagementSource: UserManagementSource.REMOTE,\n      type: TenantLoginOptionType.OAUTH2,\n      onNewUser: templateModel.onNewUser,\n      issuer: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}`,\n      redirectToPlatform: templateModel.redirectToPlatform || null,\n      providerName: 'keycloak',\n      audience: templateModel.audience,\n      clientId: templateModel.clientId,\n      logoutRequest: templateModel.logoutRequest.toRequest(),\n      visibleOnLoginPage: templateModel.visibleOnLoginPage,\n      signatureVerificationConfig: {\n        jwks: {\n          jwksUri: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/certs`\n        }\n      },\n      tokenRequest: {\n        headers: {},\n        method: 'POST',\n        requestParams: {},\n        operation: 'EXECUTE',\n        url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/token`,\n        body:\n          'grant_type=authorization_code&code=${code}&redirect_uri=${redirectUri}&client_id=${clientId}&client_secret=' +\n          templateModel.clientSecret\n      },\n      authorizationRequest: {\n        headers: {},\n        method: 'GET',\n        requestParams: {\n          scope: templateModel.scopeId,\n          client_id: '${clientId}',\n          redirect_uri: '${redirectUri}',\n          response_type: 'code'\n        },\n        operation: 'REDIRECT',\n        url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/auth`,\n        body: ''\n      },\n      refreshRequest: {\n        headers: {},\n        method: 'POST',\n        requestParams: {\n          client_id: '${clientId}',\n          redirect_uri: '${redirectUri}',\n          response_type: 'refresh'\n        },\n        operation: 'EXECUTE',\n        url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/token`,\n        body:\n          'grant_type=refresh_token&refresh_token=${refreshToken}&client_id=${clientId}&client_secret=' +\n          templateModel.clientSecret\n      },\n      grantType: GrantType.AUTHORIZATION_CODE,\n      accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings,\n      externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig(),\n      useIdToken: templateModel.useIdToken\n    };\n    return ssoConfiguration;\n  }\n\n  mapTo(ssoConfiguration: SsoConfiguration): KeyCloakConfiguration {\n    return {\n      keyCloakAddress: this.getKeyCloakAddressFromUrl(ssoConfiguration.issuer),\n      realmName: this.getRealmName(ssoConfiguration.issuer),\n      clientId: ssoConfiguration.clientId,\n      clientSecret: this.getClientSecret(ssoConfiguration),\n      scopeId: this.getScopeId(ssoConfiguration),\n      buttonName: ssoConfiguration.buttonName,\n      userIdConfig: ssoConfiguration.userIdConfig,\n      onNewUser: ssoConfiguration.onNewUser,\n      redirectToPlatform: ssoConfiguration.redirectToPlatform,\n      audience: ssoConfiguration.audience,\n      logoutRequest: new RequestConfiguration(ssoConfiguration.logoutRequest),\n      visibleOnLoginPage: ssoConfiguration.visibleOnLoginPage,\n      accessTokenToUserDataMappings: ssoConfiguration.accessTokenToUserDataMappings,\n      externalTokenConfig: new ExternalToken(ssoConfiguration.externalTokenConfig),\n      useIdToken: ssoConfiguration.useIdToken\n    };\n  }\n\n  private getKeyCloakAddressFromUrl(url) {\n    const [, keyCloakAddress] = (url || '').match(this.urlPattern) || [];\n    return keyCloakAddress;\n  }\n\n  private getRealmName(url) {\n    const [, , realmName] = (url || '').match(this.urlPattern) || [];\n    return realmName;\n  }\n\n  private getClientSecret(ssoConfiguration): string {\n    const bodies = at(ssoConfiguration, ['tokenRequest.body', 'refreshRequest.body']);\n    const clientSecrets = map(bodies, body => this.getClientSecretFromBody(body));\n    const clientSecret = this.getFirstDefined(clientSecrets);\n    return clientSecret ? decodeURIComponent(clientSecret) : '';\n  }\n\n  private getClientSecretFromBody(body) {\n    const [, clientSecret] = (body || '').match(/client_secret=([^&]+)/) || [];\n    return clientSecret;\n  }\n\n  private getFirstDefined(values) {\n    return head(reject(values, isUndefined));\n  }\n\n  private getScopeId(ssoConfiguration) {\n    return get(ssoConfiguration, 'authorizationRequest.requestParams.scope', '');\n  }\n}\n","import { Component } from '@angular/core';\nimport { KeyCloakConfiguration } from './key-cloak.model';\nimport { TemplateComponent } from './template.component';\nimport { KeyCloakConfigurationMapper } from './key-cloak-configuration-mapper';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { NgIf } from '@angular/common';\nimport { BasicConfigurationComponent } from '../template-parts/basic-configuration.component';\nimport { RequestConfigurationComponent } from '../template-parts/request-configuration.component';\nimport { ExternalTokenConfigComponent } from '../template-parts/external-token-config.component';\nimport { AccessMappingComponent } from '../template-parts/access-mapping/access-mapping.component';\nimport { UserDataMappingComponent } from '../template-parts/user-data-mapping.component';\nimport { UserIdConfigurationComponent } from '../template-parts/user-id-configuration.component';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-key-cloak-template',\n  templateUrl: './key-cloak-template.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    NgIf,\n    BasicConfigurationComponent,\n    RequestConfigurationComponent,\n    ExternalTokenConfigComponent,\n    AccessMappingComponent,\n    UserDataMappingComponent,\n    UserIdConfigurationComponent,\n    C8yTranslatePipe\n  ]\n})\nexport class KeyCloakTemplateComponent extends TemplateComponent<KeyCloakConfiguration> {\n  constructor(private keyCloakConfigurationMapper: KeyCloakConfigurationMapper) {\n    super(keyCloakConfigurationMapper);\n  }\n}\n","<div *ngIf=\"templateModel\">\n  <c8y-basic-configuration [templateModel]=\"templateModel\"></c8y-basic-configuration>\n  <hr />\n  <c8y-request-configuration\n    [templateModel]=\"templateModel\"\n    [requestName]=\"'Logout request' | translate\"\n    [requestType]=\"'logoutRequest'\"\n  ></c8y-request-configuration>\n  <hr />\n  <c8y-external-token-config [templateModel]=\"templateModel\"></c8y-external-token-config>\n  <hr />\n  <c8y-sso-access-mapping\n    [templateModel]=\"templateModel\"\n    [apps]=\"apps\"\n    [groups]=\"groups\"\n    [inventoryRoles]=\"inventoryRoles\"\n  ></c8y-sso-access-mapping>\n  <hr />\n  <c8y-sso-user-data-mapping [templateModel]=\"templateModel\"></c8y-sso-user-data-mapping>\n  <c8y-user-id-configuration\n    [userIdConfig]=\"templateModel.userIdConfig\"\n  ></c8y-user-id-configuration>\n</div>\n","import { Component, EventEmitter, OnInit, ViewChild } from '@angular/core';\nimport {\n  ApplicationService,\n  UserGroupService,\n  IApplication,\n  IUserGroup,\n  TenantLoginOptionType,\n  InventoryRoleService,\n  IIdentified\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  AlertService,\n  ModalService,\n  Status,\n  TenantUiService,\n  SimplifiedAuthService,\n  TitleComponent,\n  BreadcrumbComponent,\n  BreadcrumbItemComponent,\n  ActionBarItemComponent,\n  IconDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { BehaviorSubject, forkJoin, Subscription, Subject } from 'rxjs';\nimport { shareReplay, tap, switchMap } from 'rxjs/operators';\nimport { SsoConfiguration, TemplateType, templateTypeConfig } from './sso-configuration.model';\nimport { SsoConfigurationService } from './sso-configuration.service';\nimport { NgForm, FormsModule } from '@angular/forms';\nimport { NgClass, AsyncPipe, KeyValuePipe } from '@angular/common';\nimport { CustomTemplateComponent } from './templates/custom-template.component';\nimport { AadTemplateComponent } from './templates/aad-template.component';\nimport { KeyCloakTemplateComponent } from './templates/key-cloak-template.component';\n\n@Component({\n  selector: 'c8y-sso-configuration',\n  templateUrl: './sso-configuration.component.html',\n  imports: [\n    TitleComponent,\n    BreadcrumbComponent,\n    BreadcrumbItemComponent,\n    ActionBarItemComponent,\n    IconDirective,\n    NgClass,\n    FormsModule,\n    CustomTemplateComponent,\n    AadTemplateComponent,\n    KeyCloakTemplateComponent,\n    C8yTranslatePipe,\n    AsyncPipe,\n    KeyValuePipe\n  ]\n})\nexport class SsoConfigurationComponent implements OnInit {\n  apps: IApplication[];\n  groups: IUserGroup[];\n  inventoryRoles: IIdentified[];\n  ssoConfiguration: SsoConfiguration;\n\n  templateType = TemplateType;\n  templateTypeConfig = templateTypeConfig;\n\n  reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n  reload: EventEmitter<void> = new EventEmitter();\n  saveSubject: Subject<void> = new Subject();\n\n  @ViewChild('ssoConfigurationForm') ssoConfigurationForm!: NgForm;\n\n  private dataSubscription: Subscription;\n\n  private data$: any = this.reload.pipe(\n    tap(() => this.reloading$.next(true)),\n    switchMap(() =>\n      forkJoin({\n        ssoConfiguration: this.ssoConfigurationService.getSsoConfiguration$(),\n        apps: this.getApplications(),\n        groups: this.getGroups(),\n        inventoryRoles: this.getInventoryRoles()\n      })\n    ),\n    tap(() => this.reloading$.next(false)),\n    shareReplay(1)\n  );\n\n  constructor(\n    private ssoConfigurationService: SsoConfigurationService,\n    private applicationService: ApplicationService,\n    private userGroupService: UserGroupService,\n    private inventoryRoleService: InventoryRoleService,\n    private alertService: AlertService,\n    private modalService: ModalService,\n    private authService: SimplifiedAuthService,\n    private tenantUiService: TenantUiService\n  ) {}\n\n  ngOnInit(): void {\n    this.dataSubscription = this.data$.subscribe(\n      ({ ssoConfiguration, apps, groups, inventoryRoles }) => {\n        this.apps = apps;\n        this.groups = groups;\n        this.inventoryRoles = inventoryRoles;\n        this.ssoConfiguration = ssoConfiguration;\n      }\n    );\n    this.loadSsoConfiguration();\n  }\n\n  ngOnDestroy(): void {\n    this.dataSubscription.unsubscribe();\n  }\n\n  loadSsoConfiguration() {\n    this.reload.next();\n    this.ssoConfigurationForm.form.markAsPristine();\n  }\n\n  async save(ssoConfiguration) {\n    try {\n      const currentUserAffectedByTerminateUserSessions =\n        this.tenantUiService.getCurrentUserLoginMode() !== TenantLoginOptionType.BASIC;\n      const terminateUserSessions = (\n        await this.confirmSaveWithUsersLogOutOption(currentUserAffectedByTerminateUserSessions)\n      ).confirmOptions.terminateUserSessions;\n\n      await this.ssoConfigurationService.save(ssoConfiguration, terminateUserSessions);\n      if (currentUserAffectedByTerminateUserSessions && terminateUserSessions) {\n        await this.authService.logout(true);\n      } else {\n        this.loadSsoConfiguration();\n        this.alertService.success(gettext('Configuration saved.'));\n      }\n    } catch (ex) {\n      if (ex) {\n        this.alertService.addServerFailure(ex);\n      } else {\n        this.loadSsoConfiguration();\n      }\n    }\n  }\n\n  private getApplications(): Promise<void | IApplication[]> {\n    return this.applicationService.listByTenant(null, { pageSize: 100 }).then(\n      res => res.data,\n      error => this.alertService.addServerFailure(error)\n    );\n  }\n\n  private getGroups(): Promise<void | IUserGroup[]> {\n    return this.userGroupService.list({ pageSize: 100 }).then(\n      res => res.data,\n      error => this.alertService.addServerFailure(error)\n    );\n  }\n\n  private getInventoryRoles(): Promise<void | IIdentified[]> {\n    return this.inventoryRoleService.list({ pageSize: 100 }).then(\n      res => res.data,\n      error => this.alertService.addServerFailure(error)\n    );\n  }\n\n  private async confirmSaveWithUsersLogOutOption(\n    currentUserAffectedByTerminateUserSessions: boolean\n  ) {\n    const modalLabels = { ok: gettext('Save'), cancel: gettext('Cancel') };\n    const modalBody = gettext(\n      `You are about to save changes to the SSO configuration. For these changes to take effect immediately, it is recommended to log out all affected users. If you prefer, you may skip the logout by unchecking the box below.`\n    );\n\n    const checkboxLabel = currentUserAffectedByTerminateUserSessions\n      ? gettext(\n          `Log out all users logged with \"OAI-Secure\" or \"Single sign-on redirect\" (you are one of these users, so you will be logged out, too)`\n        )\n      : gettext(\n          `Log out all users logged with \"OAI-Secure\" or \"Single sign-on redirect\" (you are not one of these users, so you won't be logged out)`\n        );\n    return (await this.modalService.confirm(\n      gettext('Save SSO configuration?'),\n      modalBody,\n      Status.WARNING,\n      modalLabels,\n      {\n        terminateUserSessions: {\n          text: checkboxLabel,\n          checked: true\n        }\n      }\n    )) as { confirmed: boolean; confirmOptions: { [key: string]: boolean } };\n  }\n}\n","<c8y-title>{{ 'Single sign-on' | translate }}</c8y-title>\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    [icon]=\"'cog'\"\n    [label]=\"'Settings' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [icon]=\"'cog'\"\n    [label]=\"'Single sign-on' | translate\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    class=\"btn btn-link\"\n    title=\"{{ 'Reload' | translate }}\"\n    type=\"button\"\n    (click)=\"loadSsoConfiguration()\"\n  >\n    <i\n      c8yIcon=\"refresh\"\n      [ngClass]=\"{ 'icon-spin': reloading$ | async }\"\n    ></i>\n    {{ 'Reload' | translate }}\n  </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n  [placement]=\"'left'\"\n  itemClass=\"navbar-form hidden-xs\"\n>\n  <div\n    class=\"form-group d-flex m-b-0\"\n    title=\"{{ 'Template' | translate }}\"\n  >\n    <label\n      class=\"control-label\"\n      for=\"template\"\n    >\n      {{ 'Template' | translate }}\n    </label>\n    <div class=\"c8y-select-wrapper\">\n      @if (ssoConfiguration) {\n        <select\n          class=\"form-control\"\n          id=\"template\"\n          name=\"template\"\n          [(ngModel)]=\"ssoConfiguration.template\"\n        >\n          @for (templateType of templateTypeConfig | keyvalue; track templateType) {\n            <option [ngValue]=\"templateType.key\">\n              {{ templateType.value.label | translate }}\n            </option>\n          }\n        </select>\n      }\n      <span></span>\n    </div>\n  </div>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n  <div class=\"col-lg-12 col-lg-max\">\n    <form\n      class=\"card card--fullpage\"\n      #ssoConfigurationForm=\"ngForm\"\n      novalidate\n    >\n      <div class=\"card-header separator\">\n        <div class=\"card-title\">\n          {{ 'Single sign-on' | translate }}\n        </div>\n      </div>\n\n      <div class=\"inner-scroll\">\n        @if (ssoConfiguration) {\n          <div class=\"card-block p-0\">\n            @if (ssoConfiguration.template === templateType.CUSTOM) {\n              <c8y-custom-template\n                [ssoConfiguration]=\"ssoConfiguration\"\n                [ssoConfigurationChangeTrigger]=\"saveSubject.asObservable()\"\n                (ssoConfigurationChange)=\"save($event)\"\n                [apps]=\"apps\"\n                [groups]=\"groups\"\n                [inventoryRoles]=\"inventoryRoles\"\n              ></c8y-custom-template>\n            }\n            @if (ssoConfiguration.template === templateType.AZURE) {\n              <c8y-aad-template\n                [ssoConfiguration]=\"ssoConfiguration\"\n                [ssoConfigurationChangeTrigger]=\"saveSubject.asObservable()\"\n                (ssoConfigurationChange)=\"save($event)\"\n                [apps]=\"apps\"\n                [groups]=\"groups\"\n                [inventoryRoles]=\"inventoryRoles\"\n              ></c8y-aad-template>\n            }\n            @if (ssoConfiguration.template === templateType.KEYCLOAK) {\n              <c8y-key-cloak-template\n                [ssoConfiguration]=\"ssoConfiguration\"\n                [ssoConfigurationChangeTrigger]=\"saveSubject.asObservable()\"\n                (ssoConfigurationChange)=\"save($event)\"\n                [apps]=\"apps\"\n                [groups]=\"groups\"\n                [inventoryRoles]=\"inventoryRoles\"\n              ></c8y-key-cloak-template>\n            }\n          </div>\n        }\n      </div>\n      <div class=\"card-footer separator\">\n        <button\n          class=\"btn btn-primary\"\n          title=\"{{ 'Save' | translate }}\"\n          type=\"submit\"\n          (click)=\"saveSubject.next()\"\n          [disabled]=\"!ssoConfigurationForm.form.valid || ssoConfigurationForm.form.pristine\"\n        >\n          {{ 'Save' | translate }}\n        </button>\n      </div>\n    </form>\n  </div>\n</div>\n","import { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { SsoConfigurationService } from './sso-configuration.service';\nimport { CanActivate } from '@angular/router';\n\n@Injectable()\nexport class SsoConfigurationGuard implements CanActivate {\n  private ssoConfigurationService = inject(SsoConfigurationService);\n\n  canActivate(): Observable<boolean> {\n    return this.ssoConfigurationService.shouldShowTab$();\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { SsoConfigurationComponent } from './sso-configuration.component';\nimport { CoreModule, hookRoute } from '@c8y/ngx-components';\nimport { SsoConfigurationService } from './sso-configuration.service';\nimport { BsDatepickerModule } from 'ngx-bootstrap/datepicker';\nimport { CustomTemplateComponent } from './templates/custom-template.component';\nimport { KeyCloakTemplateComponent } from './templates/key-cloak-template.component';\nimport { BasicConfigurationComponent } from './template-parts/basic-configuration.component';\nimport { RequestConfigurationComponent } from './template-parts/request-configuration.component';\nimport { UserIdConfigurationComponent } from './template-parts/user-id-configuration.component';\nimport { UserDataMappingComponent } from './template-parts/user-data-mapping.component';\nimport { AccessMappingComponent } from './template-parts/access-mapping/access-mapping.component';\nimport { DynamicAccessMappingComponent } from './template-parts/access-mapping/dynamic-access-mapping.component';\nimport { SignatureConfigurationComponent } from './template-parts/signature-configuration.component';\nimport { AadTemplateComponent } from './templates/aad-template.component';\nimport { LogoutConfigurationComponent } from './template-parts/logout-configuration.component';\nimport { AuthConfigurationGuard } from '../auth-configuration.guard';\nimport { CustomConfigurationMapper } from './templates/custom-configuration-mapper';\nimport { KeyCloakConfigurationMapper } from './templates/key-cloak-configuration-mapper';\nimport { AadConfigurationMapper } from './templates/aad-configuration-mapper';\nimport { SsoConfigurationGuard } from './sso-configuration.guard';\nimport { ExternalTokenConfigComponent } from './template-parts/external-token-config.component';\nimport { ChildPredicatesComponent } from './template-parts/access-mapping/child-predicates.component';\nimport { InventoryRolesMappingComponent } from './template-parts/access-mapping/inventory-roles-mapping.component';\nimport { InventoryRolesModalComponent } from './template-parts/access-mapping/inventory-roles-modal.component';\nimport { AssetSelectorModule } from '@c8y/ngx-components/assets-navigator';\nimport { PaginatedListGroupComponent } from './template-parts/access-mapping/paginated-list-group.component';\n\n@NgModule({\n  imports: [\n    CoreModule,\n    TooltipModule,\n    PopoverModule,\n    CollapseModule.forRoot(),\n    BsDatepickerModule,\n    AssetSelectorModule,\n    PaginatedListGroupComponent,\n    SsoConfigurationComponent,\n    CustomTemplateComponent,\n    KeyCloakTemplateComponent,\n    AadTemplateComponent,\n    BasicConfigurationComponent,\n    RequestConfigurationComponent,\n    UserIdConfigurationComponent,\n    UserDataMappingComponent,\n    AccessMappingComponent,\n    DynamicAccessMappingComponent,\n    SignatureConfigurationComponent,\n    LogoutConfigurationComponent,\n    ChildPredicatesComponent,\n    InventoryRolesMappingComponent,\n    InventoryRolesModalComponent,\n    ExternalTokenConfigComponent\n  ],\n  exports: [SsoConfigurationComponent],\n  providers: [\n    SsoConfigurationGuard,\n    SsoConfigurationService,\n    AadConfigurationMapper,\n    CustomConfigurationMapper,\n    KeyCloakConfigurationMapper,\n    hookRoute({\n      path: 'auth-configuration/single_sign-on',\n      component: SsoConfigurationComponent,\n      canActivate: [AuthConfigurationGuard, SsoConfigurationGuard]\n    })\n  ]\n})\nexport class SsoConfigurationModule {}\n","import { inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { Tab, TabFactory, TabsService } from '@c8y/ngx-components';\nimport { SsoConfigurationService } from '../sso-configuration/sso-configuration.service';\nimport { BasicSettingsService } from '../basic-settings/basic-settings.service';\nimport { filter, map, mergeAll, shareReplay, toArray } from 'rxjs/operators';\nimport { Observable, of, merge, defer } from 'rxjs';\n\n@Injectable()\nexport class AuthConfigurationTabsFactory implements TabFactory {\n  private router = inject(Router);\n  private tabsService = inject(TabsService);\n  private basicSettingsService = inject(BasicSettingsService);\n  private ssoConfigurationService = inject(SsoConfigurationService);\n\n  tabs$: Observable<Tab[]> = defer(() => {\n    const basicSettingsTab$ = this.basicSettingsService.shouldShowTab$().pipe(\n      filter(shouldShow => shouldShow),\n      map(\n        (): Tab => ({\n          path: 'auth-configuration/basic_settings',\n          label: gettext('Basic settings'),\n          icon: 'unlock-alt',\n          priority: 1100,\n          orientation: 'horizontal'\n        })\n      )\n    );\n\n    const ssoTab$ = this.ssoConfigurationService.shouldShowTab$().pipe(\n      filter(shouldShow => shouldShow),\n      map(\n        (): Tab => ({\n          path: 'auth-configuration/single_sign-on',\n          label: gettext('Single sign-on'),\n          icon: 'sign-in',\n          priority: 1050,\n          orientation: 'horizontal'\n        })\n      )\n    );\n\n    return merge([basicSettingsTab$, ssoTab$]).pipe(mergeAll(), toArray());\n  }).pipe(shareReplay(1));\n\n  get(): Observable<Tab[]> {\n    if (!this.router.url.match(/auth-configuration/g)) {\n      return of([]);\n    }\n\n    return this.tabs$;\n  }\n\n  listTabs(): Observable<Tab[]> {\n    return this.tabs$.pipe(map(tabs => this.tabsService.sortTabs(tabs)));\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { NavigatorNode, NavigatorNodeFactory, Permissions } from '@c8y/ngx-components';\nimport { AuthConfigurationTabsFactory } from './tabs.factory';\nimport { defer, firstValueFrom, Observable, shareReplay } from 'rxjs';\n\n@Injectable()\nexport class AuthConfigurationNavigationFactory implements NavigatorNodeFactory {\n  private permissions = inject(Permissions);\n  private tabsFactory = inject(AuthConfigurationTabsFactory);\n  navs$: Observable<NavigatorNode[]> = defer(async () => {\n    const navs: NavigatorNode[] = [];\n\n    const userHasPermission = this.permissions.hasAnyRole([\n      Permissions.ROLE_TENANT_ADMIN,\n      Permissions.ROLE_TENANT_MANAGEMENT_ADMIN\n    ]);\n\n    const tabs = await firstValueFrom(this.tabsFactory.listTabs());\n    const hasTabs = tabs && tabs.length > 0;\n\n    if (userHasPermission && hasTabs) {\n      navs.push(\n        new NavigatorNode({\n          label: gettext('Authentication'),\n          icon: 'c8y-shield',\n          path: '/auth-configuration',\n          parent: gettext('Settings'),\n          routerLinkExact: false,\n          priority: 2000\n        })\n      );\n    }\n\n    return navs;\n  }).pipe(shareReplay(1));\n\n  async get() {\n    return firstValueFrom(this.navs$);\n  }\n}\n","import { gettext } from '@c8y/ngx-components/gettext';\n\nexport const MESSAGES_AUTH_CONFIGURATION = {\n  '^The tenant option: configuration/tenant.login.ignore-case cannot be enabled : Username or alias is duplicated when case sensitivity is ignored.$':\n    {\n      gettext: gettext(\n        'Could not enable the \"Ignore case when logging in\" feature. Duplicate usernames or aliases were detected when ignoring case sensitivity. Resolve conflicting names and try again.'\n      )\n    },\n  \"^The tenant option: configuration/tenant.login.ignore-case cannot be managed : Feature 'Ignore case on username or alias login' is not available.$\":\n    {\n      gettext: gettext('The feature \"Ignore case when logging in\" is not available.')\n    },\n  \"^The tenant option: configuration/tenant.login.ignore-case cannot be managed : Only a tenant administrator can change the state of the 'Ignore case on username or alias login' feature.$\":\n    {\n      gettext: gettext(\n        'Only a tenant administrator can configure the \"Ignore case when logging in\" option.'\n      )\n    }\n} as const;\n","import { inject, NgModule } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { BasicSettingsModule } from './basic-settings/basic-settings.module';\nimport { SsoConfigurationModule } from './sso-configuration/sso-configuration.module';\nimport { hookNavigator, hookPatternMessages, hookRoute, hookTab } from '@c8y/ngx-components';\nimport { AuthConfigurationTabsFactory } from './factories/tabs.factory';\nimport { AuthConfigurationNavigationFactory } from './factories/navigation.factory';\nimport { AuthConfigurationGuard } from './auth-configuration.guard';\nimport { MESSAGES_AUTH_CONFIGURATION } from './pattern-messages.data';\n\n@NgModule({\n  imports: [BasicSettingsModule, SsoConfigurationModule],\n  providers: [\n    AuthConfigurationGuard,\n    AuthConfigurationTabsFactory,\n    hookTab(AuthConfigurationTabsFactory),\n    hookNavigator(AuthConfigurationNavigationFactory),\n    hookPatternMessages(MESSAGES_AUTH_CONFIGURATION),\n    hookRoute({\n      path: 'auth-configuration',\n      redirectTo: () => {\n        const tabsFactory = inject(AuthConfigurationTabsFactory);\n\n        return tabsFactory.listTabs().pipe(\n          map(tabs => {\n            const firstPath = tabs[0]?.path;\n            return typeof firstPath === 'string' ? firstPath : null;\n          })\n        );\n      },\n      pathMatch: 'full'\n    })\n  ]\n})\nexport class AuthConfigurationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i3.TenantLoginOptionMapper","i2","i3","i1.AuthConfigurationService","map","i1.SsoConfigurationMapper","i1.CustomConfigurationMapper","i1.AadConfigurationMapper","i1.KeyCloakConfigurationMapper","i1.SsoConfigurationService","i4","shareReplay"],"mappings":"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"}