summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2021-01-20 14:59:30 +0100
committerGitHub <noreply@github.com>2021-01-20 14:59:30 +0100
commit6129a851873287dde1f922b9d6f3aa4624a07133 (patch)
treeac2eeda3d47743daf5e7b4bcf3dec1c79a9eda75
parent2c9345a3c674c333e863c21ca249cb336c91fbff (diff)
parent1e35ece8e59ed31c0ae7a578aced99d257e97e67 (diff)
downloadnextcloud-server-6129a851873287dde1f922b9d6f3aa4624a07133.tar.gz
nextcloud-server-6129a851873287dde1f922b9d6f3aa4624a07133.zip
Merge pull request #25224 from nextcloud/bugfix/24600/fix-saving-user-credentials
Update handling of user credentials
-rw-r--r--apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php5
-rw-r--r--apps/files_external/lib/Listener/StorePasswordListener.php8
-rw-r--r--lib/private/Server.php2
-rw-r--r--lib/public/User/Events/UserLoggedInEvent.php13
4 files changed, 24 insertions, 4 deletions
diff --git a/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php b/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php
index 6bf6b61f164..b8279f5ca61 100644
--- a/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php
+++ b/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php
@@ -79,6 +79,11 @@ class LoginCredentials extends AuthMechanism {
try {
$sessionCredentials = $this->credentialsStore->getLoginCredentials();
+ if ($sessionCredentials->getUID() !== $user->getUID()) {
+ // Can't take the credentials from the session as they are not the same user
+ throw new CredentialsUnavailableException();
+ }
+
$credentials = [
'user' => $sessionCredentials->getLoginName(),
'password' => $sessionCredentials->getPassword()
diff --git a/apps/files_external/lib/Listener/StorePasswordListener.php b/apps/files_external/lib/Listener/StorePasswordListener.php
index 3212f2a48c7..27de4ada465 100644
--- a/apps/files_external/lib/Listener/StorePasswordListener.php
+++ b/apps/files_external/lib/Listener/StorePasswordListener.php
@@ -51,10 +51,14 @@ class StorePasswordListener implements IEventListener {
}
$stored = $this->credentialsManager->retrieve($event->getUser()->getUID(), LoginCredentials::CREDENTIALS_IDENTIFIER);
+ $update = isset($stored['password']) && $stored['password'] !== $event->getPassword();
+ if (!$update && $event instanceof UserLoggedInEvent) {
+ $update = isset($stored['user']) && $stored['user'] !== $event->getLoginName();
+ }
- if ($stored && $stored['password'] !== $event->getPassword()) {
+ if ($stored && $update) {
$credentials = [
- 'user' => $stored['user'],
+ 'user' => $event->getLoginName(),
'password' => $event->getPassword()
];
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 1114e60f475..ba954165799 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -575,7 +575,7 @@ class Server extends ServerContainer implements IServerContainer {
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this->get(IEventDispatcher::class);
- $dispatcher->dispatchTyped(new UserLoggedInEvent($user, $password, $isTokenLogin));
+ $dispatcher->dispatchTyped(new UserLoggedInEvent($user, $loginName, $password, $isTokenLogin));
});
$userSession->listen('\OC\User', 'preRememberedLogin', function ($uid) {
/** @var IEventDispatcher $dispatcher */
diff --git a/lib/public/User/Events/UserLoggedInEvent.php b/lib/public/User/Events/UserLoggedInEvent.php
index e2cb37a64dc..7d0c0bf41de 100644
--- a/lib/public/User/Events/UserLoggedInEvent.php
+++ b/lib/public/User/Events/UserLoggedInEvent.php
@@ -43,14 +43,18 @@ class UserLoggedInEvent extends Event {
/** @var bool */
private $isTokenLogin;
+ /** @var string */
+ private $loginName;
+
/**
* @since 18.0.0
*/
- public function __construct(IUser $user, string $password, bool $isTokenLogin) {
+ public function __construct(IUser $user, string $loginName, string $password, bool $isTokenLogin) {
parent::__construct();
$this->user = $user;
$this->password = $password;
$this->isTokenLogin = $isTokenLogin;
+ $this->loginName = $loginName;
}
/**
@@ -61,6 +65,13 @@ class UserLoggedInEvent extends Event {
}
/**
+ * @since 21.0.0
+ */
+ public function getLoginName(): string {
+ return $this->loginName;
+ }
+
+ /**
* @since 18.0.0
*/
public function getPassword(): string {