Merge pull request #22641 from nextcloud/fix/credentials-store-upgrade-property-undefined

Fix undefined class property access after upgrade from 19 to 20
This commit is contained in:
Roeland Jago Douma 2020-09-08 10:26:23 +02:00 committed by GitHub
commit ac5f2914c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 83 additions and 2 deletions

View File

@ -112,8 +112,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.

View File

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