Source for file prefs.php

Documentation is available at prefs.php

  1. <?php
  2.  
  3. /**
  4.  * prefs.php
  5.  *
  6.  * This contains functions for filebased user prefs locations
  7.  *
  8.  * @copyright 1999-2020 The SquirrelMail Project Team
  9.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  10.  * @version $Id: prefs.php 14840 2020-01-07 07:42:38Z pdontthink $
  11.  * @package squirrelmail
  12.  * @subpackage prefs
  13.  */
  14.  
  15. /** Include global.php */
  16. require_once(SM_PATH 'functions/global.php');
  17. require_once(SM_PATH 'functions/plugin.php');
  18.  
  19. /** include this for error messages */
  20. include_once(SM_PATH 'functions/display_messages.php');
  21.  
  22. sqgetGlobalVar('prefs_cache'$prefs_cacheSQ_SESSION );
  23. sqgetGlobalVar('prefs_are_cached'$prefs_are_cachedSQ_SESSION );
  24.  
  25. $rg ini_get('register_globals');
  26.  
  27. if !sqsession_is_registered('prefs_are_cached'||
  28.      !isset($prefs_cache||
  29.      !is_array($prefs_cache)
  30.    {
  31.     $prefs_are_cached false;
  32.     $prefs_cache array();
  33. }
  34.  
  35. $prefs_backend do_hook_function('prefs_backend');
  36. if (isset($prefs_backend&& !empty($prefs_backend&& file_exists(SM_PATH $prefs_backend)) {
  37.     require_once(SM_PATH $prefs_backend);
  38. elseif (isset($prefs_dsn&& !empty($prefs_dsn)) {
  39.     require_once(SM_PATH 'functions/db_prefs.php');
  40. else {
  41.     require_once(SM_PATH 'functions/file_prefs.php');
  42. }
  43.  
  44. /* Hashing functions */
  45.  
  46. /**
  47.  * Given a username and datafilename, this will return the path to the
  48.  * hashed location of that datafile.
  49.  *
  50.  * @param string username the username of the current user
  51.  * @param string dir the squirrelmail datadir
  52.  * @param string datafile the name of the file to open
  53.  * @param bool hash_seach default true
  54.  * @return string the hashed location of datafile
  55.  */
  56. function getHashedFile($username$dir$datafile$hash_search true{
  57.     global $dir_hash_level;
  58.  
  59.     /* Remove trailing slash from $dir if found */
  60.     if (substr($dir-1== '/'{
  61.         $dir substr($dir0strlen($dir1);
  62.     }
  63.  
  64.     /* Compute the hash for this user and extract the hash directories. */
  65.     $hash_dirs computeHashDirs($username);
  66.  
  67.     /* First, get and make sure the full hash directory exists. */
  68.     $real_hash_dir getHashedDir($username$dir$hash_dirs);
  69.  
  70.     /* Set the value of our real data file, after we've removed unwanted characters. */
  71.     $datafile str_replace('/''_'$datafile);
  72.     $result "$real_hash_dir/$datafile";
  73.  
  74.     /* Check for this file in the real hash directory. */
  75.     if ($hash_search && !@file_exists($result)) {
  76.         /* First check the base directory, the most common location. */
  77.         if (@file_exists("$dir/$datafile")) {
  78.             rename("$dir/$datafile"$result);
  79.  
  80.         /* Then check the full range of possible hash directories. */
  81.         else {
  82.             $check_hash_dir $dir;
  83.             for ($h 0$h 4++$h{
  84.                 $check_hash_dir .= '/' $hash_dirs[$h];
  85.                 if (@is_readable("$check_hash_dir/$datafile")) {
  86.                     rename("$check_hash_dir/$datafile"$result);
  87.                     break;
  88.                 }
  89.             }
  90.         }
  91.     }
  92.  
  93.     /* Return the full hashed datafile path. */
  94.     return ($result);
  95. }
  96.  
  97. /**
  98.  * Helper function for getHashedFile(), given a username returns
  99.  * the hashed dir for that username.
  100.  *
  101.  * NOTE that the hashed dir will be created if it doesn't
  102.  * already exist.
  103.  *
  104.  * @param string username the username of the current user
  105.  * @param string dir the squirrelmail datadir
  106.  * @param string hash_dirs default ''
  107.  * @return the path to the hash dir for username
  108.  */
  109. function getHashedDir($username$dir$hash_dirs ''{
  110.     global $dir_hash_level;
  111.  
  112.     /* Remove trailing slash from $dir if found */
  113.     if (substr($dir-1== '/'{
  114.         $dir substr($dir0strlen($dir1);
  115.     }
  116.  
  117.     /* If necessary, populate the hash dir variable. */
  118.     if ($hash_dirs == ''{
  119.         $hash_dirs computeHashDirs($username);
  120.     }
  121.  
  122.     /* Make sure the full hash directory exists. */
  123.     $real_hash_dir $dir;
  124.     for ($h 0$h $dir_hash_level++$h{
  125.         $real_hash_dir .= '/' $hash_dirs[$h];
  126.         if (!@is_dir($real_hash_dir)) {
  127.             if (!@mkdir($real_hash_dir0770)) {
  128.                 echo sprintf(_("Error creating directory %s.")$real_hash_dir'<br />' .
  129.                      _("Could not create hashed directory structure!""<br />\n" .
  130.                      _("Please contact your system administrator and report this error.""<br />\n";
  131.                 exit;
  132.             }
  133.         }
  134.     }
  135.  
  136.     /* And return that directory. */
  137.     return ($real_hash_dir);
  138. }
  139.  
  140. /**
  141.  * Helper function for getHashDir which does the actual hash calculation.
  142.  *
  143.  * Uses a crc32 algorithm by default, but if you put
  144.  * the following in config/config_local.php, you can
  145.  * force md5 instead:
  146.  *    $hash_dirs_use_md5 = TRUE;
  147.  *
  148.  * You may also specify that if usernames are in full
  149.  * email address format, the domain part (beginning
  150.  * with "@") be stripped before calculating the crc
  151.  * or md5.  Do that by putting the following in
  152.  * config/config_local.php:
  153.  *    $hash_dirs_strip_domain = TRUE;
  154.  *
  155.  * @param string username the username to calculate the hash dir for
  156.  *
  157.  * @return array a list of hash dirs for this username
  158.  *
  159.  * @since 1.2.0
  160.  *
  161.  */
  162. function computeHashDirs($username{
  163.  
  164.     global $hash_dirs_use_md5$hash_dirs_strip_domain;
  165.     static $hash_dirs array();
  166.  
  167.  
  168.     // strip domain from username
  169.     if ($hash_dirs_strip_domain)
  170.         $user substr($username0strpos($username'@'));
  171.     else
  172.         $user $username;
  173.  
  174.  
  175.     // have we already calculated it?
  176.     if (!empty($hash_dirs[$user]))
  177.         return $hash_dirs[$user];
  178.  
  179.  
  180.     if ($hash_dirs_use_md5{
  181.  
  182.         $hash md5($user);
  183.  
  184.     else {
  185.  
  186.         /* Compute the hash for this user and extract the hash directories.  */
  187.         /* Note that the crc32() function result will be different on 32 and */
  188.         /* 64 bit systems, thus the hack below.                              */
  189.         $crc crc32($user);
  190.         if ($crc 0x80000000{
  191.             $crc ^= 0xffffffff;
  192.             $crc += 1;
  193.         }
  194.         $hash base_convert($crc1016);
  195.     }   
  196.  
  197.  
  198.     $my_hash_dirs array();
  199.     for ($h 0$h 4++ $h{
  200.         $my_hash_dirs[substr($hash$h1);
  201.     }
  202.  
  203.     // Return our array of hash directories
  204.     $hash_dirs[$user$my_hash_dirs;
  205.     return ($my_hash_dirs);
  206. }

Documentation generated on Mon, 13 Jan 2020 04:25:10 +0100 by phpDocumentor 1.4.3