diff options
100 files changed, 589 insertions, 167 deletions
@@ -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 / @@ -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) @@ -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) { @@ -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; @@ -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 Binary files differindex fe88ed4c9..e815e5444 100644 --- a/plugins/help/skins/larry/help.png +++ b/plugins/help/skins/larry/help.png 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 Binary files differindex d441f75eb..d441f75eb 100755..100644 --- a/plugins/jqueryui/themes/larry/images/animated-overlay.gif +++ b/plugins/jqueryui/themes/larry/images/animated-overlay.gif diff --git a/plugins/jqueryui/themes/larry/images/ui-dialog-close.png b/plugins/jqueryui/themes/larry/images/ui-dialog-close.png Binary files differindex 3fc403f52..bc2e244ac 100644 --- a/plugins/jqueryui/themes/larry/images/ui-dialog-close.png +++ b/plugins/jqueryui/themes/larry/images/ui-dialog-close.png diff --git a/plugins/jqueryui/themes/larry/images/ui-icons-datepicker.png b/plugins/jqueryui/themes/larry/images/ui-icons-datepicker.png Binary files differindex 144ecfe77..77ebd0c5c 100644 --- a/plugins/jqueryui/themes/larry/images/ui-icons-datepicker.png +++ b/plugins/jqueryui/themes/larry/images/ui-icons-datepicker.png diff --git a/plugins/jqueryui/themes/larry/images/ui-icons_004458_256x240.png b/plugins/jqueryui/themes/larry/images/ui-icons_004458_256x240.png Binary files differindex 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 diff --git a/plugins/jqueryui/themes/larry/images/ui-icons_d7211e_256x240.png b/plugins/jqueryui/themes/larry/images/ui-icons_d7211e_256x240.png Binary files differindex 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 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 Binary files differindex 21298ab59..713ac169a 100644 --- a/skins/larry/images/buttons.png +++ b/skins/larry/images/buttons.png diff --git a/skins/larry/images/contactgroup.png b/skins/larry/images/contactgroup.png Binary files differindex 8303cf02f..6c5c736ec 100644 --- a/skins/larry/images/contactgroup.png +++ b/skins/larry/images/contactgroup.png diff --git a/skins/larry/images/contactpic_32px.png b/skins/larry/images/contactpic_32px.png Binary files differindex 358984ecc..d133233d0 100644 --- a/skins/larry/images/contactpic_32px.png +++ b/skins/larry/images/contactpic_32px.png diff --git a/skins/larry/images/filedrop.png b/skins/larry/images/filedrop.png Binary files differindex d4d455bdf..9c1aebeb9 100644 --- a/skins/larry/images/filedrop.png +++ b/skins/larry/images/filedrop.png diff --git a/skins/larry/images/filetypes.png b/skins/larry/images/filetypes.png Binary files differindex 09772660b..35c97d04e 100644 --- a/skins/larry/images/filetypes.png +++ b/skins/larry/images/filetypes.png diff --git a/skins/larry/images/listicons.png b/skins/larry/images/listicons.png Binary files differindex 6a5edfdb1..56e6fbc70 100644 --- a/skins/larry/images/listicons.png +++ b/skins/larry/images/listicons.png diff --git a/skins/larry/images/login_shadow.png b/skins/larry/images/login_shadow.png Binary files differindex 3edc46722..cd7e8bdc3 100644 --- a/skins/larry/images/login_shadow.png +++ b/skins/larry/images/login_shadow.png diff --git a/skins/larry/images/messages.png b/skins/larry/images/messages.png Binary files differindex ecfff1285..d5c8c6146 100644 --- a/skins/larry/images/messages.png +++ b/skins/larry/images/messages.png diff --git a/skins/larry/images/messages_dark.png b/skins/larry/images/messages_dark.png Binary files differindex d7c932502..e0bed1bb3 100644 --- a/skins/larry/images/messages_dark.png +++ b/skins/larry/images/messages_dark.png diff --git a/skins/larry/images/overflowshadow.png b/skins/larry/images/overflowshadow.png Binary files differindex 5728a2167..ceec94f2f 100644 --- a/skins/larry/images/overflowshadow.png +++ b/skins/larry/images/overflowshadow.png diff --git a/skins/larry/images/quota.png b/skins/larry/images/quota.png Binary files differindex 3ec26a739..61c1d414e 100644 --- a/skins/larry/images/quota.png +++ b/skins/larry/images/quota.png diff --git a/skins/larry/images/roundcube_logo.png b/skins/larry/images/roundcube_logo.png Binary files differindex 34b1b6384..d32dea672 100644 --- a/skins/larry/images/roundcube_logo.png +++ b/skins/larry/images/roundcube_logo.png 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 Binary files differindex 1cd23ad3e..ab1fb0782 100644 --- a/skins/larry/thumbnail.png +++ b/skins/larry/thumbnail.png 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'); |