Source for file ForgotPass.class.php

Documentation is available at ForgotPass.class.php

  1. <?php
  2. /**
  3.  * R.E. Login 2.0 - Elfelejtett jelszó - class/ForgotPass.class.php
  4.  *
  5.  * Elfelejtett jelszó funkció.<br />
  6.  * <br />
  7.  * <b>Dátum:</b> 2010.04.02.
  8.  *
  9.  * <b>Szerző weboldala:</b> {@link http://rimelek.hu/}<br />
  10.  * <b>Login weblapja:</b> {@link http://rimelek.hu/meghivos-loginrendszer-r-e-login-v2-0 R.E. Login v2.0}
  11.  *
  12.  * @author Takács Ákos (Rimelek), programmer [at] rimelek [dot] hu
  13.  * @copyright Copyright (C) 2010, Takács Ákos
  14.  * @license http://www.gnu.org/licenses/gpl.html
  15.  * @package RELogin
  16.  * @version 2.0
  17.  */
  18.  
  19. /**
  20.  * @ignore
  21.  */
  22. require_once System::getIncLoginDir().'classes/UserList.class.php';
  23.  
  24. /**
  25.  * Elfelejtett jelszó funkció
  26.  *
  27.  * Új jelszó választásához kiküldi e-mailben a linket. <br />
  28.  * <br />
  29.  *
  30.  * <b>Szerző weboldala:</b> {@link http://rimelek.hu/}<br />
  31.  * <b>Login weblapja:</b> {@link http://rimelek.hu/meghivos-loginrendszer-r-e-login-v2-0 R.E. Login v2.0}
  32.  *
  33.  * @author Takács Ákos (Rimelek), programmer [at] rimelek [dot] hu
  34.  * @copyright Copyright (C) 2010, Takács Ákos
  35.  * @license http://www.gnu.org/licenses/gpl.html
  36.  * @package RELogin
  37.  */
  38. class ForgotPass
  39. {
  40.     /**
  41.      * Hibaüzenetek tömbje
  42.      *
  43.      * @var array 
  44.      */
  45.     private static $errors=array();
  46.  
  47.     /**
  48.      * Aktuális idő
  49.      *
  50.      * @see System::getTimeStamp()
  51.      *
  52.      * @var string 
  53.      */
  54.     private static $now '';
  55.  
  56.     /**
  57.      * Elfelejtett jelszó rekord példányok
  58.      *
  59.      * @var IsMySQLClass[] 
  60.      */
  61.     private static $instances array();
  62.  
  63.     /**
  64.      * Privát konstruktor
  65.      * @ignore
  66.      */
  67.     private function  __construct()
  68.     {
  69.     }
  70.  
  71.     /**
  72.      * Használt távlák és mezőinek listája
  73.      *
  74.      * @return array 
  75.      */
  76.     public static function getTables()
  77.     {
  78.         return array(
  79.             Config::DBPREF.'forgotpass as fp' => array('*')
  80.         );
  81.     }
  82.  
  83.     /**
  84.      * Lekérdezi az adatbázisból  aparamétereknek megfelelően
  85.      * az elfelejtett jelszó rekordját.
  86.      *
  87.      * @param int $id Elfelejtett jelszó azonosítója
  88.      * @param string $code Elfelejtett jelszó generált kódja.
  89.      * @return IsMySQLClass 
  90.      */
  91.     public static function getInstance($id$code)
  92.     {
  93.         $id = (int)$id;
  94.         $code mysql_real_escape_string($code);
  95.         if (!isset(self::$instances[$id][$code]))
  96.         {
  97.             self::$instances[$id][$codenew IsMySQLClass(self::getTables());
  98.         
  99.             self::$instances[$id][$code]->init(
  100.                     Config::DBPREF."forgotpass as fp where userid = '$id' and
  101.                     code = '$code'",true);
  102.         }
  103.         return self::$instances[$id][$code];
  104.     }
  105.  
  106.     /**
  107.      * Egy user id-jét, mail címét és jelszavát kérdezi le, ha a $name
  108.      * mező értéke megegyezik a $value -val.
  109.      *
  110.      * @param string $name Mező neve
  111.      * @param mixed $value Mező értéke
  112.      * @return User 
  113.      */
  114.     public static function user($name,$value)
  115.     {
  116.         $user new User(array(
  117.             Config::DBPREF.'users as users' => array('userid','useremail','userpass'))
  118.         );
  119.         $value mysql_real_escape_string($value);
  120.         $user->init(Config::DBPREF."users as users where `$name` = '$value'",true);
  121.         return $user;
  122.     }
  123.  
  124.     /**
  125.      * Új jelszó igénylése
  126.      *
  127.      * $email e-mail címre küldi ki az instrukciókat.
  128.      *
  129.      * @param string $email E-mail cím
  130.      * @return bool Sikeres volt-e a művelet
  131.      */
  132.     public static function request($email)
  133.     {
  134.         $fpe false;
  135.         self::$now System::getTimeStamp();
  136.         $email trim($email);
  137.         if( ($ue UserList::exists('useremail'$email)) and
  138.             !($fpe self::existsEmail($email)))
  139.         {
  140.             $code self::randomCode();
  141.             $user self::user('useremail',$email);
  142.  
  143.             mysql_query("replace ".Config::DBPREF."forgotpass set
  144.                     userid = '".$user->userid."',
  145.                     code = '$code',
  146.                     sendtime = '".self::$now."'");
  147.             self::send($user->userid,$email,$code);
  148.             return true;
  149.         }
  150.         if ($ue)
  151.         {
  152.             self::$errors["24 órán belül csak egyszer kérhetsz új jelszót!";
  153.         }
  154.         else if (!$fpe)
  155.         {
  156.             self::$errors["Nincs ilyen e-mail cím!";
  157.         }
  158.         return count(self::$errors== 0;
  159.     }
  160.  
  161.     /**
  162.      * E-mail címek számolása
  163.      *
  164.      * 24 órán belül csak egyszer lehet jelszó emlékeztetőt kérni.
  165.      * Ez a metódus megszámolja hány kérelem történt 24 órán belül az $email
  166.      * e-mail címre.
  167.      *
  168.      * @param string $email Elenőrízendő email cím
  169.      * @return int Hány darab email cím volt (Értelem szerűen max 1 lehetett)
  170.      */
  171.     public static function existsEmail($email)
  172.     {
  173.         return (int)array_shift(mysql_fetch_row(mysql_query(
  174.                     "select count(fp.userid) from ".
  175.                         Config::DBPREF."forgotpass as fp left join ".
  176.                         Config::DBPREF."users as users
  177.                         on fp.userid = users.userid
  178.                      where users.useremail = '".mysql_real_escape_string($email)."' and
  179.                          timestampdiff(DAY,fp.sendtime, '".self::$now."') = 0 limit 1")));
  180.     }
  181.  
  182.     /**
  183.      * Véletlenszerá hash
  184.      *
  185.      * @return string 
  186.      */
  187.     public static function randomCode()
  188.     {
  189.         return md5(microtime(true).mt_rand());
  190.     }
  191.  
  192.     /**
  193.      * Elfelejtett jelszó link létrehozása
  194.      * 
  195.      * @param int $id User id-je
  196.      * @param string $email User email címe
  197.      * @param string $file Fájlnév, ahova az aktivációs link mutat
  198.      * @return string Elfelejtett jelszó link
  199.      */
  200.     private static function createLink($id,$code,$file=null)
  201.     {
  202.         if ($file === null)
  203.         {
  204.             $file basename(Config::FILE_FORGOTPASS);
  205.         }
  206.         $url parse_url($file);
  207.         $file $url['path'];
  208.         if (isset($url['query']))
  209.         {
  210.             parse_str($url['query'],$get);
  211.         }
  212.  
  213.         $get['id'$id;
  214.         $get['fphash'$code;
  215.         return
  216.             System::getSitedirWithHTTP().$file.
  217.             '?'.http_build_query($get'''&amp;');
  218.     }
  219.  
  220.     /**
  221.      * Link kiküldése a megadott e-mail címre.
  222.      *
  223.      * @param int $id Felhasználó id-je
  224.      * @param string $email Felhasználó e-mail címe
  225.      * @param string $code Random generált kód
  226.      */
  227.     private static function send($id$email$code)
  228.     {
  229.         $link self::createLink($id$code);
  230.         $body =
  231.             "Az új jelszavad a következő linkre kattintva állíthatod be: <br />".PHP_EOL.
  232.             "<a href='$link'>$link</a>";
  233.         System::sendEmail($email'Elfelejtett jelszó'$body);
  234.     }
  235.  
  236.  
  237.     /**
  238.      * Megváltoztatja a felhasználó jelszavát
  239.      *
  240.      * Ha érvényes az id, és hash. valamint megegyezik a két megadott jelszó.
  241.      *
  242.      * @param int $id Felhasználó id-je
  243.      * @param string $code Elfelejtett jelszó hash
  244.      * @param string $pass Új jelszó
  245.      * @param string $repass Új jelszó újra
  246.      * @return bool Sikeres volt-e az új jelszó beállítása
  247.      */
  248.     public static function newPassword($id$code$pass,$repass)
  249.     {
  250.         $fp self::getInstance($id$code);
  251.         if (empty($fp->userid))
  252.         {
  253.             self::$errors['Hibás jelszóváltoztatás kérelem! Talán már meg lett változtatva a jelszó.';
  254.             return false;
  255.         }
  256.  
  257.         //jelszó vizsgálata
  258.         if (strlen($pass($min Config::MINLENGTH_PASSWORD)) {
  259.             self::$errors[=  "A jelszó minimum $min karakter lehet!";
  260.         else if ($pass != $repass){
  261.             self::$errors["A két jelszó nem egyezik!";
  262.         }
  263.  
  264.         if (count(self::$errors)) return false;
  265.     
  266.         $user self::user('userid',$fp->userid);
  267.         $user->userpass Login::getPasswordHash($pass);
  268.         $user->update();
  269.  
  270.         mysql_query("delete from ".Config::DBPREF."forgotpass where userid = '".$fp->userid."'");
  271.  
  272.         return true;
  273.     }
  274.  
  275.     /**
  276.      * Hibaüzenetek tömbje
  277.      *
  278.      * @return array 
  279.      */
  280.     public static function errors()
  281.     {
  282.         return self::$errors;
  283.     }
  284. }
  285. ?>

Documentation generated on Sun, 04 Apr 2010 22:43:40 +0200 by phpDocumentor 1.4.1