Skip to content

Commit

Permalink
Merge pull request #701 from josaphatim/sieve-ssl-support
Browse files Browse the repository at this point in the history
Added ssl/tls support for sieve
  • Loading branch information
kroky committed Sep 15, 2023
2 parents b25b6a5 + 9ee3811 commit 0623575
Show file tree
Hide file tree
Showing 20 changed files with 510 additions and 444 deletions.
1 change: 1 addition & 0 deletions hm3.sample.ini
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,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
2 changes: 2 additions & 0 deletions language/az.php
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,8 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false

);

?>
1 change: 1 addition & 0 deletions language/de.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/en.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/es.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/et.php
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/fa.php
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/fr.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
'Archive to the original folder' => false,
'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'
);

?>
1 change: 1 addition & 0 deletions language/hu.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/id.php
Original file line number Diff line number Diff line change
Expand Up @@ -582,6 +582,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/it.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
'Archive to the original folder' => 'Archivia nella cartella originale',
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/ja.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/nl.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/pt-BR.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/ro.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
1 change: 1 addition & 0 deletions language/ru.php
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,7 @@
'Archive to the original folder' => false,
'Move To Blocked Folder' => false,
'Sieve server capabilities' => false,
'Connection To Sieve Server Failed' => false
);

?>
13 changes: 13 additions & 0 deletions modules/imap/functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -1403,3 +1403,16 @@ function snooze_dropdown($output, $unsnooze = false) {
return $txt;
}}

/**
* @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 @@ -1553,7 +1553,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 @@ -1694,14 +1694,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 @@ -1775,14 +1770,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 @@ -604,21 +608,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 0623575

Please sign in to comment.