Skip to content

Commit 1d899b2

Browse files
authored
Merge pull request #1123 from nextcloud/fix/noid/gss-session-data
Set the gss session data in the controller rather than in the service
2 parents ecf80f8 + aaf0904 commit 1d899b2

3 files changed

Lines changed: 24 additions & 9 deletions

File tree

lib/Controller/LoginController.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,9 @@ public function code(string $state = '', string $code = '', string $scope = '',
533533
return $this->build403TemplateResponse($message, Http::STATUS_BAD_REQUEST, ['reason' => 'non-soft auto provision, user conflict'], false);
534534
}
535535
// use potential user from other backend, create it in our backend if it does not exist
536-
$user = $this->provisioningService->provisionUser($userId, $providerId, $idTokenPayload, $userFromOtherBackend);
536+
$provisioningResult = $this->provisioningService->provisionUser($userId, $providerId, $idTokenPayload, $userFromOtherBackend);
537+
$user = $provisioningResult['user'];
538+
$this->session->set('user_oidc.oidcUserData', $provisioningResult['userData']);
537539
} else {
538540
// when auto provision is disabled, we assume the user has been created by another user backend (or manually)
539541
$user = $userFromOtherBackend;

lib/Service/ProvisioningService.php

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use OCA\UserOIDC\Db\UserMapper;
1414
use OCA\UserOIDC\Event\AttributeMappedEvent;
1515
use OCP\Accounts\IAccountManager;
16+
use OCP\Accounts\PropertyDoesNotExistException;
1617
use OCP\AppFramework\Db\DoesNotExistException;
1718
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
1819
use OCP\DB\Exception;
@@ -26,6 +27,7 @@
2627
use OCP\IUser;
2728
use OCP\IUserManager;
2829
use OCP\L10N\IFactory;
30+
use OCP\PreConditionNotMetException;
2931
use OCP\User\Events\UserChangedEvent;
3032
use Psr\Log\LoggerInterface;
3133
use Throwable;
@@ -104,15 +106,18 @@ public function getClaimValue(object|array $tokenPayload, string $claimPath, int
104106

105107
return null;
106108
}
109+
107110
/**
108111
* @param string $tokenUserId
109112
* @param int $providerId
110113
* @param object $idTokenPayload
111114
* @param IUser|null $existingLocalUser
112-
* @return IUser|null
115+
* @return array{user: ?IUser, userData: array}
113116
* @throws Exception
117+
* @throws PropertyDoesNotExistException
118+
* @throws PreConditionNotMetException
114119
*/
115-
public function provisionUser(string $tokenUserId, int $providerId, object $idTokenPayload, ?IUser $existingLocalUser = null): ?IUser {
120+
public function provisionUser(string $tokenUserId, int $providerId, object $idTokenPayload, ?IUser $existingLocalUser = null): array {
116121
// user data potentially later used by globalsiteselector if user_oidc is used with global scale
117122
$oidcGssUserData = get_object_vars($idTokenPayload);
118123

@@ -191,15 +196,21 @@ public function provisionUser(string $tokenUserId, int $providerId, object $idTo
191196
$isUserCreationDisabled = isset($oidcSystemConfig['disable_account_creation'])
192197
&& in_array($oidcSystemConfig['disable_account_creation'], [true, 'true', 1, '1'], true);
193198
if ($isUserCreationDisabled) {
194-
return null;
199+
return [
200+
'user' => null,
201+
'userData' => $oidcGssUserData,
202+
];
195203
}
196204

197205
$backendUser = $this->userMapper->getOrCreate($providerId, $event->getValue() ?? '');
198206
$this->logger->debug('User obtained from the OIDC user backend: ' . $backendUser->getUserId());
199207

200208
$user = $this->userManager->get($backendUser->getUserId());
201209
if ($user === null) {
202-
return null;
210+
return [
211+
'user' => null,
212+
'userData' => $oidcGssUserData,
213+
];
203214
}
204215
}
205216

@@ -413,8 +424,6 @@ public function provisionUser(string $tokenUserId, int $providerId, object $idTo
413424
$account->setProperty('gender', $event->getValue(), $fallbackScope, '1', '');
414425
}
415426

416-
$this->session->set('user_oidc.oidcUserData', $oidcGssUserData);
417-
418427
while (true) {
419428
try {
420429
$this->accountManager->updateAccount($account);
@@ -432,7 +441,10 @@ public function provisionUser(string $tokenUserId, int $providerId, object $idTo
432441
throw $e;
433442
}
434443
}
435-
return $user;
444+
return [
445+
'user' => $user,
446+
'userData' => $oidcGssUserData,
447+
];
436448
}
437449

438450
/**

lib/User/Provisioning/SelfEncodedTokenProvisioning.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public function provisionUser(Provider $provider, string $tokenUserId, string $b
3434
return null;
3535
}
3636

37-
return $this->provisioningService->provisionUser($tokenUserId, $provider->getId(), $payload, $userFromOtherBackend);
37+
$provisioningResult = $this->provisioningService->provisionUser($tokenUserId, $provider->getId(), $payload, $userFromOtherBackend);
38+
return $provisioningResult['user'];
3839
}
3940
}

0 commit comments

Comments
 (0)