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

Documentation generated on Wed, 07 Sep 2011 13:46:43 +0200 by phpDocumentor 1.4.3