ceskyDJ icon

User.php

ceskyDJ | PRO | 10/02/16 05:35:48 PM UTC | 0 ⭐ | 256 👁️ | Never ⏰ | []
PHP |

6.2 KB

|

None

|

0 👍

/

0 👎

<?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);
    }
}

Comments