@c8y/ngx-components 1021.63.2 → 1021.67.0
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.
- package/auth-configuration/sso-configuration/template-parts/signature-configuration.component.d.ts +7 -2
- package/auth-configuration/sso-configuration/template-parts/signature-configuration.component.d.ts.map +1 -1
- package/core/bottom-drawer/bottom-drawer-ref.d.ts +4 -0
- package/core/bottom-drawer/bottom-drawer-ref.d.ts.map +1 -1
- package/core/breadcrumb/breadcrumb-item.component.d.ts +1 -1
- package/core/breadcrumb/breadcrumb-item.component.d.ts.map +1 -1
- package/core/breadcrumb/breadcrumb-outlet.component.d.ts +1 -1
- package/core/breadcrumb/breadcrumb-outlet.component.d.ts.map +1 -1
- package/core/breadcrumb/breadcrumb.component.d.ts +1 -1
- package/core/breadcrumb/breadcrumb.component.d.ts.map +1 -1
- package/core/breadcrumb/breadcrumb.module.d.ts +7 -7
- package/core/breadcrumb/breadcrumb.module.d.ts.map +1 -1
- package/core/common/common.module.d.ts +38 -38
- package/core/common/date-format.service.d.ts +30 -0
- package/core/common/date-format.service.d.ts.map +1 -0
- package/core/common/date.pipe.d.ts +7 -3
- package/core/common/date.pipe.d.ts.map +1 -1
- package/core/common/index.d.ts +1 -0
- package/core/common/index.d.ts.map +1 -1
- package/core/common/outlet.directive.d.ts +1 -1
- package/core/common/outlet.directive.d.ts.map +1 -1
- package/core/common/user-preferences/user-preferences-store-current-user.d.ts +11 -0
- package/core/common/user-preferences/user-preferences-store-current-user.d.ts.map +1 -0
- package/core/common/user-preferences/user-preferences.service.d.ts +40 -1
- package/core/common/user-preferences/user-preferences.service.d.ts.map +1 -1
- package/core/date-picker/date-picker.component.d.ts +3 -1
- package/core/date-picker/date-picker.component.d.ts.map +1 -1
- package/core/date-time-picker/date-time-picker.component.d.ts +6 -3
- package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
- package/core/dynamic-forms/date/date.type.component.d.ts +3 -0
- package/core/dynamic-forms/date/date.type.component.d.ts.map +1 -1
- package/core/plugins/plugins.model.d.ts +1 -0
- package/core/plugins/plugins.model.d.ts.map +1 -1
- package/core/plugins/plugins.service.d.ts +7 -2
- package/core/plugins/plugins.service.d.ts.map +1 -1
- package/core/time-interval/time-interval.component.d.ts +4 -2
- package/core/time-interval/time-interval.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/application-plugin-readme.component.d.ts +15 -0
- package/ecosystem/application-plugins/application-plugin-readme.component.d.ts.map +1 -0
- package/ecosystem/application-plugins/application-plugins.component.d.ts +4 -2
- package/ecosystem/application-plugins/application-plugins.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/application-plugins.module.d.ts +4 -3
- package/ecosystem/application-plugins/application-plugins.module.d.ts.map +1 -1
- package/ecosystem/application-plugins/install-plugin.component.d.ts +8 -4
- package/ecosystem/application-plugins/install-plugin.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/plugin-list.component.d.ts +10 -26
- package/ecosystem/application-plugins/plugin-list.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/plugin-list.service.d.ts +27 -0
- package/ecosystem/application-plugins/plugin-list.service.d.ts.map +1 -0
- package/ecosystem/ecosystem.module.d.ts +2 -1
- package/ecosystem/ecosystem.module.d.ts.map +1 -1
- package/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.d.ts +15 -0
- package/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.d.ts.map +1 -0
- package/ecosystem/packages/package-changelog.guard.d.ts +10 -0
- package/ecosystem/packages/package-changelog.guard.d.ts.map +1 -0
- package/ecosystem/packages/package-details/package-details.component.d.ts +7 -9
- package/ecosystem/packages/package-details/package-details.component.d.ts.map +1 -1
- package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts +5 -1
- package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts.map +1 -1
- package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts +8 -3
- package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts.map +1 -1
- package/ecosystem/packages/package-versions/packages-versions.component.d.ts +9 -2
- package/ecosystem/packages/package-versions/packages-versions.component.d.ts.map +1 -1
- package/ecosystem/shared/index.d.ts +1 -0
- package/ecosystem/shared/index.d.ts.map +1 -1
- package/ecosystem/shared/package-changelog/package-changelog.component.d.ts +24 -0
- package/ecosystem/shared/package-changelog/package-changelog.component.d.ts.map +1 -0
- package/ecosystem/shared/shared-ecosystem.module.d.ts +2 -1
- package/ecosystem/shared/shared-ecosystem.module.d.ts.map +1 -1
- package/esm2022/auth-configuration/sso-configuration/template-parts/signature-configuration.component.mjs +11 -7
- package/esm2022/core/bottom-drawer/bottom-drawer-ref.mjs +9 -3
- package/esm2022/core/breadcrumb/breadcrumb-item.component.mjs +3 -3
- package/esm2022/core/breadcrumb/breadcrumb-outlet.component.mjs +19 -9
- package/esm2022/core/breadcrumb/breadcrumb.component.mjs +3 -3
- package/esm2022/core/breadcrumb/breadcrumb.module.mjs +16 -5
- package/esm2022/core/common/common.module.mjs +6 -6
- package/esm2022/core/common/date-format.service.mjs +81 -0
- package/esm2022/core/common/date.pipe.mjs +29 -6
- package/esm2022/core/common/index.mjs +2 -1
- package/esm2022/core/common/outlet.directive.mjs +4 -3
- package/esm2022/core/common/user-preferences/user-preferences-store-current-user.mjs +22 -0
- package/esm2022/core/common/user-preferences/user-preferences.service.mjs +106 -16
- package/esm2022/core/date-picker/date-picker.component.mjs +11 -4
- package/esm2022/core/date-time-picker/date-time-picker.component.mjs +20 -11
- package/esm2022/core/dynamic-forms/date/date.type.component.mjs +12 -4
- package/esm2022/core/plugins/plugins.model.mjs +1 -1
- package/esm2022/core/plugins/plugins.service.mjs +31 -5
- package/esm2022/core/time-interval/time-interval.component.mjs +9 -2
- package/esm2022/ecosystem/application-plugins/application-plugin-readme.component.mjs +26 -0
- package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +29 -14
- package/esm2022/ecosystem/application-plugins/application-plugins.module.mjs +6 -3
- package/esm2022/ecosystem/application-plugins/install-plugin.component.mjs +21 -15
- package/esm2022/ecosystem/application-plugins/plugin-list-item.component.mjs +3 -3
- package/esm2022/ecosystem/application-plugins/plugin-list.component.mjs +26 -202
- package/esm2022/ecosystem/application-plugins/plugin-list.service.mjs +200 -0
- package/esm2022/ecosystem/application-plugins/update-plugin-of-app/update-plugin-of-app.component.mjs +3 -3
- package/esm2022/ecosystem/application-properties/update-application-modal/update-application-modal.component.mjs +1 -1
- package/esm2022/ecosystem/ecosystem.module.mjs +21 -5
- package/esm2022/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.mjs +33 -0
- package/esm2022/ecosystem/packages/package-changelog.guard.mjs +22 -0
- package/esm2022/ecosystem/packages/package-details/package-details.component.mjs +25 -44
- package/esm2022/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.mjs +14 -4
- package/esm2022/ecosystem/packages/package-versions/package-contents/packages-contents.component.mjs +27 -8
- package/esm2022/ecosystem/packages/package-versions/packages-versions.component.mjs +22 -8
- package/esm2022/ecosystem/shared/index.mjs +2 -1
- package/esm2022/ecosystem/shared/list-filters/list-filters.component.mjs +3 -3
- package/esm2022/ecosystem/shared/package-changelog/package-changelog.component.mjs +82 -0
- package/esm2022/ecosystem/shared/package-version-select/package-version-select.component.mjs +3 -3
- package/esm2022/ecosystem/shared/shared-ecosystem.module.mjs +12 -6
- package/esm2022/operations/bulk-operation-scheduler/operation-scheduler.component.mjs +9 -7
- package/esm2022/operations/bulk-operations-list/bulk-operations-list.component.mjs +1 -1
- package/esm2022/upgrade/ng1/downgraded.services.mjs +3 -2
- package/esm2022/upgrade/ng1/index.mjs +3 -2
- package/esm2022/widgets/cockpit/index.mjs +3 -1
- package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
- package/esm2022/widgets/definitions/index.mjs +2 -1
- package/esm2022/widgets/definitions/radial-gauge/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +5 -0
- package/esm2022/widgets/definitions/radial-gauge/index.mjs +33 -0
- package/esm2022/widgets/implementations/info-gauge/index.mjs +2 -2
- package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.mjs +295 -0
- package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.mjs +141 -11
- package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.mjs +67 -0
- package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.mjs +34 -6
- package/esm2022/widgets/implementations/info-gauge/info-gauge-widget.module.mjs +9 -4
- package/esm2022/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.mjs +97 -0
- package/esm2022/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.mjs +369 -0
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs +9 -5
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +209 -142
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +96 -13
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +336 -186
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +7 -5
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade.mjs +3 -1
- package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +2 -0
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +40 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +991 -28
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +833 -550
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +45 -6
- package/locales/es.po +45 -6
- package/locales/fr.po +45 -6
- package/locales/ja_JP.po +45 -6
- package/locales/ko.po +45 -6
- package/locales/locales.pot +73 -10
- package/locales/nl.po +45 -6
- package/locales/pl.po +45 -6
- package/locales/pt_BR.po +45 -6
- package/locales/zh_CN.po +45 -6
- package/locales/zh_TW.po +45 -6
- package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts +4 -2
- package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts.map +1 -1
- package/package.json +1 -1
- package/upgrade/ng1/downgraded.services.d.ts +1 -0
- package/upgrade/ng1/downgraded.services.d.ts.map +1 -1
- package/upgrade/ng1/index.d.ts.map +1 -1
- package/widgets/cockpit/index.d.ts +29 -0
- package/widgets/cockpit/index.d.ts.map +1 -1
- package/widgets/cockpit-exports/index.d.ts +6 -0
- package/widgets/cockpit-exports/index.d.ts.map +1 -1
- package/widgets/definitions/index.d.ts +1 -0
- package/widgets/definitions/index.d.ts.map +1 -1
- package/widgets/definitions/radial-gauge/c8y-ngx-components-widgets-definitions-radial-gauge.d.ts.map +1 -0
- package/widgets/definitions/radial-gauge/index.d.ts +33 -0
- package/widgets/definitions/radial-gauge/index.d.ts.map +1 -0
- package/widgets/implementations/info-gauge/index.d.ts +1 -1
- package/widgets/implementations/info-gauge/index.d.ts.map +1 -1
- package/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.d.ts +339 -0
- package/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.d.ts.map +1 -0
- package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts +27 -7
- package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.d.ts +33 -0
- package/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.d.ts.map +1 -0
- package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts +7 -3
- package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts.map +1 -1
- package/widgets/implementations/info-gauge/info-gauge-widget.module.d.ts +2 -1
- package/widgets/implementations/info-gauge/info-gauge-widget.module.d.ts.map +1 -1
- package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.d.ts +37 -0
- package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.d.ts.map +1 -0
- package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.d.ts +146 -0
- package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.d.ts.map +1 -0
- package/esm2022/widgets/implementations/info-gauge/info-gauge.model.mjs +0 -2
- package/widgets/implementations/info-gauge/info-gauge.model.d.ts +0 -7
- package/widgets/implementations/info-gauge/info-gauge.model.d.ts.map +0 -1
|
@@ -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/session-configuration.component.ts","../../auth-configuration/basic-settings/session-configuration.component.html","../../auth-configuration/basic-settings/login-settings.component.ts","../../auth-configuration/basic-settings/login-settings.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/basic-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/basic-configuration.component.html","../../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/user-data-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/user-data-mapping.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/signature-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/signature-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/templates/custom-template.component.ts","../../auth-configuration/sso-configuration/templates/custom-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/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/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 } from '@angular/forms';\nimport { UserAgent, AuthenticationRestrictions, isBasic } from './basic-settings.model';\n\n@Component({\n selector: 'c8y-basic-auth-settings',\n templateUrl: './basic-auth-settings.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { ISessionConfiguration, TenantLoginOptionType } from '@c8y/client';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { defaults, cloneDeep, isFinite } from 'lodash-es';\nimport { gettext, TenantUiService } from '@c8y/ngx-components';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isOauthInternal } from './basic-settings.model';\n\n@Component({\n selector: 'c8y-session-configuration',\n templateUrl: './session-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { TenantUiService } from '@c8y/ngx-components';\nimport { TenantLoginOptionType } from '@c8y/client';\n\n@Component({\n selector: 'c8y-login-settings',\n templateUrl: './login-settings.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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","// tslint:disable:no-string-literal\nimport { Component, Input, SimpleChanges } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { isEmpty } from 'lodash-es';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { TfaStrategy, TenantLoginOptionType } from '@c8y/client';\nimport { AuthConfiguration } from './auth-configuration.model';\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})\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 { AlertService, LoginService, ModalService } from '@c8y/ngx-components';\nimport { TenantLoginOptionsService } from '@c8y/client';\nimport { cloneDeep } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { tap, switchMap, shareReplay } from 'rxjs/operators';\nimport { AuthConfiguration } from './auth-configuration.model';\n\n@Component({\n selector: 'c8y-auth-configuration',\n templateUrl: './auth-configuration.component.html'\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 tenantLoginOptionsService: TenantLoginOptionsService,\n private modalService: ModalService,\n private loginService: LoginService,\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.loginService.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 declarations: [\n SessionConfigurationComponent,\n LoginSettingsComponent,\n BasicAuthSettingsComponent,\n AuthConfigurationComponent,\n TfaSettingsComponent\n ],\n exports: [],\n imports: [CoreModule, PopoverModule],\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';\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';\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';\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})\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, OnChanges } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { memoize } from '@c8y/ngx-components';\nimport { TenantService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-basic-configuration',\n templateUrl: './basic-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { Component, Input } from '@angular/core';\nimport { memoize } from '@c8y/ngx-components';\nimport { pull } from 'lodash-es';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-request-configuration',\n templateUrl: './request-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 } from '@angular/forms';\nimport { memoize } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-user-id-configuration',\n templateUrl: './user-id-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { gettext } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-sso-user-data-mapping',\n templateUrl: './user-data-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { gettext } from '@c8y/ngx-components';\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 } from '@angular/forms';\nimport { pull } from 'lodash-es';\nimport { relations } from './dynamic-accesss-mapping-relations.model';\nimport { ChildPredicate } from '../../sso-configuration.model';\n\n@Component({\n selector: 'c8y-sso-child-predicates',\n templateUrl: './child-predicates.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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';\n\n@Component({\n selector: 'c8y-sso-dynamic-access-mapping',\n templateUrl: './dynamic-access-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 title=\"{{ 'Default global roles' | translate }}\"\n class=\"form-group\"\n >\n <label\n [for]=\"'groups' + accessMappingIndex\"\n class=\"control-label\"\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)=\"controlContainer.control.markAsDirty(); selectedGroups = $event; accessMapping.thenGroups = getIds($event)\"\n ></c8y-select-legacy>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div\n title=\"{{ 'Default applications' | translate }}\"\n class=\"form-group\"\n >\n <label\n [for]=\"'apps' + accessMappingIndex\"\n class=\"control-label\"\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)=\"controlContainer.control.markAsDirty(); selectedApps = $event; accessMapping.thenApplications = getIds($event)\"\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';\n\n@Component({\n selector: 'c8y-sso-inventory-roles-modal',\n templateUrl: './inventory-roles-modal.component.html'\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';\n\n@Component({\n selector: 'c8y-sso-inventory-roles-mapping',\n templateUrl: './inventory-roles-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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(public controlContainer: ControlContainer, private bsModal: BsModalService) {}\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 + accessMappingIndex\"\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 ></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 { Component, Input } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { pull, defaultsDeep } from 'lodash-es';\nimport { IApplication, IIdentified, IUserGroup } from '@c8y/client';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { InventoryMapping, AccessMapping } from '../../sso-configuration.model';\n\n@Component({\n selector: 'c8y-sso-access-mapping',\n templateUrl: './access-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class AccessMappingComponent {\n @Input() apps: IApplication[];\n @Input() groups: IUserGroup[];\n @Input() inventoryRoles: IIdentified[];\n @Input() templateModel;\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(private controlContainer: ControlContainer) {}\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 this.templateModel.onNewUser.dynamicMapping.mappings.push(emptyMapping);\n }\n\n addInventoryMapping() {\n const emptyInventoryMapping: InventoryMapping = {\n when: {\n operator: 'AND',\n childPredicates: [{ parameterPath: '', operator: 'EQ', value: '' }]\n },\n thenInventoryRoles: []\n };\n this.templateModel.onNewUser.dynamicMapping.inventoryMappings.push(emptyInventoryMapping);\n }\n\n onRemove(accessMapping: AccessMapping) {\n pull(this.templateModel.onNewUser.dynamicMapping.mappings, accessMapping);\n }\n\n onRemoveInventoryMapping(inventoryMapping: InventoryMapping) {\n pull(this.templateModel.onNewUser.dynamicMapping.inventoryMappings, inventoryMapping);\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 title=\"{{ RETRIVE_FROM_ACCESS_TOKEN | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingSource\"\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 title=\"{{ RETRIVE_FROM_ID_TOKEN | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingSource\"\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 title=\"{{ USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\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 type=\"button\"\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 ></button>\n </label>\n <label\n title=\"{{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\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 type=\"button\"\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_TOOLTIP | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n <label\n title=\"{{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\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 type=\"button\"\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 ></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 *ngIf=\"templateModel.onNewUser.dynamicMapping.mappings.length === 0\"\n [icon]=\"'list'\"\n [title]=\"'No access mapping rules defined.' | translate\"\n [subtitle]=\"'Click below to add a new mapping.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <div\n *ngFor=\"\n let accessMapping of templateModel.onNewUser.dynamicMapping.mappings;\n index as idx\n \"\n >\n <c8y-sso-dynamic-access-mapping\n [accessMapping]=\"accessMapping\"\n (onRemoveAccessMapping)=\"onRemove(accessMapping)\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [accessMappingIndex]=\"idx\"\n ></c8y-sso-dynamic-access-mapping>\n </div>\n <div class=\"p-t-16\">\n <button\n id=\"add-access-mapping-button\"\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Add access mapping' | translate }}\"\n (click)=\"addAccessMapping()\"\n >\n <i\n c8yIcon=\"plus-circle\"\n class=\"m-r-4\"\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 *ngIf=\"templateModel.onNewUser.dynamicMapping.inventoryMappings.length === 0\"\n [icon]=\"'list'\"\n [title]=\"'No inventory roles mapping rules defined.' | translate\"\n [subtitle]=\"'Click below to add a new mapping.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-container\n *ngFor=\"\n let inventoryMapping of templateModel.onNewUser.dynamicMapping.inventoryMappings;\n index as idx\n \"\n >\n <c8y-sso-inventory-roles-mapping\n [inventoryRoles]=\"inventoryRoles\"\n [inventoryMapping]=\"inventoryMapping\"\n (onRemoveInventoryMapping)=\"onRemoveInventoryMapping(inventoryMapping)\"\n [inventoryMappingIndex]=\"idx\"\n ></c8y-sso-inventory-roles-mapping>\n </ng-container>\n <div class=\"p-t-16\">\n <button\n id=\"add-inventory-mapping-button\"\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Add inventory roles mapping' | translate }}\"\n (click)=\"addInventoryMapping()\"\n >\n <i\n c8yIcon=\"plus-circle\"\n class=\"m-r-4\"\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, memoize } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport {\n algorithmTypeConfig,\n CertificateType,\n certificateTypeConfig,\n CustomCertificate\n} from './signature-configuration.model';\n\n@Component({\n selector: 'c8y-sso-signature-configuration',\n templateUrl: './signature-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class SignatureConfigurationComponent {\n @Input() templateModel;\n\n certificateType = CertificateType;\n certificateTypes = certificateTypeConfig;\n\n algorithmTypes = algorithmTypeConfig;\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(protected controlContainer: ControlContainer) {}\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 }\"\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 }\"\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> </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, Input } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { validationMethodConfig } from './external-token-config.model';\nimport { RequestConfiguration } from './request-configuration.model';\n\n@Component({\n selector: 'c8y-external-token-config',\n templateUrl: './external-token-config.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 } 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';\n\n@Component({\n selector: 'c8y-custom-template',\n templateUrl: './custom-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { 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';\n\n@Component({\n selector: 'c8y-key-cloak-template',\n templateUrl: './key-cloak-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { 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 } from '@angular/forms';\n\n@Component({\n selector: 'c8y-sso-logout-configuration',\n templateUrl: './logout-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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';\n\n@Component({\n selector: 'c8y-aad-template',\n templateUrl: './aad-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { 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 {\n gettext,\n AlertService,\n ModalService,\n Status,\n LoginService,\n AppStateService,\n TenantUiService\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 } from '@angular/forms';\n\n@Component({\n selector: 'c8y-sso-configuration',\n templateUrl: './sso-configuration.component.html'\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 loginService: LoginService,\n private appStateService: AppStateService,\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.loginService.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 { DatePipe } from '@angular/common';\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';\n\n@NgModule({\n declarations: [\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 imports: [\n CoreModule,\n TooltipModule,\n PopoverModule,\n CollapseModule.forRoot(),\n BsDatepickerModule,\n AssetSelectorModule\n ],\n exports: [SsoConfigurationComponent],\n providers: [\n SsoConfigurationGuard,\n DatePipe,\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, 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, 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';\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":["i3","i1","i2","i3.TenantLoginOptionMapper","i4","i5","i1.AuthConfigurationService","i6.SessionConfigurationComponent","i7.LoginSettingsComponent","i8.BasicAuthSettingsComponent","i9.TfaSettingsComponent","map","i1.SsoConfigurationMapper","i4.ChildPredicatesComponent","i6.ChildPredicatesComponent","i5.DynamicAccessMappingComponent","i6.InventoryRolesMappingComponent","i5.RequestConfigurationComponent","i6.UserIdConfigurationComponent","i1.CustomConfigurationMapper","i3.BasicConfigurationComponent","i4.RequestConfigurationComponent","i5.UserIdConfigurationComponent","i6.UserDataMappingComponent","i7.AccessMappingComponent","i8.SignatureConfigurationComponent","i9.ExternalTokenConfigComponent","i10","i1.KeyCloakConfigurationMapper","i8.ExternalTokenConfigComponent","i9","i1.AadConfigurationMapper","i4.UserIdConfigurationComponent","i5.UserDataMappingComponent","i6.AccessMappingComponent","i7.SignatureConfigurationComponent","i8.LogoutConfigurationComponent","i1.SsoConfigurationService","i6.CustomTemplateComponent","i7.KeyCloakTemplateComponent","i8.AadTemplateComponent","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/session-configuration.component.ts","../../auth-configuration/basic-settings/session-configuration.component.html","../../auth-configuration/basic-settings/login-settings.component.ts","../../auth-configuration/basic-settings/login-settings.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/basic-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/basic-configuration.component.html","../../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/user-data-mapping.component.ts","../../auth-configuration/sso-configuration/template-parts/user-data-mapping.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/signature-configuration.component.ts","../../auth-configuration/sso-configuration/template-parts/signature-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/templates/custom-template.component.ts","../../auth-configuration/sso-configuration/templates/custom-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/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/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 } from '@angular/forms';\nimport { UserAgent, AuthenticationRestrictions, isBasic } from './basic-settings.model';\n\n@Component({\n selector: 'c8y-basic-auth-settings',\n templateUrl: './basic-auth-settings.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { ISessionConfiguration, TenantLoginOptionType } from '@c8y/client';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { defaults, cloneDeep, isFinite } from 'lodash-es';\nimport { gettext, TenantUiService } from '@c8y/ngx-components';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isOauthInternal } from './basic-settings.model';\n\n@Component({\n selector: 'c8y-session-configuration',\n templateUrl: './session-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { AuthConfiguration } from './auth-configuration.model';\nimport { TenantUiService } from '@c8y/ngx-components';\nimport { TenantLoginOptionType } from '@c8y/client';\n\n@Component({\n selector: 'c8y-login-settings',\n templateUrl: './login-settings.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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","// tslint:disable:no-string-literal\nimport { Component, Input, SimpleChanges } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { isEmpty } from 'lodash-es';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { TfaStrategy, TenantLoginOptionType } from '@c8y/client';\nimport { AuthConfiguration } from './auth-configuration.model';\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})\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 { AlertService, LoginService, ModalService } from '@c8y/ngx-components';\nimport { TenantLoginOptionsService } from '@c8y/client';\nimport { cloneDeep } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { tap, switchMap, shareReplay } from 'rxjs/operators';\nimport { AuthConfiguration } from './auth-configuration.model';\n\n@Component({\n selector: 'c8y-auth-configuration',\n templateUrl: './auth-configuration.component.html'\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 tenantLoginOptionsService: TenantLoginOptionsService,\n private modalService: ModalService,\n private loginService: LoginService,\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.loginService.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 declarations: [\n SessionConfigurationComponent,\n LoginSettingsComponent,\n BasicAuthSettingsComponent,\n AuthConfigurationComponent,\n TfaSettingsComponent\n ],\n exports: [],\n imports: [CoreModule, PopoverModule],\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';\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';\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';\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})\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, OnChanges } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { memoize } from '@c8y/ngx-components';\nimport { TenantService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-basic-configuration',\n templateUrl: './basic-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { Component, Input } from '@angular/core';\nimport { memoize } from '@c8y/ngx-components';\nimport { pull } from 'lodash-es';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-request-configuration',\n templateUrl: './request-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 } from '@angular/forms';\nimport { memoize } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-user-id-configuration',\n templateUrl: './user-id-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { gettext } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-sso-user-data-mapping',\n templateUrl: './user-data-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { gettext } from '@c8y/ngx-components';\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 } from '@angular/forms';\nimport { pull } from 'lodash-es';\nimport { relations } from './dynamic-accesss-mapping-relations.model';\nimport { ChildPredicate } from '../../sso-configuration.model';\n\n@Component({\n selector: 'c8y-sso-child-predicates',\n templateUrl: './child-predicates.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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';\n\n@Component({\n selector: 'c8y-sso-dynamic-access-mapping',\n templateUrl: './dynamic-access-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 title=\"{{ 'Default global roles' | translate }}\"\n class=\"form-group\"\n >\n <label\n [for]=\"'groups' + accessMappingIndex\"\n class=\"control-label\"\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)=\"controlContainer.control.markAsDirty(); selectedGroups = $event; accessMapping.thenGroups = getIds($event)\"\n ></c8y-select-legacy>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div\n title=\"{{ 'Default applications' | translate }}\"\n class=\"form-group\"\n >\n <label\n [for]=\"'apps' + accessMappingIndex\"\n class=\"control-label\"\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)=\"controlContainer.control.markAsDirty(); selectedApps = $event; accessMapping.thenApplications = getIds($event)\"\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';\n\n@Component({\n selector: 'c8y-sso-inventory-roles-modal',\n templateUrl: './inventory-roles-modal.component.html'\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';\n\n@Component({\n selector: 'c8y-sso-inventory-roles-mapping',\n templateUrl: './inventory-roles-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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(public controlContainer: ControlContainer, private bsModal: BsModalService) {}\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 + accessMappingIndex\"\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 ></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 { Component, Input } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { pull, defaultsDeep } from 'lodash-es';\nimport { IApplication, IIdentified, IUserGroup } from '@c8y/client';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { InventoryMapping, AccessMapping } from '../../sso-configuration.model';\n\n@Component({\n selector: 'c8y-sso-access-mapping',\n templateUrl: './access-mapping.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class AccessMappingComponent {\n @Input() apps: IApplication[];\n @Input() groups: IUserGroup[];\n @Input() inventoryRoles: IIdentified[];\n @Input() templateModel;\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(private controlContainer: ControlContainer) {}\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 this.templateModel.onNewUser.dynamicMapping.mappings.push(emptyMapping);\n }\n\n addInventoryMapping() {\n const emptyInventoryMapping: InventoryMapping = {\n when: {\n operator: 'AND',\n childPredicates: [{ parameterPath: '', operator: 'EQ', value: '' }]\n },\n thenInventoryRoles: []\n };\n this.templateModel.onNewUser.dynamicMapping.inventoryMappings.push(emptyInventoryMapping);\n }\n\n onRemove(accessMapping: AccessMapping) {\n pull(this.templateModel.onNewUser.dynamicMapping.mappings, accessMapping);\n }\n\n onRemoveInventoryMapping(inventoryMapping: InventoryMapping) {\n pull(this.templateModel.onNewUser.dynamicMapping.inventoryMappings, inventoryMapping);\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 title=\"{{ RETRIVE_FROM_ACCESS_TOKEN | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingSource\"\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 title=\"{{ RETRIVE_FROM_ID_TOKEN | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingSource\"\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 title=\"{{ USE_ACCESS_MAPPING_ON_USER_CREATION_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\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 type=\"button\"\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 ></button>\n </label>\n <label\n title=\"{{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\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 type=\"button\"\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ UPDATE_ROLES_LISTED_IN_ACCESS_MAPPING_ON_EACH_LOG_IN_TOOLTIP | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n <label\n title=\"{{ CLEAR_AND_UPDATED_ROLES_ON_EACH_LOG_IN_OPTION | translate }}\"\n class=\"c8y-radio input-sm\"\n >\n <input\n type=\"radio\"\n name=\"dynamicAccessMappingConfiguration\"\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 type=\"button\"\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 ></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 *ngIf=\"templateModel.onNewUser.dynamicMapping.mappings.length === 0\"\n [icon]=\"'list'\"\n [title]=\"'No access mapping rules defined.' | translate\"\n [subtitle]=\"'Click below to add a new mapping.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <div\n *ngFor=\"\n let accessMapping of templateModel.onNewUser.dynamicMapping.mappings;\n index as idx\n \"\n >\n <c8y-sso-dynamic-access-mapping\n [accessMapping]=\"accessMapping\"\n (onRemoveAccessMapping)=\"onRemove(accessMapping)\"\n [apps]=\"apps\"\n [groups]=\"groups\"\n [accessMappingIndex]=\"idx\"\n ></c8y-sso-dynamic-access-mapping>\n </div>\n <div class=\"p-t-16\">\n <button\n id=\"add-access-mapping-button\"\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Add access mapping' | translate }}\"\n (click)=\"addAccessMapping()\"\n >\n <i\n c8yIcon=\"plus-circle\"\n class=\"m-r-4\"\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 *ngIf=\"templateModel.onNewUser.dynamicMapping.inventoryMappings.length === 0\"\n [icon]=\"'list'\"\n [title]=\"'No inventory roles mapping rules defined.' | translate\"\n [subtitle]=\"'Click below to add a new mapping.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-container\n *ngFor=\"\n let inventoryMapping of templateModel.onNewUser.dynamicMapping.inventoryMappings;\n index as idx\n \"\n >\n <c8y-sso-inventory-roles-mapping\n [inventoryRoles]=\"inventoryRoles\"\n [inventoryMapping]=\"inventoryMapping\"\n (onRemoveInventoryMapping)=\"onRemoveInventoryMapping(inventoryMapping)\"\n [inventoryMappingIndex]=\"idx\"\n ></c8y-sso-inventory-roles-mapping>\n </ng-container>\n <div class=\"p-t-16\">\n <button\n id=\"add-inventory-mapping-button\"\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Add inventory roles mapping' | translate }}\"\n (click)=\"addInventoryMapping()\"\n >\n <i\n c8yIcon=\"plus-circle\"\n class=\"m-r-4\"\n ></i>\n {{ 'Add inventory roles mapping' | translate }}\n </button>\n </div>\n </fieldset>\n </div>\n </div>\n</div>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { DateFormatService, gettext, memoize } from '@c8y/ngx-components';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport {\n algorithmTypeConfig,\n CertificateType,\n certificateTypeConfig,\n CustomCertificate\n} from './signature-configuration.model';\n\n@Component({\n selector: 'c8y-sso-signature-configuration',\n templateUrl: './signature-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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> </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, Input } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\nimport { validationMethodConfig } from './external-token-config.model';\nimport { RequestConfiguration } from './request-configuration.model';\n\n@Component({\n selector: 'c8y-external-token-config',\n templateUrl: './external-token-config.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 } 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';\n\n@Component({\n selector: 'c8y-custom-template',\n templateUrl: './custom-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { 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';\n\n@Component({\n selector: 'c8y-key-cloak-template',\n templateUrl: './key-cloak-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { 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 } from '@angular/forms';\n\n@Component({\n selector: 'c8y-sso-logout-configuration',\n templateUrl: './logout-configuration.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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';\n\n@Component({\n selector: 'c8y-aad-template',\n templateUrl: './aad-template.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\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 { 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 {\n gettext,\n AlertService,\n ModalService,\n Status,\n LoginService,\n AppStateService,\n TenantUiService\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 } from '@angular/forms';\n\n@Component({\n selector: 'c8y-sso-configuration',\n templateUrl: './sso-configuration.component.html'\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 loginService: LoginService,\n private appStateService: AppStateService,\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.loginService.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 { DatePipe } from '@angular/common';\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';\n\n@NgModule({\n declarations: [\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 imports: [\n CoreModule,\n TooltipModule,\n PopoverModule,\n CollapseModule.forRoot(),\n BsDatepickerModule,\n AssetSelectorModule\n ],\n exports: [SsoConfigurationComponent],\n providers: [\n SsoConfigurationGuard,\n DatePipe,\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, 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, 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';\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":["i3","i1","i2","i3.TenantLoginOptionMapper","i4","i5","i1.AuthConfigurationService","i6.SessionConfigurationComponent","i7.LoginSettingsComponent","i8.BasicAuthSettingsComponent","i9.TfaSettingsComponent","map","i1.SsoConfigurationMapper","i4.ChildPredicatesComponent","i6.ChildPredicatesComponent","i5.DynamicAccessMappingComponent","i6.InventoryRolesMappingComponent","i5.RequestConfigurationComponent","i6.UserIdConfigurationComponent","i1.CustomConfigurationMapper","i3.BasicConfigurationComponent","i4.RequestConfigurationComponent","i5.UserIdConfigurationComponent","i6.UserDataMappingComponent","i7.AccessMappingComponent","i8.SignatureConfigurationComponent","i9.ExternalTokenConfigComponent","i10","i1.KeyCloakConfigurationMapper","i8.ExternalTokenConfigComponent","i9","i1.AadConfigurationMapper","i4.UserIdConfigurationComponent","i5.UserDataMappingComponent","i6.AccessMappingComponent","i7.SignatureConfigurationComponent","i8.LogoutConfigurationComponent","i1.SsoConfigurationService","i6.CustomTemplateComponent","i7.KeyCloakTemplateComponent","i8.AadTemplateComponent","i2.SsoConfigurationService"],"mappings":"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"}
|