* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
class User extends BaseFrameworkSystem implements ManageableUser, Registerable {
+ /**
+ * Instance of the database result
+ */
+ private $resultInstance = null;
+
/**
* Username of current user
*/
private $email = "";
// Exceptions
- const EXCEPTION_USERNAME_NOT_FOUND = 0xd00;
- const EXCEPTION_USER_EMAIL_NOT_FOUND = 0xd01;
+ const EXCEPTION_USERNAME_NOT_FOUND = 0x060;
+ const EXCEPTION_USER_EMAIL_NOT_FOUND = 0x061;
+ const EXCEPTION_USER_PASS_MISMATCH = 0x062;
/**
* Protected constructor
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
*
* @return $exists Wether the username exists
*/
public function ifUsernameExists () {
- // By default the username does exist
- $exists = true;
-
- // Get a UserDatabaseWrapper instance
- $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper');
-
- // Create a search criteria
- $criteriaInstance = ObjectFactory::createObjectByConfiguredName('search_criteria');
-
- // 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
- $result = $wrapperInstance->doSelectByCriteria($criteriaInstance);
+ // 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 (!$result->next()) {
- // Entry not found
- $exists = false;
+ if ($this->resultInstance->next()) {
+ // Entry found
+ $exists = true;
} // END - if
// Return the status
* @return $exists Wether the email exists
*/
public function ifEmailAddressExists () {
- // By default the username does exist
- $exists = true;
+ // 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');
+ $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_db_wrapper_class');
// Create a search criteria
- $criteriaInstance = ObjectFactory::createObjectByConfiguredName('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->addCriteria(UserDatabaseWrapper::DB_COLUMN_USERNAME, $this->getUserName());
$criteriaInstance->setLimit(1);
- // Get a search result
- $result = $wrapperInstance->doSelectByCriteria($criteriaInstance);
+ // Get a search resultInstance
+ $this->resultInstance = $wrapperInstance->doSelectByCriteria($criteriaInstance);
// Search for it
- if (!$result->next()) {
- // Entry not found
- $exists = false;
+ 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 $exists;
+ 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
+ */
+ 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;
}
}