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 9294DA054F for ; Wed, 8 Nov 2023 16:40:49 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 5E43DA441 for ; Wed, 8 Nov 2023 16:40:18 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (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 for ; Wed, 8 Nov 2023 16:40:10 +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 490EC47486 for ; Wed, 8 Nov 2023 16:40:10 +0100 (CET) From: Lukas Wagner To: pve-devel@lists.proxmox.com Date: Wed, 8 Nov 2023 16:40:03 +0100 Message-Id: <20231108154005.895814-10-l.wagner@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231108154005.895814-1-l.wagner@proxmox.com> References: <20231108154005.895814-1-l.wagner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.014 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record T_SCC_BODY_TEXT_LINE -0.01 - Subject: [pve-devel] [PATCH v4 proxmox-widget-toolkit 09/11] panel: notification: add gui for SMTP endpoints X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Nov 2023 15:40:49 -0000 This new endpoint configuration panel is embedded in the existing EndpointEditBase dialog window. This commit also factors out some of the non-trivial common form elements that are shared between the new panel and the already existing SendmailEditPanel into a separate panel EmailRecipientPanel. Signed-off-by: Lukas Wagner --- src/Makefile | 2 + src/Schema.js | 5 + src/panel/EmailRecipientPanel.js | 88 +++++++++++++++ src/panel/SendmailEditPanel.js | 58 +--------- src/panel/SmtpEditPanel.js | 183 +++++++++++++++++++++++++++++++ 5 files changed, 281 insertions(+), 55 deletions(-) create mode 100644 src/panel/EmailRecipientPanel.js create mode 100644 src/panel/SmtpEditPanel.js diff --git a/src/Makefile b/src/Makefile index c6d31c3..01145b1 100644 --- a/src/Makefile +++ b/src/Makefile @@ -71,7 +71,9 @@ JSSRC= \ panel/ACMEAccount.js \ panel/ACMEPlugin.js \ panel/ACMEDomains.js \ + panel/EmailRecipientPanel.js \ panel/SendmailEditPanel.js \ + panel/SmtpEditPanel.js \ panel/StatusView.js \ panel/TfaView.js \ panel/NotesView.js \ diff --git a/src/Schema.js b/src/Schema.js index 37ecd88..28e1037 100644 --- a/src/Schema.js +++ b/src/Schema.js @@ -43,6 +43,11 @@ Ext.define('Proxmox.Schema', { // a singleton ipanel: 'pmxSendmailEditPanel', iconCls: 'fa-envelope-o', }, + smtp: { + name: gettext('SMTP'), + ipanel: 'pmxSmtpEditPanel', + iconCls: 'fa-envelope-o', + }, gotify: { name: gettext('Gotify'), ipanel: 'pmxGotifyEditPanel', diff --git a/src/panel/EmailRecipientPanel.js b/src/panel/EmailRecipientPanel.js new file mode 100644 index 0000000..b2bc03c --- /dev/null +++ b/src/panel/EmailRecipientPanel.js @@ -0,0 +1,88 @@ +Ext.define('Proxmox.panel.EmailRecipientPanel', { + extend: 'Ext.panel.Panel', + xtype: 'pmxEmailRecipientPanel', + mixins: ['Proxmox.Mixin.CBind'], + border: false, + + mailValidator: function() { + let mailto_user = this.down(`[name=mailto-user]`); + let mailto = this.down(`[name=mailto]`); + + if (!mailto_user.getValue()?.length && !mailto.getValue()) { + return gettext('Either mailto or mailto-user must be set'); + } + + return true; + }, + + items: [ + { + layout: 'anchor', + border: false, + items: [ + { + xtype: 'pmxUserSelector', + name: 'mailto-user', + multiSelect: true, + allowBlank: true, + editable: false, + skipEmptyText: true, + fieldLabel: gettext('Recipient(s)'), + cbind: { + deleteEmpty: '{!isCreate}', + }, + validator: function() { + return this.up('pmxEmailRecipientPanel').mailValidator(); + }, + autoEl: { + tag: 'div', + 'data-qtip': gettext('The notification will be sent to the user\'s configured mail address'), + }, + listConfig: { + width: 600, + columns: [ + { + header: gettext('User'), + sortable: true, + dataIndex: 'userid', + renderer: Ext.String.htmlEncode, + flex: 1, + }, + { + header: gettext('E-Mail'), + sortable: true, + dataIndex: 'email', + renderer: Ext.String.htmlEncode, + flex: 1, + }, + { + header: gettext('Comment'), + sortable: false, + dataIndex: 'comment', + renderer: Ext.String.htmlEncode, + flex: 1, + }, + ], + }, + }, + { + xtype: 'proxmoxtextfield', + fieldLabel: gettext('Additional Recipient(s)'), + name: 'mailto', + allowBlank: true, + emptyText: 'user@example.com, ...', + cbind: { + deleteEmpty: '{!isCreate}', + }, + autoEl: { + tag: 'div', + 'data-qtip': gettext('Multiple recipients must be separated by spaces, commas or semicolons'), + }, + validator: function() { + return this.up('pmxEmailRecipientPanel').mailValidator(); + }, + }, + ], + }, + ], +}); diff --git a/src/panel/SendmailEditPanel.js b/src/panel/SendmailEditPanel.js index 16abebc..17f2d4f 100644 --- a/src/panel/SendmailEditPanel.js +++ b/src/panel/SendmailEditPanel.js @@ -28,62 +28,10 @@ Ext.define('Proxmox.panel.SendmailEditPanel', { allowBlank: false, }, { - xtype: 'pmxUserSelector', - name: 'mailto-user', - reference: 'mailto-user', - multiSelect: true, - allowBlank: true, - editable: false, - skipEmptyText: true, - fieldLabel: gettext('User(s)'), + // provides 'mailto' and 'mailto-user' fields + xtype: 'pmxEmailRecipientPanel', cbind: { - deleteEmpty: '{!isCreate}', - }, - validator: function() { - return this.up('pmxSendmailEditPanel').mailValidator(); - }, - listConfig: { - width: 600, - columns: [ - { - header: gettext('User'), - sortable: true, - dataIndex: 'userid', - renderer: Ext.String.htmlEncode, - flex: 1, - }, - { - header: gettext('E-Mail'), - sortable: true, - dataIndex: 'email', - renderer: Ext.String.htmlEncode, - flex: 1, - }, - { - header: gettext('Comment'), - sortable: false, - dataIndex: 'comment', - renderer: Ext.String.htmlEncode, - flex: 1, - }, - ], - }, - }, - { - xtype: 'proxmoxtextfield', - fieldLabel: gettext('Additional Recipient(s)'), - name: 'mailto', - reference: 'mailto', - allowBlank: true, - cbind: { - deleteEmpty: '{!isCreate}', - }, - autoEl: { - tag: 'div', - 'data-qtip': gettext('Multiple recipients must be separated by spaces, commas or semicolons'), - }, - validator: function() { - return this.up('pmxSendmailEditPanel').mailValidator(); + isCreate: '{isCreate}', }, }, { diff --git a/src/panel/SmtpEditPanel.js b/src/panel/SmtpEditPanel.js new file mode 100644 index 0000000..ab21217 --- /dev/null +++ b/src/panel/SmtpEditPanel.js @@ -0,0 +1,183 @@ +Ext.define('Proxmox.panel.SmtpEditPanel', { + extend: 'Proxmox.panel.InputPanel', + xtype: 'pmxSmtpEditPanel', + mixins: ['Proxmox.Mixin.CBind'], + + type: 'smtp', + + viewModel: { + xtype: 'viewmodel', + cbind: { + isCreate: "{isCreate}", + }, + data: { + mode: 'tls', + authentication: true, + }, + formulas: { + portEmptyText: function(get) { + let port; + + switch (get('mode')) { + case 'insecure': + port = 25; + break; + case 'starttls': + port = 587; + break; + case 'tls': + port = 465; + break; + } + return `${Proxmox.Utils.defaultText} (${port})`; + }, + passwordEmptyText: function(get) { + let isCreate = this.isCreate; + return get('authentication') && !isCreate ? gettext('Unchanged') : ''; + }, + }, + }, + + columnT: [ + { + xtype: 'pmxDisplayEditField', + name: 'name', + cbind: { + value: '{name}', + editable: '{isCreate}', + }, + fieldLabel: gettext('Endpoint Name'), + allowBlank: false, + }, + ], + + column1: [ + { + xtype: 'proxmoxtextfield', + fieldLabel: gettext('Server'), + name: 'server', + allowBlank: false, + emptyText: gettext('mail.example.com'), + }, + { + xtype: 'proxmoxKVComboBox', + name: 'mode', + fieldLabel: gettext('Encryption'), + editable: false, + comboItems: [ + ['insecure', Proxmox.Utils.noneText + ' (' + gettext('insecure') + ')'], + ['starttls', 'STARTTLS'], + ['tls', 'TLS'], + ], + bind: "{mode}", + cbind: { + deleteEmpty: '{!isCreate}', + }, + }, + { + xtype: 'proxmoxintegerfield', + name: 'port', + fieldLabel: gettext('Port'), + minValue: 1, + maxValue: 65535, + bind: { + emptyText: "{portEmptyText}", + }, + submitEmptyText: false, + cbind: { + deleteEmpty: '{!isCreate}', + }, + }, + ], + column2: [ + { + xtype: 'proxmoxcheckbox', + fieldLabel: gettext('Authenticate'), + name: 'authentication', + bind: { + value: '{authentication}', + }, + }, + { + xtype: 'proxmoxtextfield', + fieldLabel: gettext('Username'), + name: 'username', + allowBlank: false, + cbind: { + deleteEmpty: '{!isCreate}', + }, + bind: { + disabled: '{!authentication}', + }, + }, + { + xtype: 'proxmoxtextfield', + inputType: 'password', + fieldLabel: gettext('Password'), + name: 'password', + allowBlank: true, + bind: { + disabled: '{!authentication}', + emptyText: '{passwordEmptyText}', + }, + }, + ], + columnB: [ + { + xtype: 'proxmoxtextfield', + fieldLabel: gettext('From Address'), + name: 'from-address', + allowBlank: false, + emptyText: gettext('user@example.com'), + }, + { + // provides 'mailto' and 'mailto-user' fields + xtype: 'pmxEmailRecipientPanel', + cbind: { + isCreate: '{isCreate}', + }, + }, + { + xtype: 'proxmoxtextfield', + name: 'comment', + fieldLabel: gettext('Comment'), + cbind: { + deleteEmpty: '{!isCreate}', + }, + }, + ], + + advancedColumnB: [ + { + xtype: 'proxmoxtextfield', + fieldLabel: gettext('Author'), + name: 'author', + allowBlank: true, + emptyText: gettext('Proxmox VE'), + cbind: { + deleteEmpty: '{!isCreate}', + }, + }, + ], + + onGetValues: function(values) { + if (values.mailto) { + values.mailto = values.mailto.split(/[\s,;]+/); + } + + if (!values.authentication && !this.isCreate) { + Proxmox.Utils.assemble_field_data(values, { 'delete': 'username' }); + Proxmox.Utils.assemble_field_data(values, { 'delete': 'password' }); + } + + delete values.authentication; + + return values; + }, + + onSetValues: function(values) { + values.authentication = !!values.username; + + return values; + }, +}); -- 2.39.2