Merge pull request #11541 from owncloud/usersession-activeuser-setsession

Unset the cached active user when using a different session object
This commit is contained in:
Vincent Petry 2014-10-15 13:31:05 +02:00
commit 6fa03870e9
2 changed files with 75 additions and 44 deletions

View File

@ -91,8 +91,8 @@ class Session implements IUserSession, Emitter {
// fetch the deprecated \OC::$session if it changed for backwards compatibility // fetch the deprecated \OC::$session if it changed for backwards compatibility
if (isset(\OC::$session) && \OC::$session !== $this->session) { if (isset(\OC::$session) && \OC::$session !== $this->session) {
\OC::$server->getLogger()->warning( \OC::$server->getLogger()->warning(
'One of your installed apps still seems to use the deprecated '. 'One of your installed apps still seems to use the deprecated ' .
'\OC::$session and has replaced it with a new instance. Please file a bug against it.'. '\OC::$session and has replaced it with a new instance. Please file a bug against it.' .
'Closing and replacing session in UserSession instance.' 'Closing and replacing session in UserSession instance.'
); );
$this->setSession(\OC::$session); $this->setSession(\OC::$session);
@ -110,6 +110,7 @@ class Session implements IUserSession, Emitter {
$this->session->close(); $this->session->close();
} }
$this->session = $session; $this->session = $session;
$this->activeUser = null;
// maintain deprecated \OC::$session // maintain deprecated \OC::$session
if (\OC::$session !== $this->session) { if (\OC::$session !== $this->session) {
@ -195,7 +196,7 @@ class Session implements IUserSession, Emitter {
public function login($uid, $password) { public function login($uid, $password) {
$this->manager->emit('\OC\User', 'preLogin', array($uid, $password)); $this->manager->emit('\OC\User', 'preLogin', array($uid, $password));
$user = $this->manager->checkPassword($uid, $password); $user = $this->manager->checkPassword($uid, $password);
if($user !== false) { if ($user !== false) {
if (!is_null($user)) { if (!is_null($user)) {
if ($user->isEnabled()) { if ($user->isEnabled()) {
$this->setUser($user); $this->setUser($user);
@ -221,7 +222,7 @@ class Session implements IUserSession, Emitter {
public function loginWithCookie($uid, $currentToken) { public function loginWithCookie($uid, $currentToken) {
$this->manager->emit('\OC\User', 'preRememberedLogin', array($uid)); $this->manager->emit('\OC\User', 'preRememberedLogin', array($uid));
$user = $this->manager->get($uid); $user = $this->manager->get($uid);
if(is_null($user)) { if (is_null($user)) {
// user does not exist // user does not exist
return false; return false;
} }
@ -229,7 +230,7 @@ class Session implements IUserSession, Emitter {
// get stored tokens // get stored tokens
$tokens = \OC_Preferences::getKeys($uid, 'login_token'); $tokens = \OC_Preferences::getKeys($uid, 'login_token');
// test cookies token against stored tokens // test cookies token against stored tokens
if(!in_array($currentToken, $tokens, true)) { if (!in_array($currentToken, $tokens, true)) {
return false; return false;
} }
// replace successfully used token with a new one // replace successfully used token with a new one
@ -275,13 +276,13 @@ class Session implements IUserSession, Emitter {
unset($_COOKIE["oc_username"]); //TODO: DI unset($_COOKIE["oc_username"]); //TODO: DI
unset($_COOKIE["oc_token"]); unset($_COOKIE["oc_token"]);
unset($_COOKIE["oc_remember_login"]); unset($_COOKIE["oc_remember_login"]);
setcookie('oc_username', '', time()-3600, \OC::$WEBROOT); setcookie('oc_username', '', time() - 3600, \OC::$WEBROOT);
setcookie('oc_token', '', time()-3600, \OC::$WEBROOT); setcookie('oc_token', '', time() - 3600, \OC::$WEBROOT);
setcookie('oc_remember_login', '', time()-3600, \OC::$WEBROOT); setcookie('oc_remember_login', '', time() - 3600, \OC::$WEBROOT);
// old cookies might be stored under /webroot/ instead of /webroot // old cookies might be stored under /webroot/ instead of /webroot
// and Firefox doesn't like it! // and Firefox doesn't like it!
setcookie('oc_username', '', time()-3600, \OC::$WEBROOT . '/'); setcookie('oc_username', '', time() - 3600, \OC::$WEBROOT . '/');
setcookie('oc_token', '', time()-3600, \OC::$WEBROOT . '/'); setcookie('oc_token', '', time() - 3600, \OC::$WEBROOT . '/');
setcookie('oc_remember_login', '', time()-3600, \OC::$WEBROOT . '/'); setcookie('oc_remember_login', '', time() - 3600, \OC::$WEBROOT . '/');
} }
} }

View File

@ -9,6 +9,9 @@
namespace Test\User; namespace Test\User;
use OC\Session\Memory;
use OC\User\User;
class Session extends \PHPUnit_Framework_TestCase { class Session extends \PHPUnit_Framework_TestCase {
public function testGetUser() { public function testGetUser() {
$session = $this->getMock('\OC\Session\Memory', array(), array('')); $session = $this->getMock('\OC\Session\Memory', array(), array(''));
@ -54,26 +57,26 @@ class Session extends \PHPUnit_Framework_TestCase {
$session = $this->getMock('\OC\Session\Memory', array(), array('')); $session = $this->getMock('\OC\Session\Memory', array(), array(''));
$session->expects($this->exactly(2)) $session->expects($this->exactly(2))
->method('set') ->method('set')
->with($this->callback(function($key) { ->with($this->callback(function ($key) {
switch($key) { switch ($key) {
case 'user_id': case 'user_id':
case 'loginname': case 'loginname':
return true; return true;
break; break;
default: default:
return false; return false;
break; break;
} }
}, },
'foo')); 'foo'));
$managerMethods = get_class_methods('\OC\User\Manager'); $managerMethods = get_class_methods('\OC\User\Manager');
//keep following methods intact in order to ensure hooks are //keep following methods intact in order to ensure hooks are
//working //working
$doNotMock = array('__construct', 'emit', 'listen'); $doNotMock = array('__construct', 'emit', 'listen');
foreach($doNotMock as $methodName) { foreach ($doNotMock as $methodName) {
$i = array_search($methodName, $managerMethods, true); $i = array_search($methodName, $managerMethods, true);
if($i !== false) { if ($i !== false) {
unset($managerMethods[$i]); unset($managerMethods[$i]);
} }
} }
@ -110,9 +113,9 @@ class Session extends \PHPUnit_Framework_TestCase {
//keep following methods intact in order to ensure hooks are //keep following methods intact in order to ensure hooks are
//working //working
$doNotMock = array('__construct', 'emit', 'listen'); $doNotMock = array('__construct', 'emit', 'listen');
foreach($doNotMock as $methodName) { foreach ($doNotMock as $methodName) {
$i = array_search($methodName, $managerMethods, true); $i = array_search($methodName, $managerMethods, true);
if($i !== false) { if ($i !== false) {
unset($managerMethods[$i]); unset($managerMethods[$i]);
} }
} }
@ -145,9 +148,9 @@ class Session extends \PHPUnit_Framework_TestCase {
//keep following methods intact in order to ensure hooks are //keep following methods intact in order to ensure hooks are
//working //working
$doNotMock = array('__construct', 'emit', 'listen'); $doNotMock = array('__construct', 'emit', 'listen');
foreach($doNotMock as $methodName) { foreach ($doNotMock as $methodName) {
$i = array_search($methodName, $managerMethods, true); $i = array_search($methodName, $managerMethods, true);
if($i !== false) { if ($i !== false) {
unset($managerMethods[$i]); unset($managerMethods[$i]);
} }
} }
@ -192,23 +195,23 @@ class Session extends \PHPUnit_Framework_TestCase {
$session = $this->getMock('\OC\Session\Memory', array(), array('')); $session = $this->getMock('\OC\Session\Memory', array(), array(''));
$session->expects($this->exactly(1)) $session->expects($this->exactly(1))
->method('set') ->method('set')
->with($this->callback(function($key) { ->with($this->callback(function ($key) {
switch($key) { switch ($key) {
case 'user_id': case 'user_id':
return true; return true;
default: default:
return false; return false;
} }
}, },
'foo')); 'foo'));
$managerMethods = get_class_methods('\OC\User\Manager'); $managerMethods = get_class_methods('\OC\User\Manager');
//keep following methods intact in order to ensure hooks are //keep following methods intact in order to ensure hooks are
//working //working
$doNotMock = array('__construct', 'emit', 'listen'); $doNotMock = array('__construct', 'emit', 'listen');
foreach($doNotMock as $methodName) { foreach ($doNotMock as $methodName) {
$i = array_search($methodName, $managerMethods, true); $i = array_search($methodName, $managerMethods, true);
if($i !== false) { if ($i !== false) {
unset($managerMethods[$i]); unset($managerMethods[$i]);
} }
} }
@ -254,9 +257,9 @@ class Session extends \PHPUnit_Framework_TestCase {
//keep following methods intact in order to ensure hooks are //keep following methods intact in order to ensure hooks are
//working //working
$doNotMock = array('__construct', 'emit', 'listen'); $doNotMock = array('__construct', 'emit', 'listen');
foreach($doNotMock as $methodName) { foreach ($doNotMock as $methodName) {
$i = array_search($methodName, $managerMethods, true); $i = array_search($methodName, $managerMethods, true);
if($i !== false) { if ($i !== false) {
unset($managerMethods[$i]); unset($managerMethods[$i]);
} }
} }
@ -296,9 +299,9 @@ class Session extends \PHPUnit_Framework_TestCase {
//keep following methods intact in order to ensure hooks are //keep following methods intact in order to ensure hooks are
//working //working
$doNotMock = array('__construct', 'emit', 'listen'); $doNotMock = array('__construct', 'emit', 'listen');
foreach($doNotMock as $methodName) { foreach ($doNotMock as $methodName) {
$i = array_search($methodName, $managerMethods, true); $i = array_search($methodName, $managerMethods, true);
if($i !== false) { if ($i !== false) {
unset($managerMethods[$i]); unset($managerMethods[$i]);
} }
} }
@ -327,4 +330,31 @@ class Session extends \PHPUnit_Framework_TestCase {
$this->assertSame($granted, false); $this->assertSame($granted, false);
} }
public function testActiveUserAfterSetSession() {
$users = array(
'foo' => new User('foo', null),
'bar' => new User('bar', null)
);
$manager = $this->getMockBuilder('\OC\User\Manager')
->disableOriginalConstructor()
->getMock();
$manager->expects($this->any())
->method('get')
->will($this->returnCallback(function ($uid) use ($users) {
return $users[$uid];
}));
$session = new Memory('');
$session->set('user_id', 'foo');
$userSession = new \OC\User\Session($manager, $session);
$this->assertEquals($users['foo'], $userSession->getUser());
$session2 = new Memory('');
$session2->set('user_id', 'bar');
$userSession->setSession($session2);
$this->assertEquals($users['bar'], $userSession->getUser());
}
} }