diff options
| author | Philipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de> | 2024-09-24 10:53:31 +0200 |
|---|---|---|
| committer | Philipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de> | 2024-09-24 10:53:31 +0200 |
| commit | 4459dd7917f4d1c34f40bb68f0e991e9c3d53e4c (patch) | |
| tree | 5c07151ae61276d334e88f6309c30d439a85c12e /lib/phplib/Seminar_Register_Auth.php | |
| parent | da0022e5c1abbf9825ae76debaabdff7e8623bb4 (diff) | |
| parent | 97a188592c679890a25c37ab78463add76a52ff7 (diff) | |
Merge branch 'main' into issue-3911issue-3911
Diffstat (limited to 'lib/phplib/Seminar_Register_Auth.php')
| -rw-r--r-- | lib/phplib/Seminar_Register_Auth.php | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/lib/phplib/Seminar_Register_Auth.php b/lib/phplib/Seminar_Register_Auth.php new file mode 100644 index 0000000..5bf10f1 --- /dev/null +++ b/lib/phplib/Seminar_Register_Auth.php @@ -0,0 +1,242 @@ +<?php + +/** + * Seminar_Register_Auth.php + * + * + * 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 2 of + * the License, or (at your option) any later version. + * + * @author André Noack <noack@data-quest.de> + * @copyright 2000 Stud.IP Core-Group + * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 + */ +class Seminar_Register_Auth extends Seminar_Auth +{ + public function start() + { + global $sess; + + switch ($this->getState()) { + # No valid auth info or auth is expired + case 1: + + if ($this->nobody) { + # Authenticate as nobody + $this->auth['uid'] = 'nobody'; + return true; + } else { + # Show the registration form + $this->auth_registerform(); + $this->auth['uid'] = 'form'; + exit; + } + # Login in progress, check results and act accordingly + case 3: + $uid = $this->auth_doregister(); + if ($uid) { + $this->auth['uid'] = $uid; + $GLOBALS['user'] = new Seminar_User($this->auth['uid']); + return true; + } else { + $this->auth_registerform(); + $this->auth['uid'] = 'form'; + $sess->freeze(); + exit; + } + } + + return parent::start(); + } + + public function auth_registerform() + { + $this->check_environment(); + + // load the default set of plugins + PluginEngine::loadPlugins(); + + if (!$_COOKIE[get_class($GLOBALS['sess'])]) { + $register_template = $GLOBALS['template_factory']->open('nocookies'); + } else { + $register_template = $GLOBALS['template_factory']->open('register/form'); + $register_template->validator = new email_validation_class(); + $register_template->error_msg = $this->error_msg; + $register_template->username = Request::get('username'); + $register_template->Vorname = Request::get('Vorname'); + $register_template->Nachname = Request::get('Nachname'); + $register_template->Email = Request::get('Email'); + $register_template->title_front = Request::get('title_front'); + $register_template->title_rear = Request::get('title_rear'); + $register_template->geschlecht = Request::int('geschlecht', 0); + } + PageLayout::setHelpKeyword('Basis.AnmeldungRegistrierung'); + PageLayout::setTitle(_('Registrierung')); + + echo $register_template->render( + [], + $GLOBALS['template_factory']->open('layouts/base.php') + ); + } + + /** + * @return bool|string + */ + public function auth_doregister() + { + $this->check_environment(); + + $this->error_msg = ''; + + $this->auth['uname'] = Request::username('username'); // This provides access for "crcregister.ihtml" + + $validator = new email_validation_class(); // Klasse zum Ueberpruefen der Eingaben + $validator->timeout = 10; // Wie lange warten wir auf eine Antwort des Mailservers? + + if (!Seminar_Session::check_ticket(Request::option('login_ticket'))) { + return false; + } + + $username = trim(Request::get('username')); + $Vorname = trim(Request::get('Vorname')); + $Nachname = trim(Request::get('Nachname')); + + // accept only registered domains if set + if (Config::get()->EMAIL_DOMAIN_RESTRICTION) { + $Email = trim(Request::get('Email')) . '@' . trim(Request::get('emaildomain')); + } else { + $Email = trim(Request::get('Email')); + } + + if (!$validator->ValidateUsername($username)) { + $this->error_msg = $this->error_msg . _('Der gewählte Benutzername ist zu kurz!') . '<br>'; + return false; + } // username syntaktisch falsch oder zu kurz + // auf doppelte Vergabe wird weiter unten getestet. + + if (!$validator->ValidatePassword(Request::get('password'))) { + $this->error_msg = $this->error_msg . _('Das Passwort ist zu kurz, zu lang oder enthält nicht erlaubte Zeichen!') . '<br>'; + return false; + } + + if (!$validator->ValidateName($Vorname)) { + $this->error_msg = $this->error_msg . _('Der Vorname fehlt oder ist unsinnig!') . '<br>'; + return false; + } // Vorname nicht korrekt oder fehlend + if (!$validator->ValidateName($Nachname)) { + $this->error_msg = $this->error_msg . _('Der Nachname fehlt oder ist unsinnig!') . '<br>'; + return false; // Nachname nicht korrekt oder fehlend + } + if (!$validator->ValidateEmailAddress($Email)) { + $this->error_msg = $this->error_msg . _('Die E-Mail-Adresse fehlt oder ist falsch geschrieben!') . '<br>'; + return false; + } // E-Mail syntaktisch nicht korrekt oder fehlend + + $REMOTE_ADDR = $_SERVER['REMOTE_ADDR']; + $Zeit = date('H:i:s, d.m.Y'); + + if (!$validator->ValidateEmailHost($Email)) { // Mailserver nicht erreichbar, ablehnen + $this->error_msg = $this->error_msg . _('Der Mailserver ist nicht erreichbar, bitte überprüfen Sie, ob Sie E-Mails mit der angegebenen Adresse verschicken und empfangen können!') . '<br>'; + return false; + } else { // Server ereichbar + if (!$validator->ValidateEmailBox($Email)) { // aber user unbekannt. Mail an abuse! + StudipMail::sendAbuseMessage('Register', "Emailbox unbekannt\n\nUser: $username\nEmail: $Email\n\nIP: $REMOTE_ADDR\nZeit: $Zeit\n"); + $this->error_msg = $this->error_msg . _('Die angegebene E-Mail-Adresse ist nicht erreichbar, bitte überprüfen Sie Ihre Angaben!') . '<br>'; + return false; + } else { + ; // Alles paletti, jetzt kommen die Checks gegen die Datenbank... + } + } + + $check_uname = StudipAuthAbstract::CheckUsername($username); + + if ($check_uname['found']) { + $this->error_msg = $this->error_msg . _('Der gewählte Benutzername ist bereits vorhanden!') . '<br>'; + return false; // username schon vorhanden + } + + if (User::countBySQL('Email = ?', [$Email])) { + $this->error_msg = $this->error_msg . _('Die angegebene E-Mail-Adresse wird bereits von einem anderen Benutzer verwendet. Sie müssen eine andere E-Mail-Adresse angeben!') . '<br>'; + return false; // Email schon vorhanden + } + + // alle Checks ok, Benutzer registrieren... + $hasher = UserManagement::getPwdHasher(); + $new_user = new User(); + $new_user->username = $username; + $new_user->perms = 'user'; + $new_user->password = $hasher->HashPassword(Request::get('password')); + $new_user->vorname = $Vorname; + $new_user->nachname = $Nachname; + $new_user->email = $Email; + $new_user->geschlecht = Request::int('geschlecht'); + $new_user->title_front = trim(Request::get('title_front', Request::get('title_front_chooser'))); + $new_user->title_rear = trim(Request::get('title_rear', Request::get('title_rear_chooser'))); + $new_user->auth_plugin = 'standard'; + $new_user->store(); + + if (!$new_user->user_id) { + return false; + } + + self::sendValidationMail($new_user); + + $this->auth['perm'] = $new_user->perms; + $this->auth['uname'] = $new_user->username; + $this->auth['auth_plugin'] = $new_user->auth_plugin; + + return $new_user->user_id; + } + + /** + * Send a validation mail to the passed user + * + * @param User $user a user-object or id of the user + * to resend the validation mail for + */ + public static function sendValidationMail($user){ + // if no user-object is given interpret it as a user-id + if (is_string($user)) { + $user = new User($user); + } + + // template-variables for the include partial + $Zeit = date('H:i:s, d.m.Y', $user->mkdate); + $username = $user->username; + $Vorname = $user->vorname; + $Nachname = $user->nachname; + $Email = $user->email; + + // (re-)send the confirmation mail + $to = $user->email; + $token = Token::create(7 * 24 * 60 * 60, $user->id); // Link is valid for 1 week + $url = $GLOBALS['ABSOLUTE_URI_STUDIP'] . 'email_validation.php?secret=' . $token; + $mail = new StudipMail(); + $abuse = StudipMail::getAbuseEmail(); + + $lang_path = getUserLanguagePath($user->id); + + // include language-specific subject and mailbody + // TODO: This should be refactored so that the included file returns an array + include "locale/{$lang_path}/LC_MAILS/register_mail.inc.php"; // Defines $subject and $mailbody + + // send the mail + $mail->setSubject($subject ?? '') + ->addRecipient($to) + ->setBodyText($mailbody ?? '') + ->send(); + } + + /** + * Validates a given hash for a given user id. + * @param string $secret Secret to validate + * @param string $user_id User id + * @return bool + */ + public static function validateSecret($secret, $user_id) + { + return Token::isValid($secret, $user_id); + } +} |
