2010-03-10 15:03:40 +03:00
< ? php
/**
2015-03-26 13:44:34 +03:00
* @ author Adam Williamson < awilliam @ redhat . com >
* @ author Andreas Fischer < bantu @ owncloud . com >
* @ author Arthur Schiwon < blizzz @ owncloud . com >
* @ author Bart Visscher < bartv @ thisnet . nl >
* @ author Bernhard Posselt < dev @ bernhard - posselt . com >
* @ author Björn Schießle < schiessle @ owncloud . com >
* @ author Christopher Schäpers < kondou @ ts . unde . re >
* @ author davidgumberg < davidnoizgumberg @ gmail . com >
* @ author Florian Scholz < FlorianScholz @ bgstyle . de >
* @ author Florin Peter < github @ florin - peter . de >
* @ author Frank Karlitschek < frank @ owncloud . org >
* @ author Georg Ehrke < georg @ owncloud . com >
2015-06-25 12:43:55 +03:00
* @ author Hugo Gonzalez Labrador < hglavra @ gmail . com >
2015-10-05 21:54:56 +03:00
* @ author Individual IT Services < info @ individual - it . net >
2015-03-26 13:44:34 +03:00
* @ author Jakob Sack < mail @ jakobsack . de >
2016-03-01 19:25:15 +03:00
* @ author Joachim Bauch < bauch @ struktur . de >
2015-03-26 13:44:34 +03:00
* @ author Joas Schilling < nickvergessen @ owncloud . com >
* @ author Jörn Friedrich Dreyer < jfd @ butonic . de >
* @ author Lukas Reschke < lukas @ owncloud . com >
* @ author marc0s < marcos @ tenak . net >
2015-10-05 21:54:56 +03:00
* @ author Martin Mattel < martin . mattel @ diemattels . at >
2015-03-26 13:44:34 +03:00
* @ author Michael Gapczynski < GapczynskiM @ gmail . com >
* @ author Morris Jobke < hey @ morrisjobke . de >
* @ author Owen Winkler < a_github @ midnightcircus . com >
2015-10-05 21:54:56 +03:00
* @ author Phil Davis < phil . davis @ inf . org >
2015-03-26 13:44:34 +03:00
* @ author Ramiro Aparicio < rapariciog @ gmail . com >
* @ author Robin Appelman < icewind @ owncloud . com >
2016-01-12 17:02:16 +03:00
* @ author Robin McCorkell < robin @ mccorkell . me . uk >
* @ author Roeland Jago Douma < rullzer @ owncloud . com >
2015-03-26 13:44:34 +03:00
* @ author scolebrook < scolebrook @ mac . com >
* @ author Thomas Müller < thomas . mueller @ tmit . eu >
* @ author Thomas Tanghus < thomas @ tanghus . net >
* @ author Victor Dubiniuk < dubiniuk @ owncloud . com >
* @ author Vincent Petry < pvince81 @ owncloud . com >
* @ author Volkan Gezer < volkangezer @ gmail . com >
2011-04-15 21:24:23 +04:00
*
2016-01-12 17:02:16 +03:00
* @ copyright Copyright ( c ) 2016 , ownCloud , Inc .
2015-03-26 13:44:34 +03:00
* @ license AGPL - 3.0
2011-04-15 21:24:23 +04:00
*
2015-03-26 13:44:34 +03:00
* This code is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License , version 3 ,
* as published by the Free Software Foundation .
2011-04-15 21:24:23 +04:00
*
2015-03-26 13:44:34 +03:00
* This program is distributed in the hope that it will be useful ,
2011-04-15 21:24:23 +04:00
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
2015-03-26 13:44:34 +03:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
2014-04-27 18:41:09 +04:00
*
2015-03-26 13:44:34 +03:00
* You should have received a copy of the GNU Affero General Public License , version 3 ,
* along with this program . If not , see < http :// www . gnu . org / licenses />
2011-04-15 21:24:23 +04:00
*
*/
2015-02-26 13:37:37 +03:00
2012-11-11 18:52:23 +04:00
require_once 'public/constants.php' ;
2011-08-02 20:31:42 +04:00
/**
* Class that is a namespace for all global OC variables
2011-08-06 13:36:56 +04:00
* No , we can not put this class in its own file because it is used by
* OC_autoload !
2011-08-02 20:31:42 +04:00
*/
2013-01-31 01:55:33 +04:00
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 array of the apps folder on the server ( e . g . / srv / http / owncloud ) 'path' and
* web path in 'url'
*/
public static $APPSROOTS = array ();
2014-01-17 17:40:48 +04:00
2016-04-14 18:59:49 +03:00
/**
* @ var string
*/
2014-01-17 17:40:48 +04:00
public static $configDir ;
2014-05-10 16:00:22 +04:00
/**
2013-01-14 23:30:28 +04:00
* requested app
*/
public static $REQUESTEDAPP = '' ;
2014-05-10 16:00:22 +04:00
2013-01-14 23:30:28 +04:00
/**
2014-11-26 15:16:22 +03:00
* check if ownCloud runs in cli mode
2013-01-14 23:30:28 +04:00
*/
public static $CLI = false ;
2013-10-07 02:32:08 +04:00
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
2016-05-02 15:10:53 +03:00
/** @var \Composer\Autoload\ClassLoader $composerAutoloader */
public static $composerAutoloader = null ;
2013-08-21 02:58:15 +04:00
/**
* @ var \OC\Server
*/
public static $server = null ;
2015-12-18 12:33:30 +03:00
/**
* @ var \OC\Config
*/
2015-12-18 13:42:09 +03:00
private static $config = null ;
2015-12-18 12:33:30 +03:00
2015-03-18 13:48:51 +03:00
/**
* @ throws \RuntimeException when the 3 rdparty directory is missing or
* the app path list is empty or contains an invalid path
*/
2013-01-31 01:55:33 +04:00
public static function initPaths () {
2014-03-13 16:33:09 +04:00
if ( defined ( 'PHPUNIT_CONFIG_DIR' )) {
self :: $configDir = OC :: $SERVERROOT . '/' . PHPUNIT_CONFIG_DIR . '/' ;
} elseif ( defined ( 'PHPUNIT_RUN' ) and PHPUNIT_RUN and is_dir ( OC :: $SERVERROOT . '/tests/config/' )) {
2014-01-20 16:41:52 +04:00
self :: $configDir = OC :: $SERVERROOT . '/tests/config/' ;
2014-01-17 17:40:48 +04:00
} else {
self :: $configDir = OC :: $SERVERROOT . '/config/' ;
}
2015-12-18 12:33:30 +03:00
self :: $config = new \OC\Config ( self :: $configDir );
2014-01-17 17:40:48 +04:00
2013-01-14 23:30:28 +04:00
OC :: $SUBURI = str_replace ( " \\ " , " / " , substr ( realpath ( $_SERVER [ " SCRIPT_FILENAME " ]), strlen ( OC :: $SERVERROOT )));
2015-10-21 18:33:49 +03:00
/**
* FIXME : The following lines are required because we can ' t yet instantiiate
* \OC :: $server -> getRequest () since \OC :: $server does not yet exist .
*/
$params = [
'server' => [
'SCRIPT_NAME' => $_SERVER [ 'SCRIPT_NAME' ],
'SCRIPT_FILENAME' => $_SERVER [ 'SCRIPT_FILENAME' ],
],
];
2015-12-18 13:24:15 +03:00
$fakeRequest = new \OC\AppFramework\Http\Request ( $params , null , new \OC\AllConfig ( new \OC\SystemConfig ( self :: $config )));
2015-10-21 18:33:49 +03:00
$scriptName = $fakeRequest -> getScriptName ();
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' ;
}
}
2015-10-21 18:33:49 +03:00
2015-02-23 23:49:35 +03:00
if ( OC :: $CLI ) {
2015-12-18 13:42:09 +03:00
OC :: $WEBROOT = self :: $config -> getValue ( 'overwritewebroot' , '' );
2015-02-23 23:49:35 +03:00
} else {
if ( substr ( $scriptName , 0 - strlen ( OC :: $SUBURI )) === OC :: $SUBURI ) {
OC :: $WEBROOT = substr ( $scriptName , 0 , 0 - strlen ( OC :: $SUBURI ));
2013-01-14 23:30:28 +04:00
2015-02-23 23:49:35 +03:00
if ( OC :: $WEBROOT != '' && OC :: $WEBROOT [ 0 ] !== '/' ) {
OC :: $WEBROOT = '/' . OC :: $WEBROOT ;
}
} else {
// The scriptName is not ending with OC::$SUBURI
// This most likely means that we are calling from CLI.
// However some cron jobs still need to generate
// a web URL, so we use overwritewebroot as a fallback.
2015-12-18 13:42:09 +03:00
OC :: $WEBROOT = self :: $config -> getValue ( 'overwritewebroot' , '' );
2014-07-07 17:01:02 +04:00
}
2013-01-14 23:30:28 +04:00
2015-12-02 13:49:33 +03:00
// Resolve /owncloud to /owncloud/ to ensure to always have a trailing
// slash which is required by URL generation.
if ( $_SERVER [ 'REQUEST_URI' ] === \OC :: $WEBROOT &&
substr ( $_SERVER [ 'REQUEST_URI' ], - 1 ) !== '/' ) {
header ( 'Location: ' . \OC :: $WEBROOT . '/' );
exit ();
}
2015-12-02 13:26:41 +03:00
}
2013-01-14 23:30:28 +04:00
// search the apps folder
2015-12-18 13:42:09 +03:00
$config_paths = self :: $config -> getValue ( 'apps_paths' , array ());
2013-01-14 23:30:28 +04:00
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 )) {
2015-03-18 13:48:51 +03:00
throw new \RuntimeException ( 'apps directory not found! Please put the ownCloud apps folder in the ownCloud folder'
2013-12-13 16:30:29 +04:00
. ' 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 ();
2013-01-31 01:55:33 +04:00
foreach ( OC :: $APPSROOTS as $path ) {
2013-01-14 23:30:28 +04:00
$paths [] = $path [ 'path' ];
2015-03-18 13:48:51 +03:00
if ( ! is_dir ( $path [ 'path' ])) {
throw new \RuntimeException ( sprintf ( 'App directory "%s" 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.' , $path [ 'path' ]));
}
2013-01-31 01:55:33 +04:00
}
2013-01-14 23:30:28 +04:00
// set the right include path
set_include_path (
2013-09-25 15:36:30 +04:00
OC :: $SERVERROOT . '/lib/private' . PATH_SEPARATOR .
2013-07-02 19:45:34 +04:00
OC :: $SERVERROOT . '/config' . PATH_SEPARATOR .
2016-04-14 18:59:49 +03:00
OC :: $SERVERROOT . '/3rdparty' . PATH_SEPARATOR .
2014-05-13 02:16:18 +04:00
implode ( PATH_SEPARATOR , $paths ) . PATH_SEPARATOR .
2013-07-02 19:45:34 +04:00
get_include_path () . PATH_SEPARATOR .
OC :: $SERVERROOT
2013-01-14 23:30:28 +04:00
);
}
2012-12-20 14:10:45 +04:00
2013-01-03 23:11:00 +04:00
public static function checkConfig () {
2014-08-31 12:05:59 +04:00
$l = \OC :: $server -> getL10N ( 'lib' );
2014-12-05 19:32:19 +03:00
2015-09-21 20:19:25 +03:00
// Create config if it does not already exist
2014-12-05 19:32:19 +03:00
$configFilePath = self :: $configDir . '/config.php' ;
if ( ! file_exists ( $configFilePath )) {
@ touch ( $configFilePath );
}
// Check if config is writable
$configFileWritable = is_writable ( $configFilePath );
2014-11-25 18:12:12 +03:00
if ( ! $configFileWritable && ! OC_Helper :: isReadOnlyConfigEnabled ()
2015-09-10 07:20:07 +03:00
|| ! $configFileWritable && self :: checkUpgrade ( false )) {
2015-11-26 12:48:08 +03:00
$urlGenerator = \OC :: $server -> getURLGenerator ();
2013-11-25 16:04:23 +04:00
if ( self :: $CLI ) {
2014-05-29 03:21:54 +04:00
echo $l -> t ( 'Cannot write into "config" directory!' ) . " \n " ;
echo $l -> t ( 'This can usually be fixed by giving the webserver write access to the config directory' ) . " \n " ;
2013-11-25 16:04:23 +04:00
echo " \n " ;
2015-11-26 12:48:08 +03:00
echo $l -> t ( 'See %s' , [ $urlGenerator -> linkToDocs ( 'admin-dir_permissions' ) ]) . " \n " ;
2013-11-25 16:04:23 +04:00
exit ;
} else {
OC_Template :: printErrorPage (
2014-05-29 03:21:54 +04:00
$l -> t ( 'Cannot write into "config" directory!' ),
$l -> t ( 'This can usually be fixed by '
. '%sgiving the webserver write access to the config directory%s.' ,
2016-03-20 13:38:14 +03:00
array ( '<a href="' . $urlGenerator -> linkToDocs ( 'admin-dir_permissions' ) . '" target="_blank" rel="noreferrer">' , '</a>' ))
2013-11-25 16:04:23 +04:00
);
}
2013-01-03 23:11:00 +04:00
}
}
2013-01-31 01:55:33 +04:00
public static function checkInstalled () {
2015-02-21 22:52:32 +03:00
if ( defined ( 'OC_CONSOLE' )) {
return ;
}
2013-01-14 23:30:28 +04:00
// Redirect to installer if not installed
2014-11-28 20:52:09 +03:00
if ( ! \OC :: $server -> getSystemConfig () -> getValue ( 'installed' , false ) && OC :: $SUBURI != '/index.php' ) {
2014-07-25 21:39:29 +04:00
if ( OC :: $CLI ) {
throw new Exception ( 'Not installed' );
2014-07-24 15:45:06 +04:00
} else {
2014-07-25 21:39:29 +04:00
$url = 'http://' . $_SERVER [ 'SERVER_NAME' ] . OC :: $WEBROOT . '/index.php' ;
header ( 'Location: ' . $url );
2013-01-14 23:30:28 +04:00
}
exit ();
}
}
2013-01-03 23:11:00 +04:00
public static function checkMaintenanceMode () {
2013-01-04 06:32:33 +04:00
// Allow ajax update script to execute without being stopped
2014-11-28 20:52:09 +03:00
if ( \OC :: $server -> getSystemConfig () -> getValue ( 'maintenance' , false ) && OC :: $SUBURI != '/core/ajax/update.php' ) {
2013-01-15 00:39:55 +04:00
// 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
2015-04-10 00:47:24 +03:00
$template = new OC_Template ( '' , 'update.user' , 'guest' );
2016-04-14 18:59:49 +03:00
OC_Util :: addScript ( 'maintenance-check' );
2015-04-10 00:47:24 +03:00
$template -> printPage ();
2013-10-24 19:46:52 +04:00
die ();
2013-01-03 23:11:00 +04:00
}
}
2015-04-10 12:17:33 +03:00
public static function checkSingleUserMode ( $lockIfNoUserLoggedIn = false ) {
2015-04-10 00:47:24 +03:00
if ( ! \OC :: $server -> getSystemConfig () -> getValue ( 'singleuser' , false )) {
return ;
}
2013-11-25 18:08:24 +04:00
$user = OC_User :: getUserSession () -> getUser ();
2015-04-10 00:47:24 +03:00
if ( $user ) {
$group = \OC :: $server -> getGroupManager () -> get ( 'admin' );
if ( $group -> inGroup ( $user )) {
return ;
}
2015-04-10 12:17:33 +03:00
} else {
if ( ! $lockIfNoUserLoggedIn ) {
return ;
}
2013-11-25 18:08:24 +04:00
}
2015-04-10 00:47:24 +03:00
// 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
$template = new OC_Template ( '' , 'singleuser.user' , 'guest' );
$template -> printPage ();
die ();
2013-11-25 18:08:24 +04:00
}
2014-04-21 17:44:54 +04:00
/**
* Checks if the version requires an update and shows
* @ param bool $showTemplate Whether an update screen should get shown
* @ return bool | void
*/
2013-12-13 16:30:29 +04:00
public static function checkUpgrade ( $showTemplate = true ) {
2014-06-10 20:01:07 +04:00
if ( \OCP\Util :: needUpgrade ()) {
2014-11-28 20:52:09 +03:00
$systemConfig = \OC :: $server -> getSystemConfig ();
if ( $showTemplate && ! $systemConfig -> getValue ( 'maintenance' , false )) {
2015-07-07 13:12:54 +03:00
self :: printUpgradePage ();
2013-12-13 16:30:29 +04:00
exit ();
} else {
return true ;
}
}
return false ;
}
2015-07-07 13:12:54 +03:00
/**
* Prints the upgrade page
*/
private static function printUpgradePage () {
$systemConfig = \OC :: $server -> getSystemConfig ();
2016-04-11 17:58:08 +03:00
$disableWebUpdater = $systemConfig -> getValue ( 'upgrade.disable-web' , false );
$tooBig = false ;
if ( ! $disableWebUpdater ) {
2016-04-22 16:52:18 +03:00
$apps = \OC :: $server -> getAppManager ();
$tooBig = $apps -> isInstalled ( 'user_ldap' ) || $apps -> isInstalled ( 'user_shibboleth' );
if ( ! $tooBig ) {
// count users
$stats = \OC :: $server -> getUserManager () -> countUsers ();
$totalUsers = array_sum ( $stats );
$tooBig = ( $totalUsers > 50 );
}
2016-04-11 17:58:08 +03:00
}
if ( $disableWebUpdater || $tooBig ) {
// 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
$template = new OC_Template ( '' , 'update.use-cli' , 'guest' );
$template -> assign ( 'productName' , 'ownCloud' ); // for now
$template -> assign ( 'version' , OC_Util :: getVersionString ());
$template -> assign ( 'tooBig' , $tooBig );
$template -> printPage ();
die ();
}
// check whether this is a core update or apps update
$installedVersion = $systemConfig -> getValue ( 'version' , '0.0.0' );
$currentVersion = implode ( '.' , \OCP\Util :: getVersion ());
// if not a core upgrade, then it's apps upgrade
$isAppsOnlyUpgrade = ( version_compare ( $currentVersion , $installedVersion , '=' ));
2015-07-07 13:12:54 +03:00
$oldTheme = $systemConfig -> getValue ( 'theme' );
$systemConfig -> setValue ( 'theme' , '' );
\OCP\Util :: addScript ( 'config' ); // needed for web root
\OCP\Util :: addScript ( 'update' );
2016-03-31 00:38:26 +03:00
\OCP\Util :: addStyle ( 'update' );
2015-07-07 13:12:54 +03:00
$appManager = \OC :: $server -> getAppManager ();
$tmpl = new OC_Template ( '' , 'update.admin' , 'guest' );
$tmpl -> assign ( 'version' , OC_Util :: getVersionString ());
2016-04-11 17:58:08 +03:00
$tmpl -> assign ( 'isAppsOnlyUpgrade' , $isAppsOnlyUpgrade );
2015-08-20 12:14:30 +03:00
// get third party apps
2015-12-18 17:26:54 +03:00
$ocVersion = \OCP\Util :: getVersion ();
2015-08-20 12:14:30 +03:00
$tmpl -> assign ( 'appsToUpgrade' , $appManager -> getAppsNeedingUpgrade ( $ocVersion ));
$tmpl -> assign ( 'incompatibleAppsList' , $appManager -> getIncompatibleApps ( $ocVersion ));
2015-07-07 13:12:54 +03:00
$tmpl -> assign ( 'productName' , 'ownCloud' ); // for now
$tmpl -> assign ( 'oldTheme' , $oldTheme );
$tmpl -> printPage ();
}
2013-01-31 01:55:33 +04:00
public static function initSession () {
2013-01-14 23:30:28 +04:00
// prevents javascript from accessing php session cookies
2015-02-18 17:18:27 +03:00
ini_set ( 'session.cookie_httponly' , true );
2013-01-14 23:30:28 +04:00
2013-04-06 02:16:52 +04:00
// set the cookie path to the ownCloud directory
2013-07-02 19:45:34 +04:00
$cookie_path = OC :: $WEBROOT ? : '/' ;
2013-04-18 23:11:55 +04:00
ini_set ( 'session.cookie_path' , $cookie_path );
2013-04-06 02:16:52 +04:00
2014-05-12 19:08:28 +04:00
// Let the session name be changed in the initSession Hook
$sessionName = OC_Util :: getInstanceId ();
2013-07-02 19:45:34 +04:00
try {
2014-05-12 19:08:28 +04:00
// Allow session apps to create a custom session object
$useCustomSession = false ;
2014-07-16 21:40:22 +04:00
$session = self :: $server -> getSession ();
OC_Hook :: emit ( 'OC' , 'initSession' , array ( 'session' => & $session , 'sessionName' => & $sessionName , 'useCustomSession' => & $useCustomSession ));
2015-07-20 13:59:04 +03:00
if ( ! $useCustomSession ) {
2014-05-12 19:08:28 +04:00
// set the session name to the instance id - which is unique
2015-07-20 13:59:04 +03:00
$session = new \OC\Session\Internal ( $sessionName );
2014-05-12 19:08:28 +04:00
}
2015-07-20 13:59:04 +03:00
$cryptoWrapper = \OC :: $server -> getSessionCryptoWrapper ();
$session = $cryptoWrapper -> wrapSession ( $session );
self :: $server -> setSession ( $session );
2016-04-07 20:51:27 +03:00
// if session can't be started break with http 500 error
2013-07-02 19:45:34 +04:00
} catch ( Exception $e ) {
2015-03-20 14:21:03 +03:00
\OCP\Util :: logException ( 'base' , $e );
2013-11-05 00:55:55 +04:00
//show the user a detailed error page
OC_Response :: setStatus ( OC_Response :: STATUS_INTERNAL_SERVER_ERROR );
OC_Template :: printExceptionErrorPage ( $e );
2016-01-10 01:56:28 +03:00
die ();
2013-02-25 21:37:05 +04:00
}
2013-01-14 23:30:28 +04:00
2013-06-26 11:19:19 +04:00
$sessionLifeTime = self :: getSessionLifeTime ();
2013-01-14 23:30:28 +04:00
// session timeout
2014-07-16 21:40:22 +04:00
if ( $session -> exists ( 'LAST_ACTIVITY' ) && ( time () - $session -> get ( 'LAST_ACTIVITY' ) > $sessionLifeTime )) {
2013-01-14 23:30:28 +04:00
if ( isset ( $_COOKIE [ session_name ()])) {
2015-10-19 20:54:12 +03:00
setcookie ( session_name (), null , - 1 , self :: $WEBROOT ? : '/' );
2013-01-14 23:30:28 +04:00
}
2016-01-10 01:49:49 +03:00
$session -> clear ();
2013-01-14 23:30:28 +04:00
}
2013-05-28 03:04:09 +04:00
2014-07-16 21:40:22 +04:00
$session -> set ( 'LAST_ACTIVITY' , time ());
2013-01-14 23:30:28 +04:00
}
2013-06-26 11:19:19 +04:00
/**
2014-02-06 19:30:58 +04:00
* @ return string
2013-06-26 11:19:19 +04:00
*/
private static function getSessionLifeTime () {
2014-11-19 15:06:22 +03:00
return \OC :: $server -> getConfig () -> getSystemValue ( 'session_lifetime' , 60 * 60 * 24 );
2013-06-26 11:19:19 +04:00
}
2013-01-31 01:55:33 +04:00
public static function loadAppClassPaths () {
2016-04-11 17:58:08 +03:00
foreach ( OC_App :: getEnabledApps () as $app ) {
2015-12-08 12:18:34 +03:00
$appPath = OC_App :: getAppPath ( $app );
if ( $appPath === false ) {
continue ;
}
$file = $appPath . '/appinfo/classpath.php' ;
2013-01-31 01:55:33 +04:00
if ( file_exists ( $file )) {
2013-01-18 00:44:40 +04:00
require_once $file ;
}
}
}
2013-01-18 00:42:33 +04:00
2015-05-03 14:23:29 +03:00
/**
* Try to set some values to the required ownCloud default
*/
public static function setRequiredIniValues () {
@ ini_set ( 'default_charset' , 'UTF-8' );
2016-01-27 15:59:15 +03:00
@ ini_set ( 'gd.jpeg_ignore_warning' , 1 );
2015-05-03 14:23:29 +03:00
}
2013-01-18 00:42:33 +04:00
2013-01-31 01:55:33 +04:00
public static function init () {
2015-08-18 16:35:02 +03:00
// calculate the root directories
OC :: $SERVERROOT = str_replace ( " \\ " , '/' , substr ( __DIR__ , 0 , - 4 ));
2013-01-14 23:30:28 +04:00
// register autoloader
2014-10-15 15:53:19 +04:00
$loaderStart = microtime ( true );
2013-05-08 00:53:07 +04:00
require_once __DIR__ . '/autoloader.php' ;
2015-08-18 16:35:02 +03:00
self :: $loader = new \OC\Autoloader ([
OC :: $SERVERROOT . '/lib' ,
OC :: $SERVERROOT . '/core' ,
OC :: $SERVERROOT . '/settings' ,
OC :: $SERVERROOT . '/ocs' ,
OC :: $SERVERROOT . '/ocs-provider' ,
]);
2016-01-10 23:36:14 +03:00
if ( defined ( 'PHPUNIT_RUN' )) {
self :: $loader -> addValidRoot ( OC :: $SERVERROOT . '/tests' );
}
2013-05-08 00:16:02 +04:00
spl_autoload_register ( array ( self :: $loader , 'load' ));
2014-10-15 15:53:19 +04:00
$loaderEnd = microtime ( true );
2013-01-14 23:30:28 +04:00
2015-02-23 23:49:35 +03:00
self :: $CLI = ( php_sapi_name () == 'cli' );
2016-04-22 16:28:09 +03:00
// Add default composer PSR-4 autoloader
2016-05-02 15:10:53 +03:00
self :: $composerAutoloader = require_once OC :: $SERVERROOT . '/lib/composer/autoload.php' ;
2016-04-22 16:28:09 +03:00
2015-03-18 13:48:51 +03:00
try {
self :: initPaths ();
// setup 3rdparty autoloader
2016-04-14 18:59:49 +03:00
$vendorAutoLoad = OC :: $SERVERROOT . '/3rdparty/autoload.php' ;
2015-03-18 13:48:51 +03:00
if ( ! file_exists ( $vendorAutoLoad )) {
2015-09-03 15:55:26 +03:00
throw new \RuntimeException ( 'Composer autoloader not found, unable to continue. Check the folder "3rdparty". Running "git submodule update --init" will initialize the git submodule that handles the subfolder "3rdparty".' );
2015-03-18 13:48:51 +03:00
}
2014-11-17 15:10:15 +03:00
require_once $vendorAutoLoad ;
2015-03-18 13:48:51 +03:00
} catch ( \RuntimeException $e ) {
2016-03-09 17:40:34 +03:00
if ( ! self :: $CLI ) {
OC_Response :: setStatus ( OC_Response :: STATUS_SERVICE_UNAVAILABLE );
}
2015-01-31 18:04:24 +03:00
// we can't use the template error page here, because this needs the
// DI container which isn't available yet
2015-03-18 13:48:51 +03:00
print ( $e -> getMessage ());
2015-01-31 18:04:24 +03:00
exit ();
2014-07-29 05:48:17 +04:00
}
// setup the basic server
2015-12-18 13:24:15 +03:00
self :: $server = new \OC\Server ( \OC :: $WEBROOT , self :: $config );
2014-10-15 15:53:19 +04:00
\OC :: $server -> getEventLogger () -> log ( 'autoloader' , 'Autoloader' , $loaderStart , $loaderEnd );
2014-10-04 00:13:55 +04:00
\OC :: $server -> getEventLogger () -> start ( 'boot' , 'Initialize' );
2013-01-14 23:30:28 +04:00
2015-05-05 13:34:22 +03:00
// Don't display errors and log them
2013-01-14 23:30:28 +04:00
error_reporting ( E_ALL | E_STRICT );
2015-05-05 13:34:22 +03:00
@ ini_set ( 'display_errors' , 0 );
@ ini_set ( 'log_errors' , 1 );
2013-01-14 23:30:28 +04:00
date_default_timezone_set ( 'UTC' );
//try to configure php to enable big file uploads.
//this doesn´ t work always depending on the webserver and php configuration.
2015-09-21 20:19:25 +03:00
//Let´ s try to overwrite some defaults anyway
2013-01-14 23:30:28 +04:00
//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' );
2015-05-03 14:23:29 +03:00
self :: setRequiredIniValues ();
2014-07-19 04:16:28 +04:00
self :: handleAuthHeaders ();
2014-07-29 13:18:40 +04:00
self :: registerAutoloaderCache ();
2014-07-29 13:14:36 +04:00
2014-09-09 16:41:45 +04:00
// initialize intl fallback is necessary
\Patchwork\Utf8\Bootup :: initIntl ();
2014-07-29 05:48:17 +04:00
OC_Util :: isSetLocaleWorking ();
2014-09-09 16:41:45 +04:00
2013-07-22 00:40:35 +04:00
if ( ! defined ( 'PHPUNIT_RUN' )) {
2016-04-18 23:30:01 +03:00
OC\Log\ErrorHandler :: setLogger ( \OC :: $server -> getLogger ());
$debug = \OC :: $server -> getConfig () -> getSystemValue ( 'debug' , false );
OC\Log\ErrorHandler :: register ( $debug );
2013-02-15 06:15:09 +04:00
}
2013-01-14 23:30:28 +04:00
// register the stream wrappers
2013-01-28 18:34:15 +04:00
stream_wrapper_register ( 'fakedir' , 'OC\Files\Stream\Dir' );
stream_wrapper_register ( 'static' , 'OC\Files\Stream\StaticStream' );
stream_wrapper_register ( 'close' , 'OC\Files\Stream\Close' );
2013-07-02 19:45:34 +04:00
stream_wrapper_register ( 'quota' , 'OC\Files\Stream\Quota' );
2013-01-28 18:35:30 +04:00
stream_wrapper_register ( 'oc' , 'OC\Files\Stream\OC' );
2013-01-14 23:30:28 +04:00
2014-10-04 00:13:55 +04:00
\OC :: $server -> getEventLogger () -> start ( 'init_session' , 'Initialize session' );
2014-05-12 19:08:28 +04:00
OC_App :: loadApps ( array ( 'session' ));
2014-11-26 15:16:22 +03:00
if ( ! self :: $CLI ) {
2014-07-25 21:39:29 +04:00
self :: initSession ();
2013-04-19 17:18:27 +04:00
}
2014-10-04 00:13:55 +04:00
\OC :: $server -> getEventLogger () -> end ( 'init_session' );
2013-05-31 19:31:52 +04:00
self :: checkConfig ();
self :: checkInstalled ();
2015-01-19 13:56:04 +03:00
2014-05-12 17:14:01 +04:00
OC_Response :: addSecurityHeaders ();
2015-01-19 13:56:04 +03:00
if ( self :: $server -> getRequest () -> getServerProtocol () === 'https' ) {
ini_set ( 'session.cookie_secure' , true );
}
2013-01-14 23:30:28 +04:00
2015-04-08 01:19:23 +03:00
if ( ! defined ( 'OC_CONSOLE' )) {
$errors = OC_Util :: checkServer ( \OC :: $server -> getConfig ());
if ( count ( $errors ) > 0 ) {
if ( self :: $CLI ) {
// Convert l10n string into regular string for usage in database
$staticErrors = [];
foreach ( $errors as $error ) {
echo $error [ 'error' ] . " \n " ;
echo $error [ 'hint' ] . " \n \n " ;
$staticErrors [] = [
'error' => ( string ) $error [ 'error' ],
'hint' => ( string ) $error [ 'hint' ],
];
}
2015-02-27 22:04:52 +03:00
2015-04-08 01:19:23 +03:00
try {
\OC :: $server -> getConfig () -> setAppValue ( 'core' , 'cronErrors' , json_encode ( $staticErrors ));
} catch ( \Exception $e ) {
echo ( 'Writing to database failed' );
}
exit ( 1 );
} else {
OC_Response :: setStatus ( OC_Response :: STATUS_SERVICE_UNAVAILABLE );
OC_Template :: printGuestPage ( '' , 'error' , array ( 'errors' => $errors ));
exit ;
2015-02-27 22:04:52 +03:00
}
2015-04-08 01:19:23 +03:00
} elseif ( self :: $CLI && \OC :: $server -> getConfig () -> getSystemValue ( 'installed' , false )) {
2015-02-27 22:04:52 +03:00
\OC :: $server -> getConfig () -> deleteAppValue ( 'core' , 'cronErrors' );
2015-04-08 01:19:23 +03:00
}
2013-01-14 23:30:28 +04:00
}
2013-06-26 11:19:19 +04:00
//try to set the session lifetime
$sessionLifeTime = self :: getSessionLifeTime ();
@ ini_set ( 'gc_maxlifetime' , ( string ) $sessionLifeTime );
2014-11-28 20:52:09 +03:00
$systemConfig = \OC :: $server -> getSystemConfig ();
2014-11-19 15:06:22 +03:00
2013-01-14 23:30:28 +04:00
// User and Groups
2014-11-28 20:52:09 +03:00
if ( ! $systemConfig -> getValue ( " installed " , false )) {
2014-07-16 21:40:22 +04:00
self :: $server -> getSession () -> 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-12-11 17:01:48 +04:00
2015-10-05 12:50:36 +03:00
// Subscribe to the hook
\OCP\Util :: connectHook (
'\OCA\Files_Sharing\API\Server2Server' ,
'preLoginNameUsedAsUserName' ,
'\OC_User_Database' ,
'preLoginNameUsedAsUserName'
);
2013-01-14 23:30:28 +04:00
//setup extra user backends
2014-09-08 14:30:04 +04:00
if ( ! self :: checkUpgrade ( false )) {
OC_User :: setupBackends ();
}
2013-01-14 23:30:28 +04:00
2015-06-05 15:21:17 +03:00
self :: registerCacheHooks ();
2013-01-14 23:30:28 +04:00
self :: registerFilesystemHooks ();
2015-09-03 09:59:35 +03:00
if ( $systemConfig -> getValue ( 'enable_previews' , true )) {
2015-05-06 11:39:48 +03:00
self :: registerPreviewHooks ();
2015-09-17 10:14:04 +03:00
}
2013-01-14 23:30:28 +04:00
self :: registerShareHooks ();
2013-07-10 20:07:43 +04:00
self :: registerLogRotate ();
2015-01-14 22:39:23 +03:00
self :: registerEncryptionWrapper ();
self :: registerEncryptionHooks ();
2013-01-14 23:30:28 +04:00
//make sure temporary files are cleaned up
2014-10-22 19:36:52 +04:00
$tmpManager = \OC :: $server -> getTempManager ();
register_shutdown_function ( array ( $tmpManager , 'clean' ));
2015-05-19 18:12:09 +03:00
$lockProvider = \OC :: $server -> getLockingProvider ();
register_shutdown_function ( array ( $lockProvider , 'releaseAll' ));
2013-01-14 23:30:28 +04:00
2014-08-14 02:06:19 +04:00
// Check whether the sample configuration has been copied
2014-11-28 20:52:09 +03:00
if ( $systemConfig -> getValue ( 'copied_sample_config' , false )) {
2014-08-31 12:05:59 +04:00
$l = \OC :: $server -> getL10N ( 'lib' );
2014-08-14 02:06:19 +04:00
header ( 'HTTP/1.1 503 Service Temporarily Unavailable' );
header ( 'Status: 503 Service Temporarily Unavailable' );
OC_Template :: printErrorPage (
$l -> t ( 'Sample configuration detected' ),
$l -> t ( 'It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php' )
);
return ;
}
2014-09-05 16:10:35 +04:00
2015-02-10 15:02:48 +03:00
$request = \OC :: $server -> getRequest ();
$host = $request -> getInsecureServerHost ();
/**
* if the host passed in headers isn ' t trusted
* FIXME : Should not be in here at all : see_no_evil :
*/
2014-09-05 16:10:35 +04:00
if ( ! OC :: $CLI
2015-02-10 15:02:48 +03:00
// overwritehost is always trusted, workaround to not have to make
// \OC\AppFramework\Http\Request::getOverwriteHost public
&& self :: $server -> getConfig () -> getSystemValue ( 'overwritehost' ) === ''
2015-02-17 00:12:47 +03:00
&& ! \OC :: $server -> getTrustedDomainHelper () -> isTrustedDomain ( $host )
2015-02-18 15:06:46 +03:00
&& self :: $server -> getConfig () -> getSystemValue ( 'installed' , false )
2014-09-05 16:10:35 +04:00
) {
header ( 'HTTP/1.1 400 Bad Request' );
header ( 'Status: 400 Bad Request' );
2014-09-08 18:15:31 +04:00
2015-11-10 13:13:25 +03:00
\OC :: $server -> getLogger () -> warning (
'Trusted domain error. "{remoteAddress}" tried to access using "{host}" as host.' ,
[
'app' => 'core' ,
'remoteAddress' => $request -> getRemoteAddress (),
'host' => $host ,
]
);
2014-09-05 16:10:35 +04:00
$tmpl = new OCP\Template ( 'core' , 'untrustedDomain' , 'guest' );
2016-02-15 19:02:14 +03:00
$tmpl -> assign ( 'domain' , $host );
2014-09-05 16:10:35 +04:00
$tmpl -> printPage ();
2014-09-08 18:15:31 +04:00
exit ();
2014-09-05 16:10:35 +04:00
}
2014-10-04 00:13:55 +04:00
\OC :: $server -> getEventLogger () -> end ( 'boot' );
2013-01-14 23:30:28 +04:00
}
2015-06-05 15:21:17 +03:00
/**
* register hooks for the cache
*/
public static function registerCacheHooks () {
//don't try to do this before we are properly setup
2015-09-10 07:20:07 +03:00
if ( \OC :: $server -> getSystemConfig () -> getValue ( 'installed' , false ) && ! self :: checkUpgrade ( false )) {
2015-06-05 15:21:17 +03:00
// NOTE: This will be replaced to use OCP
$userSession = self :: $server -> getUserSession ();
2015-06-08 15:13:38 +03:00
$userSession -> listen ( '\OC\User' , 'postLogin' , function () {
2015-06-30 18:36:55 +03:00
try {
$cache = new \OC\Cache\File ();
$cache -> gc ();
2016-03-03 03:15:36 +03:00
} catch ( \OC\ServerNotAvailableException $e ) {
// not a GC exception, pass it on
throw $e ;
2015-06-30 18:36:55 +03:00
} catch ( \Exception $e ) {
// a GC exception should not prevent users from using OC,
// so log the exception
\OC :: $server -> getLogger () -> warning ( 'Exception when running cache gc: ' . $e -> getMessage (), array ( 'app' => 'core' ));
}
2015-06-08 15:13:38 +03:00
});
2015-06-05 15:21:17 +03:00
}
}
2015-01-14 22:39:23 +03:00
private static function registerEncryptionWrapper () {
2016-03-31 00:20:37 +03:00
$manager = self :: $server -> getEncryptionManager ();
\OCP\Util :: connectHook ( 'OC_Filesystem' , 'preSetup' , $manager , 'setupStorage' );
2015-01-14 22:39:23 +03:00
}
private static function registerEncryptionHooks () {
$enabled = self :: $server -> getEncryptionManager () -> isEnabled ();
if ( $enabled ) {
2015-04-17 14:55:31 +03:00
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_shared' , 'OC\Encryption\HookManager' , 'postShared' );
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_unshare' , 'OC\Encryption\HookManager' , 'postUnshared' );
2015-05-11 11:35:42 +03:00
\OCP\Util :: connectHook ( 'OC_Filesystem' , 'post_rename' , 'OC\Encryption\HookManager' , 'postRename' );
\OCP\Util :: connectHook ( '\OCA\Files_Trashbin\Trashbin' , 'post_restore' , 'OC\Encryption\HookManager' , 'postRestore' );
2015-01-14 22:39:23 +03:00
}
}
2013-07-10 20:07:43 +04:00
/**
* register hooks for the cache
*/
public static function registerLogRotate () {
2014-11-28 20:52:09 +03:00
$systemConfig = \OC :: $server -> getSystemConfig ();
2015-09-10 07:20:07 +03:00
if ( $systemConfig -> getValue ( 'installed' , false ) && $systemConfig -> getValue ( 'log_rotate_size' , false ) && ! self :: checkUpgrade ( false )) {
2013-08-28 19:41:27 +04:00
//don't try to do this before we are properly setup
2014-05-20 19:29:59 +04:00
//use custom logfile path if defined, otherwise use default of owncloud.log in data directory
2014-11-28 20:52:09 +03:00
\OCP\BackgroundJob :: registerJob ( 'OC\Log\Rotate' , $systemConfig -> getValue ( 'logfile' , $systemConfig -> getValue ( 'datadirectory' , OC :: $SERVERROOT . '/data' ) . '/owncloud.log' ));
2013-07-10 20:07:43 +04:00
}
}
2013-01-14 23:30:28 +04:00
/**
* register hooks for the filesystem
*/
2013-01-31 01:55:33 +04:00
public static function registerFilesystemHooks () {
2013-01-14 23:30:28 +04:00
// Check for blacklisted files
2014-05-28 02:13:54 +04:00
OC_Hook :: connect ( 'OC_Filesystem' , 'write' , 'OC\Files\Filesystem' , 'isBlacklisted' );
OC_Hook :: connect ( 'OC_Filesystem' , 'rename' , 'OC\Files\Filesystem' , 'isBlacklisted' );
2013-01-14 23:30:28 +04:00
}
2013-05-29 14:01:43 +04:00
/**
* register hooks for previews
*/
public static function registerPreviewHooks () {
2015-05-06 11:39:48 +03:00
OC_Hook :: connect ( 'OC_Filesystem' , 'post_write' , 'OC\Preview' , 'post_write' );
OC_Hook :: connect ( 'OC_Filesystem' , 'delete' , 'OC\Preview' , 'prepare_delete_files' );
OC_Hook :: connect ( '\OCP\Versions' , 'preDelete' , 'OC\Preview' , 'prepare_delete' );
OC_Hook :: connect ( '\OCP\Trashbin' , 'preDelete' , 'OC\Preview' , 'prepare_delete' );
OC_Hook :: connect ( 'OC_Filesystem' , 'post_delete' , 'OC\Preview' , 'post_delete_files' );
2015-03-23 03:05:33 +03:00
OC_Hook :: connect ( '\OCP\Versions' , 'delete' , 'OC\Preview' , 'post_delete_versions' );
2015-05-06 11:39:48 +03:00
OC_Hook :: connect ( '\OCP\Trashbin' , 'delete' , 'OC\Preview' , 'post_delete' );
2015-03-23 03:05:33 +03:00
OC_Hook :: connect ( '\OCP\Versions' , 'rollback' , 'OC\Preview' , 'post_delete_versions' );
2013-05-29 14:01:43 +04:00
}
2013-01-14 23:30:28 +04:00
/**
* register hooks for sharing
*/
2013-01-31 01:55:33 +04:00
public static function registerShareHooks () {
2014-11-28 20:52:09 +03:00
if ( \OC :: $server -> getSystemConfig () -> getValue ( 'installed' )) {
2016-04-04 13:28:19 +03:00
OC_Hook :: connect ( 'OC_User' , 'post_deleteUser' , 'OC\Share20\Hooks' , 'post_deleteUser' );
2016-04-13 16:00:12 +03:00
OC_Hook :: connect ( 'OC_User' , 'post_removeFromGroup' , 'OC\Share20\Hooks' , 'post_removeFromGroup' );
2016-04-12 10:46:25 +03:00
OC_Hook :: connect ( 'OC_User' , 'post_deleteGroup' , 'OC\Share20\Hooks' , 'post_deleteGroup' );
2013-05-17 03:20:02 +04:00
}
2013-01-14 23:30:28 +04:00
}
2014-07-29 13:18:40 +04:00
protected static function registerAutoloaderCache () {
// The class loader takes an optional low-latency cache, which MUST be
// namespaced. The instanceid is used for namespacing, but might be
2016-04-07 20:51:27 +03:00
// unavailable at this point. Furthermore, it might not be possible to
2014-07-29 13:18:40 +04:00
// generate an instanceid via \OC_Util::getInstanceId() because the
// config file may not be writable. As such, we only register a class
// loader cache if instanceid is available without trying to create one.
2014-11-28 20:52:09 +03:00
$instanceId = \OC :: $server -> getSystemConfig () -> getValue ( 'instanceid' , null );
2014-07-29 13:18:40 +04:00
if ( $instanceId ) {
try {
2015-01-14 21:25:00 +03:00
$memcacheFactory = \OC :: $server -> getMemCacheFactory ();
self :: $loader -> setMemoryCache ( $memcacheFactory -> createLocal ( 'Autoloader' ));
2014-07-29 13:18:40 +04:00
} catch ( \Exception $ex ) {
}
}
}
2013-01-14 23:30:28 +04:00
/**
2014-05-19 19:50:53 +04:00
* Handle the request
2013-01-14 23:30:28 +04:00
*/
2013-01-31 01:55:33 +04:00
public static function handleRequest () {
2015-02-10 15:02:48 +03:00
2014-10-04 00:13:55 +04:00
\OC :: $server -> getEventLogger () -> start ( 'handle_request' , 'Handle request' );
2014-11-28 20:52:09 +03:00
$systemConfig = \OC :: $server -> getSystemConfig ();
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
2013-01-31 01:55:33 +04:00
// Check if ownCloud is installed or in maintenance (update) mode
2014-11-28 20:52:09 +03:00
if ( ! $systemConfig -> getValue ( 'installed' , false )) {
2014-10-31 13:21:00 +03:00
\OC :: $server -> getSession () -> clear ();
2015-07-30 01:04:30 +03:00
$setupHelper = new OC\Setup ( \OC :: $server -> getConfig (), \OC :: $server -> getIniWrapper (),
\OC :: $server -> getL10N ( 'lib' ), new \OC_Defaults (), \OC :: $server -> getLogger (),
\OC :: $server -> getSecureRandom ());
2016-01-20 12:20:36 +03:00
$controller = new OC\Core\Controller\SetupController ( $setupHelper );
2013-09-10 22:19:42 +04:00
$controller -> run ( $_POST );
2013-01-31 01:55:33 +04:00
exit ();
}
2013-02-06 02:33:44 +04:00
2015-07-07 18:29:54 +03:00
$request = \OC :: $server -> getRequest ();
2016-03-17 19:32:38 +03:00
$requestPath = $request -> getRawPathInfo ();
2015-07-07 18:29:54 +03:00
if ( substr ( $requestPath , - 3 ) !== '.js' ) { // we need these files during the upgrade
2013-01-31 02:05:44 +04:00
self :: checkMaintenanceMode ();
self :: checkUpgrade ();
}
2013-01-31 01:55:33 +04:00
2015-07-07 18:29:54 +03:00
// emergency app disabling
if ( $requestPath === '/disableapp'
&& $request -> getMethod () === 'POST'
&& (( string ) $request -> getParam ( 'appid' )) !== ''
) {
\OCP\JSON :: callCheck ();
\OCP\JSON :: checkAdminUser ();
$appId = ( string ) $request -> getParam ( 'appid' );
$appId = \OC_App :: cleanAppId ( $appId );
\OC_App :: disable ( $appId );
\OC_JSON :: success ();
exit ();
}
2015-02-24 20:00:26 +03:00
// Always load authentication apps
OC_App :: loadApps ([ 'authentication' ]);
2015-01-09 22:59:23 +03:00
// Load minimum set of apps
2015-01-09 23:52:16 +03:00
if ( ! self :: checkUpgrade ( false )
2015-09-10 07:20:07 +03:00
&& ! $systemConfig -> getValue ( 'maintenance' , false )) {
2015-01-09 22:59:23 +03:00
// For logged-in users: Load everything
if ( OC_User :: isLoggedIn ()) {
OC_App :: loadApps ();
} else {
2015-02-24 20:00:26 +03:00
// For guests: Load only filesystem and logging
2015-01-09 22:59:23 +03:00
OC_App :: loadApps ( array ( 'filesystem' , 'logging' ));
\OC_User :: tryBasicAuthLogin ();
}
}
2016-04-18 13:14:07 +03:00
if ( ! self :: $CLI ) {
2013-02-07 20:53:38 +04:00
try {
2015-09-10 07:20:07 +03:00
if ( ! $systemConfig -> getValue ( 'maintenance' , false ) && ! self :: checkUpgrade ( false )) {
2014-06-16 15:12:21 +04:00
OC_App :: loadApps ( array ( 'filesystem' , 'logging' ));
2014-06-24 19:37:58 +04:00
OC_App :: loadApps ();
2013-03-04 02:03:47 +04:00
}
2013-11-25 18:08:24 +04:00
self :: checkSingleUserMode ();
2014-08-28 19:58:23 +04:00
OC_Util :: setupFS ();
2015-02-10 15:02:48 +03:00
OC :: $server -> getRouter () -> match ( \OC :: $server -> getRequest () -> getRawPathInfo ());
2013-02-07 20:53:38 +04:00
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-25 17:57:52 +04:00
// Handle redirect URL for logged in users
if ( isset ( $_REQUEST [ 'redirect_url' ]) && OC_User :: isLoggedIn ()) {
2015-12-17 15:03:37 +03:00
$location = \OC :: $server -> getURLGenerator () -> getAbsoluteURL ( 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 ;
}
2013-01-25 17:57:52 +04:00
}
// Handle WebDAV
if ( $_SERVER [ 'REQUEST_METHOD' ] == 'PROPFIND' ) {
2013-10-24 12:34:09 +04:00
// not allowed any more to prevent people
// mounting this root directly.
// Users need to mount remote.php/webdav instead.
header ( 'HTTP/1.1 405 Method Not Allowed' );
header ( 'Status: 405 Method Not Allowed' );
2013-01-25 17:57:52 +04:00
return ;
}
2014-05-10 16:00:22 +04:00
// Someone is logged in
2013-01-14 23:30:28 +04:00
if ( OC_User :: isLoggedIn ()) {
OC_App :: loadApps ();
OC_User :: setupBackends ();
2014-08-28 18:59:56 +04:00
OC_Util :: setupFS ();
2016-04-18 13:14:07 +03:00
// Redirect to default application
OC_Util :: redirectToDefaultPage ();
2014-05-10 16:00:22 +04:00
} else {
// Not handled and not logged in
self :: handleLogin ();
2013-01-14 23:30:28 +04:00
}
}
2014-07-19 04:16:28 +04:00
protected static function handleAuthHeaders () {
//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' ];
}
// Extract PHP_AUTH_USER/PHP_AUTH_PW from other headers if necessary.
$vars = array (
'HTTP_AUTHORIZATION' , // apache+php-cgi work around
'REDIRECT_HTTP_AUTHORIZATION' , // apache+php-cgi alternative
);
foreach ( $vars as $var ) {
if ( isset ( $_SERVER [ $var ]) && preg_match ( '/Basic\s+(.*)$/i' , $_SERVER [ $var ], $matches )) {
list ( $name , $password ) = explode ( ':' , base64_decode ( $matches [ 1 ]), 2 );
2014-07-19 12:17:24 +04:00
$_SERVER [ 'PHP_AUTH_USER' ] = $name ;
$_SERVER [ 'PHP_AUTH_PW' ] = $password ;
2014-07-19 04:16:28 +04:00
break ;
}
}
}
2013-01-31 01:55:33 +04:00
protected static function handleLogin () {
2013-01-14 23:30:28 +04:00
OC_App :: loadApps ( array ( 'prelogin' ));
$error = array ();
2015-01-22 16:13:17 +03:00
$messages = [];
2013-10-01 15:25:58 +04:00
2015-01-22 16:13:17 +03:00
try {
// auth possible via apache module?
if ( OC :: tryApacheAuth ()) {
$error [] = 'apacheauthfailed' ;
} // remember was checked after last login
elseif ( OC :: tryRememberLogin ()) {
$error [] = 'invalidcookie' ;
} // logon via web form
elseif ( OC :: tryFormLogin ()) {
$error [] = 'invalidpassword' ;
}
} catch ( \OC\User\LoginException $e ) {
$messages [] = $e -> getMessage ();
2015-03-31 15:56:02 +03:00
} catch ( \Exception $ex ) {
\OCP\Util :: logException ( 'handleLogin' , $ex );
// do not disclose information. show generic error
$error [] = 'internalexception' ;
2013-01-14 23:30:28 +04:00
}
2013-05-31 02:53:57 +04:00
2016-04-11 13:08:00 +03:00
if ( ! \OC :: $server -> getUserSession () -> isLoggedIn ()) {
$loginMessages = array ( array_unique ( $error ), $messages );
\OC :: $server -> getSession () -> set ( 'loginMessages' , $loginMessages );
2016-04-15 20:33:25 +03:00
// Read current user and append if possible
$args = [];
if ( isset ( $_POST [ 'user' ])) {
$args [ 'user' ] = $_POST [ 'user' ];
}
$redirectionTarget = \OC :: $server -> getURLGenerator () -> linkToRoute ( 'core.login.showLoginForm' , $args );
header ( 'Location: ' . $redirectionTarget );
2016-04-11 13:08:00 +03:00
}
2013-01-14 23:30:28 +04:00
}
2014-04-21 17:44:54 +04:00
/**
* Remove outdated and therefore invalid tokens for a user
* @ param string $user
*/
2013-01-31 01:55:33 +04:00
protected static function cleanupLoginTokens ( $user ) {
2014-11-19 15:06:22 +03:00
$config = \OC :: $server -> getConfig ();
$cutoff = time () - $config -> getSystemValue ( 'remember_login_cookie_lifetime' , 60 * 60 * 24 * 15 );
$tokens = $config -> getUserKeys ( $user , 'login_token' );
2013-01-14 23:30:28 +04:00
foreach ( $tokens as $token ) {
2014-11-19 15:06:22 +03:00
$time = $config -> getUserValue ( $user , 'login_token' , $token );
2013-01-14 23:30:28 +04:00
if ( $time < $cutoff ) {
2014-11-19 15:06:22 +03:00
$config -> deleteUserValue ( $user , 'login_token' , $token );
2013-01-14 23:30:28 +04:00
}
}
}
2014-04-21 17:44:54 +04:00
/**
* Try to login a user via HTTP authentication
* @ return bool | void
*/
2013-10-01 15:25:58 +04:00
protected static function tryApacheAuth () {
2013-10-02 02:55:35 +04:00
$return = OC_User :: handleApacheAuth ();
// if return is true we are logged in -> redirect to the default page
if ( $return === true ) {
2015-02-10 15:02:48 +03:00
$_REQUEST [ 'redirect_url' ] = \OC :: $server -> getRequest () -> getRequestUri ();
2013-10-02 02:55:35 +04:00
OC_Util :: redirectToDefaultPage ();
exit ;
}
// in case $return is null apache based auth is not enabled
return is_null ( $return ) ? false : true ;
2013-10-01 15:25:58 +04:00
}
2014-04-21 17:44:54 +04:00
/**
* Try to login a user using the remember me cookie .
* @ return bool Whether the provided cookie was valid
*/
2013-01-31 01:55:33 +04:00
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 " ]
2013-09-24 20:01:34 +04:00
|| ! OC_Util :: rememberLoginAllowed ()
2013-01-31 01:55:33 +04:00
) {
2013-01-14 23:30:28 +04:00
return false ;
}
2014-02-06 14:34:27 +04:00
2015-08-24 13:00:37 +03:00
if ( \OC :: $server -> getConfig () -> getSystemValue ( 'debug' , false )) {
2015-07-03 15:06:40 +03:00
\OCP\Util :: writeLog ( 'core' , 'Trying to login from cookie' , \OCP\Util :: DEBUG );
2013-01-14 23:30:28 +04:00
}
2014-05-21 20:03:37 +04:00
if ( OC_User :: userExists ( $_COOKIE [ 'oc_username' ])) {
2013-01-14 23:30:28 +04:00
self :: cleanupLoginTokens ( $_COOKIE [ 'oc_username' ]);
2014-05-24 12:24:42 +04:00
// verify whether the supplied "remember me" token was valid
2014-05-21 20:03:37 +04:00
$granted = OC_User :: loginWithCookie (
$_COOKIE [ 'oc_username' ], $_COOKIE [ 'oc_token' ]);
if ( $granted === true ) {
2013-01-14 23:30:28 +04:00
OC_Util :: redirectToDefaultPage ();
// doesn't return
}
2015-07-03 15:06:40 +03:00
\OCP\Util :: writeLog ( 'core' , 'Authentication cookie rejected for user ' .
$_COOKIE [ 'oc_username' ], \OCP\Util :: WARN );
2013-01-14 23:30:28 +04:00
// 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
}
2014-05-21 20:03:37 +04:00
2013-01-14 23:30:28 +04:00
OC_User :: unsetMagicInCookie ();
return true ;
}
2014-04-21 17:44:54 +04:00
/**
2014-09-22 16:01:45 +04:00
* Tries to login a user using the form based authentication
2014-04-21 17:44:54 +04:00
* @ return bool | void
*/
2013-01-31 01:55:33 +04:00
protected static function tryFormLogin () {
2013-01-14 23:30:28 +04:00
if ( ! isset ( $_POST [ " user " ]) || ! isset ( $_POST [ 'password' ])) {
return false ;
2013-01-04 23:16:59 +04:00
}
2013-01-14 23:30:28 +04:00
2015-12-18 17:43:13 +03:00
if ( ! ( \OC :: $server -> getRequest () -> passesCSRFCheck ())) {
2014-09-22 17:36:39 +04:00
return false ;
}
2013-01-14 23:30:28 +04:00
OC_App :: loadApps ();
//setup extra user backends
OC_User :: setupBackends ();
2015-02-13 15:33:20 +03:00
if ( OC_User :: login (( string ) $_POST [ " user " ], ( string ) $_POST [ " password " ])) {
2014-09-22 16:01:45 +04:00
$userId = OC_User :: getUser ();
2013-01-14 23:30:28 +04:00
// setting up the time zone
if ( isset ( $_POST [ 'timezone-offset' ])) {
2015-02-13 15:33:20 +03:00
self :: $server -> getSession () -> set ( 'timezone' , ( string ) $_POST [ 'timezone-offset' ]);
self :: $server -> getConfig () -> setUserValue ( $userId , 'core' , 'timezone' , ( string ) $_POST [ 'timezone' ]);
2013-01-14 23:30:28 +04:00
}
2014-09-22 16:01:45 +04:00
self :: cleanupLoginTokens ( $userId );
2013-01-14 23:30:28 +04:00
if ( ! empty ( $_POST [ " remember_login " ])) {
2015-08-24 13:00:37 +03:00
$config = self :: $server -> getConfig ();
if ( $config -> getSystemValue ( 'debug' , false )) {
2014-09-22 16:01:45 +04:00
self :: $server -> getLogger () -> debug ( 'Setting remember login to cookie' , array ( 'app' => 'core' ));
2013-01-14 23:30:28 +04:00
}
2016-01-11 22:05:30 +03:00
$token = \OC :: $server -> getSecureRandom () -> generate ( 32 );
2015-08-24 13:00:37 +03:00
$config -> setUserValue ( $userId , 'login_token' , $token , time ());
2014-09-22 16:01:45 +04:00
OC_User :: setMagicInCookie ( $userId , $token );
2013-01-14 23:30:28 +04:00
} else {
OC_User :: unsetMagicInCookie ();
}
OC_Util :: redirectToDefaultPage ();
exit ();
}
return true ;
}
2010-03-10 15:03:40 +03:00
2011-07-29 23:03:53 +04:00
}
2015-05-29 22:56:08 +03:00
2011-11-13 19:16:21 +04:00
OC :: init ();