Skip to content
Snippets Groups Projects
seminar_open.php 7.56 KiB
Newer Older
<?php
# Lifter002: TODO
# Lifter007: TODO
# Lifter003: TODO
# Lifter010: TODO
/*
seminar_open.php - Initialises a Stud.IP sesssion
Copyright (C) 2000 Stefan Suchi <suchi@data-quest.de>

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.

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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/

/**
 * @addtogroup notifications
 *
 * Logging in triggers a UserDidLogin notification. The user's ID is
 * transmitted as subject of the notification.
 */

//redirect the user where he want to go today....
function startpage_redirect($page_code) {
    switch ($page_code) {
        case 1:
        case 2:
            $jump_page = "dispatch.php/my_courses";
        break;
        case 3:
            $jump_page = "dispatch.php/calendar/schedule";
        break;
        case 4:
            $jump_page = "dispatch.php/contact";
        break;
        case 5:
            $jump_page = "dispatch.php/calendar/single";
        break;
        case 6:
            // redirect to global blubberstream
            // or no redirection if blubber isn't active
            if (Config::get()->BLUBBER_GLOBAL_MESSENGER_ACTIVATE) {
                $jump_page = "dispatch.php/blubber";
            }
            break;
        case 7:
            $jump_page = "dispatch.php/contents/overview";
            break;
    }

    page_close();
    header ('Location: ' . URLHelper::getURL($jump_page));
    exit;
}

global $i_page,
       $SessionSeminar,
       $sess, $auth, $user, $perm, $_language_path;

//get the name of the current page in $i_page
$i_page = basename($_SERVER['PHP_SELF']);

//INITS
$seminar_open_redirected = false;
$user_did_login = false;

// session init starts here
Moritz Strohm's avatar
Moritz Strohm committed
if (empty($_SESSION['SessionStart']) || $_SESSION['SessionStart'] == 0) {
    $_SESSION['SessionStart'] = time();
    $_SESSION['object_cache'] = [];

    // try to get accepted languages from browser
    if (!isset($_SESSION['_language'])) {
        $_SESSION['_language'] = get_accepted_languages();
    }
    if (!$_SESSION['_language']) {
        $_SESSION['_language'] = Config::get()->DEFAULT_LANGUAGE;
    }
}

// user init starts here
if ($auth->is_authenticated() && is_object($user) && $user->id != "nobody") {
    if ($_SESSION['SessionStart'] > UserConfig::get($user->id)->CURRENT_LOGIN_TIMESTAMP) {      // just logged in
        // store old CURRENT_LOGIN in LAST_LOGIN and set CURRENT_LOGIN to start of session
        UserConfig::get($user->id)->store('LAST_LOGIN_TIMESTAMP', UserConfig::get($user->id)->CURRENT_LOGIN_TIMESTAMP);
        UserConfig::get($user->id)->store('CURRENT_LOGIN_TIMESTAMP', $_SESSION['SessionStart']);
        //find current semester and store it in $_SESSION['_default_sem']
Michaela Brückner's avatar
Michaela Brückner committed
        $current_sem = Semester::findDefault();
        $_SESSION['_default_sem'] = $current_sem->semester_id;
        //redirect user to another page if he want to, redirect is deferred to allow plugins to catch the UserDidLogin notification
        if (UserConfig::get($user->id)->PERSONAL_STARTPAGE > 0 && $i_page == "index.php" && !$perm->have_perm("root")) {
            $seminar_open_redirected = TRUE;
        }
        if (!empty($_SESSION['contrast'])) {
            UserConfig::get($GLOBALS['user']->id)->store('USER_HIGH_CONTRAST', 1);
            unset($_SESSION['contrast']);
        }
        $user_did_login = true;
    }

    TwoFactorAuth::get()->secureSession();
}

if (isset($_SESSION['contrast']) || UserConfig::get($GLOBALS['user']->id)->USER_HIGH_CONTRAST) {
    PageLayout::addStylesheet('accessibility.css');
}

// init of output via I18N
$_language_path = init_i18n($_SESSION['_language']);
//force reload of config to get translated data
include 'config.inc.php';

// Try to select the course or institute given by the parameter 'cid'
// in the current request.

$course_id = (Request::int('cancel_login') && (!is_object($user) || $user->id === 'nobody'))
           ? null
           : Request::option('cid');

// Select the current course or institute if we got one from 'cid' or session.
// This also binds Context::getId()
// to the URL parameter 'cid' for all generated links.
if (isset($course_id)) {
    Context::set($course_id);
    unset($course_id);
}

if (Request::int('disable_plugins') !== null && ($user->id === 'nobody' || $perm->have_perm('root'))) {
    // deactivate non-core plugins
    PluginManager::getInstance()->setPluginsDisabled(Request::int('disable_plugins'));
}

// load the default set of plugins
PluginEngine::loadPlugins();

// add navigation item for profile: add modules
if (Navigation::hasItem('/profile/edit')) {
    $plus_nav = new Navigation(_('Mehr …'), 'dispatch.php/profilemodules/index');
    $plus_nav->setDescription(_("Mehr Stud.IP-Funktionen für Ihr Profil"));
    Navigation::addItem('/profile/modules', $plus_nav);
}

if ($user_did_login) {
    NotificationCenter::postNotification('UserDidLogin', $user->id);
}

if (!Request::isXhr() && $perm->have_perm('root')) {
    if (!isset($_SESSION['migration-check']) || $_SESSION['migration-check']['timestamp'] < time() - 5 * 60) {
        $migrator = new Migrator(
            "{$GLOBALS['STUDIP_BASE_PATH']}/db/migrations",
            new DBSchemaVersion('studip')
        );

        $migrations = $migrator->relevantMigrations(null);
        $_SESSION['migration-check'] = [
            'disabled'  => $_SESSION['migration-check']['disabled'] ?? false,
            'timestamp' => time(),
            'count'     => count($migrations),
        ];
    }

    if (Request::option('stop-migration-nag')) {
Moritz Strohm's avatar
Moritz Strohm committed
        $_SESSION['migration-check']['disabled'] = true;
    if (empty($_SESSION['migration-check']['disabled'])
        && $_SESSION['migration-check']['count'] > 0
    ) {
        $info = sprintf(
            _('Es gibt %u noch nicht ausgeführte Migration(en).'),
            $_SESSION['migration-check']['count']
        );

        $message = MessageBox::info($info,[
            sprintf(
                _('Zur %sMigrationsseite%s'),
                '<a class="link-intern" href="' . URLHelper::getLink('web_migrate.php') . '">',
                '</a>'
            ),
            sprintf(
                '<small><a href="%s">%s</a></small>',
                URLHelper::getLink('', ['stop-migration-nag' => true]),
                _('Diese Nachricht bis zum nächsten Login nicht mehr anzeigen')
            )
        ]
        );
        PageLayout::postMessage($message, 'migration-info');
    }
}

if ($seminar_open_redirected) {
    startpage_redirect(UserConfig::get($user->id)->PERSONAL_STARTPAGE);
}

// Show terms on first login
if (is_object($GLOBALS['user'])
    && $GLOBALS['user']->needsToAcceptTerms()
    && !match_route('dispatch.php/terms'))
{
    if (!Request::isXhr()) {
        header('Location: ' . URLHelper::getURL('dispatch.php/terms', ['return_to' => $_SERVER['REQUEST_URI'], 'redirect_token' => Token::create(600)], true));
    } else {
        throw new Trails_Exception(400);
    }
    page_close();
    die;
}

if (Config::get()->USER_VISIBILITY_CHECK && is_object($GLOBALS['user']) && $GLOBALS['user']->id !== 'nobody') {
    require_once('lib/user_visible.inc.php');
    first_decision($GLOBALS['user']->id);
}