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_cachedSQ_SESSION );
  30.     if isset($prefs_are_cached&& $prefs_are_cached{
  31.         sqgetGlobalVar('prefs_cache'$prefs_cacheSQ_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_errorsprintf_("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_errorsprintf_("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($file1024))
  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($pref0$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($key09== '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_errorsprintf_("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_errorsprintf_("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_errorsprintf_("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($filename0600);
  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_errorsprintf_("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_errorsprintf_("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_errorsprintf_("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($filename0600);
  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_errorsprintf_("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($file1024);
  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