aboutsummaryrefslogtreecommitdiff
path: root/lib/phplib/Seminar_Auth.class.php
diff options
context:
space:
mode:
authorPhilipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de>2024-09-24 10:53:31 +0200
committerPhilipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de>2024-09-24 10:53:31 +0200
commit4459dd7917f4d1c34f40bb68f0e991e9c3d53e4c (patch)
tree5c07151ae61276d334e88f6309c30d439a85c12e /lib/phplib/Seminar_Auth.class.php
parentda0022e5c1abbf9825ae76debaabdff7e8623bb4 (diff)
parent97a188592c679890a25c37ab78463add76a52ff7 (diff)
Merge branch 'main' into issue-3911issue-3911
Diffstat (limited to 'lib/phplib/Seminar_Auth.class.php')
-rw-r--r--lib/phplib/Seminar_Auth.class.php448
1 files changed, 0 insertions, 448 deletions
diff --git a/lib/phplib/Seminar_Auth.class.php b/lib/phplib/Seminar_Auth.class.php
deleted file mode 100644
index 0a566d1..0000000
--- a/lib/phplib/Seminar_Auth.class.php
+++ /dev/null
@@ -1,448 +0,0 @@
-<?php
-
-/**
- * Seminar_Auth.class.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_Auth
-{
- /**
- * @var string
- */
- public $classname;
-
- /**
- * @var string
- */
- public $error_msg = "";
-
- /**
- * @var array
- */
- protected $persistent_slots = ["auth", "classname"];
-
- /**
- * @var bool
- */
- protected $nobody = false; ## If true, a default auth is created...
-
- /**
- * @var string
- */
- protected $cancel_login = "cancel_login"; ## The name of a button that can be
- ## used to cancel a login form
- /**
- * @var array
- */
- public $auth = []; ## Data array
-
- public $need_email_activation = null;
-
- /**
- *
- */
- function __construct()
- {
- $this->classname = get_class($this);
- }
-
- /**
- * @param $f
- * @return $this
- */
- function check_feature($f)
- {
- if ($this->classname != $f) {
- $clone = new $f;
- $clone->auth = $this->auth;
- return $clone;
- } else {
- return $this;
- }
- }
-
- /**
- * Check current auth state. Should be one of
- * 1) Not logged in (no valid auth info or auth expired)
- * 2) Logged in (valid auth info)
- * 3) Login in progress (if $this->cancel_login, revert to state 1)
-
- * @return int
- */
- protected function getState(): int
- {
- if ($this->is_authenticated()) {
- $uid = $this->auth['uid'];
- switch ($uid) {
- case 'form':
- # Login in progress
- if (Request::option($this->cancel_login)) {
- # If $this->cancel_login is set, delete all auth info and set
- # state to "Not logged in", so eventually default or automatic
- # authentication may take place
- $this->unauth();
- $state = 1;
- } else {
- # Set state to "Login in progress"
- $state = 3;
- }
- break;
- default:
- # User is authenticated and auth not expired
- $state = 2;
- break;
- }
- } else {
- # User is not (yet) authenticated
- $this->unauth();
- $state = 1;
- }
-
- return $state;
- }
-
- /**
- * @return bool
- * @throws RuntimeException
- */
- public function start()
- {
- global $sess;
-
- switch ($this->getState()) {
- case 1:
- # No valid auth info or auth is expired
-
- # Check for user supplied automatic login procedure
- if ($uid = $this->auth_preauth()) {
- $this->auth["uid"] = $uid;
- $sess->regenerate_session_id(['auth', '_language', 'phpCAS', 'contrast']);
- $sess->freeze();
- $GLOBALS['user'] = new Seminar_User($this->auth['uid']);
- return true;
- }
-
- if ($this->nobody) {
- # Authenticate as nobody
- $this->auth["uid"] = "nobody";
- return true;
- } else {
- # Show the login form
- $this->auth_loginform();
- $this->auth["uid"] = "form";
- $sess->freeze();
- exit;
- }
- case 2:
- # Valid auth info
- # do nothin
- break;
- case 3:
- # Login in progress, check results and act accordingly
- $uid = $this->auth_validatelogin();
- if ($uid) {
- $this->auth["uid"] = $uid;
- $keep_session_vars = ['auth', 'forced_language', '_language', 'contrast', 'oauth2'];
- if ($this->auth['perm'] === 'root') {
- $keep_session_vars[] = 'plugins_disabled';
- }
- $sess->regenerate_session_id($keep_session_vars);
- $sess->freeze();
- $GLOBALS['user'] = new Seminar_User($this->auth['uid']);
- return true;
- } else {
- $this->auth_loginform();
- $this->auth["uid"] = "form";
- $sess->freeze();
- exit;
- }
- default:
- # This should never happen. Complain.
- throw new RuntimeException("Error in auth handling: invalid state reached.");
- }
-
- return false;
- }
-
-
- /**
- * @return array
- */
- function __sleep()
- {
- return $this->persistent_slots;
- }
-
-
- /**
- *
- */
- function unauth()
- {
- $this->auth = [];
- $this->auth["uid"] = "";
- $this->auth["perm"] = "";
- }
-
-
- /**
- *
- */
- function logout()
- {
- $_SESSION['auth'] = null;
- $this->unauth();
- $GLOBALS['auth'] = $this;
- }
-
- /**
- * @param $ok
- * @return bool
- */
- function login_if($ok)
- {
- if ($ok) {
- $this->unauth(); # We have to relogin, so clear current auth info
- $this->nobody = false; # We are forcing login, so default auth is
- # disabled
- $this->start(); # Call authentication code
- }
- return true;
- }
-
- /**
- * @return bool
- * @throws AccessDeniedException
- */
- function is_authenticated()
- {
- $cfg = Config::GetInstance();
- //check if the user got kicked meanwhile, or if user is locked out
- if (!empty($this->auth['uid']) && !in_array($this->auth['uid'], ['form', 'nobody'])) {
- $user = null;
- if (isset($GLOBALS['user']) && $GLOBALS['user']->id == $this->auth['uid']) {
- $user = $GLOBALS['user']->getAuthenticatedUser();
- } else {
- $user = User::find($this->auth['uid']);
- }
- if (!$user->username || $user->isBlocked()) {
- $this->unauth();
- }
- } elseif ($cfg->getValue('MAINTENANCE_MODE_ENABLE') && Request::username('loginname')) {
- $user = User::findByUsername(Request::username('loginname'));
- }
- if ($cfg->getValue('MAINTENANCE_MODE_ENABLE') && $user->perms != 'root') {
- $this->unauth();
- throw new AccessDeniedException(_("Das System befindet sich im Wartungsmodus. Zur Zeit ist kein Zugriff möglich."));
- }
- return @$this->auth['uid'] ? : false;
- }
-
- /**
- * @return bool
- */
- function auth_preauth()
- {
- // is Single Sign On activated?
- if (($provider = Request::option('sso'))) {
-
- $this->check_environment();
-
- Metrics::increment('core.sso_login.attempted');
-
- // then do login
- if (($authplugin = StudipAuthAbstract::GetInstance($provider))) {
- $user = $authplugin->authenticateUser('', '');
- if ($user) {
- if ($user->isExpired()) {
- throw new AccessDeniedException(_('Dieses Benutzerkonto ist abgelaufen. Wenden Sie sich bitte an die Administration.'));
- }
- if ($user->locked == 1) {
- throw new AccessDeniedException(_('Dieser Benutzer ist gesperrt! Wenden Sie sich bitte an die Administration.'));
- }
- $this->auth["jscript"] = true;
- $this->auth["perm"] = $user->perms;
- $this->auth["uname"] = $user->username;
- $this->auth["auth_plugin"] = $user->auth_plugin;
- $this->auth_set_user_settings($user);
-
- Metrics::increment('core.sso_login.succeeded');
-
- return $user->id;
- } else {
- PageLayout::postMessage(MessageBox::error($authplugin->plugin_name . ': ' . _('Login fehlgeschlagen'), $authplugin->error_msg ? [$authplugin->error_msg] : []),md5($authplugin->error_msg));
- }
- }
- }
-
- return false;
- }
-
- /**
- *
- */
- function auth_loginform()
- {
- if (Request::isXhr()) {
- if (Request::isDialog()) {
- header('X-Location: ' . URLHelper::getURL($_SERVER['REQUEST_URI']));
- page_close();
- die();
- }
- throw new AccessDeniedException();
- }
-
- if (Request::submitted('user_config_submitted')) {
- CSRFProtection::verifyUnsafeRequest();
- if (Request::submitted('unset_contrast')) {
- $_SESSION['contrast'] = 0;
- }
- if (Request::submitted('set_contrast')) {
- $_SESSION['contrast'] = 1;
- }
-
-
- foreach (array_keys($GLOBALS['INSTALLED_LANGUAGES']) as $language_key) {
- if (Request::submitted('set_language_' . $language_key)) {
- $_SESSION['forced_language'] = $language_key;
- $_SESSION['_language'] = $language_key;
- }
- }
- }
-
- $this->check_environment();
-
- PageLayout::setBodyElementId('login');
-
- // load the default set of plugins
- PluginEngine::loadPlugins();
-
- if (Request::get('loginname') && !$_COOKIE[get_class($GLOBALS['sess'])]) {
- $login_template = $GLOBALS['template_factory']->open('nocookies');
- } else if (isset($this->need_email_activation)) {
- $this->unauth();
- header('Location: ' . URLHelper::getURL('activate_email.php?cancel_login=1&key=&uid=' . $this->need_email_activation));
- page_close();
- die();
- } else {
- unset($_SESSION['semi_logged_in']); // used by email activation
- $login_template = $GLOBALS['template_factory']->open('loginform');
- $login_template->set_attribute('loginerror', (isset($this->auth["uname"]) && $this->error_msg));
- $login_template->set_attribute('error_msg', $this->error_msg);
- $login_template->set_attribute('uname', (isset($this->auth["uname"]) ? $this->auth["uname"] : Request::username('loginname')));
- $login_template->set_attribute('self_registration_activated', Config::get()->ENABLE_SELF_REGISTRATION);
-
- $query = "SHOW TABLES LIKE 'login_faq'";
- $result = DBManager::get()->query($query);
-
- if ($result && $result->rowCount() > 0) {
- $login_template->set_attribute('faq_entries', LoginFaq::findBySQL("1"));
- }
- }
- PageLayout::setHelpKeyword('Basis.AnmeldungLogin');
- $header_template = $GLOBALS['template_factory']->open('header');
- $header_template->current_page = _('Login');
- $header_template->link_params = ['cancel_login' => 1];
-
- include 'lib/include/html_head.inc.php';
- echo $header_template->render();
- echo $login_template->render();
- include 'lib/include/html_end.inc.php';
- page_close();
- }
-
- /**
- * @return bool
- */
- function auth_validatelogin()
- {
- //prevent replay attack
- if (!Seminar_Session::check_ticket(Request::option('login_ticket'))) {
- return false;
- }
-
- $this->check_environment();
-
- $this->auth["uname"] = Request::get('loginname'); // This provides access for "loginform.ihtml"
- $this->auth["jscript"] = Request::get('resolution') != "";
-
- $check_auth = StudipAuthAbstract::CheckAuthentication(Request::get('loginname'), Request::get('password'));
-
- if ($check_auth['uid']) {
- $uid = $check_auth['uid'];
- if (isset($check_auth['need_email_activation']) && $check_auth['need_email_activation'] == $uid) {
- $this->need_email_activation = $uid;
- $_SESSION['semi_logged_in'] = $uid;
- return false;
- }
- $user = $check_auth['user'];
- $this->auth["perm"] = $user->perms;
- $this->auth["uname"] = $user->username;
- $this->auth["auth_plugin"] = $user->auth_plugin;
- $this->auth_set_user_settings($user);
-
- Metrics::increment('core.login.succeeded');
-
- return $uid;
- } else {
- Metrics::increment('core.login.failed');
- $this->error_msg = $check_auth['error'];
- return false;
- }
- }
-
- /**
- * @param $user
- */
- function auth_set_user_settings($user)
- {
- $divided = explode('x', Request::get('resolution'));
- $this->auth["xres" . ""] = !empty($divided[0]) ? (int) $divided[0] : 1024; //default
- $this->auth['yres'] = !empty($divided[1]) ? (int)$divided[1] : 768; //default
- // Change X-Resulotion on Multi-Screen Systems (as Matrox Graphic-Adapters are)
- if ($this->auth['xres'] / $this->auth['yres'] > 2) {
- $this->auth['xres'] = $this->auth['xres'] / 2;
- }
- $user = User::toObject($user);
- //restore user-specific language preference
- if ($user->preferred_language) {
- // we found a stored setting for preferred language
- $_SESSION['_language'] = $user->preferred_language;
- }
- }
-
- /**
- * setup dummy user environment
- */
- function check_environment()
- {
- global $_language_path;
-
- if (!isset($GLOBALS['user']) || $GLOBALS['user']->id !== 'nobody') {
- $GLOBALS['user'] = new Seminar_User('nobody');
- $GLOBALS['perm'] = new Seminar_Perm();
- $GLOBALS['auth'] = $this;
- }
-
- if (empty($_SESSION['_language'])) {
- $_SESSION['_language'] = get_accepted_languages();
- }
-
- // init of output via I18N
- $_language_path = init_i18n($_SESSION['_language']);
- include 'config.inc.php';
-
- if (!empty($_SESSION['contrast'])) {
- PageLayout::addStylesheet('accessibility.css');
- }
- }
-}