Projects
Kolab:Winterfell
roundcubemail
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 4
View file
roundcubemail.spec
Changed
@@ -43,7 +43,7 @@ Name: roundcubemail Version: 1.2 -Release: 0.20160119.git%{?dist} +Release: 0.20160219.git%{?dist} Summary: Round Cube Webmail is a browser-based multilingual IMAP client
View file
debian.changelog
Changed
@@ -1,4 +1,4 @@ -roundcubemail (1:1.2~dev20160119-0~kolab1) unstable; urgency=low +roundcubemail (1:1.2~dev20160219-0~kolab1) unstable; urgency=low * fix secure URL regex for debian
View file
roundcubemail-1.2.tar.gz/CHANGELOG
Changed
@@ -1,6 +1,10 @@ CHANGELOG Roundcube Webmail =========================== +- Enigma: Fix missing html/plain switch on multipart/signed messages (#1490649) +- Enigma: Disable format=flowed for signed plain text messages (#1490646) +- Enigma: Fix handling of encrypted + signed messages (#1490632) +- Enigma: Fix invalid boundary use in signed messages structure - Enable use of TLSv1.1 and TLSv1.2 for IMAP (#1490640) - Save copy of original .htaccess file when using installto.sh script (1490623) - Fix regression where some message attachments could be missing on edit/forward (#1490608) @@ -14,6 +18,11 @@ - Fix PHP7 warning "session_start(): Session callback expects true/false return value" (#1490624) - Fix XSS issue in SVG images handling (#1490625) - Fix missing language name in "Add to Dictionary" request in HTML mode (#1490634) +- Fix (again) security issue in DBMail driver of password plugin [CVE-2015-2181] (#1490643) +- Fix bug where Archive/Junk buttons were not active after page jump with select=all mode (#1490647) +- Fix bug in long recipients list parsing for cases where recipient name contained @-char (#1490653) +- Plugin API: Added addressbook_export hook +- Fix additional_message_headers plugin compatibility with Mail_Mime >= 1.9 (#1490657) RELEASE 1.2-beta ----------------
View file
roundcubemail-1.2.tar.gz/plugins/additional_message_headers/additional_message_headers.php
Changed
@@ -24,22 +24,14 @@ { $this->load_config(); - $headers = $args['message']->headers(); - $rcube = rcube::get_instance(); + $rcube = rcube::get_instance(); // additional email headers $additional_headers = $rcube->config->get('additional_message_headers', array()); - foreach ((array)$additional_headers as $header => $value) { - if (null === $value) { - unset($headers[$header]); - } - else { - $headers[$header] = $value; - } - } - $args['message']->_headers = array(); - $args['message']->headers($headers); + if (!empty($additional_headers)) { + $args['message']->headers($additional_headers, true); + } return $args; }
View file
roundcubemail-1.2.tar.gz/plugins/additional_message_headers/composer.json
Changed
@@ -3,7 +3,7 @@ "type": "roundcube-plugin", "description": "Very simple plugin which will add additional headers to or remove them from outgoing messages.", "license": "GPLv2", - "version": "1.2.0", + "version": "1.2.1", "authors": [ { "name": "Ziba Scott",
View file
roundcubemail-1.2.tar.gz/plugins/enigma/composer.json
Changed
@@ -3,7 +3,7 @@ "type": "roundcube-plugin", "description": "PGP Encryption for Roundcube", "license": "GPLv3+", - "version": "0.3", + "version": "0.4", "authors": [ { "name": "Aleksander Machniak",
View file
roundcubemail-1.2.tar.gz/plugins/enigma/lib/enigma_engine.php
Changed
@@ -32,7 +32,6 @@ public $decryptions = array(); public $signatures = array(); - public $signed_parts = array(); public $encrypted_parts = array(); const SIGN_MODE_BODY = 1; @@ -187,6 +186,18 @@ // in this mode we'll replace text part // with the one containing signature $body = $message->getTXTBody(); + + $text_charset = $message->getParam('text_charset'); + $line_length = $this->rc->config->get('line_length', 72); + + // We can't use format=flowed for signed messages + if (strpos($text_charset, 'format=flowed')) { + list($charset, $params) = explode(';', $text_charset); + $body = rcube_mime::unfold_flowed($body); + $body = rcube_mime::wordwrap($body, $line_length, "\r\n", false, $charset); + + $text_charset = str_replace(";\r\n format=flowed", '', $text_charset); + } } else { // here we'll build PGP/MIME message @@ -199,7 +210,7 @@ if ($result !== true) { if ($result->getCode() == enigma_error::BADPASS) { // ask for password - $error = array('missing' => array($key->id => $key->name)); + $error = array('bad' => array($key->id => $key->name)); return new enigma_error(enigma_error::BADPASS, '', $error); } @@ -209,6 +220,7 @@ // replace message body if ($pgp_mode == Crypt_GPG::SIGN_MODE_CLEAR) { $message->setTXTBody($body); + $message->setParam('text_charset', $text_charset); } else { $mime->addPGPSignature($body); @@ -302,17 +314,18 @@ * Handler for message_part_structure hook. * Called for every part of the message. * - * @param array Original parameters + * @param array Original parameters + * @param string Part body (will be set if used internally) * * @return array Modified parameters */ - function part_structure($p) + function part_structure($p, $body = null) { if ($p['mimetype'] == 'text/plain' || $p['mimetype'] == 'application/pgp') { - $this->parse_plain($p); + $this->parse_plain($p, $body); } else if ($p['mimetype'] == 'multipart/signed') { - $this->parse_signed($p); + $this->parse_signed($p, $body); } else if ($p['mimetype'] == 'multipart/encrypted') { $this->parse_encrypted($p); @@ -355,9 +368,10 @@ /** * Handler for plain/text message. * - * @param array Reference to hook's parameters + * @param array Reference to hook's parameters + * @param string Part body (will be set if used internally) */ - function parse_plain(&$p) + function parse_plain(&$p, $body = null) { $part = $p['structure']; @@ -367,7 +381,9 @@ } // Get message body from IMAP server - $body = $this->get_part_body($p['object'], $part->mime_id); + if ($body === null) { + $body = $this->get_part_body($p['object'], $part); + } // @TODO: big message body could be a file resource // PGP signed message @@ -383,15 +399,16 @@ /** * Handler for multipart/signed message. * - * @param array Reference to hook's parameters + * @param array Reference to hook's parameters + * @param string Part body (will be set if used internally) */ - function parse_signed(&$p) + function parse_signed(&$p, $body = null) { $struct = $p['structure']; // S/MIME if ($struct->parts[1] && $struct->parts[1]->mimetype == 'application/pkcs7-signature') { - $this->parse_smime_signed($p); + $this->parse_smime_signed($p, $body); } // PGP/MIME: RFC3156 // The multipart/signed body MUST consist of exactly two parts. @@ -403,7 +420,7 @@ && count($struct->parts) == 2 && $struct->parts[1] && $struct->parts[1]->mimetype == 'application/pgp-signature' ) { - $this->parse_pgp_signed($p); + $this->parse_pgp_signed($p, $body); } } @@ -488,8 +505,7 @@ // Store signature data for display if (!empty($sig)) { - $this->signed_parts[$part->mime_id] = $part->mime_id; - $this->signatures[$part->mime_id] = $sig; + $this->signatures[$part->mime_id] = $sig; } fclose($fh); @@ -499,9 +515,10 @@ * Handler for PGP/MIME signed message. * Verifies signature. * - * @param array Reference to hook's parameters + * @param array Reference to hook's parameters + * @param string Part body (will be set if used internally) */ - private function parse_pgp_signed(&$p) + private function parse_pgp_signed(&$p, $body = null) { if (!$this->rc->config->get('enigma_signatures', true)) { return; @@ -520,61 +537,37 @@ // Get bodies // Note: The first part body need to be full part body with headers // it also cannot be decoded - $msg_body = $this->get_part_body($p['object'], $msg_part->mime_id, true); - $sig_body = $this->get_part_body($p['object'], $sig_part->mime_id); + if ($body !== null) { + // set signed part body + list($msg_body, $sig_body) = $this->explode_signed_body($body, $struct->ctype_parameters['boundary']); + } + else { + $msg_body = $this->get_part_body($p['object'], $msg_part, true); + $sig_body = $this->get_part_body($p['object'], $sig_part); + } // Verify $sig = $this->pgp_verify($msg_body, $sig_body); // Store signature data for display $this->signatures[$struct->mime_id] = $sig; - - // Message can be multipart (assign signature to each subpart) - if (!empty($msg_part->parts)) { - foreach ($msg_part->parts as $part) - $this->signed_parts[$part->mime_id] = $struct->mime_id; - } - else { - $this->signed_parts[$msg_part->mime_id] = $struct->mime_id; - } + $this->signatures[$msg_part->mime_id] = $sig; } /** * Handler for S/MIME signed message. * Verifies signature. * - * @param array Reference to hook's parameters + * @param array Reference to hook's parameters + * @param string Part body (will be set if used internally) */ - private function parse_smime_signed(&$p) + private function parse_smime_signed(&$p, $body = null) { - return; // @TODO - if (!$this->rc->config->get('enigma_signatures', true)) { return; } - // Verify signature - if ($this->rc->action == 'show' || $this->rc->action == 'preview' || $this->rc->action == 'print') { - $this->load_smime_driver(); - - $struct = $p['structure']; - $msg_part = $struct->parts[0]; - - // Verify
View file
roundcubemail-1.2.tar.gz/plugins/enigma/lib/enigma_mime_message.php
Changed
@@ -142,6 +142,8 @@ public function addPGPSignature($body) { $this->signature = $body; + // Reset Content-Type to be overwritten with valid boundary + unset($this->headers['Content-Type']); } /** @@ -152,6 +154,8 @@ public function setPGPEncryptedBody($body) { $this->encrypted = $body; + // Reset Content-Type to be overwritten with valid boundary + unset($this->headers['Content-Type']); } /** @@ -177,13 +181,13 @@ $this->checkParams(); if ($this->type == self::PGP_SIGNED) { - $body = "This is an OpenPGP/MIME signed message (RFC 4880 and 3156)"; $params = array( + 'preamble' => "This is an OpenPGP/MIME signed message (RFC 4880 and 3156)", 'content_type' => "multipart/signed; micalg=pgp-sha1; protocol=\"application/pgp-signature\"", 'eol' => $this->build_params['eol'], ); - $message = new Mail_mimePart($body, $params); + $message = new Mail_mimePart('', $params); if (!empty($this->body)) { $headers = $this->message->headers(); @@ -206,13 +210,13 @@ } } else if ($this->type == self::PGP_ENCRYPTED) { - $body = "This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156)"; $params = array( + 'preamble' => "This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156)", 'content_type' => "multipart/encrypted; protocol=\"application/pgp-encrypted\"", 'eol' => $this->build_params['eol'], ); - $message = new Mail_mimePart($body, $params); + $message = new Mail_mimePart('', $params); $message->addSubpart('Version: 1', array( 'content_type' => 'application/pgp-encrypted',
View file
roundcubemail-1.2.tar.gz/plugins/enigma/lib/enigma_ui.php
Changed
@@ -760,11 +760,13 @@ $part_id = $p['part']->mime_id; // Decryption status - if (isset($engine->decryptions[$part_id])) { + if (($found = $this->find_part_id($part_id, $engine->decryptions)) !== null + && ($status = $engine->decryptions[$found]) + ) { $attach_scripts = true; - // get decryption status - $status = $engine->decryptions[$part_id]; + // show the message only once + unset($engine->decryptions[$found]); // display status info $attrib['id'] = 'enigma-message'; @@ -778,7 +780,9 @@ $this->enigma->gettext('decryptnokey'))); } else if ($code == enigma_error::BADPASS) { - $msg = rcube::Q($this->enigma->gettext('decryptbadpass')); + $missing = $status->getData('missing'); + $label = 'decrypt' . (!empty($missing) ? 'no' : 'bad') . 'pass'; + $msg = rcube::Q($this->enigma->gettext($label)); $this->password_prompt($status); } else { @@ -794,11 +798,14 @@ } // Signature verification status - if (isset($engine->signed_parts[$part_id]) - && ($sig = $engine->signatures[$engine->signed_parts[$part_id]]) + if (($found = $this->find_part_id($part_id, $engine->signatures)) !== null + && ($sig = $engine->signatures[$found]) ) { $attach_scripts = true; + // show the message only once + unset($engine->signatures[$found]); + // display status info $attrib['id'] = 'enigma-message'; @@ -838,9 +845,6 @@ // $msg .= '<br /><pre>'.$sig->body.'</pre>'; $p['prefix'] .= html::div($attrib, $msg); - - // Display each signature message only once - unset($engine->signatures[$engine->signed_parts[$part_id]]); } if ($attach_scripts) { @@ -944,16 +948,16 @@ $msg = 'enigma.' . $mode . 'nokey'; } else if ($code == enigma_error::BADPASS) { - $msg = 'enigma.' . $mode . 'badpass'; - $type = 'warning'; - $this->password_prompt($status); } else { $msg = 'enigma.' . $mode . 'error'; } - $this->rc->output->show_message($msg, $type ?: 'error', $vars); + if ($msg) { + $this->rc->output->show_message($msg, $type ?: 'error', $vars); + } + $this->rc->output->send('iframe'); } @@ -1005,4 +1009,21 @@ return $p; } + + /** + * Check if the part or its parent exists in the array + * of decryptions/signatures. Returns found ID. + */ + private function find_part_id($part_id, $data) + { + $ids = explode('.', $part_id); + $i = 0; + $count = count($ids); + + while ($i < $count && strlen($part = implode('.', array_slice($ids, 0, ++$i)))) { + if (array_key_exists($part, $data)) { + return $part; + } + } + } }
View file
roundcubemail-1.2.tar.gz/plugins/enigma/localization/en_US.inc
Changed
@@ -93,9 +93,11 @@ $messages['decrypterror'] = 'Decryption failed.'; $messages['decryptnokey'] = 'Decryption failed. Private key not found. Key ID: $keyid.'; $messages['decryptbadpass'] = 'Decryption failed. Bad password.'; +$messages['decryptnopass'] = 'Decryption failed. Key password required.'; $messages['signerror'] = 'Signing failed.'; $messages['signnokey'] = 'Signing failed. Private key not found.'; $messages['signbadpass'] = 'Signing failed. Bad password.'; +$messages['signnopass'] = 'Signing failed. Key password required.'; $messages['encrypterror'] = 'Encryption failed.'; $messages['encryptnokey'] = 'Encryption failed. Public key not found for $email.'; $messages['nokeysfound'] = 'No keys found';
View file
roundcubemail-1.2.tar.gz/plugins/password/drivers/dbmail.php
Changed
@@ -40,20 +40,9 @@ $args = rcmail::get_instance()->config->get('password_dbmail_args', ''); $command = "$curdir/chgdbmailusers -c $username -w $password $args"; - if (strlen($command) > 1024) { - rcube::raise_error(array( - 'code' => 600, - 'type' => 'php', - 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Password plugin: The command is too long." - ), true, false); - - return PASSWORD_ERROR; - } - - exec($command, $output, $returnvalue); + exec($command, $output, $return_value); - if ($returnvalue == 0) { + if ($return_value == 0) { return PASSWORD_SUCCESS; } else {
View file
roundcubemail-1.2.tar.gz/plugins/password/helpers/chgdbmailusers.c
Changed
@@ -1,5 +1,4 @@ #include <stdio.h> -#include <string.h> #include <unistd.h> // set the UID this script will run as (root user) @@ -15,27 +14,10 @@ main(int argc, char *argv[]) { - int cnt,rc,cc; - char cmnd[1024]; - - strcpy(cmnd, CMD); - - if (argc > 1) - { - for (cnt = 1; cnt < argc; cnt++) - { - strcat(cmnd, " "); - strcat(cmnd, argv[cnt]); - } - } - else - { - fprintf(stderr, "__ %s: failed %d %d\n", argv[0], rc, cc); - return 255; - } + int rc, cc; cc = setuid(UID); - rc = system(cmnd); + rc = execvp(CMD, argv); if ((rc != 0) || (cc != 0)) {
View file
roundcubemail-1.2.tar.gz/program/js/app.js
Changed
@@ -295,7 +295,7 @@ else if (this.env.action == 'compose') { this.env.address_group_stack = []; this.env.compose_commands = ['send-attachment', 'remove-attachment', 'send', 'cancel', - 'toggle-editor', 'list-adresses', 'pushgroup', 'search', 'reset-search', 'extwin', + 'toggle-editor', 'list-addresses', 'pushgroup', 'search', 'reset-search', 'extwin', 'insert-response', 'save-response', 'menu-open', 'menu-close']; if (this.env.drafts_mailbox) @@ -381,7 +381,7 @@ if (this.gui_objects.addressbookslist) { this.gui_objects.folderlist = this.gui_objects.addressbookslist; - this.enable_command('list-adresses', true); + this.enable_command('list-addresses', true); } // ask user to send MDN @@ -581,7 +581,12 @@ this.display_message.apply(this, this.pending_message); // init treelist widget - if (this.gui_objects.folderlist && window.rcube_treelist_widget) { + if (this.gui_objects.folderlist && window.rcube_treelist_widget + // some plugins may load rcube_treelist_widget and there's one case + // when this will cause problems - addressbook widget in compose, + // which already has been initialized using rcube_list_widget + && this.gui_objects.folderlist != this.gui_objects.addressbookslist + ) { this.treelist = new rcube_treelist_widget(this.gui_objects.folderlist, { selectable: true, id_prefix: 'rcmli', @@ -1161,7 +1166,7 @@ this.change_identity($("[name='_from']")[0], true); break; - case 'list-adresses': + case 'list-addresses': this.list_contacts(props); this.enable_command('add-recipient', false); break; @@ -8110,7 +8115,10 @@ this.enable_command('set-listmode', this.env.threads && !is_multifolder); if (list.rowcount > 0 && !$(document.activeElement).is('input,textarea')) list.focus(); - this.msglist_select(list); + + // trigger 'select' so all dependent actions update its state + // e.g. plugins use this event to activate buttons (#1490647) + list.triggerEvent('select'); } if (response.action != 'getunread')
View file
roundcubemail-1.2.tar.gz/program/js/list.js
Changed
@@ -1104,11 +1104,11 @@ /** * Check if given id is part of the current selection */ -in_selection: function(id) +in_selection: function(id, index) { for (var n in this.selection) if (this.selection[n] == id) - return true; + return index ? n : true; return false; }, @@ -1256,18 +1256,19 @@ } } else { - if (!this.in_selection(id)) { // select row + var pre, post, p = this.in_selection(id, true); + + if (p === false) { // select row this.selection.push(id); $(this.rows[id].obj).addClass('selected').attr('aria-selected', 'true'); if (!norecur && !this.rows[id].expanded) this.highlight_children(id, true); } else { // unselect row - var p = $.inArray(id, this.selection), - a_pre = this.selection.slice(0, p), - a_post = this.selection.slice(p+1, this.selection.length); + pre = this.selection.slice(0, p); + post = this.selection.slice(p+1, this.selection.length); - this.selection = a_pre.concat(a_post); + this.selection = pre.concat(post); $(this.rows[id].obj).removeClass('selected').removeAttr('aria-selected'); if (!norecur && !this.rows[id].expanded) this.highlight_children(id, false);
View file
roundcubemail-1.2.tar.gz/program/lib/Roundcube/rcube.php
Changed
@@ -1500,6 +1500,7 @@ $host = preg_replace('/:[0-9]+$/', '', $host); if ($host && preg_match('/\.[a-z]+$/i', $host)) { $domain_part = $host; + break; } } }
View file
roundcubemail-1.2.tar.gz/program/lib/Roundcube/rcube_message.php
Changed
@@ -339,6 +339,7 @@ $level = explode('.', $part->mime_id); $depth = count($level); + $last = ''; // Check if the part belongs to higher-level's multipart part // this can be alternative/related/signed/encrypted or mixed @@ -348,9 +349,12 @@ return true; } - $parent = $this->mime_parts[join('.', $level)]; + $parent = $this->mime_parts[join('.', $level)]; + $max_delta = $depth - (1 + ($last == 'multipart/alternative' ? 1 : 0)); + $last = $parent->mimetype; + if (!preg_match('/^multipart\/(alternative|related|signed|encrypted|mixed)$/', $parent->mimetype) - || ($parent->mimetype == 'multipart/mixed' && $parent_depth < $depth - 1)) { + || ($parent->mimetype == 'multipart/mixed' && $parent_depth < $max_delta)) { continue 2; } }
View file
roundcubemail-1.2.tar.gz/program/lib/Roundcube/rcube_mime_decode.php
Changed
@@ -67,18 +67,18 @@ /** * Performs the decoding process. * - * @param string $input The input to decode + * @param string $input The input to decode + * @param bool $convert Convert result to rcube_message_part structure * * @return object|bool Decoded results or False on failure */ - public function decode($input) + public function decode($input, $convert = true) { list($header, $body) = $this->splitBodyHeader($input); - // @TODO: Since this is a part of Roundcube Framework - // we should return rcube_message_part structure + $struct = $this->do_decode($header, $body); - if ($struct = $this->do_decode($header, $body)) { + if ($struct && $convert) { $struct = $this->structure_part($struct); } @@ -176,6 +176,8 @@ case 'multipart/alternative': case 'multipart/related': case 'multipart/mixed': + case 'multipart/signed': + case 'multipart/encrypted': if (!isset($content_type['other']['boundary'])) { return false; } @@ -192,7 +194,7 @@ case 'message/rfc822': $obj = new rcube_mime_decode($this->params); - $return->parts[] = $obj->decode($body); + $return->parts[] = $obj->decode($body, false); unset($obj); break;
View file
roundcubemail-1.2.tar.gz/program/lib/Roundcube/rcube_smtp.php
Changed
@@ -459,15 +459,19 @@ } $addresses = array(); + $recipients = preg_replace('/[\s\t]*\r?\n/', '', $recipients); $recipients = rcube_utils::explode_quoted_string(',', $recipients); reset($recipients); foreach ($recipients as $recipient) { $a = rcube_utils::explode_quoted_string(' ', $recipient); foreach ($a as $word) { - if (strpos($word, "@") > 0 && $word[strlen($word)-1] != '"') { - $word = preg_replace('/^<|>$/', '', trim($word)); - if (in_array($word, $addresses) === false) { + $word = trim($word); + $len = strlen($word); + + if ($len && strpos($word, "@") > 0 && $word[$len-1] != '"') { + $word = preg_replace('/^<|>$/', '', $word); + if (!in_array($word, $addresses)) { array_push($addresses, $word); } }
View file
roundcubemail-1.2.tar.gz/program/lib/Roundcube/rcube_washtml.php
Changed
@@ -505,7 +505,7 @@ $this->max_nesting_level = (int) @ini_get('xdebug.max_nesting_level'); // SVG need to be parsed as XML - $this->is_xml = stripos($html, '<svg') !== false || stripos($html, '<?xml') !== false; + $this->is_xml = stripos($html, '<html') === false && stripos($html, '<svg') !== false; $method = $this->is_xml ? 'loadXML' : 'loadHTML'; $options = 0;
View file
roundcubemail-1.2.tar.gz/program/steps/addressbook/export.inc
Changed
@@ -98,6 +98,14 @@ $result = $CONTACTS->list_records(null, 0, true); } +// Give plugins a possibility to implement other output formats or modify the result +$plugin = $RCMAIL->plugins->exec_hook('addressbook_export', array('result' => $result)); +$result = $plugin['result']; + +if ($plugin['abort']) { + exit; +} + // send downlaod headers header('Content-Type: text/x-vcard; charset='.RCUBE_CHARSET); header('Content-Disposition: attachment; filename="contacts.vcf"');
View file
roundcubemail-1.2.tar.gz/program/steps/addressbook/save.inc
Changed
@@ -164,9 +164,12 @@ $_POST['_cid'] = $newcid; } - // define list of cols to be displayed + // refresh contact data for list update and 'show' action + $CONTACT_RECORD = $CONTACTS->get_record($newcid ?: $cid, true); + + // Update contacts list $a_js_cols = array(); - $record = $CONTACTS->get_record($newcid ?: $cid, true); + $record = $CONTACT_RECORD; $record['email'] = reset($CONTACTS->get_col_values('email', $record, true)); $record['name'] = rcube_addressbook::compose_list_name($record);
View file
roundcubemail-1.2.tar.gz/program/steps/addressbook/show.inc
Changed
@@ -28,8 +28,8 @@ $CONTACTS = rcmail_contact_source($source, true); $SOURCE_ID = $source; -// read contact record -if ($cid && ($record = $CONTACTS->get_record($cid, true))) { +// read contact record (or get the one defined in 'save' action) +if ($cid && ($record = ($CONTACT_RECORD ?: $CONTACTS->get_record($cid, true)))) { $OUTPUT->set_env('readonly', $CONTACTS->readonly || $record['readonly']); $OUTPUT->set_env('cid', $record['ID']);
View file
roundcubemail-1.2.tar.gz/program/steps/mail/compose.inc
Changed
@@ -1850,7 +1850,7 @@ 'id' => 'rcmli%s', 'class' => '%s'), html::a(array('href' => '#list', 'rel' => '%s', - 'onclick' => "return ".rcmail_output::JS_OBJECT_NAME.".command('list-adresses','%s',this)"), '%s')); + 'onclick' => "return ".rcmail_output::JS_OBJECT_NAME.".command('list-addresses','%s',this)"), '%s')); foreach ($RCMAIL->get_address_sources(false, true) as $j => $source) { $id = strval(strlen($source['id']) ? $source['id'] : $j);
View file
roundcubemail-1.2.tar.gz/skins/larry/addressbook.css
Changed
@@ -88,7 +88,6 @@ } #directorylist li.addressbook.selected > a { - background-color: transparent; background-position: 6px -791px; }
View file
roundcubemail-1.2.tar.gz/skins/larry/templates/error.html
Changed
@@ -5,7 +5,7 @@ <roundcube:include file="/includes/links.html" /> </head> <roundcube:if condition="!env:framed" /> -<body class="error"> +<roundcube:if condition="env:extwin" /><body class="error extwin"><roundcube:else /><body class="error"><roundcube:endif /> <roundcube:include file="/includes/header.html" /> <roundcube:else /> <body class="error iframe">
View file
roundcubemail.dsc
Changed
@@ -2,7 +2,7 @@ Source: roundcubemail Binary: roundcubemail Architecture: all -Version: 1:1.2~dev20160119-0~kolab1 +Version: 1:1.2~dev20160219-0~kolab1 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
.