From 0c77683d63b1bebd8a809d6555f470ec3d9c3e64 Mon Sep 17 00:00:00 2001 From: Stoiko Ivanov Date: Wed, 26 Sep 2018 14:58:34 +0200 Subject: [PATCH] Implement TLS Policy Setting * add js/MailProxyTLSDomains.js for setting per domain TLS policies * add js/MailProxyTLSPanel.js as a wrapper for the current MailProxyTLS.js and MailProxyTLSDomains.js Signed-off-by: Stoiko Ivanov --- js/MailProxyConfiguration.js | 2 +- js/MailProxyTLSDomains.js | 158 +++++++++++++++++++++++++++++++++++ js/MailProxyTLSPanel.js | 36 ++++++++ js/Makefile | 2 + 4 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 js/MailProxyTLSDomains.js create mode 100644 js/MailProxyTLSPanel.js diff --git a/js/MailProxyConfiguration.js b/js/MailProxyConfiguration.js index 1b2f2fd..6902cb4 100644 --- a/js/MailProxyConfiguration.js +++ b/js/MailProxyConfiguration.js @@ -42,7 +42,7 @@ Ext.define('PMG.MailProxyConfiguration', { { itemId: 'tls', title: gettext('TLS'), - xtype: 'pmgMailProxyTLS' + xtype: 'pmgMailProxyTLSPanel' }, { itemId: 'whitelist', diff --git a/js/MailProxyTLSDomains.js b/js/MailProxyTLSDomains.js new file mode 100644 index 0000000..419573c --- /dev/null +++ b/js/MailProxyTLSDomains.js @@ -0,0 +1,158 @@ +/*global Proxmox*/ +Ext.define('pmg-tls-policy', { + extend: 'Ext.data.Model', + fields: [ 'domain', 'policy' ], + idProperty: 'domain' +}); + +Ext.define('PMG.MailProxyTLSDomains', { + extend: 'Ext.grid.GridPanel', + alias: ['widget.pmgMailProxyTLSDomains'], + + initComponent : function() { + var me = this; + + var baseurl = '/config/tlspolicy'; + var rstore = Ext.create('Proxmox.data.UpdateStore', { + model: 'pmg-tls-policy', + storeid: 'pmg-mailproxy-tls-store-' + (++Ext.idSeed), + proxy: { + type: 'proxmox', + url: '/api2/json' + baseurl + }, + sorters: { + property: 'domain', + order: 'DESC' + } + }); + + var store = Ext.create('Proxmox.data.DiffStore', { rstore: rstore}); + + var reload = function() { + store.load(); + }; + + me.selModel = Ext.create('Ext.selection.RowModel', {}); + + var remove_btn = Ext.createWidget('proxmoxStdRemoveButton', { + selModel: me.selModel, + baseurl: baseurl, + callback: reload, + waitMsgTarget: me + }); + + var policy_selector_properties = { + xtype: 'proxmoxKVComboBox', + name: 'policy', + fieldLabel: 'Policy', + deleteEmpty: false, + comboItems: [ + [ 'none', 'none' ], + [ 'may', 'may' ], + [ 'encrypt', 'encrypt' ], + [ 'dane', 'dane' ], + [ 'dane-only', 'dane-only' ], + [ 'fingerprint', 'fingerprint' ], + [ 'verify', 'verify' ], + [ 'secure', 'secure' ] + ], + allowBlank: true, + value: 'encrypt' + }; + + var run_editor = function() { + var rec = me.selModel.getSelection()[0]; + if (!rec) { + return; + } + + var config = { + url: '/api2/extjs' + baseurl + '/' + rec.data.domain, + method: 'PUT', + subject: gettext('TLS Policy'), + items: [ + { + xtype: 'displayfield', + name: 'domain', + fieldLabel: gettext('Domain') + }, + policy_selector_properties + ] + }; + + var win = Ext.createWidget('proxmoxWindowEdit', config); + + win.load(); + win.on('destroy', reload); + win.show(); + }; + + var tbar = [ + { + xtype: 'proxmoxButton', + text: gettext('Edit'), + disabled: true, + selModel: me.selModel, + handler: run_editor + }, + { + text: gettext('Create'), + handler: function() { + var config = { + url: '/api2/extjs' + baseurl, + method: 'POST', + subject: gettext('TLS Policy'), + isCreate: true, + items: [ + { + xtype: 'proxmoxtextfield', + name: 'domain', + fieldLabel: gettext('Domain') + }, policy_selector_properties + ] + }; + + var win = Ext.createWidget('proxmoxWindowEdit', config); + + win.on('destroy', reload); + win.show(); + } + }, + remove_btn + ]; + + Proxmox.Utils.monStoreErrors(me, store, true); + + Ext.apply(me, { + store: store, + tbar: tbar, + run_editor: run_editor, + viewConfig: { + trackOver: false + }, + columns: [ + { + header: gettext('Domain'), + width: 200, + sortable: true, + dataIndex: 'domain' + }, + { + header: gettext('Policy'), + sortable: false, + dataIndex: 'policy', + flex: 1 + } + ], + listeners: { + itemdblclick: run_editor, + activate: reload + } + }); + + me.on('activate', rstore.startUpdate); + me.on('destroy', rstore.stopUpdate); + me.on('deactivate', rstore.stopUpdate); + me.callParent(); + } +}); diff --git a/js/MailProxyTLSPanel.js b/js/MailProxyTLSPanel.js new file mode 100644 index 0000000..a7abc78 --- /dev/null +++ b/js/MailProxyTLSPanel.js @@ -0,0 +1,36 @@ +Ext.define('PMG.MailProxyTLSPanel', { + extend: 'Ext.panel.Panel', + alias: 'widget.pmgMailProxyTLSPanel', + + layout: { + type: 'vbox', + align: 'stretch' + }, + + initComponent: function() { + var me = this; + + var tlsSettings = Ext.create('PMG.MailProxyTLS', { + xtype: 'pmgMailProxyTLS', + title: gettext('Settings'), + border: 0, + collapsible: true, + padding: '0 0 20 0' + }); + + var tlsDomains = Ext.create('PMG.MailProxyTLSDomains', { + xtype: 'pmgMailProxyTLSDomains', + title: gettext('TLS Domain Policy'), + border: 0, + collapsible: true, + padding: '0 0 20 0' + }); + + me.items = [ tlsSettings, tlsDomains ]; + + me.callParent(); + + tlsSettings.relayEvents(me, ['activate', 'deactivate', 'destroy']); + tlsDomains.relayEvents(me, ['activate', 'deactivate', 'destroy']); + } +}); diff --git a/js/Makefile b/js/Makefile index 069fc7b..882cbc4 100644 --- a/js/Makefile +++ b/js/Makefile @@ -41,6 +41,8 @@ JSSRC= \ MailProxyPorts.js \ MailProxyOptions.js \ MailProxyTLS.js \ + MailProxyTLSPanel.js \ + MailProxyTLSDomains.js \ Transport.js \ MyNetworks.js \ RelayDomains.js \ -- 2.39.2