Projects
Kolab:3.4
roundcubemail
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 95
View file
roundcubemail.spec
Changed
@@ -51,15 +51,13 @@ License: GPLv2 URL: http://www.roundcube.net +# From 366ffd7aa05748d27d0bf778131ffae4b13840b6 Source0: roundcubemail-%{version}.tar.gz Source1: comm.py Source20: roundcubemail.conf Source21: roundcubemail.logrotate -Patch0001: 0001-Allow-the-timeout-and-retry-interval-for-memcached-s.patch -Patch0002: 0002-Describe-memcache-connection-configuration-options-i.patch - Patch201: ticket-466-changes.patch Patch202: default-configuration.patch @@ -1239,8 +1237,6 @@ %setup -q -c "%{name}-%{version}" pushd %{name}-%{version} -%patch0001 -p1 -%patch0002 -p1 %patch201 -p1 %patch202 -p1 @@ -2993,6 +2989,9 @@ %defattr(-,root,root,-) %changelog +* Mon Feb 23 2015 Jeroen van Meeuwen <vanmeeuwen@kolabsys.com> - 1.1.0-2 +- Repack of 1.1 release branch at 366ffd7a + * Sun Feb 15 2015 Daniel Hoffend <dh@dotlan.net> - - 1.1.0-2 - Remove odfviewer configuration in roundcubemail.conf
View file
0001-Allow-the-timeout-and-retry-interval-for-memcached-s.patch
Deleted
@@ -1,38 +0,0 @@ -From c3e441044d07cb89c12fb52b6adc02c4ca4ad2cc Mon Sep 17 00:00:00 2001 -From: "Jeroen van Meeuwen (Kolab Systems)" <vanmeeuwen@kolabsys.com> -Date: Wed, 11 Feb 2015 15:24:49 +0100 -Subject: [PATCH 1/2] Allow the timeout and retry interval for memcached - servers to be configured - ---- - program/lib/Roundcube/rcube.php | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php -index 819c7f8..3aca888 100644 ---- a/program/lib/Roundcube/rcube.php -+++ b/program/lib/Roundcube/rcube.php -@@ -215,7 +215,10 @@ class rcube - $this->mc_available = 0; - - // add all configured hosts to pool -- $pconnect = $this->config->get('memcache_pconnect', true); -+ $pconnect = $this->config->get('memcache_pconnect', true); -+ $timeout = $this->config->get('memcache_timeout', 1); -+ $retry_interval = $this->config->get('memcache_retry_interval', 15); -+ - foreach ($this->config->get('memcache_hosts', array()) as $host) { - if (substr($host, 0, 7) != 'unix://') { - list($host, $port) = explode(':', $host); -@@ -226,7 +229,7 @@ class rcube - } - - $this->mc_available += intval($this->memcache->addServer( -- $host, $port, $pconnect, 1, 1, 15, false, array($this, 'memcache_failure'))); -+ $host, $port, $pconnect, 1, $timeout, $retry_interval, false, array($this, 'memcache_failure'))); - } - - // test connection and failover (will result in $this->mc_available == 0 on complete failure) --- -2.1.0 -
View file
0002-Describe-memcache-connection-configuration-options-i.patch
Deleted
@@ -1,37 +0,0 @@ -From de3fc1afafd0830bf03fbc58022398f7fe6cf525 Mon Sep 17 00:00:00 2001 -From: Thomas Bruederli <bruederli@kolabsys.com> -Date: Wed, 11 Feb 2015 21:37:23 +0100 -Subject: [PATCH 2/2] Describe memcache connection configuration options in - defaults - ---- - config/defaults.inc.php | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - -diff --git a/config/defaults.inc.php b/config/defaults.inc.php -index 5a5bffb..06ea9ec 100644 ---- a/config/defaults.inc.php -+++ b/config/defaults.inc.php -@@ -384,6 +384,19 @@ $config['session_storage'] = 'db'; - // Define any number of hosts in the form of hostname:port or unix:///path/to/socket.file - $config['memcache_hosts'] = null; // e.g. array( 'localhost:11211', '192.168.1.12:11211', 'unix:///var/tmp/memcached.sock' ); - -+// Controls the use of a persistent connections to memcache servers -+// See http://php.net/manual/en/memcache.addserver.php -+$config['memcache_pconnect'] = true; -+ -+// Value in seconds which will be used for connecting to the daemon -+// See http://php.net/manual/en/memcache.addserver.php -+$config['memcache_timeout'] = 1; -+ -+// Controls how often a failed server will be retried (value in seconds). -+// Setting this parameter to -1 disables automatic retry. -+// See http://php.net/manual/en/memcache.addserver.php -+$config['memcache_retry_interval'] = 15; -+ - // check client IP in session authorization - $config['ip_check'] = false; - --- -2.1.0 -
View file
debian.changelog
Changed
@@ -1,3 +1,9 @@ +roundcubemail (1:1.1.0-0~kolab4) unstable; urgency=low + + * Repack of 1.1.0 at 366ffd7aa05748d27d0bf778131ffae4b13840b6 + + -- Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Mon, 23 Feb 2015 07:14:39 +0200 + roundcubemail (1:1.1.0-0~kolab3) unstable; urgency=low * Added php-net-sieve dependency
View file
debian.series
Changed
@@ -1,4 +1,2 @@ default-configuration.patch -p1 ticket-466-changes.patch -p1 -0001-Allow-the-timeout-and-retry-interval-for-memcached-s.patch -p1 -0002-Describe-memcache-connection-configuration-options-i.patch -p1
View file
roundcubemail-1.1.0.tar.gz/CHANGELOG
Changed
@@ -1,6 +1,18 @@ CHANGELOG Roundcube Webmail =========================== +- Add possibility to print contact information (of a single contact) +- Fix refreshing of drafts list when sending a message which was saved in meantime (#1490238) +- Fix saving/sending emoticon images when assets_dir is set +- Fix PHP fatal error when visiting Vacation interface and there's no sieve script yet +- Fix setting max packet size for DB caches and check packet size also in shared cache +- Fix needless security warning on BMP attachments display (#1490282) +- Fix handling of some improper constructs in format=flowed text as per the RFC3676[4.5] (#1490284) +- Fix performance of rcube_db_mysql::get_variable() +- Fix missing or not up-to-date CATEGORIES entry in vCard export (#1490277) +- Fix fatal errors on systems without mbstring extension or mb_regex_encoding() function (#1490280) +- Fix cursor position on reply below the quote in HTML mode (#1490263) + RELEASE 1.1.0 ------------- - Make SMTP error log more verbose - include server response and error code
View file
roundcubemail-1.1.0.tar.gz/UPGRADING
Changed
@@ -41,15 +41,22 @@ ./skins/ ./plugins/ ./vendor/ -4. Run `./bin/update.sh` from the commandline OR +4a. If you previously installed plugins through composer, update dependencies + by running `php composer.phar update --no-dev` +4b. Install/update dependencies using composer: + - get composer from https://getcomposer.org/download/ + - rename the composer.json-dist file into composer.json + - if you want to use LDAP address books, enable the LDAP libraries in your + composer.json file by moving the items from "suggest" to the "require" + section (remove the explanation texts after the version!). + - run `php composer.phar install --no-dev` +5. Run `./bin/update.sh` from the commandline OR open http://url-to-roundcube/installer/ in a browser and choose "3 Test config". To enable the latter one, you have to temporary set 'enable_installer' to true in your local config/config.inc.php file. WARNING: See SQLite database upgrade below. -5. Let the update script/installer check your configuration and +6. Let the update script/installer check your configuration and update your config files and database schema as suggested by the updater. -5. If you previously installed plugins through composer, update dependencies - by running `php composer.phar update --no-dev` 7. Make sure 'enable_installer' is set to false again. 8. See Post-Upgrade Activities section.
View file
roundcubemail-1.1.0.tar.gz/config/defaults.inc.php
Changed
@@ -384,6 +384,19 @@ // Define any number of hosts in the form of hostname:port or unix:///path/to/socket.file $config['memcache_hosts'] = null; // e.g. array( 'localhost:11211', '192.168.1.12:11211', 'unix:///var/tmp/memcached.sock' ); +// Controls the use of a persistent connections to memcache servers +// See http://php.net/manual/en/memcache.addserver.php +$config['memcache_pconnect'] = true; + +// Value in seconds which will be used for connecting to the daemon +// See http://php.net/manual/en/memcache.addserver.php +$config['memcache_timeout'] = 1; + +// Controls how often a failed server will be retried (value in seconds). +// Setting this parameter to -1 disables automatic retry. +// See http://php.net/manual/en/memcache.addserver.php +$config['memcache_retry_interval'] = 15; + // check client IP in session authorization $config['ip_check'] = false;
View file
roundcubemail-1.1.0.tar.gz/plugins/acl/acl.php
Changed
@@ -123,7 +123,7 @@ $group_id = is_array($record[$group_field]) ? $record[$group_field][0] : $record[$group_field]; if ($group) { - $users[] = array('name' => ($prefix ? $prefix : '') . $group_id, 'display' => $group); + $users[] = array('name' => ($prefix ? $prefix : '') . $group_id, 'display' => $group, 'type' => 'group'); $keys[] = $group; } }
View file
roundcubemail-1.1.0.tar.gz/plugins/help/help.php
Changed
@@ -82,8 +82,14 @@ function tablink($attrib) { $rcmail = rcmail::get_instance(); + $attrib['name'] = 'helplink' . $attrib['action']; $attrib['href'] = $rcmail->url(array('_action' => $attrib['action'], '_extwin' => !empty($_REQUEST['_extwin']) ? 1 : null)); + + // title might be already translated here, so revert to it's initial value + // so button() will translate it correctly + $attrib['title'] = $attrib['label']; + return $rcmail->output->button($attrib); }
View file
roundcubemail-1.1.0.tar.gz/plugins/managesieve/Changelog
Changed
@@ -1,3 +1,5 @@ +- Fix PHP fatal error when visiting Vacation interface and there's no sieve script yet + * version 8.2 [2015-01-14] ----------------------------------------------------------- - Fix bug where actions without if/elseif/else in sieve scripts were skipped
View file
roundcubemail-1.1.0.tar.gz/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
Changed
@@ -2344,12 +2344,12 @@ */ protected function init_script() { - $this->script = $this->sieve->script->as_array(); - - if (!$this->script) { + if (!$this->sieve->script) { return; } + $this->script = $this->sieve->script->as_array(); + $headers = array(); $exceptions = array('date', 'currentdate', 'size', 'body');
View file
roundcubemail-1.1.0.tar.gz/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php
Changed
@@ -562,62 +562,74 @@ $this->script_name = 'roundcube'; } - $this->script = array($rule); - $script_active = false; + // use default script contents + if (!$this->rc->config->get('managesieve_kolab_master')) { + $script_file = $this->rc->config->get('managesieve_default'); + if ($script_file && is_readable($script_file)) { + $content = file_get_contents($script_file); + } + } + + // create and load script + if ($this->sieve->save_script($this->script_name, $content)) { + $this->sieve->load($this->script_name); + } } - // if script exists - else { - $script_active = in_array($this->script_name, $this->active); - // re-order rules if needed - if (isset($rule['after']) && $rule['after'] !== '') { - // reset original vacation rule - if (isset($this->vacation['idx'])) { - $this->script[$this->vacation['idx']] = null; - } + $script_active = in_array($this->script_name, $this->active); - // add at target position - if ($rule['after'] >= count($this->script) - 1) { - $this->script[] = $rule; - } - else { - $script = array(); + // re-order rules if needed + if (isset($rule['after']) && $rule['after'] !== '') { + // reset original vacation rule + if (isset($this->vacation['idx'])) { + $this->script[$this->vacation['idx']] = null; + } - foreach ($this->script as $idx => $r) { - if ($r) { - $script[] = $r; - } + // add at target position + if ($rule['after'] >= count($this->script) - 1) { + $this->script[] = $rule; + } + else { + $script = array(); - if ($idx == $rule['after']) { - $script[] = $rule; - } + foreach ($this->script as $idx => $r) { + if ($r) { + $script[] = $r; } - $this->script = $script; + if ($idx == $rule['after']) { + $script[] = $rule; + } } - $this->script = array_values(array_filter($this->script)); - } - // update original vacation rule if it exists - else if (isset($this->vacation['idx'])) { - $this->script[$this->vacation['idx']] = $rule; - } - // otherwise put vacation rule on top - else { - array_unshift($this->script, $rule); + $this->script = $script; } - // if the script was not active, we need to de-activate - // all rules except the vacation rule, but only if it is not disabled - if (!$script_active && !$rule['disabled']) { - foreach ($this->script as $idx => $r) { - if (empty($r['actions']) || $r['actions'][0]['type'] != 'vacation') { - $this->script[$idx]['disabled'] = true; - } + $this->script = array_values(array_filter($this->script)); + } + // update original vacation rule if it exists + else if (isset($this->vacation['idx'])) { + $this->script[$this->vacation['idx']] = $rule; + } + // otherwise put vacation rule on top + else { + array_unshift($this->script, $rule); + } + + // if the script was not active, we need to de-activate + // all rules except the vacation rule, but only if it is not disabled + if (!$script_active && !$rule['disabled']) { + foreach ($this->script as $idx => $r) { + if (empty($r['actions']) || $r['actions'][0]['type'] != 'vacation') { + $this->script[$idx]['disabled'] = true; } } } + if (!$this->sieve->script) { + return false; + } + $this->sieve->script->content = $this->script; // save the script
View file
roundcubemail-1.1.0.tar.gz/program/include/iniset.php
Changed
@@ -68,11 +68,14 @@ // backward compatybility (to be removed) require_once INSTALL_PATH . 'program/include/bc.php'; -// load the UTF-8 portablity layer from Patchwork -if (!function_exists('iconv') || !function_exists('utf8_encode') || !extension_loaded('mbstring')) { - \Patchwork\Utf8\Bootup::initAll(); +// load the UTF-8 portability layers from Patchwork +// don't load mbstring layer as it conflicts with Roundcube Framework (#1490280) +if (!function_exists('iconv')) { + \Patchwork\Utf8\Bootup::initIconv(); +} +if (!function_exists('utf8_encode')) { + \Patchwork\Utf8\Bootup::initUtf8Encode(); } - /** * PHP5 autoloader routine for dynamic class loading
View file
roundcubemail-1.1.0.tar.gz/program/js/app.js
Changed
@@ -326,10 +326,7 @@ this.enable_command('download', 'print', true); // show printing dialog else if (this.env.action == 'print' && this.env.uid) { - if (bw.safari) - setTimeout('window.print()', 10); - else - window.print(); + this.print_dialog(); } // get unread count for each mailbox @@ -440,6 +437,9 @@ if (this.env.action == 'add' || this.env.action == 'edit' || this.env.action == 'search') this.init_contact_form(); } + else if (this.env.action == 'print') { + this.print_dialog(); + } break; @@ -1176,7 +1176,15 @@ break; case 'print': - if (this.env.action == 'get') { + if (this.task == 'addressbook') { + if (uid = this.contact_list.get_single_selection()) { + url = '&_action=print&_cid=' + uid; + if (this.env.source) + url += '&_source=' + urlencode(this.env.source); + this.open_window(this.env.comm_path + url, true, true); + } + } + else if (this.env.action == 'get') { this.gui_objects.messagepartframe.contentWindow.print(); } else if (uid = this.get_single_uid()) { @@ -4721,6 +4729,7 @@ clearTimeout(this.preview_timer); var n, id, sid, contact, writable = false, + selected = list.selection.length, source = this.env.source ? this.env.address_sources[this.env.source] : null; // we don't have dblclick handler here, so use 200 instead of this.dblclick_time @@ -4729,7 +4738,7 @@ else if (this.env.contentframe) this.show_contentframe(false); - if (list.selection.length) { + if (selected) { list.draggable = false; // no source = search result, we'll need to detect if any of @@ -4764,11 +4773,12 @@ // if a group is currently selected, and there is at least one contact selected // thend we can enable the group-remove-selected command - this.enable_command('group-remove-selected', this.env.group && list.selection.length > 0 && writable); - this.enable_command('compose', this.env.group || list.selection.length > 0); - this.enable_command('export-selected', 'copy', list.selection.length > 0); + this.enable_command('group-remove-selected', this.env.group && selected && writable); + this.enable_command('compose', this.env.group || selected); + this.enable_command('print', selected == 1); + this.enable_command('export-selected', 'copy', selected > 0); this.enable_command('edit', id && writable); - this.enable_command('delete', 'move', list.selection.length > 0 && writable); + this.enable_command('delete', 'move', selected && writable); return false; }; @@ -4881,8 +4891,8 @@ this.contact_list.data = {}; this.contact_list.clear(true); this.show_contentframe(false); - this.enable_command('delete', 'move', 'copy', false); - this.enable_command('compose', this.env.group ? true : false); + this.enable_command('delete', 'move', 'copy', 'print', false); + this.enable_command('compose', this.env.group); }; this.set_group_prop = function(prop) @@ -4922,7 +4932,7 @@ this.contact_list.clear_selection(); this.enable_command('compose', rec && rec.email); - this.enable_command('export-selected', rec && rec._type != 'group'); + this.enable_command('export-selected', 'print', rec && rec._type != 'group'); } else if (framed) return false; @@ -7365,7 +7375,7 @@ this.enable_command('compose', (uid && this.contact_list.rows[uid])); this.enable_command('delete', 'edit', writable); this.enable_command('export', (this.contact_list && this.contact_list.rowcount > 0)); - this.enable_command('export-selected', false); + this.enable_command('export-selected', 'print', false); } case 'move': @@ -8198,6 +8208,14 @@ return false; } }; + + this.print_dialog = function() + { + if (bw.safari) + setTimeout('window.print()', 10); + else + window.print(); + }; } // end object rcube_webmail
View file
roundcubemail-1.1.0.tar.gz/program/js/editor.js
Changed
@@ -153,14 +153,17 @@ window.setTimeout(function() { window.focus(); // for WebKit (#1486674) fe.focus(); + rcmail.env.compose_focus_elem = null; }, 10); } } - // set tabIndex and set focus to element that was focused before - this.tabindex(fe && fe.id == this.id); - // Trigger resize (needed for proper editor resizing in some browsers) - window.setTimeout(function() { $(window).resize(); }, 100); + window.setTimeout(function() { + // set tabIndex and set focus to element that was focused before + ref.tabindex(fe && fe.id == ref.id); + // Trigger resize (needed for proper editor resizing in some browsers) + $(window).resize(); + }, 100); }; // set tabIndex on tinymce editor @@ -168,20 +171,19 @@ { if (rcmail.env.task == 'mail' && this.editor) { var textarea = this.editor.getElement(), + body = this.editor.getBody(), node = this.editor.getContentAreaContainer().childNodes[0]; if (textarea && node) node.tabIndex = textarea.tabIndex; - if (focus) - this.editor.getBody().focus(); // find :prev and :next elements to get focus when tabbing away if (textarea.tabIndex > 0) { var x = null, - editor = this.editor, tabfocus_elements = [':prev',':next'], el = tinymce.DOM.select('*[tabindex='+textarea.tabIndex+']:not(iframe)'); - tinymce.each(el, function(e, i) { if (e.id == editor.id) { x = i; return false; } }); + + tinymce.each(el, function(e, i) { if (e.id == ref.id) { x = i; return false; } }); if (x !== null) { if (el[x-1] && el[x-1].id) { tabfocus_elements[0] = el[x-1].id; @@ -189,9 +191,16 @@ if (el[x+1] && el[x+1].id) { tabfocus_elements[1] = el[x+1].id; } - editor.settings.tabfocus_elements = tabfocus_elements.join(','); + this.editor.settings.tabfocus_elements = tabfocus_elements.join(','); } } + + // ContentEditable reset fixes invisible cursor issue in Firefox < 25 + if (bw.mz && bw.vendver < 25) + $(body).prop('contenteditable', false).prop('contenteditable', true); + + if (focus) + body.focus(); } }; @@ -228,10 +237,13 @@ setTimeout(function() { if (ref.editor) { + var body = $(ref.editor.getBody()); if (rcmail.env.default_font) - $(ref.editor.getBody()).css('font-family', rcmail.env.default_font); + body.css('font-family', rcmail.env.default_font); // #1486593 ref.tabindex(true); + // put cursor on start of the compose body + ref.editor.selection.setCursorLocation(body.children().first().get(0)); } }, 500); }; @@ -271,6 +283,7 @@ data = data.replace(sig_mark, "\n" + signature.text); input.val(data).focus(); + rcmail.set_caret_pos(input.get(0), 0); }; // convert html to text @@ -446,7 +459,7 @@ // change user signature text this.change_signature = function(id, show_sig) { - var cursor_pos, p = -1, + var position_element, cursor_pos, p = -1, input_message = $('#' + this.id), message = input_message.val(), sig = rcmail.env.identity; @@ -461,6 +474,7 @@ if (p >= 0) message = message.substring(0, p) + message.substring(p+sig.length, message.length); } + // add the new signature string if (show_sig && rcmail.env.signatures && rcmail.env.signatures[id]) { sig = rcmail.env.signatures[id].text; @@ -526,6 +540,7 @@ } else { body.appendChild(sigElem); + position_element = $(sigElem).prev(); } } @@ -533,6 +548,15 @@ sigElem.innerHTML = rcmail.env.signatures[id].html; } } + else if (!rcmail.env.top_posting) { + position_element = $(this.editor.getBody()).children().last(); + } + + // put cursor before signature and scroll the window + if (this.editor && position_element && position_element.length) { + this.editor.selection.setCursorLocation(position_element.get(0)); + this.editor.getWin().scroll(0, position_element.offset().top); + } }; // trigger content save
View file
roundcubemail-1.1.0.tar.gz/program/lib/Roundcube/bootstrap.php
Changed
@@ -78,9 +78,11 @@ } // set internal encoding for mbstring extension -if (extension_loaded('mbstring')) { +if (function_exists('mb_internal_encoding')) { mb_internal_encoding(RCUBE_CHARSET); - @mb_regex_encoding(RCUBE_CHARSET); +} +if (function_exists('mb_regex_encoding')) { + mb_regex_encoding(RCUBE_CHARSET); } // make sure the Roundcube lib directory is in the include_path
View file
roundcubemail-1.1.0.tar.gz/program/lib/Roundcube/rcube.php
Changed
@@ -215,7 +215,10 @@ $this->mc_available = 0; // add all configured hosts to pool - $pconnect = $this->config->get('memcache_pconnect', true); + $pconnect = $this->config->get('memcache_pconnect', true); + $timeout = $this->config->get('memcache_timeout', 1); + $retry_interval = $this->config->get('memcache_retry_interval', 15); + foreach ($this->config->get('memcache_hosts', array()) as $host) { if (substr($host, 0, 7) != 'unix://') { list($host, $port) = explode(':', $host); @@ -226,7 +229,7 @@ } $this->mc_available += intval($this->memcache->addServer( - $host, $port, $pconnect, 1, 1, 15, false, array($this, 'memcache_failure'))); + $host, $port, $pconnect, 1, $timeout, $retry_interval, false, array($this, 'memcache_failure'))); } // test connection and failover (will result in $this->mc_available == 0 on complete failure)
View file
roundcubemail-1.1.0.tar.gz/program/lib/Roundcube/rcube_cache.php
Changed
@@ -605,8 +605,8 @@ $this->max_packet = 2097152; // default/max is 2 MB if ($this->type == 'db') { - $value = $this->db->get_variable('max_allowed_packet', 1048500); - $this->max_packet = min($value, $this->max_packet) - 2000; + $value = $this->db->get_variable('max_allowed_packet', $this->max_packet); + $this->max_packet = max($value, $this->max_packet) - 2000; } else if ($this->type == 'memcache') { $stats = $this->db->getStats();
View file
roundcubemail-1.1.0.tar.gz/program/lib/Roundcube/rcube_cache_shared.php
Changed
@@ -44,6 +44,7 @@ private $cache = array(); private $cache_changes = array(); private $cache_sums = array(); + private $max_packet = -1; /** @@ -312,7 +313,7 @@ * Writes single cache record into DB. * * @param string $key Cache key name - * @param mxied $data Serialized cache data + * @param mixed $data Serialized cache data * * @param boolean True on success, False on failure */ @@ -322,6 +323,12 @@ return false; } + // don't attempt to write too big data sets + if (strlen($data) > $this->max_packet_size()) { + trigger_error("rcube_cache: max_packet_size ($this->max_packet) exceeded for key $key. Tried to write " . strlen($data) . " bytes", E_USER_WARNING); + return false; + } + if ($this->type == 'memcache' || $this->type == 'apc') { return $this->add_record($this->ckey($key), $data); } @@ -578,4 +585,30 @@ return $this->packed ? @unserialize($data) : $data; } + + /** + * Determine the maximum size for cache data to be written + */ + private function max_packet_size() + { + if ($this->max_packet < 0) { + $this->max_packet = 2097152; // default/max is 2 MB + + if ($this->type == 'db') { + $value = $this->db->get_variable('max_allowed_packet', 1048500); + $this->max_packet = min($value, $this->max_packet) - 2000; + } + else if ($this->type == 'memcache') { + $stats = $this->db->getStats(); + $remaining = $stats['limit_maxbytes'] - $stats['bytes']; + $this->max_packet = min($remaining / 5, $this->max_packet); + } + else if ($this->type == 'apc' && function_exists('apc_sma_info')) { + $stats = apc_sma_info(); + $this->max_packet = min($stats['avail_mem'] / 5, $this->max_packet); + } + } + + return $this->max_packet; + } }
View file
roundcubemail-1.1.0.tar.gz/program/lib/Roundcube/rcube_contacts.php
Changed
@@ -714,6 +714,11 @@ // copy values into vcard object $vcard = new rcube_vcard($record['vcard'] ? $record['vcard'] : $save_data['vcard'], RCUBE_CHARSET, false, $this->vcard_fieldmap); $vcard->reset(); + + // don't store groups in vCard (#1490277) + $vcard->set('groups', null); + unset($save_data['groups']); + foreach ($save_data as $key => $values) { list($field, $section) = explode(':', $key); $fulltext = in_array($field, $this->fulltext_cols);
View file
roundcubemail-1.1.0.tar.gz/program/lib/Roundcube/rcube_db_mysql.php
Changed
@@ -161,15 +161,24 @@ { if (!isset($this->variables)) { $this->variables = array(); + } - $result = $this->query('SHOW VARIABLES'); + if (array_key_exists($varname, $this->variables)) { + return $this->variables[$varname]; + } - while ($row = $this->fetch_array($result)) { - $this->variables[$row[0]] = $row[1]; - } + $result = $this->query('SHOW VARIABLES LIKE ?', $varname); + + while ($row = $this->fetch_array($result)) { + $this->variables[$row[0]] = $row[1]; + } + + // not found, use default + if (!isset($this->variables[$varname])) { + $this->variables[$varname] = $default; } - return isset($this->variables[$varname]) ? $this->variables[$varname] : $default; + return $this->variables[$varname]; } /**
View file
roundcubemail-1.1.0.tar.gz/program/lib/Roundcube/rcube_mime.php
Changed
@@ -520,7 +520,7 @@ // remove space-stuffing $line = preg_replace('/^ /', '', $line); - if (isset($text[$last]) && $line + if (isset($text[$last]) && $line && !$q_level && $text[$last] != '-- ' && $text[$last][strlen($text[$last])-1] == ' ' ) {
View file
roundcubemail-1.1.0.tar.gz/program/lib/Roundcube/rcube_vcard.php
Changed
@@ -393,6 +393,10 @@ $this->raw[$tag][$index]['type'] = explode(',', ($typemap[$type_uc] ? $typemap[$type_uc] : $type)); } } + else { + unset($this->raw[$tag]); + } + break; } }
View file
roundcubemail-1.1.0.tar.gz/program/localization/en_US/labels.inc
Changed
@@ -343,6 +343,7 @@ $labels['advsearch'] = 'Advanced Search'; $labels['advanced'] = 'Advanced'; $labels['other'] = 'Other'; +$labels['printcontact'] = 'Print contact'; $labels['typehome'] = 'Home'; $labels['typework'] = 'Work';
View file
roundcubemail-1.1.0.tar.gz/program/steps/addressbook/export.inc
Changed
@@ -121,24 +121,22 @@ */ function prepare_for_export(&$record, $source = null) { - $groups = $source && $source->groups && $source->export_groups ? $source->get_record_groups($record['ID']) : null; + $groups = $source && $source->groups && $source->export_groups ? $source->get_record_groups($record['ID']) : null; + $fieldmap = $source ? $source->vcard_map : null; if (empty($record['vcard'])) { - $vcard = new rcube_vcard(); - if ($source) { - $vcard->extend_fieldmap($source->vcard_map); - } - $vcard->load($record['vcard']); + $vcard = new rcube_vcard($record['vcard'], RCUBE_CHARSET, false, $fieldmap); $vcard->reset(); foreach ($record as $key => $values) { list($field, $section) = explode(':', $key); - // avoid casting DateTime objects to array + // avoid unwanted casting of DateTime objects to an array // (same as in rcube_contacts::convert_save_data()) if (is_object($values) && is_a($values, 'DateTime')) { - $values = array(0 => $values); + $values = array($values); } - foreach ($values as $value) { + + foreach ((array) $values as $value) { if (is_array($value) || is_a($value, 'DateTime') || @strlen($value)) { $vcard->set($field, $value, strtoupper($section)); } @@ -150,11 +148,19 @@ $vcard->set('groups', join(',', $groups), null); } - $record['vcard'] = $vcard->export(true); + $record['vcard'] = $vcard->export(); } // patch categories to alread existing vcard block - else if ($record['vcard'] && !empty($groups) && !strpos($record['vcard'], 'CATEGORIES:')) { - $vgroups = 'CATEGORIES:' . rcube_vcard::vcard_quote(join(',', $groups)); - $record['vcard'] = str_replace('END:VCARD', $vgroups . rcube_vcard::$eol . 'END:VCARD', $record['vcard']); + else if ($record['vcard']) { + $vcard = new rcube_vcard($record['vcard'], RCUBE_CHARSET, false, $fieldmap); + + // unset CATEGORIES entry, it might be not up-to-date (#1490277) + $vcard->set('groups', null); + $record['vcard'] = $vcard->export(); + + if (!empty($groups)) { + $vgroups = 'CATEGORIES:' . rcube_vcard::vcard_quote($groups, ','); + $record['vcard'] = str_replace('END:VCARD', $vgroups . rcube_vcard::$eol . 'END:VCARD', $record['vcard']); + } } }
View file
roundcubemail-1.1.0.tar.gz/program/steps/addressbook/func.inc
Changed
@@ -518,12 +518,13 @@ $plugin = $RCMAIL->plugins->exec_hook('contact_form', array( 'form' => $form, 'record' => $record)); - $form = $plugin['form']; - $record = $plugin['record']; - $edit_mode = $RCMAIL->action != 'show'; + $form = $plugin['form']; + $record = $plugin['record']; + $edit_mode = $RCMAIL->action != 'show' && $RCMAIL->action != 'print'; $del_button = $attrib['deleteicon'] ? html::img(array('src' => $RCMAIL->output->get_skin_file($attrib['deleteicon']), 'alt' => $RCMAIL->gettext('delete'))) : $RCMAIL->gettext('delete'); + $out = ''; + unset($attrib['deleteicon']); - $out = ''; // get default coltypes $coltypes = $GLOBALS['CONTACT_COLTYPES']; @@ -544,8 +545,9 @@ foreach ($form as $section => $fieldset) { // skip empty sections - if (empty($fieldset['content'])) + if (empty($fieldset['content'])) { continue; + } $select_add = new html_select(array('class' => 'addfieldmenu', 'rel' => $section)); $select_add->add($RCMAIL->gettext('addfield'), ''); @@ -555,18 +557,20 @@ $content = ''; // unset display name if it is composed from name parts - if ($record['name'] == rcube_addressbook::compose_display_name(array('name' => '') + (array)$record)) - unset($record['name']); + if ($record['name'] == rcube_addressbook::compose_display_name(array('name' => '') + (array)$record)) { + unset($record['name']); + } // group fields $field_blocks = array( - 'names' => array('prefix','firstname','middlename','surname','suffix'), - 'displayname' => array('name'), - 'nickname' => array('nickname'), + 'names' => array('prefix','firstname','middlename','surname','suffix'), + 'displayname' => array('name'), + 'nickname' => array('nickname'), 'organization' => array('organization'), - 'department' => array('department'), - 'jobtitle' => array('jobtitle'), + 'department' => array('department'), + 'jobtitle' => array('jobtitle'), ); + foreach ($field_blocks as $blockname => $colnames) { $fields = ''; foreach ($colnames as $col) { @@ -574,11 +578,16 @@ if (!$coltypes[$col]) continue; + // skip cols not listed in the form definition + if (is_array($fieldset['content']) && !in_array($col, array_keys($fieldset['content']))) { + continue; + } + // only string values are expected here if (is_array($record[$col])) $record[$col] = join(' ', $record[$col]); - if ($RCMAIL->action == 'show') { + if (!$edit_mode) { if (!empty($record[$col])) $fields .= html::span('namefield ' . $col, rcube::Q($record[$col])) . " "; } @@ -611,11 +620,15 @@ $fullkey = $col.':'.$subtype; // skip cols unknown to the backend - if (!$coltypes[$field]) + if (!$coltypes[$field] && empty($colprop['value'])) { continue; + } // merge colprop with global coltype configuration - $colprop += $coltypes[$field]; + if ($coltypes[$field]) { + $colprop += $coltypes[$field]; + } + $label = isset($colprop['label']) ? $colprop['label'] : $RCMAIL->gettext($col); // prepare subtype selector in edit mode @@ -624,8 +637,9 @@ $select_subtype = new html_select(array('name' => '_subtype_'.$col.'[]', 'class' => 'contactselectsubtype', 'title' => $colprop['label'] . ' ' . $RCMAIL->gettext('type'))); $select_subtype->add($subtype_names, $colprop['subtypes']); } - else + else { $select_subtype = null; + } if (!empty($colprop['value'])) { $values = (array)$colprop['value']; @@ -729,12 +743,21 @@ // display row with label if ($label) { + if ($RCMAIL->action == 'print') { + $_label = rcube::Q($colprop['label'] . ($label != $colprop['label'] ? ' (' . $label . ')' : '')); + } + else { + $_label = $select_subtype ? $select_subtype->show($subtype) : html::label($colprop['id'], rcube::Q($label)); + } + $rows .= html::div('row', - html::div('contactfieldlabel label', $select_subtype ? $select_subtype->show($subtype) : html::label($colprop['id'], rcube::Q($label))) . + html::div('contactfieldlabel label', $_label) . html::div('contactfieldcontent '.$colprop['type'], $val)); } - else // row without label + // row without label + else { $rows .= html::div('row', html::div('contactfield', $val)); + } } // add option to the add-field menu @@ -745,9 +768,13 @@ // wrap rows in fieldgroup container if ($rows) { - $content .= html::tag('fieldset', array('class' => 'contactfieldgroup ' . ($colprop['subtypes'] ? 'contactfieldgroupmulti ' : '') . 'contactcontroller' . $col, 'style' => ($rows ? null : 'display:none')), - ($colprop['subtypes'] ? html::tag('legend', null, rcube::Q($colprop['label'])) : ' ') . - $rows); + $c_class = 'contactfieldgroup ' . ($colprop['subtypes'] ? 'contactfieldgroupmulti ' : '') . 'contactcontroller' . $col; + $with_label = $colprop['subtypes'] && $RCMAIL->action != 'print'; + $content .= html::tag( + 'fieldset', + array('class' => $c_class, 'style' => ($rows ? null : 'display:none')), + ($with_label ? html::tag('legend', null, rcube::Q($colprop['label'])) : ' ') . $rows + ); } } @@ -769,9 +796,9 @@ } if ($edit_mode) { - $RCMAIL->output->set_env('coltypes', $coltypes + $coltype_labels); - $RCMAIL->output->set_env('delbutton', $del_button); - $RCMAIL->output->add_label('delete'); + $RCMAIL->output->set_env('coltypes', $coltypes + $coltype_labels); + $RCMAIL->output->set_env('delbutton', $del_button); + $RCMAIL->output->add_label('delete'); } return $out;
View file
roundcubemail-1.1.0.tar.gz/program/steps/addressbook/print.inc
Added
@@ -0,0 +1,138 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | program/steps/addressbook/print.inc | + | | + | This file is part of the Roundcube Webmail client | + | Copyright (C) 2005-2015, The Roundcube Dev Team | + | Copyright (C) 2011-2015, Kolab Systems AG | + | | + | 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. | + | | + | PURPOSE: | + | Print contact details | + | | + +-----------------------------------------------------------------------+ + | Author: Thomas Bruederli <roundcube@gmail.com> | + | Author: Aleksander Machniak <machniak@kolabsys.com> | + +-----------------------------------------------------------------------+ +*/ + +// Get contact ID and source ID from request +$cids = rcmail_get_cids(); +$source = key($cids); +$cid = $cids ? array_shift($cids[$source]) : null; + +// Initialize addressbook source +$CONTACTS = rcmail_contact_source($source, true); +$SOURCE_ID = $source; + +// read contact record +if ($cid && $CONTACTS) { + $record = $CONTACTS->get_record($cid, true); +} + +$OUTPUT->add_handlers(array( + 'contacthead' => 'rcmail_contact_head', + 'contactdetails' => 'rcmail_contact_details', + 'contactphoto' => 'rcmail_contact_photo', +)); + +$OUTPUT->send('contactprint'); + + + +function rcmail_contact_head($attrib) +{ + global $CONTACTS, $RCMAIL; + + // check if we have a valid result + if (!(($result = $CONTACTS->get_result()) && ($record = $result->first()))) { + $RCMAIL->output->show_message('contactnotfound', 'error'); + return false; + } + + $form = array( + 'head' => array( // section 'head' is magic! + 'name' => $RCMAIL->gettext('contactnameandorg'), + 'content' => array( + 'prefix' => array(), + 'name' => array(), + 'firstname' => array(), + 'middlename' => array(), + 'surname' => array(), + 'suffix' => array(), + ), + ), + ); + + unset($attrib['name']); + return rcmail_contact_form($form, $record, $attrib); +} + + +function rcmail_contact_details($attrib) +{ + global $CONTACTS, $RCMAIL, $CONTACT_COLTYPES; + + // check if we have a valid result + if (!(($result = $CONTACTS->get_result()) && ($record = $result->first()))) { + return false; + } + + $i_size = !empty($attrib['size']) ? $attrib['size'] : 40; + + $form = array( + 'contact' => array( + 'name' => $RCMAIL->gettext('properties'), + 'content' => array( + 'organization' => array(), + 'department' => array(), + 'jobtitle' => array(), + 'email' => array(), + 'phone' => array(), + 'address' => array(), + 'website' => array(), + 'im' => array(), + 'groups' => array('value' => 'sdfsdfs', 'label' => $RCMAIL->gettext('groups')), + ), + ), + 'personal' => array( + 'name' => $RCMAIL->gettext('personalinfo'), + 'content' => array( + 'nickname' => array(), + 'gender' => array(), + 'maidenname' => array(), + 'birthday' => array(), + 'anniversary' => array(), + 'manager' => array(), + 'assistant' => array(), + 'spouse' => array(), + ), + ), + ); + + if (isset($CONTACT_COLTYPES['notes'])) { + $form['notes'] = array( + 'name' => $RCMAIL->gettext('notes'), + 'content' => array( + 'notes' => array('type' => 'textarea', 'label' => false), + ), + ); + } + + if ($CONTACTS->groups) { + $groups = $CONTACTS->get_record_groups($record['ID']); + if (!empty($groups)) { + $form['contact']['content']['groups'] = array( + 'value' => rcube::Q(implode(', ', $groups)), + 'label' => $RCMAIL->gettext('groups') + ); + } + } + + return rcmail_contact_form($form, $record); +}
View file
roundcubemail-1.1.0.tar.gz/program/steps/addressbook/show.inc
Changed
@@ -66,11 +66,16 @@ 'head' => array( // section 'head' is magic! 'name' => $RCMAIL->gettext('contactnameandorg'), 'content' => array( - 'prefix' => array('type' => 'text'), - 'firstname' => array('type' => 'text'), - 'middlename' => array('type' => 'text'), - 'surname' => array('type' => 'text'), - 'suffix' => array('type' => 'text'), + 'prefix' => array('type' => 'text'), + 'firstname' => array('type' => 'text'), + 'middlename' => array('type' => 'text'), + 'surname' => array('type' => 'text'), + 'suffix' => array('type' => 'text'), + 'name' => array('type' => 'text'), + 'nickname' => array('type' => 'text'), + 'organization' => array('type' => 'text'), + 'department' => array('type' => 'text'), + 'jobtitle' => array('type' => 'text'), ), ), );
View file
roundcubemail-1.1.0.tar.gz/program/steps/mail/func.inc
Changed
@@ -1959,9 +1959,16 @@ // Fixes some content-type names function rcmail_fix_mimetype($name) { + $map = array( + 'image/x-ms-bmp' => 'image/bmp', // #1490282 + ); + + if ($alias = $map[strtolower($name)]) { + $name = $alias; + } // Some versions of Outlook create garbage Content-Type: // application/pdf.A520491B_3BF7_494D_8855_7FAC2C6C0608 - if (preg_match('/^application\/pdf.+/', $name)) { + else if (preg_match('/^application\/pdf.+/', $name)) { $name = 'application/pdf'; } // treat image/pjpeg (image/pjpg, image/jpg) as image/jpeg (#1489097)
View file
roundcubemail-1.1.0.tar.gz/program/steps/mail/get.inc
Changed
@@ -138,7 +138,7 @@ $file_extension = strtolower(pathinfo($part->filename, PATHINFO_EXTENSION)); // 1. compare filename suffix with expected suffix derived from mimetype - $valid = $file_extension && in_array($file_extension, (array)$extensions) || !empty($_REQUEST['_mimeclass']); + $valid = $file_extension && in_array($file_extension, (array)$extensions) || empty($extensions) || !empty($_REQUEST['_mimeclass']); // 2. detect the real mimetype of the attachment part and compare it with the stated mimetype and filename extension if ($valid || !$file_extension || $mimetype == 'application/octet-stream' || stripos($mimetype, 'text/') === 0) { @@ -164,7 +164,7 @@ else { // get valid file extensions $extensions = rcube_mime::get_mime_extensions($real_mimetype); - $valid_extension = (!$file_extension || in_array($file_extension, (array)$extensions)); + $valid_extension = !$file_extension || empty($extensions) || in_array($file_extension, (array)$extensions); } // fix mimetype for images wrongly declared as octet-stream @@ -172,7 +172,10 @@ $mimetype = $real_mimetype; } - $valid = ($real_mimetype == $mimetype && $valid_extension); + // "fix" real mimetype the same way the original is before comparison + $real_mimetype = rcmail_fix_mimetype($real_mimetype); + + $valid = $real_mimetype == $mimetype && $valid_extension; } else { $real_mimetype = $mimetype;
View file
roundcubemail-1.1.0.tar.gz/program/steps/mail/sendmail.inc
Changed
@@ -684,11 +684,16 @@ $OUTPUT->command('auto_save_start'); } else { + // Collect folders which could contain the composed message, + // we'll refresh the list if currently opened folder is one of them (#1490238) $folders = array(); if (in_array($COMPOSE['mode'], array('reply', 'forward', 'draft'))) { $folders[] = $COMPOSE['mailbox']; } + if (!empty($COMPOSE['param']['draft_uid']) && $drafts_mbox) { + $folders[] = $drafts_mbox; + } rcmail_compose_cleanup($COMPOSE_ID); $OUTPUT->command('remove_compose_data', $COMPOSE_ID); @@ -760,8 +765,10 @@ // remove any null-byte characters before parsing $body = preg_replace('/\x00/', '', $body); - $searchstr = 'program/js/tinymce/plugins/emoticons/img/'; - $offset = 0; + $searchstr = 'program/js/tinymce/plugins/emoticons/img/'; + $assets_dir = $RCMAIL->config->get('assets_dir'); + $path = ($assets_dir ?: INSTALL_PATH) . '/' . $searchstr; + $offset = 0; // keep track of added images, so they're only added once $included_images = array(); @@ -774,12 +781,14 @@ // sanitize image name so resulting attachment doesn't leave images dir $image_name = preg_replace('/[^a-zA-Z0-9_\.\-]/i', '', $image_name); - $img_file = INSTALL_PATH . '/' . $searchstr . $image_name; + $img_file = $path . $image_name; - if (! in_array($image_name, $included_images)) { + if (!in_array($image_name, $included_images)) { // add the image to the MIME message - if (!$mime_message->addHTMLImage($img_file, 'image/gif', '', true, $image_name)) { + $res = $mime_message->addHTMLImage($img_file, 'image/gif', '', true, $image_name); + if (PEAR::isError($res)) { $RCMAIL->output->show_message("emoticonerror", 'error'); + continue; } array_push($included_images, $image_name);
View file
roundcubemail-1.1.0.tar.gz/skins/classic/addressbook.css
Changed
@@ -43,6 +43,16 @@ background-position: -32px -32px; } +#abooktoolbar a.print { + background: url(images/mail_toolbar.png) 0 0 no-repeat transparent; + background-position: -256px 0; +} + +#abooktoolbar a.printSel { + background: url(images/mail_toolbar.png) 0 0 no-repeat transparent; + background-position: -256px -32px; +} + #abooktoolbar a.delete { background-position: -64px 0; }
View file
roundcubemail-1.1.0.tar.gz/skins/classic/print.css
Changed
@@ -159,3 +159,67 @@ { display: none; } + +/* contact print */ +#contact-details fieldset { + color: #666; + border: 1px solid #999; + margin-top: 5px; +} + +#contact-details fieldset.contactfieldgroup { + border: 0; + padding: 0; + margin: 0; +} + +#contact-details div.row { + padding: 2px 0; +} + +#contact-details .contactfieldlabel { + display: inline-block; + vertical-align: top; + width: 150px; + overflow: hidden; + text-overflow: ellipsis; +} + +#contact-details .contactfieldcontent { + display: inline-block; + vertical-align: top; + font-weight: bold; +} + +#contact-details #contactphoto { + float: left; + margin: 5px 15px 5px 3px; + width: 112px; + border: 0; + padding: 0; +} + +#contact-details #contactpic { + width: 112px; + background: white; +} + +#contact-details #contactpic img { + max-width: 112px; + visibility: inherit; +} + +#contact-details #contacthead { + border: 0; + margin: 0 16em 0 0; + padding: 0; +} + +#contact-details #contacthead > legend { + display: none; +} + +#contact-details #contacthead .names span.namefield { + font-size: 140%; + font-weight: bold; +}
View file
roundcubemail-1.1.0.tar.gz/skins/classic/templates/addressbook.html
Changed
@@ -21,6 +21,7 @@ <div id="abooktoolbar"> <roundcube:button command="add" type="link" class="buttonPas addcontact" classAct="button addcontact" classSel="button addcontactSel" title="newcontact" content=" " /> <roundcube:button command="compose" type="link" class="buttonPas compose" classAct="button compose" classSel="button composeSel" title="composeto" content=" " /> +<roundcube:button command="print" type="link" class="buttonPas print" classAct="button print" classSel="button printSel" label="print" title="printcontact" content=" " /> <roundcube:button command="delete" type="link" class="buttonPas delete" classAct="button delete" classSel="button deleteSel" title="deletecontact" content=" " /> <span class="separator"> </span> <roundcube:button command="import" type="link" class="buttonPas import" classAct="button import" classSel="button importSel" title="importcontacts" content=" " />
View file
roundcubemail-1.1.0.tar.gz/skins/classic/templates/contactprint.html
Added
@@ -0,0 +1,20 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title><roundcube:object name="pagetitle" /></title> +<link rel="shortcut icon" href="/images/favicon.ico"/> +<link rel="stylesheet" type="text/css" href="/print.css" /> +</head> +<body> + +<roundcube:object name="logo" src="/images/roundcube_logo.png" id="logo" border="0" /> + +<div id="contact-details"> + <div id="contactphoto"><roundcube:object name="contactphoto" id="contactpic" placeholder="/images/contactpic.png" placeholderGroup="/images/contactgroup.png" /></div> + <roundcube:object name="contacthead" id="contacthead" /> + <div style="clear:both"></div> + <roundcube:object name="contactdetails" /> +</div> + +</body> +</html>
View file
roundcubemail-1.1.0.tar.gz/skins/larry/print.css
Changed
@@ -143,3 +143,66 @@ display: none; } +/* contact print */ +#contact-details fieldset { + color: #666; + border: 1px solid #999; + margin-top: 5px; +} + +#contact-details fieldset.contactfieldgroup { + border: 0; + padding: 0; + margin: 0; +} + +#contact-details div.row { + padding: 2px 0; +} + +#contact-details .contactfieldlabel { + display: inline-block; + vertical-align: top; + width: 150px; + overflow: hidden; + text-overflow: ellipsis; +} + +#contact-details .contactfieldcontent { + display: inline-block; + vertical-align: top; + font-weight: bold; +} + +#contact-details #contactphoto { + float: left; + margin: 5px 15px 5px 3px; + width: 112px; + border: 0; + padding: 0; +} + +#contact-details #contactpic { + width: 112px; + background: white; +} + +#contact-details #contactpic img { + max-width: 112px; + visibility: inherit; +} + +#contact-details #contacthead { + border: 0; + margin: 0 16em 0 0; + padding: 0; +} + +#contact-details #contacthead > legend { + display: none; +} + +#contact-details #contacthead .names span.namefield { + font-size: 140%; + font-weight: bold; +}
View file
roundcubemail-1.1.0.tar.gz/skins/larry/templates/addressbook.html
Changed
@@ -23,6 +23,7 @@ <span class="spacer"></span> <roundcube:button command="compose" type="link" class="button compose disabled" classAct="button compose" classSel="button compose pressed" label="compose" title="writenewmessage" /> + <roundcube:button command="print" type="link" class="button print disabled" classAct="button print" classSel="button print pressed" label="print" title="printcontact" /> <roundcube:button command="advanced-search" type="link" class="button search disabled" classAct="button search" classSel="button search pressed" label="advanced" title="advsearch" /> <roundcube:container name="toolbar" id="addressbooktoolbar" />
View file
roundcubemail-1.1.0.tar.gz/skins/larry/templates/contactprint.html
Added
@@ -0,0 +1,20 @@ +<roundcube:object name="doctype" value="html5" /> +<html> +<head> +<title><roundcube:object name="pagetitle" /></title> +<link rel="shortcut icon" href="/images/favicon.ico"/> +<link rel="stylesheet" type="text/css" href="/print.css" /> +</head> +<body> + +<div id="header"><roundcube:object name="logo" src="/images/roundcube_logo.png" id="toplogo" border="0" alt="Logo" /></div> + +<div id="contact-details" class="boxcontent"> + <div id="contactphoto"><roundcube:object name="contactphoto" id="contactpic" placeholder="/images/contactpic.png" placeholderGroup="/images/contactgroup.png" /></div> + <roundcube:object name="contacthead" id="contacthead" /> + <br style="clear:both" /> + <roundcube:object name="contactdetails" /> +</div> + +</body> +</html>
View file
roundcubemail-1.1.0.tar.gz/tests/Framework/Mime.php
Changed
@@ -156,6 +156,21 @@ } /** + * Test format=flowed unfolding (#1490284) + */ + function test_unfold_flowed2() + { + $flowed = "> culpa qui officia deserunt mollit anim id est laborum.\r\n" + ."> \r\n" + ."Sed ut perspiciatis unde omnis iste natus error \r\nsit voluptatem"; + $unfolded = "> culpa qui officia deserunt mollit anim id est laborum.\r\n" + ."> \r\n" + ."Sed ut perspiciatis unde omnis iste natus error sit voluptatem"; + + $this->assertEquals($unfolded, rcube_mime::unfold_flowed($flowed), "Test correct unfolding of quoted lines [2]"); + } + + /** * Test wordwrap() */ function test_wordwrap()
View file
roundcubemail.dsc
Changed
@@ -2,7 +2,7 @@ Source: roundcubemail Binary: roundcubemail Architecture: all -Version: 1:1.1.0-0~kolab3 +Version: 1:1.1.0-0~kolab4 Maintainer: Debian Roundcube Maintainers <pkg-roundcube-maintainers@lists.alioth.debian.org> Uploaders: Vincent Bernat <bernat@debian.org>, Romain Beauxis <toots@rastageeks.org>, Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com>, Paul Klos <kolab@klos2day.nl> Homepage: http://www.roundcube.net/
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.