Aleksander Machniak
2013-06-01 15482bcadef86676864f7d498dc54f7c6a85c524
Improved handling of Reply-To/Bcc addresses of identity in compose form (#1489016)
6 files modified
77 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/js/app.js 37 ●●●●● patch | view | raw | blame | history
program/steps/mail/compose.inc 10 ●●●●● patch | view | raw | blame | history
program/steps/mail/sendmail.inc 7 ●●●●● patch | view | raw | blame | history
skins/classic/functions.js 10 ●●●● patch | view | raw | blame | history
skins/larry/ui.js 12 ●●●●● patch | view | raw | blame | history
CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
- Improved handling of Reply-To/Bcc addresses of identity in compose form (#1489016)
- Fix displaying messages with invalid self-closing HTML tags (#1489137)
- Fix PHP warning when responding to a message with many Return-Path headers (#1489136)
- Added user preference to open all popups as standard windows
program/js/app.js
@@ -3355,12 +3355,45 @@
    if (!show_sig)
      show_sig = this.env.show_sig;
    var cursor_pos, p = -1,
    var i, rx, cursor_pos, p = -1,
      id = obj.options[obj.selectedIndex].value,
      input_message = $("[name='_message']"),
      message = input_message.val(),
      is_html = ($("input[name='_is_html']").val() == '1'),
      sig = this.env.identity;
      sig = this.env.identity,
      delim = this.env.recipients_delimiter,
      headers = ['replyto', 'bcc'];
    // update reply-to/bcc fields with addresses defined in identities
    for (i in headers) {
      var key = headers[i],
        old_val = sig && this.env.identities[sig] ? this.env.identities[sig][key] : '',
        new_val = id && this.env.identities[id] ? this.env.identities[id][key] : '',
        input = $('[name="_'+key+'"]'), input_val = input.val();
      // remove old address(es)
      if (old_val && input_val) {
        rx = new RegExp('\\s*' + RegExp.escape(old_val) + '\\s*');
        input_val = input_val.replace(rx, '');
      }
      // cleanup
      rx = new RegExp(RegExp.escape(delim) + '\\s*' + RegExp(delim), 'g');
      input_val = input_val.replace(rx, delim)
      rx = new RegExp('^\\s*' + RegExp.escape(delim) + '\\s*$');
      input_val = input_val.replace(rx, '')
      // add new address(es)
      if (new_val) {
        rx = new RegExp(RegExp.escape(delim) + '\\s*$');
        if (input_val && !rx.test(input_val))
          input_val += delim + ' ';
        input_val += new_val + delim + ' ';
      }
      if (old_val || new_val)
        input.val(input_val).change();
    }
    // enable manual signature insert
    if (this.env.signatures && this.env.signatures[id]) {
program/steps/mail/compose.inc
@@ -474,6 +474,7 @@
  if (count($MESSAGE->identities))
  {
    $a_signatures = array();
    $identities   = array();
    $separator    = intval($RCMAIL->config->get('reply_mode')) > 0
      && ($compose_mode == RCUBE_COMPOSE_REPLY || $compose_mode == RCUBE_COMPOSE_FORWARD) ? '---' : '-- ';
@@ -511,12 +512,21 @@
        $a_signatures[$identity_id]['text'] = $text;
        $a_signatures[$identity_id]['html'] = $html;
      }
      // add bcc and reply-to
      if (!empty($sql_arr['reply-to'])) {
        $identities[$identity_id]['replyto'] = $sql_arr['reply-to'];
      }
      if (!empty($sql_arr['bcc'])) {
        $identities[$identity_id]['bcc'] = $sql_arr['bcc'];
      }
    }
    $out = $select_from->show($MESSAGE->compose['from']);
    // add signatures to client
    $OUTPUT->set_env('signatures', $a_signatures);
    $OUTPUT->set_env('identities', $identities);
  }
  // no identities, display text input field
  else {
program/steps/mail/sendmail.inc
@@ -391,10 +391,6 @@
if (!empty($mailbcc)) {
  $headers['Bcc'] = $mailbcc;
}
if (!empty($identity_arr['bcc']) && stripos($headers['Bcc'], $identity_arr['bcc']) === false) {
  $headers['Bcc'] = ($headers['Bcc'] ? $headers['Bcc'].', ' : '') . $identity_arr['bcc'];
  $RECIPIENT_COUNT ++;
}
if (($max_recipients = (int) $RCMAIL->config->get('max_recipients')) > 0) {
  if ($RECIPIENT_COUNT > $max_recipients) {
@@ -411,9 +407,6 @@
}
if (!empty($_POST['_replyto'])) {
  $headers['Reply-To'] = rcmail_email_input_format(get_input_value('_replyto', RCUBE_INPUT_POST, TRUE, $message_charset));
}
else if (!empty($identity_arr['reply-to'])) {
  $headers['Reply-To'] = rcmail_email_input_format($identity_arr['reply-to'], false, true);
}
if (!empty($headers['Reply-To'])) {
  $headers['Mail-Reply-To'] = $headers['Reply-To'];
skins/classic/functions.js
@@ -492,14 +492,18 @@
/* Message composing */
init_compose_form: function()
{
  var f, field, fields = ['cc', 'bcc', 'replyto', 'followupto'],
  var f, v, field, fields = ['cc', 'bcc', 'replyto', 'followupto'],
    div = document.getElementById('compose-div'),
    headers_div = document.getElementById('compose-headers-div');
  // Show input elements with non-empty value
  for (f=0; f<fields.length; f++) {
    if ((field = $('#_'+fields[f])) && field.length && field.val() != '')
      rcmail_ui.show_header_form(fields[f]);
    v = fields[f]; field = $('#_'+v);
    if (field.length) {
      field.on('change', {v:v}, function(e) { if (this.value) rcmail_ui.show_header_form(e.data.v); });
      if (field.val() != '')
        rcmail_ui.show_header_form(v);
    }
  }
  // prevent from form data loss when pressing ESC key in IE
skins/larry/ui.js
@@ -111,10 +111,14 @@
        layout_composeview();
        // Show input elements with non-empty value
        var field, fields = ['cc', 'bcc', 'replyto', 'followupto'];
        for (var f=0; f < fields.length; f++) {
          if ((field = $('#_'+fields[f])) && field.length && field.val() != '')
            show_header_row(fields[f], true);
        var f, v, field, fields = ['cc', 'bcc', 'replyto', 'followupto'];
        for (f=0; f < fields.length; f++) {
          v = fields[f]; field = $('#_'+v);
          if (field.length) {
            field.on('change', {v: v}, function(e) { if (this.value) show_header_row(e.data.v, true); });
            if (field.val() != '')
              show_header_row(v, true);
          }
        }
        $('#composeoptionstoggle').click(function(){