Add is_escaped attribute for html_select and html_textarea (#1488485)

pull/7/head
Aleksander Machniak 13 years ago
parent 5a575b7eb0
commit 0a1dd5b073

@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail CHANGELOG Roundcube Webmail
=========================== ===========================
- Add is_escaped attribute for html_select and html_textarea (#1488485)
- Fix HTML entities handling in HTML editor (#1488483) - Fix HTML entities handling in HTML editor (#1488483)
- Fix listing shared folders on Courier IMAP (#1488466) - Fix listing shared folders on Courier IMAP (#1488466)
- Fix issue where draft auto-save wasn't executed after some inactivity time - Fix issue where draft auto-save wasn't executed after some inactivity time

@ -298,7 +298,7 @@ class html
} }
} }
else { else {
$attrib_arr[] = $key . '="' . self::quote($value) . '"'; $attrib_arr[] = $key . '="' . self::quote($value, true) . '"';
} }
} }
@ -332,16 +332,19 @@ class html
* Replacing specials characters in html attribute value * Replacing specials characters in html attribute value
* *
* @param string $str Input string * @param string $str Input string
* @param bool $validate Enables double quotation prevention
* *
* @return string The quoted string * @return string The quoted string
*/ */
public static function quote($str) public static function quote($str, $validate = false)
{ {
$str = htmlspecialchars($str, ENT_COMPAT, RCMAIL_CHARSET); $str = htmlspecialchars($str, ENT_COMPAT, RCMAIL_CHARSET);
// avoid douple quotation of & // avoid douple quotation of &
// @TODO: get rid of it? // @TODO: get rid of it
if ($validate) {
$str = preg_replace('/&([A-Za-z]{2,6}|#[0-9]{2,4});/', '&\\1;', $str); $str = preg_replace('/&([A-Za-z]{2,6}|#[0-9]{2,4});/', '&\\1;', $str);
}
return $str; return $str;
} }
@ -558,8 +561,8 @@ class html_textarea extends html
unset($this->attrib['value']); unset($this->attrib['value']);
} }
if (!empty($value) && !preg_match('/mce_editor/', $this->attrib['class'])) { if (!empty($value) && empty($this->attrib['is_escaped'])) {
$value = self::quote($value); $value = self::quote($value, true);
} }
return self::tag($this->tagname, $this->attrib, $value, return self::tag($this->tagname, $this->attrib, $value,
@ -633,7 +636,12 @@ class html_select extends html
'selected' => (in_array($option['value'], $select, true) || 'selected' => (in_array($option['value'], $select, true) ||
in_array($option['text'], $select, true)) ? 1 : null); in_array($option['text'], $select, true)) ? 1 : null);
$this->content .= self::tag('option', $attr, self::quote($option['text'])); $option_content = $option['text'];
if (empty($this->attrib['is_escaped'])) {
$option_content = self::quote($option_content, true);
}
$this->content .= self::tag('option', $attr, $option_content);
} }
return parent::show(); return parent::show();

@ -1329,11 +1329,12 @@ class rcmail extends rcube
$attrib = $hook['attribs']; $attrib = $hook['attribs'];
if ($type == 'select') { if ($type == 'select') {
$attrib['is_escaped'] = true;
$select = new html_select($attrib); $select = new html_select($attrib);
// add no-selection option // add no-selection option
if ($attrib['noselection']) { if ($attrib['noselection']) {
$select->add($rcmail->gettext($attrib['noselection']), ''); $select->add(html::quote($rcmail->gettext($attrib['noselection'])), '');
} }
$rcmail->render_folder_tree_select($a_mailboxes, $mbox_name, $attrib['maxlength'], $select, $attrib['realnames']); $rcmail->render_folder_tree_select($a_mailboxes, $mbox_name, $attrib['maxlength'], $select, $attrib['realnames']);
@ -1362,7 +1363,7 @@ class rcmail extends rcube
*/ */
public function folder_selector($p = array()) public function folder_selector($p = array())
{ {
$p += array('maxlength' => 100, 'realnames' => false); $p += array('maxlength' => 100, 'realnames' => false, 'is_escaped' => true);
$a_mailboxes = array(); $a_mailboxes = array();
$storage = $this->get_storage(); $storage = $this->get_storage();
@ -1388,7 +1389,7 @@ class rcmail extends rcube
$select = new html_select($p); $select = new html_select($p);
if ($p['noselection']) { if ($p['noselection']) {
$select->add($p['noselection'], ''); $select->add(html::quote($p['noselection']), '');
} }
$this->render_folder_tree_select($a_mailboxes, $mbox, $p['maxlength'], $select, $p['realnames'], 0, $p); $this->render_folder_tree_select($a_mailboxes, $mbox, $p['maxlength'], $select, $p['realnames'], 0, $p);
@ -1579,7 +1580,7 @@ class rcmail extends rcube
} }
} }
$select->add(str_repeat(' ', $nestLevel*4) . $foldername, $folder['id']); $select->add(str_repeat(' ', $nestLevel*4) . html::quote($foldername), $folder['id']);
if (!empty($folder['folders'])) { if (!empty($folder['folders'])) {
$out .= $this->render_folder_tree_select($folder['folders'], $mbox_name, $maxlength, $out .= $this->render_folder_tree_select($folder['folders'], $mbox_name, $maxlength,

@ -772,6 +772,7 @@ function rcmail_compose_body($attrib)
if ($isHtml) { if ($isHtml) {
$MESSAGE_BODY = htmlentities($MESSAGE_BODY, ENT_NOQUOTES, RCMAIL_CHARSET); $MESSAGE_BODY = htmlentities($MESSAGE_BODY, ENT_NOQUOTES, RCMAIL_CHARSET);
$attrib['class'] = 'mce_editor'; $attrib['class'] = 'mce_editor';
$attrib['is_escaped'] = true;
$textarea = new html_textarea($attrib); $textarea = new html_textarea($attrib);
$out .= $textarea->show($MESSAGE_BODY); $out .= $textarea->show($MESSAGE_BODY);
} }

@ -89,6 +89,7 @@ function rcube_identity_form($attrib)
// Enable TinyMCE editor // Enable TinyMCE editor
if ($IDENTITY_RECORD['html_signature']) { if ($IDENTITY_RECORD['html_signature']) {
$form['signature']['content']['signature']['class'] = 'mce_editor'; $form['signature']['content']['signature']['class'] = 'mce_editor';
$form['signature']['content']['signature']['is_escaped'] = true;
} }
$IDENTITY_RECORD['signature'] = htmlentities($IDENTITY_RECORD['signature'], ENT_NOQUOTES, RCMAIL_CHARSET); $IDENTITY_RECORD['signature'] = htmlentities($IDENTITY_RECORD['signature'], ENT_NOQUOTES, RCMAIL_CHARSET);

Loading…
Cancel
Save