Source for file jAuth.class.php

Documentation is available at jAuth.class.php

  1. <?php
  2. /**
  3. @package    jelix
  4. @subpackage auth
  5. @author     Laurent Jouanneau
  6. @contributor Frédéric Guillot, Antoine Detante, Julien Issler, Dominique Papin
  7. @copyright  2001-2005 CopixTeam, 2005-2008 Laurent Jouanneau, 2007 Frédéric Guillot, 2007 Antoine Detante
  8. @copyright  2007-2008 Julien Issler, 2008 Dominique Papin
  9. *
  10. *  This classes were get originally from an experimental branch of the Copix project (Copix 2.3dev, http://www.copix.org)
  11. *  Few lines of code are still copyrighted 2001-2005 CopixTeam (LGPL licence).
  12. *  Initial author of this Copix classes is Laurent Jouanneau, and this classes were adapted for Jelix by him
  13. @licence  http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  14. */
  15.  
  16. require(JELIX_LIB_PATH.'auth/jIAuthDriver.iface.php');
  17.  
  18. /**
  19.  * This is the main class for authentification process
  20.  * @package    jelix
  21.  * @subpackage auth
  22.  */
  23. class jAuth {
  24.  
  25.     /**
  26.      * Load the configuration of authentification, stored in the auth plugin config
  27.      * @return array 
  28.      */
  29.     protected static function  _getConfig(){
  30.         static $config null;
  31.         if($config == null){
  32.             global $gJCoord;
  33.             $plugin $gJCoord->getPlugin('auth');
  34.             if($plugin === null)
  35.                 throw new jException('jelix~auth.error.plugin.missing');
  36.             $config $plugin->config;
  37.  
  38.             if (!isset($config['session_name'])
  39.                 || $config['session_name'== '')
  40.                 $config['session_name''JELIX_USER';
  41.  
  42.             if (!isset$config['persistant_cookie_path'])
  43.                 ||  $config['persistant_cookie_path'== '')
  44.                 $config['persistant_cookie_path'$GLOBALS['gJConfig']->urlengine['basePath'];
  45.         }
  46.         return $config;
  47.     }
  48.  
  49.     /**
  50.      * return the auth driver
  51.      * @return jIAuthDriver 
  52.      */
  53.     protected static function _getDriver(){
  54.         static $driver null;
  55.         if($driver == null){
  56.             $config self::_getConfig();
  57.             global $gJConfig;
  58.             $db strtolower($config['driver']);
  59.             if(!isset($gJConfig->_pluginsPathList_auth)
  60.                 || !isset($gJConfig->_pluginsPathList_auth[$db])
  61.                 || !file_exists($gJConfig->_pluginsPathList_auth[$db]) )
  62.                 throw new jException('jelix~auth.error.driver.notfound',$db);
  63.  
  64.             require_once($gJConfig->_pluginsPathList_auth[$db].$db.'.auth.php');
  65.             $dname $config['driver'].'AuthDriver';
  66.             $driver new $dname($config[$config['driver']]);
  67.         }
  68.         return $driver;
  69.     }
  70.  
  71.     /**
  72.      * return the value of a parameter of the configuration of the current driver
  73.      * @param string $paramName 
  74.      * @return string the value. null if it doesn't exist
  75.      */
  76.     public static function getDriverParam($paramName{
  77.         $config self::_getConfig();
  78.         $config $config[$config['driver']];
  79.         if(isset($config[$paramName]))
  80.             return $config[$paramName];
  81.         else
  82.             return null;
  83.     }
  84.  
  85.     /**
  86.      * load user data
  87.      *
  88.      * This method returns an object, generated by the driver, and which contains
  89.      * data corresponding to the given login. This method should be called if you want
  90.      * to update data of a user. see updateUser method.
  91.      *
  92.      * @param string $login 
  93.      * @return object the user
  94.      */
  95.     public static function getUser($login){
  96.         $dr self::_getDriver();
  97.         return $dr->getUser($login);
  98.     }
  99.  
  100.     /**
  101.      * Create a new user object
  102.      *
  103.      * You should call this method if you want to create a new user. It returns an object,
  104.      * representing a user. Then you should fill its properties and give it to the saveNewUser
  105.      * method.
  106.      *
  107.      * @param string $login the user login
  108.      * @param string $password the user password (not encrypted)
  109.      * @return object the returned object depends on the driver
  110.      * @since 1.0b2
  111.      */
  112.     public static function createUserObject($login,$password){
  113.         $dr self::_getDriver();
  114.         return $dr->createUserObject($login,$password);
  115.     }
  116.  
  117.     /**
  118.      * Save a new user
  119.      *
  120.      * if the saving has succeed, a AuthNewUser event is sent
  121.      * The given object should have been created by calling createUserObject method :
  122.      *
  123.      * example :
  124.      *  <pre>
  125.      *   $user = jAuth::createUserObject('login','password');
  126.      *   $user->email ='bla@foo.com';
  127.      *   jAuth::saveNewUser($user);
  128.      *  </pre>
  129.      *  the type of $user depends of the driver, so it can have other properties.
  130.      *
  131.      * @param  object $user the user data
  132.      * @return object the user (eventually, with additional data)
  133.      */
  134.     public static function saveNewUser($user){
  135.         $dr self::_getDriver();
  136.         if($dr->saveNewUser($user))
  137.             jEvent::notify ('AuthNewUser'array('user'=>$user));
  138.         return $user;
  139.     }
  140.  
  141.     /**
  142.      * update user data
  143.      *
  144.      * It send a AuthUpdateUser event if the saving has succeed. If you want
  145.      * to change the user password, you must use jAuth::changePassword method
  146.      * instead of jAuth::updateUser method.
  147.      *
  148.      * The given object should have been created by calling getUser method.
  149.      * Example :
  150.      *  <pre>
  151.      *   $user = jAuth::getUser('login');
  152.      *   $user->email ='bla@foo.com';
  153.      *   jAuth::updateUser($user);
  154.      *  </pre>
  155.      *  the type of $user depends of the driver, so it can have other properties.
  156.      *
  157.      * @param object $user  user data
  158.      */
  159.     public static function updateUser($user){
  160.         $dr self::_getDriver();
  161.         if($dr->updateUser($user=== false)
  162.             return false;
  163.  
  164.         if(self::isConnected(&& self::getUserSession()->login === $user->login){
  165.             $config self::_getConfig();
  166.             $_SESSION[$config['session_name']] $user;
  167.         }
  168.         jEvent::notify ('AuthUpdateUser'array('user'=>$user));
  169.         return true;
  170.     }
  171.  
  172.     /**
  173.      * remove a user
  174.      * send first AuthCanRemoveUser event, then if ok, send AuthRemoveUser
  175.      * and then remove the user.
  176.      * @param string $login the user login
  177.      * @return boolean true if ok
  178.      */
  179.     public static function removeUser($login){
  180.         $dr self::_getDriver();
  181.         $eventresp jEvent::notify ('AuthCanRemoveUser'array('login'=>$login));
  182.         foreach($eventresp->getResponse(as $rep){
  183.             if(!isset($rep['canremove']|| $rep['canremove'=== false)
  184.                 return false;
  185.         }
  186.         $user $dr->getUser($login);
  187.         if($dr->removeUser($login)===false)
  188.             return false;
  189.         jEvent::notify ('AuthRemoveUser'array('login'=>$login'user'=>$user));
  190.         if(self::isConnected(&& self::getUserSession()->login === $login)
  191.             self::logout();
  192.         return true;
  193.     }
  194.  
  195.     /**
  196.      * construct the user list
  197.      * @param string $pattern '' for all users
  198.      * @return array array of object
  199.      */
  200.     public static function getUserList($pattern '%'){
  201.         $dr self::_getDriver();
  202.         return $dr->getUserlist($pattern);
  203.     }
  204.  
  205.     /**
  206.      * change a user password
  207.      *
  208.      * @param string $login the login of the user
  209.      * @param string $newpassword the new password (not encrypted)
  210.      * @return boolean true if the change succeed
  211.      */
  212.     public static function changePassword($login$newpassword){
  213.         $dr self::_getDriver();
  214.         if($dr->changePassword($login$newpassword)===false)
  215.             return false;
  216.         if(self::isConnected(&& self::getUserSession()->login === $login){
  217.             $config self::_getConfig();
  218.             $_SESSION[$config['session_name']] self::getUser($login);
  219.         }
  220.         return true;
  221.     }
  222.  
  223.     /**
  224.      * verify that the password correspond to the login
  225.      * @param string $login the login of the user
  226.      * @param string $password the password to test (not encrypted)
  227.      * @return object|false if ok, returns the user as object
  228.      */
  229.     public static function verifyPassword($login$password){
  230.         $dr self::_getDriver();
  231.         return $dr->verifyPassword($login$password);
  232.     }
  233.  
  234.     /**
  235.      * authentificate a user, and create a user in the php session
  236.      * @param string $login the login of the user
  237.      * @param string $password the password to test (not encrypted)
  238.      * @param boolean $persistant (optional) the session must be persistant
  239.      * @return boolean true if authentification is ok
  240.      */
  241.     public static function login($login$password$persistant=false){
  242.  
  243.         $dr self::_getDriver();
  244.         $config self::_getConfig();
  245.  
  246.         if($user $dr->verifyPassword($login$password)){
  247.  
  248.             $eventresp jEvent::notify ('AuthCanLogin'array('login'=>$login'user'=>$user));
  249.             foreach($eventresp->getResponse(as $rep){
  250.                 if(!isset($rep['canlogin']|| $rep['canlogin'=== false)
  251.                     return false;
  252.             }
  253.  
  254.             $_SESSION[$config['session_name']] $user;
  255.             $persistence 0;
  256.  
  257.             // Add a cookie for session persistance, if enabled
  258.             if ($persistant && isset($config['persistant_enable']&& $config['persistant_enable']{
  259.                 if (!isset($config['persistant_crypt_key']|| !isset($config['persistant_cookie_name'])) {
  260.                     throw new jException('jelix~auth.error.persistant.incorrectconfig','persistant_cookie_name, persistant_crypt_key');
  261.                 }
  262.  
  263.                 if (isset($config['persistant_duration']))
  264.                     $persistence $config['persistant_duration']*86400;
  265.                 else
  266.                     $persistence 86400// 24h
  267.                 $persistence += time();
  268.                 $encrypted jCrypt::encrypt(serialize(array($login$password)),$config['persistant_crypt_key']);
  269.                 setcookie($config['persistant_cookie_name'].'[auth]'$encrypted$persistence$config['persistant_cookie_path']);
  270.             }
  271.  
  272.             jEvent::notify ('AuthLogin'array('login'=>$login'persistence'=>$persistence));
  273.             return true;
  274.         }else
  275.             return false;
  276.     }
  277.  
  278.     /**
  279.      * Check if persistant session is enabled in config
  280.      * @return boolean true if persistant session in enabled
  281.      */
  282.     public static function isPersistant(){
  283.         $config self::_getConfig();
  284.         if(!isset($config['persistant_enable']))
  285.             return false;
  286.         else
  287.             return $config['persistant_enable'];
  288.     }
  289.  
  290.     /**
  291.      * logout a user and delete the user in the php session
  292.      */
  293.     public static function logout(){
  294.  
  295.         $config self::_getConfig();
  296.         jEvent::notify ('AuthLogout'array('login'=>$_SESSION[$config['session_name']]->login));
  297.         $_SESSION[$config['session_name']] new jAuthDummyUser();
  298.         try jAcl::clearCache()catch(Exception $e{}
  299.         try jAcl2::clearCache()catch(Exception $e{}
  300.  
  301.         if(isset($config['persistant_enable']&& $config['persistant_enable']){
  302.             if(!isset($config['persistant_cookie_name']))
  303.                 throw new jException('jelix~auth.error.persistant.incorrectconfig','persistant_cookie_name, persistant_crypt_key');
  304.             setcookie($config['persistant_cookie_name'].'[auth]'''time(3600$config['persistant_cookie_path']);
  305.         }
  306.     }
  307.  
  308.     /**
  309.      * Says if the user is connected
  310.      * @return boolean 
  311.      */
  312.     public static function isConnected(){
  313.         $config self::_getConfig();
  314.         return (isset($_SESSION[$config['session_name']]&& $_SESSION[$config['session_name']]->login != '');
  315.     }
  316.  
  317.    /**
  318.     * return the user stored in the php session
  319.     * @return object the user data
  320.     */
  321.     public static function getUserSession (){
  322.         $config self::_getConfig();
  323.         if (isset ($_SESSION[$config['session_name']]))
  324.             $_SESSION[$config['session_name']] new jAuthDummyUser();
  325.         return $_SESSION[$config['session_name']];
  326.     }
  327.  
  328.     /**
  329.      * generate a password with random letter or number
  330.      * @param int $length the length of the generated password
  331.      * @return string the generated password
  332.      */
  333.     public static function getRandomPassword($length 10){
  334.         $letter "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  335.         $pass '';
  336.         for($i=0;$i<$length;$i++)
  337.             $pass .= $letter[rand(0,61)];
  338.         return $pass;
  339.     }
  340. }

Documentation generated on Thu, 22 Mar 2012 22:14:03 +0100 by phpDocumentor 1.4.3