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>
pull/22641/head
Christoph Wurst 5 years ago
parent 3eb748fc39
commit adf100a42f
No known key found for this signature in database
GPG Key ID: CC42AC2A7F0E56D8
  1. 9
      lib/private/Authentication/LoginCredentials/Store.php
  2. 76
      tests/lib/Authentication/LoginCredentials/StoreTest.php

@ -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';

Loading…
Cancel
Save