From fd7af0d49b7113721e6b86eb96eccea3b78362c0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Fri, 27 Jun 2008 15:55:55 +0000 Subject: [PATCH] User/guest classes now have base class --- .gitattributes | 7 +- .../{class_Guest.php => class_BaseUser.php} | 146 ++---- inc/classes/main/user/class_User.php | 436 ------------------ inc/classes/main/user/guest/.htaccess | 1 + inc/classes/main/user/guest/class_Guest.php | 117 +++++ inc/classes/main/user/user/.htaccess | 1 + inc/classes/main/user/user/class_User.php | 188 ++++++++ 7 files changed, 356 insertions(+), 540 deletions(-) rename inc/classes/main/user/{class_Guest.php => class_BaseUser.php} (65%) delete mode 100644 inc/classes/main/user/class_User.php create mode 100644 inc/classes/main/user/guest/.htaccess create mode 100644 inc/classes/main/user/guest/class_Guest.php create mode 100644 inc/classes/main/user/user/.htaccess create mode 100644 inc/classes/main/user/user/class_User.php diff --git a/.gitattributes b/.gitattributes index 2fe2f5b..5763efc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -558,8 +558,11 @@ inc/classes/main/template/image/class_ImageTemplateEngine.php -text inc/classes/main/template/web/.htaccess -text inc/classes/main/template/web/class_WebTemplateEngine.php -text inc/classes/main/user/.htaccess -text -inc/classes/main/user/class_Guest.php -text -inc/classes/main/user/class_User.php -text +inc/classes/main/user/class_BaseUser.php -text +inc/classes/main/user/guest/.htaccess -text +inc/classes/main/user/guest/class_Guest.php -text +inc/classes/main/user/user/.htaccess -text +inc/classes/main/user/user/class_User.php -text inc/classes/middleware/.htaccess -text inc/classes/middleware/class_BaseMiddleware.php -text inc/classes/middleware/compressor/.htaccess -text diff --git a/inc/classes/main/user/class_Guest.php b/inc/classes/main/user/class_BaseUser.php similarity index 65% rename from inc/classes/main/user/class_Guest.php rename to inc/classes/main/user/class_BaseUser.php index 73ecb5a..632f3ea 100644 --- a/inc/classes/main/user/class_Guest.php +++ b/inc/classes/main/user/class_BaseUser.php @@ -1,10 +1,10 @@ * @version 0.0.0 - * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software + * @copyright Copyright (c) 2007, 2008 Roland Haeder, this is free software * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * @@ -21,7 +21,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class Guest extends BaseFrameworkSystem implements ManageableGuest, Registerable { +class BaseUser extends BaseFrameworkSystem { /** * Instance of the database result */ @@ -37,79 +37,21 @@ class Guest extends BaseFrameworkSystem implements ManageableGuest, Registerable */ private $email = ""; - // Exceptions - const EXCEPTION_USERNAME_NOT_FOUND = 0x170; - const EXCEPTION_USER_EMAIL_NOT_FOUND = 0x171; - const EXCEPTION_USER_PASS_MISMATCH = 0x172; - /** * Protected constructor * * @param $className Name of the class * @return void */ - protected function __construct ($className = "") { - // Is the class name empty? Then this is not a specialized user class - if (empty($className)) $className = __CLASS__; - + protected function __construct ($className) { // Call parent constructor parent::__construct($className); - // Set part description - $this->setObjectDescription("Generic user class"); - - // Create unique ID number - $this->generateUniqueId(); - // Clean up a little $this->removeNumberFormaters(); $this->removeSystemArray(); } - /** - * Creates an instance of this user class by a provided username. This - * factory method will check if the username is already taken and if not - * so it will throw an exception. - * - * @param $userName Username we need a class instance for - * @return $userInstance An instance of this user class - * @throws UsernameMissingException If the username does not exist - */ - public final static function createGuestByUsername ($userName) { - // Get a new instance - $userInstance = new Guest(); - - // Set the username - $userInstance->setUserName($userName); - - // Check if the username exists - if (!$userInstance->ifUsernameExists()) { - // Throw an exception here - throw new UsernameMissingException(array($userInstance, $userName), self::EXCEPTION_USERNAME_NOT_FOUND); - } - - // Return the instance - return $userInstance; - } - - /** - * Creates an instance of this user class by a provided email address. This - * factory method will not check if the email address is there. - * - * @param $email Email address of the user - * @return $userInstance An instance of this user class - */ - public final static function createGuestByEmail ($email) { - // Get a new instance - $userInstance = new User(); - - // Set the username - $userInstance->setEmail($email); - - // Return the instance - return $userInstance; - } - /** * "Getter" for databse entry * @@ -119,24 +61,24 @@ class Guest extends BaseFrameworkSystem implements ManageableGuest, Registerable */ private function getDatabaseEntry () { // Is there an instance? - if (is_null($this->resultInstance)) { + if (is_null($this->getResultInstance())) { // Throw new exception throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); } // END - if // Rewind it - $this->resultInstance->rewind(); + $this->getResultInstance()->rewind(); // Do we have an entry? - if (!$this->resultInstance->valid()) { + if (!$this->getResultInstance()->valid()) { throw new InvalidDatabaseResultException(array($this, $this->resultInstance), DatabaseResult::EXCEPTION_INVALID_DATABASE_RESULT); } // END - if // Get next entry - $this->resultInstance->next(); + $this->getResultInstance()->next(); // Fetch it - $entry = $this->resultInstance->current(); + $entry = $this->getResultInstance()->current(); // And return it return $entry; @@ -180,6 +122,15 @@ class Guest extends BaseFrameworkSystem implements ManageableGuest, Registerable return $this->email; } + /** + * Getter for database result instance + * + * @return $resultInstance An instance of a database result class + */ + protected final function getResultInstance () { + return $this->resultInstance; + } + /** * Determines wether the username exists or not * @@ -190,7 +141,7 @@ class Guest extends BaseFrameworkSystem implements ManageableGuest, Registerable $exists = false; // Is a previous result there? - if (is_null($this->resultInstance)) { + if (is_null($this->getResultInstance())) { // Get a UserDatabaseWrapper instance $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper_class'); @@ -205,11 +156,11 @@ class Guest extends BaseFrameworkSystem implements ManageableGuest, Registerable $this->resultInstance = $wrapperInstance->doSelectByCriteria($criteriaInstance); } else { // Rewind it - $this->resultInstance->rewind(); + $this->getResultInstance()->rewind(); } // Search for it - if ($this->resultInstance->next()) { + if ($this->getResultInstance()->next()) { // Entry found $exists = true; } // END - if @@ -228,7 +179,7 @@ class Guest extends BaseFrameworkSystem implements ManageableGuest, Registerable $exists = false; // Is a previous result there? - if (is_null($this->resultInstance)) { + if (is_null($this->getResultInstance())) { // Get a UserDatabaseWrapper instance $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper_class'); @@ -243,11 +194,11 @@ class Guest extends BaseFrameworkSystem implements ManageableGuest, Registerable $this->resultInstance = $wrapperInstance->doSelectByCriteria($criteriaInstance); } else { // Rewind it - $this->resultInstance->rewind(); + $this->getResultInstance()->rewind(); } // Search for it - if ($this->resultInstance->next()) { + if ($this->getResultInstance()->next()) { // Entry found $exists = true; } // END - if @@ -281,9 +232,9 @@ class Guest extends BaseFrameworkSystem implements ManageableGuest, Registerable $this->resultInstance = $wrapperInstance->doSelectByCriteria($criteriaInstance); // Search for it - if ($this->resultInstance->next()) { + if ($this->getResultInstance()->next()) { // Get the current entry (can only be one!) - $entry = $this->resultInstance->current(); + $entry = $this->getResultInstance()->current(); // So does the hashes match? //* DEBUG: */ echo $requestInstance->getRequestElement('pass_hash')."/".$entry['pass_hash']; @@ -294,18 +245,6 @@ class Guest extends BaseFrameworkSystem implements ManageableGuest, Registerable return $matches; } - /** - * Adds data for later complete update - * - * @param $column Column we want to update - * @param $value New value to store in database - * @return void - * @todo 0% done - */ - public function addUpdateData ($column, $value) { - $this->partialStub("Column={$column}, value={$value}"); - } - /** * "Getter" for user's password hash * @@ -329,24 +268,27 @@ class Guest extends BaseFrameworkSystem implements ManageableGuest, Registerable } /** - * Updates the last activity timestamp and last performed action in the - * database result. You should call flushUpdates() to flush these updates - * to the database layer. + * Getter for field name * - * @param $requestInstance A requestable class instance - * @return void + * @param $fieldName Field name which we shall get + * @return $fieldValue Field value from the user + * @todo Do we need to secure this here against missing results? */ - public function updateLastActivity (Requestable $requestInstance) { - // No activity will be logged for guest accounts - } + public function getField ($fieldName) { + // Default field value + $fieldValue = null; - /** - * Flushs all updated entries to the database layer - * - * @return void - */ - public function flushUpdates () { - // No updates will be flushed to database! + // Get current array + $fieldArray = $this->getResultInstance()->current(); + + // Does the field exist? + if (isset($fieldArray[$fieldName])) { + // Get it + $fieldValue = $fieldArray[$fieldName]; + } // END - if + + // Return it + return $fieldValue; } } diff --git a/inc/classes/main/user/class_User.php b/inc/classes/main/user/class_User.php deleted file mode 100644 index 5f4ebb8..0000000 --- a/inc/classes/main/user/class_User.php +++ /dev/null @@ -1,436 +0,0 @@ - - * @version 0.0.0 - * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software - * @license GNU GPL 3.0 or any newer version - * @link http://www.ship-simu.org - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -class User extends BaseFrameworkSystem implements ManageableUser, Registerable { - /** - * Instance of the database result - */ - private $resultInstance = null; - - /** - * Username of current user - */ - private $userName = ""; - - /** - * Email of current user - */ - private $email = ""; - - // Exceptions - const EXCEPTION_USERNAME_NOT_FOUND = 0x150; - const EXCEPTION_USER_EMAIL_NOT_FOUND = 0x151; - const EXCEPTION_USER_PASS_MISMATCH = 0x152; - - /** - * Protected constructor - * - * @param $className Name of the class - * @return void - */ - protected function __construct ($className = "") { - // Is the class name empty? Then this is not a specialized user class - if (empty($className)) $className = __CLASS__; - - // Call parent constructor - parent::__construct($className); - - // Set part description - $this->setObjectDescription("Generic user class"); - - // Create unique ID number - $this->generateUniqueId(); - - // Clean up a little - $this->removeNumberFormaters(); - $this->removeSystemArray(); - } - - /** - * Creates an instance of this user class by a provided username. This - * factory method will check if the username is already taken and if not - * so it will throw an exception. - * - * @param $userName Username we need a class instance for - * @return $userInstance An instance of this user class - * @throws UsernameMissingException If the username does not exist - */ - public final static function createUserByUsername ($userName) { - // Get a new instance - $userInstance = new User(); - - // Set the username - $userInstance->setUserName($userName); - - // Check if the username exists - if (!$userInstance->ifUsernameExists()) { - // Throw an exception here - throw new UsernameMissingException(array($userInstance, $userName), self::EXCEPTION_USERNAME_NOT_FOUND); - } - - // Return the instance - return $userInstance; - } - - /** - * Creates an instance of this user class by a provided email address. This - * factory method will not check if the email address is there. - * - * @param $email Email address of the user - * @return $userInstance An instance of this user class - */ - public final static function createUserByEmail ($email) { - // Get a new instance - $userInstance = new User(); - - // Set the username - $userInstance->setEmail($email); - - // Return the instance - return $userInstance; - } - - /** - * Creates a user by a given request instance - * - * @param $requestInstance An instance of a Requestable class - * @return $userInstance An instance of this user class - */ - public final static function createUserByRequest (Requestable $requestInstance) { - // Determine if by email or username - if (!is_null($requestInstance->getRequestElement('username'))) { - // Username supplied - $userInstance = self::createUserByUserName($requestInstance->getRequestElement('username')); - } elseif (!is_null($requestInstance->getRequestElement('email'))) { - // Email supplied - $userInstance = self::createUserByEmail($requestInstance->getRequestElement('email')); - } else { - // Unsupported mode - $userInstance = new User(); - $userInstance->partialStub("We need to add more ways of creating user classes here."); - $userInstance->debugBackTrace(); - exit(); - } - - // Return the prepared instance - return $userInstance; - } - - /** - * "Getter" for databse entry - * - * @return $entry An array with database entries - * @throws NullPointerException If the database result is not found - * @throws InvalidDatabaseResultException If the database result is invalid - */ - private function getDatabaseEntry () { - // Is there an instance? - if (is_null($this->resultInstance)) { - // Throw new exception - throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); - } // END - if - - // Rewind it - $this->resultInstance->rewind(); - - // Do we have an entry? - if (!$this->resultInstance->valid()) { - throw new InvalidDatabaseResultException(array($this, $this->resultInstance), DatabaseResult::EXCEPTION_INVALID_DATABASE_RESULT); - } // END - if - - // Get next entry - $this->resultInstance->next(); - - // Fetch it - $entry = $this->resultInstance->current(); - - // And return it - return $entry; - } - - /** - * Setter for username - * - * @param $userName The username to set - * @return void - */ - public final function setUserName ($userName) { - $this->userName = $userName; - } - - /** - * Setter for email - * - * @param $email The email to set - * @return void - */ - protected final function setEmail ($email) { - $this->email = $email; - } - - /** - * Getter for username - * - * @return $userName The username to get - */ - public final function getUsername () { - return $this->userName; - } - - /** - * Getter for email - * - * @return $email The email to get - */ - public final function getEmail () { - return $this->email; - } - - /** - * Determines wether the username exists or not - * - * @return $exists Wether the username exists - */ - public function ifUsernameExists () { - // By default the username does not exist - $exists = false; - - // Is a previous result there? - if (is_null($this->resultInstance)) { - // Get a UserDatabaseWrapper instance - $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper_class'); - - // Create a search criteria - $criteriaInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); - - // Add the username as a criteria and set limit to one entry - $criteriaInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_USERNAME, $this->getUsername()); - $criteriaInstance->setLimit(1); - - // Get a search result - $this->resultInstance = $wrapperInstance->doSelectByCriteria($criteriaInstance); - } else { - // Rewind it - $this->resultInstance->rewind(); - } - - // Search for it - if ($this->resultInstance->next()) { - // Entry found - $exists = true; - } // END - if - - // Return the status - return $exists; - } - - /** - * Determines wether the email exists or not - * - * @return $exists Wether the email exists - */ - public function ifEmailAddressExists () { - // By default the email does not exist - $exists = false; - - // Is a previous result there? - if (is_null($this->resultInstance)) { - // Get a UserDatabaseWrapper instance - $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper_class'); - - // Create a search criteria - $criteriaInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); - - // Add the username as a criteria and set limit to one entry - $criteriaInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_EMAIL, $this->getEmail()); - $criteriaInstance->setLimit(1); - - // Get a search resultInstance - $this->resultInstance = $wrapperInstance->doSelectByCriteria($criteriaInstance); - } else { - // Rewind it - $this->resultInstance->rewind(); - } - - // Search for it - if ($this->resultInstance->next()) { - // Entry found - $exists = true; - } // END - if - - // Return the status - return $exists; - } - - /** - * Checks if the supplied password hash in request matches with the stored - * in database. - * - * @param $requestInstance A requestable class instance - * @return $matches Wether the supplied password hash matches - */ - public function ifPasswordHashMatches (Requestable $requestInstance) { - // By default nothing matches... ;) - $matches = false; - - // Get a UserDatabaseWrapper instance - $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper_class'); - - // Create a search criteria - $criteriaInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); - - // Add the username as a criteria and set limit to one entry - $criteriaInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_USERNAME, $this->getUserName()); - $criteriaInstance->setLimit(1); - - // Get a search resultInstance - $this->resultInstance = $wrapperInstance->doSelectByCriteria($criteriaInstance); - - // Search for it - if ($this->resultInstance->next()) { - // Get the current entry (can only be one!) - $entry = $this->resultInstance->current(); - - // So does the hashes match? - //* DEBUG: */ echo $requestInstance->getRequestElement('pass_hash')."/".$entry['pass_hash']; - $matches = ($requestInstance->getRequestElement('pass_hash') === $entry['pass_hash']); - } // END - if - - // Return the status - return $matches; - } - - /** - * Adds data for later complete update - * - * @param $column Column we want to update - * @param $value New value to store in database - * @return void - * @todo 0% done - */ - public function addUpdateData ($column, $value) { - $this->partialStub("Column={$column}, value={$value}"); - } - - /** - * "Getter" for user's password hash - * - * @return $passHash User's password hash from database result - */ - public function getPasswordHash () { - // Default is missing password hash - $passHash = null; - - // Get a database entry - $entry = $this->getDatabaseEntry(); - - // Is the password hash there? - if (isset($entry['pass_hash'])) { - // Get it - $passHash = $entry['pass_hash']; - } - - // And return the hash - return $passHash; - } - - /** - * Updates the last activity timestamp and last performed action in the - * database result. You should call flushUpdates() to flush these updates - * to the database layer. - * - * @param $requestInstance A requestable class instance - * @return void - */ - public function updateLastActivity (Requestable $requestInstance) { - // Set last action - $lastAction = $requestInstance->getRequestElement('action'); - - // If there is no action use the default on - if (is_null($lastAction)) { - $lastAction = $this->getConfigInstance()->readConfig('login_default_action'); - } // END - if - - // Get a critieria instance - $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); - - // Add search criteria - $searchInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_USERNAME, $this->getUserName()); - $searchInstance->setLimit(1); - - // Now get another criteria - $updateInstance = ObjectFactory::createObjectByConfiguredName('update_criteria_class'); - - // And add our both entries - $updateInstance->addCriteria('last_activity', date("Y-m-d H:i:s", time())); - $updateInstance->addCriteria('last_action', $lastAction); - - // Add the search criteria for searching for the right entry - $updateInstance->setSearchInstance($searchInstance); - - // Remember the update in database result - $this->resultInstance->add2UpdateQueue($updateInstance); - } - - /** - * Flushs all updated entries to the database layer - * - * @return void - */ - public function flushUpdates () { - // Get a database wrapper - $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper_class'); - - // Do we have data to update? - if ($this->resultInstance->ifDataNeedsFlush()) { - // Yes, then send the whole result to the database layer - $wrapperInstance->doUpdateByResult($this->resultInstance); - } // END - if - } - - /** - * Getter for field name - * - * @param $fieldName Field name which we shall get - * @return $fieldValue Field value from the user - */ - public function getField ($fieldName) { - // Default field value - $fieldValue = null; - - // Get current array - $fieldArray = $this->resultInstance->current(); - - // Does the field exist? - if (isset($fieldArray[$fieldName])) { - // Get it - $fieldValue = $fieldArray[$fieldName]; - } // END - if - - // Return it - return $fieldValue; - } -} - -// [EOF] -?> diff --git a/inc/classes/main/user/guest/.htaccess b/inc/classes/main/user/guest/.htaccess new file mode 100644 index 0000000..3a42882 --- /dev/null +++ b/inc/classes/main/user/guest/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/user/guest/class_Guest.php b/inc/classes/main/user/guest/class_Guest.php new file mode 100644 index 0000000..1dbd7be --- /dev/null +++ b/inc/classes/main/user/guest/class_Guest.php @@ -0,0 +1,117 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, this is free software + * @license GNU GPL 3.0 or any newer version + * @link http://www.ship-simu.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class Guest extends BaseUser implements ManageableGuest, Registerable { + // Exceptions + const EXCEPTION_USERNAME_NOT_FOUND = 0x170; + const EXCEPTION_USER_EMAIL_NOT_FOUND = 0x171; + const EXCEPTION_USER_PASS_MISMATCH = 0x172; + + /** + * Protected constructor + * + * @param $className Name of the class + * @return void + */ + protected function __construct ($className = "") { + // Is the class name empty? Then this is not a specialized user class + if (empty($className)) $className = __CLASS__; + + // Call parent constructor + parent::__construct($className); + + // Set part description + $this->setObjectDescription("Generic user class"); + + // Create unique ID number + $this->generateUniqueId(); + } + + /** + * Creates an instance of this user class by a provided username. This + * factory method will check if the username is already taken and if not + * so it will throw an exception. + * + * @param $userName Username we need a class instance for + * @return $userInstance An instance of this user class + * @throws UsernameMissingException If the username does not exist + */ + public final static function createGuestByUsername ($userName) { + // Get a new instance + $userInstance = new Guest(); + + // Set the username + $userInstance->setUserName($userName); + + // Check if the username exists + if (!$userInstance->ifUsernameExists()) { + // Throw an exception here + throw new UsernameMissingException(array($userInstance, $userName), self::EXCEPTION_USERNAME_NOT_FOUND); + } + + // Return the instance + return $userInstance; + } + + /** + * Creates an instance of this user class by a provided email address. This + * factory method will not check if the email address is there. + * + * @param $email Email address of the user + * @return $userInstance An instance of this user class + */ + public final static function createGuestByEmail ($email) { + // Get a new instance + $userInstance = new User(); + + // Set the username + $userInstance->setEmail($email); + + // Return the instance + return $userInstance; + } + + /** + * Updates the last activity timestamp and last performed action in the + * database result. You should call flushUpdates() to flush these updates + * to the database layer. + * + * @param $requestInstance A requestable class instance + * @return void + */ + public function updateLastActivity (Requestable $requestInstance) { + // No activity will be logged for guest accounts + } + + /** + * Flushs all updated entries to the database layer + * + * @return void + */ + public function flushUpdates () { + // No updates will be flushed to database! + } +} + +// [EOF] +?> diff --git a/inc/classes/main/user/user/.htaccess b/inc/classes/main/user/user/.htaccess new file mode 100644 index 0000000..3a42882 --- /dev/null +++ b/inc/classes/main/user/user/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/user/user/class_User.php b/inc/classes/main/user/user/class_User.php new file mode 100644 index 0000000..e362faf --- /dev/null +++ b/inc/classes/main/user/user/class_User.php @@ -0,0 +1,188 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, this is free software + * @license GNU GPL 3.0 or any newer version + * @link http://www.ship-simu.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class User extends BaseUser implements ManageableUser, Registerable { + // Exceptions + const EXCEPTION_USERNAME_NOT_FOUND = 0x150; + const EXCEPTION_USER_EMAIL_NOT_FOUND = 0x151; + const EXCEPTION_USER_PASS_MISMATCH = 0x152; + + /** + * Protected constructor + * + * @param $className Name of the class + * @return void + */ + protected function __construct ($className = "") { + // Is the class name empty? Then this is not a specialized user class + if (empty($className)) $className = __CLASS__; + + // Call parent constructor + parent::__construct($className); + + // Set part description + $this->setObjectDescription("Generic user class"); + + // Create unique ID number + $this->generateUniqueId(); + } + + /** + * Creates an instance of this user class by a provided username. This + * factory method will check if the username is already taken and if not + * so it will throw an exception. + * + * @param $userName Username we need a class instance for + * @return $userInstance An instance of this user class + * @throws UsernameMissingException If the username does not exist + */ + public final static function createUserByUsername ($userName) { + // Get a new instance + $userInstance = new User(); + + // Set the username + $userInstance->setUserName($userName); + + // Check if the username exists + if (!$userInstance->ifUsernameExists()) { + // Throw an exception here + throw new UsernameMissingException(array($userInstance, $userName), self::EXCEPTION_USERNAME_NOT_FOUND); + } + + // Return the instance + return $userInstance; + } + + /** + * Creates an instance of this user class by a provided email address. This + * factory method will not check if the email address is there. + * + * @param $email Email address of the user + * @return $userInstance An instance of this user class + */ + public final static function createUserByEmail ($email) { + // Get a new instance + $userInstance = new User(); + + // Set the username + $userInstance->setEmail($email); + + // Return the instance + return $userInstance; + } + + /** + * Creates a user by a given request instance + * + * @param $requestInstance An instance of a Requestable class + * @return $userInstance An instance of this user class + */ + public final static function createUserByRequest (Requestable $requestInstance) { + // Determine if by email or username + if (!is_null($requestInstance->getRequestElement('username'))) { + // Username supplied + $userInstance = self::createUserByUserName($requestInstance->getRequestElement('username')); + } elseif (!is_null($requestInstance->getRequestElement('email'))) { + // Email supplied + $userInstance = self::createUserByEmail($requestInstance->getRequestElement('email')); + } else { + // Unsupported mode + $userInstance = new User(); + $userInstance->partialStub("We need to add more ways of creating user classes here."); + $userInstance->debugBackTrace(); + exit(); + } + + // Return the prepared instance + return $userInstance; + } + + /** + * Adds data for later complete update + * + * @param $column Column we want to update + * @param $value New value to store in database + * @return void + * @todo 0% done + */ + public function addUpdateData ($column, $value) { + $this->partialStub("Column={$column}, value={$value}"); + } + + /** + * Updates the last activity timestamp and last performed action in the + * database result. You should call flushUpdates() to flush these updates + * to the database layer. + * + * @param $requestInstance A requestable class instance + * @return void + */ + public function updateLastActivity (Requestable $requestInstance) { + // Set last action + $lastAction = $requestInstance->getRequestElement('action'); + + // If there is no action use the default on + if (is_null($lastAction)) { + $lastAction = $this->getConfigInstance()->readConfig('login_default_action'); + } // END - if + + // Get a critieria instance + $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); + + // Add search criteria + $searchInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_USERNAME, $this->getUserName()); + $searchInstance->setLimit(1); + + // Now get another criteria + $updateInstance = ObjectFactory::createObjectByConfiguredName('update_criteria_class'); + + // And add our both entries + $updateInstance->addCriteria('last_activity', date("Y-m-d H:i:s", time())); + $updateInstance->addCriteria('last_action', $lastAction); + + // Add the search criteria for searching for the right entry + $updateInstance->setSearchInstance($searchInstance); + + // Remember the update in database result + $this->getResultInstance()->add2UpdateQueue($updateInstance); + } + + /** + * Flushs all updated entries to the database layer + * + * @return void + */ + public function flushUpdates () { + // Get a database wrapper + $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper_class'); + + // Do we have data to update? + if ($this->getResultInstance()->ifDataNeedsFlush()) { + // Yes, then send the whole result to the database layer + $wrapperInstance->doUpdateByResult($this->getResultInstance()); + } // END - if + } +} + +// [EOF] +?> -- 2.30.2