11 Commits
4.0 ... 4.2

Author SHA1 Message Date
Boris Gulay
abc3c9ea5f Fix SMTP settings do not apply.
Closes #40, closes #51.
Thanx to sooslaca, J.P.
2019-11-24 18:51:36 +03:00
Boris Gulay
148052a6d0 Add delimiter to account setup. Closes #50 2019-11-24 18:48:25 +03:00
Boris Gulay
7bb10e55d7 Update french translation. Thanx Alban 2019-10-18 00:21:42 +03:00
Boris Gulay
ac32196fc0 Better string handling. 2019-09-04 23:30:47 +03:00
Boris Gulay
ebc4324ecd Fixed login problem when server requires TLS.
Closes #47
Closes #45
2019-09-04 23:21:46 +03:00
Boris Gulay
c0a92bb436 Fixed issue in German translation. Thanx bJBM 2019-07-30 23:16:43 +03:00
Boris Gulay
652d1aaa1f Fix field names in CHECK. Thanx Tina Rosenstein 2019-07-30 23:14:30 +03:00
Boris Gulay
6f86e64442 Make preconfig work for SMTP host and port too.
Closes # 37
2019-04-16 00:20:06 +03:00
Boris Gulay
080a2ee591 Fixed non-html chars ware stripped from password.
Closes #17
2019-04-14 19:19:30 +03:00
Boris Gulay
4a20b77edb Fix incorrect field names in CHECKs (#42) 2019-04-14 17:51:01 +03:00
Boris Gulay
89791e1f49 Fix sqlite scripts. Closes #35. 2019-02-03 19:48:43 +03:00
11 changed files with 259 additions and 145 deletions

View File

@@ -18,7 +18,9 @@ CREATE TABLE IF NOT EXISTS ident_switch
varchar(64),
imap_port
int
CHECK(port > 0 AND port <= 65535),
CHECK(imap_port > 0 AND imap_port <= 65535),
imap_delimiter
char(1),
label
varchar(32),
flags
@@ -29,12 +31,12 @@ CREATE TABLE IF NOT EXISTS ident_switch
varchar(64),
smtp_port
int
CHECK(port > 0 AND port <= 65535),
UNIQUE KEY user_id_label (user_id, label),
CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT fk_identity_id FOREIGN KEY (iid) REFERENCES identities(identity_id) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY(id),
INDEX IX_ident_switch_user_id (user_id),
INDEX IX_ident_switch_iid (iid)
CHECK(smtp_port > 0 AND smtp_port <= 65535),
UNIQUE KEY user_id_label (user_id, label),
CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT fk_identity_id FOREIGN KEY (iid) REFERENCES identities(identity_id) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY(id),
INDEX IX_ident_switch_user_id (user_id),
INDEX IX_ident_switch_iid (iid)
);

5
SQL/mysql/2019112000.sql Normal file
View File

@@ -0,0 +1,5 @@
ALTER TABLE
ident_switch
ADD COLUMN
imap_delimiter
char(1);

View File

@@ -1,41 +1,43 @@
CREATE TABLE ident_switch
(
id
serial
PRIMARY KEY,
user_id
integer
NOT NULL
REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
iid
integer
NOT NULL
REFERENCES identities(identity_id) ON DELETE CASCADE ON UPDATE CASCADE
UNIQUE,
username
varchar(64),
password
varchar(64),
imap_host
varchar(64),
imap_port
integer
CHECK(port > 0 AND port <= 65535),
label
varchar(32),
flags
integer
NOT NULL
DEFAULT(0),
smtp_host
varchar(64),
smtp_port
integer
CHECK(port > 0 AND port <= 65535),
UNIQUE (user_id, label)
);
CREATE INDEX
IX_ident_switch_user_id
ON
ident_switch(user_id);
CREATE TABLE ident_switch
(
id
serial
PRIMARY KEY,
user_id
integer
NOT NULL
REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
iid
integer
NOT NULL
REFERENCES identities(identity_id) ON DELETE CASCADE ON UPDATE CASCADE
UNIQUE,
username
varchar(64),
password
varchar(64),
imap_host
varchar(64),
imap_port
integer
CHECK(imap_port > 0 AND imap_port <= 65535),
imap_delimiter
char(1),
label
varchar(32),
flags
integer
NOT NULL
DEFAULT(0),
smtp_host
varchar(64),
smtp_port
integer
CHECK(smtp_port > 0 AND smtp_port <= 65535),
UNIQUE (user_id, label)
);
CREATE INDEX
IX_ident_switch_user_id
ON
ident_switch(user_id);

View File

@@ -0,0 +1,5 @@
ALTER TABLE
ident_switch
ADD COLUMN
imap_delimiter
char(1);

View File

@@ -1,7 +1,7 @@
CREATE TABLE ident_switch
(
id
serial
integer
PRIMARY KEY,
user_id
integer
@@ -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

View File

@@ -1,25 +1,76 @@
ALTER TABLE
ident_switch
RENAME COLUMN
host
TO
imap_host;
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE
ident_switch
RENAME COLUMN
port
TO
imap_port;
ALTER TABLE ident_switch RENAME TO ident_switch_old;
ALTER TABLE
ident_switch
ADD COLUMN
smtp_host
varchar(64);
ALTER TABLE
ident_switch
ADD COLUMN
CREATE TABLE ident_switch
(
id
integer
PRIMARY KEY,
user_id
integer
NOT NULL
REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
iid
integer
NOT NULL
REFERENCES identities(identity_id) ON DELETE CASCADE ON UPDATE CASCADE
UNIQUE,
username
varchar(64),
password
varchar(64),
imap_host
varchar(64),
imap_port
integer
CHECK(imap_port > 0 AND imap_port <= 65535),
label
varchar(32),
flags
integer
NOT NULL
DEFAULT(0),
smtp_host
varchar(64),
smtp_port
int;
integer
CHECK(smtp_port > 0 AND smtp_port <= 65535),
UNIQUE (user_id, label)
);
CREATE INDEX IX_ident_switch_user_id ON ident_switch(user_id);
CREATE INDEX IX_ident_switch_iid on ident_switch(iid);
INSERT OR ROLLBACK INTO
ident_switch (
id,
user_id,
iid,
username,
password,
imap_host,
imap_port,
label,
flags,
smtp_host
)
SELECT
id,
user_id,
iid,
username,
password,
host,
port,
label,
flags,
host,
FROM
ident_switch_old;
DROP TABLE
ident_switch_old;
COMMIT;
PRAGMA foreign_keys=on;

View File

@@ -152,7 +152,7 @@ class ident_switch extends rcube_plugin
function on_smtp_connect($args)
{
$iid = $_SESSION['iid' . self::MY_POSTFIX];
if (!is_integer($iid) || $iid == -1)
if (!is_numeric($iid) || $iid == -1)
return $args;
$rc = rcmail::get_instance();
@@ -183,8 +183,6 @@ class ident_switch extends rcube_plugin
else
$args['smtp_server'] = 'tls://' . $args['smtp_server'];
}
self::write_log(print_r($args, true));
}
return $args;
@@ -209,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' => '.'),
);
}
@@ -248,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',
@@ -355,7 +355,7 @@ class ident_switch extends rcube_plugin
unset($_SESSION['createData' . self::MY_POSTFIX]);
if (!$data || count($data) == 0)
self::write_log('Object with ident_switch values not found in session for ID = ' . $args['id'] . '.');
self::write_log("Object with ident_switch values not found in session for ID = {$args['id']}.");
else
{
$data['id'] = $args['id'];
@@ -373,7 +373,7 @@ class ident_switch extends rcube_plugin
$q = $rc->db->query($sql, $args['id'], $rc->user->ID);
if ($rc->db->affected_rows($q))
self::write_log('Deleted associated information for identity with ID = ' . $args['id'] . '.');
self::write_log("Deleted associated information for identity with ID = {$args['id']}.");
return $args;
}
@@ -386,7 +386,10 @@ class ident_switch extends rcube_plugin
if (strcasecmp($_SESSION['username'], $rc->user->data['username']) !== 0)
{
if (isset($_SESSION['iid' . self::MY_POSTFIX]))
$rc->output->add_script('plugin_switchIdent_fixIdent(' . $_SESSION['iid' . self::MY_POSTFIX] . ');', 'docready');
{
$iid = $_SESSION['iid' . self::MY_POSTFIX];
$rc->output->add_script("plugin_switchIdent_fixIdent({$iid});", 'docready');
}
else
self::write_log('Special session variable with active identity ID not found.');
}
@@ -417,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';
}
}
}
}
@@ -443,7 +452,7 @@ class ident_switch extends rcube_plugin
}
// Get also password
$retVal['imap.pass'] = self::get_field_value('imap', 'password', false);
$retVal['imap.pass'] = self::get_field_value('imap', 'password', false, true);
// Parse secure settings
$retVal['flags'] = self::DB_ENABLED;
@@ -455,11 +464,12 @@ class ident_switch extends rcube_plugin
return $retVal;
}
private static function get_field_value($section, $field, $trim = true)
private static function get_field_value($section, $field, $trim = true, $html = false)
{
$retVal = rcube_utils::get_input_value(
'_ident_switch_form_' . $section . '_' . $field,
rcube_utils::INPUT_POST
"_ident_switch_form_{$section}_{$field}",
rcube_utils::INPUT_POST,
$html
);
if (!$trim)
return $retVal;
@@ -476,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)
@@ -498,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'],
@@ -540,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))
@@ -554,7 +565,30 @@ class ident_switch extends rcube_plugin
$r['username'] = $rIid['email'];
}
self::write_log('Switching mailbox to one for identity with ID = ' . $r['iid'] . ' (username = \'' . $r['username'] . '\').');
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;
@@ -565,26 +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}";
$_SESSION['storage_host'] = $r['imap_host'] ? $r['imap_host'] : 'localhost'; // Default IMAP host here!
$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'];
@@ -594,7 +618,7 @@ class ident_switch extends rcube_plugin
else
{
// TODO: Show message in browser
self::write_log('Requested remote mailbox with ID = ' . $identId . ' not found.');
self::write_log("Requested remote mailbox with ID = {$identId} not found.");
return;
}
}
@@ -640,14 +664,14 @@ class ident_switch extends rcube_plugin
$cfg = $this->get_preconfig($email);
if (is_array($cfg))
{
self::write_log('Applying predefined configuration for \'' . $email . '\'.');
self::write_log("Applying predefined configuration for '{$email}'.");
if ($cfg['host'])
{ // Parse and set host and related
$urlArr = parse_url($cfg['host']);
$record['ident_switch.form.imap.host'] = $urlArr['host'] ? rcube::Q($urlArr['host'], 'url') : '';
$record['ident_switch.form.imap.port'] = $urlArr['port'] ? intval($urlArr['port']) : '';
$record['ident_switch.form.imap.host'] = $record['ident_switch.form.smtp.host'] = $urlArr['host'] ? rcube::Q($urlArr['host'], 'url') : '';
$record['ident_switch.form.imap.port'] = $record['ident_switch.form.smtp.port'] = $urlArr['port'] ? intval($urlArr['port']) : '';
if (strcasecmp('tls', $urlArr['scheme']) === 0)
$record['ident_switch.form.imap.tls'] = true;

View File

@@ -64,4 +64,4 @@ $labels['err.host.long'] = 'Der Wert in Feld \'Servername\' ist zu lang (max. 64
$labels['err.port.num'] = 'Der Wert in Feld \'Port\' muss eine Zahl sein.';
// Value in \'Port\' field must be between 1 and 65535.
$labels['err.port.range'] = 'Der Wert in Feld \'Port\' muss 1 und 65535 liegen.';
$labels['err.port.range'] = 'Der Wert in Feld \'Port\' muss zwischen 1 und 65535 liegen.';

View File

@@ -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';

View File

@@ -4,47 +4,64 @@
*/
$labels = array();
// IMAP
$labels['form.caption'] = 'IMAP';
// Plugin ident_switch
$labels['form.common.caption'] = 'Plugin ident_switch';
// Enabled
$labels['form.enabled'] = 'Activé';
$labels['form.common.enabled'] = 'Activer';
// Label
$labels['form.label'] = 'Nom d\'affichage';
$labels['form.common.label'] = 'Nom à afficher';
// Value in \'Label\' field is too long (32 chars max).
$labels['err.label.long'] = 'La valeur du champ \'Nom à afficher\' est trop longue (32 caractères max).';
// IMAP
$labels['form.imap.caption'] = 'IMAP';
// Server host name
$labels['form.host']='Nom d\'hôte du serveur';
$labels['form.imap.host'] = 'Serveur';
// Secure connection (SSL/TLS)
$labels['form.secure']='Sécurité de la connexion';
// Secure connection (TLS)
$labels['form.imap.tls'] = 'Connexion sécurisée (TLS)';
// Port
$labels['form.port']='Port';
$labels['form.imap.port'] = 'Port';
// Username
$labels['form.username'] = 'Nom d\'utilisateur';
$labels['form.imap.username'] = 'Nom d\'utilisateur';
// Password
$labels['form.password'] = 'Mot de passe';
// Folder hierarchy delimiter
$labels['form.delimiter'] = 'Délimiteur de la hiérarchie des dossiers';
// Value in \'Label\' field of IMAP section is too long (32 chars max).
$labels['err.label.long'] = 'La valeur du champ \'Nom d\'affichage\' de la section IMAP est trop longue (32 car. max).';
// Value in \'Server host name\' field of IMAP section is too long (64 chars max).
$labels['err.host.long'] = 'La valeur du champ \'Nom d\'hôte du serveur\' de la section IMAP est trop longue (64 car. max).';
$labels['form.imap.password'] = 'Mot de passe';
// Value in \'Username\' field of IMAP section is too long (64 chars max).
$labels['err.user.long'] = 'La valeur du champ \'Nom d\'utilisateur\' de la section IMAP est trop longue (64 car. max).';
$labels['err.user.long'] = 'La valeur du champ \'Nom d\'utilisateur\' de la section IMAP est trop longue (64 caractères max).';
// Value in \'Folder hierarchy delimiter\' field of IMAP section is too long (1 char max).
$labels['err.delim.long'] = 'La valeur du champ \'Délimiteur de la hiérarchie des dossiers\' de la section IMAP est trop longue (1 car. max).';
// Value in \'Port\' field of IMAP section must be a number.
$labels['err.port.num'] = 'La valeur du champ \'Port\' de la section IMAP doit être un nombre.';
// SMTP
$labels['form.smtp.caption'] = 'SMTP';
// Value in \'Port\' field of IMAP section must be between 1 and 65535.
$labels['err.port.range'] = 'La valeur du champ \'Port\' de la section IMAP doit être comprise entre 1 et 65535.';
// Server host name
$labels['form.smtp.host'] = 'Serveur';
// Secure connection (TLS)
$labels['form.smtp.tls'] = 'Connexion sécurisée (TLS)';
// Port
$labels['form.smtp.port'] = 'Port';
// Authorization required
$labels['form.smtp.auth'] = 'Autorisation requise';
// Errors
// Value in \'Server host name\' field is too long (64 chars max).
$labels['err.host.long'] = 'La valeur du champ \'Serveur\' est trop longue (64 caractères max).';
// Value in \'Port\' field must be a number.
$labels['err.port.num'] = 'La valeur du champ \'Port\' doit être un nombre.';
// Value in \'Port\' field must be between 1 and 65535.
$labels['err.port.range'] = 'La valeur du champ \'Port\' doit être comprise entre 1 et 65535.';

View File

@@ -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'] = 'Имя пользователя';