@c8y/ngx-components 1023.17.11 → 1023.17.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"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.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 { 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';\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 hookRoute({\n path: 'auth-configuration/basic_settings',\n component: AuthConfigurationComponent,\n canActivate: [AuthConfigurationGuard]\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, publishReplay, refCount, 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 publishReplay(1, 1000),\n refCount(),\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) {\n return this.loginOptionsService.save(ssoConfiguration);\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} 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 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 = 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 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","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, NgIf, NgFor, 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 NgIf,\n FormsModule,\n NgFor,\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 await this.warnAboutForceUsersLogOut();\n const logoutRequired =\n this.tenantUiService.getCurrentUserLoginMode() !== TenantLoginOptionType.BASIC;\n if (logoutRequired) {\n await this.modalService.confirmLogout();\n }\n await this.ssoConfigurationService.save(ssoConfiguration);\n if (logoutRequired) {\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 warnAboutForceUsersLogOut() {\n const modalLabels = { ok: gettext('Update and log out users'), cancel: gettext('Cancel') };\n const modalBody = gettext(\n 'Updating SSO configuration will log out all users logged with \"OAI-Secure\" or \"Single sign-on redirect\". Do you want to proceed?'\n );\n return await this.modalService.confirm(\n gettext('Force users to log out'),\n modalBody,\n Status.WARNING,\n modalLabels\n );\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 <select\n class=\"form-control\"\n id=\"template\"\n name=\"template\"\n *ngIf=\"ssoConfiguration\"\n [(ngModel)]=\"ssoConfiguration.template\"\n >\n <option\n *ngFor=\"let templateType of templateTypeConfig | keyvalue\"\n [ngValue]=\"templateType.key\"\n >\n {{ templateType.value.label | translate }}\n </option>\n </select>\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 <div\n class=\"card-block p-0\"\n *ngIf=\"ssoConfiguration\"\n >\n <c8y-custom-template\n *ngIf=\"ssoConfiguration.template === templateType.CUSTOM\"\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 <c8y-aad-template\n *ngIf=\"ssoConfiguration.template === templateType.AZURE\"\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 <c8y-key-cloak-template\n *ngIf=\"ssoConfiguration.template === templateType.KEYCLOAK\"\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 </div>\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 { Injectable } from '@angular/core';\n\nimport { of, Observable } from 'rxjs';\nimport { catchError, mapTo } from 'rxjs/operators';\nimport { SsoConfigurationService } from './sso-configuration.service';\n\n@Injectable()\nexport class SsoConfigurationGuard {\n constructor(private ssoConfigurationService: SsoConfigurationService) {}\n\n canActivate(): Observable<boolean> {\n return this.ssoConfigurationService.getSsoConfiguration$().pipe(\n mapTo(true),\n catchError(() => of(false))\n );\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 { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { Tab, TabFactory } from '@c8y/ngx-components';\nimport { SsoConfigurationService } from '../sso-configuration/sso-configuration.service';\nimport { catchError, mapTo, mergeAll, toArray } from 'rxjs/operators';\nimport { Observable, of, EMPTY, merge } from 'rxjs';\n\n@Injectable()\nexport class AuthConfigurationTabsFactory implements TabFactory {\n constructor(\n public router: Router,\n private ssoConfigurationService: SsoConfigurationService\n ) {}\n get(): Observable<Tab[]> {\n if (!this.router.url.match(/auth-configuration/g)) {\n return of([]);\n }\n\n const basicSettingsTab$ = of({\n path: 'auth-configuration/basic_settings',\n label: gettext('Basic settings'),\n icon: 'unlock-alt',\n priority: 1100,\n orientation: 'horizontal'\n } as Tab);\n const ssoTab$ = this.ssoConfigurationService.getSsoConfiguration$().pipe(\n mapTo({\n path: 'auth-configuration/single_sign-on',\n label: gettext('Single sign-on'),\n icon: 'sign-in',\n priority: 1050,\n orientation: 'horizontal'\n } as Tab),\n catchError(() => EMPTY)\n );\n return merge([basicSettingsTab$, ssoTab$]).pipe(mergeAll(), toArray());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { NavigatorNode, NavigatorNodeFactory, Permissions } from '@c8y/ngx-components';\n\n@Injectable()\nexport class AuthConfigurationNavigationFactory implements NavigatorNodeFactory {\n navs: NavigatorNode[] = [];\n\n constructor(private permissions: Permissions) {}\n\n async get() {\n const userHasPermission = this.permissions.hasAnyRole([\n Permissions.ROLE_TENANT_ADMIN,\n Permissions.ROLE_TENANT_MANAGEMENT_ADMIN\n ]);\n if (this.navs.length === 0 && userHasPermission) {\n this.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 return 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 { NgModule } from '@angular/core';\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 hookTab(AuthConfigurationTabsFactory),\n hookNavigator(AuthConfigurationNavigationFactory),\n hookPatternMessages(MESSAGES_AUTH_CONFIGURATION),\n hookRoute({\n path: 'auth-configuration',\n redirectTo: 'auth-configuration/basic_settings',\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","i2.SsoConfigurationService"],"mappings":"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"}
1
+ {"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) {\n return this.loginOptionsService.save(ssoConfiguration);\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} 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 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 = 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 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","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, NgIf, NgFor, 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 NgIf,\n FormsModule,\n NgFor,\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 await this.warnAboutForceUsersLogOut();\n const logoutRequired =\n this.tenantUiService.getCurrentUserLoginMode() !== TenantLoginOptionType.BASIC;\n if (logoutRequired) {\n await this.modalService.confirmLogout();\n }\n await this.ssoConfigurationService.save(ssoConfiguration);\n if (logoutRequired) {\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 warnAboutForceUsersLogOut() {\n const modalLabels = { ok: gettext('Update and log out users'), cancel: gettext('Cancel') };\n const modalBody = gettext(\n 'Updating SSO configuration will log out all users logged with \"OAI-Secure\" or \"Single sign-on redirect\". Do you want to proceed?'\n );\n return await this.modalService.confirm(\n gettext('Force users to log out'),\n modalBody,\n Status.WARNING,\n modalLabels\n );\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 <select\n class=\"form-control\"\n id=\"template\"\n name=\"template\"\n *ngIf=\"ssoConfiguration\"\n [(ngModel)]=\"ssoConfiguration.template\"\n >\n <option\n *ngFor=\"let templateType of templateTypeConfig | keyvalue\"\n [ngValue]=\"templateType.key\"\n >\n {{ templateType.value.label | translate }}\n </option>\n </select>\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 <div\n class=\"card-block p-0\"\n *ngIf=\"ssoConfiguration\"\n >\n <c8y-custom-template\n *ngIf=\"ssoConfiguration.template === templateType.CUSTOM\"\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 <c8y-aad-template\n *ngIf=\"ssoConfiguration.template === templateType.AZURE\"\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 <c8y-key-cloak-template\n *ngIf=\"ssoConfiguration.template === templateType.KEYCLOAK\"\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 </div>\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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"}