Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Práce s uživatelem
- *
- * Class created by Vladislav Domin
- */
- class User
- {
- /**
- * Zaregistruje uživatele do systému
- *
- * @param $email string E-mail
- * @param $fname string Křestní jméno
- * @param $lname string Příjmení
- * @param $pass string Heslo
- *
- * @return bool Úspěšně zaregistrován?
- *
- * @throws Exception Nevyplněná pole
- * @throws Exception Chybný E-mail
- * @throws Exception Slabé heslo
- * @throws Exception Obsazený E-mail
- * @throws Exception Chyba databáze
- */
- public function register($email, $fname, $lname, $pass)
- {
- // Nějaké pole není vyplněno
- if(!isset($email) || !isset($fname) || !isset($lname) || !isset($pass))
- throw new Exception('Některé pole není vyplněno.');
- // Je chybně zadaný E-mail
- if(!$this->isEmail($email))
- throw new Exception('Byl zadán chybný E-mail.');
- // Není dostatečně silné heslo (nesplňuje podmínky)
- if(!$this->checkPasswordInput($pass))
- throw new Exception('Zadané heslo není dostatečně silné.');
- // Je obsazený E-mail
- if(!$this->isEmailAvailable($email))
- throw new Exception('Zadaný E-mail již někdo používá.');
- // Šifrované heslo
- $hash_pass = password_hash($pass, PASSWORD_DEFAULT);
- $registered = $this->db->query('
- INSERT INTO `users` (`email`, `first_name`, `last_name`, `password`, `token`)
- VALUES (?, ?, ?, ?, ?)
- ', $email, $fname, $lname, $hash_pass, $this->generateRandomBase64String());
- // Nefunkční databáze
- if(!$registered)
- throw new Exception('Nastala chyba při komunikaci s databází');
- return true;
- }
- /**
- * Příhlásí uživatele
- *
- * @param $email string E-mail
- * @param $pass string Heslo
- * @param $remember bool Pamatovat heslo?
- *
- * @return bool Úspěšně přihlášen?
- *
- * @throws Exception Nevyplněná pole
- * @throws Exception Chybné heslo
- */
- public function login($email, $pass, $remember)
- {
- // Nějaké pole není vyplněno
- if(!isset($email) || !isset($pass))
- throw new Exception('Některé pole není vyplněno.');
- $user_from_db = $this->db->queryOne('
- SELECT `password`, `token`, `name`
- FROM `users` WHERE `email` = ?
- ', $email);
- // Chybné heslo
- if(!password_verify($pass, $user_from_db['password']))
- throw new Exception('Zadané heslo je chybné');
- // Trvalé přihlášení (uložení tokenu do COOKIES)
- if(isset($remember))
- setcookie('usertoken', $user_from_db['token'], time() + (86400 * 30), '/');
- // Uložení dat do SESSION pro další používání
- $_SESSION['name'] = $user_from_db['name'];
- return true;
- }
- /**
- * Odhlásit uživatele
- *
- * @return bool Úspěšně odhlášeno?
- *
- * @throws Exception Chybějící token
- */
- public function logout()
- {
- // Chybí token
- if(!isset($_COOKIE['usertoken']))
- throw new Exception('Chybí uživatelský token.');
- setcookie('usertoken', '', time()-1, '/');
- }
- /**
- * Je uživatel přihlášený?
- *
- * @return bool Je uživatel přihlášen?
- */
- public function isLogged()
- {
- // Defaultně je přihlášení chybné
- $return = false;
- // Klient vlastní token
- if(isset($_COOKIE['usertoken'])) {
- $user_from_db = $this->db->queryOne('
- SELECT `token`
- FROM `users`
- WHERE `email` = ?
- ', $_COOKIE['useremail']);
- // Je token správný?
- $return = $_COOKIE['usertoken'] == $user_from_db['token'];
- }
- return $return;
- }
- /**
- * Ověří sílu hesla
- *
- * @param $password string Vstupní heslo k ověření
- *
- * @return bool Je dostatečně silné?
- */
- private function checkPasswordInput($password)
- {
- $return = false;
- if(strlen($password) > 6)
- $return = true;
- return $return;
- }
- /**
- * Ověří, jestli je jedná o E-mail
- *
- * @param $input string Vstupní text
- *
- * @return bool Jedná se o E-mail?
- */
- private function isEmail($input)
- {
- return (bool) filter_var($input, FILTER_VALIDATE_EMAIL);
- }
- /**
- * Ověří, jestli je E-mail volný
- *
- * @param $email string Vstupní E-mail k ověření
- *
- * @return bool Je dostupný?
- */
- private function isEmailAvailable($email)
- {
- $return = false;
- if($this->isEmail($email)) {
- $query = $this->db->queryOne('
- SELECT `email`
- FROM `users`
- WHERE `email` = ?
- ', $email);
- // Pokud nebyl E-mail nalezen v databázi, je volný (dotaz vrátil false)
- if(!$query)
- $return = true;
- }
- return $return;
- }
- /**
- * Ošetří výstup
- *
- * @var $string string Vstupní řetezec
- *
- * @return string Ošetřený řetezec
- */
- private function treatOutput($string)
- {
- // ENT_QUOTES zajituje ošetření i jednoduchých uvozovek (')
- return htmlspecialchars($string, ENT_QUOTES);
- }
- /**
- * Vygeneruje náhodný řetezec o n znacích (n = length)
- *
- * @param int $length Délka řetězce
- *
- * @return string Náhodný řetězec
- */
- private function generateRandomBase64String($length = 32)
- {
- /* Je vyžadován MCRYPT_DEV_URANDOM (od PHP 5.3)! */
- $binary_length = (int) ($length * 3 / 4 + 1);
- $random_binary_string = mcrypt_create_iv($binary_length, MCRYPT_DEV_URANDOM);
- $random_base_64_string = base64_encode($random_binary_string);
- return substr($random_base_64_string, 0, $length);
- }
- }
Add Comment
Please, Sign In to add comment