nextcloud/lib/base.php

884 lines
28 KiB
PHP
Raw Normal View History

2010-03-10 15:03:40 +03:00
<?php
/**
2011-04-15 21:24:23 +04:00
* ownCloud
*
* @author Frank Karlitschek
2012-05-26 21:14:24 +04:00
* @copyright 2012 Frank Karlitschek frank@owncloud.org
2011-04-15 21:24:23 +04:00
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
2010-03-10 15:03:40 +03:00
require_once 'public/constants.php';
/**
* Class that is a namespace for all global OC variables
* No, we can not put this class in its own file because it is used by
* OC_autoload!
*/
class OC {
2013-01-14 23:30:28 +04:00
/**
2013-01-18 22:52:29 +04:00
* Associative array for autoloading. classname => filename
2013-01-14 23:30:28 +04:00
*/
public static $CLASSPATH = array();
/**
* The installation path for owncloud on the server (e.g. /srv/http/owncloud)
*/
public static $SERVERROOT = '';
/**
* the current request path relative to the owncloud root (e.g. files/index.php)
*/
private static $SUBURI = '';
/**
* the owncloud root path for http requests (e.g. owncloud/)
*/
public static $WEBROOT = '';
/**
* The installation path of the 3rdparty folder on the server (e.g. /srv/http/owncloud/3rdparty)
*/
public static $THIRDPARTYROOT = '';
/**
* the root path of the 3rdparty folder for http requests (e.g. owncloud/3rdparty)
*/
public static $THIRDPARTYWEBROOT = '';
/**
* The installation path array of the apps folder on the server (e.g. /srv/http/owncloud) 'path' and
* web path in 'url'
*/
public static $APPSROOTS = array();
/*
* requested app
*/
public static $REQUESTEDAPP = '';
/*
* requested file of app
*/
public static $REQUESTEDFILE = '';
/**
* check if owncloud runs in cli mode
*/
public static $CLI = false;
/*
* OC router
*/
protected static $router = null;
/**
2013-05-28 03:04:09 +04:00
* @var \OC\Session\Session
2013-01-14 23:30:28 +04:00
*/
2013-05-28 03:04:09 +04:00
public static $session = null;
2013-01-14 23:30:28 +04:00
/**
2013-05-08 00:16:02 +04:00
* @var \OC\Autoloader $loader
2013-01-14 23:30:28 +04:00
*/
2013-05-08 00:16:02 +04:00
public static $loader = null;
2013-01-14 23:30:28 +04:00
2013-08-21 02:58:15 +04:00
/**
* @var \OC\Server
*/
public static $server = null;
public static function initPaths() {
2013-01-14 23:30:28 +04:00
// calculate the root directories
OC::$SERVERROOT = str_replace("\\", '/', substr(__DIR__, 0, -4));
// ensure we can find OC_Config
set_include_path(
OC::$SERVERROOT . '/lib' . PATH_SEPARATOR .
get_include_path()
);
2013-01-14 23:30:28 +04:00
OC::$SUBURI = str_replace("\\", "/", substr(realpath($_SERVER["SCRIPT_FILENAME"]), strlen(OC::$SERVERROOT)));
$scriptName = OC_Request::scriptName();
2013-01-14 23:30:28 +04:00
if (substr($scriptName, -1) == '/') {
$scriptName .= 'index.php';
//make sure suburi follows the same rules as scriptName
if (substr(OC::$SUBURI, -9) != 'index.php') {
if (substr(OC::$SUBURI, -1) != '/') {
OC::$SUBURI = OC::$SUBURI . '/';
}
OC::$SUBURI = OC::$SUBURI . 'index.php';
}
}
OC::$WEBROOT = substr($scriptName, 0, strlen($scriptName) - strlen(OC::$SUBURI));
if (OC::$WEBROOT != '' and OC::$WEBROOT[0] !== '/') {
OC::$WEBROOT = '/' . OC::$WEBROOT;
}
// search the 3rdparty folder
if (OC_Config::getValue('3rdpartyroot', '') <> '' and OC_Config::getValue('3rdpartyurl', '') <> '') {
OC::$THIRDPARTYROOT = OC_Config::getValue('3rdpartyroot', '');
OC::$THIRDPARTYWEBROOT = OC_Config::getValue('3rdpartyurl', '');
} elseif (file_exists(OC::$SERVERROOT . '/3rdparty')) {
OC::$THIRDPARTYROOT = OC::$SERVERROOT;
OC::$THIRDPARTYWEBROOT = OC::$WEBROOT;
} elseif (file_exists(OC::$SERVERROOT . '/../3rdparty')) {
OC::$THIRDPARTYWEBROOT = rtrim(dirname(OC::$WEBROOT), '/');
OC::$THIRDPARTYROOT = rtrim(dirname(OC::$SERVERROOT), '/');
} else {
2013-07-17 00:36:39 +04:00
throw new Exception('3rdparty directory not found! Please put the ownCloud 3rdparty'
2013-02-11 20:44:02 +04:00
.' folder in the ownCloud folder or the folder above.'
.' You can also configure the location in the config.php file.');
2013-01-14 23:30:28 +04:00
}
// search the apps folder
$config_paths = OC_Config::getValue('apps_paths', array());
if (!empty($config_paths)) {
foreach ($config_paths as $paths) {
if (isset($paths['url']) && isset($paths['path'])) {
$paths['url'] = rtrim($paths['url'], '/');
$paths['path'] = rtrim($paths['path'], '/');
OC::$APPSROOTS[] = $paths;
}
}
} elseif (file_exists(OC::$SERVERROOT . '/apps')) {
OC::$APPSROOTS[] = array('path' => OC::$SERVERROOT . '/apps', 'url' => '/apps', 'writable' => true);
} elseif (file_exists(OC::$SERVERROOT . '/../apps')) {
2013-02-11 20:44:02 +04:00
OC::$APPSROOTS[] = array(
'path' => rtrim(dirname(OC::$SERVERROOT), '/') . '/apps',
'url' => '/apps',
'writable' => true
);
2013-01-14 23:30:28 +04:00
}
if (empty(OC::$APPSROOTS)) {
2013-07-17 00:36:39 +04:00
throw new Exception('apps directory not found! Please put the ownCloud apps folder in the ownCloud folder'
.' or the folder above. You can also configure the location in the config.php file.');
2013-01-14 23:30:28 +04:00
}
$paths = array();
foreach (OC::$APPSROOTS as $path) {
2013-01-14 23:30:28 +04:00
$paths[] = $path['path'];
}
2013-01-14 23:30:28 +04:00
// set the right include path
set_include_path(
OC::$SERVERROOT . '/lib/private' . PATH_SEPARATOR .
OC::$SERVERROOT . '/config' . PATH_SEPARATOR .
OC::$THIRDPARTYROOT . '/3rdparty' . PATH_SEPARATOR .
implode($paths, PATH_SEPARATOR) . PATH_SEPARATOR .
get_include_path() . PATH_SEPARATOR .
OC::$SERVERROOT
2013-01-14 23:30:28 +04:00
);
}
public static function checkConfig() {
2013-02-11 20:44:02 +04:00
if (file_exists(OC::$SERVERROOT . "/config/config.php")
and !is_writable(OC::$SERVERROOT . "/config/config.php")) {
Merge https://github.com/owncloud/core/pull/3827 Squashed commit of the following: commit eed4b49cebcbcc252a75ed85097730b73213b0da Author: Björn Schießle <schiessle@owncloud.com> Date: Mon Jul 8 10:03:23 2013 +0200 initialize OC_Defaults only once commit bf6f07ccc8fb87535a069ca341789a590cb187ee Author: Björn Schießle <schiessle@owncloud.com> Date: Mon Jul 8 10:02:48 2013 +0200 link to doc in error messages commit ea61ee60e06ee98f2671aec1fdaff666c50f47c2 Merge: e41af3d 3c1308f Author: Björn Schießle <schiessle@owncloud.com> Date: Thu Jul 4 11:10:56 2013 +0200 Merge branch 'master' into better-messages commit e41af3d7bad26aa5ca9ab21ec7dcbadd3cfe5d4f Author: Björn Schießle <schiessle@owncloud.com> Date: Thu Jul 4 11:10:41 2013 +0200 move to non-static defaults.php commit 9e4258b1905244bdf34943a825421f041cbed43d Author: Björn Schießle <schiessle@owncloud.com> Date: Tue Jul 2 10:32:13 2013 +0200 no sprintf here, lets t() handle it commit fe1df349e248667a137f70d78b04225e5b42a111 Merge: d8f6859 cb5811b Author: Björn Schießle <schiessle@owncloud.com> Date: Mon Jul 1 11:13:38 2013 +0200 Merge branch 'master' into better-messages commit d8f68595df2dc0e0917d916cbde511ec5333010b Author: Björn Schießle <schiessle@owncloud.com> Date: Mon Jul 1 11:10:57 2013 +0200 use document base url from defaults.php commit 6c5403748a45717125a2aa375550f05646317d72 Merge: bea6b1c 7b0e3e6 Author: Björn Schießle <schiessle@owncloud.com> Date: Mon Jul 1 11:00:15 2013 +0200 Merge branch 'master' into better-messages commit bea6b1c8a0968846065b9153e0a3f46a4e3245ee Author: Jan-Christoph Borchardt <hey@jancborchardt.net> Date: Mon Jun 24 16:21:12 2013 +0200 link to docs in WebDAV message, ref #3791 commit 3119b364a1094769e711283d1ce9014505f64ab9 Author: Jan-Christoph Borchardt <hey@jancborchardt.net> Date: Mon Jun 24 16:10:21 2013 +0200 link to docs in error messages, fix #3819
2013-07-08 12:07:57 +04:00
$defaults = new OC_Defaults();
2013-07-17 00:36:39 +04:00
OC_Template::printErrorPage(
"Can't write into config directory!",
2013-07-17 00:36:39 +04:00
'This can usually be fixed by '
Merge https://github.com/owncloud/core/pull/3827 Squashed commit of the following: commit eed4b49cebcbcc252a75ed85097730b73213b0da Author: Björn Schießle <schiessle@owncloud.com> Date: Mon Jul 8 10:03:23 2013 +0200 initialize OC_Defaults only once commit bf6f07ccc8fb87535a069ca341789a590cb187ee Author: Björn Schießle <schiessle@owncloud.com> Date: Mon Jul 8 10:02:48 2013 +0200 link to doc in error messages commit ea61ee60e06ee98f2671aec1fdaff666c50f47c2 Merge: e41af3d 3c1308f Author: Björn Schießle <schiessle@owncloud.com> Date: Thu Jul 4 11:10:56 2013 +0200 Merge branch 'master' into better-messages commit e41af3d7bad26aa5ca9ab21ec7dcbadd3cfe5d4f Author: Björn Schießle <schiessle@owncloud.com> Date: Thu Jul 4 11:10:41 2013 +0200 move to non-static defaults.php commit 9e4258b1905244bdf34943a825421f041cbed43d Author: Björn Schießle <schiessle@owncloud.com> Date: Tue Jul 2 10:32:13 2013 +0200 no sprintf here, lets t() handle it commit fe1df349e248667a137f70d78b04225e5b42a111 Merge: d8f6859 cb5811b Author: Björn Schießle <schiessle@owncloud.com> Date: Mon Jul 1 11:13:38 2013 +0200 Merge branch 'master' into better-messages commit d8f68595df2dc0e0917d916cbde511ec5333010b Author: Björn Schießle <schiessle@owncloud.com> Date: Mon Jul 1 11:10:57 2013 +0200 use document base url from defaults.php commit 6c5403748a45717125a2aa375550f05646317d72 Merge: bea6b1c 7b0e3e6 Author: Björn Schießle <schiessle@owncloud.com> Date: Mon Jul 1 11:00:15 2013 +0200 Merge branch 'master' into better-messages commit bea6b1c8a0968846065b9153e0a3f46a4e3245ee Author: Jan-Christoph Borchardt <hey@jancborchardt.net> Date: Mon Jun 24 16:21:12 2013 +0200 link to docs in WebDAV message, ref #3791 commit 3119b364a1094769e711283d1ce9014505f64ab9 Author: Jan-Christoph Borchardt <hey@jancborchardt.net> Date: Mon Jun 24 16:10:21 2013 +0200 link to docs in error messages, fix #3819
2013-07-08 12:07:57 +04:00
.'<a href="' . $defaults->getDocBaseUrl() . '/server/5.0/admin_manual/installation/installation_source.html#set-the-directory-permissions" target="_blank">giving the webserver write access to the config directory</a>.'
2013-07-17 00:36:39 +04:00
);
}
}
public static function checkInstalled() {
2013-01-14 23:30:28 +04:00
// Redirect to installer if not installed
if (!OC_Config::getValue('installed', false) && OC::$SUBURI != '/index.php') {
if (!OC::$CLI) {
$url = 'http://' . $_SERVER['SERVER_NAME'] . OC::$WEBROOT . '/index.php';
header("Location: $url");
}
exit();
}
}
public static function checkSSL() {
2013-01-14 23:30:28 +04:00
// redirect to https site if configured
if (OC_Config::getValue("forcessl", false)) {
header('Strict-Transport-Security: max-age=31536000');
ini_set("session.cookie_secure", "on");
if (OC_Request::serverProtocol() <> 'https' and !OC::$CLI) {
$url = "https://" . OC_Request::serverHost() . OC_Request::requestUri();
2013-01-14 23:30:28 +04:00
header("Location: $url");
exit();
}
2013-02-14 22:23:29 +04:00
} else {
// Invalidate HSTS headers
if (OC_Request::serverProtocol() === 'https') {
header('Strict-Transport-Security: max-age=0');
}
2013-01-14 23:30:28 +04:00
}
}
public static function checkMaintenanceMode() {
// Allow ajax update script to execute without being stopped
if (OC_Config::getValue('maintenance', false) && OC::$SUBURI != '/core/ajax/update.php') {
// send http status 503
header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
header('Retry-After: 120');
// render error page
2013-07-17 00:36:39 +04:00
OC_Template::printErrorPage('ownCloud is in maintenance mode');
}
}
public static function checkUpgrade($showTemplate = true) {
if (OC_Config::getValue('installed', false)) {
$installedVersion = OC_Config::getValue('version', '0.0.0');
$currentVersion = implode('.', OC_Util::getVersion());
if (version_compare($currentVersion, $installedVersion, '>')) {
if ($showTemplate && !OC_Config::getValue('maintenance', false)) {
2013-05-14 17:34:01 +04:00
OC_Config::setValue('theme', '');
$minimizerCSS = new OC_Minimizer_CSS();
$minimizerCSS->clearCache();
$minimizerJS = new OC_Minimizer_JS();
$minimizerJS->clearCache();
2013-01-25 22:18:16 +04:00
OC_Util::addscript('update');
$tmpl = new OC_Template('', 'update', 'guest');
$tmpl->assign('version', OC_Util::getVersionString());
$tmpl->printPage();
exit();
} else {
return true;
}
}
return false;
}
}
public static function initTemplateEngine() {
2013-01-14 23:30:28 +04:00
// Add the stuff we need always
OC_Util::addScript("jquery-1.10.0.min");
OC_Util::addScript("jquery-migrate-1.2.1.min");
2013-01-23 14:37:28 +04:00
OC_Util::addScript("jquery-ui-1.10.0.custom");
2013-01-14 23:30:28 +04:00
OC_Util::addScript("jquery-showpassword");
OC_Util::addScript("jquery.infieldlabel");
OC_Util::addScript("jquery-tipsy");
OC_Util::addScript("compatibility");
OC_Util::addScript("jquery.ocdialog");
2013-01-14 23:30:28 +04:00
OC_Util::addScript("oc-dialogs");
OC_Util::addScript("js");
2013-08-15 01:06:43 +04:00
OC_Util::addScript("octemplate");
2013-01-14 23:30:28 +04:00
OC_Util::addScript("eventsource");
OC_Util::addScript("config");
//OC_Util::addScript( "multiselect" );
OC_Util::addScript('search', 'result');
OC_Util::addScript('router');
OC_Util::addScript("oc-requesttoken");
2013-01-14 23:30:28 +04:00
// avatars
if (\OC_Config::getValue('enable_avatars', true) === true) {
\OC_Util::addScript('placeholder');
\OC_Util::addScript('3rdparty', 'md5/md5.min');
\OC_Util::addScript('jquery.avatar');
\OC_Util::addScript('avatar');
}
2013-08-29 16:26:11 +04:00
2013-01-14 23:30:28 +04:00
OC_Util::addStyle("styles");
OC_Util::addStyle("apps");
OC_Util::addStyle("fixes");
2013-01-14 23:30:28 +04:00
OC_Util::addStyle("multiselect");
2013-01-23 14:37:28 +04:00
OC_Util::addStyle("jquery-ui-1.10.0.custom");
2013-01-14 23:30:28 +04:00
OC_Util::addStyle("jquery-tipsy");
OC_Util::addStyle("jquery.ocdialog");
2013-01-14 23:30:28 +04:00
}
public static function initSession() {
2013-01-14 23:30:28 +04:00
// prevents javascript from accessing php session cookies
ini_set('session.cookie_httponly', '1;');
// set the cookie path to the ownCloud directory
$cookie_path = OC::$WEBROOT ? : '/';
ini_set('session.cookie_path', $cookie_path);
2013-06-18 00:41:07 +04:00
//set the session object to a dummy session so code relying on the session existing still works
self::$session = new \OC\Session\Memory('');
try {
2013-05-28 03:04:09 +04:00
// set the session name to the instance id - which is unique
2013-05-28 03:10:18 +04:00
self::$session = new \OC\Session\Internal(OC_Util::getInstanceId());
2013-05-28 03:04:09 +04:00
// if session cant be started break with http 500 error
} catch (Exception $e) {
2013-05-28 03:04:09 +04:00
OC_Log::write('core', 'Session could not be initialized',
OC_Log::ERROR);
2013-05-28 03:04:09 +04:00
header('HTTP/1.1 500 Internal Server Error');
2013-02-27 14:36:05 +04:00
OC_Util::addStyle("styles");
2013-02-25 22:17:29 +04:00
$error = 'Session could not be initialized. Please contact your ';
$error .= 'system administrator';
2013-07-17 00:36:39 +04:00
OC_Template::printErrorPage($error);
}
2013-01-14 23:30:28 +04:00
$sessionLifeTime = self::getSessionLifeTime();
2013-01-14 23:30:28 +04:00
// regenerate session id periodically to avoid session fixation
2013-05-28 03:04:09 +04:00
if (!self::$session->exists('SID_CREATED')) {
self::$session->set('SID_CREATED', time());
} else if (time() - self::$session->get('SID_CREATED') > $sessionLifeTime / 2) {
2013-01-14 23:30:28 +04:00
session_regenerate_id(true);
2013-05-28 03:04:09 +04:00
self::$session->set('SID_CREATED', time());
2013-01-14 23:30:28 +04:00
}
// session timeout
if (self::$session->exists('LAST_ACTIVITY') && (time() - self::$session->get('LAST_ACTIVITY') > $sessionLifeTime)) {
2013-01-14 23:30:28 +04:00
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time() - 42000, $cookie_path);
2013-01-14 23:30:28 +04:00
}
session_unset();
session_destroy();
session_start();
}
2013-05-28 03:04:09 +04:00
self::$session->set('LAST_ACTIVITY', time());
2013-01-14 23:30:28 +04:00
}
/**
* @return int
*/
private static function getSessionLifeTime() {
return OC_Config::getValue('session_lifetime', 60 * 60 * 24);
}
public static function getRouter() {
2013-01-14 23:30:28 +04:00
if (!isset(OC::$router)) {
OC::$router = new OC_Router();
OC::$router->loadRoutes();
}
return OC::$router;
}
2013-01-18 00:42:33 +04:00
public static function loadAppClassPaths() {
foreach (OC_APP::getEnabledApps() as $app) {
$file = OC_App::getAppPath($app) . '/appinfo/classpath.php';
if (file_exists($file)) {
2013-01-18 00:44:40 +04:00
require_once $file;
}
}
}
2013-01-18 00:42:33 +04:00
public static function init() {
2013-01-14 23:30:28 +04:00
// register autoloader
require_once __DIR__ . '/autoloader.php';
self::$loader = new \OC\Autoloader();
self::$loader->registerPrefix('Doctrine\\Common', 'doctrine/common/lib');
self::$loader->registerPrefix('Doctrine\\DBAL', 'doctrine/dbal/lib');
self::$loader->registerPrefix('Symfony\\Component\\Routing', 'symfony/routing');
self::$loader->registerPrefix('Symfony\\Component\\Console', 'symfony/console');
self::$loader->registerPrefix('Sabre\\VObject', '3rdparty');
self::$loader->registerPrefix('Sabre_', '3rdparty');
self::$loader->registerPrefix('Patchwork', '3rdparty');
2013-05-08 00:16:02 +04:00
spl_autoload_register(array(self::$loader, 'load'));
2013-01-14 23:30:28 +04:00
// set some stuff
//ob_start();
error_reporting(E_ALL | E_STRICT);
if (defined('DEBUG') && DEBUG) {
ini_set('display_errors', 1);
}
self::$CLI = (php_sapi_name() == 'cli');
date_default_timezone_set('UTC');
ini_set('arg_separator.output', '&amp;');
// try to switch magic quotes off.
if (get_magic_quotes_gpc() == 1) {
2013-03-18 01:05:45 +04:00
ini_set('magic_quotes_runtime', 0);
2013-01-14 23:30:28 +04:00
}
//try to configure php to enable big file uploads.
//this doesn´t work always depending on the webserver and php configuration.
//Let´s try to overwrite some defaults anyways
//try to set the maximum execution time to 60min
@set_time_limit(3600);
@ini_set('max_execution_time', 3600);
@ini_set('max_input_time', 3600);
//try to set the maximum filesize to 10G
@ini_set('upload_max_filesize', '10G');
@ini_set('post_max_size', '10G');
@ini_set('file_uploads', '50');
//copy http auth headers for apache+php-fcgid work around
if (isset($_SERVER['HTTP_XAUTHORIZATION']) && !isset($_SERVER['HTTP_AUTHORIZATION'])) {
$_SERVER['HTTP_AUTHORIZATION'] = $_SERVER['HTTP_XAUTHORIZATION'];
}
//set http auth headers for apache+php-cgi work around
2013-02-11 20:44:02 +04:00
if (isset($_SERVER['HTTP_AUTHORIZATION'])
&& preg_match('/Basic\s+(.*)$/i', $_SERVER['HTTP_AUTHORIZATION'], $matches)
) {
2013-01-14 23:30:28 +04:00
list($name, $password) = explode(':', base64_decode($matches[1]), 2);
$_SERVER['PHP_AUTH_USER'] = strip_tags($name);
$_SERVER['PHP_AUTH_PW'] = strip_tags($password);
}
//set http auth headers for apache+php-cgi work around if variable gets renamed by apache
2013-02-11 20:44:02 +04:00
if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])
&& preg_match('/Basic\s+(.*)$/i', $_SERVER['REDIRECT_HTTP_AUTHORIZATION'], $matches)
) {
2013-01-14 23:30:28 +04:00
list($name, $password) = explode(':', base64_decode($matches[1]), 2);
$_SERVER['PHP_AUTH_USER'] = strip_tags($name);
$_SERVER['PHP_AUTH_PW'] = strip_tags($password);
}
self::initPaths();
OC_Util::isSetLocaleWorking();
2013-01-14 23:30:28 +04:00
// set debug mode if an xdebug session is active
if (!defined('DEBUG') || !DEBUG) {
if (isset($_COOKIE['XDEBUG_SESSION'])) {
define('DEBUG', true);
}
}
if (!defined('PHPUNIT_RUN')) {
if (defined('DEBUG') and DEBUG) {
set_exception_handler(array('OC_Template', 'printExceptionErrorPage'));
} else {
OC\Log\ErrorHandler::register();
OC\Log\ErrorHandler::setLogger(OC_Log::$object);
}
}
2013-01-14 23:30:28 +04:00
// register the stream wrappers
stream_wrapper_register('fakedir', 'OC\Files\Stream\Dir');
stream_wrapper_register('static', 'OC\Files\Stream\StaticStream');
stream_wrapper_register('close', 'OC\Files\Stream\Close');
stream_wrapper_register('quota', 'OC\Files\Stream\Quota');
stream_wrapper_register('oc', 'OC\Files\Stream\OC');
2013-01-14 23:30:28 +04:00
// setup the basic server
self::$server = new \OC\Server();
self::initTemplateEngine();
if (!self::$CLI) {
self::initSession();
2013-05-28 03:15:38 +04:00
} else {
self::$session = new \OC\Session\Memory('');
}
2013-05-31 19:31:52 +04:00
self::checkConfig();
self::checkInstalled();
self::checkSSL();
2013-01-14 23:30:28 +04:00
$errors = OC_Util::checkServer();
if (count($errors) > 0) {
OC_Template::printGuestPage('', 'error', array('errors' => $errors));
exit;
}
//try to set the session lifetime
$sessionLifeTime = self::getSessionLifeTime();
@ini_set('gc_maxlifetime', (string)$sessionLifeTime);
2013-01-14 23:30:28 +04:00
// User and Groups
if (!OC_Config::getValue("installed", false)) {
self::$session->set('user_id', '');
2013-01-14 23:30:28 +04:00
}
OC_User::useBackend(new OC_User_Database());
OC_Group::useBackend(new OC_Group_Database());
2013-05-28 03:04:09 +04:00
if (isset($_SERVER['PHP_AUTH_USER']) && self::$session->exists('user_id')
&& $_SERVER['PHP_AUTH_USER'] != self::$session->get('user_id')) {
2013-01-14 23:30:28 +04:00
OC_User::logout();
}
// Load Apps
// This includes plugins for users and filesystems as well
global $RUNTIME_NOAPPS;
global $RUNTIME_APPTYPES;
if (!$RUNTIME_NOAPPS) {
if ($RUNTIME_APPTYPES) {
OC_App::loadApps($RUNTIME_APPTYPES);
} else {
OC_App::loadApps();
}
}
//setup extra user backends
OC_User::setupBackends();
self::registerCacheHooks();
self::registerFilesystemHooks();
self::registerPreviewHooks();
2013-01-14 23:30:28 +04:00
self::registerShareHooks();
self::registerLogRotate();
2013-01-14 23:30:28 +04:00
//make sure temporary files are cleaned up
register_shutdown_function(array('OC_Helper', 'cleanTmp'));
//parse the given parameters
self::$REQUESTEDAPP = (isset($_GET['app']) && trim($_GET['app']) != '' && !is_null($_GET['app']) ? OC_App::cleanAppId(strip_tags($_GET['app'])) : OC_Config::getValue('defaultapp', 'files'));
2013-01-14 23:30:28 +04:00
if (substr_count(self::$REQUESTEDAPP, '?') != 0) {
$app = substr(self::$REQUESTEDAPP, 0, strpos(self::$REQUESTEDAPP, '?'));
$param = substr($_GET['app'], strpos($_GET['app'], '?') + 1);
parse_str($param, $get);
$_GET = array_merge($_GET, $get);
self::$REQUESTEDAPP = $app;
$_GET['app'] = $app;
}
self::$REQUESTEDFILE = (isset($_GET['getfile']) ? $_GET['getfile'] : null);
if (substr_count(self::$REQUESTEDFILE, '?') != 0) {
$file = substr(self::$REQUESTEDFILE, 0, strpos(self::$REQUESTEDFILE, '?'));
$param = substr(self::$REQUESTEDFILE, strpos(self::$REQUESTEDFILE, '?') + 1);
parse_str($param, $get);
$_GET = array_merge($_GET, $get);
self::$REQUESTEDFILE = $file;
$_GET['getfile'] = $file;
}
if (!is_null(self::$REQUESTEDFILE)) {
$subdir = OC_App::getAppPath(OC::$REQUESTEDAPP) . '/' . self::$REQUESTEDFILE;
$parent = OC_App::getAppPath(OC::$REQUESTEDAPP);
if (!OC_Helper::issubdirectory($subdir, $parent)) {
self::$REQUESTEDFILE = null;
header('HTTP/1.0 404 Not Found');
exit;
}
}
// write error into log if locale can't be set
if (OC_Util::isSetLocaleWorking() == false) {
2013-02-11 20:44:02 +04:00
OC_Log::write('core',
'setting locale to en_US.UTF-8/en_US.UTF8 failed. Support is probably not installed on your system',
OC_Log::ERROR);
2013-01-14 23:30:28 +04:00
}
if (OC_Config::getValue('installed', false) && !self::checkUpgrade(false)) {
2013-01-14 23:30:28 +04:00
if (OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') {
OC_Util::addScript('backgroundjobs');
}
}
}
/**
* register hooks for the cache
*/
public static function registerCacheHooks() {
if (OC_Config::getValue('installed', false)) { //don't try to do this before we are properly setup
// register cache cleanup jobs
try { //if this is executed before the upgrade to the new backgroundjob system is completed it will throw an exception
\OCP\BackgroundJob::registerJob('OC\Cache\FileGlobalGC');
} catch (Exception $e) {
}
2013-09-18 15:15:38 +04:00
// NOTE: This will be replaced to use OCP
$userSession = \OC_User::getUserSession();
$userSession->listen('postLogin', '\OC\Cache\File', 'loginListener');
}
2013-01-14 23:30:28 +04:00
}
/**
* register hooks for the cache
*/
public static function registerLogRotate() {
if (OC_Config::getValue('installed', false) && OC_Config::getValue('log_rotate_size', false)) {
//don't try to do this before we are properly setup
// register cache cleanup jobs
try { //if this is executed before the upgrade to the new backgroundjob system is completed it will throw an exception
\OCP\BackgroundJob::registerJob('OC\Log\Rotate', OC_Config::getValue("datadirectory", OC::$SERVERROOT.'/data').'/owncloud.log');
} catch (Exception $e) {
}
}
}
2013-01-14 23:30:28 +04:00
/**
* register hooks for the filesystem
*/
public static function registerFilesystemHooks() {
2013-01-14 23:30:28 +04:00
// Check for blacklisted files
OC_Hook::connect('OC_Filesystem', 'write', 'OC_Filesystem', 'isBlacklisted');
OC_Hook::connect('OC_Filesystem', 'rename', 'OC_Filesystem', 'isBlacklisted');
}
/**
* register hooks for previews
*/
public static function registerPreviewHooks() {
2013-05-29 14:33:24 +04:00
OC_Hook::connect('OC_Filesystem', 'post_write', 'OC\Preview', 'post_write');
OC_Hook::connect('OC_Filesystem', 'delete', 'OC\Preview', 'post_delete');
}
2013-01-14 23:30:28 +04:00
/**
* register hooks for sharing
*/
public static function registerShareHooks() {
if(\OC_Config::getValue('installed')) {
OC_Hook::connect('OC_User', 'post_deleteUser', 'OCP\Share', 'post_deleteUser');
OC_Hook::connect('OC_User', 'post_addToGroup', 'OCP\Share', 'post_addToGroup');
OC_Hook::connect('OC_User', 'post_removeFromGroup', 'OCP\Share', 'post_removeFromGroup');
OC_Hook::connect('OC_User', 'post_deleteGroup', 'OCP\Share', 'post_deleteGroup');
}
2013-01-14 23:30:28 +04:00
}
/**
* @brief Handle the request
*/
public static function handleRequest() {
2013-01-18 00:44:40 +04:00
// load all the classpaths from the enabled apps so they are available
// in the routing files of each app
OC::loadAppClassPaths();
2013-01-18 00:42:33 +04:00
// Check if ownCloud is installed or in maintenance (update) mode
if (!OC_Config::getValue('installed', false)) {
require_once 'core/setup.php';
exit();
}
2013-02-06 02:33:44 +04:00
2013-01-31 02:05:44 +04:00
$request = OC_Request::getPathInfo();
2013-02-09 19:46:55 +04:00
if(substr($request, -3) !== '.js') {// we need these files during the upgrade
2013-01-31 02:05:44 +04:00
self::checkMaintenanceMode();
self::checkUpgrade();
}
2013-06-05 02:38:08 +04:00
// Test it the user is already authenticated using Apaches AuthType Basic... very usable in combination with LDAP
2013-05-25 06:51:51 +04:00
OC::tryBasicAuthLogin();
2013-05-31 02:53:57 +04:00
if (!self::$CLI) {
try {
if (!OC_Config::getValue('maintenance', false)) {
OC_App::loadApps();
}
OC::getRouter()->match(OC_Request::getRawPathInfo());
return;
} catch (Symfony\Component\Routing\Exception\ResourceNotFoundException $e) {
//header('HTTP/1.0 404 Not Found');
} catch (Symfony\Component\Routing\Exception\MethodNotAllowedException $e) {
OC_Response::setStatus(405);
return;
}
2013-01-14 23:30:28 +04:00
}
2013-01-31 02:05:44 +04:00
2013-01-14 23:30:28 +04:00
$app = OC::$REQUESTEDAPP;
$file = OC::$REQUESTEDFILE;
$param = array('app' => $app, 'file' => $file);
// Handle app css files
if (substr($file, -3) == 'css') {
self::loadCSSFile($param);
return;
}
// Handle redirect URL for logged in users
if (isset($_REQUEST['redirect_url']) && OC_User::isLoggedIn()) {
$location = OC_Helper::makeURLAbsolute(urldecode($_REQUEST['redirect_url']));
2013-05-28 03:04:09 +04:00
2013-04-23 01:26:40 +04:00
// Deny the redirect if the URL contains a @
// This prevents unvalidated redirects like ?redirect_url=:user@domain.com
2013-05-08 00:16:02 +04:00
if (strpos($location, '@') === false) {
2013-04-23 01:26:40 +04:00
header('Location: ' . $location);
return;
}
}
// Handle WebDAV
if ($_SERVER['REQUEST_METHOD'] == 'PROPFIND') {
header('location: ' . OC_Helper::linkToRemote('webdav'));
return;
}
2013-01-14 23:30:28 +04:00
// Someone is logged in :
if (OC_User::isLoggedIn()) {
OC_App::loadApps();
OC_User::setupBackends();
if (isset($_GET["logout"]) and ($_GET["logout"])) {
if (isset($_COOKIE['oc_token'])) {
OC_Preferences::deleteKey(OC_User::getUser(), 'login_token', $_COOKIE['oc_token']);
}
OC_User::logout();
header("Location: " . OC::$WEBROOT . '/');
} else {
if (is_null($file)) {
$param['file'] = 'index.php';
}
$file_ext = substr($param['file'], -3);
if ($file_ext != 'php'
|| !self::loadAppScriptFile($param)
) {
2013-01-14 23:30:28 +04:00
header('HTTP/1.0 404 Not Found');
}
}
return;
}
// Not handled and not logged in
self::handleLogin();
}
public static function loadAppScriptFile($param) {
2013-01-14 23:30:28 +04:00
OC_App::loadApps();
$app = $param['app'];
$file = $param['file'];
$app_path = OC_App::getAppPath($app);
if (OC_App::isEnabled($app) && $app_path !== false) {
$file = $app_path . '/' . $file;
unset($app, $app_path);
if (file_exists($file)) {
require_once $file;
return true;
}
2013-01-14 23:30:28 +04:00
}
header('HTTP/1.0 404 Not Found');
2013-01-14 23:30:28 +04:00
return false;
}
public static function loadCSSFile($param) {
2013-01-14 23:30:28 +04:00
$app = $param['app'];
$file = $param['file'];
$app_path = OC_App::getAppPath($app);
if (file_exists($app_path . '/' . $file)) {
$app_web_path = OC_App::getAppWebPath($app);
$filepath = $app_web_path . '/' . $file;
$minimizer = new OC_Minimizer_CSS();
$info = array($app_path, $app_web_path, $file);
$minimizer->output(array($info), $filepath);
}
}
protected static function handleLogin() {
2013-01-14 23:30:28 +04:00
OC_App::loadApps(array('prelogin'));
$error = array();
// remember was checked after last login
if (OC::tryRememberLogin()) {
$error[] = 'invalidcookie';
// Someone wants to log in :
2013-01-14 23:30:28 +04:00
} elseif (OC::tryFormLogin()) {
$error[] = 'invalidpassword';
}
2013-05-31 02:53:57 +04:00
2013-01-14 23:30:28 +04:00
OC_Util::displayLoginPage(array_unique($error));
}
protected static function cleanupLoginTokens($user) {
2013-01-14 23:30:28 +04:00
$cutoff = time() - OC_Config::getValue('remember_login_cookie_lifetime', 60 * 60 * 24 * 15);
$tokens = OC_Preferences::getKeys($user, 'login_token');
foreach ($tokens as $token) {
$time = OC_Preferences::getValue($user, 'login_token', $token);
if ($time < $cutoff) {
OC_Preferences::deleteKey($user, 'login_token', $token);
}
}
}
protected static function tryRememberLogin() {
2013-01-14 23:30:28 +04:00
if (!isset($_COOKIE["oc_remember_login"])
|| !isset($_COOKIE["oc_token"])
|| !isset($_COOKIE["oc_username"])
|| !$_COOKIE["oc_remember_login"]
|| !OC_Util::rememberLoginAllowed()
) {
2013-01-14 23:30:28 +04:00
return false;
}
OC_App::loadApps(array('authentication'));
if (defined("DEBUG") && DEBUG) {
OC_Log::write('core', 'Trying to login from cookie', OC_Log::DEBUG);
}
// confirm credentials in cookie
if (isset($_COOKIE['oc_token']) && OC_User::userExists($_COOKIE['oc_username'])) {
// delete outdated cookies
self::cleanupLoginTokens($_COOKIE['oc_username']);
// get stored tokens
$tokens = OC_Preferences::getKeys($_COOKIE['oc_username'], 'login_token');
// test cookies token against stored tokens
if (in_array($_COOKIE['oc_token'], $tokens, true)) {
// replace successfully used token with a new one
OC_Preferences::deleteKey($_COOKIE['oc_username'], 'login_token', $_COOKIE['oc_token']);
$token = OC_Util::generateRandomBytes(32);
2013-01-14 23:30:28 +04:00
OC_Preferences::setValue($_COOKIE['oc_username'], 'login_token', $token, time());
OC_User::setMagicInCookie($_COOKIE['oc_username'], $token);
// login
OC_User::setUserId($_COOKIE['oc_username']);
OC_Util::redirectToDefaultPage();
// doesn't return
}
// if you reach this point you have changed your password
// or you are an attacker
// we can not delete tokens here because users may reach
// this point multiple times after a password change
OC_Log::write('core', 'Authentication cookie rejected for user ' . $_COOKIE['oc_username'], OC_Log::WARN);
}
OC_User::unsetMagicInCookie();
return true;
}
protected static function tryFormLogin() {
2013-01-14 23:30:28 +04:00
if (!isset($_POST["user"]) || !isset($_POST['password'])) {
return false;
}
2013-01-14 23:30:28 +04:00
OC_App::loadApps();
//setup extra user backends
OC_User::setupBackends();
if (OC_User::login($_POST["user"], $_POST["password"])) {
// setting up the time zone
if (isset($_POST['timezone-offset'])) {
2013-05-28 03:04:09 +04:00
self::$session->set('timezone', $_POST['timezone-offset']);
2013-01-14 23:30:28 +04:00
}
$userid = OC_User::getUser();
self::cleanupLoginTokens($userid);
2013-01-14 23:30:28 +04:00
if (!empty($_POST["remember_login"])) {
if (defined("DEBUG") && DEBUG) {
OC_Log::write('core', 'Setting remember login to cookie', OC_Log::DEBUG);
}
$token = OC_Util::generateRandomBytes(32);
OC_Preferences::setValue($userid, 'login_token', $token, time());
OC_User::setMagicInCookie($userid, $token);
2013-01-14 23:30:28 +04:00
} else {
OC_User::unsetMagicInCookie();
}
OC_Util::redirectToDefaultPage();
exit();
}
return true;
}
protected static function tryBasicAuthLogin() {
2013-01-14 23:30:28 +04:00
if (!isset($_SERVER["PHP_AUTH_USER"])
|| !isset($_SERVER["PHP_AUTH_PW"])
) {
2013-01-14 23:30:28 +04:00
return false;
}
OC_App::loadApps(array('authentication'));
if (OC_User::login($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])) {
//OC_Log::write('core',"Logged in with HTTP Authentication", OC_Log::DEBUG);
OC_User::unsetMagicInCookie();
$_SERVER['HTTP_REQUESTTOKEN'] = OC_Util::callRegister();
2013-01-14 23:30:28 +04:00
}
return true;
}
}
2010-03-10 15:03:40 +03:00
2011-09-18 22:57:05 +04:00
// define runtime variables - unless this already has been done
if (!isset($RUNTIME_NOAPPS)) {
2013-01-14 23:30:28 +04:00
$RUNTIME_NOAPPS = false;
2011-07-29 23:03:53 +04:00
}
if (!function_exists('get_temp_dir')) {
function get_temp_dir() {
2013-01-14 23:30:28 +04:00
if ($temp = ini_get('upload_tmp_dir')) return $temp;
if ($temp = getenv('TMP')) return $temp;
if ($temp = getenv('TEMP')) return $temp;
if ($temp = getenv('TMPDIR')) return $temp;
$temp = tempnam(__FILE__, '');
if (file_exists($temp)) {
unlink($temp);
return dirname($temp);
}
if ($temp = sys_get_temp_dir()) return $temp;
return null;
}
2011-07-29 23:03:53 +04:00
}
OC::init();