ceskyDJ

User.php

Oct 2nd, 2016
347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.20 KB | None | 0 0
  1. <?php
  2.  
  3. /**
  4.  * Práce s uživatelem
  5.  *
  6.  * Class created by Vladislav Domin
  7.  */
  8. class User
  9. {
  10.  
  11.     /**
  12.      * Zaregistruje uživatele do systému
  13.      *
  14.      * @param $email string E-mail
  15.      * @param $fname string Křestní jméno
  16.      * @param $lname string Příjmení
  17.      * @param $pass string Heslo
  18.      *
  19.      * @return bool Úspěšně zaregistrován?
  20.      *
  21.      * @throws Exception Nevyplněná pole
  22.      * @throws Exception Chybný E-mail
  23.      * @throws Exception Slabé heslo
  24.      * @throws Exception Obsazený E-mail
  25.      * @throws Exception Chyba databáze
  26.      */
  27.     public function register($email, $fname, $lname, $pass)
  28.     {
  29.         // Nějaké pole není vyplněno
  30.         if(!isset($email) || !isset($fname) || !isset($lname) || !isset($pass))
  31.             throw new Exception('Některé pole není vyplněno.');
  32.  
  33.         // Je chybně zadaný E-mail
  34.         if(!$this->isEmail($email))
  35.             throw new Exception('Byl zadán chybný E-mail.');
  36.  
  37.         // Není dostatečně silné heslo (nesplňuje podmínky)
  38.         if(!$this->checkPasswordInput($pass))
  39.             throw new Exception('Zadané heslo není dostatečně silné.');
  40.  
  41.         // Je obsazený E-mail
  42.         if(!$this->isEmailAvailable($email))
  43.             throw new Exception('Zadaný E-mail již někdo používá.');
  44.  
  45.         // Šifrované heslo
  46.         $hash_pass = password_hash($pass, PASSWORD_DEFAULT);
  47.  
  48.         $registered = $this->db->query('
  49.            INSERT INTO `users` (`email`, `first_name`, `last_name`, `password`, `token`)
  50.            VALUES (?, ?, ?, ?, ?)
  51.          ', $email, $fname, $lname, $hash_pass, $this->generateRandomBase64String());
  52.  
  53.         // Nefunkční databáze
  54.         if(!$registered)
  55.             throw new Exception('Nastala chyba při komunikaci s databází');
  56.  
  57.         return true;
  58.     }
  59.  
  60.     /**
  61.      * Příhlásí uživatele
  62.      *
  63.      * @param $email string E-mail
  64.      * @param $pass string Heslo
  65.      * @param $remember bool Pamatovat heslo?
  66.      *
  67.      * @return bool Úspěšně přihlášen?
  68.      *
  69.      * @throws Exception Nevyplněná pole
  70.      * @throws Exception Chybné heslo
  71.      */
  72.     public function login($email, $pass, $remember)
  73.     {
  74.         // Nějaké pole není vyplněno
  75.         if(!isset($email) || !isset($pass))
  76.             throw new Exception('Některé pole není vyplněno.');
  77.  
  78.         $user_from_db = $this->db->queryOne('
  79.            SELECT `password`, `token`, `name`
  80.            FROM `users` WHERE `email` = ?
  81.          ', $email);
  82.  
  83.         // Chybné heslo
  84.         if(!password_verify($pass, $user_from_db['password']))
  85.             throw new Exception('Zadané heslo je chybné');
  86.  
  87.         // Trvalé přihlášení (uložení tokenu do COOKIES)
  88.         if(isset($remember))
  89.             setcookie('usertoken', $user_from_db['token'], time() + (86400 * 30), '/');
  90.  
  91.         // Uložení dat do SESSION pro další používání
  92.         $_SESSION['name'] = $user_from_db['name'];
  93.  
  94.         return true;
  95.     }
  96.  
  97.     /**
  98.      * Odhlásit uživatele
  99.      *
  100.      * @return bool Úspěšně odhlášeno?
  101.      *
  102.      * @throws Exception Chybějící token
  103.      */
  104.     public function logout()
  105.     {
  106.         // Chybí token
  107.         if(!isset($_COOKIE['usertoken']))
  108.             throw new Exception('Chybí uživatelský token.');
  109.  
  110.         setcookie('usertoken', '', time()-1, '/');
  111.     }
  112.  
  113.     /**
  114.      * Je uživatel přihlášený?
  115.      *
  116.      * @return bool Je uživatel přihlášen?
  117.      */
  118.     public function isLogged()
  119.     {
  120.         // Defaultně je přihlášení chybné
  121.         $return = false;
  122.  
  123.         // Klient vlastní token
  124.         if(isset($_COOKIE['usertoken'])) {
  125.             $user_from_db = $this->db->queryOne('
  126.                SELECT `token`
  127.                FROM `users`
  128.                WHERE `email` = ?
  129.              ', $_COOKIE['useremail']);
  130.  
  131.             // Je token správný?
  132.             $return = $_COOKIE['usertoken'] == $user_from_db['token'];
  133.         }
  134.  
  135.         return $return;
  136.     }
  137.  
  138.     /**
  139.      * Ověří sílu hesla
  140.      *
  141.      * @param $password string Vstupní heslo k ověření
  142.      *
  143.      * @return bool Je dostatečně silné?
  144.      */
  145.     private function checkPasswordInput($password)
  146.     {
  147.         $return = false;
  148.  
  149.         if(strlen($password) > 6)
  150.             $return = true;
  151.  
  152.         return $return;
  153.     }
  154.  
  155.     /**
  156.      * Ověří, jestli je jedná o E-mail
  157.      *
  158.      * @param $input string Vstupní text
  159.      *
  160.      * @return bool Jedná se o E-mail?
  161.      */
  162.     private function isEmail($input)
  163.     {
  164.         return (bool) filter_var($input, FILTER_VALIDATE_EMAIL);
  165.     }
  166.  
  167.     /**
  168.      * Ověří, jestli je E-mail volný
  169.      *
  170.      * @param $email string Vstupní E-mail k ověření
  171.      *
  172.      * @return bool Je dostupný?
  173.      */
  174.     private function isEmailAvailable($email)
  175.     {
  176.         $return = false;
  177.  
  178.         if($this->isEmail($email)) {
  179.  
  180.             $query = $this->db->queryOne('
  181.                SELECT `email`
  182.                FROM `users`
  183.                WHERE `email` = ?
  184.              ', $email);
  185.  
  186.             // Pokud nebyl E-mail nalezen v databázi, je volný (dotaz vrátil false)
  187.             if(!$query)
  188.                 $return = true;
  189.         }
  190.  
  191.         return $return;
  192.     }
  193.  
  194.     /**
  195.      * Ošetří výstup
  196.      *
  197.      * @var $string string Vstupní řetezec
  198.      *
  199.      * @return string Ošetřený řetezec
  200.      */
  201.     private function treatOutput($string)
  202.     {
  203.         // ENT_QUOTES zajituje ošetření i jednoduchých uvozovek (')
  204.         return htmlspecialchars($string, ENT_QUOTES);
  205.     }
  206.  
  207.     /**
  208.      * Vygeneruje náhodný řetezec o n znacích (n = length)
  209.      *
  210.      * @param int $length Délka řetězce
  211.      *
  212.      * @return string Náhodný řetězec
  213.      */
  214.     private function generateRandomBase64String($length = 32)
  215.     {
  216.         /* Je vyžadován MCRYPT_DEV_URANDOM (od PHP 5.3)! */
  217.  
  218.         $binary_length = (int) ($length * 3 / 4 + 1);
  219.         $random_binary_string = mcrypt_create_iv($binary_length, MCRYPT_DEV_URANDOM);
  220.         $random_base_64_string = base64_encode($random_binary_string);
  221.  
  222.         return substr($random_base_64_string, 0, $length);
  223.     }
  224. }
Add Comment
Please, Sign In to add comment