- /**
- ** 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)) {
- $this->error = DB::errorMessage($dbh);
+
+/**
+ * db_prefs.php
+ *
+ * This contains functions for manipulating user preferences
+ * stored in a database, accessed through the Pear DB layer
+ * or PDO, the latter taking precedence if available.
+ *
+ * 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
+ *
+ * Three settings that control PDO behavior can be specified in
+ * config/config_local.php if needed:
+ * boolean $disable_pdo SquirrelMail uses PDO by default to access the
+ * user preferences and address book databases, but
+ * setting this to TRUE will cause SquirrelMail to
+ * fall back to using Pear DB instead.
+ * boolean $pdo_show_sql_errors When database errors are encountered,
+ * setting this to TRUE causes the actual
+ * database error to be displayed, otherwise
+ * generic errors are displayed, preventing
+ * internal database information from being
+ * exposed. This should be enabled only for
+ * debugging purposes.
+ * string $pdo_identifier_quote_char By default, SquirrelMail will quote
+ * table and field names in database
+ * queries with what it thinks is the
+ * appropriate quote character for the
+ * database type being used (backtick
+ * for MySQL (and thus MariaDB), double
+ * quotes for all others), but you can
+ * override the character used by
+ * putting it here, or tell SquirrelMail
+ * NOT to quote identifiers by setting
+ * this to "none"
+ *
+ * @copyright 1999-2020 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);
+
+/**
+ * Needs either PDO or the DB functions
+ * Don't display errors here. (no code execution in functions/*.php).
+ * will handle error in dbPrefs class.
+ */
+global $use_pdo, $disable_pdo;
+if (empty($disable_pdo) && class_exists('PDO'))
+ $use_pdo = TRUE;
+else
+ $use_pdo = FALSE;
+
+if (!$use_pdo)
+ @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;
+
+ /**
+ * Character used to quote database table
+ * and field names
+ * @var string
+ */
+ var $identifier_quote_char = '';
+
+ /**
+ * Default preferences
+ * @var array
+ */
+ var $default = Array('theme_default' => 0,
+ 'include_self_reply_all' => '0',
+ 'do_not_reply_to_self' => '1',
+ '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;
+
+
+
+ /**
+ * Constructor (PHP5 style, required in some future version of PHP)
+ * initialize the default preferences array.
+ *
+ */
+ function __construct() {
+ // 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);
+ }
+ }
+ }
+
+ /**
+ * Constructor (PHP4 style, kept for compatibility reasons)
+ * initialize the default preferences array.
+ *
+ */
+ function dbPrefs() {
+ self::__construct();
+ }
+
+ /**
+ * initialize DB connection object
+ *
+ * @return boolean true, if object is initialized
+ *
+ */
+ function open() {
+ global $prefs_dsn, $prefs_table, $use_pdo, $pdo_identifier_quote_char;
+ global $prefs_user_field, $prefs_key_field, $prefs_val_field;
+ global $prefs_user_size, $prefs_key_size, $prefs_val_size;
+
+ /* test if PDO or Pear DB classes are available and freak out if necessary */
+ if (!$use_pdo && !class_exists('DB')) {
+ // same error also in abook_database.php
+ $error = _("Could not find or include PHP PDO or PEAR database functions required for the database backend.") . "\n";
+ $error .= sprintf(_("PDO should come preinstalled with PHP version 5.1 or higher. Otherwise, is PEAR installed, and is the include path set correctly to find %s?"), 'DB.php') . "\n";
+ $error .= _("Please contact your system administrator and report this error.");