+ $this->userprefs = $prefs;
+ $this->prop = array_merge($this->prop, $prefs);
+
+ // override timezone settings with client values
+ if ($this->prop['timezone'] == 'auto') {
+ $this->prop['_timezone_value'] = isset($_SESSION['timezone']) ? $_SESSION['timezone'] : $this->prop['_timezone_value'];
+ $this->prop['dst_active'] = $this->userprefs['dst_active'] = isset($_SESSION['dst_active']) ? $_SESSION['dst_active'] : $this->prop['dst_active'];
+ }
+ else if (isset($this->prop['_timezone_value']))
+ unset($this->prop['_timezone_value']);
+ }
+
+
+ /**
+ * Getter for all config options
+ *
+ * @return array Hash array containg all config properties
+ */
+ public function all()
+ {
+ return $this->prop;
+ }
+
+ /**
+ * Special getter for user's timezone offset including DST
+ *
+ * @return float Timezone offset (in hours)
+ */
+ public function get_timezone()
+ {
+ return floatval($this->get('timezone')) + intval($this->get('dst_active'));
+ }
+
+ /**
+ * Return requested DES crypto key.
+ *
+ * @param string $key Crypto key name
+ * @return string Crypto key
+ */
+ public function get_crypto_key($key)
+ {
+ // Bomb out if the requested key does not exist
+ if (!array_key_exists($key, $this->prop)) {
+ raise_error(array(
+ 'code' => 500, 'type' => 'php',
+ 'file' => __FILE__, 'line' => __LINE__,
+ 'message' => "Request for unconfigured crypto key \"$key\""
+ ), true, true);
+ }
+
+ $key = $this->prop[$key];
+
+ // Bomb out if the configured key is not exactly 24 bytes long
+ if (strlen($key) != 24) {
+ raise_error(array(
+ 'code' => 500, 'type' => 'php',
+ 'file' => __FILE__, 'line' => __LINE__,
+ 'message' => "Configured crypto key '$key' is not exactly 24 bytes long"
+ ), true, true);
+ }
+
+ return $key;
+ }
+
+
+ /**
+ * Try to autodetect operating system and find the correct line endings
+ *
+ * @return string The appropriate mail header delimiter
+ */
+ public function header_delimiter()
+ {
+ // use the configured delimiter for headers
+ if (!empty($this->prop['mail_header_delimiter'])) {
+ $delim = $this->prop['mail_header_delimiter'];
+ if ($delim == "\n" || $delim == "\r\n")
+ return $delim;
+ else
+ raise_error(array(
+ 'code' => 500, 'type' => 'php',
+ 'file' => __FILE__, 'line' => __LINE__,
+ 'message' => "Invalid mail_header_delimiter setting"
+ ), true, false);
+ }
+
+ $php_os = strtolower(substr(PHP_OS, 0, 3));
+
+ if ($php_os == 'win')
+ return "\r\n";
+
+ if ($php_os == 'mac')
+ return "\r\n";
+
+ return "\n";
+ }
+
+
+ /**
+ * Return the mail domain configured for the given host
+ *
+ * @param string $host IMAP host
+ * @param boolean $encode If true, domain name will be converted to IDN ASCII
+ * @return string Resolved SMTP host
+ */
+ public function mail_domain($host, $encode=true)
+ {
+ $domain = $host;
+
+ if (is_array($this->prop['mail_domain'])) {
+ if (isset($this->prop['mail_domain'][$host]))
+ $domain = $this->prop['mail_domain'][$host];
+ }
+ else if (!empty($this->prop['mail_domain']))
+ $domain = rcube_parse_host($this->prop['mail_domain']);
+
+ if ($encode)
+ $domain = rcube_idn_to_ascii($domain);
+
+ return $domain;
+ }
+
+
+ /**
+ * Getter for error state
+ *
+ * @return mixed Error message on error, False if no errors
+ */
+ public function get_error()
+ {
+ return empty($this->errors) ? false : join("\n", $this->errors);
+ }
+
+}