summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.htaccess1
-rw-r--r--CHANGELOG16
-rw-r--r--INSTALL1
-rwxr-xr-xbin/cleandb.sh2
-rwxr-xr-xbin/decrypt.sh2
-rwxr-xr-xbin/deluser.sh30
-rwxr-xr-xbin/dumpschema.sh2
-rwxr-xr-xbin/exportgettext.sh2
-rwxr-xr-xbin/gc.sh2
-rwxr-xr-xbin/importgettext.sh2
-rwxr-xr-xbin/indexcontacts.sh2
-rwxr-xr-xbin/installto.sh2
-rwxr-xr-xbin/moduserprefs.sh2
-rwxr-xr-xbin/msgexport.sh2
-rwxr-xr-xbin/msgimport.sh2
-rwxr-xr-xbin/update.sh2
-rwxr-xr-xbin/updatecss.sh2
-rwxr-xr-xbin/updatedb.sh2
-rw-r--r--config/defaults.inc.php11
-rw-r--r--index.php4
-rw-r--r--installer/check.php1
-rw-r--r--installer/index.php2
-rw-r--r--plugins/acl/tests/Acl.php2
-rw-r--r--plugins/additional_message_headers/tests/AdditionalMessageHeaders.php2
-rw-r--r--plugins/archive/tests/Archive.php2
-rw-r--r--plugins/autologon/tests/Autologon.php2
-rw-r--r--plugins/database_attachments/tests/DatabaseAttachments.php2
-rw-r--r--plugins/debug_logger/debug_logger.php8
-rw-r--r--plugins/debug_logger/tests/DebugLogger.php2
-rw-r--r--plugins/emoticons/tests/Emoticons.php2
-rw-r--r--plugins/enigma/tests/Enigma.php2
-rw-r--r--plugins/example_addressbook/example_addressbook.php2
-rw-r--r--plugins/example_addressbook/tests/ExampleAddressbook.php2
-rw-r--r--plugins/filesystem_attachments/tests/FilesystemAttachments.php2
-rw-r--r--plugins/help/skins/larry/help.pngbin6099 -> 2876 bytes
-rw-r--r--plugins/help/tests/Help.php2
-rw-r--r--plugins/hide_blockquote/tests/HideBlockquote.php2
-rw-r--r--plugins/http_authentication/tests/HttpAuthentication.php2
-rw-r--r--plugins/identity_select/tests/IdentitySelect.php2
-rw-r--r--plugins/jqueryui/tests/Jqueryui.php2
-rw-r--r--[-rwxr-xr-x]plugins/jqueryui/themes/larry/images/animated-overlay.gifbin1738 -> 1738 bytes
-rw-r--r--plugins/jqueryui/themes/larry/images/ui-dialog-close.pngbin1596 -> 644 bytes
-rw-r--r--plugins/jqueryui/themes/larry/images/ui-icons-datepicker.pngbin437 -> 323 bytes
-rw-r--r--[-rwxr-xr-x]plugins/jqueryui/themes/larry/images/ui-icons_004458_256x240.pngbin4369 -> 3395 bytes
-rw-r--r--[-rwxr-xr-x]plugins/jqueryui/themes/larry/images/ui-icons_d7211e_256x240.pngbin4369 -> 3378 bytes
-rw-r--r--plugins/legacy_browser/tests/LegacyBrowser.php2
-rw-r--r--plugins/managesieve/managesieve.js3
-rw-r--r--plugins/managesieve/tests/Managesieve.php2
-rw-r--r--plugins/managesieve/tests/Parser.php4
-rw-r--r--plugins/managesieve/tests/Tokenizer.php2
-rw-r--r--plugins/managesieve/tests/Vacation.php4
-rw-r--r--plugins/markasjunk/tests/Markasjunk.php2
-rw-r--r--plugins/new_user_dialog/tests/NewUserDialog.php2
-rw-r--r--plugins/new_user_identity/tests/NewUserIdentity.php2
-rw-r--r--plugins/newmail_notifier/tests/NewmailNotifier.php2
-rw-r--r--plugins/password/config.inc.php.dist5
-rw-r--r--plugins/password/drivers/ldap.php98
-rw-r--r--plugins/password/helpers/dovecot_hmacmd5.php191
-rw-r--r--plugins/password/password.php4
-rw-r--r--plugins/password/tests/Password.php2
-rw-r--r--plugins/redundant_attachments/tests/RedundantAttachments.php2
-rw-r--r--plugins/show_additional_headers/tests/ShowAdditionalHeaders.php2
-rw-r--r--plugins/squirrelmail_usercopy/tests/SquirrelmailUsercopy.php2
-rw-r--r--plugins/subscriptions_option/tests/SubscriptionsOption.php2
-rw-r--r--plugins/userinfo/tests/Userinfo.php2
-rw-r--r--plugins/vcard_attachments/tests/VcardAttachments.php2
-rw-r--r--plugins/virtuser_file/tests/VirtuserFile.php2
-rw-r--r--plugins/virtuser_query/tests/VirtuserQuery.php2
-rw-r--r--plugins/zipdownload/tests/Zipdownload.php2
-rw-r--r--program/include/clisetup.php5
-rw-r--r--program/include/rcmail.php2
-rw-r--r--program/include/rcmail_output_cli.php89
-rw-r--r--program/js/app.js36
-rw-r--r--program/js/editor.js30
-rw-r--r--program/lib/Roundcube/bootstrap.php2
-rw-r--r--program/lib/Roundcube/rcube.php16
-rw-r--r--program/lib/Roundcube/rcube_imap_generic.php10
-rw-r--r--program/lib/Roundcube/rcube_plugin_api.php10
-rw-r--r--program/steps/utils/error.inc1
-rw-r--r--skins/classic/print.css2
-rw-r--r--skins/larry/addressbook.css6
-rw-r--r--skins/larry/images/buttons.pngbin16644 -> 15699 bytes
-rw-r--r--skins/larry/images/contactgroup.pngbin2104 -> 957 bytes
-rw-r--r--skins/larry/images/contactpic_32px.pngbin287 -> 274 bytes
-rw-r--r--skins/larry/images/filedrop.pngbin605 -> 421 bytes
-rw-r--r--skins/larry/images/filetypes.pngbin9018 -> 4626 bytes
-rw-r--r--skins/larry/images/listicons.pngbin29198 -> 13442 bytes
-rw-r--r--skins/larry/images/login_shadow.pngbin1069 -> 789 bytes
-rw-r--r--skins/larry/images/messages.pngbin1736 -> 1461 bytes
-rw-r--r--skins/larry/images/messages_dark.pngbin1779 -> 1471 bytes
-rw-r--r--skins/larry/images/overflowshadow.pngbin307 -> 250 bytes
-rw-r--r--skins/larry/images/quota.pngbin3622 -> 2033 bytes
-rw-r--r--skins/larry/images/roundcube_logo.pngbin7216 -> 3792 bytes
-rw-r--r--skins/larry/mail.css12
-rw-r--r--skins/larry/print.css2
-rw-r--r--skins/larry/styles.css46
-rw-r--r--skins/larry/thumbnail.pngbin3838 -> 2100 bytes
-rw-r--r--tests/Framework/VCard.php2
-rw-r--r--tests/Selenium/bootstrap.php4
-rw-r--r--tests/bootstrap.php4
100 files changed, 589 insertions, 167 deletions
diff --git a/.htaccess b/.htaccess
index f21cf3475..a9cc5c3f3 100644
--- a/.htaccess
+++ b/.htaccess
@@ -14,7 +14,6 @@ php_flag register_globals Off
php_flag zlib.output_compression Off
php_flag magic_quotes_gpc Off
php_flag magic_quotes_runtime Off
-php_flag zend.ze1_compatibility_mode Off
php_flag suhosin.session.encrypt Off
#php_value session.cookie_path /
diff --git a/CHANGELOG b/CHANGELOG
index 470f717f2..219071c67 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@ CHANGELOG Roundcube Webmail
- Support contacts import in GMail CSV format
- Added namespace filter in Folder Manager
- Added folder searching in Folder Manager
+- Fix restoring draft messages from localStorage if editor mode differs (#1490016)
- Added config option/user preference to disable saving messages in localStorage (#1489979)
- Added config option 'imap_log_session' to enable Roundcube <-> IMAP session ID logging
- Added config option 'log_session_id' to control the lengh of the session identifer in logs
@@ -18,9 +19,7 @@ CHANGELOG Roundcube Webmail
- Support images in HTML signatures (#1488676)
- Display full quota information in popup (#1485769, #1486604)
- Mail compose: Selecting contact inserts recipient to previously focused input - to/cc/bcc accordingly (#1489684)
-- Add option to set default message list mode - default_list_mode (#1487312)
- Close "no subject" prompt with Enter key (#1489580)
-- Add config option to specify IMAP connection socket parameters - imap_conn_options (#1489948)
- Password: Add option to force new users to change their password (#1486884)
- Improve support for screen readers and assistive technology using WCAG 2.0 and WAI ARIA standards
- Enable basic keyboard navigation throughout the UI (#1487845)
@@ -50,6 +49,19 @@ CHANGELOG Roundcube Webmail
- Don't remove links when html signature is converted to text (#1489621)
- Fix page title when using search filter (#1490023)
- Fix mbox files import
+- Fix setting flags on servers with no PERMANENTFLAGS response (#1490087)
+- Fix regression in SHAA password generation in ldap driver of password plugin (#1490094)
+- Fix displaying of HTML messages with absolutely positioned elements in Larry skin (#1490103)
+- Fix font style display issue in HTML messages with styled <span> elements (#1490101)
+
+RELEASE 1.0.3
+-------------
+- Initialize HTML editor before restoring a message from localStorage (#1490016)
+- Add 'sig_max_lines' config option to default config file (#1490071)
+- Add config option to specify IMAP connection socket parameters - imap_conn_options (#1489948)
+- Add option to set default message list mode - default_list_mode (#1487312)
+- Enable contextmenu plugin for TinyMCE editor (#1487014)
+- Fix insert-signature command in external compose window if opened from inline compose screen (#1490074)
- Fix some mime-type to extension mapping checks in Installer (#1489983)
- Fix errors when using localStorage in Safari's private browsing mode (#1489996)
- Fix bug where $Forwarded flag was being set even if server didn't support it (#1490000)
diff --git a/INSTALL b/INSTALL
index d9f3f1f68..df11239b6 100644
--- a/INSTALL
+++ b/INSTALL
@@ -29,7 +29,6 @@ REQUIREMENTS
- memory_limit > 16MB (increase as suitable to support large attachments)
- file_uploads enabled (for attachment upload features)
- session.auto_start disabled
- - zend.ze1_compatibility_mode disabled
- suhosin.session.encrypt disabled
- mbstring.func_overload disabled
- magic_quotes_runtime disabled
diff --git a/bin/cleandb.sh b/bin/cleandb.sh
index 9edfeec91..d811c8d01 100755
--- a/bin/cleandb.sh
+++ b/bin/cleandb.sh
@@ -19,7 +19,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require INSTALL_PATH.'program/include/clisetup.php';
diff --git a/bin/decrypt.sh b/bin/decrypt.sh
index 7f83f3a7f..dd4525972 100755
--- a/bin/decrypt.sh
+++ b/bin/decrypt.sh
@@ -52,7 +52,7 @@
* - you are dealing with counterfeit header data.
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__).'/..') . '/');
+define('INSTALL_PATH', realpath(__DIR__ .'/..') . '/');
require INSTALL_PATH . 'program/include/clisetup.php';
diff --git a/bin/deluser.sh b/bin/deluser.sh
index 9504d5b43..1e93793cf 100755
--- a/bin/deluser.sh
+++ b/bin/deluser.sh
@@ -20,7 +20,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require_once INSTALL_PATH . 'program/include/clisetup.php';
@@ -69,6 +69,7 @@ if (empty($args['host'])) {
// connect to DB
$db = $rcmail->get_dbh();
$db->db_connect('w');
+$transaction = false;
if (!$db->is_connected() || $db->is_error()) {
_die("No DB connection\n" . $db->is_error());
@@ -81,23 +82,44 @@ if (!$user) {
die("User not found.\n");
}
+// inform plugins about approaching user deletion
+$plugin = $rcmail->plugins->exec_hook('user_delete_prepare', array('user' => $user, 'username' => $username, 'host' => $args['host']));
+
// let plugins cleanup their own user-related data
-$plugin = $rcmail->plugins->exec_hook('user_delete', array('user' => $user, 'username' => $username, 'host' => $args['host']));
+if (!$plugin['abort']) {
+ $transaction = $db->startTransaction();
+ $plugin = $rcmail->plugins->exec_hook('user_delete', $plugin);
+}
if ($plugin['abort']) {
+ if ($transaction) {
+ $db->rollbackTransaction();
+ }
_die("User deletion aborted by plugin");
}
// deleting the user record should be sufficient due to ON DELETE CASCADE foreign key references
// but not all database backends actually support this so let's do it by hand
-foreach (array('identities','contacts','contactgroups','dictionaries','cache','cache_index','cache_messages','cache_thread','searches','users') as $table) {
+foreach (array('identities','contacts','contactgroups','dictionary','cache','cache_index','cache_messages','cache_thread','searches','users') as $table) {
$db->query('DELETE FROM ' . $db->table_name($table, true) . ' WHERE `user_id` = ?', $user->ID);
}
if ($db->is_error()) {
+ $rcmail->plugins->exec_hook('user_delete_rollback', $plugin);
_die("DB error occurred: " . $db->is_error());
}
else {
- echo "Successfully deleted user $user->ID\n";
+ // inform plugins about executed user deletion
+ $plugin = $rcmail->plugins->exec_hook('user_delete_commit', $plugin);
+
+ if ($plugin['abort']) {
+ unset($plugin['abort']);
+ $db->rollbackTransaction();
+ $rcmail->plugins->exec_hook('user_delete_rollback', $plugin);
+ }
+ else {
+ $db->endTransaction();
+ echo "Successfully deleted user $user->ID\n";
+ }
}
diff --git a/bin/dumpschema.sh b/bin/dumpschema.sh
index 6d5cde723..32c90ac13 100755
--- a/bin/dumpschema.sh
+++ b/bin/dumpschema.sh
@@ -19,7 +19,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require INSTALL_PATH.'program/include/clisetup.php';
diff --git a/bin/exportgettext.sh b/bin/exportgettext.sh
index b220b2242..314cae7d2 100755
--- a/bin/exportgettext.sh
+++ b/bin/exportgettext.sh
@@ -15,7 +15,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require INSTALL_PATH.'program/include/clisetup.php';
if ($argc < 2) {
diff --git a/bin/gc.sh b/bin/gc.sh
index 1ee610741..e0d722a18 100755
--- a/bin/gc.sh
+++ b/bin/gc.sh
@@ -19,7 +19,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require INSTALL_PATH.'program/include/clisetup.php';
diff --git a/bin/importgettext.sh b/bin/importgettext.sh
index 285f5680f..5a91e6bc1 100755
--- a/bin/importgettext.sh
+++ b/bin/importgettext.sh
@@ -15,7 +15,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require INSTALL_PATH.'program/include/clisetup.php';
if ($argc < 2) {
diff --git a/bin/indexcontacts.sh b/bin/indexcontacts.sh
index 9509dc06a..2844742f7 100755
--- a/bin/indexcontacts.sh
+++ b/bin/indexcontacts.sh
@@ -19,7 +19,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require_once INSTALL_PATH.'program/include/clisetup.php';
ini_set('memory_limit', -1);
diff --git a/bin/installto.sh b/bin/installto.sh
index fbd951bdf..d239c633d 100755
--- a/bin/installto.sh
+++ b/bin/installto.sh
@@ -19,7 +19,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require_once INSTALL_PATH . 'program/include/clisetup.php';
diff --git a/bin/moduserprefs.sh b/bin/moduserprefs.sh
index e892b1f4d..3d46baaa4 100755
--- a/bin/moduserprefs.sh
+++ b/bin/moduserprefs.sh
@@ -18,7 +18,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require_once INSTALL_PATH.'program/include/clisetup.php';
diff --git a/bin/msgexport.sh b/bin/msgexport.sh
index f68688b67..f76aefe86 100755
--- a/bin/msgexport.sh
+++ b/bin/msgexport.sh
@@ -1,7 +1,7 @@
#!/usr/bin/env php
<?php
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
ini_set('memory_limit', -1);
require_once INSTALL_PATH.'program/include/clisetup.php';
diff --git a/bin/msgimport.sh b/bin/msgimport.sh
index 1fcc34680..0c72622c4 100755
--- a/bin/msgimport.sh
+++ b/bin/msgimport.sh
@@ -1,7 +1,7 @@
#!/usr/bin/env php
<?php
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
ini_set('memory_limit', -1);
require_once INSTALL_PATH.'program/include/clisetup.php';
diff --git a/bin/update.sh b/bin/update.sh
index f0c6d2f6c..cbacb940a 100755
--- a/bin/update.sh
+++ b/bin/update.sh
@@ -19,7 +19,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require_once INSTALL_PATH . 'program/include/clisetup.php';
diff --git a/bin/updatecss.sh b/bin/updatecss.sh
index 53d237c77..6ecfeac98 100755
--- a/bin/updatecss.sh
+++ b/bin/updatecss.sh
@@ -18,7 +18,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require_once INSTALL_PATH . 'program/include/clisetup.php';
diff --git a/bin/updatedb.sh b/bin/updatedb.sh
index e9818074d..ffeac0ba8 100755
--- a/bin/updatedb.sh
+++ b/bin/updatedb.sh
@@ -19,7 +19,7 @@
+-----------------------------------------------------------------------+
*/
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require_once INSTALL_PATH . 'program/include/clisetup.php';
diff --git a/config/defaults.inc.php b/config/defaults.inc.php
index 5e9a2bbdd..ee836e68e 100644
--- a/config/defaults.inc.php
+++ b/config/defaults.inc.php
@@ -618,12 +618,13 @@ $config['enable_spellcheck'] = true;
$config['spellcheck_dictionary'] = false;
// Set the spell checking engine. Possible values:
-// - 'googie' - the default
+// - 'googie' - the default (also used for connecting to Nox Spell Server, see 'spellcheck_uri' setting)
// - 'pspell' - requires the PHP Pspell module and aspell installed
// - 'enchant' - requires the PHP Enchant module
// - 'atd' - install your own After the Deadline server or check with the people at http://www.afterthedeadline.com before using their API
-// Since Google shut down their public spell checking service, you need to
-// connect to a Nox Spell Server when using 'googie' here. Therefore specify the 'spellcheck_uri'
+// Since Google shut down their public spell checking service, the default settings
+// connect to http://spell.roundcube.net which is a hosted service provided by Roundcube.
+// You can connect to any other googie-compliant service by setting 'spellcheck_uri' accordingly.
$config['spellcheck_engine'] = 'googie';
// For locally installed Nox Spell Server or After the Deadline services,
@@ -650,6 +651,10 @@ $config['spellcheck_ignore_syms'] = false;
// Use this char/string to separate recipients when composing a new message
$config['recipients_separator'] = ',';
+// Number of lines at the end of a message considered to contain the signature.
+// Increase this value if signatures are not properly detected and colored
+$config['sig_max_lines'] = 15;
+
// don't let users set pagesize to more than this value if set
$config['max_pagesize'] = 200;
diff --git a/index.php b/index.php
index 9c87f9a40..5ca2af608 100644
--- a/index.php
+++ b/index.php
@@ -147,7 +147,7 @@ if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') {
$error_code = RCMAIL::ERROR_INVALID_REQUEST;
}
else {
- $error_code = $auth['error'] ? $auth['error'] : $RCMAIL->login_error();
+ $error_code = is_numeric($auth['error']) ? $auth['error'] : $RCMAIL->login_error();
}
$error_labels = array(
@@ -157,7 +157,7 @@ if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') {
RCMAIL::ERROR_INVALID_HOST => 'invalidhost',
);
- $error_message = $error_labels[$error_code] ? $error_labels[$error_code] : 'loginfailed';
+ $error_message = !empty($auth['error']) && !is_numeric($auth['error']) ? $auth['error'] : ($error_labels[$error_code] ?: 'loginfailed');
$OUTPUT->show_message($error_message, 'warning');
diff --git a/installer/check.php b/installer/check.php
index e61934550..afdf86e5c 100644
--- a/installer/check.php
+++ b/installer/check.php
@@ -44,7 +44,6 @@ $optional_libs = array(
$ini_checks = array(
'file_uploads' => 1,
'session.auto_start' => 0,
- 'zend.ze1_compatibility_mode' => 0,
'mbstring.func_overload' => 0,
'suhosin.session.encrypt' => 0,
'magic_quotes_runtime' => 0,
diff --git a/installer/index.php b/installer/index.php
index b93ad2f94..61ff40076 100644
--- a/installer/index.php
+++ b/installer/index.php
@@ -39,7 +39,7 @@
ini_set('error_reporting', E_ALL &~ (E_NOTICE | E_STRICT));
ini_set('display_errors', 1);
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/../').'/');
+define('INSTALL_PATH', realpath(__DIR__ . '/../').'/');
define('RCUBE_INSTALL_PATH', INSTALL_PATH);
define('RCUBE_CONFIG_DIR', INSTALL_PATH . 'config/');
diff --git a/plugins/acl/tests/Acl.php b/plugins/acl/tests/Acl.php
index e752ac977..56ae3b5bb 100644
--- a/plugins/acl/tests/Acl.php
+++ b/plugins/acl/tests/Acl.php
@@ -5,7 +5,7 @@ class Acl_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../acl.php';
+ include_once __DIR__ . '/../acl.php';
}
/**
diff --git a/plugins/additional_message_headers/tests/AdditionalMessageHeaders.php b/plugins/additional_message_headers/tests/AdditionalMessageHeaders.php
index 1c54ffc42..55e8c441e 100644
--- a/plugins/additional_message_headers/tests/AdditionalMessageHeaders.php
+++ b/plugins/additional_message_headers/tests/AdditionalMessageHeaders.php
@@ -5,7 +5,7 @@ class AdditionalMessageHeaders_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../additional_message_headers.php';
+ include_once __DIR__ . '/../additional_message_headers.php';
}
/**
diff --git a/plugins/archive/tests/Archive.php b/plugins/archive/tests/Archive.php
index 0a1eeae11..17fcdf7a1 100644
--- a/plugins/archive/tests/Archive.php
+++ b/plugins/archive/tests/Archive.php
@@ -5,7 +5,7 @@ class Archive_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../archive.php';
+ include_once __DIR__ . '/../archive.php';
}
/**
diff --git a/plugins/autologon/tests/Autologon.php b/plugins/autologon/tests/Autologon.php
index 0de193e4a..f3f6b4206 100644
--- a/plugins/autologon/tests/Autologon.php
+++ b/plugins/autologon/tests/Autologon.php
@@ -5,7 +5,7 @@ class Autologon_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../autologon.php';
+ include_once __DIR__ . '/../autologon.php';
}
/**
diff --git a/plugins/database_attachments/tests/DatabaseAttachments.php b/plugins/database_attachments/tests/DatabaseAttachments.php
index f260737ab..15ea5f44e 100644
--- a/plugins/database_attachments/tests/DatabaseAttachments.php
+++ b/plugins/database_attachments/tests/DatabaseAttachments.php
@@ -5,7 +5,7 @@ class DatabaseAttachments_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../database_attachments.php';
+ include_once __DIR__ . '/../database_attachments.php';
}
/**
diff --git a/plugins/debug_logger/debug_logger.php b/plugins/debug_logger/debug_logger.php
index 88237d767..07190e5a1 100644
--- a/plugins/debug_logger/debug_logger.php
+++ b/plugins/debug_logger/debug_logger.php
@@ -66,8 +66,8 @@ class debug_logger extends rcube_plugin
{
function init()
{
- require_once(dirname(__FILE__).'/runlog/runlog.php');
- $this->runlog = new runlog();
+ require_once(__DIR__ . '/runlog/runlog.php');
+ $this->runlog = new runlog();
if(!rcmail::get_instance()->config->get('log_dir')){
rcmail::get_instance()->config->set('log_dir',INSTALL_PATH.'logs');
@@ -83,10 +83,10 @@ class debug_logger extends rcube_plugin
$action = rcmail::get_instance()->action;
$task = rcmail::get_instance()->task;
if($action){
- $start_string .= "Action: ".$action.". ";
+ $start_string .= "Action: ".$action.". ";
}
if($task){
- $start_string .= "Task: ".$task.". ";
+ $start_string .= "Task: ".$task.". ";
}
$this->runlog->start($start_string);
diff --git a/plugins/debug_logger/tests/DebugLogger.php b/plugins/debug_logger/tests/DebugLogger.php
index de20a069d..8dd0c03fe 100644
--- a/plugins/debug_logger/tests/DebugLogger.php
+++ b/plugins/debug_logger/tests/DebugLogger.php
@@ -5,7 +5,7 @@ class DebugLogger_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../debug_logger.php';
+ include_once __DIR__ . '/../debug_logger.php';
}
/**
diff --git a/plugins/emoticons/tests/Emoticons.php b/plugins/emoticons/tests/Emoticons.php
index 4b6c303c2..e04502285 100644
--- a/plugins/emoticons/tests/Emoticons.php
+++ b/plugins/emoticons/tests/Emoticons.php
@@ -5,7 +5,7 @@ class Emoticons_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../emoticons.php';
+ include_once __DIR__ . '/../emoticons.php';
}
/**
diff --git a/plugins/enigma/tests/Enigma.php b/plugins/enigma/tests/Enigma.php
index 0d0d8f8ae..3972694fc 100644
--- a/plugins/enigma/tests/Enigma.php
+++ b/plugins/enigma/tests/Enigma.php
@@ -5,7 +5,7 @@ class Enigma_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../enigma.php';
+ include_once __DIR__ . '/../enigma.php';
}
/**
diff --git a/plugins/example_addressbook/example_addressbook.php b/plugins/example_addressbook/example_addressbook.php
index 31077adf7..22e230c6f 100644
--- a/plugins/example_addressbook/example_addressbook.php
+++ b/plugins/example_addressbook/example_addressbook.php
@@ -1,6 +1,6 @@
<?php
-require_once(dirname(__FILE__) . '/example_addressbook_backend.php');
+require_once(__DIR__ . '/example_addressbook_backend.php');
/**
* Sample plugin to add a new address book
diff --git a/plugins/example_addressbook/tests/ExampleAddressbook.php b/plugins/example_addressbook/tests/ExampleAddressbook.php
index 4a54bd950..762ee7307 100644
--- a/plugins/example_addressbook/tests/ExampleAddressbook.php
+++ b/plugins/example_addressbook/tests/ExampleAddressbook.php
@@ -5,7 +5,7 @@ class ExampleAddressbook_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../example_addressbook.php';
+ include_once __DIR__ . '/../example_addressbook.php';
}
/**
diff --git a/plugins/filesystem_attachments/tests/FilesystemAttachments.php b/plugins/filesystem_attachments/tests/FilesystemAttachments.php
index dcab315d3..3b60e12c9 100644
--- a/plugins/filesystem_attachments/tests/FilesystemAttachments.php
+++ b/plugins/filesystem_attachments/tests/FilesystemAttachments.php
@@ -5,7 +5,7 @@ class FilesystemAttachments_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../filesystem_attachments.php';
+ include_once __DIR__ . '/../filesystem_attachments.php';
}
/**
diff --git a/plugins/help/skins/larry/help.png b/plugins/help/skins/larry/help.png
index fe88ed4c9..e815e5444 100644
--- a/plugins/help/skins/larry/help.png
+++ b/plugins/help/skins/larry/help.png
Binary files differ
diff --git a/plugins/help/tests/Help.php b/plugins/help/tests/Help.php
index baba492ae..ff5771bf9 100644
--- a/plugins/help/tests/Help.php
+++ b/plugins/help/tests/Help.php
@@ -5,7 +5,7 @@ class Help_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../help.php';
+ include_once __DIR__ . '/../help.php';
}
/**
diff --git a/plugins/hide_blockquote/tests/HideBlockquote.php b/plugins/hide_blockquote/tests/HideBlockquote.php
index 030c05324..90e209459 100644
--- a/plugins/hide_blockquote/tests/HideBlockquote.php
+++ b/plugins/hide_blockquote/tests/HideBlockquote.php
@@ -5,7 +5,7 @@ class HideBlockquote_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../hide_blockquote.php';
+ include_once __DIR__ . '/../hide_blockquote.php';
}
/**
diff --git a/plugins/http_authentication/tests/HttpAuthentication.php b/plugins/http_authentication/tests/HttpAuthentication.php
index c17236821..5de968d87 100644
--- a/plugins/http_authentication/tests/HttpAuthentication.php
+++ b/plugins/http_authentication/tests/HttpAuthentication.php
@@ -5,7 +5,7 @@ class HttpAuthentication_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../http_authentication.php';
+ include_once __DIR__ . '/../http_authentication.php';
}
/**
diff --git a/plugins/identity_select/tests/IdentitySelect.php b/plugins/identity_select/tests/IdentitySelect.php
index 3d7269711..461e79d85 100644
--- a/plugins/identity_select/tests/IdentitySelect.php
+++ b/plugins/identity_select/tests/IdentitySelect.php
@@ -5,7 +5,7 @@ class IdentitySelect_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../identity_select.php';
+ include_once __DIR__ . '/../identity_select.php';
}
/**
diff --git a/plugins/jqueryui/tests/Jqueryui.php b/plugins/jqueryui/tests/Jqueryui.php
index 3bcd27c9f..ee25818ec 100644
--- a/plugins/jqueryui/tests/Jqueryui.php
+++ b/plugins/jqueryui/tests/Jqueryui.php
@@ -5,7 +5,7 @@ class Jqueryui_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../jqueryui.php';
+ include_once __DIR__ . '/../jqueryui.php';
}
/**
diff --git a/plugins/jqueryui/themes/larry/images/animated-overlay.gif b/plugins/jqueryui/themes/larry/images/animated-overlay.gif
index d441f75eb..d441f75eb 100755..100644
--- a/plugins/jqueryui/themes/larry/images/animated-overlay.gif
+++ b/plugins/jqueryui/themes/larry/images/animated-overlay.gif
Binary files differ
diff --git a/plugins/jqueryui/themes/larry/images/ui-dialog-close.png b/plugins/jqueryui/themes/larry/images/ui-dialog-close.png
index 3fc403f52..bc2e244ac 100644
--- a/plugins/jqueryui/themes/larry/images/ui-dialog-close.png
+++ b/plugins/jqueryui/themes/larry/images/ui-dialog-close.png
Binary files differ
diff --git a/plugins/jqueryui/themes/larry/images/ui-icons-datepicker.png b/plugins/jqueryui/themes/larry/images/ui-icons-datepicker.png
index 144ecfe77..77ebd0c5c 100644
--- a/plugins/jqueryui/themes/larry/images/ui-icons-datepicker.png
+++ b/plugins/jqueryui/themes/larry/images/ui-icons-datepicker.png
Binary files differ
diff --git a/plugins/jqueryui/themes/larry/images/ui-icons_004458_256x240.png b/plugins/jqueryui/themes/larry/images/ui-icons_004458_256x240.png
index 083a564f0..31a4ccacf 100755..100644
--- a/plugins/jqueryui/themes/larry/images/ui-icons_004458_256x240.png
+++ b/plugins/jqueryui/themes/larry/images/ui-icons_004458_256x240.png
Binary files differ
diff --git a/plugins/jqueryui/themes/larry/images/ui-icons_d7211e_256x240.png b/plugins/jqueryui/themes/larry/images/ui-icons_d7211e_256x240.png
index fdc2c494f..0ad2dc38d 100755..100644
--- a/plugins/jqueryui/themes/larry/images/ui-icons_d7211e_256x240.png
+++ b/plugins/jqueryui/themes/larry/images/ui-icons_d7211e_256x240.png
Binary files differ
diff --git a/plugins/legacy_browser/tests/LegacyBrowser.php b/plugins/legacy_browser/tests/LegacyBrowser.php
index 8e9762fb2..7a35ee5b6 100644
--- a/plugins/legacy_browser/tests/LegacyBrowser.php
+++ b/plugins/legacy_browser/tests/LegacyBrowser.php
@@ -5,7 +5,7 @@ class Legacy_Browser_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../legacy_browser.php';
+ include_once __DIR__ . '/../legacy_browser.php';
}
/**
diff --git a/plugins/managesieve/managesieve.js b/plugins/managesieve/managesieve.js
index 8340b179d..4d60833be 100644
--- a/plugins/managesieve/managesieve.js
+++ b/plugins/managesieve/managesieve.js
@@ -736,6 +736,9 @@ function smart_field_init(field)
if (field.attr('disabled'))
area.hide();
+ // disable the original field anyway, we don't want it in POST
+ else
+ field.prop('disabled', true);
field.after(area);
diff --git a/plugins/managesieve/tests/Managesieve.php b/plugins/managesieve/tests/Managesieve.php
index d802f5614..6e930b81d 100644
--- a/plugins/managesieve/tests/Managesieve.php
+++ b/plugins/managesieve/tests/Managesieve.php
@@ -5,7 +5,7 @@ class Managesieve_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../managesieve.php';
+ include_once __DIR__ . '/../managesieve.php';
}
/**
diff --git a/plugins/managesieve/tests/Parser.php b/plugins/managesieve/tests/Parser.php
index 9050f09c6..33edce0f0 100644
--- a/plugins/managesieve/tests/Parser.php
+++ b/plugins/managesieve/tests/Parser.php
@@ -5,7 +5,7 @@ class Parser extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_script.php';
+ include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_script.php';
}
/**
@@ -34,7 +34,7 @@ class Parser extends PHPUnit_Framework_TestCase
*/
function data_parser()
{
- $dir_path = realpath(dirname(__FILE__) . '/src');
+ $dir_path = realpath(__DIR__ . '/src');
$dir = opendir($dir_path);
$result = array();
diff --git a/plugins/managesieve/tests/Tokenizer.php b/plugins/managesieve/tests/Tokenizer.php
index e71bae015..f50ed75b7 100644
--- a/plugins/managesieve/tests/Tokenizer.php
+++ b/plugins/managesieve/tests/Tokenizer.php
@@ -5,7 +5,7 @@ class Tokenizer extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_script.php';
+ include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_script.php';
}
function data_tokenizer()
diff --git a/plugins/managesieve/tests/Vacation.php b/plugins/managesieve/tests/Vacation.php
index e34eb7aa2..942525c2f 100644
--- a/plugins/managesieve/tests/Vacation.php
+++ b/plugins/managesieve/tests/Vacation.php
@@ -5,8 +5,8 @@ class Managesieve_Vacation extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_engine.php';
- include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_vacation.php';
+ include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_engine.php';
+ include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_vacation.php';
}
/**
diff --git a/plugins/markasjunk/tests/Markasjunk.php b/plugins/markasjunk/tests/Markasjunk.php
index cdf13255e..73494b0ec 100644
--- a/plugins/markasjunk/tests/Markasjunk.php
+++ b/plugins/markasjunk/tests/Markasjunk.php
@@ -5,7 +5,7 @@ class Markasjunk_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../markasjunk.php';
+ include_once __DIR__ . '/../markasjunk.php';
}
/**
diff --git a/plugins/new_user_dialog/tests/NewUserDialog.php b/plugins/new_user_dialog/tests/NewUserDialog.php
index 3a52f20f3..e58489a09 100644
--- a/plugins/new_user_dialog/tests/NewUserDialog.php
+++ b/plugins/new_user_dialog/tests/NewUserDialog.php
@@ -5,7 +5,7 @@ class NewUserDialog_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../new_user_dialog.php';
+ include_once __DIR__ . '/../new_user_dialog.php';
}
/**
diff --git a/plugins/new_user_identity/tests/NewUserIdentity.php b/plugins/new_user_identity/tests/NewUserIdentity.php
index c1d385853..21197362e 100644
--- a/plugins/new_user_identity/tests/NewUserIdentity.php
+++ b/plugins/new_user_identity/tests/NewUserIdentity.php
@@ -5,7 +5,7 @@ class NewUserIdentity_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../new_user_identity.php';
+ include_once __DIR__ . '/../new_user_identity.php';
}
/**
diff --git a/plugins/newmail_notifier/tests/NewmailNotifier.php b/plugins/newmail_notifier/tests/NewmailNotifier.php
index 571912a61..ccddccd39 100644
--- a/plugins/newmail_notifier/tests/NewmailNotifier.php
+++ b/plugins/newmail_notifier/tests/NewmailNotifier.php
@@ -5,7 +5,7 @@ class NewmailNotifier_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../newmail_notifier.php';
+ include_once __DIR__ . '/../newmail_notifier.php';
}
/**
diff --git a/plugins/password/config.inc.php.dist b/plugins/password/config.inc.php.dist
index 6610b4dae..94c4368fe 100644
--- a/plugins/password/config.inc.php.dist
+++ b/plugins/password/config.inc.php.dist
@@ -204,10 +204,11 @@ $config['password_ldap_search_filter'] = '(uid=%login)';
// LDAP password hash type
// Standard LDAP encryption type which must be one of: crypt,
-// ext_des, md5crypt, blowfish, md5, sha, smd5, ssha, ad or clear.
+// ext_des, md5crypt, blowfish, md5, sha, smd5, ssha, ad, cram-md5 (dovecot style) or clear.
// Please note that most encodage types require external libraries
// to be included in your PHP installation, see function hashPassword in drivers/ldap.php for more info.
-// Default: 'crypt'
+// Multiple password Values can be generated by concatenating encodings with a +. E.g. 'cram-md5+crypt'
+// Default: 'crypt'.
$config['password_ldap_encodage'] = 'crypt';
// LDAP password attribute
diff --git a/plugins/password/drivers/ldap.php b/plugins/password/drivers/ldap.php
index 0c932372d..ac2ea3bd3 100644
--- a/plugins/password/drivers/ldap.php
+++ b/plugins/password/drivers/ldap.php
@@ -38,7 +38,8 @@ class rcube_ldap_password
// Building user DN
if ($userDN = $rcmail->config->get('password_ldap_userDN_mask')) {
$userDN = self::substitute_vars($userDN);
- } else {
+ }
+ else {
$userDN = $this->search_userdn($rcmail);
}
@@ -78,13 +79,25 @@ class rcube_ldap_password
return PASSWORD_CONNECT_ERROR;
}
- $crypted_pass = self::hash_password($passwd, $rcmail->config->get('password_ldap_encodage'));
$force = $rcmail->config->get('password_ldap_force_replace');
$pwattr = $rcmail->config->get('password_ldap_pwattr');
$lchattr = $rcmail->config->get('password_ldap_lchattr');
$smbpwattr = $rcmail->config->get('password_ldap_samba_pwattr');
$smblchattr = $rcmail->config->get('password_ldap_samba_lchattr');
$samba = $rcmail->config->get('password_ldap_samba');
+ $encodage = $rcmail->config->get('password_ldap_encodage');
+
+ // Support multiple userPassword values where desired.
+ // multiple encodings can be specified separated by '+' (e.g. "cram-md5+ssha")
+ $encodages = explode('+', $encodage);
+ $crypted_pass = array();
+
+ foreach ($encodages as $enc) {
+ $cpw = self::hash_password($passwd, $enc);
+ if (!empty($cpw)) {
+ $crypted_pass[] = $cpw;
+ }
+ }
// Support password_ldap_samba option for backward compat.
if ($samba && !$smbpwattr) {
@@ -93,7 +106,7 @@ class rcube_ldap_password
}
// Crypt new password
- if (!$crypted_pass) {
+ if (empty($crypted_pass)) {
return PASSWORD_CRYPT_ERROR;
}
@@ -220,75 +233,124 @@ class rcube_ldap_password
case 'crypt':
$crypted_password = '{CRYPT}' . crypt($password_clear, self::random_salt(2));
break;
+
case 'ext_des':
/* Extended DES crypt. see OpenBSD crypt man page */
if (!defined('CRYPT_EXT_DES') || CRYPT_EXT_DES == 0) {
/* Your system crypt library does not support extended DES encryption */
return false;
}
+
$crypted_password = '{CRYPT}' . crypt($password_clear, '_' . self::random_salt(8));
break;
+
case 'md5crypt':
if (!defined('CRYPT_MD5') || CRYPT_MD5 == 0) {
/* Your system crypt library does not support md5crypt encryption */
return false;
}
+
$crypted_password = '{CRYPT}' . crypt($password_clear, '$1$' . self::random_salt(9));
break;
+
case 'blowfish':
if (!defined('CRYPT_BLOWFISH') || CRYPT_BLOWFISH == 0) {
/* Your system crypt library does not support blowfish encryption */
return false;
}
+
/* Hardcoded to second blowfish version and set number of rounds */
$crypted_password = '{CRYPT}' . crypt($password_clear, '$2a$12$' . self::random_salt(13));
break;
+
case 'md5':
$crypted_password = '{MD5}' . base64_encode(pack('H*', md5($password_clear)));
break;
+
case 'sha':
if (function_exists('sha1')) {
/* Use PHP 4.3.0+ sha1 function, if it is available */
$crypted_password = '{SHA}' . base64_encode(pack('H*', sha1($password_clear)));
- } else if (function_exists('mhash')) {
+ }
+ else if (function_exists('hash')) {
+ $crypted_password = '{SHA}' . base64_encode(hash('sha1', $password_clear, true));
+ }
+ else if (function_exists('mhash')) {
$crypted_password = '{SHA}' . base64_encode(mhash(MHASH_SHA1, $password_clear));
- } else {
- /* Your PHP install does not have the mhash() function */
+ }
+ else {
+ /* Your PHP install does not have the mhash()/hash() nor sha1() function */
return false;
}
break;
+
case 'ssha':
+ mt_srand((double) microtime() * 1000000);
+ $salt = substr(pack('h*', md5(mt_rand())), 0, 8);
+
if (function_exists('mhash') && function_exists('mhash_keygen_s2k')) {
- mt_srand((double) microtime() * 1000000 );
- $salt = mhash_keygen_s2k(MHASH_SHA1, $password_clear, substr(pack('h*', md5(mt_rand())), 0, 8), 4);
- $crypted_password = '{SSHA}' . base64_encode(mhash(MHASH_SHA1, $password_clear . $salt) . $salt);
- } else {
- /* Your PHP install does not have the mhash() function */
+ $salt = mhash_keygen_s2k(MHASH_SHA1, $password_clear, $salt, 4);
+ $password = mhash(MHASH_SHA1, $password_clear . $salt);
+ }
+ else if (function_exists('sha1')) {
+ $salt = substr(pack("H*", sha1($salt . $password_clear)), 0, 4);
+ $password = sha1($password_clear . $salt, true);
+ }
+ else if (function_exists('hash')) {
+ $salt = substr(pack("H*", hash('sha1', $salt . $password_clear)), 0, 4);
+ $password = hash('sha1', $password_clear . $salt, true);
+ }
+
+ if ($password) {
+ $crypted_password = '{SSHA}' . base64_encode($password . $salt);
+ }
+ else {
+ /* Your PHP install does not have the mhash()/hash() nor sha1() function */
return false;
}
break;
+
+
case 'smd5':
+ mt_srand((double) microtime() * 1000000);
+ $salt = substr(pack('h*', md5(mt_rand())), 0, 8);
+
if (function_exists('mhash') && function_exists('mhash_keygen_s2k')) {
- mt_srand((double) microtime() * 1000000 );
- $salt = mhash_keygen_s2k(MHASH_MD5, $password_clear, substr(pack('h*', md5(mt_rand())), 0, 8), 4);
- $crypted_password = '{SMD5}' . base64_encode(mhash(MHASH_MD5, $password_clear . $salt) . $salt);
- } else {
- /* Your PHP install does not have the mhash() function */
- return false;
+ $salt = mhash_keygen_s2k(MHASH_MD5, $password_clear, $salt, 4);
+ $password = mhash(MHASH_MD5, $password_clear . $salt);
}
+ else if (function_exists('hash')) {
+ $salt = substr(pack("H*", hash('md5', $salt . $password_clear)), 0, 4);
+ $password = hash('md5', $password_clear . $salt, true);
+ }
+ else {
+ $salt = substr(pack("H*", md5($salt . $password_clear)), 0, 4);
+ $password = md5($password_clear . $salt, true);
+ }
+
+ $crypted_password = '{SMD5}' . base64_encode($password . $salt);
break;
+
case 'samba':
if (function_exists('hash')) {
$crypted_password = hash('md4', rcube_charset::convert($password_clear, RCUBE_CHARSET, 'UTF-16LE'));
$crypted_password = strtoupper($crypted_password);
- } else {
+ }
+ else {
/* Your PHP install does not have the hash() function */
return false;
}
break;
+
case 'ad':
$crypted_password = rcube_charset::convert('"' . $password_clear . '"', RCUBE_CHARSET, 'UTF-16LE');
break;
+
+ case 'cram-md5':
+ require_once __DIR__ . '/../helpers/dovecot_hmacmd5.php';
+ return dovecot_hmacmd5($password_clear);
+ break;
+
case 'clear':
default:
$crypted_password = $password_clear;
diff --git a/plugins/password/helpers/dovecot_hmacmd5.php b/plugins/password/helpers/dovecot_hmacmd5.php
new file mode 100644
index 000000000..644b5377e
--- /dev/null
+++ b/plugins/password/helpers/dovecot_hmacmd5.php
@@ -0,0 +1,191 @@
+<?php
+
+/**
+ *
+ * dovecot_hmacmd5.php V1.01
+ *
+ * Generates HMAC-MD5 'contexts' for Dovecot's password files.
+ *
+ * (C) 2008 Hajo Noerenberg
+ *
+ * http://www.noerenberg.de/hajo/pub/dovecot_hmacmd5.php.txt
+ *
+ * Most of the code has been shamelessly stolen from various sources:
+ *
+ * (C) Paul Johnston 1999 - 2000 / http://pajhome.org.uk/crypt/md5/
+ * (C) William K. Cole 2008 / http://www.scconsult.com/bill/crampass.pl
+ * (C) Borfast 2002 / http://www.zend.com/code/codex.php?ozid=962&single=1
+ * (C) Thomas Weber / http://pajhome.org.uk/crypt/md5/contrib/md5.java.txt
+ *
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.0 as
+ * published by the Free Software Foundation.
+ *
+ * This program 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. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/gpl-3.0.txt>.
+ *
+ */
+
+/* Convert a 32-bit number to a hex string with ls-byte first
+ */
+
+function rhex($n) {
+ $hex_chr = "0123456789abcdef"; $r = '';
+ for($j = 0; $j <= 3; $j++)
+ $r .= $hex_chr[($n >> ($j * 8 + 4)) & 0x0F] . $hex_chr[($n >> ($j * 8)) & 0x0F];
+ return $r;
+}
+
+/* zeroFill() is needed because PHP doesn't have a zero-fill
+ * right shift operator like JavaScript's >>>
+ */
+
+function zeroFill($a, $b) {
+ $z = hexdec(80000000);
+ if ($z & $a) {
+ $a >>= 1;
+ $a &= (~$z);
+ $a |= 0x40000000;
+ $a >>= ($b-1);
+ } else {
+ $a >>= $b;
+ }
+ return $a;
+}
+
+/* Bitwise rotate a 32-bit number to the left
+ */
+
+function bit_rol($num, $cnt) {
+ return ($num << $cnt) | (zeroFill($num, (32 - $cnt)));
+}
+
+/* Add integers, wrapping at 2^32
+ */
+
+function safe_add($x, $y) {
+ return (($x&0x7FFFFFFF) + ($y&0x7FFFFFFF)) ^ ($x&0x80000000) ^ ($y&0x80000000);
+}
+
+/* These functions implement the four basic operations the algorithm uses.
+ */
+
+function md5_cmn($q, $a, $b, $x, $s, $t) {
+ return safe_add(bit_rol(safe_add(safe_add($a, $q), safe_add($x, $t)), $s), $b);
+}
+function md5_ff($a, $b, $c, $d, $x, $s, $t) {
+ return md5_cmn(($b & $c) | ((~$b) & $d), $a, $b, $x, $s, $t);
+}
+function md5_gg($a, $b, $c, $d, $x, $s, $t) {
+ return md5_cmn(($b & $d) | ($c & (~$d)), $a, $b, $x, $s, $t);
+}
+function md5_hh($a, $b, $c, $d, $x, $s, $t) {
+ return md5_cmn($b ^ $c ^ $d, $a, $b, $x, $s, $t);
+}
+function md5_ii($a, $b, $c, $d, $x, $s, $t) {
+ return md5_cmn($c ^ ($b | (~$d)), $a, $b, $x, $s, $t);
+}
+
+/* Calculate the first round of the MD5 algorithm
+ */
+
+function md5_oneround($s, $io) {
+
+ $s = str_pad($s, 64, chr(0x00));
+
+ $x = array_fill(0, 16, 0);
+
+ for($i = 0; $i < 64; $i++)
+ $x[$i >> 2] |= (($io ? 0x36 : 0x5c) ^ ord($s[$i])) << (($i % 4) * 8);
+
+ $a = $olda = 1732584193;
+ $b = $oldb = -271733879;
+ $c = $oldc = -1732584194;
+ $d = $oldd = 271733878;
+
+ $a = md5_ff($a, $b, $c, $d, $x[ 0], 7 , -680876936);
+ $d = md5_ff($d, $a, $b, $c, $x[ 1], 12, -389564586);
+ $c = md5_ff($c, $d, $a, $b, $x[ 2], 17, 606105819);
+ $b = md5_ff($b, $c, $d, $a, $x[ 3], 22, -1044525330);
+ $a = md5_ff($a, $b, $c, $d, $x[ 4], 7 , -176418897);
+ $d = md5_ff($d, $a, $b, $c, $x[ 5], 12, 1200080426);
+ $c = md5_ff($c, $d, $a, $b, $x[ 6], 17, -1473231341);
+ $b = md5_ff($b, $c, $d, $a, $x[ 7], 22, -45705983);
+ $a = md5_ff($a, $b, $c, $d, $x[ 8], 7 , 1770035416);
+ $d = md5_ff($d, $a, $b, $c, $x[ 9], 12, -1958414417);
+ $c = md5_ff($c, $d, $a, $b, $x[10], 17, -42063);
+ $b = md5_ff($b, $c, $d, $a, $x[11], 22, -1990404162);
+ $a = md5_ff($a, $b, $c, $d, $x[12], 7 , 1804603682);
+ $d = md5_ff($d, $a, $b, $c, $x[13], 12, -40341101);
+ $c = md5_ff($c, $d, $a, $b, $x[14], 17, -1502002290);
+ $b = md5_ff($b, $c, $d, $a, $x[15], 22, 1236535329);
+
+ $a = md5_gg($a, $b, $c, $d, $x[ 1], 5 , -165796510);
+ $d = md5_gg($d, $a, $b, $c, $x[ 6], 9 , -1069501632);
+ $c = md5_gg($c, $d, $a, $b, $x[11], 14, 643717713);
+ $b = md5_gg($b, $c, $d, $a, $x[ 0], 20, -373897302);
+ $a = md5_gg($a, $b, $c, $d, $x[ 5], 5 , -701558691);
+ $d = md5_gg($d, $a, $b, $c, $x[10], 9 , 38016083);
+ $c = md5_gg($c, $d, $a, $b, $x[15], 14, -660478335);
+ $b = md5_gg($b, $c, $d, $a, $x[ 4], 20, -405537848);
+ $a = md5_gg($a, $b, $c, $d, $x[ 9], 5 , 568446438);
+ $d = md5_gg($d, $a, $b, $c, $x[14], 9 , -1019803690);
+ $c = md5_gg($c, $d, $a, $b, $x[ 3], 14, -187363961);
+ $b = md5_gg($b, $c, $d, $a, $x[ 8], 20, 1163531501);
+ $a = md5_gg($a, $b, $c, $d, $x[13], 5 , -1444681467);
+ $d = md5_gg($d, $a, $b, $c, $x[ 2], 9 , -51403784);
+ $c = md5_gg($c, $d, $a, $b, $x[ 7], 14, 1735328473);
+ $b = md5_gg($b, $c, $d, $a, $x[12], 20, -1926607734);
+
+ $a = md5_hh($a, $b, $c, $d, $x[ 5], 4 , -378558);
+ $d = md5_hh($d, $a, $b, $c, $x[ 8], 11, -2022574463);
+ $c = md5_hh($c, $d, $a, $b, $x[11], 16, 1839030562);
+ $b = md5_hh($b, $c, $d, $a, $x[14], 23, -35309556);
+ $a = md5_hh($a, $b, $c, $d, $x[ 1], 4 , -1530992060);
+ $d = md5_hh($d, $a, $b, $c, $x[ 4], 11, 1272893353);
+ $c = md5_hh($c, $d, $a, $b, $x[ 7], 16, -155497632);
+ $b = md5_hh($b, $c, $d, $a, $x[10], 23, -1094730640);
+ $a = md5_hh($a, $b, $c, $d, $x[13], 4 , 681279174);
+ $d = md5_hh($d, $a, $b, $c, $x[ 0], 11, -358537222);
+ $c = md5_hh($c, $d, $a, $b, $x[ 3], 16, -722521979);
+ $b = md5_hh($b, $c, $d, $a, $x[ 6], 23, 76029189);
+ $a = md5_hh($a, $b, $c, $d, $x[ 9], 4 , -640364487);
+ $d = md5_hh($d, $a, $b, $c, $x[12], 11, -421815835);
+ $c = md5_hh($c, $d, $a, $b, $x[15], 16, 530742520);
+ $b = md5_hh($b, $c, $d, $a, $x[ 2], 23, -995338651);
+
+ $a = md5_ii($a, $b, $c, $d, $x[ 0], 6 , -198630844);
+ $d = md5_ii($d, $a, $b, $c, $x[ 7], 10, 1126891415);
+ $c = md5_ii($c, $d, $a, $b, $x[14], 15, -1416354905);
+ $b = md5_ii($b, $c, $d, $a, $x[ 5], 21, -57434055);
+ $a = md5_ii($a, $b, $c, $d, $x[12], 6 , 1700485571);
+ $d = md5_ii($d, $a, $b, $c, $x[ 3], 10, -1894986606);
+ $c = md5_ii($c, $d, $a, $b, $x[10], 15, -1051523);
+ $b = md5_ii($b, $c, $d, $a, $x[ 1], 21, -2054922799);
+ $a = md5_ii($a, $b, $c, $d, $x[ 8], 6 , 1873313359);
+ $d = md5_ii($d, $a, $b, $c, $x[15], 10, -30611744);
+ $c = md5_ii($c, $d, $a, $b, $x[ 6], 15, -1560198380);
+ $b = md5_ii($b, $c, $d, $a, $x[13], 21, 1309151649);
+ $a = md5_ii($a, $b, $c, $d, $x[ 4], 6 , -145523070);
+ $d = md5_ii($d, $a, $b, $c, $x[11], 10, -1120210379);
+ $c = md5_ii($c, $d, $a, $b, $x[ 2], 15, 718787259);
+ $b = md5_ii($b, $c, $d, $a, $x[ 9], 21, -343485551);
+
+ $a = safe_add($a, $olda);
+ $b = safe_add($b, $oldb);
+ $c = safe_add($c, $oldc);
+ $d = safe_add($d, $oldd);
+
+ return rhex($a) . rhex($b) . rhex($c) . rhex($d);
+}
+
+function dovecot_hmacmd5 ($s) {
+ if (strlen($s) > 64) $s=pack("H*", md5($s));
+ return "{CRAM-MD5}" . md5_oneround($s, 0) . md5_oneround($s, 1);
+}
diff --git a/plugins/password/password.php b/plugins/password/password.php
index 0db57afc6..9239cd0b0 100644
--- a/plugins/password/password.php
+++ b/plugins/password/password.php
@@ -306,10 +306,10 @@ class password extends rcube_plugin
switch ($result) {
case PASSWORD_SUCCESS:
return;
- case PASSWORD_CRYPT_ERROR;
+ case PASSWORD_CRYPT_ERROR:
$reason = $this->gettext('crypterror');
break;
- case PASSWORD_CONNECT_ERROR;
+ case PASSWORD_CONNECT_ERROR:
$reason = $this->gettext('connecterror');
break;
case PASSWORD_ERROR:
diff --git a/plugins/password/tests/Password.php b/plugins/password/tests/Password.php
index a9663a946..b64c6b889 100644
--- a/plugins/password/tests/Password.php
+++ b/plugins/password/tests/Password.php
@@ -5,7 +5,7 @@ class Password_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../password.php';
+ include_once __DIR__ . '/../password.php';
}
/**
diff --git a/plugins/redundant_attachments/tests/RedundantAttachments.php b/plugins/redundant_attachments/tests/RedundantAttachments.php
index 386f97e59..53f0c0138 100644
--- a/plugins/redundant_attachments/tests/RedundantAttachments.php
+++ b/plugins/redundant_attachments/tests/RedundantAttachments.php
@@ -5,7 +5,7 @@ class RedundantAttachments_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../redundant_attachments.php';
+ include_once __DIR__ . '/../redundant_attachments.php';
}
/**
diff --git a/plugins/show_additional_headers/tests/ShowAdditionalHeaders.php b/plugins/show_additional_headers/tests/ShowAdditionalHeaders.php
index 902ce510b..ab77351a4 100644
--- a/plugins/show_additional_headers/tests/ShowAdditionalHeaders.php
+++ b/plugins/show_additional_headers/tests/ShowAdditionalHeaders.php
@@ -5,7 +5,7 @@ class ShowAdditionalHeaders_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../show_additional_headers.php';
+ include_once __DIR__ . '/../show_additional_headers.php';
}
/**
diff --git a/plugins/squirrelmail_usercopy/tests/SquirrelmailUsercopy.php b/plugins/squirrelmail_usercopy/tests/SquirrelmailUsercopy.php
index 2e35509f0..0e3a5c48a 100644
--- a/plugins/squirrelmail_usercopy/tests/SquirrelmailUsercopy.php
+++ b/plugins/squirrelmail_usercopy/tests/SquirrelmailUsercopy.php
@@ -5,7 +5,7 @@ class SquirrelmailUsercopy_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../squirrelmail_usercopy.php';
+ include_once __DIR__ . '/../squirrelmail_usercopy.php';
}
/**
diff --git a/plugins/subscriptions_option/tests/SubscriptionsOption.php b/plugins/subscriptions_option/tests/SubscriptionsOption.php
index 6932a955f..10168315e 100644
--- a/plugins/subscriptions_option/tests/SubscriptionsOption.php
+++ b/plugins/subscriptions_option/tests/SubscriptionsOption.php
@@ -5,7 +5,7 @@ class SubscriptionsOption_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../subscriptions_option.php';
+ include_once __DIR__ . '/../subscriptions_option.php';
}
/**
diff --git a/plugins/userinfo/tests/Userinfo.php b/plugins/userinfo/tests/Userinfo.php
index 762d5a1fa..7eb0758b5 100644
--- a/plugins/userinfo/tests/Userinfo.php
+++ b/plugins/userinfo/tests/Userinfo.php
@@ -5,7 +5,7 @@ class Userinfo_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../userinfo.php';
+ include_once __DIR__ . '/../userinfo.php';
}
/**
diff --git a/plugins/vcard_attachments/tests/VcardAttachments.php b/plugins/vcard_attachments/tests/VcardAttachments.php
index 35fd7f447..4b37cfc01 100644
--- a/plugins/vcard_attachments/tests/VcardAttachments.php
+++ b/plugins/vcard_attachments/tests/VcardAttachments.php
@@ -5,7 +5,7 @@ class VcardAttachments_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../vcard_attachments.php';
+ include_once __DIR__ . '/../vcard_attachments.php';
}
/**
diff --git a/plugins/virtuser_file/tests/VirtuserFile.php b/plugins/virtuser_file/tests/VirtuserFile.php
index a4362c3dc..80feecd15 100644
--- a/plugins/virtuser_file/tests/VirtuserFile.php
+++ b/plugins/virtuser_file/tests/VirtuserFile.php
@@ -5,7 +5,7 @@ class VirtuserFile_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../virtuser_file.php';
+ include_once __DIR__ . '/../virtuser_file.php';
}
/**
diff --git a/plugins/virtuser_query/tests/VirtuserQuery.php b/plugins/virtuser_query/tests/VirtuserQuery.php
index d5bd4ee4b..6c68f4c64 100644
--- a/plugins/virtuser_query/tests/VirtuserQuery.php
+++ b/plugins/virtuser_query/tests/VirtuserQuery.php
@@ -5,7 +5,7 @@ class VirtuserQuery_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../virtuser_query.php';
+ include_once __DIR__ . '/../virtuser_query.php';
}
/**
diff --git a/plugins/zipdownload/tests/Zipdownload.php b/plugins/zipdownload/tests/Zipdownload.php
index f3b4e1b35..3882dea87 100644
--- a/plugins/zipdownload/tests/Zipdownload.php
+++ b/plugins/zipdownload/tests/Zipdownload.php
@@ -5,7 +5,7 @@ class Zipdownload_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../zipdownload.php';
+ include_once __DIR__ . '/../zipdownload.php';
}
/**
diff --git a/program/include/clisetup.php b/program/include/clisetup.php
index 47a40719a..76afde968 100644
--- a/program/include/clisetup.php
+++ b/program/include/clisetup.php
@@ -5,7 +5,7 @@
| program/include/clisetup.php |
| |
| This file is part of the Roundcube Webmail client |
- | Copyright (C) 2010-2012, The Roundcube Dev Team |
+ | Copyright (C) 2010-2014, The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@@ -27,3 +27,6 @@ require_once INSTALL_PATH . 'program/include/iniset.php';
// Unset max. execution time limit, set to 120 seconds in iniset.php
@set_time_limit(0);
+
+$rcmail = rcmail::get_instance();
+$rcmail->output = new rcmail_output_cli();
diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index e1a62767d..221b50afe 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -1802,7 +1802,7 @@ class rcmail extends rcube
$error = 'errorreadonly';
}
else if ($res_code == rcube_storage::OVERQUOTA) {
- $error = 'errorroverquota';
+ $error = 'erroroverquota';
}
else if ($err_code && ($err_str = $this->storage->get_error_str())) {
// try to detect access rights problem and display appropriate message
diff --git a/program/include/rcmail_output_cli.php b/program/include/rcmail_output_cli.php
new file mode 100644
index 000000000..c8a968832
--- /dev/null
+++ b/program/include/rcmail_output_cli.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcmail_output_cli.php |
+ | |
+ | This file is part of the Roundcube PHP suite |
+ | Copyright (C) 2005-2014 The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | CONTENTS: |
+ | Abstract class for output generation |
+ | |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com> |
+ +-----------------------------------------------------------------------+
+*/
+
+/**
+ * Class for output generation
+ *
+ * @package Webmail
+ * @subpackage View
+ */
+class rcmail_output_cli extends rcmail_output
+{
+ public $type = 'cli';
+
+ /**
+ * Object constructor
+ */
+ public function __construct($task = null, $framed = false)
+ {
+ parent::__construct();
+ }
+
+ /**
+ * Call a client method
+ *
+ * @see rcube_output::command()
+ */
+ function command()
+ {
+ // NOP
+ }
+
+ /**
+ * Add a localized label to the client environment
+ */
+ function add_label()
+ {
+ // NOP
+ }
+
+ /**
+ * Invoke display_message command
+ *
+ * @see rcube_output::show_message()
+ */
+ function show_message($message, $type = 'notice', $vars = null, $override = true, $timeout = 0)
+ {
+ if ($this->app->text_exists($message)) {
+ $message = $this->app->gettext(array('name' => $message, 'vars' => $vars));
+ }
+
+ printf("[%s] %s\n", strtoupper($type), $message);
+ }
+
+ /**
+ * Redirect to a certain url.
+ *
+ * @see rcube_output::redirect()
+ */
+ function redirect($p = array(), $delay = 1)
+ {
+ // NOP
+ }
+
+ /**
+ * Send output to the client.
+ */
+ function send()
+ {
+ // NOP
+ }
+
+}
diff --git a/program/js/app.js b/program/js/app.js
index 2018cfbc4..9dca320dd 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -3617,11 +3617,15 @@ function rcube_webmail()
this.toggle_editor = function(props, obj, e)
{
// @todo: this should work also with many editors on page
- var result = this.editor.toggle(props.html);
+ var result = this.editor.toggle(props.html, props.noconvert || false);
+
+ // satisfy the expectations of aftertoggle-editor event subscribers
+ props.mode = props.html ? 'html' : 'plain';
if (!result && e) {
// fix selector value if operation failed
- $(e.target).filter('select').val(props.html ? 'plain' : 'html');
+ props.mode = props.html ? 'plain' : 'html';
+ $(e.target).filter('select').val(props.mode);
}
if (result) {
@@ -3924,7 +3928,7 @@ function rcube_webmail()
// initialize HTML editor
if ((formdata._is_html == '1' && !html_mode) || (formdata._is_html != '1' && html_mode)) {
- this.command('toggle-editor', {id: this.env.composebody, html: !html_mode});
+ this.command('toggle-editor', {id: this.env.composebody, html: !html_mode, noconvert: true});
}
}
};
@@ -3961,6 +3965,19 @@ function rcube_webmail()
if (!show_sig)
show_sig = this.env.show_sig;
+ var id = obj.options[obj.selectedIndex].value,
+ sig = this.env.identity,
+ delim = this.env.recipients_separator,
+ rx_delim = RegExp.escape(delim);
+
+ // enable manual signature insert
+ if (this.env.signatures && this.env.signatures[id]) {
+ this.enable_command('insert-sig', true);
+ this.env.compose_commands.push('insert-sig');
+ }
+ else
+ this.enable_command('insert-sig', false);
+
// first function execution
if (!this.env.identities_initialized) {
this.env.identities_initialized = true;
@@ -3970,11 +3987,6 @@ function rcube_webmail()
return;
}
- var id = obj.options[obj.selectedIndex].value,
- sig = this.env.identity,
- delim = this.env.recipients_separator,
- rx_delim = RegExp.escape(delim);
-
// update reply-to/bcc fields with addresses defined in identities
$.each(['replyto', 'bcc'], function() {
var rx, key = this,
@@ -4008,14 +4020,6 @@ function rcube_webmail()
input.val(input_val).change();
});
- // enable manual signature insert
- if (this.env.signatures && this.env.signatures[id]) {
- this.enable_command('insert-sig', true);
- this.env.compose_commands.push('insert-sig');
- }
- else
- this.enable_command('insert-sig', false);
-
this.editor.change_signature(id, show_sig);
this.env.identity = id;
this.triggerEvent('change_identity');
diff --git a/program/js/editor.js b/program/js/editor.js
index b2e96d180..0facfd948 100644
--- a/program/js/editor.js
+++ b/program/js/editor.js
@@ -194,7 +194,7 @@ function rcube_text_editor(config, id)
};
// switch html/plain mode
- this.toggle = function(ishtml)
+ this.toggle = function(ishtml, noconvert)
{
var curr, content, result,
// these non-printable chars are not removed on text2html and html2text
@@ -214,8 +214,7 @@ function rcube_text_editor(config, id)
if (is_sig)
content = content.replace(signature.text, sig_mark);
- // convert to html
- result = rcmail.plain2html(content, function(data) {
+ var init_editor = function(data) {
// replace signature mark with html version of the signature
if (is_sig)
data = data.replace(sig_mark, '<div id="_rc_sig">' + signature.html + '</div>');
@@ -231,7 +230,16 @@ function rcube_text_editor(config, id)
ref.tabindex(true);
}
}, 500);
- });
+ };
+
+ // convert to html
+ if (!noconvert) {
+ result = rcmail.plain2html(content, init_editor);
+ }
+ else {
+ init_editor(content);
+ result = true;
+ }
}
else if (this.editor) {
if (is_sig) {
@@ -250,8 +258,7 @@ function rcube_text_editor(config, id)
// get html content
content = this.editor.getContent();
- // convert html to text
- result = rcmail.html2plain(content, function(data) {
+ var init_plaintext = function(data) {
tinymce.execCommand('mceRemoveEditor', false, ref.id);
ref.editor = null;
@@ -260,7 +267,16 @@ function rcube_text_editor(config, id)
data = data.replace(sig_mark, "\n" + signature.text);
input.val(data).focus();
- });
+ };
+
+ // convert html to text
+ if (!noconvert) {
+ result = rcmail.html2plain(content, init_plaintext);
+ }
+ else {
+ init_plaintext(input.val());
+ result = true;
+ }
// bring back current signature
if (!result && curr)
diff --git a/program/lib/Roundcube/bootstrap.php b/program/lib/Roundcube/bootstrap.php
index 98bbce5d4..fe9c389fe 100644
--- a/program/lib/Roundcube/bootstrap.php
+++ b/program/lib/Roundcube/bootstrap.php
@@ -58,7 +58,7 @@ define('RCUBE_VERSION', '1.1-git');
define('RCUBE_CHARSET', 'UTF-8');
if (!defined('RCUBE_LIB_DIR')) {
- define('RCUBE_LIB_DIR', dirname(__FILE__) . '/');
+ define('RCUBE_LIB_DIR', __DIR__ . '/');
}
if (!defined('RCUBE_INSTALL_PATH')) {
diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php
index 3ab650cb1..03f49637c 100644
--- a/program/lib/Roundcube/rcube.php
+++ b/program/lib/Roundcube/rcube.php
@@ -842,6 +842,7 @@ class rcube
* upon decryption; see http://php.net/mcrypt_generic#68082
*/
$clear = pack("a*H2", $clear, "80");
+ $ckey = $this->config->get_crypto_key($key);
if (function_exists('openssl_encrypt')) {
$method = 'DES-EDE3-CBC';
@@ -853,7 +854,7 @@ class rcube
($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, ""))
) {
$iv = $this->create_iv(mcrypt_enc_get_iv_size($td));
- mcrypt_generic_init($td, $this->config->get_crypto_key($key), $iv);
+ mcrypt_generic_init($td, $ckey, $iv);
$cipher = $iv . mcrypt_generic($td, $clear);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
@@ -864,7 +865,7 @@ class rcube
if (function_exists('des')) {
$des_iv_size = 8;
$iv = $this->create_iv($des_iv_size);
- $cipher = $iv . des($this->config->get_crypto_key($key), $clear, 1, 1, $iv);
+ $cipher = $iv . des($ckey, $clear, 1, 1, $iv);
}
else {
self::raise_error(array(
@@ -895,6 +896,7 @@ class rcube
}
$cipher = $base64 ? base64_decode($cipher) : $cipher;
+ $ckey = $this->config->get_crypto_key($key);
if (function_exists('openssl_decrypt')) {
$method = 'DES-EDE3-CBC';
@@ -914,7 +916,7 @@ class rcube
($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, ""))
) {
$iv_size = mcrypt_enc_get_iv_size($td);
- $iv = substr($cipher, 0, $iv_size);
+ $iv = substr($cipher, 0, $iv_size);
// session corruption? (#1485970)
if (strlen($iv) < $iv_size) {
@@ -922,7 +924,7 @@ class rcube
}
$cipher = substr($cipher, $iv_size);
- mcrypt_generic_init($td, $this->config->get_crypto_key($key), $iv);
+ mcrypt_generic_init($td, $ckey, $iv);
$clear = mdecrypt_generic($td, $cipher);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
@@ -932,15 +934,15 @@ class rcube
if (function_exists('des')) {
$des_iv_size = 8;
- $iv = substr($cipher, 0, $des_iv_size);
+ $iv = substr($cipher, 0, $des_iv_size);
$cipher = substr($cipher, $des_iv_size);
- $clear = des($this->config->get_crypto_key($key), $cipher, 0, 1, $iv);
+ $clear = des($ckey, $cipher, 0, 1, $iv);
}
else {
self::raise_error(array(
'code' => 500, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__,
- 'message' => "Could not perform decryption; make sure Mcrypt is installed or lib/des.inc is available"
+ 'message' => "Could not perform decryption; make sure OpenSSL or Mcrypt or lib/des.inc is available"
), true, true);
}
}
diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php
index 9af5ce4c6..734a9311e 100644
--- a/program/lib/Roundcube/rcube_imap_generic.php
+++ b/program/lib/Roundcube/rcube_imap_generic.php
@@ -2041,8 +2041,14 @@ class rcube_imap_generic
$flag = $this->flags[strtoupper($flag)];
}
- if (!$flag || (!in_array($flag, (array) $this->data['PERMANENTFLAGS'])
- && !in_array('\\*', (array) $this->data['PERMANENTFLAGS']))
+ if (!$flag) {
+ return false;
+ }
+
+ // if PERMANENTFLAGS is not specified all flags are allowed
+ if (!empty($this->data['PERMANENTFLAGS'])
+ && !in_array($flag, (array) $this->data['PERMANENTFLAGS'])
+ && !in_array('\\*', (array) $this->data['PERMANENTFLAGS'])
) {
return false;
}
diff --git a/program/lib/Roundcube/rcube_plugin_api.php b/program/lib/Roundcube/rcube_plugin_api.php
index e0b8aea38..92a56363a 100644
--- a/program/lib/Roundcube/rcube_plugin_api.php
+++ b/program/lib/Roundcube/rcube_plugin_api.php
@@ -626,6 +626,16 @@ class rcube_plugin_api
}
/**
+ * Returns loaded plugin
+ *
+ * @return rcube_plugin Plugin instance
+ */
+ public function get_plugin($name)
+ {
+ return $this->plugins[$name];
+ }
+
+ /**
* Callback for template_container hooks
*
* @param array $attrib
diff --git a/program/steps/utils/error.inc b/program/steps/utils/error.inc
index 2a3a9a61e..ec0d038f4 100644
--- a/program/steps/utils/error.inc
+++ b/program/steps/utils/error.inc
@@ -112,6 +112,7 @@ EOF;
if ($rcmail->output && $rcmail->output->template_exists('error')) {
$rcmail->output->reset();
$rcmail->output->set_env('server_error', $ERROR_CODE);
+ $rcmail->output->set_env('comm_path', $rcmail->comm_path);
$rcmail->output->send('error');
}
diff --git a/skins/classic/print.css b/skins/classic/print.css
index 8eac41f53..349b224cb 100644
--- a/skins/classic/print.css
+++ b/skins/classic/print.css
@@ -8,7 +8,7 @@ body
margin: 2mm;
}
-body, td, th, span, div, p
+body, td, th, div, p
{
font-size: 9pt;
color: #000000;
diff --git a/skins/larry/addressbook.css b/skins/larry/addressbook.css
index f0ff357b3..538734f1f 100644
--- a/skins/larry/addressbook.css
+++ b/skins/larry/addressbook.css
@@ -2,7 +2,7 @@
* Roundcube webmail styles for the Address Book section
*
* Copyright (c) 2012, The Roundcube Dev Team
- * Screendesign by FLINT / Büro für Gestaltung, bueroflint.com
+ * Screendesign by FLINT / B�ro f�r Gestaltung, bueroflint.com
*
* The contents are subject to the Creative Commons Attribution-ShareAlike
* License. It is allowed to copy, distribute, transmit and to adapt the work
@@ -320,7 +320,7 @@ form #contacthead {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f7f7f7), color-stop(100%,#eee));
background: -o-linear-gradient(top, #f7f7f7 0%, #eee 100%);
background: -ms-linear-gradient(top, #f7f7f7 0%, #eee 100%);
- background: linear-gradient(top, #f7f7f7 0%, #eee 100%);
+ background: linear-gradient(to bottom, #f7f7f7 0%, #eee 100%);
margin: 0 0 12px 0;
padding: 8px;
}
@@ -337,7 +337,7 @@ form #contacthead {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f0f0f0), color-stop(100%,#d6d6d6));
background: -o-linear-gradient(top, #f0f0f0 0%, #d6d6d6 100%);
background: -ms-linear-gradient(top, #f0f0f0 0%, #d6d6d6 100%);
- background: linear-gradient(top, #f0f0f0 0%, #d6d6d6 100%);
+ background: linear-gradient(to bottom, #f0f0f0 0%, #d6d6d6 100%);
border-bottom: 1px solid #cfcfcf;
border-radius: 5px 5px 0 0;
}
diff --git a/skins/larry/images/buttons.png b/skins/larry/images/buttons.png
index 21298ab59..713ac169a 100644
--- a/skins/larry/images/buttons.png
+++ b/skins/larry/images/buttons.png
Binary files differ
diff --git a/skins/larry/images/contactgroup.png b/skins/larry/images/contactgroup.png
index 8303cf02f..6c5c736ec 100644
--- a/skins/larry/images/contactgroup.png
+++ b/skins/larry/images/contactgroup.png
Binary files differ
diff --git a/skins/larry/images/contactpic_32px.png b/skins/larry/images/contactpic_32px.png
index 358984ecc..d133233d0 100644
--- a/skins/larry/images/contactpic_32px.png
+++ b/skins/larry/images/contactpic_32px.png
Binary files differ
diff --git a/skins/larry/images/filedrop.png b/skins/larry/images/filedrop.png
index d4d455bdf..9c1aebeb9 100644
--- a/skins/larry/images/filedrop.png
+++ b/skins/larry/images/filedrop.png
Binary files differ
diff --git a/skins/larry/images/filetypes.png b/skins/larry/images/filetypes.png
index 09772660b..35c97d04e 100644
--- a/skins/larry/images/filetypes.png
+++ b/skins/larry/images/filetypes.png
Binary files differ
diff --git a/skins/larry/images/listicons.png b/skins/larry/images/listicons.png
index 6a5edfdb1..56e6fbc70 100644
--- a/skins/larry/images/listicons.png
+++ b/skins/larry/images/listicons.png
Binary files differ
diff --git a/skins/larry/images/login_shadow.png b/skins/larry/images/login_shadow.png
index 3edc46722..cd7e8bdc3 100644
--- a/skins/larry/images/login_shadow.png
+++ b/skins/larry/images/login_shadow.png
Binary files differ
diff --git a/skins/larry/images/messages.png b/skins/larry/images/messages.png
index ecfff1285..d5c8c6146 100644
--- a/skins/larry/images/messages.png
+++ b/skins/larry/images/messages.png
Binary files differ
diff --git a/skins/larry/images/messages_dark.png b/skins/larry/images/messages_dark.png
index d7c932502..e0bed1bb3 100644
--- a/skins/larry/images/messages_dark.png
+++ b/skins/larry/images/messages_dark.png
Binary files differ
diff --git a/skins/larry/images/overflowshadow.png b/skins/larry/images/overflowshadow.png
index 5728a2167..ceec94f2f 100644
--- a/skins/larry/images/overflowshadow.png
+++ b/skins/larry/images/overflowshadow.png
Binary files differ
diff --git a/skins/larry/images/quota.png b/skins/larry/images/quota.png
index 3ec26a739..61c1d414e 100644
--- a/skins/larry/images/quota.png
+++ b/skins/larry/images/quota.png
Binary files differ
diff --git a/skins/larry/images/roundcube_logo.png b/skins/larry/images/roundcube_logo.png
index 34b1b6384..d32dea672 100644
--- a/skins/larry/images/roundcube_logo.png
+++ b/skins/larry/images/roundcube_logo.png
Binary files differ
diff --git a/skins/larry/mail.css b/skins/larry/mail.css
index 7eb324254..0f1eaa8a7 100644
--- a/skins/larry/mail.css
+++ b/skins/larry/mail.css
@@ -93,7 +93,7 @@ html>/**/body #messagelist {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ebebeb), color-stop(100%,#c6c6c6));
background: -o-linear-gradient(top, #ebebeb 0%, #c6c6c6 100%);
background: -ms-linear-gradient(top, #ebebeb 0%, #c6c6c6 100%);
- background: linear-gradient(top, #ebebeb 0%, #c6c6c6 100%);
+ background: linear-gradient(to bottom, #ebebeb 0%, #c6c6c6 100%);
border-radius: 0 0 4px 4px;
white-space: nowrap;
}
@@ -169,7 +169,7 @@ html.mozilla #mailboxlist > li:first-child {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#82acb5), color-stop(100%,#6a939f));
background: -o-linear-gradient(top, #82acb5 0%, #6a939f 100%);
background: -ms-linear-gradient(top, #82acb5 0%, #6a939f 100%);
- background: linear-gradient(top, #82acb5 0%, #6a939f 100%);
+ background: linear-gradient(to bottom, #82acb5 0%, #6a939f 100%);
box-shadow: inset 0 1px 1px 0 #536d72;
-webkit-box-shadow: inset 0 1px 1px 0 #536d72;
border-radius: 9px;
@@ -185,7 +185,7 @@ html.mozilla #mailboxlist > li:first-child {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#005d76), color-stop(100%,#004558));
background: -o-linear-gradient(top, #005d76 0%, #004558 100%);
background: -ms-linear-gradient(top, #005d76 0%, #004558 100%);
- background: linear-gradient(top, #005d76 0%, #004558 100%);
+ background: linear-gradient(to bottom, #005d76 0%, #004558 100%);
box-shadow: inset 0 1px 1px 0 #003645;
-webkit-box-shadow: inset 0 1px 1px 0 #003645;
}
@@ -196,7 +196,7 @@ html.mozilla #mailboxlist > li:first-child {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#017cb4), color-stop(100%,#006ca4));
background: -o-linear-gradient(top, #017cb4 0%, #006ca4 100%);
background: -ms-linear-gradient(top, #017cb4 0%, #006ca4 100%);
- background: linear-gradient(top, #017cb4 0%, #006ca4 100%);
+ background: linear-gradient(to bottom, #017cb4 0%, #006ca4 100%);
box-shadow: inset 0 1px 1px 0 #005080;
-webkit-box-shadow: inset 0 1px 1px 0 #005080;
}
@@ -591,7 +591,7 @@ table.messagelist.fixedcopy {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fff), color-stop(100%,#f0f0f0));
background: -o-linear-gradient(top, #fff 0%, #f0f0f0 100%);
background: -ms-linear-gradient(top, #fff 0%, #f0f0f0 100%);
- background: linear-gradient(top, #fff 0%, #f0f0f0 100%);
+ background: linear-gradient(to bottom, #fff 0%, #f0f0f0 100%);
border-bottom: 1px solid #dfdfdf;
}
@@ -857,7 +857,6 @@ div.hide-headers {
#messagecontent .leftcol,
#messagepreview .leftcol {
margin-right: 252px;
- overflow-x: auto;
}
#messagecontent .rightcol,
@@ -1384,4 +1383,3 @@ div.message-partheaders .headers-table td.header {
#uploadform form div {
margin: 4px 0;
}
-
diff --git a/skins/larry/print.css b/skins/larry/print.css
index 22d6c5288..d3a6cd802 100644
--- a/skins/larry/print.css
+++ b/skins/larry/print.css
@@ -15,7 +15,7 @@ body {
margin: 2mm;
}
-body, td, th, span, div, p {
+body, td, th, div, p {
font-size: 9pt;
color: #000;
}
diff --git a/skins/larry/styles.css b/skins/larry/styles.css
index 1e4035070..0cb11dafd 100644
--- a/skins/larry/styles.css
+++ b/skins/larry/styles.css
@@ -114,7 +114,7 @@ input.button {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f9f9f9), color-stop(100%,#e6e6e6));
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%);
+ background: linear-gradient(to bottom, #f9f9f9 0%, #e6e6e6 100%);
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);
text-decoration: none;
@@ -133,7 +133,7 @@ input.button {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7b7b7b), color-stop(100%,#606060)); /* Chrome,Safari4+ */
background: -o-linear-gradient(top, #7b7b7b 0%, #606060 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, #7b7b7b 0%, #606060 100%); /* IE10+ */
- background: linear-gradient(top, #7b7b7b 0%, #606060 100%); /* W3C */
+ background: linear-gradient(to bottom, #7b7b7b 0%, #606060 100%); /* W3C */
box-shadow: 0 1px 1px 0 #ccc, inset 0 1px 0 0 #888;
-webkit-box-shadow: 0 1px 1px 0 #ccc, inset 0 1px 0 0 #888;
}
@@ -154,7 +154,7 @@ input.button.mainaction:focus {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#5c5c5c), color-stop(100%,#7b7b7b));
background: -o-linear-gradient(top, #5c5c5c 0%, #7b7b7b 100%);
background: -ms-linear-gradient(top, #5c5c5c 0%, #7b7b7b 100%);
- background: linear-gradient(top, #5c5c5c 0%, #7b7b7b 100%);
+ background: linear-gradient(to bottom, #5c5c5c 0%, #7b7b7b 100%);
}
input.button.mainaction {
@@ -166,7 +166,7 @@ input.button.mainaction {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#505050), color-stop(100%,#2a2e31));
background: -o-linear-gradient(top, #505050 0%, #2a2e31 100%);
background: -ms-linear-gradient(top, #505050 0%, #2a2e31 100%);
- background: linear-gradient(top, #505050 0%, #2a2e31 100%);
+ background: linear-gradient(to bottom, #505050 0%, #2a2e31 100%);
box-shadow: inset 0 1px 0 0 #777;
-webkit-box-shadow: inset 0 1px 0 0 #777;
}
@@ -178,7 +178,7 @@ input.button.mainaction:active {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#2a2e31), color-stop(100%,#505050));
background: -o-linear-gradient(top, #2a2e31 0%, #505050 100%);
background: -ms-linear-gradient(top, #2a2e31 0%, #505050 100%);
- background: linear-gradient(top, #2a2e31 0%, #505050 100%);
+ background: linear-gradient(to bottom, #2a2e31 0%, #505050 100%);
}
input.button[disabled],
@@ -207,7 +207,7 @@ a.button,
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f9f9f9), color-stop(100%,#e6e6e6));
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%);
+ background: linear-gradient(to bottom, #f9f9f9 0%, #e6e6e6 100%);
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);
text-decoration: none;
@@ -275,7 +275,7 @@ input.button:active {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#e6e6e6), color-stop(100%,#f9f9f9));
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%);
+ background: linear-gradient(to bottom, #e6e6e6 0%, #f9f9f9 100%);
}
.pagenav.dark a.button {
@@ -286,7 +286,7 @@ input.button:active {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#d8d8d8), color-stop(100%,#bababa));
background: -o-linear-gradient(top, #d8d8d8 0%, #bababa 100%);
background: -ms-linear-gradient(top, #d8d8d8 0%, #bababa 100%);
- background: linear-gradient(top, #d8d8d8 0%, #bababa 100%);
+ background: linear-gradient(to bottom, #d8d8d8 0%, #bababa 100%);
box-shadow: 0 1px 1px 0 #999;
-webkit-box-shadow: 0 1px 1px 0 #999;
}
@@ -297,7 +297,7 @@ input.button:active {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#bababa), color-stop(100%,#d8d8d8));
background: -o-linear-gradient(top, #bababa 0%, #d8d8d8 100%);
background: -ms-linear-gradient(top, #bababa 0%, #d8d8d8 100%);
- background: linear-gradient(top, #bababa 0%, #d8d8d8 100%);
+ background: linear-gradient(to bottom, #bababa 0%, #d8d8d8 100%);
}
.buttongroup a.button.selected,
@@ -307,7 +307,7 @@ input.button:active {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#909090), color-stop(100%,#858585));
background: -o-linear-gradient(top, #909090 0%, #858585 100%);
background: -ms-linear-gradient(top, #909090 0%, #858585 100%);
- background: linear-gradient(top, #909090 0%, #858585 100%);
+ background: linear-gradient(to bottom, #909090 0%, #858585 100%);
box-shadow: inset 0 1px 2px 0 #555;
-webkit-box-shadow: inset 0 1px 2px 0 #555;
border-right-color: #555;
@@ -321,7 +321,7 @@ input.button:active {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0,#49b3d2), color-stop(100%,#66bcd9));
background: -o-linear-gradient(top, #49b3d2 0, #66bcd9 100%);
background: -ms-linear-gradient(top, #49b3d2 0, #66bcd9 100%);
- background: linear-gradient(top, #49b3d2 0, #66bcd9 100%);
+ background: linear-gradient(to bottom, #49b3d2 0, #66bcd9 100%);
}
.pagenav a.button {
@@ -589,7 +589,7 @@ a.iconlink.upload {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#eaeaea), color-stop(100%,#c8c8c8));
background: -o-linear-gradient(top, #eaeaea 0%, #c8c8c8 100%);
background: -ms-linear-gradient(top, #eaeaea 0%, #c8c8c8 100%);
- background: linear-gradient(top, #eaeaea 0%, #c8c8c8 100%);
+ background: linear-gradient(to bottom, #eaeaea 0%, #c8c8c8 100%);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
@@ -724,7 +724,7 @@ a.iconlink.upload {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#e3e3e3), color-stop(100%,#cfcfcf));
background: -o-linear-gradient(top, #e3e3e3 0%, #cfcfcf 100%);
background: -ms-linear-gradient(top, #e3e3e3 0%, #cfcfcf 100%);
- background: linear-gradient(top, #e3e3e3 0%, #cfcfcf 100%);
+ background: linear-gradient(to bottom, #e3e3e3 0%, #cfcfcf 100%);
}
.ui-dialog.popupmessage .ui-widget-content {
@@ -734,7 +734,7 @@ a.iconlink.upload {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#eee), color-stop(100%,#dcdcdc));
background: -o-linear-gradient(top, #eee 0%, #dcdcdc 100%);
background: -ms-linear-gradient(top, #eee 0%, #dcdcdc 100%);
- background: linear-gradient(top, #eee 0%, #dcdcdc 100%);
+ background: linear-gradient(to bottom, #eee 0%, #dcdcdc 100%);
}
@@ -763,7 +763,7 @@ a.iconlink.upload {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#404040), color-stop(100%,#060606));
background: -o-linear-gradient(top, #404040 0%, #060606 100%);
background: -ms-linear-gradient(top, #404040 0%, #060606 100%);
- background: linear-gradient(top, #404040 0%, #060606 100%);
+ background: linear-gradient(to bottom, #404040 0%, #060606 100%);
}
#topline a,
@@ -906,7 +906,7 @@ a.iconlink.upload {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#444), color-stop(100%,#333));
background: -o-linear-gradient(top, #444 0%, #333 100%);
background: -ms-linear-gradient(top, #444 0%, #333 100%);
- background: linear-gradient(top, #444 0%, #333 100%);
+ background: linear-gradient(to bottom, #444 0%, #333 100%);
color: #eee;
font-weight: bold;
white-space: nowrap;
@@ -1601,7 +1601,7 @@ table.records-table {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#019bc6), color-stop(100%,#017cb4));
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%);
+ background: linear-gradient(to bottom, #019bc6 0%, #017cb4 100%);
}
.records-table tr.selected td a,
@@ -1648,7 +1648,7 @@ body.iframe .boxtitle {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#eee), color-stop(100%,#dfdfdf));
background: -o-linear-gradient(top, #eee 0%, #dfdfdf 100%);
background: -ms-linear-gradient(top, #eee 0%, #dfdfdf 100%);
- background: linear-gradient(top, #eee 0%, #dfdfdf 100%);
+ background: linear-gradient(to bottom, #eee 0%, #dfdfdf 100%);
border-bottom: 1px solid #ccc;
}
@@ -1851,7 +1851,7 @@ ul.proplist li {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f9f9f9), color-stop(100%,#e2e2e2));
background: -o-linear-gradient(top, #f9f9f9 0%, #e2e2e2 100%);
background: -ms-linear-gradient(top, #f9f9f9 0%, #e2e2e2 100%);
- background: linear-gradient(top, #f9f9f9 0%, #e2e2e2 100%);
+ background: linear-gradient(to bottom, #f9f9f9 0%, #e2e2e2 100%);
box-shadow: inset 0 1px 0 0 #fff;
-webkit-box-shadow: inset 0 1px 0 0 #fff;
}
@@ -1868,7 +1868,7 @@ ul.proplist li {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dcdcdc), color-stop(100%,#f9f9f9));
background: -o-linear-gradient(top, #dcdcdc 0%, #f9f9f9 100%);
background: -ms-linear-gradient(top, #dcdcdc 0%, #f9f9f9 100%);
- background: linear-gradient(top, #dcdcdc 0%, #f9f9f9 100%);
+ background: linear-gradient(to bottom, #dcdcdc 0%, #f9f9f9 100%);
}
#login-form form table {
@@ -2162,7 +2162,7 @@ a.menuselector {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd));
background: -o-linear-gradient(top, #f8f8f8 0%, #dddddd 100%);
background: -ms-linear-gradient(top, #f9f9f9 0%, #dddddd 100%);
- background: linear-gradient(top, #f8f8f8 0%, #dddddd 100%);
+ background: linear-gradient(to bottom, #f8f8f8 0%, #dddddd 100%);
text-decoration: none;
color: #333;
cursor: pointer;
@@ -2185,7 +2185,7 @@ a.menuselector:active {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dddddd), color-stop(100%,#f8f8f8));
background: -o-linear-gradient(top, #dddddd 0%, #f8f8f8 100%);
background: -ms-linear-gradient(top, #dddddd 0%, #f8f8f8 100%);
- background: linear-gradient(top, #dddddd 0%, #f8f8f8 100%);
+ background: linear-gradient(to bottom, #dddddd 0%, #f8f8f8 100%);
text-decoration: none;
}
@@ -2351,7 +2351,7 @@ select.decorated option[selected='selected'] {
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#00aad6), color-stop(100%,#008fc9));
background: -o-linear-gradient(top, #00aad6 0%, #008fc9 100%);
background: -ms-linear-gradient(top, #00aad6 0%, #008fc9 100%);
- background: linear-gradient(top, #00aad6 0%, #008fc9 100%);
+ background: linear-gradient(to bottom, #00aad6 0%, #008fc9 100%);
outline: none;
}
diff --git a/skins/larry/thumbnail.png b/skins/larry/thumbnail.png
index 1cd23ad3e..ab1fb0782 100644
--- a/skins/larry/thumbnail.png
+++ b/skins/larry/thumbnail.png
Binary files differ
diff --git a/tests/Framework/VCard.php b/tests/Framework/VCard.php
index c23dba844..6eea2c1a4 100644
--- a/tests/Framework/VCard.php
+++ b/tests/Framework/VCard.php
@@ -10,7 +10,7 @@ class Framework_VCard extends PHPUnit_Framework_TestCase
function _srcpath($fn)
{
- return realpath(dirname(__FILE__) . '/../src/' . $fn);
+ return realpath(__DIR__ . '/../src/' . $fn);
}
function test_parse_one()
diff --git a/tests/Selenium/bootstrap.php b/tests/Selenium/bootstrap.php
index ed9c2eb32..124a81ef2 100644
--- a/tests/Selenium/bootstrap.php
+++ b/tests/Selenium/bootstrap.php
@@ -22,9 +22,9 @@
if (php_sapi_name() != 'cli')
die("Not in shell mode (php-cli)");
-if (!defined('INSTALL_PATH')) define('INSTALL_PATH', realpath(dirname(__FILE__) . '/../../') . '/' );
+if (!defined('INSTALL_PATH')) define('INSTALL_PATH', realpath(__DIR__ . '/../../') . '/' );
-define('TESTS_DIR', dirname(__FILE__) . '/');
+define('TESTS_DIR', __DIR__ . '/');
if (@is_dir(TESTS_DIR . 'config')) {
define('RCUBE_CONFIG_DIR', TESTS_DIR . 'config');
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index 192997d0d..bf7199c1e 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -22,9 +22,9 @@
if (php_sapi_name() != 'cli')
die("Not in shell mode (php-cli)");
-if (!defined('INSTALL_PATH')) define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+if (!defined('INSTALL_PATH')) define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
-define('TESTS_DIR', dirname(__FILE__) . '/');
+define('TESTS_DIR', __DIR__ . '/');
if (@is_dir(TESTS_DIR . 'config')) {
define('RCUBE_CONFIG_DIR', TESTS_DIR . 'config');