{"version":3,"file":"c8y-ngx-components-device-enrolment.mjs","sources":["../../device-enrolment/modal/device-enrolment.service.ts","../../device-enrolment/doc-link.factory.ts","../../device-enrolment/index.ts","../../device-enrolment/c8y-ngx-components-device-enrolment.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { TrustedCertificateService, DeviceRegistrationService } from '@c8y/client';\nimport { FeatureCacheService } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class DeviceEnrolmentService {\n  private trustedCertificateService = inject(TrustedCertificateService);\n  private deviceRegistrationService = inject(DeviceRegistrationService);\n  private featureCacheService = inject(FeatureCacheService);\n\n  async getRegistrationCode(name: string) {\n    const available = await this.caAvailableAndConfigured();\n    if (available) {\n      const otp = this.generateSecurePassword();\n      const host = window.location.hostname;\n\n      const newDeviceReq: { id: string; [key: string]: string } = {\n        id: name,\n        name,\n        enrollmentToken: otp,\n        type: 'thin-edge.io'\n      };\n\n      try {\n        await this.deviceRegistrationService.create(newDeviceReq);\n      } catch (e: any) {\n        const statusCode = e?.status || e?.res?.status;\n        const errorType = e?.data?.error || e?.res?.error;\n\n        if (statusCode === 422) {\n          if (errorType === 'devicecontrol/Non Unique Result') {\n            return {\n              error: gettext('Device ID already exists. Please choose a different name.'),\n              statusCode,\n              errorType: 'duplicate'\n            };\n          }\n          if (errorType === 'undefined/validationError') {\n            return {\n              error: gettext(\n                'Device ID cannot contain whitespace, slashes or any of (+$:). Please choose a different name.'\n              ),\n              statusCode,\n              errorType: 'validation'\n            };\n          }\n        }\n        throw e;\n      }\n\n      return {\n        script: `curl -fsSL https://thin-edge.io/trial-linux.sh | sh -s -- --device-id \"${name}\" --c8y-url \"${host}\" --one-time-password '${otp}'`,\n        docker: `curl -fsSL https://thin-edge.io/trial-linux-docker.sh | sh -s -- --device-id \"${name}\" --c8y-url \"${host}\" --one-time-password '${otp}'`\n      };\n    }\n    return { error: gettext('Certificate authority not available.') };\n  }\n\n  generateSecurePassword(length = 32): string {\n    const charset =\n      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+;:,.<>?';\n    let password = '';\n    const crypto = window.crypto || (window as any).msCrypto;\n    const maxValidByte = 256 - (256 % charset.length);\n\n    while (password.length < length) {\n      const buffer = new Uint8Array(length - password.length);\n      crypto.getRandomValues(buffer);\n      for (let i = 0; i < buffer.length && password.length < length; i++) {\n        const byte = buffer[i];\n        if (byte < maxValidByte) {\n          password += charset[byte % charset.length];\n        }\n      }\n    }\n\n    return password;\n  }\n\n  async showQuicklink() {\n    return this.featureCacheService.getFeatureStatePromise('certificate-authority');\n  }\n\n  async caAvailableAndConfigured(): Promise<boolean> {\n    try {\n      const shouldShow =\n        await this.featureCacheService.getFeatureStatePromise('certificate-authority');\n\n      if (!shouldShow) {\n        return false;\n      }\n\n      const { data: certs } = await this.trustedCertificateService.list({\n        certificateAuthority: true\n      });\n\n      return (certs || []).some(c => c.status === 'ENABLED');\n    } catch (e) {\n      // ignore\n      return false;\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { DocLink, ExtensionFactory } from '@c8y/ngx-components';\nimport { DeviceEnrolmentService } from './modal/device-enrolment.service';\n\n@Injectable()\nexport class DeviceEnrolmentDocLinkFactory implements ExtensionFactory<DocLink> {\n  private docLinks: DocLink[] | null = null;\n  constructor(private deviceEnrolmentService: DeviceEnrolmentService) {}\n\n  async get(): Promise<DocLink[]> {\n    if (this.docLinks === null) {\n      const available = await this.deviceEnrolmentService.showQuicklink();\n\n      this.docLinks = available\n        ? [\n            {\n              icon: 'c8y-icon-duocolor c8y-icon c8y-icon-icon c8y-icon-device-connect',\n              label: 'Try thin-edge.io',\n              type: 'quicklink',\n              url: '?showConnectDevice=true'\n            }\n          ]\n        : [];\n    }\n\n    return this.docLinks;\n  }\n}\n","import { hookDocs, hookQueryParamModal } from '@c8y/ngx-components';\nimport { DeviceEnrolmentDocLinkFactory } from './doc-link.factory';\n\nexport const deviceEnrolmentProviders = [\n  hookQueryParamModal({\n    queryParam: 'showConnectDevice',\n    loadComponent: () =>\n      import('@c8y/ngx-components/device-enrolment/modal').then(\n        m => m.DeviceEnrolmentModalComponent\n      ),\n    modalConfig: {\n      class: 'modal-md',\n      ignoreBackdropClick: true,\n      keyboard: false\n    }\n  }),\n  hookDocs(DeviceEnrolmentDocLinkFactory)\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.DeviceEnrolmentService"],"mappings":"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"}