Add PVE.storage.Retrieve window and PVE.form.hashAlgorithmSelector. Users are now able to download/retrieve any .iso/... file onto their storages and verify file integrity with checksums.
Signed-off-by: Lorenz Stechauner <[email protected]> --- www/manager6/Makefile | 1 + www/manager6/form/HashAlgorithmSelector.js | 21 +++ www/manager6/storage/ContentView.js | 161 +++++++++++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 www/manager6/form/HashAlgorithmSelector.js diff --git a/www/manager6/Makefile b/www/manager6/Makefile index afed3283..8e6557d8 100644 --- a/www/manager6/Makefile +++ b/www/manager6/Makefile @@ -38,6 +38,7 @@ JSSRC= \ form/GlobalSearchField.js \ form/GroupSelector.js \ form/GuestIDSelector.js \ + form/HashAlgorithmSelector.js \ form/HotplugFeatureSelector.js \ form/IPProtocolSelector.js \ form/IPRefSelector.js \ diff --git a/www/manager6/form/HashAlgorithmSelector.js b/www/manager6/form/HashAlgorithmSelector.js new file mode 100644 index 00000000..4a72cc08 --- /dev/null +++ b/www/manager6/form/HashAlgorithmSelector.js @@ -0,0 +1,21 @@ +Ext.define('PVE.form.hashAlgorithmSelector', { + extend: 'Proxmox.form.KVComboBox', + alias: ['widget.pveHashAlgorithmSelector'], + comboItems: [], + hasNoneOption: false, + initComponent: function() { + var me = this; + me.comboItems = [ + ['md5', 'MD5'], + ['sha1', 'SHA-1'], + ['sha224', 'SHA-224'], + ['sha256', 'SHA-256'], + ['sha384', 'SHA-384'], + ['sha512', 'SHA-512'], + ]; + if (me.hasNoneOption) { + me.comboItems.unshift(['none', 'None']); + } + this.callParent(); + }, +}); diff --git a/www/manager6/storage/ContentView.js b/www/manager6/storage/ContentView.js index dd6df4b1..7187ebbe 100644 --- a/www/manager6/storage/ContentView.js +++ b/www/manager6/storage/ContentView.js @@ -191,6 +191,153 @@ Ext.define('PVE.storage.Upload', { }, }); +Ext.define('PVE.storage.Retrieve', { + extend: 'Proxmox.window.Edit', + alias: 'widget.pveStorageRetrieve', + + resizable: false, + + modal: true, + + isCreate: true, + + showTaskViewer: true, + upidFieldName: 'upid', + + initComponent: function() { + var me = this; + + if (!me.nodename) { + throw "no node name specified"; + } + if (!me.storage) { + throw "no storage ID specified"; + } + + me.url = `/nodes/${me.nodename}/storage/${me.storage}/retrieve`; + me.method = 'POST'; + + let defaultContent = me.contents[0] || ''; + + let urlField = Ext.create('Ext.form.field.Text', { + name: 'url', + allowBlank: false, + fieldLabel: gettext('URL'), + }); + + let fileNameField = Ext.create('Ext.form.field.Text', { + name: 'filename', + allowBlank: false, + fieldLabel: gettext('File name'), + }); + + let fileSizeField = Ext.create('Ext.form.field.Text', { + name: 'size', + disabled: true, + fieldLabel: gettext('File size'), + emptyText: gettext('unknown'), + }); + + let checksumField = Ext.create('Ext.form.field.Text', { + name: 'checksum', + fieldLabel: gettext('Checksum'), + allowBlank: true, + disabled: true, + emptyText: gettext('none'), + }); + + let checksumAlgField = Ext.create('PVE.form.hashAlgorithmSelector', { + name: 'checksumalg', + fieldLabel: gettext('Hash algorithm'), + allowBlank: true, + hasNoneOption: true, + value: 'none', + }); + + let inputPanel = Ext.create('Proxmox.panel.InputPanel', { + method: 'POST', + waitMsgTarget: true, + border: false, + columnT: [ + urlField, + fileNameField, + ], + column1: [ + { + xtype: 'pveContentTypeSelector', + cts: me.contents, + fieldLabel: gettext('Content'), + name: 'content', + value: defaultContent, + allowBlank: false, + }, + ], + column2: [ + fileSizeField, + ], + advancedColumn1: [ + checksumField, + checksumAlgField, + ], + advancedColumn2: [ + { + xtype: 'checkbox', + name: 'insecure', + fieldLabel: gettext('Trust invalid certificates'), + labelWidth: 150, + }, + ], + }); + + urlField.on('change', function() { + urlField.setValidation("Waiting for response..."); + urlField.validate(); + fileSizeField.setValue(""); + Proxmox.Utils.API2Request({ + url: me.url, + method: 'POST', + params: { + metaonly: 1, + url: me.getValues()['url'], + content: me.getValues()['content'], + }, + failure: function(res, opt) { + urlField.setValidation(res.result.message); + urlField.validate(); + fileSizeField.setValue(""); + }, + success: function(res, opt) { + urlField.setValidation(); + urlField.validate(); + + let data = res.result.data; + fileNameField.setValue(data.filename); + fileSizeField.setValue(Proxmox.Utils.format_size(data.size)); + }, + }); + }); + + checksumAlgField.on('change', function() { + if (this.getValue() === 'none') { + checksumField.setDisabled(true); + checksumField.setValue(""); + checksumField.allowBlank = true; + } else { + checksumField.setDisabled(false); + checksumField.allowBlank = false; + } + }); + + Ext.apply(me, { + title: gettext('Retrieve from URL'), + items: inputPanel, + submitText: gettext('Download'), + }); + + me.callParent(); + }, +}); + Ext.define('PVE.storage.ContentView', { extend: 'Ext.grid.GridPanel', @@ -262,6 +409,19 @@ Ext.define('PVE.storage.ContentView', { }, }); + let retrieveButton = Ext.create('Proxmox.button.Button', { + text: gettext('Retrieve from URL'), + handler: function() { + let win = Ext.create('PVE.storage.Retrieve', { + nodename: nodename, + storage: storage, + contents: [content], + }); + win.show(); + win.on('destroy', reload); + }, + }); + let removeButton = Ext.create('Proxmox.button.StdRemoveButton', { selModel: sm, delay: 5, @@ -276,6 +436,7 @@ Ext.define('PVE.storage.ContentView', { } if (me.useUploadButton) { me.tbar.push(uploadButton); + me.tbar.push(retrieveButton); } if (!me.useCustomRemoveButton) { me.tbar.push(removeButton); -- 2.20.1 _______________________________________________ pve-devel mailing list [email protected] https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
