{"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\n        [placement]=\"'right'\"\n        [priority]=\"1000\"\n      >\n        <button\n          class=\"btn btn-link\"\n          title=\"{{ 'Generate CA certificate' | translate }}\"\n          type=\"button\"\n          data-cy=\"trusted-certificate-list--generate-ca-certificate\"\n          [disabled]=\"!(hasAdminRole$ | async) || certificateAuthorityExists\"\n          (click)=\"addCACertificate()\"\n        >\n          <i c8yIcon=\"contract\"></i>\n          {{ 'Generate CA certificate' | translate }}\n        </button>\n        <button\n          class=\"btn-help btn-help--sm\"\n          [attr.aria-label]=\"'Help' | translate\"\n          popover=\"{{\n            'The Certificate Authority (CA) certificate is used to sign device certificates for secure authentication. Only one CA certificate can be generated for the tenant.'\n              | translate\n          }}\"\n          placement=\"bottom\"\n          triggers=\"focus\"\n          type=\"button\"\n        ></button>\n      </c8y-action-bar-item>\n    }\n\n    <c8y-action-bar-item\n      [placement]=\"'right'\"\n      [priority]=\"900\"\n    >\n      <button\n        class=\"btn btn-link\"\n        title=\"{{ 'Add trusted certificate' | translate }}\"\n        type=\"button\"\n        data-cy=\"trusted-certificate-list--add-trusted-certificate\"\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\n      [placement]=\"'right'\"\n      [priority]=\"800\"\n    >\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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"}