Source for file file_prefs.php

Documentation is available at file_prefs.php

  1. <?php
  2.  
  3. /**
  4.  * file_prefs.php
  5.  *
  6.  * This contains functions for manipulating user preferences in files
  7.  *
  8.  * @copyright 1999-2020 The SquirrelMail Project Team
  9.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  10.  * @version $Id: file_prefs.php 14845 2020-01-07 08:09:34Z pdontthink $
  11.  * @package squirrelmail
  12.  * @subpackage prefs
  13.  * @since 1.2.5
  14.  */
  15.  
  16.  
  17. /**
  18.  * Check the preferences into the session cache.
  19.  *
  20.  * @param string $data_dir 
  21.  * @param string $username 
  22.  *
  23.  * @since 1.1.3
  24.  *
  25.  */
  26. function cachePrefValues($data_dir, $username) {
  27.     global $prefs_are_cached, $prefs_cache;
  28.  
  29.     sqgetGlobalVar('prefs_are_cached', $prefs_are_cached, SQ_SESSION );
  30.     if ( isset($prefs_are_cached) && $prefs_are_cached) {
  31.         sqgetGlobalVar('prefs_cache', $prefs_cache, SQ_SESSION );
  32. //        sm_print_r($prefs_cache);
  33. //        exit;
  34.         return;
  35.     }
  36.  
  37.     sqsession_unregister('prefs_cache');
  38.     sqsession_unregister('prefs_are_cached');
  39.  
  40.     /* Calculate the filename for the user's preference file */
  41.     $filename = getHashedFile($username, $data_dir, "$username.pref");
  42.  
  43.     /* A call to checkForPrefs here should take eliminate the need for */
  44.     /* this to be called throughout the rest of the SquirrelMail code. */
  45.     checkForPrefs($data_dir, $username, $filename);
  46.  
  47.     /* Make sure that the preference file now DOES exist. */
  48.     if (!file_exists($filename)) {
  49.         logout_error( sprintf( _("Preference file, %s, does not exist. Log out, and log back in to create a default preference file."), $filename)  );
  50.         exit;
  51.     }
  52.  
  53.     /* Open the file, or else display an error to the user. */
  54.     if(!$file = @fopen($filename, 'r'))
  55.     {
  56.         logout_error( sprintf( _("Preference file, %s, could not be opened. Contact your system administrator to resolve this issue."), $filename) );
  57.         exit;
  58.     }
  59.  
  60.     /* Read in the preferences. */
  61.     $highlight_num = 0;
  62.     while (! feof($file)) {
  63.         $pref = '';
  64.         /* keep reading a pref until we reach an eol (\n (or \r for macs)) */
  65.         while($read = fgets($file, 1024))
  66.         {
  67.                 $pref .= $read;
  68.                 if(strpos($read,"\n") || strpos($read,"\r"))
  69.                         break;
  70.         }
  71.         $pref = trim($pref);
  72.         $equalsAt = strpos($pref, '=');
  73.         if ($equalsAt > 0) {
  74.             $key = substr($pref, 0, $equalsAt);
  75.             $value = substr($pref, $equalsAt + 1);
  76.  
  77. //FIXME: this code is not in db_prefs.php that I can see
  78.             /* this is to 'rescue' old-style highlighting rules. */
  79.             if (substr($key, 0, 9) == 'highlight') {
  80.                 $key = 'highlight' . $highlight_num;
  81.                 $highlight_num ++;
  82.             }
  83.  
  84. //FIXME: this code is not in db_prefs.php that I can see
  85.             if ($value != '') {
  86.                 $prefs_cache[$key] = $value;
  87.             }
  88.         }
  89.     }
  90.     fclose($file);
  91.  
  92.     $prefs_are_cached = TRUE;
  93.  
  94.     sqsession_register($prefs_cache, 'prefs_cache');
  95.     sqsession_register($prefs_are_cached, 'prefs_are_cached');
  96. }
  97.  
  98. /**
  99.  * Return the value for the desired preference.
  100.  *
  101.  * @param string $data_dir  data directory
  102.  * @param string $username  user name
  103.  * @param string $pref_name preference name
  104.  * @param string $default   (since 1.2.0) default preference value
  105.  *
  106.  * @return mixed 
  107.  *
  108.  */
  109. function getPref($data_dir, $username, $pref_name, $default = '') {
  110.     global $prefs_cache;
  111.  
  112.     $temp = array(&$username, &$pref_name);
  113.     $result = do_hook('get_pref_override', $temp);
  114.     if (is_null($result)) {
  115.         cachePrefValues($data_dir, $username);
  116.         if (isset($prefs_cache[$pref_name])) {
  117.             $result = $prefs_cache[$pref_name];
  118.         } else {
  119. //FIXME: is there a justification for having two prefs hooks so close?  who uses them?
  120.             $temp = array(&$username, &$pref_name);
  121.             $result = do_hook('get_pref', $temp);
  122.             if (is_null($result)) {
  123.                 $result = $default;
  124.             }
  125.         }
  126.     }
  127.     return ($result);
  128. }
  129.  
  130. /**
  131.  * Save the preferences for this user.
  132.  *
  133.  * @param string $data_dir data directory
  134.  * @param string $username user name
  135.  *
  136.  * @since 1.1.3
  137.  *
  138.  */
  139. function savePrefValues($data_dir, $username) {
  140.     global $prefs_cache;
  141.  
  142.     $filename = getHashedFile($username, $data_dir, "$username.pref");
  143.  
  144.     /* Open the file for writing, or else display an error to the user. */
  145.     if(!$file = @fopen($filename.'.tmp', 'w'))
  146.     {
  147.         logout_error( sprintf( _("Preference file, %s, could not be opened. Contact your system administrator to resolve this issue."), $filename.'.tmp') );
  148.         exit;
  149.     }
  150.     foreach ($prefs_cache as $Key => $Value) {
  151.         if (isset($Value)) {
  152.             if ( sq_fwrite($file, $Key . '=' . $Value . "\n") === FALSE ) {
  153.                logout_error( sprintf( _("Preference file, %s, could not be written. Contact your system administrator to resolve this issue.") , $filename . '.tmp') );
  154.                exit;
  155.             }
  156.         }
  157.     }
  158.     fclose($file);
  159.     if (! @copy($filename . '.tmp',$filename) ) {
  160.         logout_error( sprintf( _("Preference file, %s, could not be copied from temporary file, %s. Contact your system administrator to resolve this issue."), $filename, $filename . '.tmp') );
  161.         exit;
  162.     }
  163.     @unlink($filename . '.tmp');
  164.     @chmod($filename, 0600);
  165.     sqsession_register($prefs_cache , 'prefs_cache');
  166. }
  167.  
  168. /**
  169.  * Remove a preference for the current user.
  170.  *
  171.  * @param string $data_dir  data directory
  172.  * @param string $username  user name
  173.  * @param string $pref_name preference name
  174.  *
  175.  */
  176. function removePref($data_dir, $username, $pref_name) {
  177.     global $prefs_cache;
  178.  
  179.     cachePrefValues($data_dir, $username);
  180.  
  181.     if (isset($prefs_cache[$pref_name])) {
  182.         unset($prefs_cache[$pref_name]);
  183.     }
  184.  
  185.     savePrefValues($data_dir, $username);
  186. }
  187.  
  188. /**
  189.  * Set the desired preference setting ($pref_name)
  190.  * to whatever is in $value.
  191.  *
  192.  * @param string $data_dir  data directory
  193.  * @param string $username  user name
  194.  * @param string $pref_name preference name
  195.  * @param mixed  $value     preference value
  196.  *
  197.  */
  198. function setPref($data_dir, $username, $pref_name, $value) {
  199.     global $prefs_cache;
  200.  
  201.     cachePrefValues($data_dir, $username);
  202.     if (isset($prefs_cache[$pref_name]) && ($prefs_cache[$pref_name] == $value)) {
  203.         return;
  204.     }
  205.  
  206.     if ($value === '') {
  207.         removePref($data_dir, $username, $pref_name);
  208.         return;
  209.     }
  210.  
  211.     $prefs_cache[$pref_name] = $value;
  212.     savePrefValues($data_dir, $username);
  213. }
  214.  
  215. /**
  216.  * Check for a preferences file. If one can not be found, create it.
  217.  *
  218.  * @param string $data_dir data directory
  219.  * @param string $username user name
  220.  * @param string $filename (since 1.2.0) preference file name.
  221.  *                          (OPTIONAL; default is an empty string,
  222.  *                          in which case the file name is
  223.  *                          automatically detected)
  224.  *
  225.  */
  226. function checkForPrefs($data_dir, $username, $filename = '') {
  227.     /* First, make sure we have the filename. */
  228.     if ($filename == '') {
  229.         $filename = getHashedFile($username, $data_dir, "$username.pref");
  230.     }
  231.  
  232.     /* Then, check if the file exists. */
  233.     if (!@file_exists($filename) ) {
  234.  
  235.         /* If it does not exist, check for default_prefs */
  236.  
  237.         /* First, check legacy locations: data dir */
  238.         if(substr($data_dir,-1) != '/') {
  239.             $data_dir .= '/';
  240.         }
  241.         $default_pref = $data_dir . 'default_pref';
  242.  
  243.         /* or legacy location: internal data dir */
  244.         if (!@file_exists($default_pref)) {
  245.             $default_pref = SM_PATH . 'data/default_pref';
  246.         }
  247.  
  248.         /* If no legacies, check where we'd expect it to be located:
  249.          * under config/ */
  250.         if (!@file_exists($default_pref)) {
  251.             $default_pref = SM_PATH . 'config/default_pref';
  252.         }
  253.  
  254.         /* If a default_pref file found, try to copy it, if none found,
  255.          * try to create an empty one. If that fails, report an error.
  256.          */
  257.         if (
  258.             ( is_readable($default_pref) && !@copy($default_pref, $filename) ) ||
  259.             !@touch($filename)
  260.         ) {
  261.             $uid = 'that the web server is running as';
  262.             if (function_exists('posix_getuid')){
  263.                 $user_data = posix_getpwuid(posix_getuid());
  264.                 $uid = $user_data['name'];
  265.             }
  266.             $errTitle = _("Could not create initial preference file!");
  267.             $errString = $errTitle . "\n" .
  268.                        sprintf( _("%s should be writable by the user %s."), $data_dir, $uid ) . "\n" .
  269.                        _("Please contact your system administrator and report this error.") ;
  270.             logout_error( $errString, $errTitle );
  271.             exit;
  272.         }
  273.     }
  274. }
  275.  
  276. /**
  277.  * Write the User Signature.
  278.  *
  279.  * @param string $data_dir data directory
  280.  * @param string $username user name
  281.  * @param integer $number  (since 1.2.5) identity number.
  282.  *                          (before 1.2.5., this parameter
  283.  *                          was used for the signature value)
  284.  * @param string $value    (since 1.2.5) signature value
  285.  *
  286.  */
  287. function setSig($data_dir, $username, $number, $value) {
  288.     // Limit signature size to 64KB (database BLOB limit)
  289.     if (strlen($value)>65536) {
  290.         error_option_save(_("Signature is too big."));
  291.         return;
  292.     }
  293.     $filename = getHashedFile($username, $data_dir, "$username.si$number");
  294.     /* Open the file for writing, or else display an error to the user. */
  295.     if(!$file = @fopen("$filename.tmp", 'w')) {
  296.         logout_error( sprintf( _("Signature file, %s, could not be opened. Contact your system administrator to resolve this issue."), $filename . '.tmp') );
  297.         exit;
  298.     }
  299.     if ( sq_fwrite($file, $value) === FALSE ) {
  300.        logout_error( sprintf( _("Signature file, %s, could not be written. Contact your system administrator to resolve this issue.") , $filename . '.tmp'));
  301.        exit;
  302.     }
  303.     fclose($file);
  304.     if (! @copy($filename . '.tmp',$filename) ) {
  305.        logout_error( sprintf( _("Signature file, %s, could not be copied from temporary file, %s. Contact your system administrator to resolve this issue."), $filename, $filename . '.tmp') );
  306.        exit;
  307.     }
  308.     @unlink($filename . '.tmp');
  309.     @chmod($filename, 0600);
  310.  
  311. }
  312.  
  313. /**
  314.  * Get the signature.
  315.  *
  316.  * @param string  $data_dir data directory
  317.  * @param string  $username user name
  318.  * @param integer $number   (since 1.2.5) identity number
  319.  *
  320.  * @return string signature
  321.  *
  322.  */
  323. function getSig($data_dir, $username, $number) {
  324.     $filename = getHashedFile($username, $data_dir, "$username.si$number");
  325.     $sig = '';
  326.     if (file_exists($filename)) {
  327.         /* Open the file, or else display an error to the user. */
  328.         if(!$file = @fopen($filename, 'r'))
  329.         {
  330.             logout_error( sprintf( _("Signature file, %s, could not be opened. Contact your system administrator to resolve this issue."), $filename) );
  331.             exit;
  332.         }
  333.         while (!feof($file)) {
  334.             $sig .= fgets($file, 1024);
  335.         }
  336.         fclose($file);
  337.     }
  338.     return $sig;
  339. }
  340.  
  341. // vim: et ts=4

Documentation generated on Mon, 13 Jan 2020 04:22:28 +0100 by phpDocumentor 1.4.3