@c8y/ngx-components 1023.17.20 → 1023.22.5
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/index.d.ts +4 -2
- package/auth-configuration/index.d.ts.map +1 -1
- package/datapoint-explorer/view/index.d.ts.map +1 -1
- package/echart/index.d.ts +3 -0
- package/echart/index.d.ts.map +1 -1
- package/echart/models/index.d.ts +3 -0
- package/echart/models/index.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs +25 -17
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +4 -2
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +98 -59
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +2 -3
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +7 -9
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua-mappings.mjs +2 -2
- package/fesm2022/c8y-ngx-components-protocol-opcua-mappings.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +6 -8
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +6 -8
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tenants.mjs +2 -2
- package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +9 -4
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +4 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +5 -4
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs +5 -5
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs +2 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +31 -16
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/index.d.ts +2 -1
- package/index.d.ts.map +1 -1
- package/locales/de.po +49 -35
- package/locales/es.po +50 -30
- package/locales/fr.po +50 -33
- package/locales/ja_JP.po +43 -33
- package/locales/ko.po +47 -33
- package/locales/locales.pot +37 -25
- package/locales/nl.po +50 -29
- package/locales/pl.po +49 -30
- package/locales/pt_BR.po +50 -30
- package/locales/zh_CN.po +51 -33
- package/locales/zh_TW.po +51 -33
- package/operations/stepper-bulk-type-firmware/index.d.ts.map +1 -1
- package/operations/stepper-bulk-type-software/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/repository/firmware/index.d.ts.map +1 -1
- package/repository/software/index.d.ts.map +1 -1
- package/trusted-certificates/index.d.ts.map +1 -1
- package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/index.d.ts +1 -1
- package/widgets/implementations/info-gauge/index.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-trusted-certificates.mjs","sources":["../../trusted-certificates/trusted-certificates.guard.ts","../../trusted-certificates/factories/trusted-certificates-navigation.factory.ts","../../trusted-certificates/pattern-messages.data.ts","../../trusted-certificates/factories/tabs.factory.ts","../../trusted-certificates/crl/crl-check-settings.component.ts","../../trusted-certificates/crl/crl-check-settings.component.html","../../trusted-certificates/crl/crl-settings.component.ts","../../trusted-certificates/crl/crl-settings.component.html","../../trusted-certificates/crl/crl-settings.module.ts","../../trusted-certificates/list/trusted-certificate.model.ts","../../trusted-certificates/list/add-trusted-certificate.component.ts","../../trusted-certificates/list/add-trusted-certificate.component.html","../../trusted-certificates/list/trusted-certificate-list.component.ts","../../trusted-certificates/list/trusted-certificate-list.component.html","../../trusted-certificates/list/trusted-certificate-list.module.ts","../../trusted-certificates/trusted-certificates.module.ts","../../trusted-certificates/c8y-ngx-components-trusted-certificates.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable({ providedIn: 'root' })\nexport class TrustedCertificatesGuard {\n permissions = inject(Permissions);\n\n async canActivate() {\n const hasReadRole = await this.hasReadRole();\n const hasAdminRole = await this.hasAdminRole();\n return hasReadRole || hasAdminRole;\n }\n\n async hasReadRole() {\n return this.permissions.hasAnyRole([Permissions.ROLE_TENANT_MANAGEMENT_READ]);\n }\n\n async hasAdminRole() {\n return this.permissions.hasAnyRole([\n Permissions.ROLE_TENANT_ADMIN,\n Permissions.ROLE_TENANT_MANAGEMENT_ADMIN\n ]);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\nimport { TrustedCertificatesGuard } from './../trusted-certificates.guard';\n\n@Injectable()\nexport class TrustedCertificatesNavigationFactory implements NavigatorNodeFactory {\n guard = inject(TrustedCertificatesGuard);\n navs: NavigatorNode[] = [];\n\n async get() {\n const canActivate = await this.guard.canActivate();\n if (canActivate && this.navs.length === 0) {\n this.navs.push(\n new NavigatorNode({\n label: gettext('Trusted certificates'),\n icon: 'certificate',\n path: '/trusted-certificates/certificates',\n parent: gettext('Management'),\n priority: 100\n })\n );\n }\n return this.navs;\n }\n}\n","/* tslint:disable:max-line-length */\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const MESSAGES_TRUSTED_CERTIFICATES = {\n '^Cannot find certificate with fingerprint (.+?).$': {\n gettext: gettext('Could not find {{ fingerprint }} certificate.'),\n placeholders: {\n fingerprint: '$1'\n }\n },\n '^Certificate Authority is not found or not eligible for renewal for tenant (.+?)$': {\n gettext: gettext(\n 'Could not find Certificate Authority or it is not eligible for renewal for tenant {{ tenant }}.'\n ),\n placeholders: {\n tenant: '$1'\n }\n },\n '^Wrong proof of possession verification code used for tenant (.+?). Certificate (.+?), usage not granted.$':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: invalid proof of possession verification code provided, sign verification code with private key.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n },\n '^Proof of possession verification code used for tenant (.+?) expired. Certificate (.+?), usage not granted.':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: proof of possession verification code has expired, generate a new code and try again.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n }\n} as const;\n","import { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { Tab, TabFactory } from '@c8y/ngx-components';\nimport { TrustedCertificatesGuard } from './../trusted-certificates.guard';\n\n@Injectable()\nexport class TabsFactory implements TabFactory {\n router = inject(Router);\n guard = inject(TrustedCertificatesGuard);\n\n async get(): Promise<Tab[]> {\n const tabs: Tab[] = [];\n\n const canActivate = await this.guard.canActivate();\n if (canActivate && this.router.url.match(/trusted-certificates/g)) {\n tabs.push({\n icon: 'certificate',\n priority: 1000,\n label: gettext('Certificates'),\n path: 'trusted-certificates/certificates',\n orientation: 'horizontal'\n } as Tab);\n\n tabs.push({\n icon: 'settings',\n priority: 900,\n label: gettext('Settings'),\n path: 'trusted-certificates/settings',\n orientation: 'horizontal'\n } as Tab);\n }\n\n return tabs;\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { ITenantOption, TenantOptionsService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n OptionsService,\n ActionBarItemComponent,\n IconDirective,\n C8yTranslateDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n BsDropdownDirective,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective\n} from 'ngx-bootstrap/dropdown';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'c8y-crl-check-settings',\n templateUrl: './crl-check-settings.component.html',\n imports: [\n ActionBarItemComponent,\n BsDropdownDirective,\n BsDropdownToggleDirective,\n IconDirective,\n C8yTranslateDirective,\n BsDropdownMenuDirective,\n NgTemplateOutlet,\n FormsModule,\n C8yTranslatePipe\n ]\n})\nexport class CrlCheckSettingsComponent implements OnInit {\n crlCheck: { online: boolean; offline: boolean } = { online: false, offline: false };\n\n constructor(\n private optionsService: OptionsService,\n private tenantOptionsService: TenantOptionsService,\n private alertService: AlertService\n ) {}\n\n async ngOnInit() {\n this.crlCheck = {\n offline: (await this.optionsService.getTenantOption<boolean>(\n 'configuration',\n 'crl.offline.check.enabled',\n false\n )) as boolean,\n online: (await this.optionsService.getTenantOption<boolean>(\n 'configuration',\n 'crl.online.check.enabled',\n false\n )) as boolean\n };\n }\n\n async updateTenantOption(tenantOption: ITenantOption) {\n try {\n await this.tenantOptionsService.update(tenantOption);\n this.alertService.success(gettext('CRL check configuration saved.'));\n } catch (er) {\n this.alertService.addServerFailure(er);\n }\n }\n}\n","<c8y-action-bar-item [placement]=\"'right'\">\n <div\n class=\"dropdown\"\n dropdown\n [insideClick]=\"true\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown d-flex a-i-center\"\n title=\"{{ 'CRL check' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'check-document'\"\n ></i>\n <span\n class=\"text-truncate\"\n translate\n >\n CRL check\n </span>\n <i\n class=\"m-l-4 text-primary\"\n [c8yIcon]=\"'caret-down'\"\n ></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right hidden-xs\"\n data-cy=\"register-device--dropdown\"\n *dropdownMenu\n >\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <ul class=\"dropdown-menu dropdown-menu-right visible-xs\">\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <ng-template #dropdown>\n <li>\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n title=\"{{ 'Online`type of checking`' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"crlCheck.online\"\n (ngModelChange)=\"\n updateTenantOption({\n category: 'configuration',\n key: 'crl.online.check.enabled',\n value: $event\n })\n \"\n />\n <span class=\"m-r-4\"></span>\n {{ 'Online`type of checking`' | translate }}\n </label>\n </li>\n <li>\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n title=\"{{ 'Offline`type of checking`' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"crlCheck.offline\"\n (ngModelChange)=\"\n updateTenantOption({\n category: 'configuration',\n key: 'crl.offline.check.enabled',\n value: $event\n })\n \"\n />\n <span class=\"m-r-4\"></span>\n {{ 'Offline`type of checking`' | translate }}\n </label>\n </li>\n </ng-template>\n </div>\n</c8y-action-bar-item>\n","import { Component } from '@angular/core';\nimport { isEmpty, pull } from 'lodash-es';\nimport { CrlService, ICertificateRevocation } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n DroppedFile,\n ModalService,\n Status,\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n HelpComponent,\n FormGroupComponent,\n C8yTranslateDirective,\n RequiredInputPlaceholderDirective,\n DefaultValidationDirective,\n IconDirective,\n DropAreaComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { saveAs } from 'file-saver';\nimport { CrlCheckSettingsComponent } from './crl-check-settings.component';\nimport { FormsModule } from '@angular/forms';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { AsyncPipe, NgFor, NgIf } from '@angular/common';\nimport { BsDatepickerInputDirective, BsDatepickerDirective } from 'ngx-bootstrap/datepicker';\nimport { TrustedCertificatesGuard } from '../trusted-certificates.guard';\nimport { from, shareReplay } from 'rxjs';\n\n@Component({\n selector: 'c8y-crl-settings',\n templateUrl: './crl-settings.component.html',\n imports: [\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n CrlCheckSettingsComponent,\n HelpComponent,\n FormsModule,\n PopoverDirective,\n NgFor,\n FormGroupComponent,\n C8yTranslateDirective,\n RequiredInputPlaceholderDirective,\n DefaultValidationDirective,\n BsDatepickerInputDirective,\n BsDatepickerDirective,\n NgIf,\n IconDirective,\n DropAreaComponent,\n C8yTranslatePipe,\n AsyncPipe\n ]\n})\nexport class CrlSettingsComponent {\n crls: ICertificateRevocation[] = [this.getEmptyCertificateRevocation()];\n droppedFiles: DroppedFile[] = [];\n today: Date = new Date();\n hasReadRole$ = from(this.guard.hasReadRole()).pipe(shareReplay(1));\n hasAdminRole$ = from(this.guard.hasAdminRole()).pipe(shareReplay(1));\n\n MANUAL_ENTRY_POPOVER = gettext(\n 'In this section, you can override or add individual entries to the CRL. Providing the serial number is mandatory. In case the revocation date is not set, it will be configured to the current date.'\n );\n\n FILE_UPLOAD_POPOVER = gettext(\n 'In this section, you can upload a file with the list of certificates to be revoked. The file must be in CSV format, and it should include the serial number and revocation date. If the revocation date is empty, it will be set to the current date.'\n );\n\n constructor(\n private crlService: CrlService,\n private alertService: AlertService,\n private modalService: ModalService,\n private guard: TrustedCertificatesGuard\n ) {}\n\n async downloadCrl() {\n let arrayBuffer: ArrayBuffer;\n try {\n const res = await this.crlService.downloadCrlFile();\n arrayBuffer = await res.arrayBuffer();\n const fileBinary = new File([arrayBuffer], 'cumulocity.crl', {\n type: 'application/pkix-crl'\n });\n saveAs(fileBinary);\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n downloadCrlTemplate() {\n const blob = new Blob([`SERIALNO,DATE\\nSERIAL_NO1,${new Date().toISOString()}`], {\n type: 'text/csv;charset=utf-8;'\n });\n const fileName = 'crl-template';\n saveAs(blob, `${fileName}.csv`);\n }\n\n addCertificateRevocation() {\n this.crls.push(this.getEmptyCertificateRevocation());\n }\n\n removeCertificateRevocation(certificateRevocation) {\n pull(this.crls, certificateRevocation);\n if (this.crls.length === 0) {\n this.addCertificateRevocation();\n }\n }\n\n async save() {\n try {\n await this.confirm();\n await this.saveCrls();\n await this.uploadCrlFile();\n await this.clearSavedData();\n this.alertService.success(gettext('CRL saved.'));\n } catch (er) {\n this.alertService.addServerFailure(er);\n }\n }\n\n get isListEmpty() {\n return this.crls.length === 1 && isEmpty(this.crls[0].serialNumberInHex);\n }\n\n get isFileDropped() {\n return !!(this.droppedFiles && this.droppedFiles[0]);\n }\n\n private async confirm() {\n const isOverrideManualEntries = !this.isListEmpty && this.isFileDropped;\n const status = isOverrideManualEntries ? Status.DANGER : Status.WARNING;\n const body = isOverrideManualEntries\n ? gettext(\n 'You are about to update the CRL. The CRL file content will override manual entries. Do you want to proceed?'\n )\n : gettext('You are about to update the CRL. Do you want to proceed?');\n\n await this.modalService.confirm(gettext('Update the CRL'), body, status, {\n ok: gettext('Update')\n });\n }\n\n private clearSavedData() {\n this.droppedFiles = [];\n this.crls = [this.getEmptyCertificateRevocation()];\n }\n\n private async saveCrls() {\n if (!this.isListEmpty) {\n await this.crlService.uploadCrls(this.crls);\n }\n }\n\n private async uploadCrlFile() {\n if (this.isFileDropped) {\n await this.crlService.uploadCrlFile(this.droppedFiles[0].file);\n }\n }\n\n private getEmptyCertificateRevocation(): ICertificateRevocation {\n return {\n serialNumberInHex: ''\n };\n }\n}\n","<div *ngIf=\"(hasReadRole$ | async) || (hasAdminRole$ | async)\">\n <c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n label=\"{{ 'Management' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-crl-check-settings></c8y-crl-check-settings>\n\n <c8y-help\n [icon]=\"'settings'\"\n src=\"/docs/device-certificate-authentication/managing-trusted-certificate-settings/#managing-trusted-certificate-settings\"\n ></c8y-help>\n\n <form\n class=\"card card--fullpage\"\n #crlManualForm=\"ngForm\"\n novalidate\n >\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'Offline configuration of Certificate Revocation List (CRL)' | translate }}\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-block\">\n <div class=\"legend form-block\">\n {{ 'Manual' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ MANUAL_ENTRY_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <div\n class=\"row tight-grid\"\n data-cy=\"c8y-row-grid--new-row\"\n *ngFor=\"let certificateRevocation of crls; index as index; last as isLast\"\n >\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label\n [for]=\"'serialNumber' + index\"\n translate\n >\n Serial number\n </label>\n <input\n class=\"form-control\"\n required\n [name]=\"'serialNumber' + index\"\n [id]=\"'serialNumber' + index\"\n [(ngModel)]=\"certificateRevocation.serialNumberInHex\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '8ab34fe5476' }\"\n c8yDefaultValidation=\"colonedHexNumber\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-5\">\n <c8y-form-group class=\"datepicker\">\n <label [for]=\"'validTillPicker' + index\">\n {{ 'Valid till' | translate }}\n </label>\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Date to' | translate\"\n placeholder=\"{{ 'Date to' | translate }}\"\n [name]=\"'validTillPicker' + index\"\n [id]=\"'validTillPicker' + index\"\n [(ngModel)]=\"certificateRevocation.revocationDate\"\n [bsConfig]=\"{ customTodayClass: 'today' }\"\n bsDatepicker\n [maxDate]=\"today\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-2\">\n <c8y-form-group>\n <div class=\"p-t-24\">\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n *ngIf=\"crls.length > 1\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i\n class=\"text-danger\"\n c8yIcon=\"minus-circle\"\n ></i>\n </button>\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n *ngIf=\"isLast\"\n >\n <i\n class=\"text-primary\"\n c8yIcon=\"plus-circle\"\n ></i>\n </button>\n\n <button\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n *ngIf=\"crls.length > 1\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n {{ 'Remove' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n *ngIf=\"isLast\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add' | translate }}\n </button>\n </div>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"legend form-block center\">\n {{ 'or' | translate }}\n </div>\n <div class=\"legend form-block\">\n {{ 'File upload' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ FILE_UPLOAD_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Upload CRL file (.csv format)' | translate\"\n name=\"uploadCrlDropArea\"\n [(ngModel)]=\"droppedFiles\"\n [message]=\"'Upload CRL file (.csv format)' | translate\"\n [loadingMessage]=\"'Uploading…' | translate\"\n [accept]=\"'.csv'\"\n [maxAllowedFiles]=\"1\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n ></c8y-drop-area>\n <p class=\"help-block has-info text-muted m-t-4\">\n {{ 'CRL file content will override manual entries.' | translate }}\n </p>\n\n <button\n class=\"btn btn-sm btn-default m-t-16\"\n title=\"{{ 'Download template' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrlTemplate()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"template\"\n ></i>\n {{ 'Download template' | translate }}\n </button>\n </div>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Download CRL file' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrl()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"download\"\n ></i>\n {{ 'Download CRL file' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"save()\"\n [disabled]=\"\n !(hasAdminRole$ | async) ||\n !(crlManualForm.form.valid || isListEmpty) ||\n (isListEmpty && !isFileDropped)\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </form>\n</div>\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { BsDatepickerModule } from 'ngx-bootstrap/datepicker';\nimport { CrlSettingsComponent } from './crl-settings.component';\nimport { CrlCheckSettingsComponent } from './crl-check-settings.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\n\nconst trustedCertificatesSettingsRoutes: Route[] = [\n {\n path: 'trusted-certificates/settings',\n component: CrlSettingsComponent,\n pathMatch: 'full'\n }\n];\n\n@NgModule({\n exports: [],\n imports: [\n CoreModule,\n CommonModule,\n RouterModule.forChild(trustedCertificatesSettingsRoutes),\n BsDropdownModule.forRoot(),\n BsDatepickerModule,\n PopoverModule,\n CrlSettingsComponent,\n CrlCheckSettingsComponent\n ]\n})\nexport class CrlSettingsModule {}\n","import { ITrustedCertificate } from '@c8y/client';\n\nexport interface TrustedCertificate extends ITrustedCertificate {\n signedVerificationCode?: string;\n}\n\nexport const PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES = {\n EVENT: 'trustedCertificate',\n CERTIFICATES: {\n COMPONENTS: {\n TRUSTED_CERTIFICATE: 'trusted-certificate'\n },\n ACTIONS: {\n ADD: 'add',\n UPDATE: 'update',\n DELETE: 'delete',\n RENEW: 'renew'\n },\n RESULTS: {\n ADD_SUCCESS: 'certificateAdded',\n UPDATE_SUCCESS: 'certificateUpdated',\n DELETE_SUCCESS: 'certificateDeleted',\n RENEW_SUCCESS: 'certificateRenewed'\n }\n },\n VERIFICATION_CODE: {\n COMPONENTS: {\n REGENERATE_CODE: 'regenerate-unsigned-verification-code',\n VERIFY_CODE: 'verify-signed-verification-code',\n DOWNLOAD_CODE: 'download-unsigned-verification-code'\n },\n ACTIONS: {\n REGENERATE: 'regenerate',\n VERIFY: 'verify',\n DOWNLOAD: 'download'\n },\n RESULTS: {\n REGENERATE_SUCCESS: 'unsignedVerificationCodeRegenerated',\n VERIFY_SUCCESS: 'signedCodeVerified',\n VERIFY_FAILED: 'signedCodeVerificationFailed'\n }\n }\n} as const;\n","import { Component } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n DroppedFile,\n GainsightService,\n AlertService,\n IconDirective,\n C8yTranslateDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n DropAreaComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { ITrustedCertificate, TrustedCertificateService } from '@c8y/client';\nimport { PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES } from './trusted-certificate.model';\nimport { FormsModule } from '@angular/forms';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { ButtonCheckboxDirective } from 'ngx-bootstrap/buttons';\n\n@Component({\n selector: 'c8y-add-trusted-certificate',\n templateUrl: './add-trusted-certificate.component.html',\n imports: [\n IconDirective,\n C8yTranslateDirective,\n FormsModule,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n DropAreaComponent,\n PopoverDirective,\n ButtonCheckboxDirective,\n C8yTranslatePipe\n ]\n})\nexport class AddTrustedCertificateComponent {\n maxAllowedFiles = 1;\n AUTO_REGISTRATION_POPOVER = gettext(\n 'Devices using the MQTT protocol with credentials signed by this certificate will be able to communicate with the platform without prior registration. The option does not support devices using the LWM2M protocol.'\n );\n trustedCertificate: Partial<ITrustedCertificate> = {\n status: 'DISABLED'\n };\n fileIsUploaded = false;\n\n result: Promise<any> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n private _save;\n private _cancel;\n PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES;\n\n constructor(\n private modal: BsModalRef,\n private trustedCertificateService: TrustedCertificateService,\n private alertService: AlertService,\n private gainsightService: GainsightService\n ) {}\n\n uploadFile(dropped: DroppedFile[]) {\n this.fileIsUploaded = false;\n if (dropped) {\n const reader = new FileReader();\n reader.onload = () => {\n this.fileIsUploaded = true;\n this.trustedCertificate.certInPemFormat = reader.result as string;\n };\n reader.readAsText(dropped[0].file);\n }\n }\n\n async save() {\n try {\n await this.trustedCertificateService.create(this.trustedCertificate);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.RESULTS.ADD_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.ACTIONS.ADD\n });\n this.alertService.success(gettext('Certificate saved.'));\n this._save();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n close() {\n this._cancel();\n this.modal.hide();\n }\n}\n","<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"certificate\"></i>\n <div\n class=\"modal-title\"\n id=\"addCertificateModalTitle\"\n translate\n >\n Add trusted certificate\n </div>\n </div>\n <form\n #addTrustedCertificateForm=\"ngForm\"\n (ngSubmit)=\"addTrustedCertificateForm.form.valid && fileIsUploaded && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div\n class=\"modal-body\"\n id=\"addCertificateModalDescription\"\n >\n <c8y-form-group>\n <label\n for=\"certificateName\"\n translate\n >\n Certificate name\n </label>\n <input\n class=\"form-control\"\n id=\"certificateName\"\n placeholder=\"{{ 'e.g. My certificate' | translate }}\"\n name=\"certificateName\"\n type=\"text\"\n autocomplete=\"off\"\n required\n [(ngModel)]=\"trustedCertificate.name\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"certificate\"\n translate\n >\n Certificate\n </label>\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Paste the certificate in PEM format.' | translate\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n >\n <input\n id=\"autoRegistration\"\n name=\"autoRegistration\"\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n <button\n class=\"btn\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n >\n <span\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </span>\n <span\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </span>\n </button>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add certificate' | translate }}\"\n type=\"submit\"\n [disabled]=\"\n addTrustedCertificateForm.form.invalid ||\n addTrustedCertificateForm.form.pristine ||\n !fileIsUploaded\n \"\n >\n {{ 'Add certificate' | translate }}\n </button>\n </div>\n </form>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n ClipboardService,\n FeatureCacheService,\n ForOfFilterPipe,\n GainsightService,\n ModalService,\n Status,\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n ActionBarItemComponent,\n IconDirective,\n HelpComponent,\n EmptyStateComponent,\n ListGroupComponent,\n ForOfDirective,\n ListItemComponent,\n ListItemIconComponent,\n ListItemBodyComponent,\n C8yTranslateDirective,\n ListItemCollapseComponent,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n ProductExperienceDirective,\n C8yTranslatePipe,\n DatePipe\n} from '@c8y/ngx-components';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport {\n IResultList,\n ITrustedCertificate,\n SystemOptionsService,\n TrustedCertificateService\n} from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\nimport { tap, switchMap, shareReplay } from 'rxjs/operators';\nimport { pipe, BehaviorSubject, Observable, firstValueFrom, from } from 'rxjs';\nimport { saveAs } from 'file-saver';\nimport { assign } from 'lodash-es';\nimport {\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES,\n TrustedCertificate\n} from './trusted-certificate.model';\nimport { NgIf, NgClass, AsyncPipe, NgTemplateOutlet } from '@angular/common';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { ButtonCheckboxDirective } from 'ngx-bootstrap/buttons';\nimport { FormsModule } from '@angular/forms';\nimport { TrustedCertificatesGuard } from '../trusted-certificates.guard';\n\n@Component({\n selector: 'c8y-trusted-certificates',\n templateUrl: './trusted-certificate-list.component.html',\n imports: [\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n NgIf,\n ActionBarItemComponent,\n IconDirective,\n PopoverDirective,\n NgClass,\n HelpComponent,\n EmptyStateComponent,\n ListGroupComponent,\n ForOfDirective,\n ListItemComponent,\n ListItemIconComponent,\n TooltipDirective,\n ListItemBodyComponent,\n ButtonCheckboxDirective,\n FormsModule,\n C8yTranslateDirective,\n ListItemCollapseComponent,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n ProductExperienceDirective,\n C8yTranslatePipe,\n AsyncPipe,\n DatePipe,\n NgTemplateOutlet\n ]\n})\nexport class TrustedCertificateListComponent implements OnInit {\n PROOF_OF_POSSESSION_POPOVER = gettext(\n '\"Proof of possession\" is a security method used to prove that whoever sends a message is also in the possession of the particular cryptographic key.'\n );\n SIGNED_VERIFICATION_CODE_POPOVER = gettext(\n 'Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt> | openssl base64 -A'\n );\n\n AUTO_REGISTRATION_POPOVER = gettext(\n 'Devices using the MQTT protocol with credentials signed by this certificate will be able to communicate with the platform without prior registration. The option does not support devices using the LWM2M protocol.'\n );\n\n reloading: BehaviorSubject<boolean> = new BehaviorSubject(false);\n reload: BehaviorSubject<void> = new BehaviorSubject(null);\n trustedCertificates: Observable<IResultList<ITrustedCertificate>> = this.reload.pipe(\n tap(() => this.reloading.next(true)),\n switchMap(() => this.getTrustedCertificates()),\n tap(response => {\n this.certificateAuthorityExists = response.data.some(\n value => value.tenantCertificateAuthority\n );\n }),\n tap(() => this.reloading.next(false)),\n shareReplay(1)\n );\n sortByExpirationDateAsc: ForOfFilterPipe<ITrustedCertificate> = pipe(\n tap(results => {\n return results.sort((n1, n2) => {\n if (n1.tenantCertificateAuthority !== n2.tenantCertificateAuthority) {\n return n1.tenantCertificateAuthority ? -1 : 1;\n }\n return n1.notAfter.localeCompare(n2.notAfter);\n });\n })\n );\n hasReadRole$ = from(this.guard.hasReadRole()).pipe(shareReplay(1));\n hasAdminRole$ = from(this.guard.hasAdminRole()).pipe(shareReplay(1));\n\n certificateAuthorityExists = false;\n signedVerificationCode: string;\n PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES;\n certificateAuthorityFeatureEnabled = false;\n\n constructor(\n private bsModal: BsModalService,\n private alertService: AlertService,\n private trustedCertificateService: TrustedCertificateService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private clipboardService: ClipboardService,\n private gainsightService: GainsightService,\n private systemOptionsService: SystemOptionsService,\n private featureCacheService: FeatureCacheService,\n private guard: TrustedCertificatesGuard\n ) {}\n\n async ngOnInit() {\n await this.loadTrustedCertificates();\n this.showLimitationAlert();\n this.checkCertificateAuthorityFeature();\n }\n\n async loadTrustedCertificates() {\n this.reload.next();\n }\n\n getTrustedCertificates() {\n const filter: object = {\n pageSize: 1000,\n withTotalPages: true\n };\n return this.trustedCertificateService.list(filter);\n }\n\n async addTrustedCertificate() {\n const modal = this.bsModal.show(AddTrustedCertificateComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'addCertificateModalDescription',\n ariaLabelledBy: 'addCertificateModalTitle',\n ignoreBackdropClick: true,\n keyboard: false\n }).content as AddTrustedCertificateComponent;\n try {\n await modal.result;\n modal.close();\n this.reload.next();\n } catch (ex) {\n // do nothing\n }\n }\n\n async addCACertificate() {\n try {\n await this.trustedCertificateService.generateCertificateAuthority();\n this.alertService.createSuccess('Certificate authority');\n this.reload.next();\n } catch (error) {\n this.alertService.addServerFailure(error);\n }\n }\n\n async deleteTrustedCertificate(certificate) {\n const isCA = certificate.tenantCertificateAuthority;\n const title = isCA ? gettext('Delete CA certificate?') : gettext('Delete trusted certificate?');\n const confirmationText = isCA\n ? gettext(\n 'You are about to delete the Certificate Authority (CA) certificate for this tenant. Any device enrolled using this CA certificate for authentication will no longer be able to connect to the platform.'\n )\n : gettext('You are about to delete a trusted certificate \"{{ certificateName }}\".');\n const finalQuestion = gettext('Do you want to proceed?');\n const certificateName = certificate.name;\n const body = [\n this.translateService.instant(confirmationText, {\n certificateName\n }),\n this.translateService.instant(finalQuestion)\n ].join(' ');\n\n try {\n await this.modalService.confirm(title, body, Status.DANGER, { ok: gettext('Delete') });\n await this.trustedCertificateService.delete(certificate.fingerprint);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.RESULTS.DELETE_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.ACTIONS.DELETE\n });\n this.alertService.success(gettext('Certificate deleted.'));\n this.reload.next();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n async updateCertificate(\n trustedCertificate: ITrustedCertificate,\n updatingPart: Partial<ITrustedCertificate>\n ) {\n try {\n await this.trustedCertificateService.update({\n fingerprint: trustedCertificate.fingerprint,\n ...updatingPart\n });\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.RESULTS.UPDATE_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.ACTIONS.UPDATE\n });\n this.alertService.success(gettext('Certificate saved.'));\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n getExpirationHighlight(item: ITrustedCertificate) {\n const now = Date.now();\n const notAfter = new Date(item.notAfter).getTime();\n const oneAndHalfYear = 1.5 * 365 * 24 * 60 * 60 * 1000;\n const oneYear = 365 * 24 * 60 * 60 * 1000;\n const ninetyDays = 90 * 24 * 60 * 60 * 1000;\n\n const result = {\n expired: false,\n icon: 'calendar',\n textClass: '',\n tooltipText: '',\n renewable: false\n };\n\n if (notAfter < now) {\n result.expired = true;\n result.icon = 'warning';\n result.textClass = 'text-muted';\n result.tooltipText = gettext('Certificate expired');\n } else if (notAfter < now + ninetyDays) {\n result.icon = 'warning';\n result.textClass = 'text-danger';\n result.tooltipText = gettext('Certificate expires in less than 90 days');\n } else if (item.tenantCertificateAuthority && notAfter < now + oneYear) {\n result.icon = 'warning';\n result.textClass = 'text-warning';\n result.tooltipText = gettext('Certificate expires in less than 1 year');\n } else if (item.tenantCertificateAuthority && notAfter < now + oneAndHalfYear) {\n result.icon = 'info';\n result.textClass = 'text-info';\n result.tooltipText = gettext('Certificate expires in less than 1.5 year');\n }\n\n if (item.tenantCertificateAuthority && notAfter < now + oneAndHalfYear) {\n result.renewable = true;\n }\n\n return result;\n }\n\n regenerateUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n this.trustedCertificateService.regeneratePoPVerificationCode(trustedCertificate).then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.COMPONENTS.REGENERATE_CODE,\n result:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.RESULTS.REGENERATE_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.ACTIONS.REGENERATE\n });\n this.alertService.success(gettext('Verification code regenerated.'));\n },\n ex => this.alertService.addServerFailure(ex)\n );\n }\n\n verifySignedVerificationCode(trustedCertificate: TrustedCertificate) {\n this.trustedCertificateService\n .verifySignedVerificationCode(trustedCertificate, trustedCertificate.signedVerificationCode)\n .then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.COMPONENTS.VERIFY_CODE,\n result:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.RESULTS.VERIFY_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.ACTIONS.VERIFY\n });\n this.alertService.success(gettext('Signed verification code verified.'));\n },\n ex => {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.COMPONENTS.VERIFY_CODE,\n result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.RESULTS.VERIFY_FAILED,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.ACTIONS.VERIFY\n });\n this.alertService.addServerFailure(ex);\n }\n );\n }\n\n downloadUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n const blob = new Blob([trustedCertificate.proofOfPossessionUnsignedVerificationCode]);\n const fileName = trustedCertificate.name;\n saveAs(blob, `${fileName}.txt`);\n }\n\n copyUnsignedVerificationCodeToClipboard(trustedCertificate: ITrustedCertificate) {\n this.clipboardService.writeText(trustedCertificate.proofOfPossessionUnsignedVerificationCode);\n }\n\n onFileInput(event, trustedCertificate: TrustedCertificate) {\n const input = event.target;\n const reader = new FileReader();\n reader.onload = () => {\n trustedCertificate.signedVerificationCode = reader.result as string;\n };\n reader.readAsText(input.files[0]);\n }\n\n async renewCertificate() {\n try {\n await this.trustedCertificateService.renewCertificateAuthority();\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.RESULTS.RENEW_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.ACTIONS.RENEW\n });\n this.alertService.success(gettext('CA certificate renewed.'));\n this.reload.next();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n private async showLimitationAlert() {\n const { data } = await this.systemOptionsService.detail({\n category: 'ssl',\n key: 'shared-truststore.enabled'\n });\n const sharedTruststoreEnabled = data.value.toLowerCase();\n if (sharedTruststoreEnabled === 'true') {\n this.alertService.warning(\n gettext(\n 'Shared trusted certificates are enabled in this instance. Devices may not be able to connect if certificates from the same chain are distributed across different tenants: MQTT connections will not be possible and REST connections will require an explicit tenant ID.'\n )\n );\n }\n }\n\n private async checkCertificateAuthorityFeature() {\n this.certificateAuthorityFeatureEnabled = await firstValueFrom(\n this.featureCacheService.getFeatureState('certificate-authority')\n );\n }\n}\n","<div *ngIf=\"(hasReadRole$ | async) || (hasAdminRole$ | async)\">\n <c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n label=\"{{ 'Management' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"certificateAuthorityFeatureEnabled\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add CA certificate' | translate }}\"\n type=\"button\"\n [disabled]=\"!(hasAdminRole$ | async) || certificateAuthorityExists\"\n (click)=\"addCACertificate()\"\n >\n <i c8yIcon=\"contract\"></i>\n {{ 'Add CA certificate' | translate }}\n </button>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections. Only one certificate is allowed, which is why the button is disabled.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"certificateAuthorityExists\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"!certificateAuthorityExists\"\n ></button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadTrustedCertificates()\"\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\n src=\"/docs/device-certificate-authentication/managing-trusted-certificates/#managing-trusted-certificates\"\n ></c8y-help>\n\n <c8y-ui-empty-state\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n >\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n </c8y-ui-empty-state>\n\n <c8y-list-group class=\"m-b-24\">\n <div\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i\n class=\"invisible\"\n c8yIcon=\"certificate\"\n ></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Certificate' | translate }} \"\n >\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Status' | translate }}\"\n >\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}\"\n >\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}\"\n >\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Auto registration' | translate }}\"\n >\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Proof of possession' | translate }}\"\n >\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n data-cy=\"c8y-trusted-certificates-list--item-block\"\n >\n <c8y-li-icon>\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'Certificate' | translate }}\"\n tooltip=\"{{ 'Certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n >\n <i c8yIcon=\"certificate\"></i>\n </button>\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'CA certificate' | translate }}\"\n tooltip=\"{{ 'CA certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n >\n <i c8yIcon=\"contract\"></i>\n </button>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n type=\"button\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n [ngClass]=\"{\n disabled: !(hasAdminRole$ | async)\n }\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Algorithm\n </span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Expiration date\n </span>\n @let expirationHighlight = getExpirationHighlight(trustedCertificate);\n <span>\n <small\n [attr.title]=\"expirationHighlight?.tooltipText\"\n [ngClass]=\"expirationHighlight?.textClass\"\n >\n <ng-container *ngIf=\"expirationHighlight?.expired; else notExpiredYet\">\n <del>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </del>\n </ng-container>\n <ng-template #notExpiredYet>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </ng-template>\n <ng-template #expirationDateTpl>\n <i\n class=\"m-r-4\"\n c8yIcon=\"{{ expirationHighlight?.icon }}\"\n *ngIf=\"expirationHighlight?.icon\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </ng-template>\n </small>\n <button\n class=\"btn btn-link btn-icon\"\n title=\"{{ 'Renew certificate' | translate }}\"\n type=\"button\"\n *ngIf=\"expirationHighlight?.renewable\"\n (click)=\"renewCertificate()\"\n >\n <i c8yIcon=\"refresh\"></i>\n </button>\n </span>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{ 'N/A' | translate }}\"\n *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n >\n {{ 'N/A' | translate }}\n </span>\n <span *ngIf=\"!trustedCertificate.tenantCertificateAuthority\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificate--delete\"\n [delay]=\"500\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n type=\"text\"\n required\n data-cy=\"c8y-trusted-certificates--edit-certificate-name\"\n [(ngModel)]=\"trustedCertificate.name\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Update certificate name' | translate }}\"\n type=\"button\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"certInPemFormat\"\n translate\n >\n Certificate\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n [ngClass]=\"{\n disabled: !(hasAdminRole$ | async)\n }\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div\n class=\"legend form-block\"\n translate\n >\n Additional properties\n </div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div\n class=\"col-md-7\"\n *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n >\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"unsignedVerificationCode\"\n translate\n >\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"unsignedVerificationCode\"\n name=\"unsignedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n readonly\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Regenerate verification code' | translate }}\"\n type=\"button\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--copy-to-clipboard\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Download as file' | translate\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--download-as-file\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.EVENT\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.DOWNLOAD_CODE,\n action: PRODUCT_EXPERIENCE.VERIFICATION_CODE.ACTIONS.DOWNLOAD\n }\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"signedVerificationCode\"\n >\n {{ 'Signed verification code' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--signed-verification-code-popup\"\n [outsideClick]=\"true\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"signedVerificationCode\"\n name=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Verify signed verification code' | translate }}\"\n type=\"button\"\n (click)=\"verifySignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!trustedCertificate.signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n [attr.aria-label]=\"'Upload file' | translate\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"fileInput.click()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input\n class=\"hidden\"\n type=\"file\"\n #fileInput\n (change)=\"onFileInput($event, trustedCertificate)\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n</div>\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { TrustedCertificateListComponent } from './trusted-certificate-list.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nconst trustedCertificatesRoutes: Route[] = [\n {\n path: 'trusted-certificates/certificates',\n component: TrustedCertificateListComponent,\n pathMatch: 'full'\n }\n];\n\n@NgModule({\n exports: [],\n imports: [\n CoreModule,\n CommonModule,\n RouterModule.forChild(trustedCertificatesRoutes),\n BsDropdownModule.forRoot(),\n TooltipModule,\n ReactiveFormsModule,\n ButtonsModule,\n PopoverModule,\n TrustedCertificateListComponent,\n AddTrustedCertificateComponent\n ]\n})\nexport class TrustedCertificateListModule {}\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { hookNavigator, hookPatternMessages, hookTab } from '@c8y/ngx-components';\nimport { TrustedCertificatesNavigationFactory } from './factories/trusted-certificates-navigation.factory';\nimport { MESSAGES_TRUSTED_CERTIFICATES } from './pattern-messages.data';\nimport { TabsFactory } from './factories/tabs.factory';\nimport { CrlSettingsModule } from './crl/crl-settings.module';\nimport { TrustedCertificateListModule } from './list/trusted-certificate-list.module';\n\nconst trustedCertificatesRedirectRoutes: Route[] = [\n {\n path: 'trusted-certificates',\n pathMatch: 'full',\n redirectTo: 'trusted-certificates/certificates'\n }\n];\n\n@NgModule({\n exports: [],\n imports: [\n RouterModule.forChild(trustedCertificatesRedirectRoutes),\n CrlSettingsModule,\n TrustedCertificateListModule\n ],\n providers: [\n hookNavigator(TrustedCertificatesNavigationFactory),\n hookPatternMessages(MESSAGES_TRUSTED_CERTIFICATES),\n hookTab(TabsFactory)\n ]\n})\nexport class TrustedCertificatesModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3.TrustedCertificatesGuard","i3","shareReplay","i4","i5.TrustedCertificatesGuard","i6"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-trusted-certificates.mjs","sources":["../../trusted-certificates/trusted-certificates.guard.ts","../../trusted-certificates/factories/trusted-certificates-navigation.factory.ts","../../trusted-certificates/pattern-messages.data.ts","../../trusted-certificates/factories/tabs.factory.ts","../../trusted-certificates/crl/crl-check-settings.component.ts","../../trusted-certificates/crl/crl-check-settings.component.html","../../trusted-certificates/crl/crl-settings.component.ts","../../trusted-certificates/crl/crl-settings.component.html","../../trusted-certificates/crl/crl-settings.module.ts","../../trusted-certificates/list/trusted-certificate.model.ts","../../trusted-certificates/list/add-trusted-certificate.component.ts","../../trusted-certificates/list/add-trusted-certificate.component.html","../../trusted-certificates/list/trusted-certificate-list.component.ts","../../trusted-certificates/list/trusted-certificate-list.component.html","../../trusted-certificates/list/trusted-certificate-list.module.ts","../../trusted-certificates/trusted-certificates.module.ts","../../trusted-certificates/c8y-ngx-components-trusted-certificates.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable({ providedIn: 'root' })\nexport class TrustedCertificatesGuard {\n permissions = inject(Permissions);\n\n async canActivate() {\n const hasReadRole = await this.hasReadRole();\n const hasAdminRole = await this.hasAdminRole();\n return hasReadRole || hasAdminRole;\n }\n\n async hasReadRole() {\n return this.permissions.hasAnyRole([Permissions.ROLE_TENANT_MANAGEMENT_READ]);\n }\n\n async hasAdminRole() {\n return this.permissions.hasAnyRole([\n Permissions.ROLE_TENANT_ADMIN,\n Permissions.ROLE_TENANT_MANAGEMENT_ADMIN\n ]);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\nimport { TrustedCertificatesGuard } from './../trusted-certificates.guard';\n\n@Injectable()\nexport class TrustedCertificatesNavigationFactory implements NavigatorNodeFactory {\n guard = inject(TrustedCertificatesGuard);\n navs: NavigatorNode[] = [];\n\n async get() {\n const canActivate = await this.guard.canActivate();\n if (canActivate && this.navs.length === 0) {\n this.navs.push(\n new NavigatorNode({\n label: gettext('Trusted certificates'),\n icon: 'certificate',\n path: '/trusted-certificates/certificates',\n parent: gettext('Management'),\n priority: 100\n })\n );\n }\n return this.navs;\n }\n}\n","/* tslint:disable:max-line-length */\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const MESSAGES_TRUSTED_CERTIFICATES = {\n '^Cannot find certificate with fingerprint (.+?).$': {\n gettext: gettext('Could not find {{ fingerprint }} certificate.'),\n placeholders: {\n fingerprint: '$1'\n }\n },\n '^Certificate Authority is not found or not eligible for renewal for tenant (.+?)$': {\n gettext: gettext(\n 'Could not find Certificate Authority or it is not eligible for renewal for tenant {{ tenant }}.'\n ),\n placeholders: {\n tenant: '$1'\n }\n },\n '^Wrong proof of possession verification code used for tenant (.+?). Certificate (.+?), usage not granted.$':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: invalid proof of possession verification code provided, sign verification code with private key.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n },\n '^Proof of possession verification code used for tenant (.+?) expired. Certificate (.+?), usage not granted.':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: proof of possession verification code has expired, generate a new code and try again.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n }\n} as const;\n","import { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { Tab, TabFactory } from '@c8y/ngx-components';\nimport { TrustedCertificatesGuard } from './../trusted-certificates.guard';\n\n@Injectable()\nexport class TabsFactory implements TabFactory {\n router = inject(Router);\n guard = inject(TrustedCertificatesGuard);\n\n async get(): Promise<Tab[]> {\n const tabs: Tab[] = [];\n\n const canActivate = await this.guard.canActivate();\n if (canActivate && this.router.url.match(/trusted-certificates/g)) {\n tabs.push({\n icon: 'certificate',\n priority: 1000,\n label: gettext('Certificates'),\n path: 'trusted-certificates/certificates',\n orientation: 'horizontal'\n } as Tab);\n\n tabs.push({\n icon: 'settings',\n priority: 900,\n label: gettext('Settings'),\n path: 'trusted-certificates/settings',\n orientation: 'horizontal'\n } as Tab);\n }\n\n return tabs;\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { ITenantOption, TenantOptionsService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n OptionsService,\n ActionBarItemComponent,\n IconDirective,\n C8yTranslateDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n BsDropdownDirective,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective\n} from 'ngx-bootstrap/dropdown';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'c8y-crl-check-settings',\n templateUrl: './crl-check-settings.component.html',\n imports: [\n ActionBarItemComponent,\n BsDropdownDirective,\n BsDropdownToggleDirective,\n IconDirective,\n C8yTranslateDirective,\n BsDropdownMenuDirective,\n NgTemplateOutlet,\n FormsModule,\n C8yTranslatePipe\n ]\n})\nexport class CrlCheckSettingsComponent implements OnInit {\n crlCheck: { online: boolean; offline: boolean } = { online: false, offline: false };\n\n constructor(\n private optionsService: OptionsService,\n private tenantOptionsService: TenantOptionsService,\n private alertService: AlertService\n ) {}\n\n async ngOnInit() {\n this.crlCheck = {\n offline: (await this.optionsService.getTenantOption<boolean>(\n 'configuration',\n 'crl.offline.check.enabled',\n false\n )) as boolean,\n online: (await this.optionsService.getTenantOption<boolean>(\n 'configuration',\n 'crl.online.check.enabled',\n false\n )) as boolean\n };\n }\n\n async updateTenantOption(tenantOption: ITenantOption) {\n try {\n await this.tenantOptionsService.update(tenantOption);\n this.alertService.success(gettext('CRL check configuration saved.'));\n } catch (er) {\n this.alertService.addServerFailure(er);\n }\n }\n}\n","<c8y-action-bar-item [placement]=\"'right'\">\n <div\n class=\"dropdown\"\n dropdown\n [insideClick]=\"true\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown d-flex a-i-center\"\n title=\"{{ 'CRL check' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'check-document'\"\n ></i>\n <span\n class=\"text-truncate\"\n translate\n >\n CRL check\n </span>\n <i\n class=\"m-l-4 text-primary\"\n [c8yIcon]=\"'caret-down'\"\n ></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right hidden-xs\"\n data-cy=\"register-device--dropdown\"\n *dropdownMenu\n >\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <ul class=\"dropdown-menu dropdown-menu-right visible-xs\">\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <ng-template #dropdown>\n <li>\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n title=\"{{ 'Online`type of checking`' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"crlCheck.online\"\n (ngModelChange)=\"\n updateTenantOption({\n category: 'configuration',\n key: 'crl.online.check.enabled',\n value: $event\n })\n \"\n />\n <span class=\"m-r-4\"></span>\n {{ 'Online`type of checking`' | translate }}\n </label>\n </li>\n <li>\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n title=\"{{ 'Offline`type of checking`' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"crlCheck.offline\"\n (ngModelChange)=\"\n updateTenantOption({\n category: 'configuration',\n key: 'crl.offline.check.enabled',\n value: $event\n })\n \"\n />\n <span class=\"m-r-4\"></span>\n {{ 'Offline`type of checking`' | translate }}\n </label>\n </li>\n </ng-template>\n </div>\n</c8y-action-bar-item>\n","import { Component } from '@angular/core';\nimport { isEmpty, pull } from 'lodash-es';\nimport { CrlService, ICertificateRevocation } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n DroppedFile,\n ModalService,\n Status,\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n HelpComponent,\n FormGroupComponent,\n C8yTranslateDirective,\n RequiredInputPlaceholderDirective,\n DefaultValidationDirective,\n IconDirective,\n DropAreaComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { saveAs } from 'file-saver';\nimport { CrlCheckSettingsComponent } from './crl-check-settings.component';\nimport { FormsModule } from '@angular/forms';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { AsyncPipe, NgFor, NgIf } from '@angular/common';\nimport { BsDatepickerInputDirective, BsDatepickerDirective } from 'ngx-bootstrap/datepicker';\nimport { TrustedCertificatesGuard } from '../trusted-certificates.guard';\nimport { from, shareReplay } from 'rxjs';\n\n@Component({\n selector: 'c8y-crl-settings',\n templateUrl: './crl-settings.component.html',\n imports: [\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n CrlCheckSettingsComponent,\n HelpComponent,\n FormsModule,\n PopoverDirective,\n NgFor,\n FormGroupComponent,\n C8yTranslateDirective,\n RequiredInputPlaceholderDirective,\n DefaultValidationDirective,\n BsDatepickerInputDirective,\n BsDatepickerDirective,\n NgIf,\n IconDirective,\n DropAreaComponent,\n C8yTranslatePipe,\n AsyncPipe\n ]\n})\nexport class CrlSettingsComponent {\n crls: ICertificateRevocation[] = [this.getEmptyCertificateRevocation()];\n droppedFiles: DroppedFile[] = [];\n today: Date = new Date();\n hasReadRole$ = from(this.guard.hasReadRole()).pipe(shareReplay(1));\n hasAdminRole$ = from(this.guard.hasAdminRole()).pipe(shareReplay(1));\n\n MANUAL_ENTRY_POPOVER = gettext(\n 'In this section, you can override or add individual entries to the CRL. Providing the serial number is mandatory. In case the revocation date is not set, it will be configured to the current date.'\n );\n\n FILE_UPLOAD_POPOVER = gettext(\n 'In this section, you can upload a file with the list of certificates to be revoked. The file must be in CSV format, and it should include the serial number and revocation date. If the revocation date is empty, it will be set to the current date.'\n );\n\n constructor(\n private crlService: CrlService,\n private alertService: AlertService,\n private modalService: ModalService,\n private guard: TrustedCertificatesGuard\n ) {}\n\n async downloadCrl() {\n let arrayBuffer: ArrayBuffer;\n try {\n const res = await this.crlService.downloadCrlFile();\n arrayBuffer = await res.arrayBuffer();\n const fileBinary = new File([arrayBuffer], 'cumulocity.crl', {\n type: 'application/pkix-crl'\n });\n saveAs(fileBinary);\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n downloadCrlTemplate() {\n const blob = new Blob([`SERIALNO,DATE\\nSERIAL_NO1,${new Date().toISOString()}`], {\n type: 'text/csv;charset=utf-8;'\n });\n const fileName = 'crl-template';\n saveAs(blob, `${fileName}.csv`);\n }\n\n addCertificateRevocation() {\n this.crls.push(this.getEmptyCertificateRevocation());\n }\n\n removeCertificateRevocation(certificateRevocation) {\n pull(this.crls, certificateRevocation);\n if (this.crls.length === 0) {\n this.addCertificateRevocation();\n }\n }\n\n async save() {\n try {\n await this.confirm();\n await this.saveCrls();\n await this.uploadCrlFile();\n await this.clearSavedData();\n this.alertService.success(gettext('CRL saved.'));\n } catch (er) {\n this.alertService.addServerFailure(er);\n }\n }\n\n get isListEmpty() {\n return this.crls.length === 1 && isEmpty(this.crls[0].serialNumberInHex);\n }\n\n get isFileDropped() {\n return !!(this.droppedFiles && this.droppedFiles[0]);\n }\n\n private async confirm() {\n const isOverrideManualEntries = !this.isListEmpty && this.isFileDropped;\n const status = isOverrideManualEntries ? Status.DANGER : Status.WARNING;\n const body = isOverrideManualEntries\n ? gettext(\n 'You are about to update the CRL. The CRL file content will override manual entries. Do you want to proceed?'\n )\n : gettext('You are about to update the CRL. Do you want to proceed?');\n\n await this.modalService.confirm(gettext('Update the CRL'), body, status, {\n ok: gettext('Update')\n });\n }\n\n private clearSavedData() {\n this.droppedFiles = [];\n this.crls = [this.getEmptyCertificateRevocation()];\n }\n\n private async saveCrls() {\n if (!this.isListEmpty) {\n await this.crlService.uploadCrls(this.crls);\n }\n }\n\n private async uploadCrlFile() {\n if (this.isFileDropped) {\n await this.crlService.uploadCrlFile(this.droppedFiles[0].file);\n }\n }\n\n private getEmptyCertificateRevocation(): ICertificateRevocation {\n return {\n serialNumberInHex: ''\n };\n }\n}\n","<div *ngIf=\"(hasReadRole$ | async) || (hasAdminRole$ | async)\">\n <c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n label=\"{{ 'Management' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-crl-check-settings></c8y-crl-check-settings>\n\n <c8y-help\n [icon]=\"'settings'\"\n src=\"/docs/device-certificate-authentication/managing-trusted-certificate-settings/#managing-trusted-certificate-settings\"\n ></c8y-help>\n\n <form\n class=\"card card--fullpage\"\n #crlManualForm=\"ngForm\"\n novalidate\n >\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'Offline configuration of Certificate Revocation List (CRL)' | translate }}\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-block\">\n <div class=\"legend form-block\">\n {{ 'Manual' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ MANUAL_ENTRY_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <div\n class=\"row tight-grid\"\n data-cy=\"c8y-row-grid--new-row\"\n *ngFor=\"let certificateRevocation of crls; index as index; last as isLast\"\n >\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label\n [for]=\"'serialNumber' + index\"\n translate\n >\n Serial number\n </label>\n <input\n class=\"form-control\"\n required\n [name]=\"'serialNumber' + index\"\n [id]=\"'serialNumber' + index\"\n [(ngModel)]=\"certificateRevocation.serialNumberInHex\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '8ab34fe5476' }\"\n c8yDefaultValidation=\"colonedHexNumber\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-5\">\n <c8y-form-group class=\"datepicker\">\n <label [for]=\"'validTillPicker' + index\">\n {{ 'Valid till' | translate }}\n </label>\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Date to' | translate\"\n placeholder=\"{{ 'Date to' | translate }}\"\n [name]=\"'validTillPicker' + index\"\n [id]=\"'validTillPicker' + index\"\n [(ngModel)]=\"certificateRevocation.revocationDate\"\n [bsConfig]=\"{ customTodayClass: 'today' }\"\n bsDatepicker\n [maxDate]=\"today\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-2\">\n <c8y-form-group>\n <div class=\"p-t-24\">\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n *ngIf=\"crls.length > 1\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i\n class=\"text-danger\"\n c8yIcon=\"minus-circle\"\n ></i>\n </button>\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n *ngIf=\"isLast\"\n >\n <i\n class=\"text-primary\"\n c8yIcon=\"plus-circle\"\n ></i>\n </button>\n\n <button\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n *ngIf=\"crls.length > 1\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n {{ 'Remove' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n *ngIf=\"isLast\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add' | translate }}\n </button>\n </div>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"legend form-block center\">\n {{ 'or' | translate }}\n </div>\n <div class=\"legend form-block\">\n {{ 'File upload' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ FILE_UPLOAD_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Upload CRL file (.csv format)' | translate\"\n name=\"uploadCrlDropArea\"\n [(ngModel)]=\"droppedFiles\"\n [message]=\"'Upload CRL file (.csv format)' | translate\"\n [loadingMessage]=\"'Uploading…' | translate\"\n [accept]=\"'.csv'\"\n [maxAllowedFiles]=\"1\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n ></c8y-drop-area>\n <p class=\"help-block has-info text-muted m-t-4\">\n {{ 'CRL file content will override manual entries.' | translate }}\n </p>\n\n <button\n class=\"btn btn-sm btn-default m-t-16\"\n title=\"{{ 'Download template' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrlTemplate()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"template\"\n ></i>\n {{ 'Download template' | translate }}\n </button>\n </div>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Download CRL file' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrl()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"download\"\n ></i>\n {{ 'Download CRL file' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"save()\"\n [disabled]=\"\n !(hasAdminRole$ | async) ||\n !(crlManualForm.form.valid || isListEmpty) ||\n (isListEmpty && !isFileDropped)\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </form>\n</div>\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { BsDatepickerModule } from 'ngx-bootstrap/datepicker';\nimport { CrlSettingsComponent } from './crl-settings.component';\nimport { CrlCheckSettingsComponent } from './crl-check-settings.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\n\nconst trustedCertificatesSettingsRoutes: Route[] = [\n {\n path: 'trusted-certificates/settings',\n component: CrlSettingsComponent,\n pathMatch: 'full'\n }\n];\n\n@NgModule({\n exports: [],\n imports: [\n CoreModule,\n CommonModule,\n RouterModule.forChild(trustedCertificatesSettingsRoutes),\n BsDropdownModule.forRoot(),\n BsDatepickerModule,\n PopoverModule,\n CrlSettingsComponent,\n CrlCheckSettingsComponent\n ]\n})\nexport class CrlSettingsModule {}\n","import { ITrustedCertificate } from '@c8y/client';\n\nexport interface TrustedCertificate extends ITrustedCertificate {\n signedVerificationCode?: string;\n}\n\nexport const PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES = {\n EVENT: 'trustedCertificate',\n CERTIFICATES: {\n COMPONENTS: {\n TRUSTED_CERTIFICATE: 'trusted-certificate'\n },\n ACTIONS: {\n ADD: 'add',\n UPDATE: 'update',\n DELETE: 'delete',\n RENEW: 'renew'\n },\n RESULTS: {\n ADD_SUCCESS: 'certificateAdded',\n UPDATE_SUCCESS: 'certificateUpdated',\n DELETE_SUCCESS: 'certificateDeleted',\n RENEW_SUCCESS: 'certificateRenewed'\n }\n },\n VERIFICATION_CODE: {\n COMPONENTS: {\n REGENERATE_CODE: 'regenerate-unsigned-verification-code',\n VERIFY_CODE: 'verify-signed-verification-code',\n DOWNLOAD_CODE: 'download-unsigned-verification-code'\n },\n ACTIONS: {\n REGENERATE: 'regenerate',\n VERIFY: 'verify',\n DOWNLOAD: 'download'\n },\n RESULTS: {\n REGENERATE_SUCCESS: 'unsignedVerificationCodeRegenerated',\n VERIFY_SUCCESS: 'signedCodeVerified',\n VERIFY_FAILED: 'signedCodeVerificationFailed'\n }\n }\n} as const;\n","import { Component } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n DroppedFile,\n GainsightService,\n AlertService,\n IconDirective,\n C8yTranslateDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n DropAreaComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { ITrustedCertificate, TrustedCertificateService } from '@c8y/client';\nimport { PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES } from './trusted-certificate.model';\nimport { FormsModule } from '@angular/forms';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { ButtonCheckboxDirective } from 'ngx-bootstrap/buttons';\n\n@Component({\n selector: 'c8y-add-trusted-certificate',\n templateUrl: './add-trusted-certificate.component.html',\n imports: [\n IconDirective,\n C8yTranslateDirective,\n FormsModule,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n DropAreaComponent,\n PopoverDirective,\n ButtonCheckboxDirective,\n C8yTranslatePipe\n ]\n})\nexport class AddTrustedCertificateComponent {\n maxAllowedFiles = 1;\n AUTO_REGISTRATION_POPOVER = gettext(\n 'Devices using the MQTT protocol with credentials signed by this certificate will be able to communicate with the platform without prior registration. The option does not support devices using the LWM2M protocol.'\n );\n trustedCertificate: Partial<ITrustedCertificate> = {\n status: 'DISABLED'\n };\n fileIsUploaded = false;\n\n result: Promise<any> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n private _save;\n private _cancel;\n PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES;\n\n constructor(\n private modal: BsModalRef,\n private trustedCertificateService: TrustedCertificateService,\n private alertService: AlertService,\n private gainsightService: GainsightService\n ) {}\n\n uploadFile(dropped: DroppedFile[]) {\n this.fileIsUploaded = false;\n if (dropped) {\n const reader = new FileReader();\n reader.onload = () => {\n this.fileIsUploaded = true;\n this.trustedCertificate.certInPemFormat = reader.result as string;\n };\n reader.readAsText(dropped[0].file);\n }\n }\n\n async save() {\n try {\n await this.trustedCertificateService.create(this.trustedCertificate);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.RESULTS.ADD_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.ACTIONS.ADD\n });\n this.alertService.success(gettext('Certificate saved.'));\n this._save();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n close() {\n this._cancel();\n this.modal.hide();\n }\n}\n","<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"certificate\"></i>\n <div\n class=\"modal-title\"\n id=\"addCertificateModalTitle\"\n translate\n >\n Add trusted certificate\n </div>\n </div>\n <form\n #addTrustedCertificateForm=\"ngForm\"\n (ngSubmit)=\"addTrustedCertificateForm.form.valid && fileIsUploaded && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div\n class=\"modal-body\"\n id=\"addCertificateModalDescription\"\n >\n <c8y-form-group>\n <label\n for=\"certificateName\"\n translate\n >\n Certificate name\n </label>\n <input\n class=\"form-control\"\n id=\"certificateName\"\n placeholder=\"{{ 'e.g. My certificate' | translate }}\"\n name=\"certificateName\"\n type=\"text\"\n autocomplete=\"off\"\n required\n [(ngModel)]=\"trustedCertificate.name\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"certificate\"\n translate\n >\n Certificate\n </label>\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Paste the certificate in PEM format.' | translate\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n >\n <input\n id=\"autoRegistration\"\n name=\"autoRegistration\"\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n <button\n class=\"btn\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n >\n <span\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </span>\n <span\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </span>\n </button>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add certificate' | translate }}\"\n type=\"submit\"\n [disabled]=\"\n addTrustedCertificateForm.form.invalid ||\n addTrustedCertificateForm.form.pristine ||\n !fileIsUploaded\n \"\n >\n {{ 'Add certificate' | translate }}\n </button>\n </div>\n </form>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n ClipboardService,\n FeatureCacheService,\n ForOfFilterPipe,\n GainsightService,\n ModalService,\n Status,\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n ActionBarItemComponent,\n IconDirective,\n HelpComponent,\n EmptyStateComponent,\n ListGroupComponent,\n ForOfDirective,\n ListItemComponent,\n ListItemIconComponent,\n ListItemBodyComponent,\n C8yTranslateDirective,\n ListItemCollapseComponent,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n ProductExperienceDirective,\n C8yTranslatePipe,\n DatePipe\n} from '@c8y/ngx-components';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport {\n IResultList,\n ITrustedCertificate,\n SystemOptionsService,\n TrustedCertificateService\n} from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\nimport { tap, switchMap, shareReplay } from 'rxjs/operators';\nimport { pipe, BehaviorSubject, Observable, firstValueFrom, from } from 'rxjs';\nimport { saveAs } from 'file-saver';\nimport { assign } from 'lodash-es';\nimport {\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES,\n TrustedCertificate\n} from './trusted-certificate.model';\nimport { NgClass, AsyncPipe, NgTemplateOutlet } from '@angular/common';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { ButtonCheckboxDirective } from 'ngx-bootstrap/buttons';\nimport { FormsModule } from '@angular/forms';\nimport { TrustedCertificatesGuard } from '../trusted-certificates.guard';\n\n@Component({\n selector: 'c8y-trusted-certificates',\n templateUrl: './trusted-certificate-list.component.html',\n imports: [\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n ActionBarItemComponent,\n IconDirective,\n PopoverDirective,\n NgClass,\n HelpComponent,\n EmptyStateComponent,\n ListGroupComponent,\n ForOfDirective,\n ListItemComponent,\n ListItemIconComponent,\n TooltipDirective,\n ListItemBodyComponent,\n ButtonCheckboxDirective,\n FormsModule,\n C8yTranslateDirective,\n ListItemCollapseComponent,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n ProductExperienceDirective,\n C8yTranslatePipe,\n AsyncPipe,\n DatePipe,\n NgTemplateOutlet\n ]\n})\nexport class TrustedCertificateListComponent implements OnInit {\n PROOF_OF_POSSESSION_POPOVER = gettext(\n '\"Proof of possession\" is a security method used to prove that whoever sends a message is also in the possession of the particular cryptographic key.'\n );\n SIGNED_VERIFICATION_CODE_POPOVER = gettext(\n 'Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt> | openssl base64 -A'\n );\n\n AUTO_REGISTRATION_POPOVER = gettext(\n 'Devices using the MQTT protocol with credentials signed by this certificate will be able to communicate with the platform without prior registration. The option does not support devices using the LWM2M protocol.'\n );\n\n reloading: BehaviorSubject<boolean> = new BehaviorSubject(false);\n reload: BehaviorSubject<void> = new BehaviorSubject(null);\n trustedCertificates: Observable<IResultList<ITrustedCertificate>> = this.reload.pipe(\n tap(() => this.reloading.next(true)),\n switchMap(() => this.getTrustedCertificates()),\n tap(response => {\n this.certificateAuthorityExists = response.data.some(\n value => value.tenantCertificateAuthority\n );\n }),\n tap(() => this.reloading.next(false)),\n shareReplay(1)\n );\n sortByExpirationDateAsc: ForOfFilterPipe<ITrustedCertificate> = pipe(\n tap(results => {\n return results.sort((n1, n2) => {\n if (n1.tenantCertificateAuthority !== n2.tenantCertificateAuthority) {\n return n1.tenantCertificateAuthority ? -1 : 1;\n }\n return n1.notAfter.localeCompare(n2.notAfter);\n });\n })\n );\n hasReadRole$ = from(this.guard.hasReadRole()).pipe(shareReplay(1));\n hasAdminRole$ = from(this.guard.hasAdminRole()).pipe(shareReplay(1));\n\n certificateAuthorityExists = false;\n signedVerificationCode: string;\n PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES;\n certificateAuthorityFeatureEnabled = false;\n\n constructor(\n private bsModal: BsModalService,\n private alertService: AlertService,\n private trustedCertificateService: TrustedCertificateService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private clipboardService: ClipboardService,\n private gainsightService: GainsightService,\n private systemOptionsService: SystemOptionsService,\n private featureCacheService: FeatureCacheService,\n private guard: TrustedCertificatesGuard\n ) {}\n\n async ngOnInit() {\n await this.loadTrustedCertificates();\n this.showLimitationAlert();\n this.checkCertificateAuthorityFeature();\n }\n\n async loadTrustedCertificates() {\n this.reload.next();\n }\n\n getTrustedCertificates() {\n const filter: object = {\n pageSize: 1000,\n withTotalPages: true\n };\n return this.trustedCertificateService.list(filter);\n }\n\n async addTrustedCertificate() {\n const modal = this.bsModal.show(AddTrustedCertificateComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'addCertificateModalDescription',\n ariaLabelledBy: 'addCertificateModalTitle',\n ignoreBackdropClick: true,\n keyboard: false\n }).content as AddTrustedCertificateComponent;\n try {\n await modal.result;\n modal.close();\n this.reload.next();\n } catch (ex) {\n // do nothing\n }\n }\n\n async addCACertificate() {\n try {\n await this.trustedCertificateService.generateCertificateAuthority();\n this.alertService.createSuccess('Certificate authority');\n this.reload.next();\n } catch (error) {\n this.alertService.addServerFailure(error);\n }\n }\n\n async deleteTrustedCertificate(certificate) {\n const isCA = certificate.tenantCertificateAuthority;\n const title = isCA ? gettext('Delete CA certificate?') : gettext('Delete trusted certificate?');\n const confirmationText = isCA\n ? gettext(\n 'You are about to delete the Certificate Authority (CA) certificate for this tenant. Any device enrolled using this CA certificate for authentication will no longer be able to connect to the platform.'\n )\n : gettext('You are about to delete a trusted certificate \"{{ certificateName }}\".');\n const finalQuestion = gettext('Do you want to proceed?');\n const certificateName = certificate.name;\n const body = [\n this.translateService.instant(confirmationText, {\n certificateName\n }),\n this.translateService.instant(finalQuestion)\n ].join(' ');\n\n try {\n await this.modalService.confirm(title, body, Status.DANGER, { ok: gettext('Delete') });\n await this.trustedCertificateService.delete(certificate.fingerprint);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.RESULTS.DELETE_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.ACTIONS.DELETE\n });\n this.alertService.success(gettext('Certificate deleted.'));\n this.reload.next();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n async updateCertificate(\n trustedCertificate: ITrustedCertificate,\n updatingPart: Partial<ITrustedCertificate>\n ) {\n try {\n await this.trustedCertificateService.update({\n fingerprint: trustedCertificate.fingerprint,\n ...updatingPart\n });\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.RESULTS.UPDATE_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.ACTIONS.UPDATE\n });\n this.alertService.success(gettext('Certificate saved.'));\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n getExpirationHighlight(item: ITrustedCertificate) {\n const now = Date.now();\n const notAfter = new Date(item.notAfter).getTime();\n const twoYears = 2 * 365 * 24 * 60 * 60 * 1000;\n const oneAndHalfYear = 1.5 * 365 * 24 * 60 * 60 * 1000;\n const oneYear = 365 * 24 * 60 * 60 * 1000;\n const ninetyDays = 90 * 24 * 60 * 60 * 1000;\n\n const result = {\n expired: false,\n icon: 'calendar',\n textClass: '',\n tooltipText: '',\n renewable: false\n };\n\n if (notAfter < now) {\n result.expired = true;\n result.icon = 'warning';\n result.textClass = 'text-muted';\n result.tooltipText = gettext('Certificate expired');\n } else if (notAfter < now + ninetyDays) {\n result.icon = 'warning';\n result.textClass = 'text-danger';\n result.tooltipText = gettext('Certificate expires in less than 90 days');\n } else if (item.tenantCertificateAuthority && notAfter < now + oneYear) {\n result.icon = 'warning';\n result.textClass = 'text-warning';\n result.tooltipText = gettext('Certificate expires in less than 1 year');\n } else if (item.tenantCertificateAuthority && notAfter < now + oneAndHalfYear) {\n result.icon = 'info';\n result.textClass = 'text-info';\n result.tooltipText = gettext('Certificate expires in less than 1.5 year');\n } else if (item.tenantCertificateAuthority && notAfter < now + twoYears) {\n result.icon = 'info';\n result.textClass = 'text-info';\n result.tooltipText = gettext('Certificate expires in less than 2 years');\n }\n\n if (item.tenantCertificateAuthority && notAfter < now + twoYears) {\n result.renewable = true;\n }\n\n return result;\n }\n\n regenerateUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n this.trustedCertificateService.regeneratePoPVerificationCode(trustedCertificate).then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.COMPONENTS.REGENERATE_CODE,\n result:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.RESULTS.REGENERATE_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.ACTIONS.REGENERATE\n });\n this.alertService.success(gettext('Verification code regenerated.'));\n },\n ex => this.alertService.addServerFailure(ex)\n );\n }\n\n verifySignedVerificationCode(trustedCertificate: TrustedCertificate) {\n this.trustedCertificateService\n .verifySignedVerificationCode(trustedCertificate, trustedCertificate.signedVerificationCode)\n .then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.COMPONENTS.VERIFY_CODE,\n result:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.RESULTS.VERIFY_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.ACTIONS.VERIFY\n });\n this.alertService.success(gettext('Signed verification code verified.'));\n },\n ex => {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.COMPONENTS.VERIFY_CODE,\n result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.RESULTS.VERIFY_FAILED,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.ACTIONS.VERIFY\n });\n this.alertService.addServerFailure(ex);\n }\n );\n }\n\n downloadUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n const blob = new Blob([trustedCertificate.proofOfPossessionUnsignedVerificationCode]);\n const fileName = trustedCertificate.name;\n saveAs(blob, `${fileName}.txt`);\n }\n\n copyUnsignedVerificationCodeToClipboard(trustedCertificate: ITrustedCertificate) {\n this.clipboardService.writeText(trustedCertificate.proofOfPossessionUnsignedVerificationCode);\n }\n\n onFileInput(event, trustedCertificate: TrustedCertificate) {\n const input = event.target;\n const reader = new FileReader();\n reader.onload = () => {\n trustedCertificate.signedVerificationCode = reader.result as string;\n };\n reader.readAsText(input.files[0]);\n }\n\n async renewCertificate() {\n try {\n await this.trustedCertificateService.renewCertificateAuthority();\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n component:\n PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.RESULTS.RENEW_SUCCESS,\n action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.ACTIONS.RENEW\n });\n this.alertService.success(gettext('CA certificate renewed.'));\n this.reload.next();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n private async showLimitationAlert() {\n const { data } = await this.systemOptionsService.detail({\n category: 'ssl',\n key: 'shared-truststore.enabled'\n });\n const sharedTruststoreEnabled = data.value.toLowerCase();\n if (sharedTruststoreEnabled === 'true') {\n this.alertService.warning(\n gettext(\n 'Shared trusted certificates are enabled in this instance. Devices may not be able to connect if certificates from the same chain are distributed across different tenants: MQTT connections will not be possible and REST connections will require an explicit tenant ID.'\n )\n );\n }\n }\n\n private async checkCertificateAuthorityFeature() {\n this.certificateAuthorityFeatureEnabled = await firstValueFrom(\n this.featureCacheService.getFeatureState('certificate-authority')\n );\n }\n}\n","@if ((hasReadRole$ | async) || (hasAdminRole$ | async)) {\n <div>\n <c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n label=\"{{ 'Management' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n @if (certificateAuthorityFeatureEnabled) {\n <c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add CA certificate' | translate }}\"\n type=\"button\"\n [disabled]=\"!(hasAdminRole$ | async) || certificateAuthorityExists\"\n (click)=\"addCACertificate()\"\n >\n <i c8yIcon=\"contract\"></i>\n {{ 'Add CA certificate' | translate }}\n </button>\n @if (certificateAuthorityExists) {\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections. Only one certificate is allowed, which is why the button is disabled.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n }\n @if (!certificateAuthorityExists) {\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n }\n </c8y-action-bar-item>\n }\n\n <c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadTrustedCertificates()\"\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\n src=\"/docs/device-certificate-authentication/managing-trusted-certificates/#managing-trusted-certificates\"\n ></c8y-help>\n\n @if ((trustedCertificates | async)?.data.length === 0) {\n <c8y-ui-empty-state\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n >\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n </c8y-ui-empty-state>\n }\n\n <c8y-list-group class=\"m-b-24\">\n @if ((trustedCertificates | async)?.data.length > 0) {\n <div class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\">\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i\n class=\"invisible\"\n c8yIcon=\"certificate\"\n ></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Certificate' | translate }} \"\n >\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Status' | translate }}\"\n >\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}\"\n >\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}\"\n >\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Auto registration' | translate }}\"\n >\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Proof of possession' | translate }}\"\n >\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n }\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n data-cy=\"c8y-trusted-certificates-list--item-block\"\n >\n <c8y-li-icon>\n @if (!trustedCertificate.tenantCertificateAuthority) {\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'Certificate' | translate }}\"\n tooltip=\"{{ 'Certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n >\n <i c8yIcon=\"certificate\"></i>\n </button>\n }\n @if (trustedCertificate.tenantCertificateAuthority) {\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'CA certificate' | translate }}\"\n tooltip=\"{{ 'CA certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n >\n <i c8yIcon=\"contract\"></i>\n </button>\n }\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n type=\"button\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n [ngClass]=\"{\n disabled: !(hasAdminRole$ | async)\n }\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Algorithm\n </span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{\n trustedCertificate.notAfter | c8yDate\n }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Expiration date\n </span>\n @let expirationHighlight = getExpirationHighlight(trustedCertificate);\n <span>\n <small\n [attr.title]=\"expirationHighlight?.tooltipText\"\n [ngClass]=\"expirationHighlight?.textClass\"\n >\n @if (expirationHighlight?.expired) {\n <del>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </del>\n } @else {\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n }\n <ng-template #expirationDateTpl>\n @if (expirationHighlight?.icon) {\n <i\n class=\"m-r-4\"\n c8yIcon=\"{{ expirationHighlight?.icon }}\"\n ></i>\n }\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </ng-template>\n </small>\n @if (expirationHighlight?.renewable) {\n <button\n class=\"btn btn-link btn-icon\"\n title=\"{{ 'Renew certificate' | translate }}\"\n type=\"button\"\n (click)=\"renewCertificate()\"\n >\n <i c8yIcon=\"refresh\"></i>\n </button>\n }\n </span>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n @if (trustedCertificate.autoRegistrationEnabled) {\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n }\n @if (!trustedCertificate.autoRegistrationEnabled) {\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n }\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n @if (trustedCertificate.tenantCertificateAuthority) {\n <span title=\"{{ 'Proof of possession' | translate }}: {{ 'N/A' | translate }}\">\n {{ 'N/A' | translate }}\n </span>\n }\n @if (!trustedCertificate.tenantCertificateAuthority) {\n <span>\n @if (trustedCertificate.proofOfPossessionValid) {\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n }\n @if (!trustedCertificate.proofOfPossessionValid) {\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n }\n </span>\n }\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificate--delete\"\n [delay]=\"500\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n type=\"text\"\n required\n data-cy=\"c8y-trusted-certificates--edit-certificate-name\"\n [(ngModel)]=\"trustedCertificate.name\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Update certificate name' | translate }}\"\n type=\"button\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"certInPemFormat\"\n translate\n >\n Certificate\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n [ngClass]=\"{\n disabled: !(hasAdminRole$ | async)\n }\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div\n class=\"legend form-block\"\n translate\n >\n Additional properties\n </div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n @if (!trustedCertificate.tenantCertificateAuthority) {\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n @if (trustedCertificate.proofOfPossessionValid) {\n <div>\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n }\n @if (!trustedCertificate.proofOfPossessionValid) {\n <div>\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil\n | c8yDate) || '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"unsignedVerificationCode\"\n translate\n >\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"unsignedVerificationCode\"\n name=\"unsignedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n readonly\n [(ngModel)]=\"\n trustedCertificate.proofOfPossessionUnsignedVerificationCode\n \"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Regenerate verification code' | translate }}\"\n type=\"button\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--copy-to-clipboard\"\n [delay]=\"500\"\n [disabled]=\"\n !trustedCertificate.proofOfPossessionUnsignedVerificationCode\n \"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Download as file' | translate\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--download-as-file\"\n [delay]=\"500\"\n [disabled]=\"\n !trustedCertificate.proofOfPossessionUnsignedVerificationCode\n \"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.EVENT\"\n [actionData]=\"{\n component:\n PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.DOWNLOAD_CODE,\n action: PRODUCT_EXPERIENCE.VERIFICATION_CODE.ACTIONS.DOWNLOAD\n }\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"signedVerificationCode\"\n >\n {{ 'Signed verification code' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--signed-verification-code-popup\"\n [outsideClick]=\"true\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"signedVerificationCode\"\n name=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Verify signed verification code' | translate }}\"\n type=\"button\"\n (click)=\"verifySignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!trustedCertificate.signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n [attr.aria-label]=\"'Upload file' | translate\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"fileInput.click()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input\n class=\"hidden\"\n type=\"file\"\n #fileInput\n (change)=\"onFileInput($event, trustedCertificate)\"\n />\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </div>\n}\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { TrustedCertificateListComponent } from './trusted-certificate-list.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nconst trustedCertificatesRoutes: Route[] = [\n {\n path: 'trusted-certificates/certificates',\n component: TrustedCertificateListComponent,\n pathMatch: 'full'\n }\n];\n\n@NgModule({\n exports: [],\n imports: [\n CoreModule,\n CommonModule,\n RouterModule.forChild(trustedCertificatesRoutes),\n BsDropdownModule.forRoot(),\n TooltipModule,\n ReactiveFormsModule,\n ButtonsModule,\n PopoverModule,\n TrustedCertificateListComponent,\n AddTrustedCertificateComponent\n ]\n})\nexport class TrustedCertificateListModule {}\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { hookNavigator, hookPatternMessages, hookTab } from '@c8y/ngx-components';\nimport { TrustedCertificatesNavigationFactory } from './factories/trusted-certificates-navigation.factory';\nimport { MESSAGES_TRUSTED_CERTIFICATES } from './pattern-messages.data';\nimport { TabsFactory } from './factories/tabs.factory';\nimport { CrlSettingsModule } from './crl/crl-settings.module';\nimport { TrustedCertificateListModule } from './list/trusted-certificate-list.module';\n\nconst trustedCertificatesRedirectRoutes: Route[] = [\n {\n path: 'trusted-certificates',\n pathMatch: 'full',\n redirectTo: 'trusted-certificates/certificates'\n }\n];\n\n@NgModule({\n exports: [],\n imports: [\n RouterModule.forChild(trustedCertificatesRedirectRoutes),\n CrlSettingsModule,\n TrustedCertificateListModule\n ],\n providers: [\n hookNavigator(TrustedCertificatesNavigationFactory),\n hookPatternMessages(MESSAGES_TRUSTED_CERTIFICATES),\n hookTab(TabsFactory)\n ]\n})\nexport class TrustedCertificatesModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3.TrustedCertificatesGuard","i3","shareReplay","i4","i5.TrustedCertificatesGuard","i6"],"mappings":"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"}
|