fulldecent/cameralife

View on GitHub
sources/Models/User.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php
namespace CameraLife\Models;

/**
 * Class User provides information about the current logged-in user
 *
 * @author    William Entriken <cameralife@phor.net>
 * @access    public
 * @version
 * @copyright 2001-2014 William Entriken
 */
class User extends IndexedModel
{
    /**
     * isLoggedIn
     *
     * (default value: false)
     *
     * @var    bool
     * @access public
     */
    public $isLoggedIn = false;

    /**
     * name
     *
     * (default value: null)
     *
     * @var    mixed
     * @access public
     */
    public $name = null;

    /**
     * email
     *
     * (default value: null)
     *
     * @var    mixed
     * @access public
     */
    public $email = null;

    /**
     * authorizationLevel
     *
     * (default value: 0)
     *
     * @var    int
     * @access public
     */
    public $authorizationLevel = 0;

    /**
     * remoteAddr IP address
     *
     * (default value: null)
     *
     * @var    mixed
     * @access public
     */
    public $remoteAddr = null;

    /**
     * lastOnline
     *
     * (default value: null)
     *
     * @var    mixed
     * @access public
     */
    public $lastOnline = null;

    public function __construct($modelId = null)
    {
        if (is_numeric($modelId)) {
            $result = Database::select('users', '*', "id=$modelId");
            $row = $result->fetchAssoc();
            if ($row) {
                $this->id = $row['id'];
                $this->isLoggedIn = true;
                $this->name = $row['username'];
                $this->remoteAddr = $row['last_ip'];
                $this->authorizationLevel = $row['auth'];
                $this->email = $row['email'];
                $this->lastOnline = $row['last_online'];
            }
        }
    }

    public static function loginWithAccessCode($code)
    {
        // todo: breaks mvc
        global $_SERVER;
        $cookie = bin2hex(random_bytes(16));
        $accessCodeHashed = hash('sha256', $code);

        $result = Database::select('users', '*', "password=:password", null, null, ['password'=>$accessCodeHashed]);
        $row = $result->fetchAssoc();
        if ($row) {
            $retval = new User;
            $retval->id = $row['id'];
            $retval->isLoggedIn = true;
            $retval->name = $row['username'];
            $retval->remoteAddr = $row['last_ip'];
            $retval->authorizationLevel = $row['auth'];
            $retval->email = $row['email'];
            $retval->lastOnline = $row['last_online'];

            Database::update('users', ['cookie'=>$cookie], 'id=' . $retval->id);
            setcookie('cameralifeauth', $cookie, time() + 30000000, '/');
            $_COOKIE['cameralifeauth'] = $cookie;
            return $retval;
        }

        //TODO: breaks MVC
        setcookie('cameralifeauth', $cookie, time() + 30000000, '/');
        $_COOKIE['cameralifeauth'] = $cookie;
        $values['username'] = rand();
        $values['password'] = $accessCodeHashed;
        $values['auth'] = 1;
        $values['cookie'] = $cookie;
        $values['last_online'] = date('Y-m-d H:i:s');
        $values['last_ip'] = $_SERVER["REMOTE_ADDR"];
        $insertId = Database::insert('users', $values);

        $retval = new User;
        $retval->id = $insertId;
        $retval->isLoggedIn = true;
        $retval->remoteAddr = $_SERVER["REMOTE_ADDR"];
        $retval->authorizationLevel = 1;
        $retval->lastOnline = date('Y-m-d H:i:s');
        return $retval;
    }

    public static function logoutCurrentUser()
    {
        //TODO: breaks MVC
        setcookie('cameralifeauth', null, -1);
    }

    public static function currentUser($cookies)
    {
        global $_SERVER;
        $retval = new User;
        $retval->remoteAddr = $_SERVER['REMOTE_ADDR'];
        $cookiename = 'cameralifeauth';

        if (isset($cookies[$cookiename])) {
            $authcookie = $cookies[$cookiename];
            $result = Database::select('users', '*', "cookie='$authcookie'");
            $row = $result->fetchAssoc();
            if ($row) {
                $retval->id = $row['id'];
                $retval->isLoggedIn = true;
                $retval->name = $row['username'];
                $retval->authorizationLevel = $row['auth'];
                $retval->email = $row['email'];
                $retval->lastOnline = $row['last_online'];
            }
        }
        return $retval;
    }

    public function gravitarUrl()
    {
        $md5 = md5($this->email);
        return "//www.gravatar.com/avatar/$md5?s=16&d=identicon";
    }

    public function isAuthorizedForAction($action)
    {
        return false;
    }
}