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
  		self::initPaths();
f7d878ff1   kload   [enh] Update to 7...
470
  		self::registerAutoloaderCache();
31b7f2792   Kload   Upgrade to ownclo...
471
  		OC_Util::isSetLocaleWorking();
03e52840d   Kload   Init
472

6d9380f96   Cédric Dupont   Update sources OC...
473
474
475
476
477
  		// setup 3rdparty autoloader
  		$vendorAutoLoad = OC::$THIRDPARTYROOT . '/3rdparty/autoload.php';
  		if (file_exists($vendorAutoLoad)) {
  			require_once $vendorAutoLoad;
  		}
31b7f2792   Kload   Upgrade to ownclo...
478
  		if (!defined('PHPUNIT_RUN')) {
6d9380f96   Cédric Dupont   Update sources OC...
479
  			OC\Log\ErrorHandler::setLogger(OC_Log::$object);
31b7f2792   Kload   Upgrade to ownclo...
480
  			if (defined('DEBUG') and DEBUG) {
a293d369c   Kload   Update sources to...
481
  				OC\Log\ErrorHandler::register(true);
31b7f2792   Kload   Upgrade to ownclo...
482
483
484
  				set_exception_handler(array('OC_Template', 'printExceptionErrorPage'));
  			} else {
  				OC\Log\ErrorHandler::register();
31b7f2792   Kload   Upgrade to ownclo...
485
  			}
03e52840d   Kload   Init
486
487
488
489
490
491
  		}
  
  		// 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...
492
  		stream_wrapper_register('quota', 'OC\Files\Stream\Quota');
03e52840d   Kload   Init
493
  		stream_wrapper_register('oc', 'OC\Files\Stream\OC');
31b7f2792   Kload   Upgrade to ownclo...
494
495
  		// setup the basic server
  		self::$server = new \OC\Server();
03e52840d   Kload   Init
496
  		self::initTemplateEngine();
6d9380f96   Cédric Dupont   Update sources OC...
497
  		OC_App::loadApps(array('session'));
31b7f2792   Kload   Upgrade to ownclo...
498
499
500
501
502
  		if (!self::$CLI) {
  			self::initSession();
  		} else {
  			self::$session = new \OC\Session\Memory('');
  		}
03e52840d   Kload   Init
503
504
505
  		self::checkConfig();
  		self::checkInstalled();
  		self::checkSSL();
6d9380f96   Cédric Dupont   Update sources OC...
506
  		OC_Response::addSecurityHeaders();
03e52840d   Kload   Init
507
508
509
  
  		$errors = OC_Util::checkServer();
  		if (count($errors) > 0) {
31b7f2792   Kload   Upgrade to ownclo...
510
511
  			if (self::$CLI) {
  				foreach ($errors as $error) {
a293d369c   Kload   Update sources to...
512
513
  					echo $error['error'] . "
  ";
31b7f2792   Kload   Upgrade to ownclo...
514
515
516
517
518
  					echo $error['hint'] . "
  
  ";
  				}
  			} else {
837968727   Kload   [enh] Upgrade to ...
519
  				OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
31b7f2792   Kload   Upgrade to ownclo...
520
521
  				OC_Template::printGuestPage('', 'error', array('errors' => $errors));
  			}
03e52840d   Kload   Init
522
523
524
525
526
527
528
529
530
  			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...
531
  			self::$session->set('user_id', '');
03e52840d   Kload   Init
532
533
534
535
  		}
  
  		OC_User::useBackend(new OC_User_Database());
  		OC_Group::useBackend(new OC_Group_Database());
03e52840d   Kload   Init
536
537
538
539
540
  		//setup extra user backends
  		OC_User::setupBackends();
  
  		self::registerCacheHooks();
  		self::registerFilesystemHooks();
31b7f2792   Kload   Upgrade to ownclo...
541
  		self::registerPreviewHooks();
03e52840d   Kload   Init
542
  		self::registerShareHooks();
31b7f2792   Kload   Upgrade to ownclo...
543
  		self::registerLogRotate();
6d9380f96   Cédric Dupont   Update sources OC...
544
  		self::registerLocalAddressBook();
03e52840d   Kload   Init
545
546
547
  
  		//make sure temporary files are cleaned up
  		register_shutdown_function(array('OC_Helper', 'cleanTmp'));
03e52840d   Kload   Init
548
549
550
551
552
553
  		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...
554
555
556
557
558
559
560
  	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
561
562
563
564
  	/**
  	 * register hooks for the cache
  	 */
  	public static function registerCacheHooks() {
6d9380f96   Cédric Dupont   Update sources OC...
565
  		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...
566
  			\OCP\BackgroundJob::registerJob('OC\Cache\FileGlobalGC');
31b7f2792   Kload   Upgrade to ownclo...
567

31b7f2792   Kload   Upgrade to ownclo...
568
569
570
571
572
573
574
575
576
577
  			// 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...
578
  		if (OC_Config::getValue('installed', false) && OC_Config::getValue('log_rotate_size', false) && !\OCP\Util::needUpgrade()) {
31b7f2792   Kload   Upgrade to ownclo...
579
  			//don't try to do this before we are properly setup
6d9380f96   Cédric Dupont   Update sources OC...
580
581
  			//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...
582
  		}
03e52840d   Kload   Init
583
584
585
586
587
588
589
  	}
  
  	/**
  	 * register hooks for the filesystem
  	 */
  	public static function registerFilesystemHooks() {
  		// Check for blacklisted files
6d9380f96   Cédric Dupont   Update sources OC...
590
591
  		OC_Hook::connect('OC_Filesystem', 'write', 'OC\Files\Filesystem', 'isBlacklisted');
  		OC_Hook::connect('OC_Filesystem', 'rename', 'OC\Files\Filesystem', 'isBlacklisted');
03e52840d   Kload   Init
592
593
594
  	}
  
  	/**
31b7f2792   Kload   Upgrade to ownclo...
595
596
597
598
  	 * 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...
599
600
601
602
  		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...
603
604
605
606
607
  		OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete');
  		OC_Hook::connect('\OCP\Trashbin', 'delete', 'OC\Preview', 'post_delete');
  	}
  
  	/**
03e52840d   Kload   Init
608
609
610
  	 * register hooks for sharing
  	 */
  	public static function registerShareHooks() {
a293d369c   Kload   Update sources to...
611
  		if (\OC_Config::getValue('installed')) {
6d9380f96   Cédric Dupont   Update sources OC...
612
613
614
615
  			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
616
617
  		}
  	}
f7d878ff1   kload   [enh] Update to 7...
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
  	protected static function registerAutoloaderCache() {
  		// The class loader takes an optional low-latency cache, which MUST be
  		// namespaced. The instanceid is used for namespacing, but might be
  		// unavailable at this point. Futhermore, it might not be possible to
  		// generate an instanceid via \OC_Util::getInstanceId() because the
  		// config file may not be writable. As such, we only register a class
  		// loader cache if instanceid is available without trying to create one.
  		$instanceId = OC_Config::getValue('instanceid', null);
  		if ($instanceId) {
  			try {
  				$memcacheFactory = new \OC\Memcache\Factory($instanceId);
  				self::$loader->setMemoryCache($memcacheFactory->createLowLatency('Autoloader'));
  			} catch (\Exception $ex) {
  			}
  		}
  	}
03e52840d   Kload   Init
634
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
635
  	 * Handle the request
03e52840d   Kload   Init
636
637
  	 */
  	public static function handleRequest() {
6d9380f96   Cédric Dupont   Update sources OC...
638
  		$l = \OC_L10N::get('lib');
03e52840d   Kload   Init
639
640
641
642
643
644
  		// 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...
645
646
  			$controller = new OC\Core\Setup\Controller();
  			$controller->run($_POST);
03e52840d   Kload   Init
647
648
  			exit();
  		}
837968727   Kload   [enh] Upgrade to ...
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');
f7d878ff1   kload   [enh] Update to 7...
658
659
660
  			$tmpl = new OCP\Template('core', 'untrustedDomain', 'guest');
  			$tmpl->assign('domain', $_SERVER['SERVER_NAME']);
  			$tmpl->printPage();
837968727   Kload   [enh] Upgrade to ...
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
  		if (!OC_User::isLoggedIn()) {
  			// Test it the user is already authenticated using Apaches AuthType Basic... very usable in combination with LDAP
f7d878ff1   kload   [enh] Update to 7...
670
671
672
  			if (!OC_Config::getValue('maintenance', false) && !self::checkUpgrade(false)) {
  				OC_App::loadApps(array('authentication'));
  			}
6d9380f96   Cédric Dupont   Update sources OC...
673
674
  			OC::tryBasicAuthLogin();
  		}
03e52840d   Kload   Init
675

31b7f2792   Kload   Upgrade to ownclo...
676
  		if (!self::$CLI and (!isset($_GET["logout"]) or ($_GET["logout"] !== 'true'))) {
03e52840d   Kload   Init
677
  			try {
6d9380f96   Cédric Dupont   Update sources OC...
678
679
680
  				if (!OC_Config::getValue('maintenance', false) && !\OCP\Util::needUpgrade()) {
  					OC_App::loadApps(array('authentication'));
  					OC_App::loadApps(array('filesystem', 'logging'));
03e52840d   Kload   Init
681
682
  					OC_App::loadApps();
  				}
31b7f2792   Kload   Upgrade to ownclo...
683
  				self::checkSingleUserMode();
6d9380f96   Cédric Dupont   Update sources OC...
684
  				OC::$server->getRouter()->match(OC_Request::getRawPathInfo());
03e52840d   Kload   Init
685
686
687
688
689
690
691
692
  				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...
693
694
695
696
697
698
699
700
701
702
  		// 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
703
704
705
706
707
708
709
710
  		}
  
  		// 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...
711
  			if (strpos($location, '@') === false) {
03e52840d   Kload   Init
712
713
714
715
716
717
  				header('Location: ' . $location);
  				return;
  			}
  		}
  		// Handle WebDAV
  		if ($_SERVER['REQUEST_METHOD'] == 'PROPFIND') {
31b7f2792   Kload   Upgrade to ownclo...
718
719
720
721
722
  			// 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
723
724
  			return;
  		}
6d9380f96   Cédric Dupont   Update sources OC...
725
726
727
728
729
730
731
732
733
  		// 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
734
735
736
737
  		if (OC_User::isLoggedIn()) {
  			OC_App::loadApps();
  			OC_User::setupBackends();
  			if (isset($_GET["logout"]) and ($_GET["logout"])) {
6d9380f96   Cédric Dupont   Update sources OC...
738
  				OC_JSON::callCheck();
03e52840d   Kload   Init
739
740
741
  				if (isset($_COOKIE['oc_token'])) {
  					OC_Preferences::deleteKey(OC_User::getUser(), 'login_token', $_COOKIE['oc_token']);
  				}
6d9380f96   Cédric Dupont   Update sources OC...
742
743
744
745
746
747
748
749
750
  				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
751
  				OC_User::logout();
6d9380f96   Cédric Dupont   Update sources OC...
752
753
  				// redirect to webroot and add slash if webroot is empty
  				header("Location: " . OC::$WEBROOT.(empty(OC::$WEBROOT) ? '/' : ''));
03e52840d   Kload   Init
754
  			} else {
6d9380f96   Cédric Dupont   Update sources OC...
755
756
  				// Redirect to default application
  				OC_Util::redirectToDefaultPage();
03e52840d   Kload   Init
757
  			}
6d9380f96   Cédric Dupont   Update sources OC...
758
759
760
  		} else {
  			// Not handled and not logged in
  			self::handleLogin();
03e52840d   Kload   Init
761
  		}
03e52840d   Kload   Init
762
  	}
6d9380f96   Cédric Dupont   Update sources OC...
763
764
765
766
767
768
769
770
  	/**
  	 * 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
771
772
773
774
775
  	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...
776
777
778
  		$file = $app_path . '/' . $file;
  
  		if (OC_App::isEnabled($app) && $app_path !== false && OC_Helper::issubdirectory($file, $app_path)) {
31b7f2792   Kload   Upgrade to ownclo...
779
780
781
782
783
  			unset($app, $app_path);
  			if (file_exists($file)) {
  				require_once $file;
  				return true;
  			}
03e52840d   Kload   Init
784
  		}
31b7f2792   Kload   Upgrade to ownclo...
785
  		header('HTTP/1.0 404 Not Found');
03e52840d   Kload   Init
786
787
  		return false;
  	}
6d9380f96   Cédric Dupont   Update sources OC...
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
  	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
806
807
808
809
810
811
  		}
  	}
  
  	protected static function handleLogin() {
  		OC_App::loadApps(array('prelogin'));
  		$error = array();
31b7f2792   Kload   Upgrade to ownclo...
812
813
814
815
  
  		// auth possible via apache module?
  		if (OC::tryApacheAuth()) {
  			$error[] = 'apacheauthfailed';
a293d369c   Kload   Update sources to...
816
  		} // remember was checked after last login
31b7f2792   Kload   Upgrade to ownclo...
817
  		elseif (OC::tryRememberLogin()) {
03e52840d   Kload   Init
818
  			$error[] = 'invalidcookie';
a293d369c   Kload   Update sources to...
819
  		} // logon via web form
31b7f2792   Kload   Upgrade to ownclo...
820
  		elseif (OC::tryFormLogin()) {
03e52840d   Kload   Init
821
822
  			$error[] = 'invalidpassword';
  		}
31b7f2792   Kload   Upgrade to ownclo...
823

03e52840d   Kload   Init
824
825
  		OC_Util::displayLoginPage(array_unique($error));
  	}
6d9380f96   Cédric Dupont   Update sources OC...
826
827
828
829
  	/**
  	 * Remove outdated and therefore invalid tokens for a user
  	 * @param string $user
  	 */
03e52840d   Kload   Init
830
831
832
833
834
835
836
837
838
839
  	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...
840
841
842
843
  	/**
  	 * Try to login a user via HTTP authentication
  	 * @return bool|void
  	 */
31b7f2792   Kload   Upgrade to ownclo...
844
845
846
847
848
849
850
851
852
853
854
855
856
  	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...
857
858
859
860
  	/**
  	 * Try to login a user using the remember me cookie.
  	 * @return bool Whether the provided cookie was valid
  	 */
03e52840d   Kload   Init
861
862
863
864
865
866
867
868
869
  	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...
870

03e52840d   Kload   Init
871
872
873
  		if (defined("DEBUG") && DEBUG) {
  			OC_Log::write('core', 'Trying to login from cookie', OC_Log::DEBUG);
  		}
6d9380f96   Cédric Dupont   Update sources OC...
874
875
  
  		if(OC_User::userExists($_COOKIE['oc_username'])) {
03e52840d   Kload   Init
876
  			self::cleanupLoginTokens($_COOKIE['oc_username']);
6d9380f96   Cédric Dupont   Update sources OC...
877
878
879
880
  			// 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
881
882
883
  				OC_Util::redirectToDefaultPage();
  				// doesn't return
  			}
6d9380f96   Cédric Dupont   Update sources OC...
884
885
  			OC_Log::write('core', 'Authentication cookie rejected for user ' .
  				$_COOKIE['oc_username'], OC_Log::WARN);
03e52840d   Kload   Init
886
887
888
889
  			// 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
890
  		}
6d9380f96   Cédric Dupont   Update sources OC...
891

03e52840d   Kload   Init
892
893
894
  		OC_User::unsetMagicInCookie();
  		return true;
  	}
6d9380f96   Cédric Dupont   Update sources OC...
895
896
897
898
  	/**
  	 * Tries to login a user using the formbased authentication
  	 * @return bool|void
  	 */
03e52840d   Kload   Init
899
900
901
902
  	protected static function tryFormLogin() {
  		if (!isset($_POST["user"]) || !isset($_POST['password'])) {
  			return false;
  		}
6d9380f96   Cédric Dupont   Update sources OC...
903
  		OC_JSON::callCheck();
03e52840d   Kload   Init
904
905
906
907
908
909
910
911
  		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...
912
  				self::$session->set('timezone', $_POST['timezone-offset']);
03e52840d   Kload   Init
913
914
915
916
917
918
919
920
  			}
  
  			$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...
921
  				$token = OC_Util::generateRandomBytes(32);
03e52840d   Kload   Init
922
923
924
925
926
927
928
929
930
931
  				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...
932
933
934
935
  	/**
  	 * Try to login a user using HTTP authentication.
  	 * @return bool
  	 */
03e52840d   Kload   Init
936
937
938
  	protected static function tryBasicAuthLogin() {
  		if (!isset($_SERVER["PHP_AUTH_USER"])
  			|| !isset($_SERVER["PHP_AUTH_PW"])
6d9380f96   Cédric Dupont   Update sources OC...
939
  			|| (isset($_COOKIE['oc_ignore_php_auth_user']) && $_COOKIE['oc_ignore_php_auth_user'] === $_SERVER['PHP_AUTH_USER'])
03e52840d   Kload   Init
940
941
942
  		) {
  			return false;
  		}
6d9380f96   Cédric Dupont   Update sources OC...
943

59b1a87bf   Alexis Gavoty   [fix] Apply #4574...
944
945
946
947
948
949
  		if (!OC_User::isLoggedIn()) {
  			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();
  			}
03e52840d   Kload   Init
950
951
952
953
954
  		}
  		return true;
  	}
  
  }
03e52840d   Kload   Init
955
  if (!function_exists('get_temp_dir')) {
6d9380f96   Cédric Dupont   Update sources OC...
956
957
958
959
  	/**
  	 * Get the temporary dir to store uploaded data
  	 * @return null|string Path to the temporary directory or null
  	 */
03e52840d   Kload   Init
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
  	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();