{"version":3,"file":"c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs","sources":["../../remote-access/ssh/remote-access-ssh-endpoint-modal/remote-access-ssh-endpoint-modal.component.ts","../../remote-access/ssh/remote-access-ssh-endpoint-modal/remote-access-ssh-endpoint-modal.component.html","../../remote-access/ssh/remote-access-ssh-endpoint-modal/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.ts"],"sourcesContent":["import { NgClass, NgForOf } from '@angular/common';\nimport { Component, OnInit } from '@angular/core';\nimport { FormBuilder, Validators } from '@angular/forms';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  CREDENTIALS_TYPES,\n  RemoteAccessConfiguration,\n  RemoteAccessService\n} from '@c8y/ngx-components/remote-access/data';\nimport { SshKeyInputComponent } from '@c8y/ngx-components/remote-access/shared';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { saveAs } from 'file-saver';\n\n@Component({\n  selector: 'c8y-remote-access-ssh-endpoint-modal',\n  templateUrl: './remote-access-ssh-endpoint-modal.component.html',\n  standalone: true,\n  imports: [CoreModule, NgForOf, NgClass, SshKeyInputComponent, PopoverModule]\n})\nexport class RemoteAccessSshEndpointModalComponent implements OnInit {\n  credentialTypes = [\n    CREDENTIALS_TYPES.USER_PASS,\n    CREDENTIALS_TYPES.CERTIFICATE,\n    CREDENTIALS_TYPES.KEY_PAIR\n  ];\n  title = gettext('Remote access endpoint');\n  form: ReturnType<typeof this.initForm>;\n  generating = false;\n\n  currentValue: Partial<RemoteAccessConfiguration>;\n\n  result = new Promise<ReturnType<typeof this.initForm>['value']>((resolve, reject) => {\n    this._resolve = resolve;\n    this._reject = reject;\n  });\n\n  private _resolve: (value: ReturnType<typeof this.initForm>['value']) => void;\n  private _reject: (reason?: any) => void;\n\n  constructor(\n    private formBuilder: FormBuilder,\n    private remoteAccess: RemoteAccessService\n  ) {\n    this.form = this.initForm();\n  }\n\n  ngOnInit() {\n    if (this.currentValue) {\n      const { credentials, ...rest } = this.currentValue;\n      const credentialsType = credentials?.type || CREDENTIALS_TYPES.USER_PASS.value;\n      const attributesToAdd = { credentialsType };\n      if (credentials) {\n        const { username, password, publicKey, privateKey, certificate, hostKey } = credentials;\n        Object.assign(attributesToAdd, {\n          username,\n          password,\n          publicKey,\n          privateKey,\n          certificate,\n          hostKey\n        });\n      }\n      const patchedValue = { ...rest, ...attributesToAdd };\n      this.form.patchValue(patchedValue);\n    }\n  }\n\n  initForm() {\n    return this.formBuilder.group({\n      id: ['', []],\n      name: ['', [Validators.required, Validators.minLength(1)]],\n      hostname: ['127.0.0.1', [Validators.required, Validators.minLength(1)]],\n      port: [22, [Validators.required, Validators.min(1), Validators.max(65535)]],\n      protocol: ['SSH', [Validators.required, Validators.minLength(1)]],\n      username: [undefined as string, [Validators.required, Validators.minLength(1)]],\n      password: [undefined as string, []],\n      credentialsType: [\n        CREDENTIALS_TYPES.USER_PASS.value as 'USER_PASS' | 'KEY_PAIR' | 'CERTIFICATE',\n        [Validators.required]\n      ],\n      hostKey: [undefined as string, []],\n      publicKey: [undefined as string, []],\n      privateKey: [undefined as string, []],\n      certificate: [undefined as string, []]\n    });\n  }\n\n  downloadPublicKey() {\n    const publicKey = this.form.value.publicKey;\n    const blob = new Blob([publicKey], { type: 'text/plain' });\n    saveAs(blob, `key.pub`);\n  }\n\n  async generateKeys() {\n    this.generating = true;\n    try {\n      const pair = await this.remoteAccess.generateKeyPair(this.form.value.hostname || undefined);\n      this.form.patchValue({\n        publicKey: pair.publicKey,\n        privateKey: pair.privateKey\n      });\n    } catch (e) {\n      console.log(e);\n    }\n    this.generating = false;\n  }\n\n  cancel() {\n    this._reject();\n  }\n\n  save() {\n    this._resolve(this.form.value);\n  }\n}\n","<ng-template #keyPairPopoverContent>\n  <small translate>Supported formats: OpenSSHv1, OpenSSHv2, PEM, SSH2.<br />Supported algorithms: RSA, DSA, ECDSA, ED25519.</small>\n</ng-template>\n\n<ng-template #certificatePopoverContent>\n  <small translate>Supported formats: OpenSSHv1, OpenSSHv2, PEM, SSH2.<br />Supported algorithms: RSA, DSA.</small>\n</ng-template>\n\n<c8y-modal\n  [title]=\"title\"\n  [headerClasses]=\"'dialog-header'\"\n  (onDismiss)=\"cancel()\"\n  (onClose)=\"save()\"\n  [disabled]=\"form.invalid\"\n  [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n  <ng-container c8y-modal-title>\n    <span [c8yIcon]=\"'laptop'\"></span>\n  </ng-container>\n  <div\n    class=\"p-24\"\n    [formGroup]=\"form\"\n  >\n    <c8y-form-group>\n      <label\n        for=\"name\"\n        translate\n      >\n        Name\n      </label>\n      <input\n        class=\"form-control\"\n        id=\"name\"\n        name=\"name\"\n        type=\"text\"\n        [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'My remote access endpoint' }\"\n        formControlName=\"name\"\n        [attr.data-cy]=\"'remoteAccessEndpointModal--name'\"\n      />\n      <c8y-messages></c8y-messages>\n    </c8y-form-group>\n\n    <c8y-form-group>\n      <label\n        for=\"protocol\"\n        translate\n      >\n        Protocol\n      </label>\n      <input\n        class=\"form-control\"\n        id=\"protocol\"\n        name=\"protocol\"\n        type=\"text\"\n        readonly\n        formControlName=\"protocol\"\n      />\n      <c8y-messages></c8y-messages>\n    </c8y-form-group>\n\n    <c8y-form-group>\n      <label\n        for=\"hostname\"\n        translate\n      >\n        Host\n      </label>\n      <input\n        class=\"form-control\"\n        id=\"hostname\"\n        placeholder=\"{{'e.g. {{ example }}' | translate : { example: '127.0.0.1' } }}\"\n        name=\"hostname\"\n        type=\"text\"\n        formControlName=\"hostname\"\n        [attr.data-cy]=\"'remoteAccessEndpointModal--hostname'\"\n      />\n      <c8y-messages></c8y-messages>\n    </c8y-form-group>\n\n    <c8y-form-group>\n      <label\n        for=\"port\"\n        translate\n      >\n        Port\n      </label>\n      <input\n        class=\"form-control\"\n        id=\"port\"\n        placeholder=\"{{'e.g. {{ example }}' | translate : { example: '22' } }}\"\n        name=\"port\"\n        type=\"number\"\n        formControlName=\"port\"\n        [attr.data-cy]=\"'remoteAccessEndpointModal--port'\"\n      />\n      <c8y-messages></c8y-messages>\n    </c8y-form-group>\n\n    <div>\n      <c8y-form-group>\n        <label\n          for=\"credentialsType\"\n          translate\n        >\n          Sign-in method\n        </label>\n        <div class=\"c8y-select-wrapper\">\n          <select\n            class=\"form-control\"\n            id=\"credentialsType\"\n            formControlName=\"credentialsType\"\n            [attr.data-cy]=\"'remoteAccessEndpointModal--credentials-type'\"\n          >\n            <option\n              *ngFor=\"let type of credentialTypes\"\n              [value]=\"type.value\"\n            >\n              {{ type.label | translate }}\n            </option>\n          </select>\n        </div>\n      </c8y-form-group>\n\n      <div\n        class=\"tight-grid\"\n      >\n        <div class=\"col-md-6\">\n          <c8y-form-group>\n            <label\n              for=\"username\"\n              translate\n            >\n              Username\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"username\"\n              placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'my_username' } }}\"\n              name=\"username\"\n              type=\"username\"\n              autocomplete=\"off\"\n              formControlName=\"username\"\n            />\n            <c8y-messages></c8y-messages>\n          </c8y-form-group>\n        </div>\n        <div class=\"col-md-6\" *ngIf=\"form.value.credentialsType === 'USER_PASS'\">\n          <c8y-form-group>\n            <label\n              for=\"password\"\n              translate\n            >\n              Password\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"password\"\n              placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'my_password' } }}\"\n              name=\"password\"\n              type=\"password\"\n              autocomplete=\"off\"\n              formControlName=\"password\"\n            />\n            <c8y-messages></c8y-messages>\n          </c8y-form-group>\n        </div>\n      </div>\n\n      <div *ngIf=\"form.value.credentialsType === 'KEY_PAIR'\">\n        <div class=\"form-group\" ng-if=\"!vm.keyPairAvailable() || vm.changingKeyPair\">\n          <button\n            class=\"btn btn-default p-l-16\"\n            type=\"button\"\n            [title]=\"'Generate public and private keys' | translate\"\n            [ngClass]=\"{ 'btn-pending': generating }\"\n            ng-disabled=\"vm.generating\"\n            (click)=\"generateKeys()\"\n            [attr.data-cy]=\"'remoteAccessEndpointModal--generate-keys'\"\n          >\n            <i [c8yIcon]=\"'key'\"></i>\n            {{ 'Generate public and private keys' | translate }}\n          </button>\n        </div>\n\n        <c8y-form-group>\n          <label for=\"privateKey\">\n            {{ 'Private key' | translate }}\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              [popover]=\"keyPairPopoverContent\"\n              [container]=\"'body'\"\n              [placement]=\"'right'\"\n              [triggers]=\"'focus'\"\n            ></button>\n          </label>\n          <div>\n            <c8y-ssh-key-input\n              id=\"privateKey\"\n              formControlName=\"privateKey\"\n              [keyType]=\"'private'\"\n            ></c8y-ssh-key-input>\n          </div>\n        </c8y-form-group>\n\n        <c8y-form-group>\n          <label for=\"publicKey\">\n            {{ 'Public key' | translate }}\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              [popover]=\"keyPairPopoverContent\"\n              [container]=\"'body'\"\n              [placement]=\"'right'\"\n              [triggers]=\"'focus'\"\n            ></button>\n            <button\n              class=\"m-l-16 btn-link interact\"\n              type=\"button\"\n              [title]=\"'Download key' | translate\"\n              (click)=\"downloadPublicKey()\"\n              *ngIf=\"form.value.publicKey\"\n            >\n              <i [c8yIcon]=\"'download'\"></i>\n              {{ 'Download key' | translate }}\n            </button>\n          </label>\n          <div>\n            <c8y-ssh-key-input\n              id=\"publicKey\"\n              formControlName=\"publicKey\"\n              [keyType]=\"'public'\"\n            ></c8y-ssh-key-input>\n          </div>\n        </c8y-form-group>\n\n      </div>\n\n      <div *ngIf=\"form.value.credentialsType === 'CERTIFICATE'\">\n        <c8y-form-group>\n          <label for=\"privateKey\">\n            {{ 'Private key' | translate }}\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              [popover]=\"certificatePopoverContent\"\n              [container]=\"'body'\"\n              [placement]=\"'right'\"\n              [triggers]=\"'focus'\"\n            ></button>\n          </label>\n          <div>\n            <c8y-ssh-key-input\n              id=\"privateKey\"\n              formControlName=\"privateKey\"\n              [keyType]=\"'private'\"\n            ></c8y-ssh-key-input>\n          </div>\n        </c8y-form-group>\n\n        <c8y-form-group>\n          <label for=\"certificate\">\n            {{ 'Certificate' | translate }}\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              [popover]=\"certificatePopoverContent\"\n              [container]=\"'body'\"\n              [placement]=\"'right'\"\n              [triggers]=\"'focus'\"\n            ></button>\n          </label>\n          <div>\n            <c8y-ssh-key-input\n              id=\"certificate\"\n              formControlName=\"certificate\"\n              [keyType]=\"'certificate'\"\n            ></c8y-ssh-key-input>\n          </div>\n        </c8y-form-group>\n\n      </div>\n\n      <div>\n        <c8y-form-group>\n          <label\n            for=\"hostKey\"\n          >\n            {{ 'Host key' | translate }}\n            <button\n              class=\"btn-help btn-help--sm\"\n              type=\"button\"\n              [attr.aria-label]=\"'Help' | translate\"\n              [popover]=\"keyPairPopoverContent\"\n              [container]=\"'body'\"\n              [placement]=\"'right'\"\n              [triggers]=\"'focus'\"\n            ></button>\n          </label>\n          <div>\n            <c8y-ssh-key-input\n              id=\"hostKey\"\n              formControlName=\"hostKey\"\n              [keyType]=\"'public'\"\n            ></c8y-ssh-key-input>\n          </div>\n          <c8y-messages></c8y-messages>\n        </c8y-form-group>\n      </div>\n    </div>\n  </div>\n</c8y-modal>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}