From aef78a7e2a6f3aa9c25927a4fead453479d8442a Mon Sep 17 00:00:00 2001
From: =?utf8?q?Roland=20H=C3=A4der?= <roland@mxchange.org>
Date: Sun, 1 Jun 2008 12:45:50 +0000
Subject: [PATCH] Email validator added (partly finished)

---
 .gitattributes                                |   1 +
 .../web/class_WebShipsimuRegisterCommand.php  |   1 +
 .../validator/class_EmailValidatorFilter.php  | 145 ++++++++++++++++++
 .../class_UserNameValidatorFilter.php         |   6 +-
 .../main/response/class_HttpResponse.php      |   2 +-
 inc/config.php                                |   6 +
 6 files changed, 157 insertions(+), 4 deletions(-)
 create mode 100644 inc/classes/main/filter/validator/class_EmailValidatorFilter.php

diff --git a/.gitattributes b/.gitattributes
index 25f3a00..ec7d663 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -325,6 +325,7 @@ inc/classes/main/filter/class_ -text
 inc/classes/main/filter/class_AbstractFilterDecorator.php -text
 inc/classes/main/filter/class_FilterChain.php -text
 inc/classes/main/filter/validator/.htaccess -text
+inc/classes/main/filter/validator/class_EmailValidatorFilter.php -text
 inc/classes/main/filter/validator/class_UserNameValidatorFilter.php -text
 inc/classes/main/helper/.htaccess -text
 inc/classes/main/helper/class_ -text
diff --git a/application/ship-simu/main/commands/web/class_WebShipsimuRegisterCommand.php b/application/ship-simu/main/commands/web/class_WebShipsimuRegisterCommand.php
index 3680159..7279053 100644
--- a/application/ship-simu/main/commands/web/class_WebShipsimuRegisterCommand.php
+++ b/application/ship-simu/main/commands/web/class_WebShipsimuRegisterCommand.php
@@ -60,6 +60,7 @@ class WebShipsimuRegisterCommand extends BaseCommand implements Commandable {
 
 		// @TODO Add some more pre/post filters to the controller
 		$controllerInstance->addPreFilter(ObjectFactory::createObjectByConfiguredName('username_validator'));
+		$controllerInstance->addPreFilter(ObjectFactory::createObjectByConfiguredName('email_validator'));
 
 		// Return the prepared instance
 		return $commandInstance;
diff --git a/inc/classes/main/filter/validator/class_EmailValidatorFilter.php b/inc/classes/main/filter/validator/class_EmailValidatorFilter.php
new file mode 100644
index 0000000..4b982b0
--- /dev/null
+++ b/inc/classes/main/filter/validator/class_EmailValidatorFilter.php
@@ -0,0 +1,145 @@
+<?php
+/**
+ * A concrete filter for validating the email address. This filter may intercept
+ * the filter chain if no email address is given or if the supplied username has
+ * an invalid form. It could also intercept the filter chain if the email
+ * address is already used by some one if configuration requires this.
+ *
+ * @author		Roland Haeder <webmaster@ship-simu.org>
+ * @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 <http://www.gnu.org/licenses/>.
+ */
+class EmailValidatorFilter extends BaseFrameworkSystem implements Filterable {
+	/**
+	 * Private constructor
+	 *
+	 * @return	void
+	 */
+	protected function __construct () {
+		// Call parent constructor
+		parent::__construct(__CLASS__);
+
+		// Set part description
+		$this->setObjectDescription("A filter for Email validation");
+
+		// Create unique ID number
+		$this->createUniqueID();
+
+		// Clean up a little
+		$this->removeNumberFormaters();
+		$this->removeSystemArray();
+	}
+
+	/**
+	 * Creates an instance of this filter class
+	 *
+	 * @return	$filterInstance		An instance of this filter class
+	 */
+	public final static function createEmailValidatorFilter () {
+		// Get a new instance
+		$filterInstance = new EmailValidatorFilter();
+
+		// Return the instance
+		return $filterInstance;
+	}
+
+	/**
+	 * Executes the filter with given request and response objects
+	 *
+	 * @param	$requestInstance	An instance of a class with an Requestable interface
+	 * @param	$responseInstance	An instance of a class with an Responseable interface
+	 * @return	void
+	 */
+	public function execute (Requestable $requestInstance, Responseable $responseInstance) {
+		// Get Email from request
+		$email = $requestInstance->getRequestElement('email');
+
+		// Is the Email set?
+		if ((is_null($email)) || ($this->getConfigInstance()->readConfig('register_email_unique') == "Y")) {
+			// Try it again
+			$email1 = $requestInstance->getRequestElement('email1');
+			$email2 = $requestInstance->getRequestElement('email2');
+
+			// Is the email still not set?
+			if ((is_null($email1)) || (is_null($email2))) {
+				// Not found in form so stop the filtering process
+				$requestInstance->requestIsValid(false);
+
+				// Add a message to the response
+				$responseInstance->addFatalMessage('email_unset');
+
+				// Abort here
+				return false;
+			} elseif ((empty($email1)) || (empty($email2))) {
+				// Email is empty
+				$requestInstance->requestIsValid(false);
+
+				// Is the email empty?
+				if (empty($email1)) {
+					// Add a message to the response
+					$responseInstance->addFatalMessage('email1_empty');
+				} // END - if
+
+				// Is the confirmation empty?
+				if (empty($email2)) {
+					// Add a message to the response
+					$responseInstance->addFatalMessage('email2_empty');
+				} // END - if
+
+				// Abort here
+				return false;
+			} elseif ($this->ifEmailIsTaken($email1)) {
+				// Email is already taken
+				$requestInstance->requestIsValid(false);
+
+				// Add a message to the response
+				$responseInstance->addFatalMessage('email_taken');
+
+				// Abort here
+				return false;
+			} // END - elseif
+		} elseif (empty($email)) {
+			// Empty field!
+			$requestInstance->requestIsValid(false);
+
+			// Add a message to the response
+			$responseInstance->addFatalMessage('email_empty');
+
+			// Abort here
+			return false;
+		} // END - elseif
+	}
+
+	/**
+	 * Check wether the email as already been taken
+	 *
+	 * @param	$email		Email to check for existence
+	 * @return	$alreadyTaken	Wether the email has been taken
+	 */
+	private function ifEmailIsTaken ($email) {
+		// Default is already taken
+		$alreadyTaken = true;
+		$this->partialStub(sprintf("Email: %s", $email));
+
+		// Return the result
+		return $alreadyTaken;
+	}
+}
+
+// [EOF]
+?>
diff --git a/inc/classes/main/filter/validator/class_UserNameValidatorFilter.php b/inc/classes/main/filter/validator/class_UserNameValidatorFilter.php
index 165a9ef..fab9eef 100644
--- a/inc/classes/main/filter/validator/class_UserNameValidatorFilter.php
+++ b/inc/classes/main/filter/validator/class_UserNameValidatorFilter.php
@@ -74,7 +74,7 @@ class UserNameValidatorFilter extends BaseFrameworkSystem implements Filterable
 			// Not found in form so stop the filtering process
 			$requestInstance->requestIsValid(false);
 
-			// Set a message for the response
+			// Add a message to the response
 			$responseInstance->addFatalMessage('username_unset');
 
 			// Abort here
@@ -83,7 +83,7 @@ class UserNameValidatorFilter extends BaseFrameworkSystem implements Filterable
 			// Empty field!
 			$requestInstance->requestIsValid(false);
 
-			// Set a message for the response
+			// Add a message to the response
 			$responseInstance->addFatalMessage('username_empty');
 
 			// Abort here
@@ -92,7 +92,7 @@ class UserNameValidatorFilter extends BaseFrameworkSystem implements Filterable
 			// Username is already taken
 			$requestInstance->requestIsValid(false);
 
-			// Set a message for the response
+			// Add a message to the response
 			$responseInstance->addFatalMessage('username_taken');
 
 			// Abort here
diff --git a/inc/classes/main/response/class_HttpResponse.php b/inc/classes/main/response/class_HttpResponse.php
index 52ad2a7..26ddc88 100644
--- a/inc/classes/main/response/class_HttpResponse.php
+++ b/inc/classes/main/response/class_HttpResponse.php
@@ -167,7 +167,7 @@ class HttpResponse extends BaseFrameworkSystem implements Responseable {
 			$this->addHeader('Pragma:', 'no-cache'); // HTTP/1.0
 
 			// Define the charset to be used
-			$this->addHeader('Content-Type:', 'text/html; charset=utf-8');
+			$this->addHeader('Content-Type:', sprintf("text/html; charset=%s", $this->getConfigInstance()->readConfig('header_charset')));
 
 			foreach ($this->responseHeaders as $name=>$value) {
 				header("{$name}: {$value}");
diff --git a/inc/config.php b/inc/config.php
index 835e34e..0a92b9c 100644
--- a/inc/config.php
+++ b/inc/config.php
@@ -114,6 +114,9 @@ $cfg->setConfigEntry('tpl_selector_prefix', "selector");
 // CFG: WEB-CONTENT-TYPE
 $cfg->setConfigEntry('web_content_type', "text/html");
 
+// CFG: HEADER-CHARSET
+$cfg->setConfigEntry('header_charset', "utf-8");
+
 // CFG: VALID-TEMPLATE-VARIABLE
 $cfg->setConfigEntry('tpl_valid_var', "content");
 
@@ -165,5 +168,8 @@ $cfg->setConfigEntry('file_output_stream', "FileIoStream");
 // CFG: USERNAME-VALIDATOR
 $cfg->setConfigEntry('username_validator', "UserNameValidatorFilter");
 
+// CFG: EMAIL-VALIDATOR
+$cfg->setConfigEntry('email_validator', "EmailValidatorFilter");
+
 // [EOF]
 ?>
-- 
2.39.5