mirror of
https://github.com/nextcloud/server.git
synced 2026-03-04 18:28:08 +01:00
Fix undefined class property access after upgrade from 19 to 20
The serialized data in 19 has one property less and this was not considered in the code. Hence adding a fallback. Moreover I'm changing the deserialization into an array instead of object, as that is the safer option. Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
This commit is contained in:
@@ -111,8 +111,13 @@ class Store implements IStore {
|
||||
}
|
||||
|
||||
if ($trySession && $this->session->exists('login_credentials')) {
|
||||
$creds = json_decode($this->session->get('login_credentials'));
|
||||
return new Credentials($creds->uid, $creds->loginName, $creds->password);
|
||||
/** @var array $creds */
|
||||
$creds = json_decode($this->session->get('login_credentials'), true);
|
||||
return new Credentials(
|
||||
$creds['uid'],
|
||||
$creds['loginName'] ?? $this->session->get('loginname') ?? $creds['uid'], // Pre 20 didn't have a loginName property, hence fall back to the session value and then to the UID
|
||||
$creds['password']
|
||||
);
|
||||
}
|
||||
|
||||
// If we reach this line, an exception was thrown.
|
||||
|
||||
@@ -35,6 +35,7 @@ use OCP\ILogger;
|
||||
use OCP\ISession;
|
||||
use OCP\Session\Exceptions\SessionNotAvailableException;
|
||||
use Test\TestCase;
|
||||
use function json_encode;
|
||||
|
||||
class StoreTest extends TestCase {
|
||||
|
||||
@@ -140,6 +141,81 @@ class StoreTest extends TestCase {
|
||||
$this->store->getLoginCredentials();
|
||||
}
|
||||
|
||||
public function testGetLoginCredentialsPartialCredentialsAndSessionName() {
|
||||
$uid = 'id987';
|
||||
$user = 'user987';
|
||||
$password = '7389374';
|
||||
|
||||
$this->session->expects($this->once())
|
||||
->method('getId')
|
||||
->willReturn('sess2233');
|
||||
$this->tokenProvider->expects($this->once())
|
||||
->method('getToken')
|
||||
->with('sess2233')
|
||||
->will($this->throwException(new InvalidTokenException()));
|
||||
$this->session->expects($this->once())
|
||||
->method('exists')
|
||||
->with($this->equalTo('login_credentials'))
|
||||
->willReturn(true);
|
||||
$this->session->expects($this->exactly(2))
|
||||
->method('get')
|
||||
->willReturnMap([
|
||||
[
|
||||
'login_credentials',
|
||||
json_encode([
|
||||
'uid' => $uid,
|
||||
'password' => $password,
|
||||
])
|
||||
],
|
||||
[
|
||||
'loginname',
|
||||
$user,
|
||||
],
|
||||
]);
|
||||
$expected = new Credentials($uid, $user, $password);
|
||||
|
||||
$actual = $this->store->getLoginCredentials();
|
||||
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
public function testGetLoginCredentialsPartialCredentials() {
|
||||
$uid = 'id987';
|
||||
$password = '7389374';
|
||||
|
||||
$this->session->expects($this->once())
|
||||
->method('getId')
|
||||
->willReturn('sess2233');
|
||||
$this->tokenProvider->expects($this->once())
|
||||
->method('getToken')
|
||||
->with('sess2233')
|
||||
->will($this->throwException(new InvalidTokenException()));
|
||||
$this->session->expects($this->once())
|
||||
->method('exists')
|
||||
->with($this->equalTo('login_credentials'))
|
||||
->willReturn(true);
|
||||
$this->session->expects($this->exactly(2))
|
||||
->method('get')
|
||||
->willReturnMap([
|
||||
[
|
||||
'login_credentials',
|
||||
json_encode([
|
||||
'uid' => $uid,
|
||||
'password' => $password,
|
||||
])
|
||||
],
|
||||
[
|
||||
'loginname',
|
||||
null,
|
||||
],
|
||||
]);
|
||||
$expected = new Credentials($uid, $uid, $password);
|
||||
|
||||
$actual = $this->store->getLoginCredentials();
|
||||
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
public function testGetLoginCredentialsInvalidTokenLoginCredentials() {
|
||||
$uid = 'id987';
|
||||
$user = 'user987';
|
||||
|
||||
Reference in New Issue
Block a user