From 148052a6d0dbbf7b27adde01a94e1ee5acce9ead Mon Sep 17 00:00:00 2001 From: Boris Gulay Date: Sun, 24 Nov 2019 18:48:25 +0300 Subject: [PATCH] Add delimiter to account setup. Closes #50 --- SQL/mysql.initial.sql | 2 + SQL/mysql/2019112000.sql | 5 +++ SQL/postgres.initial.sql | 2 + SQL/postgres/2019112000.sql | 5 +++ SQL/sqlite.initial.sql | 2 + ident_switch.php | 80 +++++++++++++++++++++++-------------- localization/en_US.inc | 3 ++ localization/ru_RU.inc | 3 ++ 8 files changed, 71 insertions(+), 31 deletions(-) create mode 100644 SQL/mysql/2019112000.sql create mode 100644 SQL/postgres/2019112000.sql diff --git a/SQL/mysql.initial.sql b/SQL/mysql.initial.sql index 7bb0c61..7130075 100644 --- a/SQL/mysql.initial.sql +++ b/SQL/mysql.initial.sql @@ -19,6 +19,8 @@ CREATE TABLE IF NOT EXISTS ident_switch imap_port int CHECK(imap_port > 0 AND imap_port <= 65535), + imap_delimiter + char(1), label varchar(32), flags diff --git a/SQL/mysql/2019112000.sql b/SQL/mysql/2019112000.sql new file mode 100644 index 0000000..2d3e4e1 --- /dev/null +++ b/SQL/mysql/2019112000.sql @@ -0,0 +1,5 @@ +ALTER TABLE + ident_switch +ADD COLUMN + imap_delimiter + char(1); \ No newline at end of file diff --git a/SQL/postgres.initial.sql b/SQL/postgres.initial.sql index 097c81d..c90f96e 100644 --- a/SQL/postgres.initial.sql +++ b/SQL/postgres.initial.sql @@ -21,6 +21,8 @@ CREATE TABLE ident_switch imap_port integer CHECK(imap_port > 0 AND imap_port <= 65535), + imap_delimiter + char(1), label varchar(32), flags diff --git a/SQL/postgres/2019112000.sql b/SQL/postgres/2019112000.sql new file mode 100644 index 0000000..2d3e4e1 --- /dev/null +++ b/SQL/postgres/2019112000.sql @@ -0,0 +1,5 @@ +ALTER TABLE + ident_switch +ADD COLUMN + imap_delimiter + char(1); \ No newline at end of file diff --git a/SQL/sqlite.initial.sql b/SQL/sqlite.initial.sql index b82db8a..474726f 100644 --- a/SQL/sqlite.initial.sql +++ b/SQL/sqlite.initial.sql @@ -21,6 +21,8 @@ CREATE TABLE ident_switch imap_port integer CHECK(imap_port > 0 AND imap_port <= 65535), + imap_delimiter + char(1), label varchar(32), flags diff --git a/ident_switch.php b/ident_switch.php index f0fb4c6..0e89fdf 100644 --- a/ident_switch.php +++ b/ident_switch.php @@ -207,6 +207,7 @@ class ident_switch extends rcube_plugin $prefix . 'tls' => array('type' => 'checkbox'), $prefix . 'username' => array('type' => 'text', 'size' => 64, 'placeholder' => $record['email']), $prefix . 'password' => array('type' => 'password', 'size' => 64), + $prefix . 'delimiter' => array('type' => 'text', 'size' => 1, 'placeholder' => '.'), ); } @@ -246,6 +247,7 @@ class ident_switch extends rcube_plugin 'label' => 'common.label', 'imap_host' => 'imap.host', 'imap_port' => 'imap.port', + 'imap_delimiter' => 'imap.delimiter', 'username' => 'imap.username', 'password' => 'imap.password', 'smtp_host' => 'smtp.host', @@ -418,23 +420,29 @@ class ident_switch extends rcube_plugin $retVal['err'] = 'port.range'; else { - $retVal['imap.user'] = self::get_field_value('imap', 'username'); - if (strlen($retVal['imap.user']) > 64) - $retVal['err'] = 'user.long'; + $retVal['imap.delimiter'] = self::get_field_value('imap', 'delimiter'); + if (strlen($retVal['imap.delimiter']) > 1) + $retVal['err'] = 'delim.long'; else { - $retVal['smtp.host'] = self::get_field_value('smtp', 'host'); - if (strlen($retVal['smtp.host']) > 64) - $retVal['err'] = 'host.long'; + $retVal['imap.user'] = self::get_field_value('imap', 'username'); + if (strlen($retVal['imap.user']) > 64) + $retVal['err'] = 'user.long'; else { - $retVal['smtp.port'] = self::get_field_value('smtp', 'port'); - if ($retVal['smtp.port'] && !ctype_digit($retVal['smtp.port'])) - $retVal['err'] = 'port.num'; + $retVal['smtp.host'] = self::get_field_value('smtp', 'host'); + if (strlen($retVal['smtp.host']) > 64) + $retVal['err'] = 'host.long'; else { - if ($retVal['smtp.port'] && ($retVal['smtp.port'] <= 0 || $retVal['smtp.port'] > 65535)) - $retVal['err'] = 'port.range'; + $retVal['smtp.port'] = self::get_field_value('smtp', 'port'); + if ($retVal['smtp.port'] && !ctype_digit($retVal['smtp.port'])) + $retVal['err'] = 'port.num'; + else + { + if ($retVal['smtp.port'] && ($retVal['smtp.port'] <= 0 || $retVal['smtp.port'] > 65535)) + $retVal['err'] = 'port.range'; + } } } } @@ -478,14 +486,14 @@ class ident_switch extends rcube_plugin { // Record already exists, will update it $sql = 'UPDATE ' . $rc->db->table_name(self::TABLE) . - ' SET flags = ?, label = ?, imap_host = ?, imap_port = ?, username = ?, password = ?, smtp_host = ?, smtp_port = ?, user_id = ?, iid = ?' . + ' SET flags = ?, label = ?, imap_host = ?, imap_port = ?, imap_delimiter = ?, username = ?, password = ?, smtp_host = ?, smtp_port = ?, user_id = ?, iid = ?' . ' WHERE id = ?'; } else if ($data['flags'] & self::DB_ENABLED) { // No record exists, create new one $sql = 'INSERT INTO ' . $rc->db->table_name(self::TABLE) . - '(flags, label, imap_host, imap_port, username, password, smtp_host, smtp_port, user_id, iid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; + '(flags, label, imap_host, imap_port, imap_delimiter, username, password, smtp_host, smtp_port, user_id, iid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; } if ($sql) @@ -500,6 +508,7 @@ class ident_switch extends rcube_plugin $data['label'], $data['imap.host'], $data['imap.port'], + $data['imap.delimiter'], $data['imap.user'], $data['imap.pass'], $data['smtp.host'], @@ -542,7 +551,7 @@ class ident_switch extends rcube_plugin } else { - $sql = 'SELECT imap_host, flags, imap_port, username, password, iid FROM ' . $rc->db->table_name(self::TABLE) . ' WHERE id = ? AND user_id = ?'; + $sql = 'SELECT imap_host, flags, imap_port, imap_delimiter, username, password, iid FROM ' . $rc->db->table_name(self::TABLE) . ' WHERE id = ? AND user_id = ?'; $q = $rc->db->query($sql, $identId ,$rc->user->ID); $r = $rc->db->fetch_assoc($q); if (is_array($r)) @@ -558,6 +567,29 @@ class ident_switch extends rcube_plugin self::write_log("Switching mailbox to one for identity with ID = {$r['iid']} (username = '{$r['username']}')."); + if ($_SESSION['username'] == $rc->user->data['username']) + { // If we are in default account now - save values + foreach ($_SESSION as $k => $v) + { + if (strncasecmp($k, 'storage', 7) === 0 && substr_compare($k, self::MY_POSTFIX, -$my_postfix_len, $my_postfix_len) !== 0) + { + if (!$_SESSION[$k . self::MY_POSTFIX]) + $_SESSION[$k . self::MY_POSTFIX] = $_SESSION[$k]; + + $rc->session->remove($k); + } + } + + $moreToSave = Array('password', 'imap_delimiter'); + foreach ($moreToSave as $k) + { + if (!$_SESSION[$k . self::MY_POSTFIX]) + $_SESSION[$k . self::MY_POSTFIX] = $_SESSION[$k]; + + $rc->session->remove($k); + } + } + $def_port = 143; // Default IMAP port here! $ssl = null; if ($r['flags'] & self::DB_SECURE_IMAP_TLS) @@ -567,30 +599,16 @@ class ident_switch extends rcube_plugin } $port = $r['imap_port'] ? $r['imap_port'] : $def_port; - // If we are in default account now - // save everything with STORAGE - if ($_SESSION['username'] == $rc->user->data['username']) - { - foreach ($_SESSION as $k => $v) - { - if (strncasecmp($k, 'storage', 7) === 0 && substr_compare($k, self::MY_POSTFIX, -$my_postfix_len, $my_postfix_len) !== 0) - { - if (!$_SESSION[$k . self::MY_POSTFIX]) - $_SESSION[$k . self::MY_POSTFIX] = $_SESSION[$k]; - $rc->session->remove($k); - } - } - } - if (!$_SESSION['password' . self::MY_POSTFIX]) - $_SESSION['password' . self::MY_POSTFIX] = $_SESSION['password']; - $host = $r['imap_host'] ? $r['imap_host'] : 'localhost'; // Default IMAP host here! if ($ssl) $host = "{$ssl}://{$host}"; + $delimiter = $r['delimiter'] ? $r['delimiter'] : '.'; // Default delimiter here + $_SESSION['storage_host'] = $host; $_SESSION['storage_ssl'] = $ssl; $_SESSION['storage_port'] = $port; + $_SESSION['imap_delimiter'] = $delimiter; $_SESSION['username'] = $r['username']; $_SESSION['password'] = $r['password']; $_SESSION['iid' . self::MY_POSTFIX] = $r['iid']; diff --git a/localization/en_US.inc b/localization/en_US.inc index 06dcfe7..49a1582 100644 --- a/localization/en_US.inc +++ b/localization/en_US.inc @@ -29,6 +29,9 @@ $labels['form.imap.tls'] = 'Secure connection (TLS)'; // Port $labels['form.imap.port'] = 'Port'; +// Folder hierarchy delimiter +$labels['form.delimiter'] = 'Folder hierarchy delimiter'; + // Username $labels['form.imap.username'] = 'Username'; diff --git a/localization/ru_RU.inc b/localization/ru_RU.inc index 46c309e..6054908 100644 --- a/localization/ru_RU.inc +++ b/localization/ru_RU.inc @@ -29,6 +29,9 @@ $labels['form.imap.tls'] = 'Безопасное подключение (TLS)'; // Port $labels['form.imap.port'] = 'Порт'; +// Folder hierarchy delimiter +$labels['form.delimiter'] = 'Разделитель в иерархии папок'; + // Username $labels['form.imap.username'] = 'Имя пользователя';