Skip to content
Snippets Groups Projects
Forked from Stud.IP / Stud.IP
4246 commits behind, 1266 commits ahead of the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
bootstrap.php 11.41 KiB
<?php
# Lifter010: TODO
/*
 * Copyright (c) 2009  Stud.IP CoreGroup
 *
 * 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.
 */

// Default environment, do not change. Change in config/config_local.inc.php.
const DEFAULT_ENV = 'production';

//software version - please leave it as it is!
$SOFTWARE_VERSION = '5.0.9';

// Store startup time
$STUDIP_STARTUP_TIME = microtime(true);

global $PHP_SELF, $STUDIP_BASE_PATH;

$PHP_SELF = $_SERVER['PHP_SELF'] = $_SERVER['SCRIPT_NAME'];
$STUDIP_BASE_PATH = realpath(dirname(__FILE__) . '/..');

set_include_path(
    $STUDIP_BASE_PATH
    . PATH_SEPARATOR . $STUDIP_BASE_PATH . DIRECTORY_SEPARATOR . 'config'
    . PATH_SEPARATOR . get_include_path()
);

$ABSOLUTE_PATH_STUDIP = $STUDIP_BASE_PATH . '/public/';

$CANONICAL_RELATIVE_PATH_STUDIP = dirname($_SERVER['PHP_SELF']);
if (DIRECTORY_SEPARATOR != '/') {
    $CANONICAL_RELATIVE_PATH_STUDIP = str_replace(DIRECTORY_SEPARATOR, '/', $CANONICAL_RELATIVE_PATH_STUDIP);
}
// CANONICAL_RELATIVE_PATH_STUDIP should end with a '/'
if (substr($CANONICAL_RELATIVE_PATH_STUDIP,-1) != "/"){
    $CANONICAL_RELATIVE_PATH_STUDIP .= "/";
}

$ABSOLUTE_URI_STUDIP = "";

// automagically compute ABSOLUTE_URI_STUDIP if $_SERVER['SERVER_NAME'] is set
if (isset($_SERVER['SERVER_NAME'])) {
    // work around possible bug in lighttpd
    if (mb_strpos($_SERVER['SERVER_NAME'], ':') !== false) {
        list($_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT']) =
            explode(':', $_SERVER['SERVER_NAME']);
    }

    $ABSOLUTE_URI_STUDIP = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http';
    $ABSOLUTE_URI_STUDIP .= '://'.$_SERVER['SERVER_NAME'];

    if ($_SERVER['HTTPS'] == 'on' && $_SERVER['SERVER_PORT'] != 443 ||
        $_SERVER['HTTPS'] != 'on' && $_SERVER['SERVER_PORT'] != 80) {
        $ABSOLUTE_URI_STUDIP .= ':'.$_SERVER['SERVER_PORT'];
    }

    $ABSOLUTE_URI_STUDIP .= $CANONICAL_RELATIVE_PATH_STUDIP;
}

// default ASSETS_URL, customize if required
$GLOBALS['ASSETS_URL'] = $ABSOLUTE_URI_STUDIP . 'assets/';

require __DIR__ . '/classes/StudipFileloader.php';
$added = StudipFileloader::load('config_defaults.inc.php config_local.inc.php', $GLOBALS, compact('STUDIP_BASE_PATH', 'ABSOLUTE_URI_STUDIP', 'ASSETS_URL', 'CANONICAL_RELATIVE_PATH_STUDIP'), true);

// If no ENV setting was found in the config files, assume ENV=production
if (!defined('Studip\ENV')) {
    define('Studip\ENV', DEFAULT_ENV);
}

// if in dev mode and webpack dev server is running, adjust assets url
if (Studip\ENV === 'development' && !in_array('ASSETS_URL', $added) && function_exists('socket_create')) {
    $wds_config = json_decode(
        file_get_contents("{$STUDIP_BASE_PATH}/config/webpack.dev-server.config.json")
    );

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if (@socket_connect($socket, $wds_config->host, $wds_config->port)) {
        socket_close($socket);

        $assets_url = sprintf(
            "%s://%s:%u/%s/",
            $wds_config->protocol,
            $wds_config->host,
            $wds_config->port,
            basename(realpath(__DIR__ . '/..'))
        );

        $probe_headers = get_headers("{$assets_url}images/logos/studip-logo.svg");
        if (strpos($probe_headers[0], '200') !== false) {
            $GLOBALS['ASSETS_URL'] = $assets_url;
        }
    }
}

if (!file_exists($GLOBALS['STUDIP_BASE_PATH'] . '/config/config_local.inc.php')) {
    require_once __DIR__ . '/classes/URLHelper.php';

    URLHelper::setBaseUrl($GLOBALS['ABSOLUTE_URI_STUDIP']);
    header('Location: ' . URLHelper::getURL('install.php'));
    die;
}

require __DIR__ . '/bootstrap-autoload.php';

// construct absolute URL for ASSETS_URL
if ($GLOBALS['ASSETS_URL'][0] === '/') {
    $host = preg_replace('%^([a-z]+:/*[^/]*).*%', '$1', $GLOBALS['ABSOLUTE_URI_STUDIP']);
    $GLOBALS['ASSETS_URL'] = $host . $GLOBALS['ASSETS_URL'];
} else if (!preg_match('/^[a-z]+:/', $GLOBALS['ASSETS_URL'])) {
    $GLOBALS['ASSETS_URL'] = $GLOBALS['ABSOLUTE_URI_STUDIP'] . $GLOBALS['ASSETS_URL'];
}

require 'config.inc.php';

require 'lib/phplib/page_open.php';
require_once 'lib/functions.php';
require_once 'lib/language.inc.php';
require_once 'lib/visual.inc.php';

//setup default logger
Log::get()->setHandler($GLOBALS['TMP_PATH'] . '/studip.log');
if (Studip\ENV == 'development') {
    Log::get()->setLogLevel(Log::DEBUG);
} else {
    Log::get()->setLogLevel(Log::ERROR);
}

// set assets url
Assets::set_assets_url($GLOBALS['ASSETS_URL']);

// globale template factory anlegen
require_once 'vendor/flexi/lib/flexi.php';
$GLOBALS['template_factory'] = new Flexi_TemplateFactory("{$STUDIP_BASE_PATH}/templates");

// set default pdo connection
try {
    DBManager::getInstance()
        ->setConnection('studip',
            'mysql:host=' . $GLOBALS['DB_STUDIP_HOST'] .
            ';dbname=' . $GLOBALS['DB_STUDIP_DATABASE'] .
            ';charset=utf8mb4',
            $GLOBALS['DB_STUDIP_USER'],
            $GLOBALS['DB_STUDIP_PASSWORD']);
} catch (PDOException $exception) {
    if (Studip\ENV === 'development') {
        throw $exception;
    } else {
        header('HTTP/1.1 500 Internal Server Error');
        die(sprintf('database connection %s failed', 'mysql:host=' . $GLOBALS['DB_STUDIP_HOST'] .
            ';dbname=' . $GLOBALS['DB_STUDIP_DATABASE']));
    }
}
// set slave connection
if (isset($GLOBALS['DB_STUDIP_SLAVE_HOST'])) {
    try {
        DBManager::getInstance()
            ->setConnection('studip-slave',
                'mysql:host=' . $GLOBALS['DB_STUDIP_SLAVE_HOST'] .
                ';dbname=' . $GLOBALS['DB_STUDIP_SLAVE_DATABASE'] .
                ';charset=utf8mb4',
                $GLOBALS['DB_STUDIP_SLAVE_USER'],
                $GLOBALS['DB_STUDIP_SLAVE_PASSWORD']);
    } catch (PDOException $exception) {
        // if connection to slave fails, fall back to master instead
        DBManager::getInstance()->aliasConnection('studip', 'studip-slave');
    }
} else {
    DBManager::getInstance()->aliasConnection('studip', 'studip-slave');
}

// set default exception handler
// command line or http request?
if (isset($_SERVER['REQUEST_METHOD'])) {
    set_exception_handler('studip_default_exception_handler');
}

// Prime autoloader if cache is enabled (this cannot be in autoloader's
// bootstrap because the stud.ip cache needs to have a db conenction)
if ($GLOBALS['CACHING_ENABLE']) {
    $cached = StudipCacheFactory::getCache()->read('STUDIP#autoloader-classes');
    if ($cached) {
        $class_lookup = json_decode($cached, true);
        if (is_array($class_lookup)) {
            $lookup_hash = md5($cached);
            StudipAutoloader::addClassLookups($class_lookup);
        }
    }

    register_shutdown_function(function () use ($lookup_hash) {
        $cached = json_encode(StudipAutoloader::$class_lookup, JSON_UNESCAPED_UNICODE);
        if (md5($cached) !== $lookup_hash) {
            StudipCacheFactory::getCache()->write(
                'STUDIP#autoloader-classes',
                $cached,
                7 * 24 * 60 * 60
            );
        }
    });
}

// set default time zone
date_default_timezone_set(Config::get()->DEFAULT_TIMEZONE ? : @date_default_timezone_get());

// sample the request time and number of db queries every tenth time
register_shutdown_function(function ($timer) {
    $timer('core.request_time', 0.1);

    $query_count = DBManager::get()->query_count;
    Metrics::gauge('core.database.queries', $query_count, 0.1);
}, Metrics::startTimer());

//include 'tools/debug/StudipDebugPDO.class.php';

/**
 * @deprecated
 */
class DB_Seminar extends DB_Sql
{
    public function __construct($query = false)
    {
        $this->Host = $GLOBALS['DB_STUDIP_HOST'];
        $this->Database = $GLOBALS['DB_STUDIP_DATABASE'];
        $this->User = $GLOBALS['DB_STUDIP_USER'];
        $this->Password = $GLOBALS['DB_STUDIP_PASSWORD'];
        parent::__construct($query);
    }
}

if (Config::get()->EXTERN_ENABLE) {
    require_once $GLOBALS['STUDIP_BASE_PATH'] . '/lib/extern/extern_config.inc.php';
    require_once $GLOBALS['STUDIP_BASE_PATH'] . '/lib/extern/lib/extern_functions.inc.php';
}

if (Config::get()->CALENDAR_ENABLE) {
    require_once 'lib/calendar_functions.inc.php';
}

if (Config::get()->SOAP_ENABLE) {
    require_once 'lib/soap/StudipSoapClient' . (Config::get()->SOAP_USE_PHP5 ? '_PHP5' : '' ) . '.class.php';
}

if (Config::Get()->ILIAS_INTERFACE_ENABLE) {
    require_once 'lib/ilias_interface/IliasUserObserver.php';
    require_once 'lib/ilias_interface/IliasCourseObserver.php';
}

// set dummy navigation until db is ready
Navigation::setRootNavigation(new Navigation(''));

// set up default page layout
PageLayout::initialize();

// init notification observers
Studip\Activity\ActivityObserver::initialize();
FilesSearch\NotificationObserver::initialize();
if (Config::Get()->ILIAS_INTERFACE_ENABLE) {
    IliasUserObserver::initialize();
    IliasCourseObserver::initialize();
}

//Besser hier globale Variablen definieren...
$GLOBALS['_fullname_sql'] = [];
$GLOBALS['_fullname_sql']['full'] = "TRIM(CONCAT(title_front,' ',Vorname,' ',Nachname,IF(title_rear!='',CONCAT(', ',title_rear),'')))";
$GLOBALS['_fullname_sql']['full_rev'] = "TRIM(CONCAT(Nachname,', ',Vorname,IF(title_front!='',CONCAT(', ',title_front),''),IF(title_rear!='',CONCAT(', ',title_rear),'')))";
$GLOBALS['_fullname_sql']['no_title'] = "CONCAT(Vorname ,' ', Nachname)";
$GLOBALS['_fullname_sql']['no_title_rev'] = "CONCAT(Nachname ,', ', Vorname)";
$GLOBALS['_fullname_sql']['no_title_short'] = "CONCAT(Nachname,', ',UCASE(LEFT(TRIM(Vorname),1)),'.')";
$GLOBALS['_fullname_sql']['no_title_motto'] = "CONCAT(Vorname ,' ', Nachname,IF(motto!='',CONCAT(', ',motto),''))";
$GLOBALS['_fullname_sql']['full_rev_username'] = "TRIM(CONCAT(Nachname,', ',Vorname,IF(title_front!='',CONCAT(', ',title_front),''),IF(title_rear!='',CONCAT(', ',title_rear),''),' (',username,')'))";

//Initialize $SEM_TYPE and $SEM_CLASS arrays
$GLOBALS['SEM_CLASS'] = SemClass::getClasses();
$GLOBALS['SEM_TYPE'] = SemType::getTypes();

// set up global navigation
Navigation::setRootNavigation(new StudipNavigation(''));

/* set default umask to a sane value */
umask(022);

/*mail settings
----------------------------------------------------------------*/
if ($GLOBALS['MAIL_TRANSPORT']) {
    $mail_transporter_name = mb_strtolower($GLOBALS['MAIL_TRANSPORT']) . '_message';
} else {
    $mail_transporter_name = 'smtp_message';
}
include 'vendor/email_message/email_message.php';
include 'vendor/email_message/' . $mail_transporter_name . '.php';
$mail_transporter_class = $mail_transporter_name . '_class';
$mail_transporter = new $mail_transporter_class;
if ($mail_transporter_name == 'smtp_message') {
    include 'vendor/email_message/smtp.php';
    $mail_transporter->localhost = ($GLOBALS['MAIL_LOCALHOST'] == "") ? $_SERVER["SERVER_NAME"] : $GLOBALS['MAIL_LOCALHOST'];
    $mail_transporter->smtp_host = ($GLOBALS['MAIL_HOST_NAME'] == "") ? $_SERVER["SERVER_NAME"] : $GLOBALS['MAIL_HOST_NAME'];
    if (is_array($GLOBALS['MAIL_SMTP_OPTIONS'])) {
        foreach ($GLOBALS['MAIL_SMTP_OPTIONS'] as $key => $value) {
            $mail_transporter->{"smtp_$key"} = $value;
        }
        if ($mail_transporter->smtp_user !== '') {
            include 'vendor/sasl/sasl.php';
        }
    }
}
$mail_transporter->default_charset = 'UTF-8';
$mail_transporter->SetBulkMail((int)$GLOBALS['MAIL_BULK_DELIVERY']);
StudipMail::setDefaultTransporter($mail_transporter);
unset($mail_transporter);