From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 091B06D176 for ; Thu, 4 Feb 2021 13:57:05 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id F40FB24179 for ; Thu, 4 Feb 2021 13:56:34 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id D3D372416B for ; Thu, 4 Feb 2021 13:56:33 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 9D1E0461EA for ; Thu, 4 Feb 2021 13:56:33 +0100 (CET) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Thu, 4 Feb 2021 13:56:29 +0100 Message-Id: <20210204125632.16787-1-d.csapak@proxmox.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.235 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pbs-devel] [PATCH proxmox-backup 1/4] ui: tape: add EncryptionPanel to add/remove encryption keys X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Feb 2021 12:57:05 -0000 Signed-off-by: Dominik Csapak --- www/Makefile | 2 + www/tape/EncryptionKeys.js | 96 +++++++++++++++++++++++++++++++ www/tape/TapeManagement.js | 5 ++ www/tape/window/EncryptionEdit.js | 52 +++++++++++++++++ 4 files changed, 155 insertions(+) create mode 100644 www/tape/EncryptionKeys.js create mode 100644 www/tape/window/EncryptionEdit.js diff --git a/www/Makefile b/www/Makefile index b24783ca..7ee79f8a 100644 --- a/www/Makefile +++ b/www/Makefile @@ -17,6 +17,7 @@ TAPE_UI_FILES= \ tape/form/TapeDevicePathSelector.js \ tape/window/ChangerEdit.js \ tape/window/DriveEdit.js \ + tape/window/EncryptionEdit.js \ tape/window/LabelMedia.js \ tape/window/PoolEdit.js \ tape/window/TapeBackup.js \ @@ -25,6 +26,7 @@ TAPE_UI_FILES= \ tape/ChangerConfig.js \ tape/ChangerStatus.js \ tape/DriveConfig.js \ + tape/EncryptionKeys.js \ tape/PoolConfig.js \ tape/TapeInventory.js \ tape/TapeManagement.js \ diff --git a/www/tape/EncryptionKeys.js b/www/tape/EncryptionKeys.js new file mode 100644 index 00000000..6f2644d2 --- /dev/null +++ b/www/tape/EncryptionKeys.js @@ -0,0 +1,96 @@ +Ext.define('pbs-tape-encryption-keys', { + extend: 'Ext.data.Model', + fields: [ + 'fingerprint', 'hint', 'kdf', 'modified', + { + name: 'created', + type: 'date', + dateFormat: 'timestamp', + }, + ], + idProperty: 'fingerprint', +}); + +Ext.define('PBS.TapeManagement.EncryptionPanel', { + extend: 'Ext.grid.Panel', + alias: 'widget.pbsEncryptionKeys', + + controller: { + xclass: 'Ext.app.ViewController', + + onAdd: function() { + let me = this; + Ext.create('PBS.TapeManagement.EncryptionEditWindow', { + listeners: { + destroy: function() { + me.reload(); + }, + }, + }).show(); + }, + + reload: function() { + this.getView().getStore().rstore.load(); + }, + + stopStore: function() { + this.getView().getStore().rstore.stopUpdate(); + }, + + startStore: function() { + this.getView().getStore().rstore.startUpdate(); + }, + }, + + listeners: { + beforedestroy: 'stopStore', + deactivate: 'stopStore', + activate: 'startStore', + }, + + store: { + type: 'diff', + rstore: { + type: 'update', + storeid: 'proxmox-tape-encryption-keys', + model: 'pbs-tape-encryption-keys', + proxy: { + type: 'proxmox', + url: "/api2/json/config/tape-encryption-keys", + }, + }, + sorters: 'hint', + }, + + tbar: [ + { + text: gettext('Add'), + xtype: 'proxmoxButton', + handler: 'onAdd', + selModel: false, + }, + '-', + { + xtype: 'proxmoxStdRemoveButton', + baseurl: '/api2/extjs/config/tape-encryption-keys', + callback: 'reload', + }, + ], + columns: [ + { + text: gettext('Hint'), + dataIndex: 'hint', + flex: 1, + }, + { + text: gettext('Fingerprint'), + dataIndex: 'fingerprint', + flex: 4, + }, + { + text: gettext('Created'), + dataIndex: 'created', + flex: 2, + }, + ], +}); diff --git a/www/tape/TapeManagement.js b/www/tape/TapeManagement.js index e558620a..127c431b 100644 --- a/www/tape/TapeManagement.js +++ b/www/tape/TapeManagement.js @@ -41,5 +41,10 @@ Ext.define('PBS.TapeManagement', { itemId: 'pools', xtype: 'pbsMediaPoolPanel', }, + { + title: gettext('Encryption Keys'), + itemId: 'encryption-keys', + xtype: 'pbsEncryptionKeys', + }, ], }); diff --git a/www/tape/window/EncryptionEdit.js b/www/tape/window/EncryptionEdit.js new file mode 100644 index 00000000..06d5ddc7 --- /dev/null +++ b/www/tape/window/EncryptionEdit.js @@ -0,0 +1,52 @@ +Ext.define('PBS.TapeManagement.EncryptionEditWindow', { + extend: 'Proxmox.window.Edit', + alias: 'widget.pbsEncryptionEditWindow', + mixins: ['Proxmox.Mixin.CBind'], + + isCreate: true, + isAdd: true, + subject: gettext('Encryption Key'), + cbindData: function(initialConfig) { + let me = this; + + let fingerprint = initialConfig.fingerprint; + let baseurl = '/api2/extjs/config/tape-encryption-keys'; + + me.isCreate = !fingerprint; + me.url = fingerprint ? `${baseurl}/${encodeURIComponent(fingerprint)}` : baseurl; + me.method = fingerprint ? 'PUT' : 'POST'; + + return { }; + }, + + items: [ + { + fieldLabel: gettext('Hint'), + name: 'hint', + xtype: 'pmxDisplayEditField', + renderer: Ext.htmlEncode, + allowBlank: false, + cbind: { + editable: '{isCreate}', + }, + }, + { + xtype: 'textfield', + inputType: 'password', + fieldLabel: gettext('Password'), + name: 'password', + minLength: 5, + allowBlank: false, + }, + { + xtype: 'textfield', + inputType: 'password', + submitValue: false, + fieldLabel: gettext('Confirm Password'), + minLength: 5, + vtype: 'password', + initialPassField: 'password', + allowBlank: false, + }, + ], +}); -- 2.20.1