summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore7
-rw-r--r--CHANGELOG7
-rw-r--r--composer.json-dist33
-rw-r--r--config/main.inc.php.dist22
-rwxr-xr-xplugins/jqueryui/themes/larry/jquery-ui-1.8.18.custom.css8
-rw-r--r--plugins/managesieve/Changelog2
-rw-r--r--plugins/managesieve/localization/bs_BA.inc4
-rw-r--r--plugins/managesieve/localization/ca_ES.inc4
-rw-r--r--plugins/managesieve/localization/cs_CZ.inc4
-rw-r--r--plugins/managesieve/localization/cy_GB.inc4
-rw-r--r--plugins/managesieve/localization/da_DK.inc4
-rw-r--r--plugins/managesieve/localization/de_CH.inc4
-rw-r--r--plugins/managesieve/localization/en_US.inc4
-rw-r--r--plugins/managesieve/localization/es_ES.inc4
-rw-r--r--plugins/managesieve/localization/et_EE.inc4
-rw-r--r--plugins/managesieve/localization/fa_IR.inc4
-rw-r--r--plugins/managesieve/localization/fi_FI.inc4
-rw-r--r--plugins/managesieve/localization/fr_FR.inc4
-rw-r--r--plugins/managesieve/localization/he_IL.inc4
-rw-r--r--plugins/managesieve/localization/hr_HR.inc4
-rw-r--r--plugins/managesieve/localization/hu_HU.inc4
-rw-r--r--plugins/managesieve/localization/hy_AM.inc4
-rw-r--r--plugins/managesieve/localization/id_ID.inc4
-rw-r--r--plugins/managesieve/localization/it_IT.inc4
-rw-r--r--plugins/managesieve/localization/ja_JP.inc4
-rw-r--r--plugins/managesieve/localization/ko_KR.inc4
-rw-r--r--plugins/managesieve/localization/ml_IN.inc4
-rw-r--r--plugins/managesieve/localization/nb_NO.inc4
-rw-r--r--plugins/managesieve/localization/nl_NL.inc4
-rw-r--r--plugins/managesieve/localization/pl_PL.inc4
-rw-r--r--plugins/managesieve/localization/pt_BR.inc4
-rw-r--r--plugins/managesieve/localization/pt_PT.inc4
-rw-r--r--plugins/managesieve/localization/ro_RO.inc4
-rw-r--r--plugins/managesieve/localization/ru_RU.inc4
-rw-r--r--plugins/managesieve/localization/sk_SK.inc4
-rw-r--r--plugins/managesieve/localization/sl_SI.inc4
-rw-r--r--plugins/managesieve/localization/sv_SE.inc4
-rw-r--r--plugins/managesieve/localization/tr_TR.inc4
-rw-r--r--plugins/managesieve/localization/vi_VN.inc4
-rw-r--r--plugins/managesieve/localization/zh_CN.inc4
-rw-r--r--plugins/managesieve/localization/zh_TW.inc4
-rw-r--r--program/include/html.php2
-rw-r--r--program/include/iniset.php4
-rw-r--r--program/include/rcmail.php27
-rw-r--r--program/include/rcube_imap.php5
-rw-r--r--program/include/rcube_message.php5
-rw-r--r--program/include/rcube_output.php2
-rw-r--r--program/include/rcube_output_html.php183
-rw-r--r--program/include/rcube_plugin.php2
-rw-r--r--program/include/rcube_plugin_api.php24
-rw-r--r--program/include/rcube_string_replacer.php30
-rw-r--r--program/include/rcube_user.php13
-rw-r--r--program/js/app.js19
-rw-r--r--program/localization/en_GB/labels.inc2
-rw-r--r--program/steps/mail/compose.inc5
-rw-r--r--program/steps/mail/func.inc21
-rw-r--r--program/steps/mail/list.inc36
-rw-r--r--program/steps/mail/list_contacts.inc7
-rw-r--r--program/steps/mail/sendmail.inc31
-rw-r--r--program/steps/settings/func.inc3
-rw-r--r--skins/classic/mail.css2
-rw-r--r--skins/classic/templates/compose.html4
-rw-r--r--skins/larry/mail.css12
-rw-r--r--skins/larry/templates/compose.html2
-rw-r--r--tests/Framework/StringReplacer.php26
65 files changed, 440 insertions, 246 deletions
diff --git a/.gitignore b/.gitignore
index f55131f8c..c410c9b8b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,9 @@
logs/*
temp/*
config/*
-plugins/*/config.inc.php \ No newline at end of file
+plugins/*/config.inc.php
+
+# composer-related
+composer.phar
+composer.lock
+vendor
diff --git a/CHANGELOG b/CHANGELOG
index ee5e17402..ff33fd99f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,13 @@
CHANGELOG Roundcube Webmail
===========================
+- Add option to disable saving sent mail in Sent folder - no_save_sent_messages (#1488686)
+- Fix handling dont_override with message_sort_col and message_sort_order settings (#1488760)
+- Fix HTML part detection in messages with attachments (#1488769)
+- Fix bug where wrong words were highlighted on spell-before-send check
+- Fix handling of URLs with asterisk characters (#1488759)
+- Remove automatic to-lowercase conversion of usernames (#1488715)
+- Fix scrolling quirk in email preview frame using Opera 12 (#1488763)
- Fix displaying of multipart/alternative messages with empty parts (#1488750)
- Fix threaded list sorting on PHP < 5.2.9 (#1488748)
- Plugin API: Add 'email_list' argument for identities data in user_create hook
diff --git a/composer.json-dist b/composer.json-dist
new file mode 100644
index 000000000..104b572c4
--- /dev/null
+++ b/composer.json-dist
@@ -0,0 +1,33 @@
+{
+ "name": "roundcube/roundcubemail",
+ "description": "The Roundcube Webmail suite",
+ "license": "GPL-3.0",
+ "repositories": [
+ {
+ "packagist": false
+ },
+ {
+ "type": "pear",
+ "url": "http://pear.php.net/"
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "Net_SMTP",
+ "version": "dev-master",
+ "source": {
+ "url": "http://github.com/pear/Net_SMTP",
+ "type": "git",
+ "reference": "master"
+ }
+ }
+ }
+ ],
+ "require" : {
+ "pear-pear/Mail_Mime": ">=1.8.1",
+ "pear-pear/Mail_mimeDecode": ">=1.5.5",
+ "Net_SMTP": "dev-master",
+ "pear-pear/Net_IDNA2": ">=0.1.1",
+ "pear-pear/Auth_SASL": ">=1.0.6"
+ }
+}
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index 15052c332..dafee72f1 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -182,6 +182,9 @@ $rcmail_config['smtp_timeout'] = 0;
// ONLY ENABLE IT IF YOU'RE REALLY SURE WHAT YOU'RE DOING!
$rcmail_config['enable_installer'] = false;
+// don't allow these settings to be overriden by the user
+$rcmail_config['dont_override'] = array();
+
// provide an URL where a user can get support for this Roundcube installation
// PLEASE DO NOT LINK TO THE ROUNDCUBE.NET WEBSITE HERE!
$rcmail_config['support_url'] = '';
@@ -226,10 +229,10 @@ $rcmail_config['login_autocomplete'] = 0;
// Forces conversion of logins to lower case.
// 0 - disabled, 1 - only domain part, 2 - domain and local part.
-// If users authentication is not case-sensitive this must be enabled.
-// After enabling it all user records need to be updated, e.g. with query:
-// UPDATE users SET username = LOWER(username);
-$rcmail_config['login_lc'] = 0;
+// If users authentication is case-insensitive this must be enabled.
+// Note: After enabling it all user records need to be updated, e.g. with query:
+// UPDATE users SET username = LOWER(username);
+$rcmail_config['login_lc'] = 2;
// Includes should be interpreted as PHP files
$rcmail_config['skin_include_php'] = false;
@@ -349,9 +352,6 @@ $rcmail_config['line_length'] = 72;
// send plaintext messages as format=flowed
$rcmail_config['send_format_flowed'] = true;
-// don't allow these settings to be overriden by the user
-$rcmail_config['dont_override'] = array();
-
// Set identities access level:
// 0 - many identities with possibility to edit all params
// 1 - many identities with possibility to edit all params but not email address
@@ -379,6 +379,10 @@ $rcmail_config['contact_photo_size'] = 160;
// Enable DNS checking for e-mail address validation
$rcmail_config['email_dns_check'] = false;
+// Disables saving sent messages in Sent folder (like gmail) (Default: false)
+// Note: useful when SMTP server stores sent mail in user mailbox
+$rcmail_config['no_save_sent_messages'] = false;
+
// ----------------------------------
// PLUGINS
// ----------------------------------
@@ -514,10 +518,12 @@ $rcmail_config['undo_timeout'] = 0;
// ----------------------------------
// This indicates which type of address book to use. Possible choises:
-// 'sql' (default) and 'ldap'.
+// 'sql' (default), 'ldap' and ''.
// If set to 'ldap' then it will look at using the first writable LDAP
// address book as the primary address book and it will not display the
// SQL address book in the 'Address Book' view.
+// If set to '' then no address book will be displayed or only the
+// addressbook which is created by a plugin (like CardDAV).
$rcmail_config['address_book_type'] = 'sql';
// In order to enable public ldap search, configure an array like the Verisign
diff --git a/plugins/jqueryui/themes/larry/jquery-ui-1.8.18.custom.css b/plugins/jqueryui/themes/larry/jquery-ui-1.8.18.custom.css
index 370ed9ce8..b2619efd4 100755
--- a/plugins/jqueryui/themes/larry/jquery-ui-1.8.18.custom.css
+++ b/plugins/jqueryui/themes/larry/jquery-ui-1.8.18.custom.css
@@ -466,6 +466,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
background: -o-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%);
background: -ms-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%);
background: linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#e6e6e6', GradientType=0);
box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3);
-o-box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3);
-webkit-box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3);
@@ -492,7 +493,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
background: -o-linear-gradient(top, #e6e6e6 0%, #f9f9f9 100%);
background: -ms-linear-gradient(top, #e6e6e6 0%, #f9f9f9 100%);
background: linear-gradient(top, #e6e6e6 0%, #f9f9f9 100%);
-
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#f9f9f9', GradientType=0);
}
/*
@@ -536,6 +537,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
background: -o-linear-gradient(top, #019bc6 0%, #017cb4 100%);
background: -ms-linear-gradient(top, #019bc6 0%, #017cb4 100%);
background: linear-gradient(top, #019bc6 0%, #017cb4 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#019bc6', endColorstr='#017cb4', GradientType=0);
};
.ui-slider-horizontal { height: .8em; }
@@ -559,11 +561,11 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
*/
.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
.ui-tabs .ui-tabs-nav { margin: 0; padding: 0; border: 0; background: transparent; height: 44px; }
-.ui-tabs .ui-tabs-nav li { list-style: none; display: inline; border: 0; border-radius: 0; margin: 0; border-bottom: 0 !important; padding: 15px 1px 15px 0; white-space: nowrap; background: #f8f8f8; background: -moz-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(50%,#d3d3d3), color-stop(100%,#f8f8f8)); background: -webkit-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -o-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -ms-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); }
+.ui-tabs .ui-tabs-nav li { list-style: none; display: inline; border: 0; border-radius: 0; margin: 0; border-bottom: 0 !important; padding: 15px 1px 15px 0; white-space: nowrap; background: #f8f8f8; background: -moz-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(50%,#d3d3d3), color-stop(100%,#f8f8f8)); background: -webkit-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -o-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -ms-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#d3d3d3', GradientType=0); }
.ui-tabs .ui-tabs-nav li a { display: inline-block; padding: 15px; text-decoration: none; font-size: 12px; color: #999; background: #fafafa; border-right: 1px solid #fafafa; }
.ui-dialog-content .tabsbar .tablink a { background: #fafafa; }
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-dialog-content .tabsbar .tablink.selected a { color: #004458; background: #efefef; background: -moz-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(40%,#fff), color-stop(100%,#e4e4e4)); background: -o-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: -ms-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: linear-gradient(top, #fafafa 40%, #e4e4e4 100%); }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-dialog-content .tabsbar .tablink.selected a { color: #004458; background: #efefef; background: -moz-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(40%,#fff), color-stop(100%,#e4e4e4)); background: -o-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: -ms-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: linear-gradient(top, #fafafa 40%, #e4e4e4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa', endColorstr='#e4e4e4', GradientType=0); }
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
.ui-tabs .ui-tabs-nav li:last-child { background: none; }
.ui-tabs .ui-tabs-nav li:last-child a { border: 0; }
diff --git a/plugins/managesieve/Changelog b/plugins/managesieve/Changelog
index ce9386154..dceac7602 100644
--- a/plugins/managesieve/Changelog
+++ b/plugins/managesieve/Changelog
@@ -1,3 +1,5 @@
+- Fixed filter activation/deactivation confirmation message (#1488765)
+
* version 6.0 [2012-10-03]
-----------------------------------------------------------
- Fixed issue with DBMail bug [http://pear.php.net/bugs/bug.php?id=19077] (#1488594)
diff --git a/plugins/managesieve/localization/bs_BA.inc b/plugins/managesieve/localization/bs_BA.inc
index 438d99e9c..106fe6d75 100644
--- a/plugins/managesieve/localization/bs_BA.inc
+++ b/plugins/managesieve/localization/bs_BA.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Nije moguće kreirati se filtera. Desila se servers
$labels['setcreated'] = 'Set filtera je uspješno kreiran.';
$labels['activateerror'] = 'Nije moguće omogućiti označene filtere. Desila se serverska greška.';
$labels['deactivateerror'] = 'Nije moguće onemogućiti označene filtere. Desila se serverska greška.';
-$labels['activated'] = 'Filteri su uspješno onemogućeni.';
-$labels['deactivated'] = 'Filteri su uspješno omogućeni.';
+$labels['deactivated'] = 'Filteri su uspješno onemogućeni.';
+$labels['activated'] = 'Filteri su uspješno omogućeni.';
$labels['moved'] = 'Filteri su uspješno premješteni.';
$labels['moveerror'] = 'Nije moguće premjestiti označeni filter. Desila se serverska greška.';
$labels['nametoolong'] = 'Ime je predugo.';
diff --git a/plugins/managesieve/localization/ca_ES.inc b/plugins/managesieve/localization/ca_ES.inc
index d7e8b67be..ad03bdf0c 100644
--- a/plugins/managesieve/localization/ca_ES.inc
+++ b/plugins/managesieve/localization/ca_ES.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'No s\'ha pogut crear el conjunt de filtres. Hi ha h
$labels['setcreated'] = 'S\'ha creat correctament el conjunt de filtres.';
$labels['activateerror'] = 'No s\'ha pogut habilitar el(s) filtre(s) seleccionat(s). Hi ha hagut un error al servidor.';
$labels['deactivateerror'] = 'No s\'ha pogut deshabilitar el(s) filtre(s) seleccionat(s). Hi ha hagut un error al servidor.';
-$labels['activated'] = 'Filtre(s) deshabilitat(s) correctament.';
-$labels['deactivated'] = 'Filtre(s) habilitat(s) correctament.';
+$labels['deactivated'] = 'Filtre(s) deshabilitat(s) correctament.';
+$labels['activated'] = 'Filtre(s) habilitat(s) correctament.';
$labels['moved'] = 'S\'ha mogut correctament el filtre.';
$labels['moveerror'] = 'No s\'ha pogut moure el filtre seleccionat. Hi ha hagut un error al servidor.';
$labels['nametoolong'] = 'El nom és massa llarg.';
diff --git a/plugins/managesieve/localization/cs_CZ.inc b/plugins/managesieve/localization/cs_CZ.inc
index 0790eae9c..c3448ab47 100644
--- a/plugins/managesieve/localization/cs_CZ.inc
+++ b/plugins/managesieve/localization/cs_CZ.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Nelze vytvořit sadu filtrů. Došlo k chybě serve
$labels['setcreated'] = 'Sada filtrů úspěšně vytvořena.';
$labels['activateerror'] = 'Nelze zapnout vybrané filtr/y. Došlo k chybě serveru.';
$labels['deactivateerror'] = 'Nelze vypnout vybrané filtr/y. Došlo k chybě serveru.';
-$labels['activated'] = 'Filtr/y úspěšne vypnuty.';
-$labels['deactivated'] = 'Filtr/y úspěšně zapnuty.';
+$labels['deactivated'] = 'Filtr/y úspěšne vypnuty.';
+$labels['activated'] = 'Filtr/y úspěšně zapnuty.';
$labels['moved'] = 'Filtr byl úspěšně přesunut.';
$labels['moveerror'] = 'Nelze přesunout vybraný filtr. Došlo k chybě na serveru.';
$labels['nametoolong'] = 'Příliš dlouhý název.';
diff --git a/plugins/managesieve/localization/cy_GB.inc b/plugins/managesieve/localization/cy_GB.inc
index bace9be6e..4ca1efdd6 100644
--- a/plugins/managesieve/localization/cy_GB.inc
+++ b/plugins/managesieve/localization/cy_GB.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Methwyd creu set hidlydd. Cafwyd gwall gweinydd.';
$labels['setcreated'] = 'Crëuwyd y set hidlydd yn llwyddiannus.';
$labels['activateerror'] = 'Methwyd galluogi y hidlydd(ion) dewiswyd. Cafwyd gwall gweinydd.';
$labels['deactivateerror'] = 'Methwyd analluogi y hidlydd(ion) dewiswyd. Cafwyd gwall gweinydd.';
-$labels['activated'] = 'Analluogwyd y hidlydd(ion) yn llwyddiannus.';
-$labels['deactivated'] = 'Galluogwyd y hidlydd(ion) yn llwyddiannus.';
+$labels['deactivated'] = 'Analluogwyd y hidlydd(ion) yn llwyddiannus.';
+$labels['activated'] = 'Galluogwyd y hidlydd(ion) yn llwyddiannus.';
$labels['moved'] = 'Symudwyd y hidlydd yn llwyddiannus.';
$labels['moveerror'] = 'Methwyd symud y hidlydd dewiswyd. Cafwyd gwall gweinydd.';
$labels['nametoolong'] = 'Enw yn rhy hir.';
diff --git a/plugins/managesieve/localization/da_DK.inc b/plugins/managesieve/localization/da_DK.inc
index 91bc18dd7..8c96a1420 100644
--- a/plugins/managesieve/localization/da_DK.inc
+++ b/plugins/managesieve/localization/da_DK.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Kan ikke oprette filter sæt. Server fejl.';
$labels['setcreated'] = 'Filter sæt oprettet.';
$labels['activateerror'] = 'Kan ikek aktivere valgt filter sæt. Server fejl.';
$labels['deactivateerror'] = 'Kan ikke deaktivere valgt filter sæt. Server fejl.';
-$labels['activated'] = 'Filter(filtre) deaktiveret.';
-$labels['deactivated'] = 'Filter(filtre) aktiveret.';
+$labels['deactivated'] = 'Filter(filtre) deaktiveret.';
+$labels['activated'] = 'Filter(filtre) aktiveret.';
$labels['moved'] = 'Filter flyttet.';
$labels['moveerror'] = 'Kan ikke flytte valgt filter. Server fejl.';
$labels['nametoolong'] = 'Navn er for langt.';
diff --git a/plugins/managesieve/localization/de_CH.inc b/plugins/managesieve/localization/de_CH.inc
index 963d1a6a2..ceb7475ad 100644
--- a/plugins/managesieve/localization/de_CH.inc
+++ b/plugins/managesieve/localization/de_CH.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Filtersatz kann nicht erstellt werden. Serverfehler
$labels['setcreated'] = 'Filter erfolgreich erstellt.';
$labels['activateerror'] = 'Filter kann nicht aktiviert werden. Serverfehler.';
$labels['deactivateerror'] = 'Filter kann nicht deaktiviert werden. Serverfehler.';
-$labels['activated'] = 'Filter erfolgreich deaktiviert.';
-$labels['deactivated'] = 'Filter erfolgreich aktiviert.';
+$labels['deactivated'] = 'Filter erfolgreich deaktiviert.';
+$labels['activated'] = 'Filter erfolgreich aktiviert.';
$labels['moved'] = 'Filter erfolgreich verschoben.';
$labels['moveerror'] = 'Filter kann nicht verschoben werden. Serverfehler.';
$labels['nametoolong'] = 'Filtersatz kann nicht erstellt werden. Name zu lang.';
diff --git a/plugins/managesieve/localization/en_US.inc b/plugins/managesieve/localization/en_US.inc
index cb223c18f..9336390d1 100644
--- a/plugins/managesieve/localization/en_US.inc
+++ b/plugins/managesieve/localization/en_US.inc
@@ -145,8 +145,8 @@ $messages['setcreateerror'] = 'Unable to create filters set. Server error occure
$messages['setcreated'] = 'Filters set created successfully.';
$messages['activateerror'] = 'Unable to enable selected filter(s). Server error occured.';
$messages['deactivateerror'] = 'Unable to disable selected filter(s). Server error occured.';
-$messages['activated'] = 'Filter(s) disabled successfully.';
-$messages['deactivated'] = 'Filter(s) enabled successfully.';
+$messages['deactivated'] = 'Filter(s) disabled successfully.';
+$messages['activated'] = 'Filter(s) enabled successfully.';
$messages['moved'] = 'Filter moved successfully.';
$messages['moveerror'] = 'Unable to move selected filter. Server error occured.';
$messages['nametoolong'] = 'Name too long.';
diff --git a/plugins/managesieve/localization/es_ES.inc b/plugins/managesieve/localization/es_ES.inc
index 75965ae56..a171ec4b0 100644
--- a/plugins/managesieve/localization/es_ES.inc
+++ b/plugins/managesieve/localization/es_ES.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Imposible crear el conjunto de filtros. Ha ocurrido
$labels['setcreated'] = 'Conjunto de filtros creado satisfactoriamente';
$labels['activateerror'] = 'No se ha podido habilitar el filtro(s) seleccionado. Se ha producido un error de servidor.';
$labels['deactivateerror'] = 'No se ha podido deshabilitar el filtro(s) seleccionado. Se ha producido un error de servidor.';
-$labels['activated'] = 'Filtro(s) deshabilitado(s) correctamente.';
-$labels['deactivated'] = 'Filtro(s) habilitado(s) correctamente.';
+$labels['deactivated'] = 'Filtro(s) deshabilitado(s) correctamente.';
+$labels['activated'] = 'Filtro(s) habilitado(s) correctamente.';
$labels['moved'] = 'Filtro movido correctamente';
$labels['moveerror'] = 'No se ha podido mover el filtro seleccionado. Ha ocurrido un error de servidor.';
$labels['nametoolong'] = 'Imposible crear el conjunto de filtros. Nombre demasiado largo';
diff --git a/plugins/managesieve/localization/et_EE.inc b/plugins/managesieve/localization/et_EE.inc
index fab96639c..67501f8d3 100644
--- a/plugins/managesieve/localization/et_EE.inc
+++ b/plugins/managesieve/localization/et_EE.inc
@@ -130,8 +130,8 @@ $labels['cannotbeempty'] = 'Väli ei või tühi olla';
$labels['ruleexist'] = 'Määratud nimega filter on juba olemas';
$labels['activateerror'] = 'Valitud filtrite lubamine nurjus. Ilmnes serveri tõrge.';
$labels['deactivateerror'] = 'Valitud filtrite keelamine nurjus. Ilmnes serveri tõrge.';
-$labels['activated'] = 'Filter edukalt keelatud.';
-$labels['deactivated'] = 'Filter edukalt lubatud.';
+$labels['deactivated'] = 'Filter edukalt keelatud.';
+$labels['activated'] = 'Filter edukalt lubatud.';
$labels['moved'] = 'Filter edukalt liigutatud.';
$labels['moveerror'] = 'Valitud filtri liigutamine nurjus. Ilmnes serveri tõrge.';
$labels['nametoolong'] = 'Nimi on liiga pikk.';
diff --git a/plugins/managesieve/localization/fa_IR.inc b/plugins/managesieve/localization/fa_IR.inc
index e4abb3f2a..9f20dab54 100644
--- a/plugins/managesieve/localization/fa_IR.inc
+++ b/plugins/managesieve/localization/fa_IR.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'ناتوانی در ایجاد مجموعه صاف
$labels['setcreated'] = 'مجموعه صافی‌ها با موفقیت ایجاد شد.';
$labels['activateerror'] = 'ناتوانی در فعال کردن صافی(های) انتخاب شده. خطای سرور رخ داد.';
$labels['deactivateerror'] = 'ناتوانی در غیرفعال کردن صافی(های) انتخاب شده. خطای سرور رخ داد.';
-$labels['activated'] = 'صافی(ها) با موفقیت غیرفعال شدند.';
-$labels['deactivated'] = 'صافی(ها) با موفقیت فعال شدند.';
+$labels['deactivated'] = 'صافی(ها) با موفقیت غیرفعال شدند.';
+$labels['activated'] = 'صافی(ها) با موفقیت فعال شدند.';
$labels['moved'] = 'صافی با موفقیت منتقل شد.';
$labels['moveerror'] = 'ناتوانی در انتقال صافی انتخاب شده. خطای سرور رخ داد.';
$labels['nametoolong'] = 'نام خیلی بلند.';
diff --git a/plugins/managesieve/localization/fi_FI.inc b/plugins/managesieve/localization/fi_FI.inc
index cee71428f..5a0c30954 100644
--- a/plugins/managesieve/localization/fi_FI.inc
+++ b/plugins/managesieve/localization/fi_FI.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Suodatinlistan luonti epäonnistui. Palvelin virhe.
$labels['setcreated'] = 'Suodatinlistan luonti onnistui.';
$labels['activateerror'] = 'Suodatinlistan päälle kytkeminen epäonnistui. Palvelin virhe.';
$labels['deactivateerror'] = 'Suodatinlistan pois päältä kytkeminen epäonnistui. Palvelin virhe.';
-$labels['activated'] = 'Suodatinlista(t) kytketty pois päältä onnistuneesti.';
-$labels['deactivated'] = 'Suodatinlista(t) kytketty päälle onnistuneesti.';
+$labels['deactivated'] = 'Suodatinlista(t) kytketty pois päältä onnistuneesti.';
+$labels['activated'] = 'Suodatinlista(t) kytketty päälle onnistuneesti.';
$labels['moved'] = 'Suodatin siirretty onnistuneesti.';
$labels['moveerror'] = 'Valitun suodattimen siirto epäonnistui palvelinvirheen vuoksi.';
$labels['nametoolong'] = 'Nimi on liian pitkä.';
diff --git a/plugins/managesieve/localization/fr_FR.inc b/plugins/managesieve/localization/fr_FR.inc
index 4151f6340..b0a4089d1 100644
--- a/plugins/managesieve/localization/fr_FR.inc
+++ b/plugins/managesieve/localization/fr_FR.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Impossible de créer le groupe de filtres. Le serve
$labels['setcreated'] = 'Le groupe de filtres a bien été créé.';
$labels['activateerror'] = 'Impossible d\'activer le(s) filtre(s) sélectionné(s). Une erreur serveur s\'est produite.';
$labels['deactivateerror'] = 'Impossible de désactiver le(s) filtre(s) sélectionné(s). Une erreur serveur s\'est produite.';
-$labels['activated'] = 'Filtre(s) désactivé(s) avec succès';
-$labels['deactivated'] = 'Filtre(s) activé(s) avec succès';
+$labels['deactivated'] = 'Filtre(s) désactivé(s) avec succès';
+$labels['activated'] = 'Filtre(s) activé(s) avec succès';
$labels['moved'] = 'Filtre déplacé avec succès.';
$labels['moveerror'] = 'Déplacement du filtre sélectionné impossible. Le serveur a renvoyé une erreur.';
$labels['nametoolong'] = 'Nom trop long.';
diff --git a/plugins/managesieve/localization/he_IL.inc b/plugins/managesieve/localization/he_IL.inc
index b44088bcb..2262841c1 100644
--- a/plugins/managesieve/localization/he_IL.inc
+++ b/plugins/managesieve/localization/he_IL.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'לא ניתן ליצור ערכת מסננים. א
$labels['setcreated'] = 'ערכת המסננים נוצרה בהצלחה.';
$labels['activateerror'] = 'לא ניתן להפעיל את המסננים הנבחרים. אירעה שגיאה בצד השרת.';
$labels['deactivateerror'] = 'לא ניתן לנטרל את המסננים הנבחרים. אירעה שגיאה בצד השרת.';
-$labels['activated'] = 'המסננים נוטרלו בהצלחה.';
-$labels['deactivated'] = 'המסננים הופעלו בהצלחה.';
+$labels['deactivated'] = 'המסננים נוטרלו בהצלחה.';
+$labels['activated'] = 'המסננים הופעלו בהצלחה.';
$labels['moved'] = 'המסנן הועבר בהצלחה.';
$labels['moveerror'] = 'לא ניתן להעביר את המסנן הנבחר. אירעה שגיאה בצד השרת.';
$labels['nametoolong'] = 'השם ארוך מדי.';
diff --git a/plugins/managesieve/localization/hr_HR.inc b/plugins/managesieve/localization/hr_HR.inc
index c4eaec0c3..4e0211868 100644
--- a/plugins/managesieve/localization/hr_HR.inc
+++ b/plugins/managesieve/localization/hr_HR.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Nemoguće stvoriti grupu filtera. Greška na poslu
$labels['setcreated'] = 'Grupa filtera je uspješno stvorena';
$labels['activateerror'] = 'Nije moguće omogućiti odabrani filter(e). Greška poslužitelja.';
$labels['deactivateerror'] = 'Nije moguće onemogučiti odabrane filter(e). Greška poslužitelja.';
-$labels['activated'] = 'Filter(i) onemogućen(i) uspješno.';
-$labels['deactivated'] = 'Filter(i) omogućen(i) uspješno.';
+$labels['deactivated'] = 'Filter(i) onemogućen(i) uspješno.';
+$labels['activated'] = 'Filter(i) omogućen(i) uspješno.';
$labels['moved'] = 'Filter uspješno premješten.';
$labels['moveerror'] = 'Nije moguće premjestiti odabrani filter. Greška poslužitelja.';
$labels['nametoolong'] = 'Nemoguće napraviti grupu filtera. Naziv je predugačak';
diff --git a/plugins/managesieve/localization/hu_HU.inc b/plugins/managesieve/localization/hu_HU.inc
index 117315812..179510087 100644
--- a/plugins/managesieve/localization/hu_HU.inc
+++ b/plugins/managesieve/localization/hu_HU.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Nem sikerült létrehozni a szűrő készletet. Sze
$labels['setcreated'] = 'A szűrő készlet sikeresen létrejött.';
$labels['activateerror'] = 'Nem sikerült engedélyezni a kiválasztott szűrö(k)et. Szerver hiba történt.';
$labels['deactivateerror'] = 'Nem sikerült kikapcsolni a kiválasztott szűrő(ke)t. Szerver hiba történt.';
-$labels['activated'] = 'Szűrő(k) sikeresen kikapcsolva.';
-$labels['deactivated'] = 'Szűrő(k) sikeresen bekapcsolva.';
+$labels['deactivated'] = 'Szűrő(k) sikeresen kikapcsolva.';
+$labels['activated'] = 'Szűrő(k) sikeresen bekapcsolva.';
$labels['moved'] = 'A szűrő sikeresen áthelyezve.';
$labels['moveerror'] = 'Az áthelyezés nem sikerült. Szerver hiba történt.';
$labels['nametoolong'] = 'Túll hosszu név';
diff --git a/plugins/managesieve/localization/hy_AM.inc b/plugins/managesieve/localization/hy_AM.inc
index ea4e982ea..be7d0fbd8 100644
--- a/plugins/managesieve/localization/hy_AM.inc
+++ b/plugins/managesieve/localization/hy_AM.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Սերվերի սխալ։ Զտիչների համա
$labels['setcreated'] = 'Զտիչների համալիրը ստեղծված է։';
$labels['activateerror'] = 'Սերվերի սխալ։ Նշված զտիչի միացման ձախողում։';
$labels['deactivateerror'] = 'Սերվերի սխալ։ Նշված զտիչի անջատման ձախողում։';
-$labels['activated'] = 'Զտիչի անջատված է։';
-$labels['deactivated'] = 'Զտիչի միացված է։';
+$labels['deactivated'] = 'Զտիչի անջատված է։';
+$labels['activated'] = 'Զտիչի միացված է։';
$labels['moved'] = 'Զտիչի տեղափոխված է։';
$labels['moveerror'] = 'Սերվերի սխալ։ Նշված զտիչի տեղափոխման ձախողում։';
$labels['nametoolong'] = 'Անունը չափազանց երկար է։';
diff --git a/plugins/managesieve/localization/id_ID.inc b/plugins/managesieve/localization/id_ID.inc
index 1fe121a32..b9fe47659 100644
--- a/plugins/managesieve/localization/id_ID.inc
+++ b/plugins/managesieve/localization/id_ID.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Tidak bisa membuat kumpulan penyaringan. Terjadi ga
$labels['setcreated'] = 'Kumpulan penyaringan berhasul dibuat.';
$labels['activateerror'] = 'Tidak bisa menghidupkan penyaringan terpilih. terjadi galat pada server.';
$labels['deactivateerror'] = 'Tidak bisa mematikan penyaringan terpilih. Terjadi galat pada server.';
-$labels['activated'] = 'Berhasil mematikan penyaringan.';
-$labels['deactivated'] = 'Berhasil menghidupkan penyaringan.';
+$labels['deactivated'] = 'Berhasil mematikan penyaringan.';
+$labels['activated'] = 'Berhasil menghidupkan penyaringan.';
$labels['moved'] = 'Berhasil memindahkan penyaringan.';
$labels['moveerror'] = 'Tidak bisa memindahkan penyaringan terpilih. Terjadi galat pada server.';
$labels['nametoolong'] = 'Kepanjangan nama.';
diff --git a/plugins/managesieve/localization/it_IT.inc b/plugins/managesieve/localization/it_IT.inc
index 53e7d0998..553377ab9 100644
--- a/plugins/managesieve/localization/it_IT.inc
+++ b/plugins/managesieve/localization/it_IT.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Impossibile creare il gruppo. Errore del server';
$labels['setcreated'] = 'Gruppo di filtri creato';
$labels['activateerror'] = 'impossibile selezionare il filtro (server error)';
$labels['deactivateerror'] = 'impossibile disabilitare il filtro (server error)';
-$labels['activated'] = 'filtro disabilitato';
-$labels['deactivated'] = 'filtro abilitato';
+$labels['deactivated'] = 'filtro disabilitato';
+$labels['activated'] = 'filtro abilitato';
$labels['moved'] = 'filtro spostato';
$labels['moveerror'] = 'impossibile spostare il filtro (server error)';
$labels['nametoolong'] = 'Impossibile creare il gruppo: Nome troppo lungo';
diff --git a/plugins/managesieve/localization/ja_JP.inc b/plugins/managesieve/localization/ja_JP.inc
index f7b96b7d1..5bb75f882 100644
--- a/plugins/managesieve/localization/ja_JP.inc
+++ b/plugins/managesieve/localization/ja_JP.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'フィルターセットを作成できませんで
$labels['setcreated'] = 'フィルターセットを作成しました。';
$labels['activateerror'] = '選択したフィルターを有効にできませんでした。サーバーでエラーが発生しました。';
$labels['deactivateerror'] = '選択したフィルターを無効にできませんでした。サーバーでエラーが発生しました。';
-$labels['activated'] = 'フィルターを無効にしました。';
-$labels['deactivated'] = 'フィルターを有効にしました。';
+$labels['deactivated'] = 'フィルターを無効にしました。';
+$labels['activated'] = 'フィルターを有効にしました。';
$labels['moved'] = 'フィルターを移動しました。';
$labels['moveerror'] = '選択したフィルターを移動できませんでした。サーバーでエラーが発生しました。';
$labels['nametoolong'] = '名前が長すぎます。';
diff --git a/plugins/managesieve/localization/ko_KR.inc b/plugins/managesieve/localization/ko_KR.inc
index c3fff4115..8a20a17e4 100644
--- a/plugins/managesieve/localization/ko_KR.inc
+++ b/plugins/managesieve/localization/ko_KR.inc
@@ -120,8 +120,8 @@ $labels['setcreateerror'] = '필터 묶음을 생성할 수 없음. 서버 에
$labels['setcreated'] = '필터 묶음을 성공적으로 생성 함.';
$labels['activateerror'] = '선택한 필터(들)을 동작하게 할 수 없음. 서버 에러 발생 함.';
$labels['deactivateerror'] = '선택한 필터(들)을 동작하지 않게 할 수 없음. 서버 에러 발생 함.';
-$labels['activated'] = '필터(들)을 동작하지 않게 하는데 성공하였음.';
-$labels['deactivated'] = '필터(들)을 동작하게 하는데 성공하였음.';
+$labels['deactivated'] = '필터(들)을 동작하지 않게 하는데 성공하였음.';
+$labels['activated'] = '필터(들)을 동작하게 하는데 성공하였음.';
$labels['moved'] = '필터를 이동하는 데 성공하였음.';
$labels['moveerror'] = '선택한 필터를 이동할 수 없음. 서버 에러 발생 함.';
$labels['nametoolong'] = '이름이 너무 김.';
diff --git a/plugins/managesieve/localization/ml_IN.inc b/plugins/managesieve/localization/ml_IN.inc
index ed3d7675c..012278ec8 100644
--- a/plugins/managesieve/localization/ml_IN.inc
+++ b/plugins/managesieve/localization/ml_IN.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'അരിപ്പയുടെ കൂട്ടത
$labels['setcreated'] = 'അരിപ്പകളുടെ കൂട്ടത്തെ വിജയകരമായി നിര്‍മ്മിച്ചു.';
$labels['activateerror'] = 'അരിപ്പ (കള്‍) പ്രവര്‍ത്തനസജ്ജം ആക്കാന്‍ സാധിച്ചില്ല. സേവകനില്‍ കുഴപ്പം!';
$labels['deactivateerror'] = 'അരിപ്പ (കള്‍) നിര്‍വീര്യം ആക്കാന്‍ സാധിച്ചില്ല. സേവകനില്‍ കുഴപ്പം!';
-$labels['activated'] = 'അരിപ്പകള്‍ നിര്‍വീര്യം ആക്കപ്പെട്ടിരിക്കുന്നു';
-$labels['deactivated'] = 'അരിപ്പ വിജകരമായി പ്രവര്‍ത്തനസജ്ജമാക്കി.';
+$labels['deactivated'] = 'അരിപ്പകള്‍ നിര്‍വീര്യം ആക്കപ്പെട്ടിരിക്കുന്നു';
+$labels['activated'] = 'അരിപ്പ വിജകരമായി പ്രവര്‍ത്തനസജ്ജമാക്കി.';
$labels['moved'] = 'അരിപ്പ വിജകരമായി മാറ്റി.';
$labels['moveerror'] = 'തെരഞ്ഞെടുത്ത അരിപ്പ മാറ്റാന്‍ സാധിച്ചില്ല. സേവകനില്‍ കുഴപ്പം.';
$labels['nametoolong'] = 'പേരിന് നീളം കൂടുതല്‍.';
diff --git a/plugins/managesieve/localization/nb_NO.inc b/plugins/managesieve/localization/nb_NO.inc
index b172685a2..ee6d578b7 100644
--- a/plugins/managesieve/localization/nb_NO.inc
+++ b/plugins/managesieve/localization/nb_NO.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Kunne ikke opprette filtersettet. Det oppsto en tje
$labels['setcreated'] = 'Filtersett opprettet.';
$labels['activateerror'] = 'Kunne ikke skru på valgte filter. Det oppsto en tjenerfeil.';
$labels['deactivateerror'] = 'Kunne ikke skru av valgte filter. Det oppsto en tjenerfeil.';
-$labels['activated'] = 'Filter skrudd av.';
-$labels['deactivated'] = 'Filter ble skrudd på.';
+$labels['deactivated'] = 'Filter skrudd av.';
+$labels['activated'] = 'Filter ble skrudd på.';
$labels['moved'] = 'Filter ble flyttet.';
$labels['moveerror'] = 'Kunne ikke flytte valgte filter. Det oppsto en tjenerfeil.';
$labels['nametoolong'] = 'Navnet er for langt.';
diff --git a/plugins/managesieve/localization/nl_NL.inc b/plugins/managesieve/localization/nl_NL.inc
index 8ee5e2bbf..56b1c95ee 100644
--- a/plugins/managesieve/localization/nl_NL.inc
+++ b/plugins/managesieve/localization/nl_NL.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Filterverzameling kon niet aangemaakt worden. Er tr
$labels['setcreated'] = 'Filterverzameling succesvol aangemaakt.';
$labels['activateerror'] = 'Geselecteerde filter(s) konden niet ingeschakeld worden. Er trad een serverfout op.';
$labels['deactivateerror'] = 'Geselecteerde filter(s) konden niet uitgeschakeld worden. Er trad een serverfout op.';
-$labels['activated'] = 'Filter(s) succesvol uitgeschakeld.';
-$labels['deactivated'] = 'Filter(s) succesvol ingeschakeld.';
+$labels['deactivated'] = 'Filter(s) succesvol uitgeschakeld.';
+$labels['activated'] = 'Filter(s) succesvol ingeschakeld.';
$labels['moved'] = 'Filter succesvol verplaatst.';
$labels['moveerror'] = 'Geselecteerde filter(s) konden niet verplaatst worden. Er trad een serverfout op.';
$labels['nametoolong'] = 'Naam is te lang.';
diff --git a/plugins/managesieve/localization/pl_PL.inc b/plugins/managesieve/localization/pl_PL.inc
index 734a4ebcf..e078f4944 100644
--- a/plugins/managesieve/localization/pl_PL.inc
+++ b/plugins/managesieve/localization/pl_PL.inc
@@ -158,8 +158,8 @@ $labels['setcreateerror'] = 'Nie można utworzyć zbioru filtrów. Błąd serwer
$labels['setcreated'] = 'Zbiór filtrów został utworzony pomyślnie.';
$labels['activateerror'] = 'Nie można włączyć wybranych filtrów. Błąd serwera.';
$labels['deactivateerror'] = 'Nie można wyłączyć wybranych filtrów. Błąd serwera.';
-$labels['activated'] = 'Filtr(y) wyłączono pomyślnie.';
-$labels['deactivated'] = 'Filtr(y) włączono pomyślnie.';
+$labels['deactivated'] = 'Filtr(y) wyłączono pomyślnie.';
+$labels['activated'] = 'Filtr(y) włączono pomyślnie.';
$labels['moved'] = 'Filter został przeniesiony pomyślnie.';
$labels['moveerror'] = 'Nie można przenieść wybranego filtra. Błąd serwera.';
$labels['nametoolong'] = 'Zbyt długa nazwa.';
diff --git a/plugins/managesieve/localization/pt_BR.inc b/plugins/managesieve/localization/pt_BR.inc
index f0e890d86..f4b64584a 100644
--- a/plugins/managesieve/localization/pt_BR.inc
+++ b/plugins/managesieve/localization/pt_BR.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Não foi possível criar o conjunto de filtros. Oco
$labels['setcreated'] = 'Conjunto de filtros criado com sucesso.';
$labels['activateerror'] = 'Não foi possível habilitar o(s) filtro(s) selecionado(s). Ocorreu um erro no servidor.';
$labels['deactivateerror'] = 'Não foi possível desabilitar o(s) filtro(s) selecionado(s). Ocorreu um erro no servidor.';
-$labels['activated'] = 'Filtro(s) desabilitado(s) com sucesso.';
-$labels['deactivated'] = 'Filtro(s) habilitado(s) com sucesso.';
+$labels['deactivated'] = 'Filtro(s) desabilitado(s) com sucesso.';
+$labels['activated'] = 'Filtro(s) habilitado(s) com sucesso.';
$labels['moved'] = 'Filtro movido com sucesso.';
$labels['moveerror'] = 'Não foi possível mover o filtro selecionado. Ocorreu um erro no servidor.';
$labels['nametoolong'] = 'Nome muito longo.';
diff --git a/plugins/managesieve/localization/pt_PT.inc b/plugins/managesieve/localization/pt_PT.inc
index bb0c781a1..8a0a1da3e 100644
--- a/plugins/managesieve/localization/pt_PT.inc
+++ b/plugins/managesieve/localization/pt_PT.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Não foi possível criar o conjunto de filtros. Oco
$labels['setcreated'] = 'Conjunto de filtros criado com sucesso.';
$labels['activateerror'] = 'Não foi possível ativar os filtros selecionados. Ocorreu um erro no servidor.';
$labels['deactivateerror'] = 'Não foi possível desativar os filtros selecionados. Ocorreu um erro no servidor.';
-$labels['activated'] = 'Filtro(s) desativado(s) com sucesso.';
-$labels['deactivated'] = 'Filtro(s) ativado(s) com sucesso.';
+$labels['deactivated'] = 'Filtro(s) desativado(s) com sucesso.';
+$labels['activated'] = 'Filtro(s) ativado(s) com sucesso.';
$labels['moved'] = 'Filtro movido com sucesso.';
$labels['moveerror'] = 'Não foi possível mover o filtro selecionado. Ocorreu um erro no servidor.';
$labels['nametoolong'] = 'Nome demasiado longo.';
diff --git a/plugins/managesieve/localization/ro_RO.inc b/plugins/managesieve/localization/ro_RO.inc
index 755ee03f0..888985233 100644
--- a/plugins/managesieve/localization/ro_RO.inc
+++ b/plugins/managesieve/localization/ro_RO.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Nu am putut crea setul de filtre. S-a produs o eroa
$labels['setcreated'] = 'Setul de filtre creat cu succes.';
$labels['activateerror'] = 'Nu am putut activa filtrele selectate. S-a produs o eroare la server.';
$labels['deactivateerror'] = 'Nu am putut dezactiva filtrele selectate. S-a produs o eroare la server.';
-$labels['activated'] = 'Filtrele au fost dezactivate cu succes.';
-$labels['deactivated'] = 'Filtrele au fost activate cu succes.';
+$labels['deactivated'] = 'Filtrele au fost dezactivate cu succes.';
+$labels['activated'] = 'Filtrele au fost activate cu succes.';
$labels['moved'] = 'Filtrele au fost mutate cu succes.';
$labels['moveerror'] = 'Nu am putut muta filtreele selectate. S-a produs o eroare la server.';
$labels['nametoolong'] = 'Numele este prea lung.';
diff --git a/plugins/managesieve/localization/ru_RU.inc b/plugins/managesieve/localization/ru_RU.inc
index cfc2ac1e4..0689bd884 100644
--- a/plugins/managesieve/localization/ru_RU.inc
+++ b/plugins/managesieve/localization/ru_RU.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Невозможно создать набор фи
$labels['setcreated'] = 'Набор фильтров успешно создан.';
$labels['activateerror'] = 'Невозможно включить выбранный(е) фильтр(ы). Ошибка сервера.';
$labels['deactivateerror'] = 'Невозможно выключить выбранный(е) фильтр(ы). Ошибка сервера.';
-$labels['activated'] = 'Фильтр(ы) успешно отключен(ы).';
-$labels['deactivated'] = 'Фильтр(ы) успешно включен(ы).';
+$labels['deactivated'] = 'Фильтр(ы) успешно отключен(ы).';
+$labels['activated'] = 'Фильтр(ы) успешно включен(ы).';
$labels['moved'] = 'Фильтр успешно перемещён.';
$labels['moveerror'] = 'Невозможно переместить фильтр. Ошибка сервера.';
$labels['nametoolong'] = 'Невозможно создать набор фильтров. Название слишком длинное.';
diff --git a/plugins/managesieve/localization/sk_SK.inc b/plugins/managesieve/localization/sk_SK.inc
index 7d78c7fd2..337dfa690 100644
--- a/plugins/managesieve/localization/sk_SK.inc
+++ b/plugins/managesieve/localization/sk_SK.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Nepodarilo sa vytvoriť sadu filtrov, server ohlás
$labels['setcreated'] = 'Sada filtrov bola vytvorená';
$labels['activateerror'] = 'Nepodarilo sa povoliť vybraný filter(e). Chyba servera.';
$labels['deactivateerror'] = 'Nepodarilo sa vypnúť vybraný filter(e). Chyba servera.';
-$labels['activated'] = 'Filter(e) úspešne vypnutý.';
-$labels['deactivated'] = 'Filter(e) povolený.';
+$labels['deactivated'] = 'Filter(e) úspešne vypnutý.';
+$labels['activated'] = 'Filter(e) povolený.';
$labels['moved'] = 'Filter presunutý.';
$labels['moveerror'] = 'Nemôžem presunúť zvolený filter. Chyba servera.';
$labels['nametoolong'] = 'Názov sady filtrov je príliš dlhý';
diff --git a/plugins/managesieve/localization/sl_SI.inc b/plugins/managesieve/localization/sl_SI.inc
index a0b61e70e..f29522568 100644
--- a/plugins/managesieve/localization/sl_SI.inc
+++ b/plugins/managesieve/localization/sl_SI.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Filtra ni bilo mogoče ustvariti. Prišlo je do nap
$labels['setcreated'] = 'Filter je bil uspešno ustvarjen.';
$labels['activateerror'] = 'Izbranega/ih filtra/ov ni bilo mogoče vključiti. Prišlo je do napake na strežniku.';
$labels['deactivateerror'] = 'Izbranega/ih fitra/ov ni bilo mogoče izključiti. Prišlo je do napake na strežniku.';
-$labels['activated'] = 'Filtri so bili uspešno onemogočeni.';
-$labels['deactivated'] = 'Filtri so bili uspešno omogočeni.';
+$labels['deactivated'] = 'Filtri so bili uspešno onemogočeni.';
+$labels['activated'] = 'Filtri so bili uspešno omogočeni.';
$labels['moved'] = 'Filter je bil uspešno premaknjen.';
$labels['moveerror'] = 'Izbranega filtra ni bilo mogoče premakniti. Prišlo je do napake na strežniku.';
$labels['nametoolong'] = 'Ime je predolgo.';
diff --git a/plugins/managesieve/localization/sv_SE.inc b/plugins/managesieve/localization/sv_SE.inc
index 0dc8ce8fe..d7c1c76a1 100644
--- a/plugins/managesieve/localization/sv_SE.inc
+++ b/plugins/managesieve/localization/sv_SE.inc
@@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Filtergruppen kunde inte läggas till på grund av
$labels['setcreated'] = 'Filtergruppen har lagts till';
$labels['activateerror'] = 'Kunde inte aktivera filter på grund av serverfel.';
$labels['deactivateerror'] = 'Kunde inte deaktivera filter på grund av serverfel.';
-$labels['activated'] = 'Filter deaktiverat.';
-$labels['deactivated'] = 'Filter aktiverat.';
+$labels['deactivated'] = 'Filter deaktiverat.';
+$labels['activated'] = 'Filter aktiverat.';
$labels['moved'] = 'Filter flyttat.';
$labels['moveerror'] = 'Kunde inte flytta filter på grund av serverfel.';
$labels['nametoolong'] = 'Filtergruppen kan inte läggas till med för långt namn';
diff --git a/plugins/managesieve/localization/tr_TR.inc b/plugins/managesieve/localization/tr_TR.inc
index 14dd44b19..9c3eb7e60 100644
--- a/plugins/managesieve/localization/tr_TR.inc
+++ b/plugins/managesieve/localization/tr_TR.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Filtre setleri oluşturulamadı. Sunucuda hata olu
$labels['setcreated'] = 'Filtre setleri başarıyla oluşturuldu.';
$labels['activateerror'] = 'Seçilen filtre(ler) etkinleştirilemedi. Sunucuda hata oluştu.';
$labels['deactivateerror'] = 'Seçilen filtre(ler) pasifleştirilemedi. Sunucuda hata oluştu.';
-$labels['activated'] = 'Filtre(ler) başarıyla iptal edildi.';
-$labels['deactivated'] = 'Filtre(ler) başarıyla etkinleştirildi.';
+$labels['deactivated'] = 'Filtre(ler) başarıyla iptal edildi.';
+$labels['activated'] = 'Filtre(ler) başarıyla etkinleştirildi.';
$labels['moved'] = 'Filtre başarıyla taşındı.';
$labels['moveerror'] = 'Seçilen filtre(ler) taşınamadı. Sunucuda hata oluştu.';
$labels['nametoolong'] = 'İsim çok uzun.';
diff --git a/plugins/managesieve/localization/vi_VN.inc b/plugins/managesieve/localization/vi_VN.inc
index d358960ad..14e098dce 100644
--- a/plugins/managesieve/localization/vi_VN.inc
+++ b/plugins/managesieve/localization/vi_VN.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Không thể tạo thiết lập bộ lọc. Có l
$labels['setcreated'] = 'Thiết lập bộ lọc được tạo thành công';
$labels['activateerror'] = 'Không thể khởi động bộ lọc được chọn. Có lỗi xuất hiện ở máy chủ';
$labels['deactivateerror'] = 'Không thể tắt bộ lọc đã chọn. Có lỗi xuất hiện ở máy chủ';
-$labels['activated'] = 'Bộ lọc được tắt thành công';
-$labels['deactivated'] = 'Bộ lọc được khởi động thành công';
+$labels['deactivated'] = 'Bộ lọc được tắt thành công';
+$labels['activated'] = 'Bộ lọc được khởi động thành công';
$labels['moved'] = 'Bộ lọc được chuyển đi thành công';
$labels['moveerror'] = 'Không thể chuyển bộc lọc đã chọn. Có lỗi xuất hiện ở máy chủ';
$labels['nametoolong'] = 'Tên quá dài';
diff --git a/plugins/managesieve/localization/zh_CN.inc b/plugins/managesieve/localization/zh_CN.inc
index 8cbe48778..e44fe07a8 100644
--- a/plugins/managesieve/localization/zh_CN.inc
+++ b/plugins/managesieve/localization/zh_CN.inc
@@ -138,8 +138,8 @@ $labels['setcreateerror'] = '无法创建过滤器,服务器错误。';
$labels['setcreated'] = '过滤器成功创建。';
$labels['activateerror'] = '无法启用选中的过滤器,因为服务器发生错误。';
$labels['deactivateerror'] = '无法禁用选中的过滤器,因为服务器发生错误。';
-$labels['activated'] = '禁用过滤器成功。';
-$labels['deactivated'] = '启用过滤器成功。';
+$labels['deactivated'] = '禁用过滤器成功。';
+$labels['activated'] = '启用过滤器成功。';
$labels['moved'] = '过滤器移动成功。';
$labels['moveerror'] = '无法移动选中的过滤器,因为服务器发生错误。';
$labels['nametoolong'] = '名称太长。';
diff --git a/plugins/managesieve/localization/zh_TW.inc b/plugins/managesieve/localization/zh_TW.inc
index db2292b9a..4899d162b 100644
--- a/plugins/managesieve/localization/zh_TW.inc
+++ b/plugins/managesieve/localization/zh_TW.inc
@@ -126,8 +126,8 @@ $labels['setcreateerror'] = '無法建立篩選器集合。 伺服器發生錯
$labels['setcreated'] = '篩選器集合成功建立';
$labels['activateerror'] = '無法啟用選擇的篩選器。伺服器錯誤';
$labels['deactivateerror'] = '無法停用選擇的篩選器。伺服器錯誤';
-$labels['activated'] = '篩選器已停用';
-$labels['deactivated'] = '篩選器已啟用';
+$labels['deactivated'] = '篩選器已停用';
+$labels['activated'] = '篩選器已啟用';
$labels['moved'] = '篩選器已移動';
$labels['moveerror'] = '無法移動選擇的篩選器。伺服器錯誤';
$labels['nametoolong'] = '無法建立篩選器集合。 名稱太長';
diff --git a/program/include/html.php b/program/include/html.php
index 234985241..880873ddc 100644
--- a/program/include/html.php
+++ b/program/include/html.php
@@ -334,7 +334,7 @@ class html
*/
public static function quote($str)
{
- return htmlspecialchars($str, ENT_COMPAT, RCMAIL_CHARSET);
+ return @htmlspecialchars($str, ENT_COMPAT, RCMAIL_CHARSET);
}
}
diff --git a/program/include/iniset.php b/program/include/iniset.php
index a2f43b380..82278c9f8 100644
--- a/program/include/iniset.php
+++ b/program/include/iniset.php
@@ -34,7 +34,9 @@ $config = array(
);
foreach ($config as $optname => $optval) {
if ($optval != ini_get($optname) && @ini_set($optname, $optval) === false) {
- die("ERROR: Wrong '$optname' option value. Read REQUIREMENTS section in INSTALL file or use Roundcube Installer, please!");
+ die("ERROR: Wrong '$optname' option value and it wasn't possible to set it to required value ($optval).\n"
+ ."Check your PHP configuration (including php_admin_flag).\n"
+ ."Read REQUIREMENTS section in INSTALL file or use Roundcube Installer!");
}
}
diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index ec3d537ec..c2f76b388 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -258,8 +258,8 @@ class rcmail extends rcube
$autocomplete = (array) $this->config->get('autocomplete_addressbooks');
$list = array();
- // We are using the DB address book
- if ($abook_type != 'ldap') {
+ // We are using the DB address book or a plugin address book
+ if ($abook_type != 'ldap' && $abook_type != '') {
if (!isset($this->address_books['0']))
$this->address_books['0'] = new rcube_contacts($this->db, $this->get_user_id());
$list['0'] = array(
@@ -452,6 +452,10 @@ class rcmail extends rcube
$username .= '@'.rcube_utils::parse_host($config['username_domain'], $host);
}
+ if (!isset($config['login_lc'])) {
+ $config['login_lc'] = 2; // default
+ }
+
// Convert username to lowercase. If storage backend
// is case-insensitive we need to store always the same username (#1487113)
if ($config['login_lc']) {
@@ -483,21 +487,7 @@ class rcmail extends rcube
$storage = $this->get_storage();
// try to log in
- if (!($login = $storage->connect($host, $username, $pass, $port, $ssl))) {
- // try with lowercase
- $username_lc = mb_strtolower($username);
- if ($username_lc != $username) {
- // try to find user record again -> overwrite username
- if (!$user && ($user = rcube_user::query($username_lc, $host)))
- $username_lc = $user->data['username'];
-
- if ($login = $storage->connect($host, $username_lc, $pass, $port, $ssl))
- $username = $username_lc;
- }
- }
-
- // exit if login failed
- if (!$login) {
+ if (!$storage->connect($host, $username, $pass, $port, $ssl)) {
return false;
}
@@ -2112,8 +2102,7 @@ class rcmail extends rcube
if (!$storage->connect($host, $user, $pass, $port, $ssl)) {
if (is_object($this->output)) {
- $error = $storage->get_error_code() == -1 ? 'storageerror' : 'sessionerror';
- $this->output->show_message($error, 'error');
+ $this->output->show_message('storageerror', 'error');
}
}
else {
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index 1e6cf360b..a89fd164d 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -4119,6 +4119,11 @@ class rcube_imap extends rcube_storage
return $this->delete_folder($folder);
}
+ function clear_mailbox($folder = null)
+ {
+ return $this->clear_folder($folder);
+ }
+
public function mailbox_exists($folder, $subscription=false)
{
return $this->folder_exists($folder, $subscription);
diff --git a/program/include/rcube_message.php b/program/include/rcube_message.php
index c189df57d..38d18171c 100644
--- a/program/include/rcube_message.php
+++ b/program/include/rcube_message.php
@@ -372,9 +372,10 @@ class rcube_message
foreach ($structure->parts as $p => $sub_part) {
$sub_mimetype = $sub_part->mimetype;
- // skip empty parts
- if (!$sub_part->size)
+ // skip empty text parts
+ if (!$sub_part->size && preg_match('#^text/(plain|html|enriched)$#', $sub_mimetype)) {
continue;
+ }
// check if sub part is
if ($sub_mimetype == 'text/plain')
diff --git a/program/include/rcube_output.php b/program/include/rcube_output.php
index 9aa7c9eba..5c582e67c 100644
--- a/program/include/rcube_output.php
+++ b/program/include/rcube_output.php
@@ -44,7 +44,7 @@ abstract class rcube_output
*/
public function __construct($task = null, $framed = false)
{
- $this->app = rcmail::get_instance();
+ $this->app = rcube::get_instance();
$this->config = $this->app->config;
$this->browser = new rcube_browser();
}
diff --git a/program/include/rcube_output_html.php b/program/include/rcube_output_html.php
index 616ab3883..d42171869 100644
--- a/program/include/rcube_output_html.php
+++ b/program/include/rcube_output_html.php
@@ -33,7 +33,7 @@ class rcube_output_html extends rcube_output
protected $js_env = array();
protected $js_labels = array();
protected $js_commands = array();
- protected $plugin_skin_path;
+ protected $skin_paths = array();
protected $template_name;
protected $scripts_path = '';
protected $script_files = array();
@@ -164,9 +164,27 @@ class rcube_output_html extends rcube_output
$this->config->set('skin_path', $skin_path);
+ // register skin path(s)
+ $this->skin_paths = array();
+ $this->load_skin($skin_path);
+
return $valid;
}
+ /**
+ * Helper method to recursively read skin meta files and register search paths
+ */
+ private function load_skin($skin_path)
+ {
+ $this->skin_paths[] = $skin_path;
+
+ // read meta file and check for dependecies
+ $meta = @json_decode(@file_get_contents($skin_path.'/meta.json'), true);
+ if ($meta['extends'] && is_dir('skins/' . $meta['extends'])) {
+ $this->load_skin('skins/' . $meta['extends']);
+ }
+ }
+
/**
* Check if a specific template exists
@@ -176,8 +194,14 @@ class rcube_output_html extends rcube_output
*/
public function template_exists($name)
{
- $filename = $this->config->get('skin_path') . '/templates/' . $name . '.html';
- return (is_file($filename) && is_readable($filename)) || ($this->deprecated_templates[$name] && $this->template_exists($this->deprecated_templates[$name]));
+ $found = false;
+ foreach ($this->skin_paths as $skin_path) {
+ $filename = $skin_path . '/templates/' . $name . '.html';
+ $found = (is_file($filename) && is_readable($filename)) || ($this->deprecated_templates[$name] && $this->template_exists($this->deprecated_templates[$name]));
+ if ($found)
+ break;
+ }
+ return $found;
}
@@ -364,41 +388,60 @@ class rcube_output_html extends rcube_output
*/
function parse($name = 'main', $exit = true, $write = true)
{
- $skin_path = $this->config->get('skin_path');
$plugin = false;
$realname = $name;
- $temp = explode('.', $name, 2);
-
- $this->plugin_skin_path = null;
- $this->template_name = $realname;
+ $this->template_name = $realname;
+ $temp = explode('.', $name, 2);
if (count($temp) > 1) {
$plugin = $temp[0];
$name = $temp[1];
$skin_dir = $plugin . '/skins/' . $this->config->get('skin');
- $skin_path = $this->plugin_skin_path = $this->app->plugins->dir . $skin_dir;
- // fallback to default skin
- if (!is_dir($skin_path)) {
+ // apply skin search escalation list to plugin directory
+ $plugin_skin_paths = array();
+ foreach ($this->skin_paths as $skin_path) {
+ $plugin_skin_paths[] = $this->app->plugins->dir . $plugin . '/' . $skin_path;
+ }
+
+ // add fallback to default skin
+ if (is_dir($this->app->plugins->dir . $plugin . '/skins/default')) {
$skin_dir = $plugin . '/skins/default';
- $skin_path = $this->plugin_skin_path = $this->app->plugins->dir . $skin_dir;
+ $plugin_skin_paths[] = $this->app->plugins->dir . $skin_dir;
}
+
+ // add plugin skin paths to search list
+ $this->skin_paths = array_merge($plugin_skin_paths, $this->skin_paths);
}
- $path = "$skin_path/templates/$name.html";
+ // find skin template
+ $path = false;
+ foreach ($this->skin_paths as $skin_path) {
+ $path = "$skin_path/templates/$name.html";
- if (!is_readable($path) && $this->deprecated_templates[$realname]) {
- $path = "$skin_path/templates/".$this->deprecated_templates[$realname].".html";
- if (is_readable($path))
- rcube::raise_error(array('code' => 502, 'type' => 'php',
+ // fallback to deprecated template names
+ if (!is_readable($path) && $this->deprecated_templates[$realname]) {
+ $path = "$skin_path/templates/" . $this->deprecated_templates[$realname] . ".html";
+ rcube::raise_error(array(
+ 'code' => 502, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__,
- 'message' => "Using deprecated template '".$this->deprecated_templates[$realname]
- ."' in $skin_path/templates. Please rename to '".$realname."'"),
- true, false);
+ 'message' => "Using deprecated template '" . $this->deprecated_templates[$realname]
+ . "' in $skin_path/templates. Please rename to '$realname'"),
+ true, false);
+ }
+
+ if (is_readable($path)) {
+ $this->config->set('skin_path', $skin_path);
+ $this->base_path = $skin_path;
+ break;
+ }
+ else {
+ $path = false;
+ }
}
// read template file
- if (($templ = @file_get_contents($path)) === false) {
+ if (!$path || ($templ = @file_get_contents($path)) === false) {
rcube::raise_error(array(
'code' => 501,
'type' => 'php',
@@ -426,7 +469,7 @@ class rcube_output_html extends rcube_output
$output = $hook['content'];
unset($hook['content']);
- $output = $this->parse_with_globals($output);
+ $output = $this->parse_with_globals($this->fix_paths($output));
// make sure all <form> tags have a valid request token
$output = preg_replace_callback('/<form\s+([^>]+)>/Ui', array($this, 'alter_form_tag'), $output);
@@ -498,7 +541,7 @@ class rcube_output_html extends rcube_output
public function abs_url($str)
{
if ($str[0] == '/')
- return $this->config->get('skin_path') . $str;
+ return $this->base_path . $str;
else
return $str;
}
@@ -532,7 +575,7 @@ class rcube_output_html extends rcube_output
{
$GLOBALS['__version'] = html::quote(RCMAIL_VERSION);
$GLOBALS['__comm_path'] = html::quote($this->app->comm_path);
- $GLOBALS['__skin_path'] = html::quote($this->config->get('skin_path'));
+ $GLOBALS['__skin_path'] = html::quote($this->base_path);
return preg_replace_callback('/\$(__[a-z0-9_\-]+)/',
array($this, 'globals_callback'), $input);
@@ -549,6 +592,43 @@ class rcube_output_html extends rcube_output
/**
+ * Correct absolute paths in images and other tags
+ * add timestamp to .js and .css filename
+ */
+ protected function fix_paths($output)
+ {
+ return preg_replace_callback(
+ '!(src|href|background)=(["\']?)([a-z0-9/_.-]+)(["\'\s>])!i',
+ array($this, 'file_callback'), $output);
+ }
+
+
+ /**
+ * Callback function for preg_replace_callback in write()
+ *
+ * @return string Parsed string
+ */
+ protected function file_callback($matches)
+ {
+ $file = $matches[3];
+
+ // correct absolute paths
+ if ($file[0] == '/') {
+ $file = $this->base_path . $file;
+ }
+
+ // add file modification timestamp
+ if (preg_match('/\.(js|css)$/', $file)) {
+ if ($fs = @filemtime($file)) {
+ $file .= '?s=' . $fs;
+ }
+ }
+
+ return $matches[1] . '=' . $matches[2] . $file . $matches[4];
+ }
+
+
+ /**
* Public wrapper to dipp into template parsing.
*
* @param string $input
@@ -710,6 +790,9 @@ class rcube_output_html extends rcube_output
// show a label
case 'label':
+ if ($attrib['expression'])
+ $attrib['name'] = eval("return " . $this->parse_expression($attrib['expression']) .";");
+
if ($attrib['name'] || $attrib['command']) {
// @FIXME: 'noshow' is useless, remove?
if ($attrib['noshow']) {
@@ -741,8 +824,17 @@ class rcube_output_html extends rcube_output
// include a file
case 'include':
- if (!$this->plugin_skin_path || !is_file($path = realpath($this->plugin_skin_path . $attrib['file'])))
- $path = realpath(($attrib['skin_path'] ? $attrib['skin_path'] : $this->config->get('skin_path')).$attrib['file']);
+ $old_base_path = $this->base_path;
+ $skin_paths = $this->skin_paths;
+ if ($attrib['skin_path'])
+ array_unshift($skin_paths, $attrib['skin_path']);
+ foreach ($skin_paths as $skin_path) {
+ $path = realpath($skin_path . $attrib['file']);
+ if (is_file($path)) {
+ $this->base_path = $skin_path;
+ break;
+ }
+ }
if (is_readable($path)) {
if ($this->config->get('skin_include_php')) {
@@ -752,14 +844,16 @@ class rcube_output_html extends rcube_output
$incl = file_get_contents($path);
}
$incl = $this->parse_conditions($incl);
- return $this->parse_xml($incl);
+ $incl = $this->parse_xml($incl);
+ $incl = $this->fix_paths($incl);
+ $this->base_path = $old_base_path;
+ return $incl;
}
break;
case 'plugin.include':
$hook = $this->app->plugins->exec_hook("template_plugin_include", $attrib);
return $hook['content'];
- break;
// define a container block
case 'container':
@@ -1239,14 +1333,6 @@ class rcube_output_html extends rcube_output
$output = substr_replace($output, $css, $pos, 0);
}
- $this->base_path = $base_path;
-
- // correct absolute paths in images and other tags
- // add timestamp to .js and .css filename
- $output = preg_replace_callback(
- '!(src|href|background)=(["\']?)([a-z0-9/_.-]+)(["\'\s>])!i',
- array($this, 'file_callback'), $output);
-
// trigger hook with final HTML content to be sent
$hook = $this->app->plugins->exec_hook("send_page", array('content' => $output));
if (!$hook['abort']) {
@@ -1261,31 +1347,6 @@ class rcube_output_html extends rcube_output
/**
- * Callback function for preg_replace_callback in write()
- *
- * @return string Parsed string
- */
- protected function file_callback($matches)
- {
- $file = $matches[3];
-
- // correct absolute paths
- if ($file[0] == '/') {
- $file = $this->base_path . $file;
- }
-
- // add file modification timestamp
- if (preg_match('/\.(js|css)$/', $file)) {
- if ($fs = @filemtime($file)) {
- $file .= '?s=' . $fs;
- }
- }
-
- return $matches[1] . '=' . $matches[2] . $file . $matches[4];
- }
-
-
- /**
* Returns iframe object, registers some related env variables
*
* @param array $attrib HTML attributes
diff --git a/program/include/rcube_plugin.php b/program/include/rcube_plugin.php
index c1035733b..45088850a 100644
--- a/program/include/rcube_plugin.php
+++ b/program/include/rcube_plugin.php
@@ -202,7 +202,7 @@ abstract class rcube_plugin
foreach ($texts as $key => $value)
$add[$domain.'.'.$key] = $value;
- $rcmail = rcmail::get_instance();
+ $rcmail = rcube::get_instance();
$rcmail->load_language($lang, $add);
// add labels to client
diff --git a/program/include/rcube_plugin_api.php b/program/include/rcube_plugin_api.php
index 9ef68cab9..107c81026 100644
--- a/program/include/rcube_plugin_api.php
+++ b/program/include/rcube_plugin_api.php
@@ -31,7 +31,7 @@ if (!defined('RCMAIL_PLUGINS_DIR'))
*/
class rcube_plugin_api
{
- static private $instance;
+ static protected $instance;
public $dir;
public $url = 'plugins/';
@@ -39,16 +39,16 @@ class rcube_plugin_api
public $output;
public $handlers = array();
- private $plugins = array();
- private $tasks = array();
- private $actions = array();
- private $actionmap = array();
- private $objectsmap = array();
- private $template_contents = array();
- private $active_hook = false;
+ protected $plugins = array();
+ protected $tasks = array();
+ protected $actions = array();
+ protected $actionmap = array();
+ protected $objectsmap = array();
+ protected $template_contents = array();
+ protected $active_hook = false;
// Deprecated names of hooks, will be removed after 0.5-stable release
- private $deprecated_hooks = array(
+ protected $deprecated_hooks = array(
'create_user' => 'user_create',
'kill_session' => 'session_destroy',
'upload_attachment' => 'attachment_upload',
@@ -98,7 +98,7 @@ class rcube_plugin_api
/**
* Private constructor
*/
- private function __construct()
+ protected function __construct()
{
$this->dir = slashify(RCMAIL_PLUGINS_DIR);
}
@@ -470,7 +470,7 @@ class rcube_plugin_api
* @param array $attrib
* @return array
*/
- private function template_container_hook($attrib)
+ protected function template_container_hook($attrib)
{
$container = $attrib['name'];
return array('content' => $attrib['content'] . $this->template_contents[$container]);
@@ -483,7 +483,7 @@ class rcube_plugin_api
* @param string $fn Filename
* @return string
*/
- private function resource_url($fn)
+ protected function resource_url($fn)
{
if ($fn[0] != '/' && !preg_match('|^https?://|i', $fn))
return $this->url . $fn;
diff --git a/program/include/rcube_string_replacer.php b/program/include/rcube_string_replacer.php
index c29f0e476..edb2ac34f 100644
--- a/program/include/rcube_string_replacer.php
+++ b/program/include/rcube_string_replacer.php
@@ -37,16 +37,16 @@ class rcube_string_replacer
{
// Simplified domain expression for UTF8 characters handling
// Support unicode/punycode in top-level domain part
- $utf_domain = '[^?&@"\'\\/()\s\r\t\n]+\\.([^\\x00-\\x2f\\x3b-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-z0-9]{2,})';
+ $utf_domain = '[^?&@"\'\\/()\s\r\t\n]+\\.?([^\\x00-\\x2f\\x3b-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-zA-Z0-9]{2,})';
$url1 = '.:;,';
- $url2 = 'a-z0-9%=#@+?!&\\/_~\\[\\]{}-';
+ $url2 = 'a-zA-Z0-9%=#$@+?!&\\/_~\\[\\]{}\*-';
- $this->link_pattern = "/([\w]+:\/\/|\Wwww\.)($utf_domain([$url1]?[$url2]+)*)/i";
+ $this->link_pattern = "/([\w]+:\/\/|\W[Ww][Ww][Ww]\.|^[Ww][Ww][Ww]\.)($utf_domain([$url1]?[$url2]+)*)/";
$this->mailto_pattern = "/("
."[-\w!\#\$%&\'*+~\/^`|{}=]+(?:\.[-\w!\#\$%&\'*+~\/^`|{}=]+)*" // local-part
."@$utf_domain" // domain-part
."(\?[$url1$url2]+)?" // e.g. ?subject=test...
- .")/i";
+ .")/";
}
/**
@@ -81,11 +81,11 @@ class rcube_string_replacer
$i = -1;
$scheme = strtolower($matches[1]);
- if (preg_match('!^(http|ftp|file)s?://!', $scheme)) {
+ if (preg_match('!^(http|ftp|file)s?://!i', $scheme)) {
$url = $matches[1] . $matches[2];
}
- else if (preg_match('/^(\W)www\.$/', $matches[1], $m)) {
- $url = 'www.' . $matches[2];
+ else if (preg_match('/^(\W*)(www\.)$/i', $matches[1], $m)) {
+ $url = $m[2] . $matches[2];
$url_prefix = 'http://';
$prefix = $m[1];
}
@@ -134,6 +134,22 @@ class rcube_string_replacer
}
/**
+ * Replace all defined (link|mailto) patterns with replacement string
+ *
+ * @param string $str Text
+ *
+ * @return string Text
+ */
+ public function replace($str)
+ {
+ // search for patterns like links and e-mail addresses
+ $str = preg_replace_callback($this->link_pattern, array($this, 'link_callback'), $str);
+ $str = preg_replace_callback($this->mailto_pattern, array($this, 'mailto_callback'), $str);
+
+ return $str;
+ }
+
+ /**
* Replace substituted strings with original values
*/
public function resolve($str)
diff --git a/program/include/rcube_user.php b/program/include/rcube_user.php
index 5a65a519d..b92187ad4 100644
--- a/program/include/rcube_user.php
+++ b/program/include/rcube_user.php
@@ -449,6 +449,7 @@ class rcube_user
'user_name' => $user_name,
'user_email' => $user_email,
'email_list' => $email_list,
+ 'language' => $_SESSION['language'],
));
// plugin aborted this operation
@@ -462,13 +463,17 @@ class rcube_user
" VALUES (".$dbh->now().", ".$dbh->now().", ?, ?, ?)",
strip_newlines($data['user']),
strip_newlines($data['host']),
- strip_newlines($data['language'] ? $data['language'] : $_SESSION['language']));
+ strip_newlines($data['language']));
if ($user_id = $dbh->insert_id('users')) {
// create rcube_user instance to make plugin hooks work
- $user_instance = new rcube_user($user_id);
- $rcube->user = $user_instance;
-
+ $user_instance = new rcube_user($user_id, array(
+ 'user_id' => $user_id,
+ 'username' => $data['user'],
+ 'mail_host' => $data['host'],
+ 'language' => $data['language'],
+ ));
+ $rcube->user = $user_instance;
$mail_domain = $rcube->config->mail_domain($data['host']);
$user_name = $data['user_name'];
$user_email = $data['user_email'];
diff --git a/program/js/app.js b/program/js/app.js
index b80422983..783936c56 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -615,12 +615,11 @@ function rcube_webmail()
break;
case 'sort':
- var sort_order, sort_col = props;
+ var sort_order = this.env.sort_order,
+ sort_col = !this.env.disabled_sort_col ? props : this.env.sort_col;
- if (this.env.sort_col==sort_col)
- sort_order = this.env.sort_order=='ASC' ? 'DESC' : 'ASC';
- else
- sort_order = 'ASC';
+ if (!this.env.disabled_sort_order)
+ sort_order = this.env.sort_col == sort_col && sort_order == 'ASC' ? 'DESC' : 'ASC';
// set table header and update env
this.set_list_sorting(sort_col, sort_order);
@@ -5806,13 +5805,11 @@ function rcube_webmail()
col = this.env.coltypes[n];
if ((cell = thead.rows[0].cells[n]) && (col == 'from' || col == 'to' || col == 'fromto')) {
cell.id = 'rcm'+col;
+ $('span,a', cell).text(this.get_label(col == 'fromto' ? smart_col : col));
// if we have links for sorting, it's a bit more complicated...
- if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a') {
- cell = cell.firstChild;
- cell.onclick = function(){ return rcmail.command('sort', this.__col, this); };
- cell.__col = col;
- }
- cell.innerHTML = this.get_label(col == 'fromto' ? smart_col : col);
+ $('a', cell).click(function(){
+ return rcmail.command('sort', this.id.replace(/^rcm/, ''), this);
+ });
}
}
}
diff --git a/program/localization/en_GB/labels.inc b/program/localization/en_GB/labels.inc
index cb9c25c97..4129fba63 100644
--- a/program/localization/en_GB/labels.inc
+++ b/program/localization/en_GB/labels.inc
@@ -95,7 +95,7 @@ $labels['longdec'] = 'December';
$labels['today'] = 'Today';
$labels['refresh'] = 'Refresh';
$labels['checkmail'] = 'Check for new messages';
-$labels['compose'] = 'Compose a message';
+$labels['compose'] = 'Compose';
$labels['writenewmessage'] = 'Create a new message';
$labels['reply'] = 'Reply';
$labels['replytomessage'] = 'Reply to sender';
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 24cd5e425..2d45105c2 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -1539,6 +1539,11 @@ function rcmail_check_sent_folder($folder, $create=false)
{
global $RCMAIL;
+ // we'll not save the message, so it doesn't matter
+ if ($RCMAIL->config->get('no_save_sent_messages')) {
+ return true;
+ }
+
if ($RCMAIL->storage->folder_exists($folder, true)) {
return true;
}
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index c18d2cd13..47d1a484a 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -374,6 +374,8 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null
*/
function rcmail_message_list_head($attrib, $a_show_cols)
{
+ global $RCMAIL;
+
$skin_path = $_SESSION['skin_path'];
$image_tag = html::img(array('src' => "%s%s", 'alt' => "%s"));
@@ -381,8 +383,18 @@ function rcmail_message_list_head($attrib, $a_show_cols)
$sort_col = $_SESSION['sort_col'];
$sort_order = $_SESSION['sort_order'];
+ $dont_override = (array)$RCMAIL->config->get('dont_override');
+ $disabled_sort = in_array('message_sort_col', $dont_override);
+ $disabled_order = in_array('message_sort_order', $dont_override);
+
+ $RCMAIL->output->set_env('disabled_sort_col', $disabled_sort);
+ $RCMAIL->output->set_env('disabled_sort_order', $disabled_order);
+
// define sortable columns
- $a_sort_cols = array('subject', 'date', 'from', 'to', 'fromto', 'size', 'cc');
+ if ($disabled_sort)
+ $a_sort_cols = $sort_col && !$disabled_order ? array($sort_col) : array();
+ else
+ $a_sort_cols = array('subject', 'date', 'from', 'to', 'fromto', 'size', 'cc');
if (!empty($attrib['optionsmenuicon'])) {
$onclick = 'return ' . JS_OBJECT_NAME . ".command('menu-open', 'messagelistmenu')";
@@ -432,7 +444,7 @@ function rcmail_message_list_head($attrib, $a_show_cols)
else if ($col_name[0] != '<')
$col_name = '<span class="' . $col .'">' . $col_name . '</span>';
- $sort_class = $col == $sort_col ? " sorted$sort_order" : '';
+ $sort_class = $col == $sort_col && !$disabled_order ? " sorted$sort_order" : '';
$class_name = $col.$sort_class;
// put it all together
@@ -779,9 +791,8 @@ function rcmail_plain_body($body, $flowed=false)
// make links and email-addresses clickable
$replacer = new rcube_string_replacer;
- // search for patterns like links and e-mail addresses
- $body = preg_replace_callback($replacer->link_pattern, array($replacer, 'link_callback'), $body);
- $body = preg_replace_callback($replacer->mailto_pattern, array($replacer, 'mailto_callback'), $body);
+ // search for patterns like links and e-mail addresses and replace with tokens
+ $body = $replacer->replace($body);
// split body into single lines
$body = preg_split('/\r?\n/', $body);
diff --git a/program/steps/mail/list.inc b/program/steps/mail/list.inc
index b5d579d7d..b433f81fc 100644
--- a/program/steps/mail/list.inc
+++ b/program/steps/mail/list.inc
@@ -23,27 +23,33 @@ if (!$OUTPUT->ajax_call) {
return;
}
+$save_arr = array();
+$dont_override = (array) $RCMAIL->config->get('dont_override');
+
// is there a sort type for this request?
-if ($sort = get_input_value('_sort', RCUBE_INPUT_GET))
-{
+if ($sort = get_input_value('_sort', RCUBE_INPUT_GET)) {
// yes, so set the sort vars
list($sort_col, $sort_order) = explode('_', $sort);
// set session vars for sort (so next page and task switch know how to sort)
- $save_arr = array();
- $_SESSION['sort_col'] = $save_arr['message_sort_col'] = $sort_col;
- $_SESSION['sort_order'] = $save_arr['message_sort_order'] = $sort_order;
+ if (!in_array('message_sort_col', $dont_override)) {
+ $_SESSION['sort_col'] = $save_arr['message_sort_col'] = $sort_col;
+ }
+ if (!in_array('message_sort_order', $dont_override)) {
+ $_SESSION['sort_order'] = $save_arr['message_sort_order'] = $sort_order;
+ }
}
// is there a set of columns for this request?
-if ($cols = get_input_value('_cols', RCUBE_INPUT_GET))
-{
- $save_arr = array();
- $save_arr['list_cols'] = explode(',', $cols);
+if ($cols = get_input_value('_cols', RCUBE_INPUT_GET)) {
+ if (!in_array('list_cols', $dont_override)) {
+ $save_arr['list_cols'] = explode(',', $cols);
+ }
}
-if ($save_arr)
+if (!empty($save_arr)) {
$RCMAIL->user->save_prefs($save_arr);
+}
$mbox_name = $RCMAIL->storage->get_folder();
$threading = (bool) $RCMAIL->storage->get_threading();
@@ -52,8 +58,7 @@ $threading = (bool) $RCMAIL->storage->get_threading();
$RCMAIL->storage->folder_sync($mbox_name);
// initialize searching result if search_filter is used
-if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL')
-{
+if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL') {
$search_request = md5($mbox_name.$_SESSION['search_filter']);
$RCMAIL->storage->search($mbox_name, $_SESSION['search_filter'], RCMAIL_CHARSET, rcmail_sort_column());
$_SESSION['search'] = $RCMAIL->storage->get_search_set();
@@ -76,7 +81,6 @@ else if (empty($_REQUEST['_search']) && isset($_SESSION['search'])) {
$RCMAIL->session->remove('search');
}
-
// empty result? we'll skip UNSEEN counting in rcmail_send_unread_count()
if (empty($search_request) && empty($a_headers)) {
$unseen = 0;
@@ -96,10 +100,10 @@ $OUTPUT->command('set_mailboxname', rcmail_get_mailbox_name_text());
// add message rows
rcmail_js_message_list($a_headers, FALSE, $cols);
-if (isset($a_headers) && count($a_headers))
-{
- if ($search_request)
+if (isset($a_headers) && count($a_headers)) {
+ if ($search_request) {
$OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $count));
+ }
}
else {
// handle IMAP errors (e.g. #1486905)
diff --git a/program/steps/mail/list_contacts.inc b/program/steps/mail/list_contacts.inc
index 7c99a1309..9347190da 100644
--- a/program/steps/mail/list_contacts.inc
+++ b/program/steps/mail/list_contacts.inc
@@ -69,11 +69,14 @@ if ($CONTACTS && $CONTACTS->ready) {
$name = rcube_addressbook::compose_list_name($row);
// add record for every email address of the contact
- foreach ($CONTACTS->get_col_values('email', $row, true) as $i => $email) {
+ $emails = $CONTACTS->get_col_values('email', $row, true);
+ foreach ($emails as $i => $email) {
$row_id = $row['ID'].$i;
$jsresult[$row_id] = format_email_recipient($email, $name);
$OUTPUT->command('add_contact_row', $row_id, array(
- 'contact' => html::span(array('title' => $email), Q($name ? $name : $email))), 'person');
+ 'contact' => html::span(array('title' => $email), Q($name ? $name : $email) .
+ ($name && count($emails) > 1 ? '&nbsp;' . html::span('email', Q($email)) : '')
+ )), 'person');
}
}
}
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index a0c049682..4fac872d1 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -49,7 +49,7 @@ if (!$savedraft) {
if(!empty($CONFIG['sendmail_delay'])) {
$wait_sec = time() - intval($CONFIG['sendmail_delay']) - intval($CONFIG['last_message_time']);
- if($wait_sec < 0) {
+ if ($wait_sec < 0) {
$OUTPUT->show_message('senttooquickly', 'error', array('sec' => $wait_sec * -1));
$OUTPUT->send('iframe');
}
@@ -72,13 +72,19 @@ function rcmail_encrypt_header($what)
// get identity record
function rcmail_get_identity($id)
{
- global $RCMAIL, $OUTPUT;
+ global $RCMAIL, $message_charset;
+ global $RCMAIL;
if ($sql_arr = $RCMAIL->user->get_identity($id)) {
$out = $sql_arr;
+
+ if ($message_charset != RCMAIL_CHARSET) {
+ foreach ($out as $k => $v)
+ $out[$k] = rcube_charset_convert($v, RCMAIL_CHARSET, $message_charset);
+ }
+
$out['mailto'] = $sql_arr['email'];
- $out['string'] = format_email_recipient($sql_arr['email'],
- rcube_charset_convert($sql_arr['name'], RCMAIL_CHARSET, $OUTPUT->get_charset()));
+ $out['string'] = format_email_recipient($sql_arr['email'], $sql_arr['name']);
return $out;
}
@@ -96,7 +102,7 @@ function rcmail_get_identity($id)
*/
function rcmail_fix_emoticon_paths($mime_message)
{
- global $CONFIG;
+ global $RCMAIL;
$body = $mime_message->getHTMLBody();
@@ -121,8 +127,9 @@ function rcmail_fix_emoticon_paths($mime_message)
if (! in_array($image_name, $included_images)) {
// add the image to the MIME message
- if (! $mime_message->addHTMLImage($img_file, 'image/gif', '', true, $image_name))
- $OUTPUT->show_message("emoticonerror", 'error');
+ if (!$mime_message->addHTMLImage($img_file, 'image/gif', '', true, $image_name)) {
+ $RCMAIL->output->show_message("emoticonerror", 'error');
+ }
array_push($included_images, $image_name);
}
@@ -468,6 +475,7 @@ if (!$savedraft) {
if ($CONFIG['spellcheck_before_send'] && $CONFIG['enable_spellcheck']
&& empty($COMPOSE['spell_checked']) && !empty($message_body)
) {
+ $message_body = str_replace("\r\n", "\n", $message_body);
$spellchecker = new rcube_spellchecker(get_input_value('_lang', RCUBE_INPUT_GPC));
$spell_result = $spellchecker->check($message_body, $isHtml);
@@ -668,19 +676,18 @@ if (!$savedraft)
$smtp_error, $mailbody_file, $smtp_opts);
// return to compose page if sending failed
- if (!$sent)
- {
+ if (!$sent) {
// remove temp file
if ($mailbody_file) {
unlink($mailbody_file);
- }
+ }
if ($smtp_error)
$OUTPUT->show_message($smtp_error['label'], 'error', $smtp_error['vars']);
else
$OUTPUT->show_message('sendingfailed', 'error');
$OUTPUT->send('iframe');
- }
+ }
// save message sent time
if (!empty($CONFIG['sendmail_delay']))
@@ -698,7 +705,7 @@ if (!$savedraft)
// Determine which folder to save message
if ($savedraft)
$store_target = $CONFIG['drafts_mbox'];
-else
+else if (!$RCMAIL->config->get('no_save_sent_messages'))
$store_target = isset($_POST['_store_target']) ? get_input_value('_store_target', RCUBE_INPUT_POST) : $CONFIG['sent_mbox'];
if ($store_target) {
diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc
index e94630635..d5ccbb2d7 100644
--- a/program/steps/settings/func.inc
+++ b/program/steps/settings/func.inc
@@ -198,9 +198,6 @@ function rcmail_user_prefs($current=null)
$select_timezone->add('(GMT ' . $offset . ') ' . strtr($tzs, '_', ' '), $tzs);
}
- if (is_numeric($config['timezone']))
- timezone_name_from_abbr("", $config['timezone'] * 3600, 0);
-
$blocks['main']['options']['timezone'] = array(
'title' => html::label($field_id, Q(rcube_label('timezone'))),
'content' => $select_timezone->show((string)$config['timezone']),
diff --git a/skins/classic/mail.css b/skins/classic/mail.css
index 08d1266f1..7408d49f1 100644
--- a/skins/classic/mail.css
+++ b/skins/classic/mail.css
@@ -305,7 +305,6 @@
bottom: 0px;
border: 1px solid #999999;
background-color: #F9F9F9;
- overflow: hidden;
}
#messagecontframe
@@ -365,7 +364,6 @@
bottom: 0;
border: 1px solid #999;
background-color: #F9F9F9;
- overflow: hidden;
}
#mailboxlist
diff --git a/skins/classic/templates/compose.html b/skins/classic/templates/compose.html
index 985e62e86..e2164659c 100644
--- a/skins/classic/templates/compose.html
+++ b/skins/classic/templates/compose.html
@@ -151,10 +151,10 @@
</tr><tr>
<td><label for="rcmcomposepriority"><roundcube:label name="priority" />:</label></td>
<td><roundcube:object name="prioritySelector" form="form" id="rcmcomposepriority" /></td>
- </tr><tr>
+ </tr><roundcube:if condition="!config:no_save_sent_messages" /><tr>
<td><label><roundcube:label name="savesentmessagein" />:</label></td>
<td><roundcube:object name="storetarget" maxlength="30" /></td>
- </tr>
+ </tr><roundcube:endif />
</table>
</div>
diff --git a/skins/larry/mail.css b/skins/larry/mail.css
index 6d350d714..20a13f62f 100644
--- a/skins/larry/mail.css
+++ b/skins/larry/mail.css
@@ -421,12 +421,15 @@ a.iconbutton.threadmode.selected {
border-left: 0;
}
-
#messagelist tr td.size {
width: 60px;
text-align: right;
}
+#messagelist thead tr td.size {
+ text-align: left;
+}
+
#messagelist tr td.fromto,
#messagelist tr td.from,
#messagelist tr td.to,
@@ -1110,6 +1113,13 @@ div.message-part blockquote blockquote blockquote {
display: block;
}
+#contacts-table td span.email {
+ display: inline;
+ color: #69939e;
+ font-style: italic;
+ margin-left: 0.5em;
+}
+
#compose-contacts li a, #contacts-table td {
background: url(images/listicons.png) -100px 0 no-repeat;
overflow: hidden;
diff --git a/skins/larry/templates/compose.html b/skins/larry/templates/compose.html
index 2612685a9..de3b5bfff 100644
--- a/skins/larry/templates/compose.html
+++ b/skins/larry/templates/compose.html
@@ -136,9 +136,11 @@
<span class="composeoption">
<label><roundcube:object name="dsnCheckBox" form="form" id="rcmcomposedsn" /> <roundcube:label name="dsn" /></label>
</span>
+ <roundcube:if condition="!config:no_save_sent_messages" />
<span class="composeoption">
<label><roundcube:label name="savesentmessagein" /> <roundcube:object name="storetarget" maxlength="30" style="max-width:12em" /></label>
</span>
+ <roundcube:endif />
<roundcube:container name="composeoptions" id="composeoptions" />
</div>
diff --git a/tests/Framework/StringReplacer.php b/tests/Framework/StringReplacer.php
index 11210c0da..a76ba00ee 100644
--- a/tests/Framework/StringReplacer.php
+++ b/tests/Framework/StringReplacer.php
@@ -17,4 +17,30 @@ class Framework_StringReplacer extends PHPUnit_Framework_TestCase
$this->assertInstanceOf('rcube_string_replacer', $sr, "Class constructor");
}
+
+ /**
+ * Data for test_replace()
+ */
+ function data_replace()
+ {
+ return array(
+ array('http://domain.tld/path*path2', '<a href="http://domain.tld/path*path2" target="_blank">http://domain.tld/path*path2</a>'),
+ array("Click this link:\nhttps://mail.xn--brderli-o2a.ch/rc/ EOF", "Click this link:\n<a href=\"https://mail.xn--brderli-o2a.ch/rc/\" target=\"_blank\">https://mail.xn--brderli-o2a.ch/rc/</a> EOF"),
+ array('Start http://localhost/?foo End', 'Start <a href="http://localhost/?foo" target="_blank">http://localhost/?foo</a> End'),
+ array('www.domain.tld', '<a href="http://www.domain.tld" target="_blank">www.domain.tld</a>'),
+ array('WWW.DOMAIN.TLD', '<a href="http://WWW.DOMAIN.TLD" target="_blank">WWW.DOMAIN.TLD</a>'),
+ );
+ }
+
+ /**
+ * @dataProvider data_replace
+ */
+ function test_replace($input, $output)
+ {
+ $replacer = new rcube_string_replacer;
+ $result = $replacer->replace($input);
+ $result = $replacer->resolve($result);
+
+ $this->assertEquals($output, $result);
+ }
}