X-Git-Url: https://git.mxchange.org/?p=shipsimu.git;a=blobdiff_plain;f=application%2Fship-simu%2Fmain%2Flogin%2Fclass_ShipSimuUserLogin.php;h=270a8c690b7c1986a082a8b2d96ce44be9339905;hp=a043de8ba74c0ed28cedc5ab4621ebdcd608ab6c;hb=2b7c3e43b2fe0f3c5ae0455d13fa7743b638049f;hpb=fd80d47afc96ae0c0759530800051a0f07eb9c92 diff --git a/application/ship-simu/main/login/class_ShipSimuUserLogin.php b/application/ship-simu/main/login/class_ShipSimuUserLogin.php index a043de8..270a8c6 100644 --- a/application/ship-simu/main/login/class_ShipSimuUserLogin.php +++ b/application/ship-simu/main/login/class_ShipSimuUserLogin.php @@ -4,7 +4,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Ship-Simu Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * @@ -22,6 +22,11 @@ * along with this program. If not, see . */ class ShipSimuUserLogin extends BaseFrameworkSystem implements LoginableUser { + /** + * The hashed password + */ + private $hashedPassword = ""; + /** * Protected constructor * @@ -31,12 +36,6 @@ class ShipSimuUserLogin extends BaseFrameworkSystem implements LoginableUser { // Call parent constructor parent::__construct(__CLASS__); - // Set part description - $this->setObjectDescription("Login for Ship-Simu"); - - // Create unique ID number - $this->generateUniqueId(); - // Clean up a little $this->removeNumberFormaters(); $this->removeSystemArray(); @@ -61,64 +60,84 @@ class ShipSimuUserLogin extends BaseFrameworkSystem implements LoginableUser { * in a boolean attribute which is then readable by a matching getter. * * @param $requestInstance An instance of a Requestable class + * @param $responseInstance An instance of a Responseable class * @return void - * @throws UserLoginMethodException If wether username nor email login - * was detected - * @throws MissingMethodException If a method was not found in the - * User class * @throws UserPasswordMismatchException If the supplied password did not * match with the stored password + * @todo We need to add something here which will make more than one + * @todo guest logins, users who are online but based on the same + * @todo user account. */ - public function doLogin (Requestable $requestInstance) { + public function doLogin (Requestable $requestInstance, Responseable $responseInstance) { // By default no method is selected $method = null; $data = ""; - // Detect login method (username or email) and try to get a userinstance - if (!is_null($requestInstance->getRequestElement('username'))) { - // Username found! - $method = "createUserByUsername"; - $data = $requestInstance->getRequestElement('username'); - } elseif (!is_null($requestInstance->getRequestElement('email'))) { - // Email found! - $method = "createUserByEmail"; - $data = $requestInstance->getRequestElement('email'); - } - - // Is a method detected? - if (is_null($method)) { - // Then abort here - throw new UserLoginMethodException($this, self::EXCEPTION_MISSING_METHOD); - } elseif (!method_exists($this->getConfigInstance()->readConfig('user_class'), $method)) { - // The method is invalid! - throw new MissingMethodException(array($this, $method), self::EXCEPTION_MISSING_METHOD); - } - - // Get a instance of the registry - $userInstance = Registry::getRegistry()->getInstance('user'); - - // Is there an instance? - if (is_null($userInstance)) { - // Get a user instance - $userInstance = call_user_func_array(array($this->getConfigInstance()->readConfig('user_class'), $method), array($data)); - - // Remember this new instance in registry - Registry::getRegistry()->addInstance($userInstance); - } // END - if + // Get member class + $userClass = $this->getConfigInstance()->readConfig('user_class'); + + // Get a user instance + $userInstance = call_user_func_array(array($userClass, 'createMemberByRequest'), array($requestInstance)); + + // Remember this new instance in registry + Registry::getRegistry()->addInstance('user', $userInstance); // Is the password correct? - if (!$userInstance->ifPasswordHashMatches($requestInstance)) { + if ($userInstance->ifPasswordHashMatches($requestInstance) === false) { // Mismatching password - throw new UserPasswordMismatchException(array($this, $userInstance), User::EXCEPTION_USER_PASS_MISMATCH); + $userInstance->debugInstance(); + throw new UserPasswordMismatchException(array($this, $userInstance), BaseUser::EXCEPTION_USER_PASS_MISMATCH); } // END - if + // ToDo place + // Now do the real login. This can be cookie- or session-based login // which depends on the admins setting then on the user's taste. // 1) Get a login helper instance - $helperInstance = ObjectFactory::createObjectByConfiguredName('login_helper', array($requestInstance)); + $helperInstance = ObjectFactory::createObjectByConfiguredName('login_helper_class', array($requestInstance)); // 2) Execute the login. This will now login... - $helperInstance->executeLogin(); + $helperInstance->executeLogin($responseInstance); + } + + /** + * Determines wether the login was fine. This is done by checking if 'login' instance is in registry + * + * @return $loginDone Wether the login was fine or not + */ + public function ifLoginWasSuccessfull () { + // Is the registry key there? + $loginDone = (Registry::getRegistry()->getInstance('login') instanceof Registerable); + + // Return the result + return $loginDone; + } + + /** + * Encrypt given request key or throw an exception if key was not found in + * request + * + * @param $requestKey Key in request class + * @return void + */ + public function encryptPassword ($requestKey) { + // Check if password is found in request + if ($this->getRequestInstance()->isRequestElementSet($requestKey)) { + // So encrypt the password and store it for later usage in + // the request: + + // Get the plain password + $plainPassword = $this->getRequestInstance()->getRequestElement($requestKey); + + // Get user instance + $userInstance = Registry::getRegistry()->getInstance('user'); + + // Get a crypto helper and hash the password + $this->hashedPassword = ObjectFactory::createObjectByConfiguredName('crypto_class')->hashString($plainPassword, $userInstance->getPasswordHash()); + + // Store the hash back in request + $this->getRequestInstance()->setRequestElement('pass_hash', $this->hashedPassword); + } // END - if } }