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() {
@@ -2236,19 +2238,14 @@ protected function output() {
$res .= '
-
-
+
-
+
-
+
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 .= '';
}