Mercurial > hg > rc2
diff program/lib/Roundcube/rcube_output.php @ 0:4681f974d28b
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:52:31 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/program/lib/Roundcube/rcube_output.php Thu Jan 04 15:52:31 2018 -0500 @@ -0,0 +1,286 @@ +<?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> | + | Author: Aleksander Machniak <alec@alec.pl> | + +-----------------------------------------------------------------------+ +*/ + +/** + * Class for output generation + * + * @package Framework + * @subpackage View + */ +abstract class rcube_output +{ + public $browser; + + protected $app; + protected $config; + protected $charset = RCUBE_CHARSET; + protected $env = array(); + protected $skins = array(); + + + /** + * Object constructor + */ + public function __construct() + { + $this->app = rcube::get_instance(); + $this->config = $this->app->config; + $this->browser = new rcube_browser(); + } + + /** + * Magic getter + */ + public function __get($var) + { + // allow read-only access to some members + switch ($var) { + case 'env': return $this->env; + case 'skins': return $this->skins; + case 'charset': return $this->charset; + } + + return null; + } + + /** + * Setter for output charset. + * To be specified in a meta tag and sent as http-header + * + * @param string $charset Charset name + */ + public function set_charset($charset) + { + $this->charset = $charset; + } + + /** + * Getter for output charset + * + * @return string Output charset name + */ + public function get_charset() + { + return $this->charset; + } + + /** + * Set environment variable + * + * @param string $name Property name + * @param mixed $value Property value + */ + public function set_env($name, $value) + { + $this->env[$name] = $value; + } + + /** + * Environment variable getter. + * + * @param string $name Property name + * + * @return mixed Property value + */ + public function get_env($name) + { + return $this->env[$name]; + } + + /** + * Delete all stored env variables and commands + */ + public function reset() + { + $this->env = array(); + } + + /** + * Invoke display_message command + * + * @param string $message Message to display + * @param string $type Message type [notice|confirm|error] + * @param array $vars Key-value pairs to be replaced in localized text + * @param boolean $override Override last set message + * @param int $timeout Message displaying time in seconds + */ + abstract function show_message($message, $type = 'notice', $vars = null, $override = true, $timeout = 0); + + /** + * Redirect to a certain url. + * + * @param mixed $p Either a string with the action or url parameters as key-value pairs + * @param int $delay Delay in seconds + */ + abstract function redirect($p = array(), $delay = 1); + + /** + * Send output to the client. + */ + abstract function send(); + + /** + * Send HTTP headers to prevent caching a page + */ + public function nocacheing_headers() + { + if (headers_sent()) { + return; + } + + header("Expires: ".gmdate("D, d M Y H:i:s")." GMT"); + header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + + // We need to set the following headers to make downloads work using IE in HTTPS mode. + if ($this->browser->ie && rcube_utils::https_check()) { + header('Pragma: private'); + header("Cache-Control: private, must-revalidate"); + } + else { + header("Cache-Control: private, no-cache, no-store, must-revalidate, post-check=0, pre-check=0"); + header("Pragma: no-cache"); + } + } + + /** + * Send header with expire date 30 days in future + * + * @param int Expiration time in seconds + */ + public function future_expire_header($offset = 2600000) + { + if (headers_sent()) { + return; + } + + header("Expires: " . gmdate("D, d M Y H:i:s", time()+$offset) . " GMT"); + header("Cache-Control: max-age=$offset"); + header("Pragma: "); + } + + /** + * Send browser compatibility/security/etc. headers + */ + public function common_headers() + { + if (headers_sent()) { + return; + } + + // Unlock IE compatibility mode + if ($this->browser->ie) { + header('X-UA-Compatible: IE=edge'); + } + + // Request browser to disable DNS prefetching (CVE-2010-0464) + header("X-DNS-Prefetch-Control: off"); + + // send CSRF and clickjacking protection headers + if ($xframe = $this->app->config->get('x_frame_options', 'sameorigin')) { + header('X-Frame-Options: ' . $xframe); + } + } + + /** + * Show error page and terminate script execution + * + * @param int $code Error code + * @param string $message Error message + */ + public function raise_error($code, $message) + { + // STUB: to be overloaded by specific output classes + fputs(STDERR, "Error $code: $message\n"); + exit(-1); + } + + /** + * Create an edit field for inclusion on a form + * + * @param string $col Field name + * @param string $value Field value + * @param array $attrib HTML element attributes for the field + * @param string $type HTML element type (default 'text') + * + * @return string HTML field definition + */ + public static function get_edit_field($col, $value, $attrib, $type = 'text') + { + static $colcounts = array(); + + $fname = '_'.$col; + $attrib['name'] = $fname . ($attrib['array'] ? '[]' : ''); + $attrib['class'] = trim($attrib['class'] . ' ff_' . $col); + + if ($type == 'checkbox') { + $attrib['value'] = '1'; + $input = new html_checkbox($attrib); + } + else if ($type == 'textarea') { + $attrib['cols'] = $attrib['size']; + $input = new html_textarea($attrib); + } + else if ($type == 'select') { + $input = new html_select($attrib); + $input->add('---', ''); + $input->add(array_values($attrib['options']), array_keys($attrib['options'])); + } + else if ($type == 'password' || $attrib['type'] == 'password') { + $input = new html_passwordfield($attrib); + } + else { + if ($attrib['type'] != 'text' && $attrib['type'] != 'hidden') { + $attrib['type'] = 'text'; + } + $input = new html_inputfield($attrib); + } + + // use value from post + if (isset($_POST[$fname])) { + $postvalue = rcube_utils::get_input_value($fname, rcube_utils::INPUT_POST, true); + $value = $attrib['array'] ? $postvalue[intval($colcounts[$col]++)] : $postvalue; + } + + $out = $input->show($value); + + return $out; + } + + /** + * Convert a variable into a javascript object notation + * + * @param mixed $input Input value + * @param boolean $pretty Enable JSON formatting + * + * @return string Serialized JSON string + */ + public static function json_serialize($input, $pretty = false) + { + $input = rcube_charset::clean($input); + $options = 0; + + if ($pretty) { + $options |= JSON_PRETTY_PRINT; + } + + // sometimes even using rcube_charset::clean() the input contains invalid UTF-8 sequences + // that's why we have @ here + return @json_encode($input, $options); + } +}