Code syncronized with shipsimu code base
[mailer.git] / inc / classes / main / filter / auth / class_UserAuthFilter.php
index 5754bf1d6643b6841d29a833b4e898d4999f947a..b08d0c2b8df659c5d601d4db0e4051a3daba740d 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @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
  *
@@ -23,7 +23,7 @@
  */
 class UserAuthFilter extends BaseFilter implements Filterable {
        // Exception constants
-       const EXCEPTION_AUTH_DATA_INVALID = 0x0a0;
+       const EXCEPTION_AUTH_DATA_INVALID = 0x1b0;
 
        /**
         * The login method we shall choose
@@ -38,12 +38,6 @@ class UserAuthFilter extends BaseFilter implements Filterable {
        protected function __construct () {
                // Call parent constructor
                parent::__construct(__CLASS__);
-
-               // Set part description
-               $this->setObjectDescription("A user authorization filter");
-
-               // Create unique ID number
-               $this->generateUniqueId();
        }
 
        /**
@@ -78,6 +72,8 @@ class UserAuthFilter extends BaseFilter implements Filterable {
         * @param       $responseInstance       An instance of a class with an Responseable interface
         * @return      void
         * @throws      UserAuthorizationException      If the auth login was not found or if it was invalid
+        * @throws      UserPasswordMismatchException   If the supplied password hash does not match
+        * @throws      ClassNotFoundException  If the user (guest/member) class was not found
         */
        public function execute (Requestable $requestInstance, Responseable $responseInstance) {
                // Then get an auth instance for checking and updating the auth cookies
@@ -103,10 +99,37 @@ class UserAuthFilter extends BaseFilter implements Filterable {
 
                        // Stop here
                        throw new UserAuthorizationException($this, self::EXCEPTION_AUTH_DATA_INVALID);
-               }
-
-               // Destroy safely the auth instance
-               unset($authInstance);
+               } // END - if
+
+               // Regular user account
+               $className = $this->getConfigInstance()->readConfig('user_class');
+               $methodName = 'createMemberByUserName';
+
+               // Now, try to get a user or guest instance
+               if ($authLogin == $this->getConfigInstance()->readConfig('guest_login_user')) {
+                       // Set class
+                       $className = $this->getConfigInstance()->readConfig('guest_class');
+                       $methodName = 'createGuestByUserName';
+               } // END - if
+
+               // Does the guest class exist?
+               if (!class_exists($className)) {
+                       // Then abort here
+                       throw new ClassNotFoundException (array($this, $className), self::EXCEPTION_CLASS_NOT_FOUND);
+               } // END - if
+
+               // Now try the dynamic login
+               $userInstance = call_user_func_array(array($className, $methodName), array($authLogin));
+
+               // Is the password correct?
+               if ($userInstance->getPasswordHash() !== $authHash) {
+                       // Mismatching password
+                       throw new UserPasswordMismatchException(array($this, $userInstance), BaseUser::EXCEPTION_USER_PASS_MISMATCH);
+               } // END - if
+
+               // Remember auth and user instances in registry
+               Registry::getRegistry()->addInstance('auth', $authInstance);
+               Registry::getRegistry()->addInstance('user', $userInstance);
        }
 }