From 71b126682acbf7622ae85a13480fe0016c3b1b6d Mon Sep 17 00:00:00 2001 From: Josaphat Imani Date: Sat, 8 Jun 2024 19:34:12 +0200 Subject: [PATCH] Added possibility to edit server data --- lib/repository.php | 2 +- modules/core/handler_modules.php | 36 +++++-- modules/core/output_modules.php | 15 ++- modules/core/setup.php | 5 +- modules/core/site.js | 166 +++++++++++++++++++++++-------- modules/imap/functions.php | 23 +++-- modules/imap/output_modules.php | 36 +++++-- modules/imap/setup.php | 2 + modules/smtp/functions.php | 21 +++- modules/smtp/modules.php | 6 +- 10 files changed, 226 insertions(+), 86 deletions(-) diff --git a/lib/repository.php b/lib/repository.php index 029d12f3f2..f8620ea117 100644 --- a/lib/repository.php +++ b/lib/repository.php @@ -55,7 +55,7 @@ public static function add($entity, $save = true) { public static function edit($id, $entity) { if (array_key_exists($id, self::$entities)) { - self::$entities[$id] = $entity; + self::$entities[$id] = array_merge(self::$entities[$id], $entity); self::save(); return true; } diff --git a/modules/core/handler_modules.php b/modules/core/handler_modules.php index adf089e71c..e9bb610544 100644 --- a/modules/core/handler_modules.php +++ b/modules/core/handler_modules.php @@ -991,8 +991,10 @@ public function process() { 'srv_setup_stepper_profile_reply_to', 'srv_setup_stepper_imap_sieve_host', 'srv_setup_stepper_only_jmap', - 'srv_setup_stepper_jmap_hide_from_c_page', + 'srv_setup_stepper_imap_hide_from_c_page', 'srv_setup_stepper_jmap_address', + 'srv_setup_stepper_imap_server_id', + 'srv_setup_stepper_smtp_server_id', )); if ($success) { @@ -1017,8 +1019,10 @@ public function process() { 'srv_setup_stepper_profile_reply_to' => $profileReplyTo, 'srv_setup_stepper_imap_sieve_host' => $imapSieveHost, 'srv_setup_stepper_only_jmap' => $onlyJmap, - 'srv_setup_stepper_jmap_hide_from_c_page' => $jmapHideFromCPage, + 'srv_setup_stepper_imap_hide_from_c_page' => $hideFromCombinedView, 'srv_setup_stepper_jmap_address' => $jmapAddress, + 'srv_setup_stepper_imap_server_id' => $imapServerId, + 'srv_setup_stepper_smtp_server_id' => $smtpServerId ] = $form; /* @@ -1041,30 +1045,37 @@ public function process() { false, 'jmap', $this, - $jmapHideFromCPage + $hideFromCombinedView, + $imapServerId ); + if(!isset($this->jmap_server_id)) { + Hm_Msgs::add("ERRCould not save JMAP server"); + return; + }; + Hm_Msgs::add("JMAP Server saved"); $this->out('just_saved_credentials', true); + return; } else { /* - * Connect to SMTP server if user wants to send emails - */ + * Connect to SMTP server if user wants to send emails + */ if($isSender){ if (!$this->module_is_supported('smtp')) { Hm_Msgs::add("ERRSMTP module is not enabled"); return; } - - $this->smtp_server_id = connect_to_smtp_server($smtpAddress, $profileName, $smtpPort, $email, $password, $smtpTls, $this); + $this->smtp_server_id = connect_to_smtp_server($smtpAddress, $profileName, $smtpPort, $email, $password, $smtpTls, $smtpServerId); if(!isset($this->smtp_server_id)){ + Hm_Msgs::add("ERRCould not save server"); return; } } /* - * Connect to IMAP server if user wants to receive emails - */ + * Connect to IMAP server if user wants to receive emails + */ if($isReceiver){ if (!$this->module_is_supported('imap')) { Hm_Msgs::add("ERRIMAP module is not enabled"); @@ -1081,18 +1092,21 @@ public function process() { $imapSieveHost, $enableSieve, 'imap', - $this + $this, + $hideFromCombinedView, + $imapServerId, ); if(!isset($this->imap_server_id)) { if($isSender && isset($this->smtp_server_id)){ delete_smtp_server($this->smtp_server_id, $this); } + Hm_Msgs::add("ERRCould not save server"); return; }; } - if($isSender && $isReceiver && $createProfile && isset($this->imap_server_id) && isset($this->smtp_server_id)) { + if($isSender && $isReceiver && $createProfile && isset($this->imap_server_id) && isset($this->smtp_server_id) && ! ($smtpServerId || $imapServerId)) { if (!$this->module_is_supported('profiles')) { Hm_Msgs::add("ERRProfiles module is not enabled"); return; diff --git a/modules/core/output_modules.php b/modules/core/output_modules.php index 81284bbce7..5e093a2c87 100644 --- a/modules/core/output_modules.php +++ b/modules/core/output_modules.php @@ -2151,6 +2151,8 @@ protected function output() {
+ +
@@ -2169,7 +2171,7 @@ protected function output() {
- +
@@ -2236,19 +2238,14 @@ protected function output() { $res .= ' -
-
- Loading... -
-
- + - +
- +
diff --git a/modules/core/setup.php b/modules/core/setup.php index 73594fb494..4f73fb99da 100644 --- a/modules/core/setup.php +++ b/modules/core/setup.php @@ -310,6 +310,8 @@ 'drafts_per_source' => FILTER_DEFAULT, 'drafts_since' => FILTER_DEFAULT, 'warn_for_unsaved_changes' => FILTER_VALIDATE_BOOLEAN, + 'srv_setup_stepper_imap_server_id' => FILTER_DEFAULT, + 'srv_setup_stepper_smtp_server_id' => FILTER_DEFAULT, 'srv_setup_stepper_profile_name' => FILTER_DEFAULT, 'srv_setup_stepper_email' => FILTER_DEFAULT, 'srv_setup_stepper_password' => FILTER_UNSAFE_RAW, @@ -330,6 +332,7 @@ 'srv_setup_stepper_imap_sieve_host' => FILTER_DEFAULT, 'srv_setup_stepper_only_jmap' => FILTER_VALIDATE_BOOLEAN, 'srv_setup_stepper_jmap_hide_from_c_page' => FILTER_VALIDATE_BOOLEAN, - 'srv_setup_stepper_jmap_address' => FILTER_DEFAULT + 'srv_setup_stepper_jmap_address' => FILTER_DEFAULT, + 'srv_setup_stepper_imap_hide_from_c_page' => FILTER_VALIDATE_BOOLEAN ) ); diff --git a/modules/core/site.js b/modules/core/site.js index 9e42c04200..a9209f8d4b 100644 --- a/modules/core/site.js +++ b/modules/core/site.js @@ -1866,12 +1866,83 @@ var decrease_servers = function(section) { if (value > 0) { element.innerHTML = value - 1; } + + if (value === 1) { + if ($(`.${section}_server`)) { + $(`.${section}_server`).prev().fadeOutAndRemove(); + } + } }; var err_msg = function(msg) { return "ERR"+hm_trans(msg); }; +var fillImapData = function(details) { + $('#srv_setup_stepper_imap_address').val(details.server); + $('#srv_setup_stepper_imap_port').val(details.port); + $('#srv_setup_stepper_imap_server_id').val(details.id); + $('#srv_setup_stepper_imap_hide_from_c_page').prop("checked", details.hide); + if (details.sieve_config_host) { + $('#srv_setup_stepper_imap_sieve_host').val(details.sieve_config_host); + $("#srv_setup_stepper_enable_sieve").trigger("click", false); + } + + if(details.tls) { + $("input[name='srv_setup_stepper_imap_tls'][value='true']").prop("checked", true); + } else { + $("input[name='srv_setup_stepper_imap_tls'][value='false']").prop("checked", true); + } +}; + +var fillSmtpData = function(details) { + $('#srv_setup_stepper_smtp_server_id').val(details.id); + $('#srv_setup_stepper_smtp_address').val(details.server); + $('#srv_setup_stepper_smtp_port').val(details.port); +}; + +var fillJmapData = function(details) { + $('#srv_setup_stepper_imap_server_id').val(details.id); + $('#srv_setup_stepper_only_jmap').trigger('click'); + $('#srv_setup_stepper_jmap_address').val(details.server); + $('#srv_setup_stepper_imap_hide_from_c_page').prop("checked", details.hide); +}; + +var imap_smtp_edit_action = function(event) { + resetQuickSetupForm(); + event.preventDefault(); + Hm_Notices.hide(true); + var details = $(this).data('server-details'); + + $('.imap-jmap-smtp-btn').trigger('click'); + $('#srv_setup_stepper_profile_name').trigger('focus'); + $('#srv_setup_stepper_profile_name').val(details.name); + $('#srv_setup_stepper_email').val(details.user); + $('#srv_setup_stepper_password').val(''); + $('#srv_setup_stepper_profile_reply_to').val(''); + $('#srv_setup_stepper_create_profile').trigger("click", true); + + if ($(this).data('type') == 'jmap') { + fillJmapData(details); + } else if ($(this).data('type') == 'imap') { + fillImapData(details); + var smtpDetails = $('[data-type="smtp"][data-id="'+details.name+'"]'); + if (smtpDetails.length) { + fillSmtpData(smtpDetails.data('server-details')); + } else { + $('#srv_setup_stepper_is_sender').trigger("click", true); + } + } else { + fillSmtpData(details); + var imapDetails = $('[data-type="imap"][data-id="'+details.name+'"]'); + if (imapDetails.length) { + fillImapData(imapDetails.data('server-details')); + } else { + $('#srv_setup_stepper_is_receiver').trigger("click", true); + } + } +}; + /* create a default message list object */ var Hm_Message_List = new Message_List(); @@ -1881,7 +1952,7 @@ $(function() { $('.save_settings').on("click", function (e) { $('.general_setting input[type=checkbox]').each(function () { if (this.hasAttribute('disabled') && this.checked) { - this.removeAttribute('disabled'); + this.removeAttr('disabled'); } }); }) @@ -1929,6 +2000,9 @@ $(function() { if (hm_page_name() == 'home') { $('.pw_update').on("click", function() { update_password($(this).data('id')); }); } + if (hm_page_name() == 'servers') { + $('.edit_server_connection').on('click', imap_smtp_edit_action); + } if (hm_mobile()) { swipe_event(document.body, function() { Hm_Folders.open_folder_list(); }, 'right'); swipe_event(document.body, function() { Hm_Folders.hide_folder_list(); }, 'left'); @@ -2154,9 +2228,14 @@ if(tableBody && !hm_mobile()) { observer.observe(folderList, config); } +var resetStepperButtons = function() { + $('.step_config-actions button').removeAttr('disabled'); + $('#stepper-action-finish').text($('#stepper-action-finish').text().slice(0, -3)); +}; + function submitSmtpImapServer() { - $('#srv_setup_stepper_form_loader').removeClass('hide'); - $('.step_config-actions').addClass('hide'); + $('.step_config-actions button').attr('disabled', true); + $('#stepper-action-finish').text($('#stepper-action-finish').text() + '...'); var requestData = [ { name: 'hm_ajax_hook', value: 'ajax_quick_servers_setup' }, @@ -2179,31 +2258,32 @@ function submitSmtpImapServer() { { name: 'srv_setup_stepper_profile_reply_to', value: $('#srv_setup_stepper_profile_reply_to').val() }, { name: 'srv_setup_stepper_imap_sieve_host', value: $('#srv_setup_stepper_imap_sieve_host').val() }, { name: 'srv_setup_stepper_only_jmap', value: $('input[name="srv_setup_stepper_only_jmap"]:checked').val() }, - { name: 'srv_setup_stepper_jmap_hide_from_c_page', value: $('input[name="srv_setup_stepper_jmap_hide_from_c_page"]:checked').val() }, + { name: 'srv_setup_stepper_imap_hide_from_c_page', value: $('input[name="srv_setup_stepper_imap_hide_from_c_page"]:checked').val() }, { name: 'srv_setup_stepper_jmap_address', value: $('#srv_setup_stepper_jmap_address').val() }, + { name: 'srv_setup_stepper_imap_server_id', value: $('#srv_setup_stepper_imap_server_id').val() }, + { name: 'srv_setup_stepper_smtp_server_id', value: $('#srv_setup_stepper_smtp_server_id').val() } ]; Hm_Ajax.request(requestData, function(res) { - $('#srv_setup_stepper_form_loader').addClass('hide'); - $('.step_config-actions').removeClass('hide'); - + resetStepperButtons(); if (res.just_saved_credentials) { - if (res.imap_server_id) { + if (!res.imap_server_id) { Hm_Ajax.request( [{'name': 'hm_ajax_hook', 'value': 'ajax_imap_accept_special_folders'}, {'name': 'imap_server_id', value: res.imap_server_id}, {'name': 'imap_service_name', value: res.imap_service_name}], function () { resetQuickSetupForm(); + Hm_Utils.redirect(); } ); } else { resetQuickSetupForm(); + Hm_Utils.redirect(); } } - }, null, null, function (res) { - $('#srv_setup_stepper_form_loader').addClass('hide'); - $('.step_config-actions').removeClass('hide'); + }, null, null, undefined, function (res) { + resetStepperButtons(); }); } @@ -2217,7 +2297,11 @@ function resetQuickSetupForm() { $("#srv_setup_stepper_profile_name").val(''); $("#srv_setup_stepper_email").val(''); $("#srv_setup_stepper_password").val(''); + $("#srv_setup_stepper_jmap_address").val(''); $("#srv_setup_stepper_profile_is_default").prop('checked', true); + $("#srv_setup_stepper_create_profile").prop('checked', true); + $("#srv_setup_stepper_imap_server_id").val(''); + $("#srv_setup_stepper_smtp_server_id").val(''); $("#srv_setup_stepper_is_sender").prop('checked', true); $("#srv_setup_stepper_is_receiver").prop('checked', true); $("#srv_setup_stepper_enable_sieve").prop('checked', false); @@ -2228,7 +2312,6 @@ function resetQuickSetupForm() { Hm_Utils.set_unsaved_changes(1); Hm_Folders.reload_folders(true); - location.reload(); } function handleCreateProfileCheckboxChange(checkbox) { @@ -2247,11 +2330,18 @@ function handleSieveStatusChange (checkbox) { } } function handleSmtpImapCheckboxChange(checkbox) { - $(".step_config-smtp_imap_bloc").show(); - if (checkbox.id === 'srv_setup_stepper_is_receiver') { - if(checkbox.checked) $('#step_config-imap_bloc').show(); - else $('#step_config-imap_bloc').hide(); + if(checkbox.checked) { + $('#step_config-imap_bloc').show(); + $('#step_config_combined_view').show(); + $('#srv_setup_stepper_jmap_select_box').show(); + $('#srv_setup_stepper_only_jmap').prop('checked', false); + } else { + $('#step_config-imap_bloc').hide(); + $('#step_config-jmap_bloc').hide(); + $('#step_config_combined_view').hide(); + $('#srv_setup_stepper_jmap_select_box').hide(); + } } if (checkbox.id === 'srv_setup_stepper_is_sender') { @@ -2260,40 +2350,26 @@ function handleSmtpImapCheckboxChange(checkbox) { else $('#step_config-smtp_bloc').hide(); } - if($('#srv_setup_stepper_is_sender').prop('checked') && - $('#srv_setup_stepper_is_receiver').prop('checked')){ + if ($('#srv_setup_stepper_is_sender').prop('checked') && $('#srv_setup_stepper_is_receiver').prop('checked')) { $('#srv_setup_stepper_profile_bloc').show(); $('#srv_setup_stepper_profile_checkbox_bloc').show(); - $('#srv_setup_stepper_jmap_select_box').show(); - $("#srv_setup_stepper_only_jmap").show(); - }else{ - $("#srv_setup_stepper_only_jmap").prop('checked', false); - + + } else if(! $('#srv_setup_stepper_is_sender').prop('checked') || ! $('#srv_setup_stepper_is_receiver').prop('checked')) { $('#srv_setup_stepper_profile_bloc').hide(); $('#srv_setup_stepper_profile_checkbox_bloc').hide(); - $('#srv_setup_stepper_jmap_select_box').hide(); - $("#srv_setup_stepper_only_jmap").hide(); - - if(!$('#srv_setup_stepper_is_sender').prop('checked') && - !$('#srv_setup_stepper_is_receiver').prop('checked')){ - $(".step_config-smtp_imap_bloc").hide(); - } } } function handleJmapCheckboxChange(checkbox) { - if(checkbox.checked){ + if (checkbox.checked) { $('#step_config-jmap_bloc').show(); - $('#step_config-smtp_bloc').hide(); $('#step_config-imap_bloc').hide(); - $('#srv_setup_stepper_profile_bloc').hide(); - $('#srv_setup_stepper_profile_checkbox_bloc').hide(); - }else { + if (! $('#srv_setup_stepper_enable_sieve').prop('checked')) { + $('#srv_setup_stepper_imap_sieve_host_bloc').hide(); + } + } else { $('#step_config-jmap_bloc').hide(); - $('#step_config-smtp_bloc').show(); $('#step_config-imap_bloc').show(); - $('#srv_setup_stepper_profile_bloc').show(); - $('#srv_setup_stepper_profile_checkbox_bloc').show(); } } @@ -2322,11 +2398,17 @@ function display_config_step(stepNumber) { [ {key: 'srv_setup_stepper_profile_name', value: $('#srv_setup_stepper_profile_name').val()}, {key: 'srv_setup_stepper_email', value: $('#srv_setup_stepper_email').val()}, {key: 'srv_setup_stepper_password', value: $('#srv_setup_stepper_password').val()}].forEach((item) => { - if(!item.value) { - $(`#${item.key}-error`).text('Required'); - isValid = false; + if (!item.value) { + if (item.key == 'srv_setup_stepper_password' && ($('#srv_setup_stepper_imap_server_id').val() || $('#srv_setup_stepper_smtp_server_id').val())) { + $(`#${item.key}-error`).text(''); + } else { + $(`#${item.key}-error`).text('Required'); + isValid = false; + } + + } else { + $(`#${item.key}-error`).text(''); } - else $(`#${item.key}-error`).text(''); }) if (!isValid) { diff --git a/modules/imap/functions.php b/modules/imap/functions.php index 512bafa828..34e6c7962c 100644 --- a/modules/imap/functions.php +++ b/modules/imap/functions.php @@ -1427,16 +1427,19 @@ function parse_sieve_config_host($host) { }} if (!hm_exists('connect_to_imap_server')) { - function connect_to_imap_server($address, $name, $port, $user, $pass, $tls, $imap_sieve_host, $enableSieve, $type, $context, $hidden = false) { + function connect_to_imap_server($address, $name, $port, $user, $pass, $tls, $imap_sieve_host, $enableSieve, $type, $context, $hidden = false, $server_id = false) { $imap_list = array( 'name' => $name, 'server' => $address, - 'hide' => false, + 'hide' => $hidden, 'port' => $port, 'user' => $user, - 'pass' => $pass, 'tls' => $tls); + if (!$server_id || ($server_id && $pass)) { + $imap_list['pass'] = $pass; + } + if ($type === 'jmap') { $imap_list['type'] = 'jmap'; $imap_list['hide'] = $hidden; @@ -1448,9 +1451,17 @@ function connect_to_imap_server($address, $name, $port, $user, $pass, $tls, $ima $imap_list['sieve_config_host'] = $imap_sieve_host; } - $imap_server_id = Hm_IMAP_List::add($imap_list); - if (! can_save_last_added_server('Hm_IMAP_List', $user)) { - return; + if ($server_id) { + if (Hm_IMAP_List::edit($server_id, $imap_list)) { + $imap_server_id = $server_id; + } else { + return; + } + } else { + $imap_server_id = Hm_IMAP_List::add($imap_list); + if (! can_save_last_added_server('Hm_IMAP_List', $user)) { + return; + } } $server = Hm_IMAP_List::get($imap_server_id, false); diff --git a/modules/imap/output_modules.php b/modules/imap/output_modules.php index 61c18b2b2f..8de62710ee 100644 --- a/modules/imap/output_modules.php +++ b/modules/imap/output_modules.php @@ -496,13 +496,19 @@ protected function output() { $res .= '
'; // Buttons + $disabled = isset($vals['default']) ? ' disabled': ''; if (!isset($vals['user']) || !$vals['user']) { $res .= ''; $res .= ''; } else { - $res .= ''; - $res .= ''; - $res .= ''; + $keysToRemove = array('object', 'connected', 'default', 'nopass'); + $serverDetails = array_diff_key($vals, array_flip($keysToRemove)); + + $type = $vals['type'] ?? 'imap'; + $res .= 'html_safe(json_encode($serverDetails)).'\' data-id="'.$this->html_safe($serverDetails['name']).'" data-type="'.$type.'" />'; + $res .= ''; + $res .= ''; + $res .= ''; } // Hide/Unhide Buttons @@ -1299,12 +1305,6 @@ protected function output() {
-
- - -
'; } @@ -1363,7 +1363,23 @@ protected function output() { '; } - $res .= ''; + $res .= ''; + return $res; } } + +class Hm_Output_stepper_setup_server_jmap_imap_common extends Hm_Output_Module { + protected function output() { + $res = ' +
+ + +
+ '; + + return $res; + } +} diff --git a/modules/imap/setup.php b/modules/imap/setup.php index 70ab9da977..7004b49823 100644 --- a/modules/imap/setup.php +++ b/modules/imap/setup.php @@ -23,8 +23,10 @@ add_handler('servers', 'save_imap_servers', true, 'imap', 'process_add_jmap_server', 'after'); add_output('servers', 'display_configured_imap_servers', true, 'imap', 'server_config_stepper_accordion_end_part', 'before'); add_output('servers', 'imap_server_ids', true, 'imap', 'page_js', 'before'); + add_output('servers', 'stepper_setup_server_jmap', true, 'imap', 'server_config_stepper_end_part', 'before'); add_output('servers', 'stepper_setup_server_imap', true, 'imap', 'server_config_stepper_end_part', 'before'); +add_output('servers', 'stepper_setup_server_jmap_imap_common', true, 'imap', 'server_config_stepper_end_part', 'before'); /* settings page data */ add_handler('settings', 'process_sent_since_setting', true, 'imap', 'date', 'after'); diff --git a/modules/smtp/functions.php b/modules/smtp/functions.php index 00bbcb8a84..260ad84e87 100644 --- a/modules/smtp/functions.php +++ b/modules/smtp/functions.php @@ -4,19 +4,30 @@ if (!defined('DEBUG_MODE')) { die(); } if (!hm_exists('connect_to_smtp_server')) { - function connect_to_smtp_server($address, $name, $port, $user, $pass, $tls, $context) { + function connect_to_smtp_server($address, $name, $port, $user, $pass, $tls, $server_id = false) { $smtp_list = array( 'name' => $name, 'server' => $address, 'hide' => false, 'port' => $port, 'user' => $user, - 'pass' => $pass, 'tls' => $tls); - $smtp_server_id = Hm_SMTP_List::add($smtp_list); - if (! can_save_last_added_server('Hm_SMTP_List', $user)) { - return; + if (!$server_id || ($server_id && $pass)) { + $smtp_list['pass'] = $pass; + } + + if ($server_id) { + if (Hm_SMTP_List::edit($server_id, $smtp_list)) { + $smtp_server_id = $server_id; + } else { + return; + } + } else { + $smtp_server_id = Hm_SMTP_List::add($smtp_list); + if (! can_save_last_added_server('Hm_SMTP_List', $user)) { + return; + } } $smtp = Hm_SMTP_List::connect($smtp_server_id, false); diff --git a/modules/smtp/modules.php b/modules/smtp/modules.php index c815e4bd24..0028b5e182 100644 --- a/modules/smtp/modules.php +++ b/modules/smtp/modules.php @@ -1409,7 +1409,11 @@ protected function output() { $res .= ''; } else { - $res .= ''; + $keysToRemove = array('object', 'connected'); + $serverDetails = array_diff_key($vals, array_flip($keysToRemove)); + + $res .= 'html_safe(json_encode($serverDetails)).'\' data-id="'.$this->html_safe($serverDetails['name']).'" data-type="smtp" />'; + $res .= ''; $res .= ''; $res .= ''; }