Преглед изворни кода

Cache HTTP compatible multi-utilisateur

Contribue à https://github.com/marienfressinaud/FreshRSS/issues/126
Alexandre Alapetite пре 12 година
родитељ
комит
bd5d7a7bcb

+ 1 - 1
app/Controllers/configureController.php

@@ -322,7 +322,7 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
 
 			Minz_Session::_param('mail', $this->view->conf->mail_login);
 
-			if (Minz_Configuration::isAdmin()) {
+			if (Minz_Configuration::isAdmin(Minz_Session::param('currentUser', '_'))) {
 				$anon = Minz_Request::param('anon_access', false);
 				$anon = ((bool)$anon) && ($anon !== 'no');
 				$auth_type = Minz_Request::param('auth_type', 'none');

+ 2 - 2
app/Controllers/indexController.php

@@ -218,10 +218,10 @@ class FreshRSS_index_Controller extends Minz_ActionController {
 		Minz_View::prependTitle (Minz_Translate::t ('logs') . ' - ');
 
 		if (Minz_Request::isPost ()) {
-			file_put_contents(LOG_PATH . '/' . Minz_Configuration::currentUser() . '.log', '');	//Truncate
+			FreshRSS_LogDAO::truncate();
 		}
 
-		$logs = FreshRSS_LogDAO::lines(Minz_Configuration::currentUser());	//TODO: ask only the necessary lines
+		$logs = FreshRSS_LogDAO::lines();	//TODO: ask only the necessary lines
 
 		//gestion pagination
 		$page = Minz_Request::param ('page', 1);

+ 37 - 14
app/FreshRSS.php

@@ -1,22 +1,24 @@
 <?php
 class FreshRSS extends Minz_FrontController {
-	public function init($currentUser = null) {
-		Minz_Session::init('FreshRSS');
-		$this->accessControl($currentUser);
+	public function init() {
+		if (!isset($_SESSION)) {
+			Minz_Session::init('FreshRSS');
+		}
+		$this->accessControl(Minz_Session::param('currentUser', ''));
 		$this->loadParamsView();
 		$this->loadStylesAndScripts();
 		$this->loadNotifications();
 	}
 
 	private function accessControl($currentUser) {
-		if ($currentUser === null) {
+		if ($currentUser == '') {
 			switch (Minz_Configuration::authType()) {
 				case 'http_auth':
 					$currentUser = httpAuthUser();
 					$loginOk = $currentUser != '';
 					break;
 				case 'persona':
-					$currentUser = Minz_Configuration::defaultUser();
+					$currentUser = Minz_Configuration::defaultUser();	//TODO: Make Persona compatible with multi-user
 					$loginOk = Minz_Session::param('mail') != '';
 					break;
 				case 'none':
@@ -24,28 +26,49 @@ class FreshRSS extends Minz_FrontController {
 					$loginOk = true;
 					break;
 				default:
+					$currentUser = Minz_Configuration::defaultUser();
 					$loginOk = false;
 					break;
 			}
-		} elseif ((PHP_SAPI === 'cli') && (Minz_Request::actionName() === 'actualize')) {	//Command line
-			Minz_Configuration::_authType('none');
+		} else {
 			$loginOk = true;
 		}
 
-		if (!$loginOk || !isValidUser($currentUser)) {
-			$currentUser = Minz_Configuration::defaultUser();
-			$loginOk = false;
+		if (!ctype_alnum($currentUser)) {
+			Minz_Session::_param('currentUser', '');
+			die('Invalid username [' . $currentUser . ']!');
 		}
-		Minz_Configuration::_currentUser($currentUser);
-		Minz_View::_param ('loginOk', $loginOk);
 
 		try {
 			$this->conf = new FreshRSS_Configuration($currentUser);
 		} catch (Minz_Exception $e) {
-			// Permission denied or conf file does not exist
-			die($e->getMessage());
+			Minz_Session::_param('currentUser', '');
+			die('Invalid configuration for user [' . $currentUser . ']! ' . $e->getMessage());	//Permission denied or conf file does not exist
 		}
 		Minz_View::_param ('conf', $this->conf);
+		Minz_Session::_param('currentUser', $currentUser);
+
+		if ($loginOk) {
+			switch (Minz_Configuration::authType()) {
+				case 'http_auth':
+					$loginOk = $currentUser === httpAuthUser();
+					break;
+				case 'persona':
+					$loginOk = Minz_Session::param('mail') === $this->conf->mail_login;
+					break;
+				case 'none':
+					$loginOk = true;
+					break;
+				default:
+					$loginOk = false;
+					break;
+			}
+			if ((!$loginOk) && (PHP_SAPI === 'cli') && (Minz_Request::actionName() === 'actualize')) {	//Command line
+				Minz_Configuration::_authType('none');
+				$loginOk = true;
+			}
+		}
+		Minz_View::_param ('loginOk', $loginOk);
 	}
 
 	private function loadParamsView () {

+ 6 - 2
app/Models/LogDAO.php

@@ -1,9 +1,9 @@
 <?php
 
 class FreshRSS_LogDAO {
-	public static function lines($user) {
+	public static function lines() {
 		$logs = array ();
-		$handle = @fopen(LOG_PATH . '/' . $user . '.log', 'r');
+		$handle = @fopen(LOG_PATH . '/' . Minz_Session::param('currentUser', '_') . '.log', 'r');
 		if ($handle) {
 			while (($line = fgets($handle)) !== false) {
 				if (preg_match ('/^\[([^\[]+)\] \[([^\[]+)\] --- (.*)$/', $line, $matches)) {
@@ -18,4 +18,8 @@ class FreshRSS_LogDAO {
 		}
 		return array_reverse($logs);
 	}
+
+	public static function truncate() {
+		file_put_contents(LOG_PATH . '/' . Minz_Session::param('currentUser', '_') . '.log', '');
+	}
 }

+ 8 - 4
app/actualize_script.php

@@ -10,13 +10,17 @@ $_SERVER['HTTP_HOST'] = '';
 
 require(LIB_PATH . '/lib_rss.php');	//Includes class autoloader
 
-$front_controller = new FreshRSS ();
+$freshRSS = new FreshRSS ();
 
 $users = listUsers();
 shuffle($users);
 
 foreach ($users as $user) {
-	$front_controller->init($user);
-	$front_controller->run();
-	invalidateHttpCache($user);
+	Minz_Session::init('FreshRSS');
+	Minz_Session::_param('currentUser', $user);
+	$freshRSS->init();
+	$freshRSS->run();
+	//invalidateHttpCache();
+	touch(LOG_PATH . '/' . $user . '.log');
+	Minz_Session::unset_session(true);
 }

+ 3 - 3
app/views/configure/users.phtml

@@ -9,10 +9,10 @@
 		<div class="form-group">
 			<label class="group-name" for="current_user"><?php echo Minz_Translate::t('current_user'); ?></label>
 			<div class="group-controls">
-				<input id="current_user" type="text" disabled="disabled" value="<?php echo Minz_Configuration::currentUser(); ?>" />
+				<input id="current_user" type="text" disabled="disabled" value="<?php echo Minz_Session::param('currentUser', '_'); ?>" />
 				<code>$_SERVER['REMOTE_USER'] = <?php echo httpAuthUser(); ?></code>
 				<label class="checkbox" for="is_admin">
-					<input type="checkbox" id="is_admin" disabled="disabled"<?php echo Minz_Configuration::isAdmin() ? ' checked="checked"' : ''; ?> />
+					<input type="checkbox" id="is_admin" disabled="disabled"<?php echo Minz_Configuration::isAdmin(Minz_Session::param('currentUser', '_')) ? ' checked="checked"' : ''; ?> />
 					<?php echo Minz_Translate::t('is_admin'); ?>
 				</label>
 			</div>
@@ -34,7 +34,7 @@
 			</div>
 		</div>
 
-		<?php if (Minz_Configuration::isAdmin()) { ?>
+		<?php if (Minz_Configuration::isAdmin(Minz_Session::param('currentUser', '_'))) { ?>
 
 		<legend><?php echo Minz_Translate::t('users'); ?></legend>
 

+ 2 - 11
lib/Minz/Configuration.php

@@ -51,7 +51,6 @@ class Minz_Configuration {
 	private static $cache_enabled = false;
 	private static $delay_cache = 3600;
 	private static $default_user = '';
-	private static $current_user = '';
 	private static $allow_anonymous = false;
 	private static $auth_type = 'none';
 
@@ -95,11 +94,8 @@ class Minz_Configuration {
 	public static function defaultUser () {
 		return self::$default_user;
 	}
-	public static function currentUser () {
-		return self::$current_user;
-	}
-	public static function isAdmin () {
-		return self::$current_user === self::$default_user;
+	public static function isAdmin($currentUser) {
+		return $currentUser === self::$default_user;
 	}
 	public static function allowAnonymous() {
 		return self::$allow_anonymous;
@@ -127,10 +123,6 @@ class Minz_Configuration {
 				break;
 		}
 	}
-	public static function _currentUser($user) {
-		self::$current_user = $user;
-	}
-
 
 	/**
 	 * Initialise les variables de configuration
@@ -255,7 +247,6 @@ class Minz_Configuration {
 		}
 		if (isset ($general['default_user'])) {
 			self::$default_user = $general['default_user'];
-			self::$current_user = self::$default_user;
 		}
 		if (isset ($general['allow_anonymous'])) {
 			self::$allow_anonymous = ((bool)($general['allow_anonymous'])) && ($general['allow_anonymous'] !== 'no');

+ 1 - 1
lib/Minz/Log.php

@@ -37,7 +37,7 @@ class Minz_Log {
 		       || ($env === Minz_Configuration::PRODUCTION
 		       && ($level >= Minz_Log::NOTICE)))) {
 			if ($file_name === null) {
-				$file_name = LOG_PATH . '/' . Minz_Configuration::currentUser() . '.log';
+				$file_name = LOG_PATH . '/' . Minz_Session::param('currentUser', '_') . '.log';
 			}
 
 			switch ($level) {

+ 1 - 2
lib/Minz/ModelPdo.php

@@ -60,8 +60,7 @@ class Minz_ModelPdo {
 			);
 			self::$sharedBd = $this->bd;
 
-			$userPrefix = Minz_Configuration::currentUser ();
-			$this->prefix = $db['prefix'] . (empty($userPrefix) ? '' : ($userPrefix . '_'));
+			$this->prefix = $db['prefix'] . Minz_Session::param('currentUser', '_') . '_';
 			self::$sharedPrefix = $this->prefix;
 		} catch (Exception $e) {
 			throw new Minz_PDOConnectionException (

+ 2 - 8
lib/Minz/Session.php

@@ -8,7 +8,7 @@ class Minz_Session {
 	/**
 	 * $session stocke les variables de session
 	 */
-	private static $session = array ();
+	private static $session = array ();	//TODO: Try to avoid having another local copy
 
 	/**
 	 * Initialise la session, avec un nom
@@ -33,13 +33,7 @@ class Minz_Session {
 	 * @return la valeur de la variable de session, false si n'existe pas
 	 */
 	public static function param ($p, $default = false) {
-		if (isset (self::$session[$p])) {
-			$return = self::$session[$p];
-		} else {
-			$return = $default;
-		}
-
-		return $return;
+		return isset(self::$session[$p]) ? self::$session[$p] : $default;
 	}
 
 

+ 3 - 6
lib/lib_rss.php

@@ -163,8 +163,9 @@ function uSecString() {
 	return str_pad($t['usec'], 6, '0');
 }
 
-function invalidateHttpCache($currentUser = '') {	//TODO: Make multi-user compatible
-	file_put_contents(DATA_PATH . '/touch.txt', uTimeString());
+function invalidateHttpCache() {
+	//touch(LOG_PATH . '/' . Minz_Session::param('currentUser', '_') . '.log');
+	Minz_Session::_param('touch', uTimeString());
 }
 
 function usernameFromPath($userPath) {
@@ -175,10 +176,6 @@ function usernameFromPath($userPath) {
 	}
 }
 
-function isValidUser($user) {
-	return $user != '' && ctype_alnum($user) && file_exists(DATA_PATH . '/' . $user . '_user.php');
-}
-
 function listUsers() {
 	return array_map('usernameFromPath', glob(DATA_PATH . '/*_user.php'));
 }

+ 7 - 6
p/i/index.php

@@ -22,22 +22,23 @@ if (file_exists ('install.php')) {
 	require('install.php');
 } else {
 	require('../../constants.php');
+	require(LIB_PATH . '/lib_rss.php');	//Includes class autoloader
 
 	session_cache_limiter('');
+	Minz_Session::init('FreshRSS');
+
 	if (!file_exists(DATA_PATH . '/no-cache.txt')) {
-		require (LIB_PATH . '/http-conditional.php');
-		$dateLastModification = max(
-			@filemtime(DATA_PATH . '/touch.txt'),
+		require(LIB_PATH . '/http-conditional.php');
+		$currentUser = Minz_Session::param('currentUser', '');
+		$dateLastModification = $currentUser === '' ? time() : max(
+			@filemtime(LOG_PATH . '/' . $currentUser . '.log'),
 			@filemtime(DATA_PATH . '/config.php')
 		);
-		$_SERVER['QUERY_STRING'] .= '&utime=' . file_get_contents(DATA_PATH . '/touch.txt');	//For ETag
 		if (httpConditional($dateLastModification, 0, 0, false, false, true)) {
 			exit();	//No need to send anything
 		}
 	}
 
-	require(LIB_PATH . '/lib_rss.php');	//Includes class autoloader
-
 	try {
 		$front_controller = new FreshRSS();
 		$front_controller->init ();