]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fix undefined class property access after upgrade from 19 to 20 22641/head
authorChristoph Wurst <christoph@winzerhof-wurst.at>
Mon, 7 Sep 2020 09:21:16 +0000 (11:21 +0200)
committerChristoph Wurst <christoph@winzerhof-wurst.at>
Mon, 7 Sep 2020 11:31:24 +0000 (13:31 +0200)
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>
lib/private/Authentication/LoginCredentials/Store.php
tests/lib/Authentication/LoginCredentials/StoreTest.php

index 6dd7dc3fb738e48f0951f10c080d383a85ff4a5d..0a3b57b9c6c2cc20dff6c2c7b0589a08c90bdfe5 100644 (file)
@@ -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.
index 67cb0a18297f989818a53846529908f1b27f30fa..ad8a074660c7f8193413d5d5501ceddbaa5b0966 100644 (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';