- /**
- * db_prefs.php
- *
- * Copyright (c) 1999-2001 The Squirrelmail Development Team
- * Licensed under the GNU GPL. For full terms see the file COPYING.
- *
- * This contains functions for manipulating user preferences
- * stored in a database, accessed though the Pear DB layer.
- *
- * To use this instead of the regular prefs.php, create a
- * database as described below, and replace prefs.php
- * with this file.
- *
- * Database:
- * ---------
- *
- * The preferences table should have tree columns:
- * username char \ primary
- * prefkey char / key
- * prefval blob
- *
- * CREATE TABLE userprefs (user CHAR(32) NOT NULL DEFAULT '',
- * prefkey CHAR(64) NOT NULL DEFAULT '',
- * prefval BLOB NOT NULL DEFAULT '',
- * primary key (user,prefkey));
- *
- * Configuration of databasename, username and password is done
- * by changing $DSN below.
- *
- * $Id$
- */
-
- require_once('DB.php');
-
- class dbPrefs {
- var $DSN = 'mysql://user@host/database';
- var $table = 'userprefs';
-
- var $dbh = NULL;
- var $error = NULL;
-
- var $default = Array('chosen_theme' => '../themes/default_theme.php',
- 'show_html_default' => '0');
-
- function dbPrefs() {
- $this->open();
- }
-
- function open() {
- if(isset($this->dbh)) return true;
- $dbh = DB::connect($this->DSN, true);
-
- if(DB::isError($dbh) || DB::isWarning($dbh)) {
+
+/**
+ * db_prefs.php
+ *
+ * This contains functions for manipulating user preferences
+ * stored in a database, accessed though the Pear DB layer.
+ *
+ * Database:
+ *
+ * The preferences table should have three columns:
+ * user char \ primary
+ * prefkey char / key
+ * prefval blob
+ *
+ * CREATE TABLE userprefs (user CHAR(128) NOT NULL DEFAULT '',
+ * prefkey CHAR(64) NOT NULL DEFAULT '',
+ * prefval BLOB NOT NULL DEFAULT '',
+ * primary key (user,prefkey));
+ *
+ * Configuration of databasename, username and password is done
+ * by using conf.pl or the administrator plugin
+ *
+ * @copyright 1999-2009 The SquirrelMail Project Team
+ * @license http://opensource.org/licenses/gpl-license.php GNU Public License
+ * @version $Id$
+ * @package squirrelmail
+ * @subpackage prefs
+ * @since 1.1.3
+ */
+
+/** @ignore */
+if (!defined('SM_PATH')) define('SM_PATH','../');
+
+/** Unknown database */
+define('SMDB_UNKNOWN', 0);
+/** MySQL */
+define('SMDB_MYSQL', 1);
+/** PostgreSQL */
+define('SMDB_PGSQL', 2);
+
+/**
+ * don't display errors (no code execution in functions/*.php).
+ * will handle error in dbPrefs class.
+ */
+@include_once('DB.php');
+
+global $prefs_are_cached, $prefs_cache;
+
+/**
+ * @ignore
+ */
+function cachePrefValues($username) {
+ global $prefs_are_cached, $prefs_cache;
+
+ sqgetGlobalVar('prefs_are_cached', $prefs_are_cached, SQ_SESSION );
+ if ($prefs_are_cached) {
+ sqgetGlobalVar('prefs_cache', $prefs_cache, SQ_SESSION );
+ return;
+ }
+
+ sqsession_unregister('prefs_cache');
+ sqsession_unregister('prefs_are_cached');
+
+ $db = new dbPrefs;
+ if(isset($db->error)) {
+ printf( _("Preference database error (%s). Exiting abnormally"),
+ $db->error);
+ exit;
+ }
+
+ $db->fillPrefsCache($username);
+ if (isset($db->error)) {
+ printf( _("Preference database error (%s). Exiting abnormally"),
+ $db->error);
+ exit;
+ }
+
+ $prefs_are_cached = true;
+
+ sqsession_register($prefs_cache, 'prefs_cache');
+ sqsession_register($prefs_are_cached, 'prefs_are_cached');
+}
+
+/**
+ * Class used to handle connections to prefs database and operations with preferences
+ *
+ * @package squirrelmail
+ * @subpackage prefs
+ * @since 1.1.3
+ *
+ */
+class dbPrefs {
+ /**
+ * Table used to store preferences
+ * @var string
+ */
+ var $table = 'userprefs';
+
+ /**
+ * Field used to store owner of preference
+ * @var string
+ */
+ var $user_field = 'user';
+
+ /**
+ * Field used to store preference name
+ * @var string
+ */
+ var $key_field = 'prefkey';
+
+ /**
+ * Field used to store preference value
+ * @var string
+ */
+ var $val_field = 'prefval';
+
+ /**
+ * Database connection object
+ * @var object
+ */
+ var $dbh = NULL;
+
+ /**
+ * Error messages
+ * @var string
+ */
+ var $error = NULL;
+
+ /**
+ * Database type (SMDB_* constants)
+ * Is used in setKey().
+ * @var integer
+ */
+ var $db_type = SMDB_UNKNOWN;
+
+ /**
+ * Default preferences
+ * @var array
+ */
+ var $default = Array('theme_default' => 0,
+ 'show_html_default' => '0');
+
+ /**
+ * Preference owner field size
+ * @var integer
+ * @since 1.5.1
+ */
+ var $user_size = 128;
+
+ /**
+ * Preference key field size
+ * @var integer
+ * @since 1.5.1
+ */
+ var $key_size = 64;
+
+ /**
+ * Preference value field size
+ * @var integer
+ * @since 1.5.1
+ */
+ var $val_size = 65536;
+
+
+
+ /**
+ * initialize the default preferences array.
+ *
+ */
+ function dbPrefs() {
+ // Try and read the default preferences file.
+ $default_pref = SM_PATH . 'config/default_pref';
+ if (@file_exists($default_pref)) {
+ if ($file = @fopen($default_pref, 'r')) {
+ while (!feof($file)) {
+ $pref = fgets($file, 1024);
+ $i = strpos($pref, '=');
+ if ($i > 0) {
+ $this->default[trim(substr($pref, 0, $i))] = trim(substr($pref, $i + 1));
+ }
+ }
+ fclose($file);
+ }
+ }
+ }
+
+ /**
+ * initialize DB connection object
+ *
+ * @return boolean true, if object is initialized
+ *
+ */
+ function open() {
+ global $prefs_dsn, $prefs_table;
+ global $prefs_user_field, $prefs_key_field, $prefs_val_field;
+ global $prefs_user_size, $prefs_key_size, $prefs_val_size;
+
+ /* test if Pear DB class is available and freak out if it is not */
+ if (! class_exists('DB')) {
+ // same error also in abook_database.php
+ $this->error = _("Could not include PEAR database functions required for the database backend.") . "\n";
+ $this->error .= sprintf(_("Is PEAR installed, and is the include path set correctly to find %s?"),
+ 'DB.php') . "\n";
+ $this->error .= _("Please contact your system administrator and report this error.");
+ return false;
+ }
+
+ if(isset($this->dbh)) {
+ return true;
+ }
+
+ if (preg_match('/^mysql/', $prefs_dsn)) {
+ $this->db_type = SMDB_MYSQL;
+ } elseif (preg_match('/^pgsql/', $prefs_dsn)) {
+ $this->db_type = SMDB_PGSQL;
+ }
+
+ if (!empty($prefs_table)) {
+ $this->table = $prefs_table;
+ }
+ if (!empty($prefs_user_field)) {
+ $this->user_field = $prefs_user_field;
+ }
+ if (!empty($prefs_key_field)) {
+ $this->key_field = $prefs_key_field;
+ }
+ if (!empty($prefs_val_field)) {
+ $this->val_field = $prefs_val_field;
+ }
+ if (!empty($prefs_user_size)) {
+ $this->user_size = (int) $prefs_user_size;
+ }
+ if (!empty($prefs_key_size)) {
+ $this->key_size = (int) $prefs_key_size;
+ }
+ if (!empty($prefs_val_size)) {
+ $this->val_size = (int) $prefs_val_size;
+ }
+ $dbh = DB::connect($prefs_dsn, true);
+
+ if(DB::isError($dbh)) {