Completed
Push — master ( 580deb...21a700 )
by Morris
82:20
created

OC::initPaths()   F

Complexity

Conditions 29
Paths 3300

Size

Total Lines 124
Code Lines 78

Duplication

Lines 3
Ratio 2.42 %

Code Coverage

Tests 0
CRAP Score 870
Metric Value
dl 3
loc 124
rs 2
ccs 0
cts 87
cp 0
cc 29
eloc 78
nc 3300
nop 0
crap 870

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * @author Adam Williamson <[email protected]>
4
 * @author Andreas Fischer <[email protected]>
5
 * @author Arthur Schiwon <[email protected]>
6
 * @author Bart Visscher <[email protected]>
7
 * @author Bernhard Posselt <[email protected]>
8
 * @author Björn Schießle <[email protected]>
9
 * @author Christopher Schäpers <[email protected]>
10
 * @author davidgumberg <[email protected]>
11
 * @author Florian Scholz <[email protected]>
12
 * @author Florin Peter <[email protected]>
13
 * @author Frank Karlitschek <[email protected]>
14
 * @author Georg Ehrke <[email protected]>
15
 * @author Hugo Gonzalez Labrador <[email protected]>
16
 * @author Individual IT Services <[email protected]>
17
 * @author Jakob Sack <[email protected]>
18
 * @author Joas Schilling <[email protected]>
19
 * @author Jörn Friedrich Dreyer <[email protected]>
20
 * @author Lukas Reschke <[email protected]>
21
 * @author marc0s <[email protected]>
22
 * @author Martin Mattel <[email protected]>
23
 * @author Michael Gapczynski <[email protected]>
24
 * @author Morris Jobke <[email protected]>
25
 * @author Owen Winkler <[email protected]>
26
 * @author Phil Davis <[email protected]>
27
 * @author Ramiro Aparicio <[email protected]>
28
 * @author Robin Appelman <[email protected]>
29
 * @author Robin McCorkell <[email protected]>
30
 * @author scolebrook <[email protected]>
31
 * @author Stefan Herbrechtsmeier <[email protected]>
32
 * @author Thomas Müller <[email protected]>
33
 * @author Thomas Tanghus <[email protected]>
34
 * @author Victor Dubiniuk <[email protected]>
35
 * @author Vincent Petry <[email protected]>
36
 * @author Volkan Gezer <[email protected]>
37
 *
38
 * @copyright Copyright (c) 2015, ownCloud, Inc.
39
 * @license AGPL-3.0
40
 *
41
 * This code is free software: you can redistribute it and/or modify
42
 * it under the terms of the GNU Affero General Public License, version 3,
43
 * as published by the Free Software Foundation.
44
 *
45
 * This program is distributed in the hope that it will be useful,
46
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
47
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
48
 * GNU Affero General Public License for more details.
49
 *
50
 * You should have received a copy of the GNU Affero General Public License, version 3,
51
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
52
 *
53
 */
54
55
require_once 'public/constants.php';
56
57
/**
58
 * Class that is a namespace for all global OC variables
59
 * No, we can not put this class in its own file because it is used by
60
 * OC_autoload!
61
 */
62
class OC {
63
	/**
64
	 * Associative array for autoloading. classname => filename
65
	 */
66
	public static $CLASSPATH = array();
67
	/**
68
	 * The installation path for owncloud on the server (e.g. /srv/http/owncloud)
69
	 */
70
	public static $SERVERROOT = '';
71
	/**
72
	 * the current request path relative to the owncloud root (e.g. files/index.php)
73
	 */
74
	private static $SUBURI = '';
75
	/**
76
	 * the owncloud root path for http requests (e.g. owncloud/)
77
	 */
78
	public static $WEBROOT = '';
79
	/**
80
	 * The installation path of the 3rdparty folder on the server (e.g. /srv/http/owncloud/3rdparty)
81
	 */
82
	public static $THIRDPARTYROOT = '';
83
	/**
84
	 * the root path of the 3rdparty folder for http requests (e.g. owncloud/3rdparty)
85
	 */
86
	public static $THIRDPARTYWEBROOT = '';
87
	/**
88
	 * The installation path array of the apps folder on the server (e.g. /srv/http/owncloud) 'path' and
89
	 * web path in 'url'
90
	 */
91
	public static $APPSROOTS = array();
92
93
	public static $configDir;
94
95
	/**
96
	 * requested app
97
	 */
98
	public static $REQUESTEDAPP = '';
99
100
	/**
101
	 * check if ownCloud runs in cli mode
102
	 */
103
	public static $CLI = false;
104
105
	/**
106
	 * @var \OC\Autoloader $loader
107
	 */
108
	public static $loader = null;
109
110
	/**
111
	 * @var \OC\Server
112
	 */
113
	public static $server = null;
114
115
	/**
116
	 * @var \OC\Config
117
	 */
118
	private static $config = null;
119
120
	/**
121
	 * @throws \RuntimeException when the 3rdparty directory is missing or
122
	 * the app path list is empty or contains an invalid path
123
	 */
124
	public static function initPaths() {
125
		if(defined('PHPUNIT_CONFIG_DIR')) {
126
			self::$configDir = OC::$SERVERROOT . '/' . PHPUNIT_CONFIG_DIR . '/';
127
		} elseif(defined('PHPUNIT_RUN') and PHPUNIT_RUN and is_dir(OC::$SERVERROOT . '/tests/config/')) {
128
			self::$configDir = OC::$SERVERROOT . '/tests/config/';
129
		} else {
130
			self::$configDir = OC::$SERVERROOT . '/config/';
131
		}
132
		self::$config = new \OC\Config(self::$configDir);
133
134
		OC::$SUBURI = str_replace("\\", "/", substr(realpath($_SERVER["SCRIPT_FILENAME"]), strlen(OC::$SERVERROOT)));
135
		/**
136
		 * FIXME: The following lines are required because we can't yet instantiiate
137
		 *        \OC::$server->getRequest() since \OC::$server does not yet exist.
138
		 */
139
		$params = [
140
			'server' => [
141
				'SCRIPT_NAME' => $_SERVER['SCRIPT_NAME'],
142
				'SCRIPT_FILENAME' => $_SERVER['SCRIPT_FILENAME'],
143
			],
144
		];
145
		$fakeRequest = new \OC\AppFramework\Http\Request($params, null, new \OC\AllConfig(new \OC\SystemConfig(self::$config)));
146
		$scriptName = $fakeRequest->getScriptName();
147
		if (substr($scriptName, -1) == '/') {
148
			$scriptName .= 'index.php';
149
			//make sure suburi follows the same rules as scriptName
150
			if (substr(OC::$SUBURI, -9) != 'index.php') {
151
				if (substr(OC::$SUBURI, -1) != '/') {
152
					OC::$SUBURI = OC::$SUBURI . '/';
153
				}
154
				OC::$SUBURI = OC::$SUBURI . 'index.php';
155
			}
156
		}
157
158
159
		if (OC::$CLI) {
160
			OC::$WEBROOT = self::$config->getValue('overwritewebroot', '');
161
		} else {
162
			if (substr($scriptName, 0 - strlen(OC::$SUBURI)) === OC::$SUBURI) {
163
				OC::$WEBROOT = substr($scriptName, 0, 0 - strlen(OC::$SUBURI));
164
165
				if (OC::$WEBROOT != '' && OC::$WEBROOT[0] !== '/') {
166
					OC::$WEBROOT = '/' . OC::$WEBROOT;
167
				}
168
			} else {
169
				// The scriptName is not ending with OC::$SUBURI
170
				// This most likely means that we are calling from CLI.
171
				// However some cron jobs still need to generate
172
				// a web URL, so we use overwritewebroot as a fallback.
173
				OC::$WEBROOT = self::$config->getValue('overwritewebroot', '');
174
			}
175
176
			// Resolve /owncloud to /owncloud/ to ensure to always have a trailing
177
			// slash which is required by URL generation.
178
			if($_SERVER['REQUEST_URI'] === \OC::$WEBROOT &&
179
					substr($_SERVER['REQUEST_URI'], -1) !== '/') {
180
				header('Location: '.\OC::$WEBROOT.'/');
181
				exit();
182
			}
183
		}
184
185
		// search the 3rdparty folder
186
		OC::$THIRDPARTYROOT = self::$config->getValue('3rdpartyroot', null);
187
		OC::$THIRDPARTYWEBROOT = self::$config->getValue('3rdpartyurl', null);
188
189
		if (empty(OC::$THIRDPARTYROOT) && empty(OC::$THIRDPARTYWEBROOT)) {
190
			if (file_exists(OC::$SERVERROOT . '/3rdparty')) {
191
				OC::$THIRDPARTYROOT = OC::$SERVERROOT;
192
				OC::$THIRDPARTYWEBROOT = OC::$WEBROOT;
193
			} elseif (file_exists(OC::$SERVERROOT . '/../3rdparty')) {
194
				OC::$THIRDPARTYWEBROOT = rtrim(dirname(OC::$WEBROOT), '/');
195
				OC::$THIRDPARTYROOT = rtrim(dirname(OC::$SERVERROOT), '/');
196
			}
197
		}
198
		if (empty(OC::$THIRDPARTYROOT) || !file_exists(OC::$THIRDPARTYROOT)) {
199
			throw new \RuntimeException('3rdparty directory not found! Please put the ownCloud 3rdparty'
200
				. ' folder in the ownCloud folder or the folder above.'
201
				. ' You can also configure the location in the config.php file.');
202
		}
203
204
		// search the apps folder
205
		$config_paths = self::$config->getValue('apps_paths', array());
206
		if (!empty($config_paths)) {
207
			foreach ($config_paths as $paths) {
208
				if (isset($paths['url']) && isset($paths['path'])) {
209
					$paths['url'] = rtrim($paths['url'], '/');
210
					$paths['path'] = rtrim($paths['path'], '/');
211
					OC::$APPSROOTS[] = $paths;
212
				}
213
			}
214 View Code Duplication
		} elseif (file_exists(OC::$SERVERROOT . '/apps')) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
215
			OC::$APPSROOTS[] = array('path' => OC::$SERVERROOT . '/apps', 'url' => '/apps', 'writable' => true);
216
		} elseif (file_exists(OC::$SERVERROOT . '/../apps')) {
217
			OC::$APPSROOTS[] = array(
218
				'path' => rtrim(dirname(OC::$SERVERROOT), '/') . '/apps',
219
				'url' => '/apps',
220
				'writable' => true
221
			);
222
		}
223
224
		if (empty(OC::$APPSROOTS)) {
225
			throw new \RuntimeException('apps directory not found! Please put the ownCloud apps folder in the ownCloud folder'
226
				. ' or the folder above. You can also configure the location in the config.php file.');
227
		}
228
		$paths = array();
229
		foreach (OC::$APPSROOTS as $path) {
230
			$paths[] = $path['path'];
231
			if (!is_dir($path['path'])) {
232
				throw new \RuntimeException(sprintf('App directory "%s" not found! Please put the ownCloud apps folder in the'
233
					. ' ownCloud folder or the folder above. You can also configure the location in the'
234
					. ' config.php file.', $path['path']));
235
			}
236
		}
237
238
		// set the right include path
239
		set_include_path(
240
			OC::$SERVERROOT . '/lib/private' . PATH_SEPARATOR .
241
			OC::$SERVERROOT . '/config' . PATH_SEPARATOR .
242
			OC::$THIRDPARTYROOT . '/3rdparty' . PATH_SEPARATOR .
243
			implode(PATH_SEPARATOR, $paths) . PATH_SEPARATOR .
244
			get_include_path() . PATH_SEPARATOR .
245
			OC::$SERVERROOT
246
		);
247
	}
248
249
	public static function checkConfig() {
250
		$l = \OC::$server->getL10N('lib');
251
252
		// Create config if it does not already exist
253
		$configFilePath = self::$configDir .'/config.php';
254
		if(!file_exists($configFilePath)) {
255
			@touch($configFilePath);
256
		}
257
258
		// Check if config is writable
259
		$configFileWritable = is_writable($configFilePath);
260
		if (!$configFileWritable && !OC_Helper::isReadOnlyConfigEnabled()
261
			|| !$configFileWritable && self::checkUpgrade(false)) {
262
263
			$urlGenerator = \OC::$server->getURLGenerator();
264
265
			if (self::$CLI) {
266
				echo $l->t('Cannot write into "config" directory!')."\n";
267
				echo $l->t('This can usually be fixed by giving the webserver write access to the config directory')."\n";
268
				echo "\n";
269
				echo $l->t('See %s', [ $urlGenerator->linkToDocs('admin-dir_permissions') ])."\n";
270
				exit;
271
			} else {
272
				OC_Template::printErrorPage(
273
					$l->t('Cannot write into "config" directory!'),
274
					$l->t('This can usually be fixed by '
275
					. '%sgiving the webserver write access to the config directory%s.',
276
					 array('<a href="' . $urlGenerator->linkToDocs('admin-dir_permissions') . '" target="_blank">', '</a>'))
277
				);
278
			}
279
		}
280
	}
281
282
	public static function checkInstalled() {
283
		if (defined('OC_CONSOLE')) {
284
			return;
285
		}
286
		// Redirect to installer if not installed
287
		if (!\OC::$server->getSystemConfig()->getValue('installed', false) && OC::$SUBURI != '/index.php') {
288
			if (OC::$CLI) {
289
				throw new Exception('Not installed');
290
			} else {
291
				$url = 'http://' . $_SERVER['SERVER_NAME'] . OC::$WEBROOT . '/index.php';
292
				header('Location: ' . $url);
293
			}
294
			exit();
295
		}
296
	}
297
298
	public static function checkMaintenanceMode() {
299
		// Allow ajax update script to execute without being stopped
300
		if (\OC::$server->getSystemConfig()->getValue('maintenance', false) && OC::$SUBURI != '/core/ajax/update.php') {
301
			// send http status 503
302
			header('HTTP/1.1 503 Service Temporarily Unavailable');
303
			header('Status: 503 Service Temporarily Unavailable');
304
			header('Retry-After: 120');
305
306
			// render error page
307
			$template = new OC_Template('', 'update.user', 'guest');
308
			OC_Util::addscript('maintenance-check');
309
			$template->printPage();
310
			die();
311
		}
312
	}
313
314
	public static function checkSingleUserMode($lockIfNoUserLoggedIn = false) {
315
		if (!\OC::$server->getSystemConfig()->getValue('singleuser', false)) {
316
			return;
317
		}
318
		$user = OC_User::getUserSession()->getUser();
319
		if ($user) {
320
			$group = \OC::$server->getGroupManager()->get('admin');
321
			if ($group->inGroup($user)) {
322
				return;
323
			}
324
		} else {
325
			if(!$lockIfNoUserLoggedIn) {
326
				return;
327
			}
328
		}
329
		// send http status 503
330
		header('HTTP/1.1 503 Service Temporarily Unavailable');
331
		header('Status: 503 Service Temporarily Unavailable');
332
		header('Retry-After: 120');
333
334
		// render error page
335
		$template = new OC_Template('', 'singleuser.user', 'guest');
336
		$template->printPage();
337
		die();
338
	}
339
340
	/**
341
	 * check if the instance needs to perform an upgrade
342
	 *
343
	 * @return bool
344
	 * @deprecated use \OCP\Util::needUpgrade() instead
345
	 */
346
	public static function needUpgrade() {
347
		return \OCP\Util::needUpgrade();
348
	}
349
350
	/**
351
	 * Checks if the version requires an update and shows
352
	 * @param bool $showTemplate Whether an update screen should get shown
353
	 * @return bool|void
354
	 */
355 21
	public static function checkUpgrade($showTemplate = true) {
356 21
		if (\OCP\Util::needUpgrade()) {
357
			$systemConfig = \OC::$server->getSystemConfig();
358
			if ($showTemplate && !$systemConfig->getValue('maintenance', false)) {
359
				self::printUpgradePage();
360
				exit();
361
			} else {
362
				return true;
363
			}
364
		}
365 21
		return false;
366
	}
367
368
	/**
369
	 * Prints the upgrade page
370
	 */
371
	private static function printUpgradePage() {
372
		$systemConfig = \OC::$server->getSystemConfig();
373
		$oldTheme = $systemConfig->getValue('theme');
374
		$systemConfig->setValue('theme', '');
375
		\OCP\Util::addScript('config'); // needed for web root
376
		\OCP\Util::addScript('update');
377
378
		// check whether this is a core update or apps update
379
		$installedVersion = $systemConfig->getValue('version', '0.0.0');
380
		$currentVersion = implode('.', \OCP\Util::getVersion());
381
382
		$appManager = \OC::$server->getAppManager();
383
384
		$tmpl = new OC_Template('', 'update.admin', 'guest');
385
		$tmpl->assign('version', OC_Util::getVersionString());
386
387
		// if not a core upgrade, then it's apps upgrade
388
		if (version_compare($currentVersion, $installedVersion, '=')) {
389
			$tmpl->assign('isAppsOnlyUpgrade', true);
390
		} else {
391
			$tmpl->assign('isAppsOnlyUpgrade', false);
392
		}
393
394
		// get third party apps
395
		$ocVersion = \OCP\Util::getVersion();
396
		$tmpl->assign('appsToUpgrade', $appManager->getAppsNeedingUpgrade($ocVersion));
397
		$tmpl->assign('incompatibleAppsList', $appManager->getIncompatibleApps($ocVersion));
398
		$tmpl->assign('productName', 'ownCloud'); // for now
399
		$tmpl->assign('oldTheme', $oldTheme);
400
		$tmpl->printPage();
401
	}
402
403
	public static function initSession() {
404
		// prevents javascript from accessing php session cookies
405
		ini_set('session.cookie_httponly', true);
406
407
		// set the cookie path to the ownCloud directory
408
		$cookie_path = OC::$WEBROOT ? : '/';
409
		ini_set('session.cookie_path', $cookie_path);
410
411
		// Let the session name be changed in the initSession Hook
412
		$sessionName = OC_Util::getInstanceId();
413
414
		try {
415
			// Allow session apps to create a custom session object
416
			$useCustomSession = false;
417
			$session = self::$server->getSession();
418
			OC_Hook::emit('OC', 'initSession', array('session' => &$session, 'sessionName' => &$sessionName, 'useCustomSession' => &$useCustomSession));
419
			if (!$useCustomSession) {
420
				// set the session name to the instance id - which is unique
421
				$session = new \OC\Session\Internal($sessionName);
422
			}
423
424
			$cryptoWrapper = \OC::$server->getSessionCryptoWrapper();
425
			$session = $cryptoWrapper->wrapSession($session);
426
			self::$server->setSession($session);
427
428
			// if session cant be started break with http 500 error
429
		} catch (Exception $e) {
430
			\OCP\Util::logException('base', $e);
431
			//show the user a detailed error page
432
			OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
433
			OC_Template::printExceptionErrorPage($e);
434
		}
435
436
		$sessionLifeTime = self::getSessionLifeTime();
437
		// regenerate session id periodically to avoid session fixation
438
		/**
439
		 * @var \OCP\ISession $session
440
		 */
441
		$session = self::$server->getSession();
442
		if (!$session->exists('SID_CREATED')) {
443
			$session->set('SID_CREATED', time());
444
		} else if (time() - $session->get('SID_CREATED') > $sessionLifeTime / 2) {
445
			$session->regenerateId();
446
			$session->set('SID_CREATED', time());
447
		}
448
449
		// session timeout
450
		if ($session->exists('LAST_ACTIVITY') && (time() - $session->get('LAST_ACTIVITY') > $sessionLifeTime)) {
451
			if (isset($_COOKIE[session_name()])) {
452
				setcookie(session_name(), null, -1, self::$WEBROOT ? : '/');
453
			}
454
			$session->clear();
455
		}
456
457
		$session->set('LAST_ACTIVITY', time());
458
	}
459
460
	/**
461
	 * @return string
462
	 */
463
	private static function getSessionLifeTime() {
464
		return \OC::$server->getConfig()->getSystemValue('session_lifetime', 60 * 60 * 24);
465
	}
466
467
	public static function loadAppClassPaths() {
468
		foreach (OC_APP::getEnabledApps() as $app) {
469
			$appPath = OC_App::getAppPath($app);
470
			if ($appPath === false) {
471
				continue;
472
			}
473
474
			$file = $appPath . '/appinfo/classpath.php';
475
			if (file_exists($file)) {
476
				require_once $file;
477
			}
478
		}
479
	}
480
481
	/**
482
	 * Try to set some values to the required ownCloud default
483
	 */
484
	public static function setRequiredIniValues() {
485
		@ini_set('default_charset', 'UTF-8');
486
	}
487
488
	public static function init() {
489
		// calculate the root directories
490
		OC::$SERVERROOT = str_replace("\\", '/', substr(__DIR__, 0, -4));
491
492
		// register autoloader
493
		$loaderStart = microtime(true);
494
		require_once __DIR__ . '/autoloader.php';
495
		self::$loader = new \OC\Autoloader([
496
			OC::$SERVERROOT . '/lib',
497
			OC::$SERVERROOT . '/core',
498
			OC::$SERVERROOT . '/settings',
499
			OC::$SERVERROOT . '/ocs',
500
			OC::$SERVERROOT . '/ocs-provider',
501
			OC::$SERVERROOT . '/3rdparty',
502
			OC::$SERVERROOT . '/tests',
503
		]);
504
		spl_autoload_register(array(self::$loader, 'load'));
505
		$loaderEnd = microtime(true);
506
507
		self::$CLI = (php_sapi_name() == 'cli');
508
509
		try {
510
			self::initPaths();
511
			// setup 3rdparty autoloader
512
			$vendorAutoLoad = OC::$THIRDPARTYROOT . '/3rdparty/autoload.php';
513
			if (!file_exists($vendorAutoLoad)) {
514
				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".');
515
			}
516
			require_once $vendorAutoLoad;
517
518
		} catch (\RuntimeException $e) {
519
			OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
520
			// we can't use the template error page here, because this needs the
521
			// DI container which isn't available yet
522
			print($e->getMessage());
523
			exit();
524
		}
525
526
		// setup the basic server
527
		self::$server = new \OC\Server(\OC::$WEBROOT, self::$config);
528
		\OC::$server->getEventLogger()->log('autoloader', 'Autoloader', $loaderStart, $loaderEnd);
529
		\OC::$server->getEventLogger()->start('boot', 'Initialize');
530
531
		// Don't display errors and log them
532
		error_reporting(E_ALL | E_STRICT);
533
		@ini_set('display_errors', 0);
534
		@ini_set('log_errors', 1);
535
536
		date_default_timezone_set('UTC');
537
538
		//try to configure php to enable big file uploads.
539
		//this doesn´t work always depending on the webserver and php configuration.
540
		//Let´s try to overwrite some defaults anyway
541
542
		//try to set the maximum execution time to 60min
543
		@set_time_limit(3600);
544
		@ini_set('max_execution_time', 3600);
545
		@ini_set('max_input_time', 3600);
546
547
		//try to set the maximum filesize to 10G
548
		@ini_set('upload_max_filesize', '10G');
549
		@ini_set('post_max_size', '10G');
550
		@ini_set('file_uploads', '50');
551
552
		self::setRequiredIniValues();
553
		self::handleAuthHeaders();
554
		self::registerAutoloaderCache();
555
556
		// initialize intl fallback is necessary
557
		\Patchwork\Utf8\Bootup::initIntl();
558
		OC_Util::isSetLocaleWorking();
559
560
		if (!defined('PHPUNIT_RUN')) {
561
			$logger = \OC::$server->getLogger();
562
			OC\Log\ErrorHandler::setLogger($logger);
563
			if (\OC::$server->getConfig()->getSystemValue('debug', false)) {
564
				OC\Log\ErrorHandler::register(true);
565
				set_exception_handler(array('OC_Template', 'printExceptionErrorPage'));
566
			} else {
567
				OC\Log\ErrorHandler::register();
568
			}
569
		}
570
571
		// register the stream wrappers
572
		stream_wrapper_register('fakedir', 'OC\Files\Stream\Dir');
573
		stream_wrapper_register('static', 'OC\Files\Stream\StaticStream');
574
		stream_wrapper_register('close', 'OC\Files\Stream\Close');
575
		stream_wrapper_register('quota', 'OC\Files\Stream\Quota');
576
		stream_wrapper_register('oc', 'OC\Files\Stream\OC');
577
578
		\OC::$server->getEventLogger()->start('init_session', 'Initialize session');
579
		OC_App::loadApps(array('session'));
580
		if (!self::$CLI) {
581
			self::initSession();
582
		}
583
		\OC::$server->getEventLogger()->end('init_session');
584
		self::checkConfig();
585
		self::checkInstalled();
586
587
		OC_Response::addSecurityHeaders();
588
		if(self::$server->getRequest()->getServerProtocol() === 'https') {
589
			ini_set('session.cookie_secure', true);
590
		}
591
592
		if (!defined('OC_CONSOLE')) {
593
			$errors = OC_Util::checkServer(\OC::$server->getConfig());
594
			if (count($errors) > 0) {
595
				if (self::$CLI) {
596
					// Convert l10n string into regular string for usage in database
597
					$staticErrors = [];
598
					foreach ($errors as $error) {
599
						echo $error['error'] . "\n";
600
						echo $error['hint'] . "\n\n";
601
						$staticErrors[] = [
602
							'error' => (string)$error['error'],
603
							'hint' => (string)$error['hint'],
604
						];
605
					}
606
607
					try {
608
						\OC::$server->getConfig()->setAppValue('core', 'cronErrors', json_encode($staticErrors));
609
					} catch (\Exception $e) {
610
						echo('Writing to database failed');
611
					}
612
					exit(1);
613
				} else {
614
					OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
615
					OC_Template::printGuestPage('', 'error', array('errors' => $errors));
616
					exit;
617
				}
618 View Code Duplication
			} elseif (self::$CLI && \OC::$server->getConfig()->getSystemValue('installed', false)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
619
				\OC::$server->getConfig()->deleteAppValue('core', 'cronErrors');
620
			}
621
		}
622
		//try to set the session lifetime
623
		$sessionLifeTime = self::getSessionLifeTime();
624
		@ini_set('gc_maxlifetime', (string)$sessionLifeTime);
625
626
		$systemConfig = \OC::$server->getSystemConfig();
627
628
		// User and Groups
629
		if (!$systemConfig->getValue("installed", false)) {
630
			self::$server->getSession()->set('user_id', '');
631
		}
632
633
		OC_User::useBackend(new OC_User_Database());
634
		OC_Group::useBackend(new OC_Group_Database());
635
636
		// Subscribe to the hook
637
		\OCP\Util::connectHook(
638
			'\OCA\Files_Sharing\API\Server2Server',
639
			'preLoginNameUsedAsUserName',
640
			'\OC_User_Database',
641
			'preLoginNameUsedAsUserName'
642
		);
643
644
		//setup extra user backends
645
		if (!self::checkUpgrade(false)) {
0 ignored issues
show
Bug Best Practice introduced by
The expression self::checkUpgrade(false) of type null|boolean is loosely compared to false; this is ambiguous if the boolean can be false. You might want to explicitly use !== null instead.

If an expression can have both false, and null as possible values. It is generally a good practice to always use strict comparison to clearly distinguish between those two values.

$a = canBeFalseAndNull();

// Instead of
if ( ! $a) { }

// Better use one of the explicit versions:
if ($a !== null) { }
if ($a !== false) { }
if ($a !== null && $a !== false) { }
Loading history...
646
			OC_User::setupBackends();
647
		}
648
649
		self::registerCacheHooks();
650
		self::registerFilesystemHooks();
651
		if ($systemConfig->getValue('enable_previews', true)) {
652
			self::registerPreviewHooks();
653
		}
654
		self::registerShareHooks();
655
		self::registerLogRotate();
656
		self::registerLocalAddressBook();
657
		self::registerEncryptionWrapper();
658
		self::registerEncryptionHooks();
659
660
		//make sure temporary files are cleaned up
661
		$tmpManager = \OC::$server->getTempManager();
662
		register_shutdown_function(array($tmpManager, 'clean'));
663
		$lockProvider = \OC::$server->getLockingProvider();
664
		register_shutdown_function(array($lockProvider, 'releaseAll'));
665
666
		// Check whether the sample configuration has been copied
667
		if($systemConfig->getValue('copied_sample_config', false)) {
668
			$l = \OC::$server->getL10N('lib');
669
			header('HTTP/1.1 503 Service Temporarily Unavailable');
670
			header('Status: 503 Service Temporarily Unavailable');
671
			OC_Template::printErrorPage(
672
				$l->t('Sample configuration detected'),
673
				$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')
674
			);
675
			return;
676
		}
677
678
		$request = \OC::$server->getRequest();
679
		$host = $request->getInsecureServerHost();
680
		/**
681
		 * if the host passed in headers isn't trusted
682
		 * FIXME: Should not be in here at all :see_no_evil:
683
		 */
684
		if (!OC::$CLI
685
			// overwritehost is always trusted, workaround to not have to make
686
			// \OC\AppFramework\Http\Request::getOverwriteHost public
687
			&& self::$server->getConfig()->getSystemValue('overwritehost') === ''
688
			&& !\OC::$server->getTrustedDomainHelper()->isTrustedDomain($host)
689
			&& self::$server->getConfig()->getSystemValue('installed', false)
690
		) {
691
			header('HTTP/1.1 400 Bad Request');
692
			header('Status: 400 Bad Request');
693
694
			\OC::$server->getLogger()->warning(
695
					'Trusted domain error. "{remoteAddress}" tried to access using "{host}" as host.',
696
					[
697
						'app' => 'core',
698
						'remoteAddress' => $request->getRemoteAddress(),
699
						'host' => $host,
700
					]
701
			);
702
703
			$tmpl = new OCP\Template('core', 'untrustedDomain', 'guest');
704
			$tmpl->assign('domain', $request->server['SERVER_NAME']);
0 ignored issues
show
Bug introduced by
Accessing server on the interface OCP\IRequest suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
705
			$tmpl->printPage();
706
707
			exit();
708
		}
709
		\OC::$server->getEventLogger()->end('boot');
710
	}
711
712
	private static function registerLocalAddressBook() {
713
		self::$server->getContactsManager()->register(function() {
714
			$userManager = \OC::$server->getUserManager();
715
			\OC::$server->getContactsManager()->registerAddressBook(
716
				new \OC\Contacts\LocalAddressBook($userManager));
717
		});
718
	}
719
720
	/**
721
	 * register hooks for the cache
722
	 */
723 570
	public static function registerCacheHooks() {
724
		//don't try to do this before we are properly setup
725
		if (\OC::$server->getSystemConfig()->getValue('installed', false) && !self::checkUpgrade(false)) {
0 ignored issues
show
Bug Best Practice introduced by
The expression self::checkUpgrade(false) of type null|boolean is loosely compared to false; this is ambiguous if the boolean can be false. You might want to explicitly use !== null instead.

If an expression can have both false, and null as possible values. It is generally a good practice to always use strict comparison to clearly distinguish between those two values.

$a = canBeFalseAndNull();

// Instead of
if ( ! $a) { }

// Better use one of the explicit versions:
if ($a !== null) { }
if ($a !== false) { }
if ($a !== null && $a !== false) { }
Loading history...
726
727
			// NOTE: This will be replaced to use OCP
728
			$userSession = self::$server->getUserSession();
729 570
			$userSession->listen('\OC\User', 'postLogin', function () {
730
				try {
731 570
					$cache = new \OC\Cache\File();
732 570
					$cache->gc();
733 570
				} catch (\Exception $e) {
734
					// a GC exception should not prevent users from using OC,
735
					// so log the exception
736
					\OC::$server->getLogger()->warning('Exception when running cache gc: ' . $e->getMessage(), array('app' => 'core'));
737
				}
738 570
			});
739
		}
740
	}
741
742
	private static function registerEncryptionWrapper() {
743
		\OCP\Util::connectHook('OC_Filesystem', 'preSetup', 'OC\Encryption\Manager', 'setupStorage');
744
	}
745
746
	private static function registerEncryptionHooks() {
747
		$enabled = self::$server->getEncryptionManager()->isEnabled();
748
		if ($enabled) {
749
			\OCP\Util::connectHook('OCP\Share', 'post_shared', 'OC\Encryption\HookManager', 'postShared');
750
			\OCP\Util::connectHook('OCP\Share', 'post_unshare', 'OC\Encryption\HookManager', 'postUnshared');
751
			\OCP\Util::connectHook('OC_Filesystem', 'post_rename', 'OC\Encryption\HookManager', 'postRename');
752
			\OCP\Util::connectHook('\OCA\Files_Trashbin\Trashbin', 'post_restore', 'OC\Encryption\HookManager', 'postRestore');
753
		}
754
	}
755
756
	/**
757
	 * register hooks for the cache
758
	 */
759
	public static function registerLogRotate() {
760
		$systemConfig = \OC::$server->getSystemConfig();
761
		if ($systemConfig->getValue('installed', false) && $systemConfig->getValue('log_rotate_size', false) && !self::checkUpgrade(false)) {
0 ignored issues
show
Bug Best Practice introduced by
The expression self::checkUpgrade(false) of type null|boolean is loosely compared to false; this is ambiguous if the boolean can be false. You might want to explicitly use !== null instead.

If an expression can have both false, and null as possible values. It is generally a good practice to always use strict comparison to clearly distinguish between those two values.

$a = canBeFalseAndNull();

// Instead of
if ( ! $a) { }

// Better use one of the explicit versions:
if ($a !== null) { }
if ($a !== false) { }
if ($a !== null && $a !== false) { }
Loading history...
762
			//don't try to do this before we are properly setup
763
			//use custom logfile path if defined, otherwise use default of owncloud.log in data directory
764
			\OCP\BackgroundJob::registerJob('OC\Log\Rotate', $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', OC::$SERVERROOT . '/data') . '/owncloud.log'));
765
		}
766
	}
767
768
	/**
769
	 * register hooks for the filesystem
770
	 */
771
	public static function registerFilesystemHooks() {
772
		// Check for blacklisted files
773
		OC_Hook::connect('OC_Filesystem', 'write', 'OC\Files\Filesystem', 'isBlacklisted');
774
		OC_Hook::connect('OC_Filesystem', 'rename', 'OC\Files\Filesystem', 'isBlacklisted');
775
	}
776
777
	/**
778
	 * register hooks for previews
779
	 */
780
	public static function registerPreviewHooks() {
781
		OC_Hook::connect('OC_Filesystem', 'post_write', 'OC\Preview', 'post_write');
782
		OC_Hook::connect('OC_Filesystem', 'delete', 'OC\Preview', 'prepare_delete_files');
783
		OC_Hook::connect('\OCP\Versions', 'preDelete', 'OC\Preview', 'prepare_delete');
784
		OC_Hook::connect('\OCP\Trashbin', 'preDelete', 'OC\Preview', 'prepare_delete');
785
		OC_Hook::connect('OC_Filesystem', 'post_delete', 'OC\Preview', 'post_delete_files');
786
		OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete_versions');
787
		OC_Hook::connect('\OCP\Trashbin', 'delete', 'OC\Preview', 'post_delete');
788
		OC_Hook::connect('\OCP\Versions', 'rollback', 'OC\Preview', 'post_delete_versions');
789
	}
790
791
	/**
792
	 * register hooks for sharing
793
	 */
794 90
	public static function registerShareHooks() {
795 90
		if (\OC::$server->getSystemConfig()->getValue('installed')) {
796 90
			OC_Hook::connect('OC_User', 'post_deleteUser', 'OC\Share\Hooks', 'post_deleteUser');
797 90
			OC_Hook::connect('OC_User', 'post_addToGroup', 'OC\Share\Hooks', 'post_addToGroup');
798 90
			OC_Hook::connect('OC_Group', 'pre_addToGroup', 'OC\Share\Hooks', 'pre_addToGroup');
799 90
			OC_Hook::connect('OC_User', 'post_removeFromGroup', 'OC\Share\Hooks', 'post_removeFromGroup');
800 90
			OC_Hook::connect('OC_User', 'post_deleteGroup', 'OC\Share\Hooks', 'post_deleteGroup');
801 90
		}
802 90
	}
803
804
	protected static function registerAutoloaderCache() {
805
		// The class loader takes an optional low-latency cache, which MUST be
806
		// namespaced. The instanceid is used for namespacing, but might be
807
		// unavailable at this point. Futhermore, it might not be possible to
808
		// generate an instanceid via \OC_Util::getInstanceId() because the
809
		// config file may not be writable. As such, we only register a class
810
		// loader cache if instanceid is available without trying to create one.
811
		$instanceId = \OC::$server->getSystemConfig()->getValue('instanceid', null);
812
		if ($instanceId) {
813
			try {
814
				$memcacheFactory = \OC::$server->getMemCacheFactory();
815
				self::$loader->setMemoryCache($memcacheFactory->createLocal('Autoloader'));
0 ignored issues
show
Bug introduced by
The method createLocal() does not exist on OCP\ICacheFactory. Did you maybe mean create()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
816
			} catch (\Exception $ex) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
817
			}
818
		}
819
	}
820
821
	/**
822
	 * Handle the request
823
	 */
824
	public static function handleRequest() {
825
826
		\OC::$server->getEventLogger()->start('handle_request', 'Handle request');
827
		$systemConfig = \OC::$server->getSystemConfig();
828
		// load all the classpaths from the enabled apps so they are available
829
		// in the routing files of each app
830
		OC::loadAppClassPaths();
831
832
		// Check if ownCloud is installed or in maintenance (update) mode
833
		if (!$systemConfig->getValue('installed', false)) {
834
			\OC::$server->getSession()->clear();
835
			$setupHelper = new OC\Setup(\OC::$server->getConfig(), \OC::$server->getIniWrapper(),
836
				\OC::$server->getL10N('lib'), new \OC_Defaults(), \OC::$server->getLogger(),
837
				\OC::$server->getSecureRandom());
838
			$controller = new OC\Core\Setup\Controller($setupHelper);
839
			$controller->run($_POST);
840
			exit();
841
		}
842
843
		$request = \OC::$server->getRequest()->getPathInfo();
844
		if (substr($request, -3) !== '.js') { // we need these files during the upgrade
845
			self::checkMaintenanceMode();
846
			self::checkUpgrade();
847
		}
848
849
		// Always load authentication apps
850
		OC_App::loadApps(['authentication']);
851
852
		// Load minimum set of apps
853
		if (!self::checkUpgrade(false)
0 ignored issues
show
Bug Best Practice introduced by
The expression self::checkUpgrade(false) of type null|boolean is loosely compared to false; this is ambiguous if the boolean can be false. You might want to explicitly use !== null instead.

If an expression can have both false, and null as possible values. It is generally a good practice to always use strict comparison to clearly distinguish between those two values.

$a = canBeFalseAndNull();

// Instead of
if ( ! $a) { }

// Better use one of the explicit versions:
if ($a !== null) { }
if ($a !== false) { }
if ($a !== null && $a !== false) { }
Loading history...
854
			&& !$systemConfig->getValue('maintenance', false)) {
855
			// For logged-in users: Load everything
856
			if(OC_User::isLoggedIn()) {
857
				OC_App::loadApps();
858
			} else {
859
				// For guests: Load only filesystem and logging
860
				OC_App::loadApps(array('filesystem', 'logging'));
861
				\OC_User::tryBasicAuthLogin();
862
			}
863
		}
864
865
		if (!self::$CLI and (!isset($_GET["logout"]) or ($_GET["logout"] !== 'true'))) {
866
			try {
867
				if (!$systemConfig->getValue('maintenance', false) && !self::checkUpgrade(false)) {
0 ignored issues
show
Bug Best Practice introduced by
The expression self::checkUpgrade(false) of type null|boolean is loosely compared to false; this is ambiguous if the boolean can be false. You might want to explicitly use !== null instead.

If an expression can have both false, and null as possible values. It is generally a good practice to always use strict comparison to clearly distinguish between those two values.

$a = canBeFalseAndNull();

// Instead of
if ( ! $a) { }

// Better use one of the explicit versions:
if ($a !== null) { }
if ($a !== false) { }
if ($a !== null && $a !== false) { }
Loading history...
868
					OC_App::loadApps(array('filesystem', 'logging'));
869
					OC_App::loadApps();
870
				}
871
				self::checkSingleUserMode();
872
				OC_Util::setupFS();
873
				OC::$server->getRouter()->match(\OC::$server->getRequest()->getRawPathInfo());
874
				return;
875
			} catch (Symfony\Component\Routing\Exception\ResourceNotFoundException $e) {
0 ignored issues
show
Bug introduced by
The class Symfony\Component\Routin...sourceNotFoundException does not exist. Did you forget a USE statement, or did you not list all dependencies?

Scrutinizer analyzes your composer.json/composer.lock file if available to determine the classes, and functions that are defined by your dependencies.

It seems like the listed class was neither found in your dependencies, nor was it found in the analyzed files in your repository. If you are using some other form of dependency management, you might want to disable this analysis.

Loading history...
876
				//header('HTTP/1.0 404 Not Found');
877
			} catch (Symfony\Component\Routing\Exception\MethodNotAllowedException $e) {
0 ignored issues
show
Bug introduced by
The class Symfony\Component\Routin...thodNotAllowedException does not exist. Did you forget a USE statement, or did you not list all dependencies?

Scrutinizer analyzes your composer.json/composer.lock file if available to determine the classes, and functions that are defined by your dependencies.

It seems like the listed class was neither found in your dependencies, nor was it found in the analyzed files in your repository. If you are using some other form of dependency management, you might want to disable this analysis.

Loading history...
878
				OC_Response::setStatus(405);
879
				return;
880
			}
881
		}
882
883
		// Handle redirect URL for logged in users
884
		if (isset($_REQUEST['redirect_url']) && OC_User::isLoggedIn()) {
885
			$location = \OC::$server->getURLGenerator()->getAbsoluteURL(urldecode($_REQUEST['redirect_url']));
886
887
			// Deny the redirect if the URL contains a @
888
			// This prevents unvalidated redirects like ?redirect_url=:[email protected]
889
			if (strpos($location, '@') === false) {
890
				header('Location: ' . $location);
891
				return;
892
			}
893
		}
894
		// Handle WebDAV
895
		if ($_SERVER['REQUEST_METHOD'] == 'PROPFIND') {
896
			// not allowed any more to prevent people
897
			// mounting this root directly.
898
			// Users need to mount remote.php/webdav instead.
899
			header('HTTP/1.1 405 Method Not Allowed');
900
			header('Status: 405 Method Not Allowed');
901
			return;
902
		}
903
904
		// Redirect to index if the logout link is accessed without valid session
905
		// this is needed to prevent "Token expired" messages while login if a session is expired
906
		// @see https://github.com/owncloud/core/pull/8443#issuecomment-42425583
907
		if(isset($_GET['logout']) && !OC_User::isLoggedIn()) {
908
			header("Location: " . \OC::$server->getURLGenerator()->getAbsoluteURL('/'));
909
			return;
910
		}
911
912
		// Someone is logged in
913
		if (OC_User::isLoggedIn()) {
914
			OC_App::loadApps();
915
			OC_User::setupBackends();
916
			OC_Util::setupFS();
917
			if (isset($_GET["logout"]) and ($_GET["logout"])) {
918
				OC_JSON::callCheck();
919
				if (isset($_COOKIE['oc_token'])) {
920
					\OC::$server->getConfig()->deleteUserValue(OC_User::getUser(), 'login_token', $_COOKIE['oc_token']);
921
				}
922
				OC_User::logout();
923
				// redirect to webroot and add slash if webroot is empty
924
				header("Location: " . \OC::$server->getURLGenerator()->getAbsoluteURL('/'));
925
			} else {
926
				// Redirect to default application
927
				OC_Util::redirectToDefaultPage();
928
			}
929
		} else {
930
			// Not handled and not logged in
931
			self::handleLogin();
932
		}
933
	}
934
935
	protected static function handleAuthHeaders() {
936
		//copy http auth headers for apache+php-fcgid work around
937
		if (isset($_SERVER['HTTP_XAUTHORIZATION']) && !isset($_SERVER['HTTP_AUTHORIZATION'])) {
938
			$_SERVER['HTTP_AUTHORIZATION'] = $_SERVER['HTTP_XAUTHORIZATION'];
939
		}
940
941
		// Extract PHP_AUTH_USER/PHP_AUTH_PW from other headers if necessary.
942
		$vars = array(
943
			'HTTP_AUTHORIZATION', // apache+php-cgi work around
944
			'REDIRECT_HTTP_AUTHORIZATION', // apache+php-cgi alternative
945
		);
946
		foreach ($vars as $var) {
947
			if (isset($_SERVER[$var]) && preg_match('/Basic\s+(.*)$/i', $_SERVER[$var], $matches)) {
948
				list($name, $password) = explode(':', base64_decode($matches[1]), 2);
949
				$_SERVER['PHP_AUTH_USER'] = $name;
950
				$_SERVER['PHP_AUTH_PW'] = $password;
951
				break;
952
			}
953
		}
954
	}
955
956
	protected static function handleLogin() {
957
		OC_App::loadApps(array('prelogin'));
958
		$error = array();
959
		$messages = [];
960
961
		try {
962
			// auth possible via apache module?
963
			if (OC::tryApacheAuth()) {
964
				$error[] = 'apacheauthfailed';
965
			} // remember was checked after last login
966
			elseif (OC::tryRememberLogin()) {
967
				$error[] = 'invalidcookie';
968
			} // logon via web form
969
			elseif (OC::tryFormLogin()) {
970
				$error[] = 'invalidpassword';
971
			}
972
		} catch (\OC\User\LoginException $e) {
973
			$messages[] = $e->getMessage();
974
		} catch (\Exception $ex) {
975
			\OCP\Util::logException('handleLogin', $ex);
976
			// do not disclose information. show generic error
977
			$error[] = 'internalexception';
978
		}
979
980
		OC_Util::displayLoginPage(array_unique($error), $messages);
981
	}
982
983
	/**
984
	 * Remove outdated and therefore invalid tokens for a user
985
	 * @param string $user
986
	 */
987
	protected static function cleanupLoginTokens($user) {
988
		$config = \OC::$server->getConfig();
989
		$cutoff = time() - $config->getSystemValue('remember_login_cookie_lifetime', 60 * 60 * 24 * 15);
990
		$tokens = $config->getUserKeys($user, 'login_token');
991
		foreach ($tokens as $token) {
992
			$time = $config->getUserValue($user, 'login_token', $token);
993
			if ($time < $cutoff) {
994
				$config->deleteUserValue($user, 'login_token', $token);
995
			}
996
		}
997
	}
998
999
	/**
1000
	 * Try to login a user via HTTP authentication
1001
	 * @return bool|void
1002
	 */
1003
	protected static function tryApacheAuth() {
1004
		$return = OC_User::handleApacheAuth();
1005
1006
		// if return is true we are logged in -> redirect to the default page
1007
		if ($return === true) {
1008
			$_REQUEST['redirect_url'] = \OC::$server->getRequest()->getRequestUri();
1009
			OC_Util::redirectToDefaultPage();
1010
			exit;
1011
		}
1012
1013
		// in case $return is null apache based auth is not enabled
1014
		return is_null($return) ? false : true;
1015
	}
1016
1017
	/**
1018
	 * Try to login a user using the remember me cookie.
1019
	 * @return bool Whether the provided cookie was valid
1020
	 */
1021
	protected static function tryRememberLogin() {
1022
		if (!isset($_COOKIE["oc_remember_login"])
1023
			|| !isset($_COOKIE["oc_token"])
1024
			|| !isset($_COOKIE["oc_username"])
1025
			|| !$_COOKIE["oc_remember_login"]
1026
			|| !OC_Util::rememberLoginAllowed()
1027
		) {
1028
			return false;
1029
		}
1030
1031
		if (\OC::$server->getConfig()->getSystemValue('debug', false)) {
1032
			\OCP\Util::writeLog('core', 'Trying to login from cookie', \OCP\Util::DEBUG);
1033
		}
1034
1035
		if(OC_User::userExists($_COOKIE['oc_username'])) {
1036
			self::cleanupLoginTokens($_COOKIE['oc_username']);
1037
			// verify whether the supplied "remember me" token was valid
1038
			$granted = OC_User::loginWithCookie(
1039
				$_COOKIE['oc_username'], $_COOKIE['oc_token']);
1040
			if($granted === true) {
1041
				OC_Util::redirectToDefaultPage();
1042
				// doesn't return
1043
			}
1044
			\OCP\Util::writeLog('core', 'Authentication cookie rejected for user ' .
1045
				$_COOKIE['oc_username'], \OCP\Util::WARN);
1046
			// if you reach this point you have changed your password
1047
			// or you are an attacker
1048
			// we can not delete tokens here because users may reach
1049
			// this point multiple times after a password change
1050
		}
1051
1052
		OC_User::unsetMagicInCookie();
1053
		return true;
1054
	}
1055
1056
	/**
1057
	 * Tries to login a user using the form based authentication
1058
	 * @return bool|void
1059
	 */
1060
	protected static function tryFormLogin() {
1061
		if (!isset($_POST["user"]) || !isset($_POST['password'])) {
1062
			return false;
1063
		}
1064
1065
		if(!(\OC::$server->getRequest()->passesCSRFCheck())) {
1066
			return false;
1067
		}
1068
		OC_App::loadApps();
1069
1070
		//setup extra user backends
1071
		OC_User::setupBackends();
1072
1073
		if (OC_User::login((string)$_POST["user"], (string)$_POST["password"])) {
1074
			$userId = OC_User::getUser();
1075
1076
			// setting up the time zone
1077
			if (isset($_POST['timezone-offset'])) {
1078
				self::$server->getSession()->set('timezone', (string)$_POST['timezone-offset']);
1079
				self::$server->getConfig()->setUserValue($userId, 'core', 'timezone', (string)$_POST['timezone']);
1080
			}
1081
1082
			self::cleanupLoginTokens($userId);
1083
			if (!empty($_POST["remember_login"])) {
1084
				$config = self::$server->getConfig();
1085
				if ($config->getSystemValue('debug', false)) {
1086
					self::$server->getLogger()->debug('Setting remember login to cookie', array('app' => 'core'));
1087
				}
1088
				$token = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(32);
1089
				$config->setUserValue($userId, 'login_token', $token, time());
1090
				OC_User::setMagicInCookie($userId, $token);
1091
			} else {
1092
				OC_User::unsetMagicInCookie();
1093
			}
1094
			OC_Util::redirectToDefaultPage();
1095
			exit();
1096
		}
1097
		return true;
1098
	}
1099
1100
}
1101
1102
1103
OC::init();
1104