Blame view

sources/lib/base.php 32.5 KB
03e52840d   Kload   Init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
  <?php
  /**
   * ownCloud
   *
   * @author Frank Karlitschek
   * @copyright 2012 Frank Karlitschek frank@owncloud.org
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
   * License as published by the Free Software Foundation; either
   * version 3 of the License, or any later version.
   *
   * This library is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
   *
   * You should have received a copy of the GNU Affero General Public
   * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
   *
   */
  
  require_once 'public/constants.php';
  
  /**
   * Class that is a namespace for all global OC variables
   * No, we can not put this class in its own file because it is used by
   * OC_autoload!
   */
  class OC {
  	/**
  	 * Associative array for autoloading. classname => filename
  	 */
  	public static $CLASSPATH = array();
  	/**
  	 * The installation path for owncloud on the server (e.g. /srv/http/owncloud)
  	 */
  	public static $SERVERROOT = '';
  	/**
  	 * the current request path relative to the owncloud root (e.g. files/index.php)
  	 */
  	private static $SUBURI = '';
  	/**
  	 * the owncloud root path for http requests (e.g. owncloud/)
  	 */
  	public static $WEBROOT = '';
  	/**
  	 * The installation path of the 3rdparty folder on the server (e.g. /srv/http/owncloud/3rdparty)
  	 */
  	public static $THIRDPARTYROOT = '';
  	/**
  	 * the root path of the 3rdparty folder for http requests (e.g. owncloud/3rdparty)
  	 */
  	public static $THIRDPARTYWEBROOT = '';
  	/**
  	 * The installation path array of the apps folder on the server (e.g. /srv/http/owncloud) 'path' and
  	 * web path in 'url'
  	 */
  	public static $APPSROOTS = array();
6d9380f96   Cédric Dupont   Update sources OC...
60
61
62
63
  
  	public static $configDir;
  
  	/**
03e52840d   Kload   Init
64
65
66
  	 * requested app
  	 */
  	public static $REQUESTEDAPP = '';
6d9380f96   Cédric Dupont   Update sources OC...
67

03e52840d   Kload   Init
68
69
70
71
  	/**
  	 * check if owncloud runs in cli mode
  	 */
  	public static $CLI = false;
31b7f2792   Kload   Upgrade to ownclo...
72
73
  
  	/**
31b7f2792   Kload   Upgrade to ownclo...
74
  	 * @var \OC\Session\Session
03e52840d   Kload   Init
75
  	 */
31b7f2792   Kload   Upgrade to ownclo...
76
  	public static $session = null;
03e52840d   Kload   Init
77

31b7f2792   Kload   Upgrade to ownclo...
78
79
80
81
82
83
84
85
86
  	/**
  	 * @var \OC\Autoloader $loader
  	 */
  	public static $loader = null;
  
  	/**
  	 * @var \OC\Server
  	 */
  	public static $server = null;
03e52840d   Kload   Init
87
88
89
90
91
92
93
94
  
  	public static function initPaths() {
  		// calculate the root directories
  		OC::$SERVERROOT = str_replace("\\", '/', substr(__DIR__, 0, -4));
  
  		// ensure we can find OC_Config
  		set_include_path(
  			OC::$SERVERROOT . '/lib' . PATH_SEPARATOR .
31b7f2792   Kload   Upgrade to ownclo...
95
  			get_include_path()
03e52840d   Kload   Init
96
  		);
6d9380f96   Cédric Dupont   Update sources OC...
97
98
99
100
101
102
103
104
  		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/')) {
  			self::$configDir = OC::$SERVERROOT . '/tests/config/';
  		} else {
  			self::$configDir = OC::$SERVERROOT . '/config/';
  		}
  		OC_Config::$object = new \OC\Config(self::$configDir);
03e52840d   Kload   Init
105
106
107
108
109
110
111
112
113
114
115
116
  		OC::$SUBURI = str_replace("\\", "/", substr(realpath($_SERVER["SCRIPT_FILENAME"]), strlen(OC::$SERVERROOT)));
  		$scriptName = OC_Request::scriptName();
  		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';
  			}
  		}
6d9380f96   Cédric Dupont   Update sources OC...
117
118
  		if (substr($scriptName, 0 - strlen(OC::$SUBURI)) === OC::$SUBURI) {
  			OC::$WEBROOT = substr($scriptName, 0, 0 - strlen(OC::$SUBURI));
03e52840d   Kload   Init
119

6d9380f96   Cédric Dupont   Update sources OC...
120
121
122
123
124
125
126
127
128
  			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.
  			OC::$WEBROOT = OC_Config::getValue('overwritewebroot', '');
03e52840d   Kload   Init
129
130
131
132
133
134
135
136
137
138
139
140
141
  		}
  
  		// search the 3rdparty folder
  		if (OC_Config::getValue('3rdpartyroot', '') <> '' and OC_Config::getValue('3rdpartyurl', '') <> '') {
  			OC::$THIRDPARTYROOT = OC_Config::getValue('3rdpartyroot', '');
  			OC::$THIRDPARTYWEBROOT = OC_Config::getValue('3rdpartyurl', '');
  		} elseif (file_exists(OC::$SERVERROOT . '/3rdparty')) {
  			OC::$THIRDPARTYROOT = OC::$SERVERROOT;
  			OC::$THIRDPARTYWEBROOT = OC::$WEBROOT;
  		} elseif (file_exists(OC::$SERVERROOT . '/../3rdparty')) {
  			OC::$THIRDPARTYWEBROOT = rtrim(dirname(OC::$WEBROOT), '/');
  			OC::$THIRDPARTYROOT = rtrim(dirname(OC::$SERVERROOT), '/');
  		} else {
31b7f2792   Kload   Upgrade to ownclo...
142
  			throw new Exception('3rdparty directory not found! Please put the ownCloud 3rdparty'
a293d369c   Kload   Update sources to...
143
144
  				. ' folder in the ownCloud folder or the folder above.'
  				. ' You can also configure the location in the config.php file.');
03e52840d   Kload   Init
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
  		}
  		// search the apps folder
  		$config_paths = OC_Config::getValue('apps_paths', array());
  		if (!empty($config_paths)) {
  			foreach ($config_paths as $paths) {
  				if (isset($paths['url']) && isset($paths['path'])) {
  					$paths['url'] = rtrim($paths['url'], '/');
  					$paths['path'] = rtrim($paths['path'], '/');
  					OC::$APPSROOTS[] = $paths;
  				}
  			}
  		} elseif (file_exists(OC::$SERVERROOT . '/apps')) {
  			OC::$APPSROOTS[] = array('path' => OC::$SERVERROOT . '/apps', 'url' => '/apps', 'writable' => true);
  		} elseif (file_exists(OC::$SERVERROOT . '/../apps')) {
  			OC::$APPSROOTS[] = array(
  				'path' => rtrim(dirname(OC::$SERVERROOT), '/') . '/apps',
  				'url' => '/apps',
  				'writable' => true
  			);
  		}
  
  		if (empty(OC::$APPSROOTS)) {
31b7f2792   Kload   Upgrade to ownclo...
167
  			throw new Exception('apps directory not found! Please put the ownCloud apps folder in the ownCloud folder'
a293d369c   Kload   Update sources to...
168
  				. ' or the folder above. You can also configure the location in the config.php file.');
03e52840d   Kload   Init
169
170
171
172
173
174
175
176
  		}
  		$paths = array();
  		foreach (OC::$APPSROOTS as $path) {
  			$paths[] = $path['path'];
  		}
  
  		// set the right include path
  		set_include_path(
31b7f2792   Kload   Upgrade to ownclo...
177
178
179
  			OC::$SERVERROOT . '/lib/private' . PATH_SEPARATOR .
  			OC::$SERVERROOT . '/config' . PATH_SEPARATOR .
  			OC::$THIRDPARTYROOT . '/3rdparty' . PATH_SEPARATOR .
6d9380f96   Cédric Dupont   Update sources OC...
180
  			implode(PATH_SEPARATOR, $paths) . PATH_SEPARATOR .
31b7f2792   Kload   Upgrade to ownclo...
181
182
  			get_include_path() . PATH_SEPARATOR .
  			OC::$SERVERROOT
03e52840d   Kload   Init
183
184
185
186
  		);
  	}
  
  	public static function checkConfig() {
6d9380f96   Cédric Dupont   Update sources OC...
187
188
189
  		$l = OC_L10N::get('lib');
  		if (file_exists(self::$configDir . "/config.php")
  			and !is_writable(self::$configDir . "/config.php")
a293d369c   Kload   Update sources to...
190
  		) {
31b7f2792   Kload   Upgrade to ownclo...
191
  			if (self::$CLI) {
6d9380f96   Cédric Dupont   Update sources OC...
192
193
194
195
  				echo $l->t('Cannot write into "config" directory!')."
  ";
  				echo $l->t('This can usually be fixed by giving the webserver write access to the config directory')."
  ";
31b7f2792   Kload   Upgrade to ownclo...
196
197
  				echo "
  ";
6d9380f96   Cédric Dupont   Update sources OC...
198
199
  				echo $l->t('See %s', array(\OC_Helper::linkToDocs('admin-dir_permissions')))."
  ";
31b7f2792   Kload   Upgrade to ownclo...
200
201
202
  				exit;
  			} else {
  				OC_Template::printErrorPage(
6d9380f96   Cédric Dupont   Update sources OC...
203
204
205
206
  					$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.',
  					 array('<a href="'.\OC_Helper::linkToDocs('admin-dir_permissions').'" target="_blank">', '</a>'))
31b7f2792   Kload   Upgrade to ownclo...
207
208
  				);
  			}
03e52840d   Kload   Init
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
  		}
  	}
  
  	public static function checkInstalled() {
  		// Redirect to installer if not installed
  		if (!OC_Config::getValue('installed', false) && OC::$SUBURI != '/index.php') {
  			if (!OC::$CLI) {
  				$url = 'http://' . $_SERVER['SERVER_NAME'] . OC::$WEBROOT . '/index.php';
  				header("Location: $url");
  			}
  			exit();
  		}
  	}
  
  	public static function checkSSL() {
  		// redirect to https site if configured
  		if (OC_Config::getValue("forcessl", false)) {
  			header('Strict-Transport-Security: max-age=31536000');
  			ini_set("session.cookie_secure", "on");
  			if (OC_Request::serverProtocol() <> 'https' and !OC::$CLI) {
  				$url = "https://" . OC_Request::serverHost() . OC_Request::requestUri();
  				header("Location: $url");
  				exit();
  			}
  		} else {
  			// Invalidate HSTS headers
  			if (OC_Request::serverProtocol() === 'https') {
  				header('Strict-Transport-Security: max-age=0');
  			}
  		}
  	}
  
  	public static function checkMaintenanceMode() {
  		// Allow ajax update script to execute without being stopped
  		if (OC_Config::getValue('maintenance', false) && OC::$SUBURI != '/core/ajax/update.php') {
  			// send http status 503
  			header('HTTP/1.1 503 Service Temporarily Unavailable');
  			header('Status: 503 Service Temporarily Unavailable');
  			header('Retry-After: 120');
  
  			// render error page
31b7f2792   Kload   Upgrade to ownclo...
250
  			$tmpl = new OC_Template('', 'update.user', 'guest');
03e52840d   Kload   Init
251
  			$tmpl->printPage();
31b7f2792   Kload   Upgrade to ownclo...
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
  			die();
  		}
  	}
  
  	public static function checkSingleUserMode() {
  		$user = OC_User::getUserSession()->getUser();
  		$group = OC_Group::getManager()->get('admin');
  		if ($user && OC_Config::getValue('singleuser', false) && !$group->inGroup($user)) {
  			// 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
  			$tmpl = new OC_Template('', 'singleuser.user', 'guest');
  			$tmpl->printPage();
  			die();
03e52840d   Kload   Init
269
270
  		}
  	}
a293d369c   Kload   Update sources to...
271
272
273
274
  	/**
  	 * check if the instance needs to preform an upgrade
  	 *
  	 * @return bool
6d9380f96   Cédric Dupont   Update sources OC...
275
  	 * @deprecated use \OCP\Util::needUpgrade instead
a293d369c   Kload   Update sources to...
276
277
  	 */
  	public static function needUpgrade() {
6d9380f96   Cédric Dupont   Update sources OC...
278
  		return \OCP\Util::needUpgrade();
03e52840d   Kload   Init
279
  	}
6d9380f96   Cédric Dupont   Update sources OC...
280
281
282
283
284
  	/**
  	 * Checks if the version requires an update and shows
  	 * @param bool $showTemplate Whether an update screen should get shown
  	 * @return bool|void
  	 */
a293d369c   Kload   Update sources to...
285
  	public static function checkUpgrade($showTemplate = true) {
6d9380f96   Cédric Dupont   Update sources OC...
286
  		if (\OCP\Util::needUpgrade()) {
a293d369c   Kload   Update sources to...
287
  			if ($showTemplate && !OC_Config::getValue('maintenance', false)) {
6d9380f96   Cédric Dupont   Update sources OC...
288
289
  				$version = OC_Util::getVersion();
  				$oldTheme = OC_Config::getValue('theme');
a293d369c   Kload   Update sources to...
290
  				OC_Config::setValue('theme', '');
a293d369c   Kload   Update sources to...
291
292
293
294
  				OC_Util::addScript('config'); // needed for web root
  				OC_Util::addScript('update');
  				$tmpl = new OC_Template('', 'update.admin', 'guest');
  				$tmpl->assign('version', OC_Util::getVersionString());
6d9380f96   Cédric Dupont   Update sources OC...
295
296
297
298
299
300
301
302
303
304
305
306
307
  
  				// get third party apps
  				$apps = OC_App::getEnabledApps();
  				$incompatibleApps = array();
  				foreach ($apps as $appId) {
  					$info = OC_App::getAppInfo($appId);
  					if(!OC_App::isAppCompatible($version, $info)) {
  						$incompatibleApps[] = $info;
  					}
  				}
  				$tmpl->assign('appList', $incompatibleApps);
  				$tmpl->assign('productName', 'ownCloud'); // for now
  				$tmpl->assign('oldTheme', $oldTheme);
a293d369c   Kload   Update sources to...
308
309
310
311
312
313
314
315
  				$tmpl->printPage();
  				exit();
  			} else {
  				return true;
  			}
  		}
  		return false;
  	}
03e52840d   Kload   Init
316
317
  	public static function initTemplateEngine() {
  		// Add the stuff we need always
6d9380f96   Cédric Dupont   Update sources OC...
318
  		// TODO: read from core/js/core.json
31b7f2792   Kload   Upgrade to ownclo...
319
320
  		OC_Util::addScript("jquery-1.10.0.min");
  		OC_Util::addScript("jquery-migrate-1.2.1.min");
03e52840d   Kload   Init
321
322
  		OC_Util::addScript("jquery-ui-1.10.0.custom");
  		OC_Util::addScript("jquery-showpassword");
6d9380f96   Cédric Dupont   Update sources OC...
323
  		OC_Util::addScript("placeholders");
03e52840d   Kload   Init
324
325
  		OC_Util::addScript("jquery-tipsy");
  		OC_Util::addScript("compatibility");
6d9380f96   Cédric Dupont   Update sources OC...
326
  		OC_Util::addScript("underscore");
31b7f2792   Kload   Upgrade to ownclo...
327
  		OC_Util::addScript("jquery.ocdialog");
03e52840d   Kload   Init
328
329
  		OC_Util::addScript("oc-dialogs");
  		OC_Util::addScript("js");
31b7f2792   Kload   Upgrade to ownclo...
330
  		OC_Util::addScript("octemplate");
03e52840d   Kload   Init
331
332
333
334
  		OC_Util::addScript("eventsource");
  		OC_Util::addScript("config");
  		//OC_Util::addScript( "multiselect" );
  		OC_Util::addScript('search', 'result');
31b7f2792   Kload   Upgrade to ownclo...
335
  		OC_Util::addScript("oc-requesttoken");
6d9380f96   Cédric Dupont   Update sources OC...
336
337
  		OC_Util::addScript("apps");
  		OC_Util::addScript("snap");
31b7f2792   Kload   Upgrade to ownclo...
338
339
340
341
342
343
344
345
  
  		// avatars
  		if (\OC_Config::getValue('enable_avatars', true) === true) {
  			\OC_Util::addScript('placeholder');
  			\OC_Util::addScript('3rdparty', 'md5/md5.min');
  			\OC_Util::addScript('jquery.avatar');
  			\OC_Util::addScript('avatar');
  		}
03e52840d   Kload   Init
346
347
  
  		OC_Util::addStyle("styles");
6d9380f96   Cédric Dupont   Update sources OC...
348
349
  		OC_Util::addStyle("header");
  		OC_Util::addStyle("mobile");
a293d369c   Kload   Update sources to...
350
  		OC_Util::addStyle("icons");
6d9380f96   Cédric Dupont   Update sources OC...
351
  		OC_Util::addStyle("fonts");
31b7f2792   Kload   Upgrade to ownclo...
352
353
  		OC_Util::addStyle("apps");
  		OC_Util::addStyle("fixes");
03e52840d   Kload   Init
354
355
356
  		OC_Util::addStyle("multiselect");
  		OC_Util::addStyle("jquery-ui-1.10.0.custom");
  		OC_Util::addStyle("jquery-tipsy");
31b7f2792   Kload   Upgrade to ownclo...
357
  		OC_Util::addStyle("jquery.ocdialog");
03e52840d   Kload   Init
358
359
360
361
362
  	}
  
  	public static function initSession() {
  		// prevents javascript from accessing php session cookies
  		ini_set('session.cookie_httponly', '1;');
31b7f2792   Kload   Upgrade to ownclo...
363
364
365
  		// set the cookie path to the ownCloud directory
  		$cookie_path = OC::$WEBROOT ? : '/';
  		ini_set('session.cookie_path', $cookie_path);
03e52840d   Kload   Init
366

31b7f2792   Kload   Upgrade to ownclo...
367
368
  		//set the session object to a dummy session so code relying on the session existing still works
  		self::$session = new \OC\Session\Memory('');
03e52840d   Kload   Init
369

6d9380f96   Cédric Dupont   Update sources OC...
370
371
  		// Let the session name be changed in the initSession Hook
  		$sessionName = OC_Util::getInstanceId();
31b7f2792   Kload   Upgrade to ownclo...
372
  		try {
6d9380f96   Cédric Dupont   Update sources OC...
373
374
375
376
377
378
379
  			// Allow session apps to create a custom session object
  			$useCustomSession = false;
  			OC_Hook::emit('OC', 'initSession', array('session' => &self::$session, 'sessionName' => &$sessionName, 'useCustomSession' => &$useCustomSession));
  			if(!$useCustomSession) {
  				// set the session name to the instance id - which is unique
  				self::$session = new \OC\Session\Internal($sessionName);
  			}
31b7f2792   Kload   Upgrade to ownclo...
380
381
382
383
384
  			// if session cant be started break with http 500 error
  		} catch (Exception $e) {
  			//show the user a detailed error page
  			OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
  			OC_Template::printExceptionErrorPage($e);
03e52840d   Kload   Init
385
386
387
388
  		}
  
  		$sessionLifeTime = self::getSessionLifeTime();
  		// regenerate session id periodically to avoid session fixation
31b7f2792   Kload   Upgrade to ownclo...
389
390
391
  		if (!self::$session->exists('SID_CREATED')) {
  			self::$session->set('SID_CREATED', time());
  		} else if (time() - self::$session->get('SID_CREATED') > $sessionLifeTime / 2) {
03e52840d   Kload   Init
392
  			session_regenerate_id(true);
31b7f2792   Kload   Upgrade to ownclo...
393
  			self::$session->set('SID_CREATED', time());
03e52840d   Kload   Init
394
395
396
  		}
  
  		// session timeout
31b7f2792   Kload   Upgrade to ownclo...
397
  		if (self::$session->exists('LAST_ACTIVITY') && (time() - self::$session->get('LAST_ACTIVITY') > $sessionLifeTime)) {
03e52840d   Kload   Init
398
  			if (isset($_COOKIE[session_name()])) {
31b7f2792   Kload   Upgrade to ownclo...
399
  				setcookie(session_name(), '', time() - 42000, $cookie_path);
03e52840d   Kload   Init
400
401
402
403
404
  			}
  			session_unset();
  			session_destroy();
  			session_start();
  		}
31b7f2792   Kload   Upgrade to ownclo...
405
406
  
  		self::$session->set('LAST_ACTIVITY', time());
03e52840d   Kload   Init
407
408
409
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
410
  	 * @return string
03e52840d   Kload   Init
411
412
413
414
  	 */
  	private static function getSessionLifeTime() {
  		return OC_Config::getValue('session_lifetime', 60 * 60 * 24);
  	}
03e52840d   Kload   Init
415
416
417
418
419
420
421
422
423
424
425
426
  	public static function loadAppClassPaths() {
  		foreach (OC_APP::getEnabledApps() as $app) {
  			$file = OC_App::getAppPath($app) . '/appinfo/classpath.php';
  			if (file_exists($file)) {
  				require_once $file;
  			}
  		}
  	}
  
  
  	public static function init() {
  		// register autoloader
31b7f2792   Kload   Upgrade to ownclo...
427
428
429
430
431
432
  		require_once __DIR__ . '/autoloader.php';
  		self::$loader = new \OC\Autoloader();
  		self::$loader->registerPrefix('Doctrine\\Common', 'doctrine/common/lib');
  		self::$loader->registerPrefix('Doctrine\\DBAL', 'doctrine/dbal/lib');
  		self::$loader->registerPrefix('Symfony\\Component\\Routing', 'symfony/routing');
  		self::$loader->registerPrefix('Symfony\\Component\\Console', 'symfony/console');
31b7f2792   Kload   Upgrade to ownclo...
433
  		self::$loader->registerPrefix('Patchwork', '3rdparty');
6d9380f96   Cédric Dupont   Update sources OC...
434
  		self::$loader->registerPrefix('Pimple', '3rdparty/Pimple');
31b7f2792   Kload   Upgrade to ownclo...
435
  		spl_autoload_register(array(self::$loader, 'load'));
03e52840d   Kload   Init
436

6d9380f96   Cédric Dupont   Update sources OC...
437
438
  		// make a dummy session available as early as possible since error pages need it
  		self::$session = new \OC\Session\Memory('');
03e52840d   Kload   Init
439
440
441
442
443
444
445
446
447
448
449
450
  		// set some stuff
  		//ob_start();
  		error_reporting(E_ALL | E_STRICT);
  		if (defined('DEBUG') && DEBUG) {
  			ini_set('display_errors', 1);
  		}
  		self::$CLI = (php_sapi_name() == 'cli');
  
  		date_default_timezone_set('UTC');
  		ini_set('arg_separator.output', '&amp;');
  
  		// try to switch magic quotes off.
31b7f2792   Kload   Upgrade to ownclo...
451
  		if (get_magic_quotes_gpc() == 1) {
03e52840d   Kload   Init
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
  			ini_set('magic_quotes_runtime', 0);
  		}
  
  		//try to configure php to enable big file uploads.
  		//this doesn´t work always depending on the webserver and php configuration.
  		//Let´s try to overwrite some defaults anyways
  
  		//try to set the maximum execution time to 60min
  		@set_time_limit(3600);
  		@ini_set('max_execution_time', 3600);
  		@ini_set('max_input_time', 3600);
  
  		//try to set the maximum filesize to 10G
  		@ini_set('upload_max_filesize', '10G');
  		@ini_set('post_max_size', '10G');
  		@ini_set('file_uploads', '50');
6d9380f96   Cédric Dupont   Update sources OC...
468
  		self::handleAuthHeaders();
03e52840d   Kload   Init
469
470
  
  		self::initPaths();
31b7f2792   Kload   Upgrade to ownclo...
471
472
473
474
475
  		if (OC_Config::getValue('instanceid', false)) {
  			// \OC\Memcache\Cache has a hidden dependency on
  			// OC_Util::getInstanceId() for namespacing. See #5409.
  			try {
  				self::$loader->setMemoryCache(\OC\Memcache\Factory::createLowLatency('Autoloader'));
a293d369c   Kload   Update sources to...
476
  			} catch (\Exception $ex) {
31b7f2792   Kload   Upgrade to ownclo...
477
478
479
  			}
  		}
  		OC_Util::isSetLocaleWorking();
03e52840d   Kload   Init
480

6d9380f96   Cédric Dupont   Update sources OC...
481
482
483
484
485
  		// setup 3rdparty autoloader
  		$vendorAutoLoad = OC::$THIRDPARTYROOT . '/3rdparty/autoload.php';
  		if (file_exists($vendorAutoLoad)) {
  			require_once $vendorAutoLoad;
  		}
03e52840d   Kload   Init
486
487
488
489
490
491
  		// set debug mode if an xdebug session is active
  		if (!defined('DEBUG') || !DEBUG) {
  			if (isset($_COOKIE['XDEBUG_SESSION'])) {
  				define('DEBUG', true);
  			}
  		}
31b7f2792   Kload   Upgrade to ownclo...
492
  		if (!defined('PHPUNIT_RUN')) {
6d9380f96   Cédric Dupont   Update sources OC...
493
  			OC\Log\ErrorHandler::setLogger(OC_Log::$object);
31b7f2792   Kload   Upgrade to ownclo...
494
  			if (defined('DEBUG') and DEBUG) {
a293d369c   Kload   Update sources to...
495
  				OC\Log\ErrorHandler::register(true);
31b7f2792   Kload   Upgrade to ownclo...
496
497
498
  				set_exception_handler(array('OC_Template', 'printExceptionErrorPage'));
  			} else {
  				OC\Log\ErrorHandler::register();
31b7f2792   Kload   Upgrade to ownclo...
499
  			}
03e52840d   Kload   Init
500
501
502
503
504
505
  		}
  
  		// register the stream wrappers
  		stream_wrapper_register('fakedir', 'OC\Files\Stream\Dir');
  		stream_wrapper_register('static', 'OC\Files\Stream\StaticStream');
  		stream_wrapper_register('close', 'OC\Files\Stream\Close');
31b7f2792   Kload   Upgrade to ownclo...
506
  		stream_wrapper_register('quota', 'OC\Files\Stream\Quota');
03e52840d   Kload   Init
507
  		stream_wrapper_register('oc', 'OC\Files\Stream\OC');
31b7f2792   Kload   Upgrade to ownclo...
508
509
  		// setup the basic server
  		self::$server = new \OC\Server();
03e52840d   Kload   Init
510
  		self::initTemplateEngine();
6d9380f96   Cédric Dupont   Update sources OC...
511
  		OC_App::loadApps(array('session'));
31b7f2792   Kload   Upgrade to ownclo...
512
513
514
515
516
  		if (!self::$CLI) {
  			self::initSession();
  		} else {
  			self::$session = new \OC\Session\Memory('');
  		}
03e52840d   Kload   Init
517
518
519
  		self::checkConfig();
  		self::checkInstalled();
  		self::checkSSL();
6d9380f96   Cédric Dupont   Update sources OC...
520
  		OC_Response::addSecurityHeaders();
03e52840d   Kload   Init
521
522
523
  
  		$errors = OC_Util::checkServer();
  		if (count($errors) > 0) {
31b7f2792   Kload   Upgrade to ownclo...
524
525
  			if (self::$CLI) {
  				foreach ($errors as $error) {
a293d369c   Kload   Update sources to...
526
527
  					echo $error['error'] . "
  ";
31b7f2792   Kload   Upgrade to ownclo...
528
529
530
531
532
  					echo $error['hint'] . "
  
  ";
  				}
  			} else {
837968727   Kload   [enh] Upgrade to ...
533
  				OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
31b7f2792   Kload   Upgrade to ownclo...
534
535
  				OC_Template::printGuestPage('', 'error', array('errors' => $errors));
  			}
03e52840d   Kload   Init
536
537
538
539
540
541
542
543
544
  			exit;
  		}
  
  		//try to set the session lifetime
  		$sessionLifeTime = self::getSessionLifeTime();
  		@ini_set('gc_maxlifetime', (string)$sessionLifeTime);
  
  		// User and Groups
  		if (!OC_Config::getValue("installed", false)) {
31b7f2792   Kload   Upgrade to ownclo...
545
  			self::$session->set('user_id', '');
03e52840d   Kload   Init
546
547
548
549
  		}
  
  		OC_User::useBackend(new OC_User_Database());
  		OC_Group::useBackend(new OC_Group_Database());
03e52840d   Kload   Init
550
551
552
553
554
  		//setup extra user backends
  		OC_User::setupBackends();
  
  		self::registerCacheHooks();
  		self::registerFilesystemHooks();
31b7f2792   Kload   Upgrade to ownclo...
555
  		self::registerPreviewHooks();
03e52840d   Kload   Init
556
  		self::registerShareHooks();
31b7f2792   Kload   Upgrade to ownclo...
557
  		self::registerLogRotate();
6d9380f96   Cédric Dupont   Update sources OC...
558
  		self::registerLocalAddressBook();
03e52840d   Kload   Init
559
560
561
  
  		//make sure temporary files are cleaned up
  		register_shutdown_function(array('OC_Helper', 'cleanTmp'));
03e52840d   Kload   Init
562
563
564
565
566
567
  		if (OC_Config::getValue('installed', false) && !self::checkUpgrade(false)) {
  			if (OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') {
  				OC_Util::addScript('backgroundjobs');
  			}
  		}
  	}
6d9380f96   Cédric Dupont   Update sources OC...
568
569
570
571
572
573
574
  	private static function registerLocalAddressBook() {
  		self::$server->getContactsManager()->register(function() {
  			$userManager = \OC::$server->getUserManager();
  			\OC::$server->getContactsManager()->registerAddressBook(
  				new \OC\Contacts\LocalAddressBook($userManager));
  		});
  	}
03e52840d   Kload   Init
575
576
577
578
  	/**
  	 * register hooks for the cache
  	 */
  	public static function registerCacheHooks() {
6d9380f96   Cédric Dupont   Update sources OC...
579
  		if (OC_Config::getValue('installed', false) && !\OCP\Util::needUpgrade()) { //don't try to do this before we are properly setup
a293d369c   Kload   Update sources to...
580
  			\OCP\BackgroundJob::registerJob('OC\Cache\FileGlobalGC');
31b7f2792   Kload   Upgrade to ownclo...
581

31b7f2792   Kload   Upgrade to ownclo...
582
583
584
585
586
587
588
589
590
591
  			// NOTE: This will be replaced to use OCP
  			$userSession = \OC_User::getUserSession();
  			$userSession->listen('postLogin', '\OC\Cache\File', 'loginListener');
  		}
  	}
  
  	/**
  	 * register hooks for the cache
  	 */
  	public static function registerLogRotate() {
6d9380f96   Cédric Dupont   Update sources OC...
592
  		if (OC_Config::getValue('installed', false) && OC_Config::getValue('log_rotate_size', false) && !\OCP\Util::needUpgrade()) {
31b7f2792   Kload   Upgrade to ownclo...
593
  			//don't try to do this before we are properly setup
6d9380f96   Cédric Dupont   Update sources OC...
594
595
  			//use custom logfile path if defined, otherwise use default of owncloud.log in data directory
  			\OCP\BackgroundJob::registerJob('OC\Log\Rotate', OC_Config::getValue('logfile', OC_Config::getValue("datadirectory", OC::$SERVERROOT . '/data') . '/owncloud.log'));
31b7f2792   Kload   Upgrade to ownclo...
596
  		}
03e52840d   Kload   Init
597
598
599
600
601
602
603
  	}
  
  	/**
  	 * register hooks for the filesystem
  	 */
  	public static function registerFilesystemHooks() {
  		// Check for blacklisted files
6d9380f96   Cédric Dupont   Update sources OC...
604
605
  		OC_Hook::connect('OC_Filesystem', 'write', 'OC\Files\Filesystem', 'isBlacklisted');
  		OC_Hook::connect('OC_Filesystem', 'rename', 'OC\Files\Filesystem', 'isBlacklisted');
03e52840d   Kload   Init
606
607
608
  	}
  
  	/**
31b7f2792   Kload   Upgrade to ownclo...
609
610
611
612
  	 * register hooks for previews
  	 */
  	public static function registerPreviewHooks() {
  		OC_Hook::connect('OC_Filesystem', 'post_write', 'OC\Preview', 'post_write');
6d9380f96   Cédric Dupont   Update sources OC...
613
614
615
616
  		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');
31b7f2792   Kload   Upgrade to ownclo...
617
618
619
620
621
  		OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete');
  		OC_Hook::connect('\OCP\Trashbin', 'delete', 'OC\Preview', 'post_delete');
  	}
  
  	/**
03e52840d   Kload   Init
622
623
624
  	 * register hooks for sharing
  	 */
  	public static function registerShareHooks() {
a293d369c   Kload   Update sources to...
625
  		if (\OC_Config::getValue('installed')) {
6d9380f96   Cédric Dupont   Update sources OC...
626
627
628
629
  			OC_Hook::connect('OC_User', 'post_deleteUser', 'OC\Share\Hooks', 'post_deleteUser');
  			OC_Hook::connect('OC_User', 'post_addToGroup', 'OC\Share\Hooks', 'post_addToGroup');
  			OC_Hook::connect('OC_User', 'post_removeFromGroup', 'OC\Share\Hooks', 'post_removeFromGroup');
  			OC_Hook::connect('OC_User', 'post_deleteGroup', 'OC\Share\Hooks', 'post_deleteGroup');
03e52840d   Kload   Init
630
631
632
633
  		}
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
634
  	 * Handle the request
03e52840d   Kload   Init
635
636
  	 */
  	public static function handleRequest() {
6d9380f96   Cédric Dupont   Update sources OC...
637
  		$l = \OC_L10N::get('lib');
03e52840d   Kload   Init
638
639
640
641
642
643
  		// load all the classpaths from the enabled apps so they are available
  		// in the routing files of each app
  		OC::loadAppClassPaths();
  
  		// Check if ownCloud is installed or in maintenance (update) mode
  		if (!OC_Config::getValue('installed', false)) {
6d9380f96   Cédric Dupont   Update sources OC...
644
645
  			$controller = new OC\Core\Setup\Controller();
  			$controller->run($_POST);
03e52840d   Kload   Init
646
647
  			exit();
  		}
837968727   Kload   [enh] Upgrade to ...
648
649
650
651
652
653
654
655
656
657
  		$host = OC_Request::insecureServerHost();
  		// if the host passed in headers isn't trusted
  		if (!OC::$CLI
  			// overwritehost is always trusted
  			&& OC_Request::getOverwriteHost() === null
  			&& !OC_Request::isTrustedDomain($host)) {
  
  			header('HTTP/1.1 400 Bad Request');
  			header('Status: 400 Bad Request');
  			OC_Template::printErrorPage(
6d9380f96   Cédric Dupont   Update sources OC...
658
659
  				$l->t('You are accessing the server from an untrusted domain.'),
  				$l->t('Please contact your administrator. If you are an administrator of this instance, configure the "trusted_domain" setting in config/config.php. An example configuration is provided in config/config.sample.php.')
837968727   Kload   [enh] Upgrade to ...
660
661
662
  			);
  			return;
  		}
03e52840d   Kload   Init
663
  		$request = OC_Request::getPathInfo();
a293d369c   Kload   Update sources to...
664
  		if (substr($request, -3) !== '.js') { // we need these files during the upgrade
03e52840d   Kload   Init
665
666
667
  			self::checkMaintenanceMode();
  			self::checkUpgrade();
  		}
6d9380f96   Cédric Dupont   Update sources OC...
668
669
670
671
  		if (!OC_User::isLoggedIn()) {
  			// Test it the user is already authenticated using Apaches AuthType Basic... very usable in combination with LDAP
  			OC::tryBasicAuthLogin();
  		}
03e52840d   Kload   Init
672

31b7f2792   Kload   Upgrade to ownclo...
673
  		if (!self::$CLI and (!isset($_GET["logout"]) or ($_GET["logout"] !== 'true'))) {
03e52840d   Kload   Init
674
  			try {
6d9380f96   Cédric Dupont   Update sources OC...
675
676
677
  				if (!OC_Config::getValue('maintenance', false) && !\OCP\Util::needUpgrade()) {
  					OC_App::loadApps(array('authentication'));
  					OC_App::loadApps(array('filesystem', 'logging'));
03e52840d   Kload   Init
678
679
  					OC_App::loadApps();
  				}
31b7f2792   Kload   Upgrade to ownclo...
680
  				self::checkSingleUserMode();
6d9380f96   Cédric Dupont   Update sources OC...
681
  				OC::$server->getRouter()->match(OC_Request::getRawPathInfo());
03e52840d   Kload   Init
682
683
684
685
686
687
688
689
  				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;
  			}
  		}
6d9380f96   Cédric Dupont   Update sources OC...
690
691
692
693
694
695
696
697
698
699
  		// Load minimum set of apps
  		if (!self::checkUpgrade(false)) {
  			// For logged-in users: Load everything
  			if(OC_User::isLoggedIn()) {
  				OC_App::loadApps();
  			} else {
  				// For guests: Load only authentication, filesystem and logging
  				OC_App::loadApps(array('authentication'));
  				OC_App::loadApps(array('filesystem', 'logging'));
  			}
03e52840d   Kload   Init
700
701
702
703
704
705
706
707
  		}
  
  		// Handle redirect URL for logged in users
  		if (isset($_REQUEST['redirect_url']) && OC_User::isLoggedIn()) {
  			$location = OC_Helper::makeURLAbsolute(urldecode($_REQUEST['redirect_url']));
  
  			// Deny the redirect if the URL contains a @
  			// This prevents unvalidated redirects like ?redirect_url=:user@domain.com
31b7f2792   Kload   Upgrade to ownclo...
708
  			if (strpos($location, '@') === false) {
03e52840d   Kload   Init
709
710
711
712
713
714
  				header('Location: ' . $location);
  				return;
  			}
  		}
  		// Handle WebDAV
  		if ($_SERVER['REQUEST_METHOD'] == 'PROPFIND') {
31b7f2792   Kload   Upgrade to ownclo...
715
716
717
718
719
  			// 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');
03e52840d   Kload   Init
720
721
  			return;
  		}
6d9380f96   Cédric Dupont   Update sources OC...
722
723
724
725
726
727
728
729
730
  		// Redirect to index if the logout link is accessed without valid session
  		// this is needed to prevent "Token expired" messages while login if a session is expired
  		// @see https://github.com/owncloud/core/pull/8443#issuecomment-42425583
  		if(isset($_GET['logout']) && !OC_User::isLoggedIn()) {
  			header("Location: " . OC::$WEBROOT.(empty(OC::$WEBROOT) ? '/' : ''));
  			return;
  		}
  
  		// Someone is logged in
03e52840d   Kload   Init
731
732
733
734
  		if (OC_User::isLoggedIn()) {
  			OC_App::loadApps();
  			OC_User::setupBackends();
  			if (isset($_GET["logout"]) and ($_GET["logout"])) {
6d9380f96   Cédric Dupont   Update sources OC...
735
  				OC_JSON::callCheck();
03e52840d   Kload   Init
736
737
738
  				if (isset($_COOKIE['oc_token'])) {
  					OC_Preferences::deleteKey(OC_User::getUser(), 'login_token', $_COOKIE['oc_token']);
  				}
6d9380f96   Cédric Dupont   Update sources OC...
739
740
741
742
743
744
745
746
747
  				if (isset($_SERVER['PHP_AUTH_USER'])) {
  					if (isset($_COOKIE['oc_ignore_php_auth_user'])) {
  						// Ignore HTTP Authentication for 5 more mintues.
  						setcookie('oc_ignore_php_auth_user', $_SERVER['PHP_AUTH_USER'], time() + 300, OC::$WEBROOT.(empty(OC::$WEBROOT) ? '/' : ''));
  					} elseif ($_SERVER['PHP_AUTH_USER'] === self::$session->get('loginname')) {
  						// Ignore HTTP Authentication to allow a different user to log in.
  						setcookie('oc_ignore_php_auth_user', $_SERVER['PHP_AUTH_USER'], 0, OC::$WEBROOT.(empty(OC::$WEBROOT) ? '/' : ''));
  					}
  				}
03e52840d   Kload   Init
748
  				OC_User::logout();
6d9380f96   Cédric Dupont   Update sources OC...
749
750
  				// redirect to webroot and add slash if webroot is empty
  				header("Location: " . OC::$WEBROOT.(empty(OC::$WEBROOT) ? '/' : ''));
03e52840d   Kload   Init
751
  			} else {
6d9380f96   Cédric Dupont   Update sources OC...
752
753
  				// Redirect to default application
  				OC_Util::redirectToDefaultPage();
03e52840d   Kload   Init
754
  			}
6d9380f96   Cédric Dupont   Update sources OC...
755
756
757
  		} else {
  			// Not handled and not logged in
  			self::handleLogin();
03e52840d   Kload   Init
758
  		}
03e52840d   Kload   Init
759
  	}
6d9380f96   Cédric Dupont   Update sources OC...
760
761
762
763
764
765
766
767
  	/**
  	 * Load a PHP file belonging to the specified application
  	 * @param array $param The application and file to load
  	 * @return bool Whether the file has been found (will return 404 and false if not)
  	 * @deprecated This function will be removed in ownCloud 8 - use proper routing instead
  	 * @param $param
  	 * @return bool Whether the file has been found (will return 404 and false if not)
  	 */
03e52840d   Kload   Init
768
769
770
771
772
  	public static function loadAppScriptFile($param) {
  		OC_App::loadApps();
  		$app = $param['app'];
  		$file = $param['file'];
  		$app_path = OC_App::getAppPath($app);
6d9380f96   Cédric Dupont   Update sources OC...
773
774
775
  		$file = $app_path . '/' . $file;
  
  		if (OC_App::isEnabled($app) && $app_path !== false && OC_Helper::issubdirectory($file, $app_path)) {
31b7f2792   Kload   Upgrade to ownclo...
776
777
778
779
780
  			unset($app, $app_path);
  			if (file_exists($file)) {
  				require_once $file;
  				return true;
  			}
03e52840d   Kload   Init
781
  		}
31b7f2792   Kload   Upgrade to ownclo...
782
  		header('HTTP/1.0 404 Not Found');
03e52840d   Kload   Init
783
784
  		return false;
  	}
6d9380f96   Cédric Dupont   Update sources OC...
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
  	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);
  				$_SERVER['PHP_AUTH_USER'] = $name;
  				$_SERVER['PHP_AUTH_PW'] = $password;
  				break;
  			}
03e52840d   Kload   Init
803
804
805
806
807
808
  		}
  	}
  
  	protected static function handleLogin() {
  		OC_App::loadApps(array('prelogin'));
  		$error = array();
31b7f2792   Kload   Upgrade to ownclo...
809
810
811
812
  
  		// auth possible via apache module?
  		if (OC::tryApacheAuth()) {
  			$error[] = 'apacheauthfailed';
a293d369c   Kload   Update sources to...
813
  		} // remember was checked after last login
31b7f2792   Kload   Upgrade to ownclo...
814
  		elseif (OC::tryRememberLogin()) {
03e52840d   Kload   Init
815
  			$error[] = 'invalidcookie';
a293d369c   Kload   Update sources to...
816
  		} // logon via web form
31b7f2792   Kload   Upgrade to ownclo...
817
  		elseif (OC::tryFormLogin()) {
03e52840d   Kload   Init
818
  			$error[] = 'invalidpassword';
31b7f2792   Kload   Upgrade to ownclo...
819
820
821
  			if ( OC_Config::getValue('log_authfailip', false) ) {
  				OC_Log::write('core', 'Login failed: user \''.$_POST["user"].'\' , wrong password, IP:'.$_SERVER['REMOTE_ADDR'],
  				OC_Log::WARN);
a293d369c   Kload   Update sources to...
822
  			} else {
31b7f2792   Kload   Upgrade to ownclo...
823
824
825
  				OC_Log::write('core', 'Login failed: user \''.$_POST["user"].'\' , wrong password, IP:set log_authfailip=true in conf',
                                  OC_Log::WARN);
  			}
03e52840d   Kload   Init
826
  		}
31b7f2792   Kload   Upgrade to ownclo...
827

03e52840d   Kload   Init
828
829
  		OC_Util::displayLoginPage(array_unique($error));
  	}
6d9380f96   Cédric Dupont   Update sources OC...
830
831
832
833
  	/**
  	 * Remove outdated and therefore invalid tokens for a user
  	 * @param string $user
  	 */
03e52840d   Kload   Init
834
835
836
837
838
839
840
841
842
843
  	protected static function cleanupLoginTokens($user) {
  		$cutoff = time() - OC_Config::getValue('remember_login_cookie_lifetime', 60 * 60 * 24 * 15);
  		$tokens = OC_Preferences::getKeys($user, 'login_token');
  		foreach ($tokens as $token) {
  			$time = OC_Preferences::getValue($user, 'login_token', $token);
  			if ($time < $cutoff) {
  				OC_Preferences::deleteKey($user, 'login_token', $token);
  			}
  		}
  	}
6d9380f96   Cédric Dupont   Update sources OC...
844
845
846
847
  	/**
  	 * Try to login a user via HTTP authentication
  	 * @return bool|void
  	 */
31b7f2792   Kload   Upgrade to ownclo...
848
849
850
851
852
853
854
855
856
857
858
859
860
  	protected static function tryApacheAuth() {
  		$return = OC_User::handleApacheAuth();
  
  		// if return is true we are logged in -> redirect to the default page
  		if ($return === true) {
  			$_REQUEST['redirect_url'] = \OC_Request::requestUri();
  			OC_Util::redirectToDefaultPage();
  			exit;
  		}
  
  		// in case $return is null apache based auth is not enabled
  		return is_null($return) ? false : true;
  	}
6d9380f96   Cédric Dupont   Update sources OC...
861
862
863
864
  	/**
  	 * Try to login a user using the remember me cookie.
  	 * @return bool Whether the provided cookie was valid
  	 */
03e52840d   Kload   Init
865
866
867
868
869
870
871
872
873
  	protected static function tryRememberLogin() {
  		if (!isset($_COOKIE["oc_remember_login"])
  			|| !isset($_COOKIE["oc_token"])
  			|| !isset($_COOKIE["oc_username"])
  			|| !$_COOKIE["oc_remember_login"]
  			|| !OC_Util::rememberLoginAllowed()
  		) {
  			return false;
  		}
6d9380f96   Cédric Dupont   Update sources OC...
874

03e52840d   Kload   Init
875
876
877
  		if (defined("DEBUG") && DEBUG) {
  			OC_Log::write('core', 'Trying to login from cookie', OC_Log::DEBUG);
  		}
6d9380f96   Cédric Dupont   Update sources OC...
878
879
  
  		if(OC_User::userExists($_COOKIE['oc_username'])) {
03e52840d   Kload   Init
880
  			self::cleanupLoginTokens($_COOKIE['oc_username']);
6d9380f96   Cédric Dupont   Update sources OC...
881
882
883
884
  			// verify whether the supplied "remember me" token was valid
  			$granted = OC_User::loginWithCookie(
  				$_COOKIE['oc_username'], $_COOKIE['oc_token']);
  			if($granted === true) {
03e52840d   Kload   Init
885
886
887
  				OC_Util::redirectToDefaultPage();
  				// doesn't return
  			}
6d9380f96   Cédric Dupont   Update sources OC...
888
889
  			OC_Log::write('core', 'Authentication cookie rejected for user ' .
  				$_COOKIE['oc_username'], OC_Log::WARN);
03e52840d   Kload   Init
890
891
892
893
  			// 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
03e52840d   Kload   Init
894
  		}
6d9380f96   Cédric Dupont   Update sources OC...
895

03e52840d   Kload   Init
896
897
898
  		OC_User::unsetMagicInCookie();
  		return true;
  	}
6d9380f96   Cédric Dupont   Update sources OC...
899
900
901
902
  	/**
  	 * Tries to login a user using the formbased authentication
  	 * @return bool|void
  	 */
03e52840d   Kload   Init
903
904
905
906
  	protected static function tryFormLogin() {
  		if (!isset($_POST["user"]) || !isset($_POST['password'])) {
  			return false;
  		}
6d9380f96   Cédric Dupont   Update sources OC...
907
  		OC_JSON::callCheck();
03e52840d   Kload   Init
908
909
910
911
912
913
914
915
  		OC_App::loadApps();
  
  		//setup extra user backends
  		OC_User::setupBackends();
  
  		if (OC_User::login($_POST["user"], $_POST["password"])) {
  			// setting up the time zone
  			if (isset($_POST['timezone-offset'])) {
31b7f2792   Kload   Upgrade to ownclo...
916
  				self::$session->set('timezone', $_POST['timezone-offset']);
03e52840d   Kload   Init
917
918
919
920
921
922
923
924
  			}
  
  			$userid = OC_User::getUser();
  			self::cleanupLoginTokens($userid);
  			if (!empty($_POST["remember_login"])) {
  				if (defined("DEBUG") && DEBUG) {
  					OC_Log::write('core', 'Setting remember login to cookie', OC_Log::DEBUG);
  				}
31b7f2792   Kload   Upgrade to ownclo...
925
  				$token = OC_Util::generateRandomBytes(32);
03e52840d   Kload   Init
926
927
928
929
930
931
932
933
934
935
  				OC_Preferences::setValue($userid, 'login_token', $token, time());
  				OC_User::setMagicInCookie($userid, $token);
  			} else {
  				OC_User::unsetMagicInCookie();
  			}
  			OC_Util::redirectToDefaultPage();
  			exit();
  		}
  		return true;
  	}
6d9380f96   Cédric Dupont   Update sources OC...
936
937
938
939
  	/**
  	 * Try to login a user using HTTP authentication.
  	 * @return bool
  	 */
03e52840d   Kload   Init
940
941
942
  	protected static function tryBasicAuthLogin() {
  		if (!isset($_SERVER["PHP_AUTH_USER"])
  			|| !isset($_SERVER["PHP_AUTH_PW"])
6d9380f96   Cédric Dupont   Update sources OC...
943
  			|| (isset($_COOKIE['oc_ignore_php_auth_user']) && $_COOKIE['oc_ignore_php_auth_user'] === $_SERVER['PHP_AUTH_USER'])
03e52840d   Kload   Init
944
945
946
  		) {
  			return false;
  		}
6d9380f96   Cédric Dupont   Update sources OC...
947

03e52840d   Kload   Init
948
949
950
951
952
953
954
955
956
  		if (OC_User::login($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])) {
  			//OC_Log::write('core',"Logged in with HTTP Authentication", OC_Log::DEBUG);
  			OC_User::unsetMagicInCookie();
  			$_SERVER['HTTP_REQUESTTOKEN'] = OC_Util::callRegister();
  		}
  		return true;
  	}
  
  }
03e52840d   Kload   Init
957
  if (!function_exists('get_temp_dir')) {
6d9380f96   Cédric Dupont   Update sources OC...
958
959
960
961
  	/**
  	 * Get the temporary dir to store uploaded data
  	 * @return null|string Path to the temporary directory or null
  	 */
03e52840d   Kload   Init
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
  	function get_temp_dir() {
  		if ($temp = ini_get('upload_tmp_dir')) return $temp;
  		if ($temp = getenv('TMP')) return $temp;
  		if ($temp = getenv('TEMP')) return $temp;
  		if ($temp = getenv('TMPDIR')) return $temp;
  		$temp = tempnam(__FILE__, '');
  		if (file_exists($temp)) {
  			unlink($temp);
  			return dirname($temp);
  		}
  		if ($temp = sys_get_temp_dir()) return $temp;
  
  		return null;
  	}
  }
  
  OC::init();