<?php
class usersModel extends A_Model {
protected $errorMsg = array();
protected $dbh = null;
protected $hashalgo = null;
protected $hashoptions = null;
public function __construct($dbh){
$this->dbh = $dbh;
$this->addField(new A_Model_Field('id'));
$this->addField(new A_Model_Field('firstname'));
$this->addField(new A_Model_Field('lastname'));
$this->addField(new A_Model_Field('username'));
$this->addField(new A_Model_Field('password'));
$this->addField(new A_Model_Field('email'));
$this->addField(new A_Model_Field('active'));
$this->addField(new A_Model_Field('access'));
$this->addRule(new A_Rule_Numeric('id', 'invalid ID'), 'id');
$this->addRule(new A_Rule_Regexp('/^[A-Za-z ]+$/', 'firstname', 'The first name is not valid'), 'firstname');
$this->addRule(new A_Rule_Regexp('/^[0-9a-zA-Z\-\ \\\']+$/', 'lastname', 'The last name is not valid'), 'lastname');
$this->addRule(new A_Rule_Length(3, 15, 'username', 'The username must be between 3 to 25 characters'), 'username');
$this->addRule(new A_Rule_Regexp('/^[A-Za-z0-9]+$/D', 'username', 'The username is not valid'), 'username');
$this->addRule(new A_Rule_Regexp('/[0-9a-zA-Z\-\_\@\.]+/', 'password', 'The password is not valid'), 'password');
$this->addRule(new A_Rule_Email('email', 'This is not a valid email adress'), 'email');
$this->addRule(new A_Rule_Regexp('[^01]', 'active', 'active'), 'active');
$this->addRule(new A_Rule_Regexp('/[~0-9a-zA-Z\-\_\|]/', 'access', 'User access'), 'access');
// create a Gateway style datasource for the Model
$this->datasource = new A_Db_Tabledatagateway($this->dbh, 'blog_users', 'id');
// set the field names for the Gateway to fetch
$this->datasource->columns($this->getFieldNames());
// set up hash options
$this->hashalgo = PASSWORD_BCRYPT;
$this->hashoptions = array('cost' => 7);
}
public function getStatus(){
return $this->status;
}
public function save(){
// if doesn't exist yet create
if(!$this->get('id')){
// insert new
} else {
// update
}
}
public function findAll(){
$this->errorMsg = array();;
$result = $this->datasource->find(array('active'=>1));
if($result->numRows() > 0) {
return $result->fetchAll();
} else {
return array();
}
}
public function findAuthorlist(){
$this->errorMsg = array();;
$result = $this->datasource->columns('id,username')->find(array('active'=>1 ));
if($result->numRows() > 0) {
return $result->fetchAll();
} else {
return array();
}
}
public function find($id){
$result = $this->datasource->find(array('id'=>$id));
if($result->numRows() > 0) {
return $result->current();
} else {
return array();
}
}
public function findByEmail($email) {
$result = $this->datasource->find(array('email'=>$email));
if($result->numRows() > 0) {
return $result->current();
} else {
return array();
}
}
public function delete($id){}
public function login($username, $password) {
$this->errorMsg = array();
$result = $this->datasource->find(array('username'=>$username, 'active'=>1));
if($result->numRows() > 0) {
$row = $result->current();
if ($row['username'] == $username) {
if (password_verify($password, $row['password'])) {
if (password_needs_rehash($row['password'], $this->hashalgo, $this->hashoptions)) {
$hash = password_hash($password, $this->hashalgo, $this->hashoptions);
$this->updateUser( array('password' => $hash) , $row['id']);
}
return $row;
} else {
$this->errorMsg[] = 'Username and/or password are not correct.';
}
} else {
$this->errorMsg[] = 'Username and/or password are not correct.';
}
} else {
$this->errorMsg[] = $this->datasource->getErrorMsg();
}
return array();
}
public function loginErrorMsg() {
return $this->errorMsg;
}
public function isUsernameAvailable($username){
$result = $this->datasource->find(array('username'=>$username));
if($result->numRows() > 0) {
return false;
} else {
return true;
}
}
public function isEmailAvailable($email){
$result = $this->datasource->find(array('email'=>$email));
if($result->numRows() > 0) {
return false;
} else {
return true;
}
}
public function usernameMatchesEmail($username, $email){
$result = $this->datasource->find(array('username'=>$username ,'email'=>$email));
if($result->numRows() > 0) {
return true;
} else {
return false;
}
}
public function isAccountActivated($username, $email){
$result = $this->datasource->find(array('username'=>$username ,'active'=>1));
if($result->numRows() > 0) {
return true;
} else {
return false;
}
}
public function isPasswordCorrect($username, $password){
$result = $this->datasource->find(array('username'=>$username, 'active'=>1));
if($result->numRows() > 0) {
$row = $result->current();
if (password_verify($password, $row['password'])) {
return true;
} else {
return false;
}
} else {
return false;
}
}
public function createActivationkey(){
return md5(uniqid(rand(), true));
}
public function insertUser($username, $password, $email, $activationkey){
$user_hash = password_hash($password, $this->hashalgo, $this->hashoptions);
$this->datasource->insert(array(
'username' =>$username,
'email' =>$email,
'password' =>$user_hash,
'activationkey' =>$activationkey
));
}
public function updateUser( $data = array(), $id ) {
$result = $this->datasource->update($data, array('id'=>$id));
if($result->numRows() > 0) {
$this->errorMsg[] = 'User data updated';
return true;
} else {
$this->errorMsg[] = 'User data could not be updated';
return false;
}
}
public function activate($activationkey){
if(!empty($activationkey)){
// Is there a row with this activationkey
$result = $this->datasource->find(array('activationkey'=>$activationkey));
// If there is activate the acount
if($result->numRows() > 0) {
$row = $result->current();
// set to active and remove key
$result = $this->datasource->update(array('active'=>'1', 'activationkey'=>''), array('id'=>$row['id']));
if($result->numRows() > 0) {
$this->errorMsg[] = 'Your account is now activated. ';
return true;
}
}
// something went wrong..
$this->errorMsg[] = 'We could not activate the account. ';
} else {
// User is on activate page but the activation key is missing. What to show?
$this->errorMsg[] = 'The activation key is missing. ';
}
return false;
}
public function insertResetkey($resetkey, $id) {
$data = array('resetkey'=>$resetkey);
$result = $this->datasource->update($data, array('id'=>$id));
if($result->numRows() > 0) {
$this->errorMsg[] = 'User resetkey inserted';
return true;
} else {
$this->errorMsg[] = 'User resetkey could not be inserted';
return false;
}
}
public function findResetkey($resetkey){
$result = $this->datasource->find(array('resetkey'=>$resetkey));
if($result->numRows() > 0) {
return true;
} else {
return false;
}
}
public function resetPassword($password, $resetkey){
$result = $this->datasource->find(array('resetkey'=>$resetkey));
if($result->numRows() > 0) {
$user_hash = password_hash($password, $this->hashalgo, $this->hashoptions);
// insert new password and delete resetkey
$result = $this->datasource->update(array('password'=>$user_hash, 'resetkey'=>''), array('resetkey'=>$resetkey));
return true;
} else {
$this->errorMsg[] = 'Password could not be reset';
return false;
}
}
}
|