UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

1 lines • 20.1 kB
{"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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"}