check if unique values already exists for user and Character registration and send notification mail to moderators

This commit is contained in:
coderkun 2014-04-16 13:42:19 +02:00
commit babfe5b017
11 changed files with 290 additions and 34 deletions

View file

@ -78,6 +78,35 @@
return substr($string, 0, $pos); return substr($string, 0, $pos);
} }
/**
* Send an email.
*
* @param string $from Sender of mail
* @param mixed $to One (string) or many (array) receivers
* @param string $subject Subject of mail
* @param string $message Message of mail
* @param boolean $html Whether mail should be formatted as HTML or not
* @return Whether mail has been send or not
*/
public static function sendMail($from, $to, $subject, $message, $html=false)
{
// Set receivers
$to = is_array($to) ? implode(',', $to) : $to;
// Set header
$headers = array();
$headers[] = 'Content-type: text/'.($html ? 'html' : 'plain').'; charset=UTF-8';
if(!is_null($from)) {
$headers[] = "From: $from";
}
$header = implode("\r\n", $headers)."\r\n";
// Send mail
return mail($to, $subject, $message, $header);
}
} }
?> ?>

View file

@ -32,7 +32,8 @@
public static $app = array( public static $app = array(
'name' => 'The Legend of Z', 'name' => 'The Legend of Z',
'namespace' => 'hhu\\z\\', 'namespace' => 'hhu\\z\\',
'timeZone' => 'Europe/Berlin' 'timeZone' => 'Europe/Berlin',
'mailsender' => 'noreply@zyren.inf-d.de'
); );

View file

@ -199,6 +199,9 @@
// Validate Character properties // Validate Character properties
$validation = $this->Validation->validateParams($this->request->getPostParams(), array('charactername')); $validation = $this->Validation->validateParams($this->request->getPostParams(), array('charactername'));
$charactername = $this->request->getPostParam('charactername'); $charactername = $this->request->getPostParam('charactername');
if($this->Characters->characterNameExists($charactername)) {
$validation = $this->Validation->addValidationResult($validation, 'charactername', 'exist', true);
}
// Validate type // Validate type
$typeIndex = null; $typeIndex = null;
@ -245,6 +248,9 @@
} }
} }
// Send mail
$this->sendRegistrationMail($charactername);
// Redirect // Redirect
$this->redirect($this->linker->link(array('seminaries'))); $this->redirect($this->linker->link(array('seminaries')));
} }
@ -260,6 +266,31 @@
$this->set('fieldsValidation', $fieldsValidation); $this->set('fieldsValidation', $fieldsValidation);
} }
/**
* Send mail for new Character registration.
*
* @param string $charactername Name of newly registered Character
*/
private function sendRegistrationMail($charactername)
{
$sender = \nre\configs\AppConfig::$app['mailsender'];
if(empty($sender)) {
return;
}
// Send notification mail to system moderators
$subject = sprintf('new Character registration: %s', $charactername);
$message = sprintf('User “%s” <%s> has registered a new Character “%s” for the Seminary “%s”', self::$user['username'], self::$user['email'], $charactername, self::$seminary['title']);
$moderators = $this->Users->getUsersWithSeminaryRole(self::$seminary['id'], 'moderator');
foreach($moderators as &$moderator)
{
\hhu\z\Utils::sendMail($sender, $moderator['email'], $subject, $message);
}
}
} }
?> ?>

View file

@ -164,9 +164,16 @@
// Get params and validate them // Get params and validate them
$validation = $this->Validation->validateParams($this->request->getPostParams(), $fields); $validation = $this->Validation->validateParams($this->request->getPostParams(), $fields);
$username = $this->request->getPostParam('username'); $username = $this->request->getPostParam('username');
if($this->Users->usernameExists($username)) {
$validation = $this->Validation->addValidationResult($validation, 'username', 'exist', true);
}
$prename = $this->request->getPostParam('prename'); $prename = $this->request->getPostParam('prename');
$surname = $this->request->getPostParam('surname'); $surname = $this->request->getPostParam('surname');
$email = $this->request->getPostParam('email'); $email = $this->request->getPostParam('email');
if($this->Users->emailExists($email)) {
$validation = $this->Validation->addValidationResult($validation, 'email', 'exist', true);
}
// Register // Register
if($validation === true) if($validation === true)
@ -178,7 +185,10 @@
$email, $email,
$this->request->getPostParam('password') $this->request->getPostParam('password')
); );
// Send mail
$this->sendRegistrationMail($username, $email);
// Login // Login
$this->Auth->setUserId($userId); $this->Auth->setUserId($userId);
$user = $this->Users->getUserById($userId); $user = $this->Users->getUserById($userId);
@ -323,6 +333,31 @@
} }
/**
* Send mail for new user registration.
*
* @param string $username Name of newly registered user
* @param string $email Email address of newly registered user
*/
private function sendRegistrationMail($username, $email)
{
$sender = \nre\configs\AppConfig::$app['mailsender'];
if(empty($sender)) {
return;
}
// Send notification mail to system moderators
$subject = sprintf('new user registration: %s', $username);
$message = sprintf('User “%s” <%s> has registered themself to %s', $username, $email, \nre\configs\AppConfig::$app['name']);
$moderators = $this->Users->getUsersWithRole('moderator');
foreach($moderators as &$moderator)
{
\hhu\z\Utils::sendMail($sender, $moderator['email'], $subject, $message);
}
}
} }
?> ?>

View file

@ -110,6 +110,31 @@
return $validation; return $validation;
} }
/**
* Add a custom determined validation result to a validation
* store.
*
* @param mixed $validation Validation store to add result to
* @param string $param Name of parameter of the custom validation result
* @param string $setting Name of setting of the custom validation result
* @param mixed $result Validation result
* @return mixed The altered validation store
*/
public function addValidationResult($validation, $param, $setting, $result)
{
if(!is_array($validation)) {
$validation = array();
}
if(!array_key_exists($param, $validation)) {
$validation[$param] = array();
}
$validation[$param][$setting] = $result;
return $validation;
}
} }
?> ?>

View file

@ -1,8 +1,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: The Legend of Z\n" "Project-Id-Version: The Legend of Z\n"
"POT-Creation-Date: 2014-04-16 11:36+0100\n" "POT-Creation-Date: 2014-04-16 13:19+0100\n"
"PO-Revision-Date: 2014-04-16 11:36+0100\n" "PO-Revision-Date: 2014-04-16 13:19+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"Language: de_DE\n" "Language: de_DE\n"
@ -79,12 +79,12 @@ msgid "submitted at %s on %sh"
msgstr "eingereicht am %s um %s Uhr" msgstr "eingereicht am %s um %s Uhr"
#: questtypes/submit/html/submission.tpl:6 #: questtypes/submit/html/submission.tpl:6
#: questtypes/submit/html/submission.tpl:8 views/html/quests/quest.tpl:40 #: questtypes/submit/html/submission.tpl:8 views/html/quests/quest.tpl:46
#: views/html/quests/submissions.tpl:33 #: views/html/quests/submissions.tpl:33
msgid "solved" msgid "solved"
msgstr "gelöst" msgstr "gelöst"
#: questtypes/submit/html/submission.tpl:9 views/html/quests/quest.tpl:42 #: questtypes/submit/html/submission.tpl:9 views/html/quests/quest.tpl:48
#: views/html/quests/submissions.tpl:24 #: views/html/quests/submissions.tpl:24
msgid "unsolved" msgid "unsolved"
msgstr "ungelöst" msgstr "ungelöst"
@ -202,31 +202,35 @@ msgid "Character name contains illegal characters"
msgstr "Der Charaktername enthält ungültige Zeichen" msgstr "Der Charaktername enthält ungültige Zeichen"
#: views/html/characters/register.tpl:26 #: views/html/characters/register.tpl:26
msgid "Character name already exists"
msgstr "Der Charaktername existiert bereits"
#: views/html/characters/register.tpl:28
msgid "Character name invalid" msgid "Character name invalid"
msgstr "Der Charaktername ist ungültig" msgstr "Der Charaktername ist ungültig"
#: views/html/characters/register.tpl:38 #: views/html/characters/register.tpl:40
msgid "Character properties" msgid "Character properties"
msgstr "Charaktereigenschaften" msgstr "Charaktereigenschaften"
#: views/html/characters/register.tpl:39 views/html/characters/register.tpl:40 #: views/html/characters/register.tpl:41 views/html/characters/register.tpl:42
msgid "Character name" msgid "Character name"
msgstr "Charaktername" msgstr "Charaktername"
#: views/html/characters/register.tpl:41 #: views/html/characters/register.tpl:43
msgid "Character type" msgid "Character type"
msgstr "Charaktertyp" msgstr "Charaktertyp"
#: views/html/characters/register.tpl:52 #: views/html/characters/register.tpl:54
#, php-format #, php-format
msgid "The Seminary field “%s” is invalid" msgid "The Seminary field “%s” is invalid"
msgstr "Das Kursfeld „%s“ ist ungültig" msgstr "Das Kursfeld „%s“ ist ungültig"
#: views/html/characters/register.tpl:57 #: views/html/characters/register.tpl:59
msgid "Seminary fields" msgid "Seminary fields"
msgstr "Kursfelder" msgstr "Kursfelder"
#: views/html/characters/register.tpl:79 views/html/seminaries/create.tpl:14 #: views/html/characters/register.tpl:81 views/html/seminaries/create.tpl:14
#: views/html/users/create.tpl:17 #: views/html/users/create.tpl:17
msgid "create" msgid "create"
msgstr "erstellen" msgstr "erstellen"
@ -245,7 +249,7 @@ msgstr "Login"
#: views/html/users/create.tpl:6 views/html/users/create.tpl:7 #: views/html/users/create.tpl:6 views/html/users/create.tpl:7
#: views/html/users/edit.tpl:6 views/html/users/edit.tpl:7 #: views/html/users/edit.tpl:6 views/html/users/edit.tpl:7
#: views/html/users/login.tpl:9 views/html/users/login.tpl:10 #: views/html/users/login.tpl:9 views/html/users/login.tpl:10
#: views/html/users/register.tpl:74 views/html/users/register.tpl:75 #: views/html/users/register.tpl:78 views/html/users/register.tpl:79
msgid "Username" msgid "Username"
msgstr "Benutzername" msgstr "Benutzername"
@ -253,7 +257,7 @@ msgstr "Benutzername"
#: views/html/users/create.tpl:14 views/html/users/create.tpl:15 #: views/html/users/create.tpl:14 views/html/users/create.tpl:15
#: views/html/users/edit.tpl:14 views/html/users/edit.tpl:15 #: views/html/users/edit.tpl:14 views/html/users/edit.tpl:15
#: views/html/users/login.tpl:11 views/html/users/login.tpl:12 #: views/html/users/login.tpl:11 views/html/users/login.tpl:12
#: views/html/users/register.tpl:82 views/html/users/register.tpl:83 #: views/html/users/register.tpl:86 views/html/users/register.tpl:87
msgid "Password" msgid "Password"
msgstr "Passwort" msgstr "Passwort"
@ -306,19 +310,19 @@ msgstr "Filter anwenden"
msgid "Reset filters" msgid "Reset filters"
msgstr "Filter zurücksetzen" msgstr "Filter zurücksetzen"
#: views/html/quests/quest.tpl:50 #: views/html/quests/quest.tpl:57
msgid "Task" msgid "Task"
msgstr "Aufgabe" msgstr "Aufgabe"
#: views/html/quests/quest.tpl:55 #: views/html/quests/quest.tpl:63
msgid "Task already successfully solved" msgid "Task already successfully solved"
msgstr "Du hast die Aufgabe bereits erfolgreich gelöst" msgstr "Du hast die Aufgabe bereits erfolgreich gelöst"
#: views/html/quests/quest.tpl:57 #: views/html/quests/quest.tpl:66
msgid "Show answer" msgid "Show answer"
msgstr "Lösung anzeigen" msgstr "Lösung anzeigen"
#: views/html/quests/quest.tpl:71 views/html/quests/quest.tpl:80 #: views/html/quests/quest.tpl:79 views/html/quests/quest.tpl:88
msgid "Quest" msgid "Quest"
msgstr "Quest" msgstr "Quest"
@ -406,19 +410,19 @@ msgstr "Neuer Benutzer"
#: views/html/users/create.tpl:8 views/html/users/create.tpl:9 #: views/html/users/create.tpl:8 views/html/users/create.tpl:9
#: views/html/users/edit.tpl:8 views/html/users/edit.tpl:9 #: views/html/users/edit.tpl:8 views/html/users/edit.tpl:9
#: views/html/users/register.tpl:76 views/html/users/register.tpl:77 #: views/html/users/register.tpl:80 views/html/users/register.tpl:81
msgid "Prename" msgid "Prename"
msgstr "Vorname" msgstr "Vorname"
#: views/html/users/create.tpl:10 views/html/users/create.tpl:11 #: views/html/users/create.tpl:10 views/html/users/create.tpl:11
#: views/html/users/edit.tpl:10 views/html/users/edit.tpl:11 #: views/html/users/edit.tpl:10 views/html/users/edit.tpl:11
#: views/html/users/register.tpl:78 views/html/users/register.tpl:79 #: views/html/users/register.tpl:82 views/html/users/register.tpl:83
msgid "Surname" msgid "Surname"
msgstr "Nachname" msgstr "Nachname"
#: views/html/users/create.tpl:12 views/html/users/create.tpl:13 #: views/html/users/create.tpl:12 views/html/users/create.tpl:13
#: views/html/users/edit.tpl:12 views/html/users/edit.tpl:13 #: views/html/users/edit.tpl:12 views/html/users/edit.tpl:13
#: views/html/users/register.tpl:80 views/html/users/register.tpl:81 #: views/html/users/register.tpl:84 views/html/users/register.tpl:85
#: views/html/users/user.tpl:12 #: views/html/users/user.tpl:12
msgid "Email address" msgid "Email address"
msgstr "EMail-Adresse" msgstr "EMail-Adresse"
@ -468,66 +472,74 @@ msgid "Username contains illegal characters"
msgstr "Der Benutzername enthält ungültige Zeichen" msgstr "Der Benutzername enthält ungültige Zeichen"
#: views/html/users/register.tpl:20 #: views/html/users/register.tpl:20
msgid "Username already exists"
msgstr "Der Benutzername existiert bereits"
#: views/html/users/register.tpl:22
msgid "Username invalid" msgid "Username invalid"
msgstr "Der Benutzername ist ungültig" msgstr "Der Benutzername ist ungültig"
#: views/html/users/register.tpl:25 #: views/html/users/register.tpl:27
#, php-format #, php-format
msgid "Prename is too short (min. %d chars)" msgid "Prename is too short (min. %d chars)"
msgstr "Der Vorname ist zu kurz (min. %d Zeichen)" msgstr "Der Vorname ist zu kurz (min. %d Zeichen)"
#: views/html/users/register.tpl:27 #: views/html/users/register.tpl:29
#, php-format #, php-format
msgid "Prename is too long (max. %d chars)" msgid "Prename is too long (max. %d chars)"
msgstr "Der Vorname ist zu lang (max. %d Zeichen)" msgstr "Der Vorname ist zu lang (max. %d Zeichen)"
#: views/html/users/register.tpl:29 #: views/html/users/register.tpl:31
#, php-format #, php-format
msgid "Prename contains illegal characters" msgid "Prename contains illegal characters"
msgstr "Der Vorname enthält ungültige Zeichen" msgstr "Der Vorname enthält ungültige Zeichen"
#: views/html/users/register.tpl:31 #: views/html/users/register.tpl:33
msgid "Prename invalid" msgid "Prename invalid"
msgstr "Der Vorname ist ungültig" msgstr "Der Vorname ist ungültig"
#: views/html/users/register.tpl:36 #: views/html/users/register.tpl:38
#, php-format #, php-format
msgid "Surname is too short (min. %d chars)" msgid "Surname is too short (min. %d chars)"
msgstr "Der Nachname ist zu kurz (min. %d Zeichen)" msgstr "Der Nachname ist zu kurz (min. %d Zeichen)"
#: views/html/users/register.tpl:38 #: views/html/users/register.tpl:40
#, php-format #, php-format
msgid "Surname is too long (max. %d chars)" msgid "Surname is too long (max. %d chars)"
msgstr "Der Nachname ist zu lang (max. %d Zeichen)" msgstr "Der Nachname ist zu lang (max. %d Zeichen)"
#: views/html/users/register.tpl:40 #: views/html/users/register.tpl:42
#, php-format #, php-format
msgid "Surname contains illegal characters" msgid "Surname contains illegal characters"
msgstr "Der Nachname enthält ungültige Zeichen" msgstr "Der Nachname enthält ungültige Zeichen"
#: views/html/users/register.tpl:42 #: views/html/users/register.tpl:44
msgid "Surname invalid" msgid "Surname invalid"
msgstr "Der Nachname ist ungültig" msgstr "Der Nachname ist ungültig"
#: views/html/users/register.tpl:47 views/html/users/register.tpl:49 #: views/html/users/register.tpl:49 views/html/users/register.tpl:53
msgid "Email address invalid" msgid "Email address invalid"
msgstr "Die EMail-Adresse ist ungültig" msgstr "Die EMail-Adresse ist ungültig"
#: views/html/users/register.tpl:54 #: views/html/users/register.tpl:51
msgid "Email address already exists"
msgstr "EMail-Adresse existiert bereits"
#: views/html/users/register.tpl:58
#, php-format #, php-format
msgid "Password is too short (min. %d chars)" msgid "Password is too short (min. %d chars)"
msgstr "Das Passwort ist zu kurz (min. %d Zeichen)" msgstr "Das Passwort ist zu kurz (min. %d Zeichen)"
#: views/html/users/register.tpl:56 #: views/html/users/register.tpl:60
#, php-format #, php-format
msgid "Password is too long (max. %d chars)" msgid "Password is too long (max. %d chars)"
msgstr "Das Passwort ist zu lang (max. %d Zeichen)" msgstr "Das Passwort ist zu lang (max. %d Zeichen)"
#: views/html/users/register.tpl:58 #: views/html/users/register.tpl:62
msgid "Password invalid" msgid "Password invalid"
msgstr "Das Passwort ist ungültig" msgstr "Das Passwort ist ungültig"
#: views/html/users/register.tpl:85 #: views/html/users/register.tpl:89
msgid "Register" msgid "Register"
msgstr "Registrieren" msgstr "Registrieren"

View file

@ -390,6 +390,31 @@
} }
/**
* Check if a Character name already exists.
*
* @param string $name Character name to check
* @return boolean Whether Character name exists or not
*/
public function characterNameExists($name)
{
$data = $this->db->query(
'SELECT count(id) AS c '.
'FROM characters '.
'WHERE name = ? OR url = ?',
'ss',
$name,
\nre\core\Linker::createLinkParam($name)
);
if(!empty($data)) {
return ($data[0]['c'] > 0);
}
return false;
}
/** /**
* Create a new Character. * Create a new Character.
* *

View file

@ -49,6 +49,49 @@
} }
/**
* Get users with the given user role.
*
* @param string $userrole User role
* @return array List of users
*/
public function getUsersWithRole($userrole)
{
return $this->db->query(
'SELECT users.id, users.created, users.username, users.url, users.surname, users.prename, users.email '.
'FROM users '.
'LEFT JOIN users_userroles ON users_userroles.user_id = users.id '.
'LEFT JOIN userroles ON userroles.id = users_userroles.userrole_id '.
'WHERE userroles.name = ? '.
'ORDER BY username ASC',
's',
$userrole
);
}
/**
* Get users with the given user Seminary role.
*
* @param int $seminaryId ID of Seminary
* @param string $userseminaryrole User Seminary role
* @return array List of users
*/
public function getUsersWithSeminaryRole($seminaryId, $userseminaryrole)
{
return $this->db->query(
'SELECT users.id, users.created, users.username, users.url, users.surname, users.prename, users.email '.
'FROM users '.
'LEFT JOIN users_userseminaryroles ON users_userseminaryroles.user_id = users.id '.
'LEFT JOIN userseminaryroles ON userseminaryroles.id = users_userseminaryroles.userseminaryrole_id '.
'WHERE users_userseminaryroles.seminary_id = ? AND userseminaryroles.name = ? '.
'ORDER BY username ASC',
'is',
$seminaryId, $userseminaryrole
);
}
/** /**
* Get a user and its data by its ID. * Get a user and its data by its ID.
* *
@ -124,6 +167,55 @@
} }
/**
* Check if an username already exists.
*
* @param string $username Username to check
* @return boolean Whether username exists or not
*/
public function usernameExists($username)
{
$data = $this->db->query(
'SELECT count(id) AS c '.
'FROM users '.
'WHERE username = ? OR url = ?',
'ss',
$username,
\nre\core\Linker::createLinkParam($username)
);
if(!empty($data)) {
return ($data[0]['c'] > 0);
}
return false;
}
/**
* Check if an email address already exists.
*
* @param string $email Email address to check
* @return boolean Whether email address exists or not
*/
public function emailExists($email)
{
$data = $this->db->query(
'SELECT count(id) AS c '.
'FROM users '.
'WHERE email = ?',
's',
$email
);
if(!empty($data)) {
return ($data[0]['c'] > 0);
}
return false;
}
/** /**
* Create a new user. * Create a new user.
* *

View file

@ -23,6 +23,8 @@
break; break;
case 'regex': echo _('Character name contains illegal characters'); case 'regex': echo _('Character name contains illegal characters');
break; break;
case 'exist': echo _('Character name already exists');
break;
default: echo _('Character name invalid'); default: echo _('Character name invalid');
} }
break; break;

View file

@ -17,6 +17,8 @@
break; break;
case 'regex': echo _('Username contains illegal characters'); case 'regex': echo _('Username contains illegal characters');
break; break;
case 'exist': echo _('Username already exists');
break;
default: echo _('Username invalid'); default: echo _('Username invalid');
} }
break; break;
@ -46,6 +48,8 @@
switch($setting) { switch($setting) {
case 'regex': echo _('Email address invalid'); case 'regex': echo _('Email address invalid');
break; break;
case 'exist': echo _('Email address already exists');
break;
default: echo _('Email address invalid'); default: echo _('Email address invalid');
} }
break; break;