diff --git a/include/class.user.php b/include/class.user.php index d23d1e9f1b857bd343f74c42bc7348580703df56..35c5b3919e9b36d2047aac12a88256a5647ea712 100644 --- a/include/class.user.php +++ b/include/class.user.php @@ -38,7 +38,7 @@ class UserModel extends VerySimpleModel { ), 'account' => array( 'list' => false, - 'reverse' => 'ClientAccount.user', + 'reverse' => 'UserAccount.user', ), 'default_email' => array( 'null' => true, @@ -73,6 +73,8 @@ class User extends UserModel { var $_entries; var $_forms; + var $_account; + function __construct($ht) { parent::__construct($ht); // TODO: Make this automatic with select_related() @@ -194,9 +196,11 @@ class User extends UserModel { if (!$this->_entries) { $g = UserForm::getInstance(); $g->setClientId($this->id); + $g->save(); $this->_entries[] = $g; } } + return $this->_entries; } @@ -224,6 +228,67 @@ class User extends UserModel { return $this->_forms; } + + function getAccount() { + // XXX: return $this->account; + + if (!isset($this->_account)) + $this->_account = UserAccount::lookup(array('user_id'=>$this->getId())); + + return $this->_account; + } + + function getAccountStatus() { + + if ($this->getAccount()) + return (string) $this->getAccount()->getStatus(); + + return 'Unregistered'; + } + + function register($vars, &$errors) { + + // user already registered? + if ($this->getAccount()) + return true; + + //Require temp password. + if (!isset($vars['sendemail'])) { + if (!$vars['passwd1']) + $errors['passwd1'] = 'Temp. password required'; + elseif ($vars['passwd1'] && strlen($vars['passwd1'])<6) + $errors['passwd1'] = 'Must be at least 6 characters'; + elseif ($vars['passwd1'] && strcmp($vars['passwd1'], $vars['passwd2'])) + $errors['passwd2'] = 'Password(s) do not match'; + } + + if ($errors) return false; + + $account = UserAccount::create(array('user_id' => $this->getId())); + if (!$account) + return false; + + $account->set('dst', isset($vars['dst'])?1:0); + $account->set('timezone_id', $vars['timezone_id']); + + if ($vars['username'] && strcasecmp($vars['username'], $this->getEmail())) + $account->set('username', $vars['username']); + + if (!$vars['sendemail']) + $account->set('passwd', Password::hash($vars['passwd1'])); + //TODO: else $account->sendActivationEmail(); + + $account->save(true); + + return $account; + } + + //TODO: Add organization support + function getOrg() { + return ''; + } + + function updateInfo($vars, &$errors) { $valid = true; @@ -288,13 +353,20 @@ class User extends UserModel { $this->name = mb_convert_case($this->name, MB_CASE_TITLE); } - if (count($this->dirty)) + if (count($this->dirty)) //XXX: doesn't work?? $this->set('updated', new SqlFunction('NOW')); return parent::save($refetch); } function delete() { - return parent::delete() && $this->default_email->delete(); + //TODO: See about deleting other associated models. + + // Delete email + if ($this->default_email) + $this->default_email->delete(); + + // Delete user + return parent::delete(); } } User::_inspect(); @@ -482,6 +554,100 @@ class UserEmail extends UserEmailModel { } +class UserAccountModel extends VerySimpleModel { + static $meta = array( + 'table' => USER_ACCOUNT_TABLE, + 'pk' => array('id'), + 'joins' => array( + 'user' => array( + 'null' => false, + 'constraint' => array('user_id' => 'UserModel.id') + ), + ), + ); +} + +class UserAccount extends UserAccountModel { + var $_options = null; + var $timezone; + + const CONFIRMED = 0x0001; + const LOCKED = 0x0002; + const PASSWD_RESET_REQUIRED = 0x0004; + + private function hasStatus($flag) { + return 0 !== ($this->get('status') & $flag); + } + + private function clearStatus($flag) { + return $this->set('status', $this->get('status') & ~$flag); + } + + private function setStatus($flag) { + return $this->set('status', $this->get('status') | $flag); + } + + function getStatus() { + return $this->get('status'); + } + + function getInfo() { + return $this->ht; + } + + function __toString() { + return (string) $this->getStatus(); + } + + /* + * This assumes the staff is doing the update + */ + function update($vars, &$errors) { + global $thisstaff; + + + if (!$thisstaff) { + $errors['err'] = 'Access Denied'; + return false; + } + + // TODO: Make sure the username is unique + + if (!$vars['timezone_id']) + $errors['timezone_id'] = 'Time zone required'; + + // Changing password? + if ($vars['passwd1'] || $vars['passwd2']) { + if (!$vars['passwd1']) + $errors['passwd1'] = 'New password required'; + elseif ($vars['passwd1'] && strlen($vars['passwd1'])<6) + $errors['passwd1'] = 'Must be at least 6 characters'; + elseif ($vars['passwd1'] && strcmp($vars['passwd1'], $vars['passwd2'])) + $errors['passwd2'] = 'Password(s) do not match'; + } + + if ($errors) return false; + + $this->set('timezone_id', $vars['timezone_id']); + $this->set('dst', isset($vars['dst']) ? 1 : 0); + + // Make sure the username is not an email. + if ($vars['username'] && Validator::is_email($vars['username'])) + $vars['username'] = ''; + + $this->set('username', $vars['username']); + + if ($vars['passwd1']) { + $this->set('passwd', Passwd::hash($vars['passwd'])); + $this->setStatus(self::CONFIRMED); + } + + return $this->save(true); + } + +} + + /* * Generic user list. */