diff --git a/js/DKIMSettings.js b/js/DKIMSettings.js new file mode 100644 index 0000000..a92a033 --- /dev/null +++ b/js/DKIMSettings.js @@ -0,0 +1,201 @@ +Ext.define('PMG.DKIMEnableEdit', { + extend: 'Proxmox.window.Edit', + xtype: 'pmgDKIMEnableEdit', + + items: [ + { + xtype: 'displayfield', + userCls: 'pmx-hint', + value: gettext('You need to create a Selector before enabling DKIM Signing'), + hidden: true + }, + { + xtype: 'proxmoxcheckbox', + name: 'dkim_sign', + uncheckedValue: 0, + defaultValue: 0, + checked: false, + deleteDefaultValue: false, + fieldLabel: gettext('Sign Outgoing Mails'), + } + ], + listeners: { + 'show': function() { + var me = this; + var disablefn = function(errormsg){ + Ext.Msg.alert(gettext('Error'), errormsg); + me.down('displayfield').setVisible(true); + me.down('proxmoxcheckbox').setDisabled(true); + me.close(); + }; + + Proxmox.Utils.API2Request({ + url : '/config/dkim/selector', + method : 'GET', + failure : function(response, opts) { + disablefn(response.htmlStatus) + }, + success : function(response, opts) { + if (!Ext.isDefined(response.result.data.record)) { + disablefn('Could not read private key - please create a selector first!'); + } + } + }); + } + } +}); + +Ext.define('PMG.SelectorViewer', { + extend: 'Proxmox.window.Edit', + xtype: 'pmgDKIMSelectorView', + + url: '/config/dkim/selector', + title: gettext('Selector'), + + width: 800, + resizable: true, + + items: [ + { + xtype: 'displayfield', + fieldLabel: gettext('Selector'), + name: 'selector' + }, + { + xtype: 'displayfield', + fieldLabel: gettext('Key Size'), + name: 'keysize' + }, + { + xtype: 'textarea', + editable: false, + grow: true, + growMin: 150, + growMax: 400, + fieldLabel: gettext('DNS TXT Record'), + name: 'record', + value: 'Could not read private key!' + } + ], + + initComponent: function() { + var me = this; + + me.callParent(); + + // hide OK/Reset button, because we just want to show data + me.down('toolbar[dock=bottom]').setVisible(false); + } +}); + +Ext.define('PMG.DKIMSettings', { + extend: 'Proxmox.grid.ObjectGrid', + xtype: 'pmgDKIM', + + monStoreErrors: true, + + initComponent : function() { + var me = this; + + me.rows = {}; + var enable_sign_text = gettext('Enable DKIM Signing'); + me.rows.dkim_sign = { + required: true, + defaultValue: 0, + header: enable_sign_text, + renderer: Proxmox.Utils.format_boolean, + editor: { + xtype: 'pmgDKIMEnableEdit', + subject: enable_sign_text, + } + }; + + var selector_text = gettext('Selector'); + me.rows.dkim_selector = { + required: true, + header: selector_text, + editor: { + xtype: 'proxmoxWindowEdit', + subject: selector_text, + isCreate: true, + method: 'POST', + url: '/config/dkim/selector', + items: [ + { + xtype: 'displayfield', + name: 'warning', + userCls: 'pmx-hint', + value: gettext('Warning: You need to update the _domainkey DNS records of all signed domains!'), + }, + { + xtype: 'proxmoxtextfield', + fieldLabel: selector_text, + name: 'selector', + allowBlank: false, + required: true, + defaultValue: 'pmg' + }, + { + xtype: 'proxmoxKVComboBox', + fieldLabel: gettext('Key Size'), + name: 'keysize', + value: '2048', + allowBlank: false, + deleteEmpty: false, + required: true, + comboItems: [ + ['1024', '1024'], + ['2048', '2048'], + ['4096', '4096'], + ['8192', '8192'] + ] + } + ] + } + }; + + me.add_boolean_row('dkim_sign_all_mail', gettext('Sign all Outgoing Mail')); + + var baseurl = '/config/admin'; + + me.selModel = Ext.create('Ext.selection.RowModel', {}); + + Ext.apply(me, { + tbar: [{ + text: gettext('View DNS Record'), + xtype: 'proxmoxButton', + disabled: true, + handler: function() { + var win = Ext.create('PMG.SelectorViewer', {}); + win.load(); + win.show(); + }, + selModel: me.selModel, + }, + { + text: gettext('Edit'), + xtype: 'proxmoxButton', + disabled: true, + handler: function() { me.run_editor(); }, + selModel: me.selModel + }], + url: '/api2/json' + baseurl, + editorConfig: { + url: '/api2/extjs' + baseurl, + onlineHelp: 'pmgconfig_mailproxy_dkim' + }, + interval: 5000, + cwidth1: 200, + listeners: { + itemdblclick: me.run_editor + } + }); + + me.callParent(); + + me.on('activate', me.rstore.startUpdate); + me.on('destroy', me.rstore.stopUpdate); + me.on('deactivate', me.rstore.stopUpdate); + } +}); + diff --git a/js/MailProxyConfiguration.js b/js/MailProxyConfiguration.js index b5f1bcc..55283c7 100644 --- a/js/MailProxyConfiguration.js +++ b/js/MailProxyConfiguration.js @@ -44,6 +44,11 @@ Ext.define('PMG.MailProxyConfiguration', { title: gettext('TLS'), xtype: 'pmgMailProxyTLSPanel' }, + { + itemId: 'dkim', + title: gettext('DKIM'), + xtype: 'pmgMailProxyDKIMPanel' + }, { itemId: 'whitelist', title: gettext('Whitelist'), diff --git a/js/MailProxyDKIMPanel.js b/js/MailProxyDKIMPanel.js new file mode 100644 index 0000000..ebf9a4a --- /dev/null +++ b/js/MailProxyDKIMPanel.js @@ -0,0 +1,44 @@ +Ext.define('PMG.DKIMDomains', { + extend: 'PMG.RelayDomains', + alias: ['widget.pmgDKIMDomains'], + + baseurl: '/config/dkim/domains', + domain_desc: gettext('Sign Domain'), + onlineHelp: 'pmgconfig_mailproxy_dkim' +}); + +Ext.define('PMG.MailProxyDKIMPanel', { + extend: 'Ext.panel.Panel', + alias: 'widget.pmgMailProxyDKIMPanel', + + layout: { + type: 'vbox', + align: 'stretch' + }, + + bodyPadding: '0 0 10 0', + defaults: { + collapsible: true, + animCollapse: false, + margin: '10 10 0 10' + }, + + initComponent: function() { + var me = this; + + var DKIMSettings = Ext.create('PMG.DKIMSettings', { + title: gettext('Settings') + }); + + var DKIMDomains = Ext.create('PMG.DKIMDomains', { + title: gettext('Sign Domains') + }); + + me.items = [ DKIMSettings, DKIMDomains ]; + + me.callParent(); + + DKIMSettings.relayEvents(me, ['activate', 'deactivate', 'destroy']); + DKIMDomains.relayEvents(me, ['activate', 'deactivate', 'destroy']); + } +}); diff --git a/js/Makefile b/js/Makefile index d377c32..762b43d 100644 --- a/js/Makefile +++ b/js/Makefile @@ -46,6 +46,8 @@ JSSRC= \ Transport.js \ MyNetworks.js \ RelayDomains.js \ + DKIMSettings.js \ + MailProxyDKIMPanel.js \ MailProxyConfiguration.js \ SpamDetectorLanguages.js \ SpamDetectorOptions.js \ diff --git a/pmg-index.html.tt b/pmg-index.html.tt index 1f3bc65..20fa454 100644 --- a/pmg-index.html.tt +++ b/pmg-index.html.tt @@ -12,6 +12,7 @@ + [% IF langfile %] [% ELSE %]