Skip to content

Commit

Permalink
Added ssl/tls support for sieve
Browse files Browse the repository at this point in the history
  • Loading branch information
kroky authored and josaphatim committed Oct 2, 2023
1 parent 3d010f0 commit 61a87ea
Show file tree
Hide file tree
Showing 20 changed files with 543 additions and 455 deletions.
1 change: 1 addition & 0 deletions hm3.sample.ini
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ imap_auth_port=143
imap_auth_tls=

; The hostname/IP address and port sieve is listening on. Example: example.org:4190
; Note: Add tls:// prefix to enable explicit STARTTLS
imap_auth_sieve_conf_host=


Expand Down
4 changes: 3 additions & 1 deletion language/az.php
Original file line number Diff line number Diff line change
Expand Up @@ -587,7 +587,9 @@
'Show folders' => false,
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/de.php
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,9 @@
'Show folders' => false,
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/en.php
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,9 @@
'Show folders' => false,
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/es.php
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,9 @@
'Show folders' => false,
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/et.php
Original file line number Diff line number Diff line change
Expand Up @@ -592,7 +592,9 @@
'Show folders' => 'Näita kaustu',
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/fa.php
Original file line number Diff line number Diff line change
Expand Up @@ -636,7 +636,9 @@
"Nope"=>"نه خیر",
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/fr.php
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,9 @@
'Show folders' => false,
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => 'Déplacer vers le dossier Bloqués'
'Move To Blocked Folder' => 'Déplacer vers le dossier Bloqués',
'Sieve server capabilities' => 'Capacités du serveur Sieve',
'Connection To Sieve Server Failed' => 'Échec de la connexion au serveur Sieve'
);

?>
4 changes: 3 additions & 1 deletion language/hu.php
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,9 @@
'Show folders' => false,
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/id.php
Original file line number Diff line number Diff line change
Expand Up @@ -591,7 +591,9 @@
'Show folders' => 'Tampilkan folder',
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/it.php
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,9 @@
'Show folders' => 'Mostra cartelle',
'Show next & previous emails when reading a message' => 'Mostra email successive e precedenti durante la lettura di un messaggio',
'Archive to the original folder' => 'Archivia nella cartella originale',
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/ja.php
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,9 @@
'Show folders' => false,
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/nl.php
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,9 @@
'Show folders' => false,
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/pt-BR.php
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,9 @@
'Show folders' => false,
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/ro.php
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,9 @@
'Show folders' => false,
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
4 changes: 3 additions & 1 deletion language/ru.php
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,9 @@
'Show folders' => false,
'Show next & previous emails when reading a message' => false,
'Archive to the original folder' => false,
'Move To Blocked Folder' => false
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
14 changes: 14 additions & 0 deletions modules/imap/functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -1217,3 +1217,17 @@ function get_request_params($request) {

return [$server_id, $uid, $folder, $msg_id];
}}

/**
* @subpackage imap/functions
*/
if (!hm_exists('parse_sieve_config_host')) {
function parse_sieve_config_host($host) {
$url = parse_url($host);
$host = $url['host'] ?? $url['path'];
$port = $url['port'] ?? '4190';
$scheme = $url['scheme'] ?? 'tcp://';
$tls = $scheme === 'tls';
// $host = '$scheme://'.$host;
return [$host, $port, $tls];
}}
20 changes: 5 additions & 15 deletions modules/imap/handler_modules.php
Original file line number Diff line number Diff line change
Expand Up @@ -1516,7 +1516,7 @@ public function process() {
'user' => $auth_server['username'],
'pass' => $auth_server['password']
);
if (! empty($auth_server['sieve_config_host']) && count(explode(':', $auth_server['sieve_config_host'])) == 2) {
if (! empty($auth_server['sieve_config_host'])) {
$imap_details['sieve_config_host'] = $auth_server['sieve_config_host'];
}
Hm_IMAP_List::add($imap_details, $max);
Expand Down Expand Up @@ -1657,14 +1657,9 @@ public function process() {
if ($sieve_enabled) {
require_once VENDOR_PATH.'autoload.php';
try {
$host_config = explode(':', $sieve_hostname);
$sieve_host = $host_config[0];
$sieve_port = '4190';
if (count($host_config) > 1) {
$sieve_port = $host_config[1];
}
list($sieve_host, $sieve_port, $sieve_tls) = parse_sieve_config_host($sieve_hostname);
$client = new \PhpSieveManager\ManageSieve\Client($sieve_host, $sieve_port);
$client->connect($form['imap_user'], $form['imap_pass'], false, "", "PLAIN");
$client->connect($form['imap_user'], $form['imap_pass'], $sieve_tls, "", "PLAIN");
} catch (Exception $e) {
Hm_Msgs::add("ERRFailed to authenticate to the Sieve host");
return;
Expand Down Expand Up @@ -1738,14 +1733,9 @@ public function process() {
if (isset($this->request->post['imap_sieve_host'])) {
require_once VENDOR_PATH . 'autoload.php';
try {
$host_config = explode(':', $this->request->post['imap_sieve_host']);
$sieve_host = $host_config[0];
$sieve_port = '4190';
if (count($host_config) > 1) {
$sieve_port = $host_config[1];
}
list($sieve_host, $sieve_port, $sieve_tls) = parse_sieve_config_host($this->request->post['imap_sieve_host']);
$client = new \PhpSieveManager\ManageSieve\Client($sieve_host, $sieve_port);
$client->connect($form['imap_user'], $form['imap_pass'], false, "", "PLAIN");
$client->connect($form['imap_user'], $form['imap_pass'], $sieve_tls, "", "PLAIN");
} catch (Exception $e) {
Hm_Msgs::add("ERRFailed to authenticate to the Sieve host");
return;
Expand Down
81 changes: 45 additions & 36 deletions modules/imap_folders/modules.php
Original file line number Diff line number Diff line change
Expand Up @@ -211,31 +211,35 @@ public function process() {
$linked_mailboxes = get_sieve_linked_mailbox($imap_account, $this);
if ($linked_mailboxes && in_array($old_folder, $linked_mailboxes)) {
require_once VENDOR_PATH.'autoload.php';
$sieve_options = explode(':', $imap_account['sieve_config_host']);
$client = new \PhpSieveManager\ManageSieve\Client($sieve_options[0], $sieve_options[1]);
$client->connect($imap_account['user'], $imap_account['pass'], false, "", "PLAIN");
$script_names = array_filter(
$linked_mailboxes,
function ($value) use($old_folder) {
return $value == $old_folder;
}
);
$script_names = array_keys($script_names);
foreach ($script_names as $script_name) {
$script_parsed = $client->getScript($script_name);
$script_parsed = str_replace('"'.$old_folder.'"', '"'.$new_folder.'"', $script_parsed);

$old_actions = base64_decode(preg_split('#\r?\n#', $script_parsed, 0)[2]);
$new_actions = base64_encode(str_replace('"'.$old_folder.'"', '"'.$new_folder.'"', $old_actions));
$script_parsed = str_replace(base64_encode($old_actions), $new_actions, $script_parsed);
$client->removeScripts($script_name);
$client->putScript(
$script_name,
$script_parsed
list($sieve_host, $sieve_port, $sieve_tls) = parse_sieve_config_host($imap_account['sieve_config_host']);
try {
$client = new \PhpSieveManager\ManageSieve\Client($sieve_host, $sieve_port);
$client->connect($imap_account['user'], $imap_account['pass'], $sieve_tls, "", "PLAIN");
$script_names = array_filter(
$linked_mailboxes,
function ($value) use($old_folder) {
return $value == $old_folder;
}
);
$script_names = array_keys($script_names);
foreach ($script_names as $script_name) {
$script_parsed = $client->getScript($script_name);
$script_parsed = str_replace('"'.$old_folder.'"', '"'.$new_folder.'"', $script_parsed);

$old_actions = base64_decode(preg_split('#\r?\n#', $script_parsed, 0)[2]);
$new_actions = base64_encode(str_replace('"'.$old_folder.'"', '"'.$new_folder.'"', $old_actions));
$script_parsed = str_replace(base64_encode($old_actions), $new_actions, $script_parsed);
$client->removeScripts($script_name);
$client->putScript(
$script_name,
$script_parsed
);
}
$client->close();
Hm_Msgs::add('This folder is used in one or many filters, and it will be renamed as well');
} catch (Exception $e) {
Hm_Msgs::add("ERRFailed to rename folder in sieve scripts");
}
$client->close();
Hm_Msgs::add('This folder is used in one or many filters, and it will be renamed as well');
}
}
Hm_Msgs::add('Folder renamed');
Expand Down Expand Up @@ -574,21 +578,26 @@ function get_sieve_linked_mailbox ($imap_account, $module) {
return;
}
require_once VENDOR_PATH.'autoload.php';
$sieve_options = explode(':', $imap_account['sieve_config_host']);
$client = new \PhpSieveManager\ManageSieve\Client($sieve_options[0], $sieve_options[1]);
$client->connect($imap_account['user'], $imap_account['pass'], false, "", "PLAIN");
$scripts = $client->listScripts();
$folders = [];
foreach ($scripts as $s) {
$script = $client->getScript($s);
$base64_obj = str_replace("# ", "", preg_split('#\r?\n#', $script, 0)[2]);
$obj = json_decode(base64_decode($base64_obj))[0];
if ($obj && in_array($obj->action, ['copy', 'move'])) {
$folders[$s] = $obj->value;
list($sieve_host, $sieve_port, $sieve_tls) = parse_sieve_config_host($imap_account['sieve_config_host']);
$client = new \PhpSieveManager\ManageSieve\Client($sieve_host, $sieve_port);
try {
$client->connect($imap_account['user'], $imap_account['pass'], $sieve_tls, "", "PLAIN");
$scripts = $client->listScripts();
$folders = [];
foreach ($scripts as $s) {
$script = $client->getScript($s);
$base64_obj = str_replace("# ", "", preg_split('#\r?\n#', $script, 0)[2]);
$obj = json_decode(base64_decode($base64_obj))[0];
if ($obj && in_array($obj->action, ['copy', 'move'])) {
$folders[$s] = $obj->value;
}
}
$client->close();
return $folders;
} catch (Exception $e) {
Hm_Msgs::add("ERRSieve: {$e->getMessage()}");
return;
}
$client->close();
return $folders;
}
}

Expand Down

0 comments on commit 61a87ea

Please sign in to comment.