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:
commit
6fa03870e9
|
@ -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 . '/');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue