59 Commits
0.6 ... 3.2

Author SHA1 Message Date
Boris Gulay
a437a107ba Drop NOT NULL for username column.
Someone please check MySQL script!
2018-07-16 18:55:12 +03:00
Boris Gulay
8b2798e412 Show account selection only for MAIL task.
Optimize JS scripts.
2018-03-17 23:03:42 +03:00
Boris Gulay
c28305509f Fix identity form.
Closes #22.
2018-03-17 22:10:00 +03:00
Boris Gulay
8a8bca1ae5 Make identity selection work with classic skin. 2018-03-17 17:47:32 +03:00
Boris Gulay
28d7841af5 Fix description of compatibility for v1.3 branch. 2018-03-17 17:16:18 +03:00
Boris Gulay
707abf2a81 Initial release for Roundcube 1.3.
Fixed compatibility with new jQuery (combobox not displayed). Closes #20.
Pumped up Roundcube version requirement.
2018-03-17 17:09:16 +03:00
Boris Gulay
c90efaa00b Readme updated. 2018-03-12 23:21:38 +03:00
Boris Gulay
e4aeef2e07 Fixed bug with identity updating. 2018-03-12 23:14:06 +03:00
Boris Gulay
e19b33a842 Return error message in a modern way. 2018-03-11 01:11:24 +03:00
Boris Gulay
d540de77ff Some code cleanup. 2018-03-10 00:44:12 +03:00
Boris Gulay
913065548b New member fuction to write to log. Make code easy to understand. 2018-03-10 00:30:58 +03:00
Boris Gulay
683b02027b Change some class variables to constants. Better style and more readable. 2018-03-10 00:26:57 +03:00
Boris Gulay
7111e9e759 Fixed saving IMAP data for new identity (now cound I miss this?!). 2018-03-10 00:12:38 +03:00
Boris Gulay
f5f3fbdf90 Dutch translation added. Thanx to Dave, closes #14. 2016-10-18 22:23:16 +03:00
Boris Gulay
fcdff0ccc7 German translation added. Thanx to John, closes #13. 2016-10-18 22:22:33 +03:00
Boris Gulay
0e0b00dea2 Change line endings to unix. 2016-10-18 22:12:40 +03:00
Boris Gulay
c76942a6cd Fixed typo in language files. Thanx to John, see #13. 2016-10-18 22:07:21 +03:00
Boris Gulay
17044fe501 Fixed strange layout in FF because of special styles for Mozilla. Should not affect anything else. Closes #11. 2016-10-16 22:00:37 +03:00
Boris Gulay
f644b80c0e Added minified version if JS file. 2016-10-16 14:11:15 +03:00
Boris Gulay
dd2d8e10a4 Rewrite all git_input_value to single syntax. 2016-10-16 13:44:51 +03:00
Boris Gulay
8ca4d3bf56 Remove unnessecery logging. 2016-10-16 13:38:47 +03:00
Boris Gulay
829615ec5d Pass mbox name with switch command. 2016-10-16 13:32:02 +03:00
Boris Gulay
6285d0bffd Always reset selection to INBOX after switch. Closes #12. 2016-10-16 13:31:15 +03:00
Boris Gulay
a3ccfb5a8f Hide row for readonly field with JS. 2016-10-11 00:49:24 +03:00
Boris Gulay
08f6c86773 Fix restoring STORAGE options for default identity. Closes #8. 2016-10-10 00:34:16 +03:00
Boris Gulay
8b527820e9 Fixed shameful bug on displaying accounts list. 2016-10-10 00:11:41 +03:00
Boris Gulay
b3adf0842f Added functionality for preconfigured mail settings. Closes #7. 2016-06-23 00:34:22 +03:00
Boris Gulay
deac908a77 Fixed bug on plugin strtup (it was always sure we are impersonating). 2016-06-22 23:23:16 +03:00
Boris Gulay
f1874e3fe7 Localization for Italian added. Thanx to Dario Pezzi, closes #10. 2016-06-20 23:24:34 +03:00
Boris Gulay
5096826621 Added French translation. Thanx to Mathieu Ambrosy, closes #9. 2016-06-19 00:27:15 +03:00
Boris Gulay
7a97816d1c Username is not a required field anymore. If empty - email from identity
is used.
2016-06-02 16:17:48 +03:00
Boris Gulay
6849c47fd9 Renamed initial file for PgSQL because of incorrect DB driver name. 2016-06-02 15:56:07 +03:00
Boris Gulay
ecbadcd866 Added suggestions for default values in UI (interactive). Fixed bug when
Security combobox was not disabled.
2016-06-02 15:24:08 +03:00
Boris Gulay
9ebacf0d61 Fix: impossible to send messages from default identity if SMTP auth is required. Thanx to Galina Gulay. 2016-05-31 00:01:08 +03:00
Boris Gulay
ab7bae56b5 Fixed unable to switch to default ident after two or more time switching
between another identities.
2016-05-30 01:45:40 +03:00
Boris Gulay
d93dd2be03 Fixed set of errors when two identities have same user name. Closes #4,
thanx Wouter de Geus.
2016-05-30 01:41:50 +03:00
Boris Gulay
f7b650db3e Changed the way connection security is set. Now supporting SSL and TLS
separatly. Closes #5, thanx to Wouter de Geus.
2016-05-28 18:21:27 +03:00
Boris Gulay
4da9b48776 Added missing log file name. Closes #3, thanx to Wouter de Geus. 2016-05-28 17:22:57 +03:00
Boris Gulay
d667518d1f Fixed vary dangerous error when while editing settings ALL records ware
updated instead of only one.
2016-05-28 00:29:35 +03:00
Boris Gulay
5ad75ce989 Field validation code refactored. 2016-05-28 00:22:57 +03:00
Boris Gulay
dbadde3333 Fixed validation error when editing identity with Enabled not checked. 2016-05-28 00:22:57 +03:00
Boris Gulay
b499688318 Fixed #2 validation error when saving default identity (thanx Wouter de
Geus).
2016-05-28 00:22:49 +03:00
Boris Gulay
6cfbeab7f0 Added RUS messages for validation errors. 2016-05-27 23:42:46 +03:00
Boris Gulay
b10f3625c2 Added string in ENG for all validation erros. 2016-05-27 23:25:26 +03:00
Boris Gulay
f28fb5bb58 Added initial script for MySQL (thanx Wouter de Geus). Closes #1. 2016-05-27 22:46:58 +03:00
Boris Gulay
1b424b4348 Fixed check for port number (cannot be 0). 2016-05-21 01:22:41 +03:00
Boris Gulay
6705312240 Removed NOT NULL constraints in initial file. 2016-05-21 01:22:41 +03:00
Boris Gulay
05ea494fa6 README.md edited online with Bitbucket 2016-05-20 20:42:22 +00:00
Boris Gulay
5a704f2717 Fixed double encryption of pwd when changing record (cannot connect
after change).
2016-05-20 23:40:48 +03:00
Boris Gulay
01edffa66b Removed unused skin-related styles. 2016-05-20 23:21:15 +03:00
Boris Gulay
9367409f36 Russian translation added. 2016-05-20 23:21:15 +03:00
Boris Gulay
bbf28eed57 Label and host are not required from now. 2016-05-20 23:21:15 +03:00
Boris Gulay
ec71910156 Done better checks and saving NULL instead of empty string. 2016-05-20 23:21:15 +03:00
Boris Gulay
f700593730 Added data validation for identity form. 2016-05-20 23:21:15 +03:00
Boris Gulay
9db4f48593 Do now show connection options for default identity. 2016-05-20 23:21:15 +03:00
Boris Gulay
2b9c43858e Fixed bug when account selected is shown twice on settings pages. 2016-05-20 23:21:15 +03:00
Boris Gulay
95716183d7 Make fields on form disabled if Enabled not checked. 2016-05-20 23:21:15 +03:00
Boris Gulay
40e7f5664e Missing string added. 2016-05-20 23:21:15 +03:00
Boris Gulay
ea62869891 README.md edited online with Bitbucket 2016-05-20 16:06:32 +00:00
25 changed files with 945 additions and 184 deletions

View File

@@ -4,3 +4,15 @@ ident_switch plugin for Roundcube
This plugin allows users to switch between different accounts (including remote) in single Roundcube session. This plugin allows users to switch between different accounts (including remote) in single Roundcube session.
*Inspired by identities_imap plugin that is no longer supported.* *Inspired by identities_imap plugin that is no longer supported.*
### Where to start ###
* In settigs interface create new identity.
* For all identities except default you will see new section of settings - IMAP. Enter data required to connect to remote server. Don't forget to check Enabled check box.
* After you have created at least one identity with active IMAP settings you will see combobox in the top right corner instead of plain text field with account name. It will allows you to switch to another account.
### Version compatibility ###
* Branch 1.X - for Roundcube v1.1
* Branch 2.X - for Roundcube v1.2
* Branch 3.X - for Roundcube v1.3
Please specify verion like "~2.0" in your composer.json file for ident_switch requirement. In this case you will stay inside compatible branch until you manually update ypur Roundcube installation.

37
SQL/mysql.initial.sql Normal file
View File

@@ -0,0 +1,37 @@
CREATE TABLE IF NOT EXISTS ident_switch
(
id
int(10) UNSIGNED
NOT NULL
AUTO_INCREMENT,
user_id
int(10) UNSIGNED
NOT NULL,
iid
int(10) UNSIGNED
NOT NULL,
username
varchar(64),
password
varchar(64),
host
varchar(64),
port
int
CHECK(port > 0 AND port <= 65535),
delimiter
char(1),
label
varchar(32),
flags
int
NOT NULL
DEFAULT 0,
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/2016060200.sql Normal file
View File

@@ -0,0 +1,5 @@
ALTER TABLE
ident_switch
MODIFY
username
varchar(64);

6
SQL/mysql/2018071600.sql Normal file
View File

@@ -0,0 +1,6 @@
ALTER TABLE
ident_switch
MODIFY
username
varchar(64)
NULL;

View File

@@ -13,21 +13,18 @@ CREATE TABLE ident_switch
REFERENCES identities(identity_id) ON DELETE CASCADE ON UPDATE CASCADE REFERENCES identities(identity_id) ON DELETE CASCADE ON UPDATE CASCADE
UNIQUE, UNIQUE,
username username
varchar(64) varchar(64),
NOT NULL,
password password
varchar(64), varchar(64),
host host
varchar(64) varchar(64),
NOT NULL,
port port
integer integer
CHECK(port > 0 AND port <= 65535), CHECK(port > 0 AND port <= 65535),
delimiter delimiter
char(1), char(1),
label label
varchar(32) varchar(32),
NOT NULL,
flags flags
integer integer
NOT NULL NOT NULL

View File

@@ -0,0 +1,11 @@
ALTER TABLE
ident_switch
ALTER COLUMN
host
DROP NOT NULL;
ALTER TABLE
ident_switch
ALTER COLUMN
label
DROP NOT NULL;

View File

@@ -0,0 +1,5 @@
ALTER TABLE
ident_switch
ALTER COLUMN
username
DROP NOT NULL;

View File

@@ -0,0 +1,5 @@
ALTER TABLE
ident_switch
ALTER COLUMN
username
DROP NOT NULL;

View File

@@ -30,7 +30,7 @@
}, },
"extra": { "extra": {
"roundcube": { "roundcube": {
"min-version": "1.1", "min-version": "1.3",
"sql-dir": "SQL" "sql-dir": "SQL"
} }
} }

View File

@@ -1,2 +1,29 @@
<?php <?php
/*
* Preconfigured settings for different mail domains.
* Appropriate set of values is searched by mapping domain of email (from identity) to array key.
*/
$rcmail_config['ident_switch.preconfig'] = array(
# Domain part of email address
'domain.tld' => array(
# Hostname, use ssl:// or tls:// notation if needed, for no security use imap:// (must always start with scheme).
# Required.
'host' => 'imap://mail.domain.tld',
# Login name, can be 'email' (full address from identity), 'mbox' (only mailbox part).
# Any other value is threated ad 'not specified' (default).
'user' => 'email',
# Are specified settings locked in interface or not.
# Default - false.
'readonly' => true
),
'another.tld' => array(
'host' => 'tls://mail.another.tld',
'user' => 'mbox',
),
);

10
ident_switch-form.js Normal file
View File

@@ -0,0 +1,10 @@
/*
* This is part of identity_imap plugin
*/
$(function() {
$("INPUT[name='_ident_switch.form.enabled']").change();
$("SELECT[name='_ident_switch.form.secure']").change();
plugin_switchIdent_processPreconfig();
});

1
ident_switch-form.min.js vendored Normal file
View File

@@ -0,0 +1 @@
$(function(){$("INPUT[name='_ident_switch.form.enabled']").change();$("SELECT[name='_ident_switch.form.secure']").change();plugin_switchIdent_processPreconfig();});

89
ident_switch-switch.js Normal file
View File

@@ -0,0 +1,89 @@
/*
* This is part of identity_imap plugin
*/
$(function() {
$sw = $('#plugin-ident_switch-account');
isOk = false;
switch (rcmail.env['skin']) {
case 'larry':
isOk = plugin_switchIdent_addCbLarry($sw);
break;
case 'classic':
isOk = plugin_switchIdent_addCbClassic($sw);
break;
}
if (isOk)
$sw.show();
$("INPUT[name='_ident_switch.form.enabled']").change();
$("SELECT[name='_ident_switch.form.secure']").change();
plugin_switchIdent_processPreconfig();
});
function plugin_switchIdent_addCbLarry($sw) {
var $truName = $('.topright .username');
if ($truName.length > 0) {
if ($sw.length > 0) {
$sw.prependTo('.topright');
$truName.hide();
return true;
}
}
return false;
}
function plugin_switchIdent_addCbClassic($sw) {
var $taskBar = $('#taskbar');
if ($taskBar.length > 0) {
$taskBar.prepend($sw);
return true;
}
return false;
}
function plugin_switchIdent_processPreconfig() {
var disFld = $("INPUT[name='_ident_switch.form.readonly']");
disFld.parentsUntil("TABLE", "TR").hide();
var disVal = disFld.val();
if (disVal > 0) {
$("INPUT[name='_ident_switch.form.host']").prop("disabled", true);
$("SELECT[name='_ident_switch.form.secure']").prop("disabled", true);
$("INPUT[name='_ident_switch.form.port']").prop("disabled", true);
}
if (2 == disVal) {
$("INPUT[name='_ident_switch.form.username']").prop("disabled", true);
}
}
function plugin_switchIdent_enabled_onChange(e) {
var $enFld = $("INPUT[name='_ident_switch.form.enabled']");
$("INPUT[name!='_ident_switch.form.enabled'], SELECT", $enFld.parents("FIELDSET")).prop("disabled", !$enFld.is(":checked"));
plugin_switchIdent_processPreconfig();
}
function plugin_switchIdent_secure_onChange(e) {
var $secSel = $("SELECT[name='_ident_switch.form.secure']");
var $portFld = $("INPUT[name='_ident_switch.form.port']");
if ('SSL' === $secSel.val().toUpperCase())
$portFld.attr("placeholder", 993);
else
$portFld.attr("placeholder", 143);
}
function plugin_switchIdent_switch(val) {
rcmail.http_post('plugin.ident_switch.switch', { '_ident-id': val, '_mbox': rcmail.env.mailbox });
}
function plugin_switchIdent_fixIdent(iid) {
if (parseInt(iid) > 0)
$("#_from").val(iid);
}

15
ident_switch-switch.min.js vendored Normal file
View File

@@ -0,0 +1,15 @@
$(function(){$sw=$('#plugin-ident_switch-account');isOk=false;switch(rcmail.env['skin']){case'larry':isOk=plugin_switchIdent_addCbLarry($sw);break;case'classic':isOk=plugin_switchIdent_addCbClassic($sw);break;}
if(isOk)
$sw.show();$("INPUT[name='_ident_switch.form.enabled']").change();$("SELECT[name='_ident_switch.form.secure']").change();plugin_switchIdent_processPreconfig();});function plugin_switchIdent_addCbLarry($sw){var $truName=$('.topright .username');if($truName.length>0){if($sw.length>0){$sw.prependTo('.topright');$truName.hide();return true;}}
return false;}
function plugin_switchIdent_addCbClassic($sw){var $taskBar=$('#taskbar');if($taskBar.length>0){$taskBar.prepend($sw);return true;}
return false;}
function plugin_switchIdent_processPreconfig(){var disFld=$("INPUT[name='_ident_switch.form.readonly']");disFld.parentsUntil("TABLE","TR").hide();var disVal=disFld.val();if(disVal>0){$("INPUT[name='_ident_switch.form.host']").prop("disabled",true);$("SELECT[name='_ident_switch.form.secure']").prop("disabled",true);$("INPUT[name='_ident_switch.form.port']").prop("disabled",true);}
if(2==disVal){$("INPUT[name='_ident_switch.form.username']").prop("disabled",true);}}
function plugin_switchIdent_enabled_onChange(e){var $enFld=$("INPUT[name='_ident_switch.form.enabled']");$("INPUT[name!='_ident_switch.form.enabled'], SELECT",$enFld.parents("FIELDSET")).prop("disabled",!$enFld.is(":checked"));plugin_switchIdent_processPreconfig();}
function plugin_switchIdent_secure_onChange(e){var $secSel=$("SELECT[name='_ident_switch.form.secure']");var $portFld=$("INPUT[name='_ident_switch.form.port']");if('SSL'===$secSel.val().toUpperCase())
$portFld.attr("placeholder",993);else
$portFld.attr("placeholder",143);}
function plugin_switchIdent_switch(val){rcmail.http_post('plugin.ident_switch.switch',{'_ident-id':val,'_mbox':rcmail.env.mailbox});}
function plugin_switchIdent_fixIdent(iid){if(parseInt(iid)>0)
$("#_from").val(iid);}

View File

@@ -1,20 +0,0 @@
/*
* This is part of identity_imap plugin
*/
$(function() {
if ($('#plugin-ident_switch-account').size() > 0) {
$('#plugin-ident_switch-account').prependTo('.topright');
$('.topright .username').hide();
$('#plugin-ident_switch-account').show();
}
});
function plugin_switchIdent_switch(val) {
console.log("qwe1");
rcmail.http_post('plugin.ident_switch.switch', { '_ident-id': val });
}
function plugin_switchIdent_fixIdent(iid) {
if (parseInt(iid) > 0)
$("#_from").val(iid);
}

View File

@@ -12,12 +12,13 @@ class ident_switch extends rcube_plugin
{ {
public $task='?(?!login|logout).*'; public $task='?(?!login|logout).*';
private $table = 'ident_switch'; const TABLE = 'ident_switch';
private $my_postfix = '_iswitch'; const MY_POSTFIX = '_iswitch';
// Flags user in database // Flags user in database
private $db_enabled = 1; const DB_ENABLED = 1;
private $db_secure = 2; const DB_SECURE_SSL = 2;
const DB_SECURE_TLS = 4;
function init() function init()
{ {
@@ -26,6 +27,8 @@ class ident_switch extends rcube_plugin
$this->add_hook('smtp_connect', array($this, 'on_smtp_connect')); $this->add_hook('smtp_connect', array($this, 'on_smtp_connect'));
$this->add_hook('identity_form', array($this, 'on_identity_form')); $this->add_hook('identity_form', array($this, 'on_identity_form'));
$this->add_hook('identity_update', array($this, 'on_identity_update')); $this->add_hook('identity_update', array($this, 'on_identity_update'));
$this->add_hook('identity_create', array($this, 'on_identity_create'));
$this->add_hook('identity_create_after', array($this, 'on_identity_create_after'));
$this->add_hook('identity_delete', array($this, 'on_identity_delete')); $this->add_hook('identity_delete', array($this, 'on_identity_delete'));
$this->add_hook('template_object_composeheaders', array($this, 'on_template_object_composeheaders')); $this->add_hook('template_object_composeheaders', array($this, 'on_template_object_composeheaders'));
@@ -35,9 +38,8 @@ class ident_switch extends rcube_plugin
function on_startup($args) function on_startup($args)
{ {
$rc = rcmail::get_instance(); $rc = rcmail::get_instance();
error_log('Task: ' . $args['task'] . ', action: ' . $args['action']);
if (strcasecmp($rc->user->data['username'], $_SESSION['username']) !== 1) if (strcasecmp($rc->user->data['username'], $_SESSION['username']) !== 0)
{ // We are impersonating { // We are impersonating
$rc->config->set('imap_cache', null); $rc->config->set('imap_cache', null);
$rc->config->set('messages_cache', false); $rc->config->set('messages_cache', false);
@@ -55,32 +57,75 @@ class ident_switch extends rcube_plugin
function on_render_page($args) function on_render_page($args)
{ {
$rc = rcmail::get_instance(); $rc = rcmail::get_instance();
error_log('Template: ' . $args['template']);
switch ($rc->task)
{
case 'mail':
$this->render_switch($rc, $args);
case 'settings':
$this->include_script('ident_switch-form.js');
break;
}
return $args;
}
private function render_switch($rc, $args)
{
// Currently selected identity
$iid_s = $_SESSION['iid' . self::MY_POSTFIX];
$iid = 0;
if (is_int($iid_s))
$iid = $iid_s;
elseif ($iid_s === '-1')
$iid = -1;
elseif (ctype_digit($iid_s))
$iid = intval($iid_s);
// Get list of alternative accounts // Get list of alternative accounts
$sOpt = ''; $sOpt = '';
$sql = 'SELECT id, label, username FROM ' . $rc->db->table_name($this->table) . ' WHERE user_id = ? AND flags & ? > 0'; $sql = 'SELECT id, iid, label, username FROM ' . $rc->db->table_name(self::TABLE) . ' WHERE user_id = ? AND flags & ? > 0';
$q = $rc->db->query($sql, $rc->user->data['user_id'], $this->db_enabled); $qRec = $rc->db->query($sql, $rc->user->data['user_id'], self::DB_ENABLED);
while ($r = $rc->db->fetch_assoc($q)) while ($r = $rc->db->fetch_assoc($qRec))
{ {
$opts = array('value' => $r['id']); $opts = array('value' => $r['id']);
if (strcasecmp($_SESSION['username'], $r['username']) === 0) if ($iid == $r['iid'])
$opts['selected'] = 'selected'; $opts['selected'] = 'selected';
// Make label
$lbl = $r['label'];
if (!$lbl)
{
if (!$r['username'])
{ // Load email from identity
$sql = 'SELECT email FROM ' . $rc->db->table_name('identities') . ' WHERE identity_id = ?';
$q = $rc->db->query($sql, $r['iid']);
$rIid = $rc->db->fetch_assoc($q);
$r['username'] = $rIid['email'];
}
if (strpos($r['username'], '@') === false)
$lbl = $r['username'] . '@' . ($r['host'] ? $r['host'] : 'localhost');
else
$lbl = $r['username'];
}
$sOpt .= html::tag( $sOpt .= html::tag(
'option', 'option',
$opts, $opts,
$r['label'] rcube::Q($lbl)
); );
} }
// Render UI if user has extra accounts // Render UI if user has extra accounts
if (!empty($sOpt)) if (!empty($sOpt))
{ {
// Add main account // Add main account
$opts = array('value' => -1); $opts = array('value' => -1);
if (strcasecmp($_SESSION['username'], $rc->user->data['username']) === 0) if ($iid <= 0)
$opts['selected'] = 'selected'; $opts['selected'] = 'selected';
$sOpt = html::tag( $sOpt = html::tag(
@@ -89,20 +134,18 @@ class ident_switch extends rcube_plugin
$_SESSION['global_alias'] ? $_SESSION['global_alias'] : $rc->user->data['username'] $_SESSION['global_alias'] ? $_SESSION['global_alias'] : $rc->user->data['username']
) . $sOpt; ) . $sOpt;
$this->include_script('ident_switch.js'); $this->include_script('ident_switch-switch.js');
$sw = html::tag( $sw = html::tag(
'select', 'select',
array( array(
'id' => 'plugin-ident_switch-account', 'id' => 'plugin-ident_switch-account',
'style' => 'display: none;', 'style' => 'display: none; padding: 0;',
'onchange' => 'plugin_switchIdent_switch(this.value);', 'onchange' => 'plugin_switchIdent_switch(this.value);',
), ),
$sOpt $sOpt
); );
$rc->output->add_footer($sw); $rc->output->add_footer($sw);
} }
return $args;
} }
function on_smtp_connect($args) function on_smtp_connect($args)
@@ -111,12 +154,12 @@ class ident_switch extends rcube_plugin
// TODO: Rewrite with full settings! // TODO: Rewrite with full settings!
if (strcasecmp($rc->user->data['username'], $_SESSION['username']) !== 1) if (strcasecmp($rc->user->data['username'], $_SESSION['username']) !== 0)
{ {
if ($args['smtp_user'] == '%u') if ($args['smtp_user'] == '%u')
$args['smtp_user'] = $rc->user->data['username']; $args['smtp_user'] = $rc->user->data['username'];
if ($args['smtp_pass'] == '%p') if ($args['smtp_pass'] == '%p')
$args['smtp_pass'] = $rc->decrypt($_SESSION['password' . $this->my_postfix]); $args['smtp_pass'] = $rc->decrypt($_SESSION['password' . self::MY_POSTFIX]);
} }
return $args; return $args;
@@ -125,27 +168,17 @@ class ident_switch extends rcube_plugin
function on_identity_form($args) function on_identity_form($args)
{ {
$rc = rcmail::get_instance(); $rc = rcmail::get_instance();
$this->add_texts('localization');
// Create our field set // Do not show options for default identity
$args['form']['ident_switch'] = array( if (strcasecmp($args['record']['email'], $rc->user->data['username']) === 0)
'name' => $this->gettext('form.caption'), return $args;
'content' => array(
'ident_switch.form.enabled' => array('type' => 'checkbox'), $this->add_texts('localization');
'ident_switch.form.label' => array('type' => 'text', 'size' => 32),
'ident_switch.form.host' => array('type' => 'text', 'size' => 64),
'ident_switch.form.secure' => array('type' => 'checkbox'),
'ident_switch.form.port' => array('type' => 'text', 'size' => 5),
'ident_switch.form.username' => array('type' => 'text', 'size' => 64),
'ident_switch.form.password' => array('type' => 'password', 'size' => 64),
'ident_switch.form.delimiter' => array('type' => 'text', 'size' => 1),
),
);
// Load data if exists // Load data if exists
if (isset($args['record']['identity_id'])) if (isset($args['record']['identity_id']))
{ {
$sql = 'SELECT * FROM ' . $rc->db->table_name($this->table) . ' WHERE iid = ? AND user_id = ?'; $sql = 'SELECT * FROM ' . $rc->db->table_name(self::TABLE) . ' WHERE iid = ? AND user_id = ?';
$q = $rc->db->query($sql, $args['record']['identity_id'], $rc->user->ID); $q = $rc->db->query($sql, $args['record']['identity_id'], $rc->user->ID);
$r = $rc->db->fetch_assoc($q); $r = $rc->db->fetch_assoc($q);
if ($r) if ($r)
@@ -154,13 +187,72 @@ class ident_switch extends rcube_plugin
$args['record']['ident_switch.form.' . $k] = $v; $args['record']['ident_switch.form.' . $k] = $v;
// Parse flags // Parse flags
if ($r['flags'] & $this->db_enabled) if ($r['flags'] & self::DB_ENABLED)
$args['record']['ident_switch.form.enabled'] = true; $args['record']['ident_switch.form.enabled'] = true;
if ($r['flags'] & $this->db_secure) if ($r['flags'] & self::DB_SECURE_TLS) // TLS has priority
$args['record']['ident_switch.form.secure'] = true; $args['record']['ident_switch.form.secure'] = 'tls';
elseif ($r['flags'] & self::DB_SECURE_SSL)
$args['record']['ident_switch.form.secure'] = 'ssl';
// Set readonly if needed
$cfg = $this->get_preconfig($args['record']['email']);
if (is_array($cfg) && $cfg['readonly'])
{
$args['record']['ident_switch.form.readonly'] = 1;
if (in_array(strtoupper($cfg['user']), array('EMAIL', 'MBOX')))
$args['record']['ident_switch.form.readonly'] = 2;
}
}
else
$this->apply_preconfig($args['record']);
}
// Create our field set
// Do that manually decause standard processing shows hidden fields (WTF?)
$fieldset = array(
'ident_switch.form.enabled' => array('type' => 'checkbox', 'onchange' => 'plugin_switchIdent_enabled_onChange();'),
'ident_switch.form.label' => array('type' => 'text', 'size' => 32, 'placeholder' => $args['record']['email']),
'ident_switch.form.host' => array('type' => 'text', 'size' => 64, 'placeholder' => 'localhost'),
'ident_switch.form.secure' => array(
'type' => 'select',
'options' => array('ssl' => 'SSL', 'tls' => 'TLS'),
'onchange' => 'plugin_switchIdent_secure_onChange();'
),
'ident_switch.form.port' => array('type' => 'text', 'size' => 5),
'ident_switch.form.username' => array('type' => 'text', 'size' => 64, 'placeholder' => $args['record']['email']),
'ident_switch.form.password' => array('type' => 'password', 'size' => 64),
'ident_switch.form.delimiter' => array('type' => 'text', 'size' => 1, 'placeholder' => '.'),
'ident_switch.form.readonly' => array('type' => 'hidden'),
);
// Process fields
$addAfter = '';
$table = new html_table(array('cols' => 2));
foreach ($fieldset as $col => $colprop)
{
$data = $args['record'][$col];
if ($colprop['type'] == 'hidden')
{
$addAfter .= rcube_output::get_edit_field($col, $data, $colprop, $colprop['type']);
}
else
{
$colprop['id'] = 'rcmfd_' . $col;
$label = $colprop['label'] ?: $this->gettext(str_replace('-', '', $col));
$value = $colprop['value'] ?: rcube_output::get_edit_field($col, $data, $colprop, $colprop['type']);
$table->add('title', html::label($colprop['id'], rcube::Q($label)));
$table->add(null, $value);
} }
} }
// Set data for output
$args['form']['ident_switch'] = array(
'name' => $this->gettext('form.caption'),
'content' => $table->show(array('class' => 'propform')) . $addAfter // TODO: copy styles from other tables
);
return $args; return $args;
} }
@@ -168,43 +260,76 @@ class ident_switch extends rcube_plugin
{ {
$rc = rcmail::get_instance(); $rc = rcmail::get_instance();
// TODO: check field values // Do not do anything for default identity
if (strcasecmp($args['record']['email'], $rc->user->data['username']) === 0)
$sql = 'SELECT NULL FROM ' . $rc->db->table_name($this->table) . ' WHERE iid = ? AND user_id = ?'; return $args;
$q = $rc->db->query($sql, $args['id'], $rc->user->ID);
$r = $rc->db->fetch_assoc($q);
if ($r)
{ // Record already exists, will update it
$sql = 'UPDATE ' .
$rc->db->table_name($this->table) .
' SET flags = ?, label = ?, host = ?, port = ?, username = ?, password = ?, delimiter = ?, user_id = ?, iid = ?';
}
else
{ // No record exists, create new one
$sql = 'INSERT INTO ' .
$rc->db->table_name($this->table) .
'(flags, label, host, port, username, password, delimiter, user_id, iid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)';
}
// Process boolean fields // Process boolean fields
$flags = 0; if (!rcube_utils::get_input_value('_ident_switch_form_enabled', rcube_utils::INPUT_POST))
if (get_input_value('_ident_switch_form_enabled', RCUBE_INPUT_POST)) {
$flags |= $this->db_enabled; self::sw_imap_off($args['iid']);
if (get_input_value('_ident_switch_form_secure', RCUBE_INPUT_POST)) return $args;
$flags |= $this->db_secure; }
$rc->db->query( $data = self::check_field_values();
$sql, if ($data['err'])
$flags, {
get_input_value('_ident_switch_form_label', RCUBE_INPUT_POST), $this->add_texts('localization');
get_input_value('_ident_switch_form_host', RCUBE_INPUT_POST), $args['abort'] = true;
get_input_value('_ident_switch_form_port', RCUBE_INPUT_POST), $args['message'] = 'ident_switch.err.' . $data['err'];
get_input_value('_ident_switch_form_username', RCUBE_INPUT_POST), return $args;
$rc->encrypt(get_input_value('_ident_switch_form_password', RCUBE_INPUT_POST)), }
get_input_value('_ident_switch_form_delimiter', RCUBE_INPUT_POST),
$rc->user->ID, $data['id'] = $args['id'];
$args['id'] self::save_field_values($rc, $data);
);
return $args;
}
function on_identity_create($args)
{
$rc = rcmail::get_instance();
// Do not do anything for default identity
if (strcasecmp($args['record']['email'], $rc->user->data['username']) === 0)
return $args;
// Process boolean fields
if (!rcube_utils::get_input_value('_ident_switch_form_enabled', rcube_utils::INPUT_POST))
return $args;
$data = self::check_field_values();
if ($data['err'])
{
$this->add_texts('localization');
$args['abort'] = true;
$args['message'] = 'ident_switch.err.' . $data['err'];
}
// Save data for _after (cannot pass with $args)
$_SESSION['createData' . self::MY_POSTFIX] = $data;
return $args;
}
function on_identity_create_after($args)
{
$rc = rcmail::get_instance();
// Do not do anything for default identity
if (strcasecmp($args['record']['email'], $rc->user->data['username']) === 0)
return $args;
$data = $_SESSION['createData' . self::MY_POSTFIX];
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'] . '.');
else
{
$data['id'] = $args['id'];
self::save_field_values($rc, $data);
}
return $args; return $args;
} }
@@ -213,11 +338,11 @@ class ident_switch extends rcube_plugin
{ {
$rc = rcmail::get_instance(); $rc = rcmail::get_instance();
$sql = 'DELETE FROM ' . $rc->db->table_name($this->table) . ' WHERE iid = ? AND user_id = ?'; $sql = 'DELETE FROM ' . $rc->db->table_name(self::TABLE) . ' WHERE iid = ? AND user_id = ?';
$q = $rc->db->query($sql, $args['id'], $rc->user->ID); $q = $rc->db->query($sql, $args['id'], $rc->user->ID);
if ($rc->db->affected_rows($q)) if ($rc->db->affected_rows($q))
$rc->write_log($this->my_log, 'Deleted associated information for identity with ID = ' . $args['id'] . '.'); self::write_log('Deleted associated information for identity with ID = ' . $args['id'] . '.');
return $args; return $args;
} }
@@ -229,59 +354,170 @@ class ident_switch extends rcube_plugin
$rc = rcmail::get_instance(); $rc = rcmail::get_instance();
if (strcasecmp($_SESSION['username'], $rc->user->data['username']) !== 0) if (strcasecmp($_SESSION['username'], $rc->user->data['username']) !== 0)
{ {
if (isset($_SESSION['iid' . $this->my_postfix])) if (isset($_SESSION['iid' . self::MY_POSTFIX]))
$rc->output->add_script('plugin_switchIdent_fixIdent(' . $_SESSION['iid' . $this->my_postfix] . ');', 'docready'); $rc->output->add_script('plugin_switchIdent_fixIdent(' . $_SESSION['iid' . self::MY_POSTFIX] . ');', 'docready');
else else
$rc->write_log($this->my_log, 'Special session variable with active identity ID not found.'); self::write_log('Special session variable with active identity ID not found.');
} }
} }
} }
private static function check_field_values()
{
$retVal = array();
$retVal['label'] = self::ntrim(rcube_utils::get_input_value('_ident_switch_form_label', rcube_utils::INPUT_POST));
if (strlen($retVal['label']) > 32)
$retVal['err'] = 'label.long';
else
{
$retVal['host'] = self::ntrim(rcube_utils::get_input_value('_ident_switch_form_host', rcube_utils::INPUT_POST));
if (strlen($retVal['host']) > 64)
$retVal['err'] = 'host.long';
else
{
$retVal['port'] = self::ntrim(rcube_utils::get_input_value('_ident_switch_form_port', rcube_utils::INPUT_POST));
if ($retVal['port'] && !ctype_digit($retVal['port']))
$retVal['err'] = 'port.num';
else
{
if ($retVal['port'] && ($retVal['port'] <= 0 || $retVal['port'] > 65535))
$retVal['err'] = 'port.range';
else
{
$retVal['user'] = self::ntrim(rcube_utils::get_input_value('_ident_switch_form_username', rcube_utils::INPUT_POST));
if (strlen($retVal['user']) > 64)
$retVal['err'] = 'user.long';
else
{
$retVal['delim'] = self::ntrim(rcube_utils::get_input_value('_ident_switch_form_delimiter', rcube_utils::INPUT_POST));
if (strlen($retVal['delim']) > 1)
$retVal['err'] = 'delim.long';
}
}
}
}
}
// Get also password
$retVal['pass'] = rcube_utils::get_input_value('_ident_switch_form_password', rcube_utils::INPUT_POST);
// Parse secure settings
$retVal['flags'] = self::DB_ENABLED;
$ssl = rcube_utils::get_input_value('_ident_switch_form_secure', rcube_utils::INPUT_POST);
if (strcasecmp($ssl, 'tls') === 0)
$retVal['flags'] |= self::DB_SECURE_TLS;
elseif (strcasecmp($ssl, 'ssl') === 0)
$retVal['flags'] |= self::DB_SECURE_SSL;
return $retVal;
}
private static function save_field_values($rc, $data)
{
$sql = 'SELECT id, password FROM ' . $rc->db->table_name(self::TABLE) . ' WHERE iid = ? AND user_id = ?';
$q = $rc->db->query($sql, $data['id'], $rc->user->ID);
$r = $rc->db->fetch_assoc($q);
if ($r)
{ // Record already exists, will update it
$sql = 'UPDATE ' .
$rc->db->table_name(self::TABLE) .
' SET flags = ?, label = ?, host = ?, port = ?, username = ?, password = ?, delimiter = ?, 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, host, port, username, password, delimiter, user_id, iid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)';
}
if ($sql)
{
// Do we need to update pwd?
if ($data['pass'] != $r['password'])
$data['pass'] = $rc->encrypt($data['pass']);
$rc->db->query(
$sql,
$data['flags'],
$data['label'],
$data['host'],
$data['port'],
$data['user'],
$data['pass'],
$data['delim'],
$rc->user->ID,
$data['id'],
$r['id']
);
return true;
}
return false;
}
function on_switch() function on_switch()
{ {
$rc = rcmail::get_instance(); $rc = rcmail::get_instance();
$my_postfix_len = strlen($this->my_postfix); $my_postfix_len = strlen(self::MY_POSTFIX);
$identId = rcube_utils::get_input_value('_ident-id', RCUBE_INPUT_POST); $identId = rcube_utils::get_input_value('_ident-id', rcube_utils::INPUT_POST);
if (-1 == $identId) if (-1 == $identId)
{ // Switch to main account { // Switch to main account
$rc->write_log($this->my_log, 'Switching mailbox back to default.'); self::write_log('Switching mailbox back to default.');
// Restore everything with STORAGE*my_postfix
foreach ($_SESSION as $k => $v) foreach ($_SESSION as $k => $v)
{ {
if (strncasecmp($k, 'storage', 7) === 0 && substr_compare($k, $this->my_postfix, -$my_postfix_len, $my_postfix_len) === 0) if (strncasecmp($k, 'storage', 7) === 0 && substr_compare($k, self::MY_POSTFIX, -$my_postfix_len, $my_postfix_len) === 0)
{ {
$_SESSION[$k] = $_SESSION[$k . $this->my_postfix]; $realKey = substr($k, 0, -$my_postfix_len);
$rc->session->remove($k . $this->my_postfix); $_SESSION[$realKey] = $_SESSION[$k];
$rc->session->remove($k);
} }
} }
$_SESSION['username'] = $rc->user->data['username']; $_SESSION['username'] = $rc->user->data['username'];
$_SESSION['password'] = $_SESSION['password' . $this->my_postfix]; $_SESSION['password'] = $_SESSION['password' . self::MY_POSTFIX];
$_SESSION['iid' . $this->my_postfix] = -1; $_SESSION['iid' . self::MY_POSTFIX] = -1;
} }
else else
{ {
$sql = 'SELECT host, flags, port, username, password, iid FROM ' . $rc->db->table_name($this->table) . ' WHERE id = ? AND user_id = ?'; $sql = 'SELECT host, flags, port, username, password, iid FROM ' . $rc->db->table_name(self::TABLE) . ' WHERE id = ? AND user_id = ?';
$q = $rc->db->query($sql, $identId ,$rc->user->ID); $q = $rc->db->query($sql, $identId ,$rc->user->ID);
$r = $rc->db->fetch_assoc($q); $r = $rc->db->fetch_assoc($q);
if (is_array($r)) if (is_array($r))
{ {
$rc->write_log( if (!$r['username'])
$this->my_log, { // Load email from identity
'Switching mailbox to one for identity with ID = ' . $r['iid'] . ' (username = \'' . $r['username'] . '\').' $sql = 'SELECT email FROM ' . $rc->db->table_name('identities') . ' WHERE identity_id = ?';
); $q = $rc->db->query($sql, $r['iid']);
$rIid = $rc->db->fetch_assoc($q);
$r['username'] = $rIid['email'];
}
self::write_log('Switching mailbox to one for identity with ID = ' . $r['iid'] . ' (username = \'' . $r['username'] . '\').');
$def_port = 143; // Default port here!
$ssl = null;
if ($r['flags'] & self::DB_SECURE_TLS)
{
$ssl = 'tls';
$def_port = 143; // Default TLS port here!
}
elseif ($r['flags'] & self::DB_SECURE_SSL)
{
$ssl = 'ssl';
$def_port = 993; // Default SSL port here!
}
$port = $r['port']; $port = $r['port'];
$ssl = false;
if ($r['flags'] & $this->db_secure)
{
$ssl = true;
if (!$port)
$port = 993; // Default SSL/TLS port here!
}
if (!$port) if (!$port)
$port = 143; // Default port here! $port = $def_port;
// If we are in default account now // If we are in default account now
// save everything with STORAGE // save everything with STORAGE
@@ -289,28 +525,30 @@ class ident_switch extends rcube_plugin
{ {
foreach ($_SESSION as $k => $v) foreach ($_SESSION as $k => $v)
{ {
if (strncasecmp($k, 'storage', 7) === 0 && substr_compare($k, $this->my_postfix, -$my_postfix_len, $my_postfix_len) !== 0) if (strncasecmp($k, 'storage', 7) === 0 && substr_compare($k, self::MY_POSTFIX, -$my_postfix_len, $my_postfix_len) !== 0)
{ {
$_SESSION[$k . $this->my_postfix] = $_SESSION[$k]; if (!$_SESSION[$k . self::MY_POSTFIX])
$_SESSION[$k . self::MY_POSTFIX] = $_SESSION[$k];
$rc->session->remove($k); $rc->session->remove($k);
} }
} }
} }
$_SESSION['password' . $this->my_postfix] = $_SESSION['password']; if (!$_SESSION['password' . self::MY_POSTFIX])
$_SESSION['password' . self::MY_POSTFIX] = $_SESSION['password'];
$_SESSION['storage_host'] = $r['host']; $_SESSION['storage_host'] = $r['host'] ? $r['host'] : 'localhost'; // Default host here!
$_SESSION['storage_ssl'] = $ssl; $_SESSION['storage_ssl'] = $ssl;
$_SESSION['storage_port'] = $port; $_SESSION['storage_port'] = $port;
$_SESSION['username'] = $r['username']; $_SESSION['username'] = $r['username'];
$_SESSION['password'] = $r['password']; $_SESSION['password'] = $r['password'];
$_SESSION['iid' . $this->my_postfix] = $r['iid']; $_SESSION['iid' . self::MY_POSTFIX] = $r['iid'];
$rc->session->remove('folders'); $rc->session->remove('folders');
} }
else else
{ {
// TODO: Show message in browser // TODO: Show message in browser
$rc->write_log($this->my_log, 'Requested remote mailbox with ID = ' . $identId . ' not found.'); self::write_log('Requested remote mailbox with ID = ' . $identId . ' not found.');
return; return;
} }
} }
@@ -318,8 +556,102 @@ class ident_switch extends rcube_plugin
$rc->output->redirect( $rc->output->redirect(
array( array(
'_task' => 'mail', '_task' => 'mail',
'_mbox' => rcube_utils::get_input_value('_mbox', RCUBE_INPUT_GET), '_mbox' => 'INBOX',
) )
); );
} }
private static function sw_imap_off($iid)
{
$rc = rcmail::get_instance();
$sql = 'UPDATE ' . $rc->db->table_name(self::TABLE) . ' SET flags = flags & ? WHERE iid = ? AND user_id = ?';
$rc->db->query($sql, ~self::DB_ENABLED, $iid, $rc->user->ID);
}
private function get_preconfig($email)
{
$dom = substr(strstr($email, '@'), 1);
if (!$dom)
return false;
$this->load_config(); // config.inc.php
$cfg = rcmail::get_instance()->config->get('ident_switch.preconfig', array());
$cfg = $cfg[$dom];
if ($cfg)
{
if (!$cfg['host'])
return false; # Host must be specified!
}
return $cfg;
}
private function apply_preconfig(&$record)
{
$email = $record['email'];
$cfg = $this->get_preconfig($email);
if (is_array($cfg))
{
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.host'] = $urlArr['host'] ? rcube::Q($urlArr['host'], 'url') : '';
$record['ident_switch.form.port'] = $urlArr['port'] ? intval($urlArr['port']) : '';
if (strcasecmp('tls', $urlArr['scheme']) === 0)
$record['ident_switch.form.secure'] = 'tls';
elseif (strcasecmp('ssl', $urlArr['scheme']) === 0)
$record['ident_switch.form.secure'] = 'ssl';
else
$record['ident_switch.form.secure'] = '';
}
$loginSet = false;
if ($cfg['user'])
{ // Set up user name
switch (strtoupper($cfg['user']))
{
case 'EMAIL':
$record['ident_switch.form.username'] = $email;
$loginSet = true;
break;
case 'MBOX':
$record['ident_switch.form.username'] = strstr($email, '@', true);
$loginSet = true;
break;
}
}
if ($cfg['readonly'])
{
$record['ident_switch.form.readonly'] = 1;
if ($loginSet)
$record['ident_switch.form.readonly'] = 2;
}
return $cfg['readonly'];
}
}
private static function ntrim($str)
{
if (is_null($str))
return $str;
$s = trim($str);
if (!$s)
return null;
return $s;
}
private static function write_log($txt)
{
rcmail::get_instance()->write_log('ident_switch', $txt);
}
} }

50
localization/de_DE.inc Normal file
View File

@@ -0,0 +1,50 @@
<?php
/*
* Localization file for ident_switch plugin
*/
$labels = array();
// IMAP
$labels['form.caption'] = 'IMAP';
// Enabled
$labels['form.enabled'] = 'Aktiviert';
// Label
$labels['form.label'] = 'Bezeichnung';
// Server host name
$labels['form.host']='Servername';
// Secure connection (SSL/TLS)
$labels['form.secure']='Verbindungssicherheit';
// Port
$labels['form.port']='Port';
// Username
$labels['form.username'] = 'Benutzername';
// Password
$labels['form.password'] = 'Passwort';
// Folder hierarchy delimiter
$labels['form.delimiter'] = 'Hierachietrennzeichen für Verzeichnisse';
// Value in \'Label\' field of IMAP section is too long (32 chars max).
$labels['err.label.long'] = 'Der Wert in Feld \'Bezeichnung\' im Abschnitt IMAP ist zu lang (max. 32 Zeichen).';
// Value in \'Server host name\' field of IMAP section is too long (64 chars max).
$labels['err.host.long'] = 'Der Wert in Feld \'Servername\' im Abschnitt IMAP ist zu lang (max. 64 Zeichen).';
// Value in \'Username\' field of IMAP section is too long (64 chars max).
$labels['err.user.long'] = 'Der Wert in Feld \'Benutzername\' im Abschnitt IMAP ist zu lang (max. 64 Zeichen).';
// Value in \'Folder hierarchy delimiter\' field of IMAP section is too long (1 char max).
$labels['err.delim.long'] = 'Der Wert in Feld \'Hierachietrennzeichen für Verzeichnisse\' im Abschnitt IMAP ist zu lang (max. 1 Zeichen).';
// Value in \'Port\' field of IMAP section must be a number.
$labels['err.port.num'] = 'Der Wert in Feld \'Port\' im Abschnitt IMAP muss eine Zahl sein.';
// Value in \'Port\' field of IMAP section must be between 1 and 65535.
$labels['err.port.range'] = 'Der Wert in Feld \'Port\' im Abschnitt IMAP muss 1 und 65535 liegen.';

View File

@@ -13,14 +13,38 @@ $labels['form.enabled'] = 'Enabled';
// Label // Label
$labels['form.label'] = 'Label'; $labels['form.label'] = 'Label';
// Server URI // Server host name
$labels['form.server']='Server URI'; $labels['form.host']='Server host name';
// Secure connection (SSL/TLS)
$labels['form.secure']='Connection security';
// Port
$labels['form.port']='Port';
// Username // Username
$labels['form.username'] = 'Username'; $labels['form.username'] = 'Username';
// Passwotrd // Password
$labels['form.password'] = 'Password'; $labels['form.password'] = 'Password';
// Folder hierarchy delimiter // Folder hierarchy delimiter
$labels['form.delimiter'] = 'Folder hierarchy delimiter'; $labels['form.delimiter'] = 'Folder hierarchy delimiter';
// Value in \'Label\' field of IMAP section is too long (32 chars max).
$labels['err.label.long'] = 'Value in \'Label\' field of IMAP section is too long (32 chars max).';
// Value in \'Server host name\' field of IMAP section is too long (64 chars max).
$labels['err.host.long'] = 'Value in \'Server host name\' field of IMAP section is too long (64 chars max).';
// Value in \'Username\' field of IMAP section is too long (64 chars max).
$labels['err.user.long'] = 'Value in \'Username\' field of IMAP section is too long (64 chars max).';
// Value in \'Folder hierarchy delimiter\' field of IMAP section is too long (1 char max).
$labels['err.delim.long'] = 'Value in \'Folder hierarchy delimiter\' field of IMAP section is too long (1 char max).';
// Value in \'Port\' field of IMAP section must be a number.
$labels['err.port.num'] = 'Value in \'Port\' field of IMAP section must be a number.';
// Value in \'Port\' field of IMAP section must be between 1 and 65535.
$labels['err.port.range'] = 'Value in \'Port\' field of IMAP section must be between 1 and 65535.';

50
localization/fr_FR.inc Normal file
View File

@@ -0,0 +1,50 @@
<?php
/*
* Localization file for ident_switch plugin
*/
$labels = array();
// IMAP
$labels['form.caption'] = 'IMAP';
// Enabled
$labels['form.enabled'] = 'Activé';
// Label
$labels['form.label'] = 'Nom d\'affichage';
// Server host name
$labels['form.host']='Nom d\'hôte du serveur';
// Secure connection (SSL/TLS)
$labels['form.secure']='Sécurité de la connexion';
// Port
$labels['form.port']='Port';
// Username
$labels['form.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).';
// 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).';
// 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.';
// 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.';

50
localization/it_IT.inc Normal file
View File

@@ -0,0 +1,50 @@
<?php
/*
* Localization file for ident_switch plugin
*/
$labels = array();
// IMAP
$labels['form.caption'] = 'IMAP';
// Enabled
$labels['form.enabled'] = 'Abilita';
// Label
$labels['form.label'] = 'Nome visualizzato';
// Server host name
$labels['form.host']='Nome del server';
// Secure connection (SSL/TLS)
$labels['form.secure']='Sicurezza della connessione';
// Port
$labels['form.port']='Porta';
// Username
$labels['form.username'] = 'Username';
// Password
$labels['form.password'] = 'Password';
// Folder hierarchy delimiter
$labels['form.delimiter'] = 'Delimitatore gerarchico delle cartelle';
// Value in \'Label\' field of IMAP section is too long (32 chars max).
$labels['err.label.long'] = 'Il valore del campo \' Nome Visualizzato\' è troppo lungo. (massimo 32 caratteri).';
// Value in \'Server host name\' field of IMAP section is too long (64 chars max).
$labels['err.host.long'] = 'Il valore del campo \'Nome del server\' della sezione IMAP è troppo lungo (massimo 64 caratteri).';
// Value in \'Username\' field of IMAP section is too long (64 chars max).
$labels['err.user.long'] = 'Il valore del campo \'Username\' della sezione IMAP è troppo lungo (massimo 64 caratteri).';
// Value in \'Folder hierarchy delimiter\' field of IMAP section is too long (1 char max).
$labels['err.delim.long'] = 'Il valore del campo \'Delimitatore gerarchico delle cartelle\' è troppo lungo (massimo 1 carattere).';
// Value in \'Port\' field of IMAP section must be a number.
$labels['err.port.num'] = 'Il valore del campo \'Porta\' nella sezione IMAP deve essere un numero.';
// Value in \'Port\' field of IMAP section must be between 1 and 65535.
$labels['err.port.range'] = 'Il valore del campo \'Porta\' nella sezione IMAP deve essere compreso tra i valori 1 e 65535.';

50
localization/nl_NL.inc Normal file
View File

@@ -0,0 +1,50 @@
<?php
/*
* Localization file for ident_switch plugin
*/
$labels = array();
// IMAP
$labels['form.caption'] = 'IMAP';
// Enabled
$labels['form.enabled'] = 'Inschakelen';
// Label
$labels['form.label'] = 'Label';
// Server host name
$labels['form.host']='Servernaam';
// Secure connection (SSL/TLS)
$labels['form.secure']='Beveiligingstype';
// Port
$labels['form.port']='Poortnummer';
// Username
$labels['form.username'] = 'Gebruikersnaam';
// Password
$labels['form.password'] = 'Wachtwoord';
// Folder hierarchy delimiter
$labels['form.delimiter'] = 'Map hiërarchie scheidingsteken';
// Value in \'Label\' field of IMAP section is too long (32 chars max).
$labels['err.label.long'] = 'De waarde in het veld \'Label\' is te lang! (maximaal 32 karakter is toegestaan).';
// Value in \'Server host name\' field of IMAP section is too long (64 chars max).
$labels['err.host.long'] = 'De waarde in het veld \'Servernaam\' is te lang (maximaal 64 karakter is toegestaan).';
// Value in \'Username\' field of IMAP section is too long (64 chars max).
$labels['err.user.long'] = 'De waarde in het veld \'Gebruikersnaam\' is te lang! (maximaal 64 karakter is toegestaan).';
// Value in \'Folder hierarchy delimiter\' field of IMAP section is too long (1 char max).
$labels['err.delim.long'] = 'De waarde in het veld \'Map hiërarchie scheidingsteken\' is te lang! (maximaal 1 karakter is toegestaan).';
// Value in \'Port\' field of IMAP section must be a number.
$labels['err.port.num'] = 'De waarde in het veld \'Poortnummer\' moet een nummer zijn.';
// Value in \'Port\' field of IMAP section must be between 1 and 65535.
$labels['err.port.range'] = 'De waarde in het veld \'Poortnummer\' moet tussen de 1 en 65535 zijn.';

50
localization/ru_RU.inc Normal file
View File

@@ -0,0 +1,50 @@
<?php
/*
* Localization file for ident_switch plugin
*/
$labels = array();
// IMAP
$labels['form.caption'] = 'IMAP';
// Enabled
$labels['form.enabled'] = 'Включено';
// Label
$labels['form.label'] = 'Название';
// Server host name
$labels['form.host'] = 'Адрес сервера';
// Secure connection (SSL/TLS)
$labels['form.secure'] = 'Защита подключения';
// Port
$labels['form.port'] = 'Порт';
// Username
$labels['form.username'] = 'Имя пользователя';
// Password
$labels['form.password'] = 'Пароль';
// Folder hierarchy delimiter
$labels['form.delimiter'] = 'Разделитель в иерархии папок';
// Value in \'Label\' field of IMAP section is too long (32 chars max).
$labels['err.label.long'] = '\'Название\' в разделе IMAP должно быть не длинее 32 символов.';
// Value in \'Server host name\' field of IMAP section is too long (64 chars max).
$labels['err.host.long'] = '\'Адрес сервера\' в разделе IMAP должен быть не длинее 64 символов.';
// Value in \'Username\' field of IMAP section is too long (64 chars max).
$labels['err.user.long'] = '\'Имя пользователя\' в секции IMAP должно быть не длинее 64 символов.';
// Value in \'Folder hierarchy delimiter\' field of IMAP section is too long (1 char max).
$labels['err.delim.long'] = '\'Разделитель в иерархии папок\' в секции IMAP должен быть не длинее 1 символа.';
// Value in \'Port\' field of IMAP section must be a number.
$labels['err.port.num'] = '\'Порт\' в секции IMAP должен быть числом.';
// Value in \'Port\' field of IMAP section must be between 1 and 65535.
$labels['err.port.range'] = '\'Порт\' в секции IMAP должен быть в диапазоне от 1 до 65535.';

View File

@@ -1,15 +0,0 @@
/***************************************************************************
* This file is part of Roundcube "identities_imap" plugin.
*
* Your are not allowed to distribute this file or parts of it.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Copyright (c) 2012 - 2014 Roland 'Rosali' Liebl - all rights reserved
* dev-team [at] myroundcube [dot] com
* http://myroundcube.com
***************************************************************************/
#accounts{position:absolute; top:63px; left:18px;}.remotehint{z-index:-1; position:absolute; top:7px; margin-left:auto; left:210px; width:400px; border-radius:5px; padding:4px; -moz-border-radius:5px; border:1px solid #DEEEFC; background:#F2F9FF; text-align:center; color:#3F70BA; display:inline;}.classic{top:2px;}

View File

@@ -1,15 +0,0 @@
/***************************************************************************
* This file is part of Roundcube "identities_imap" plugin.
*
* Your are not allowed to distribute this file or parts of it.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Copyright (c) 2012 - 2014 Roland 'Rosali' Liebl - all rights reserved
* dev-team [at] myroundcube [dot] com
* http://myroundcube.com
***************************************************************************/
select.deco{height:18px; font-size:12px; border-radius:3px; -moz-border-radius:3px; -webkit-border-radius:3px; color:#fff; background:#444; border:1px solid #ababab;}.remotehint{z-index:1; position:absolute; top:1px; margin-left:auto; left:50%; margin-left:-200px; width:400px; border-radius:5px; padding:4px; -moz-border-radius:5px; border:1px solid #DEEEFC; background:#F2F9FF; text-align:center; color:#3F70BA; display:inline;}

View File

@@ -1,15 +0,0 @@
/***************************************************************************
* This file is part of Roundcube "##PLUGIN##" plugin.
*
* Your are not allowed to distribute this file or parts of it.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Copyright (c) 2012 - ##YEAR## Roland 'Rosali' Liebl - all rights reserved
* dev-team [at] myroundcube [dot] com
* http://myroundcube.com
***************************************************************************/
select.deco{}#taskbar .remotehint{position:absolute; top:52px; left:50%; margin-left:-200px; width:400px; padding:0px; border:1px solid #DEEEFC; background-color:#F2F9FF; text-align:center; font-size:10px; color:#3F70BA;}