Skip to content

Commit f853751

Browse files
committed
feat: Use new IAlternativeLoginProvider when available
Signed-off-by: Carl Schwan <carlschwan@kde.org>
1 parent 81a3f5c commit f853751

3 files changed

Lines changed: 109 additions & 9 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
7+
* SPDX-License-Identifier: AGPL-3.0-or-later
8+
*/
9+
10+
namespace OCA\UserOIDC\AlternativeLogin;
11+
12+
use OCP\Authentication\IAlternativeLogin;
13+
14+
class AlternativeLogin implements IAlternativeLogin {
15+
public function __construct(
16+
private readonly string $name,
17+
private readonly string $href,
18+
) {
19+
}
20+
21+
public function getLabel(): string {
22+
return $this->name;
23+
}
24+
25+
public function getLink(): string {
26+
return $this->href;
27+
}
28+
29+
public function getClass(): string {
30+
return '';
31+
}
32+
33+
public function load(): void {
34+
}
35+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
7+
* SPDX-License-Identifier: AGPL-3.0-or-later
8+
*/
9+
10+
namespace OCA\UserOIDC\AlternativeLogin;
11+
12+
use OCA\UserOIDC\AppInfo\Application;
13+
use OCA\UserOIDC\Db\ProviderMapper;
14+
use OCA\UserOIDC\Service\ID4MeService;
15+
use OCP\Authentication\IAlternativeLoginProvider;
16+
use OCP\IConfig;
17+
use OCP\IL10N;
18+
use OCP\IRequest;
19+
use OCP\IURLGenerator;
20+
21+
class AlternativeLoginProvider implements IAlternativeLoginProvider {
22+
public function __construct(
23+
private IRequest $request,
24+
private IUrlGenerator $urlGenerator,
25+
private ProviderMapper $providerMapper,
26+
private IConfig $config,
27+
private IL10N $l10n,
28+
private ID4MeService $id4MeService,
29+
) {
30+
}
31+
32+
public function getAlternativeLogin(): array {
33+
$alternativeLogins = [];
34+
$redirectUrl = $this->request->getParam('redirect_url');
35+
$absoluteRedirectUrl = !empty($redirectUrl) ? $this->urlGenerator->getAbsoluteURL($redirectUrl) : $redirectUrl;
36+
$providers = $this->providerMapper->getProviders();
37+
$customLoginLabel = $this->config->getSystemValue('user_oidc', [])['login_label'] ?? '';
38+
foreach ($providers as $provider) {
39+
$alternativeLogins[] = new AlternativeLogin(
40+
$customLoginLabel
41+
? preg_replace('/{name}/', $provider->getIdentifier(), $customLoginLabel)
42+
: $this->l10n->t('Login with %1s', [$provider->getIdentifier()]),
43+
$this->urlGenerator->linkToRoute(Application::APP_ID . '.login.login', ['providerId' => $provider->getId(), 'redirectUrl' => $absoluteRedirectUrl]),
44+
);
45+
}
46+
47+
if ($this->id4MeService->getID4ME()) {
48+
$alternativeLogins[] = new AlternativeLogin(
49+
'ID4ME',
50+
$this->urlGenerator->linkToRoute(Application::APP_ID . '.id4me.login'),
51+
);
52+
}
53+
54+
return $alternativeLogins;
55+
}
56+
}

lib/AppInfo/Application.php

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Exception;
1212
use OC_App;
1313
use OCA\Files\Event\LoadAdditionalScriptsEvent;
14+
use OCA\UserOIDC\AlternativeLogin\AlternativeLoginProvider;
1415
use OCA\UserOIDC\Db\ProviderMapper;
1516
use OCA\UserOIDC\Event\ExchangedTokenRequestedEvent;
1617
use OCA\UserOIDC\Event\ExternalTokenRequestedEvent;
@@ -70,6 +71,10 @@ public function register(IRegistrationContext $context): void {
7071
if (class_exists(\OCP\Authentication\Events\TokenInvalidatedEvent::class)) {
7172
$context->registerEventListener(\OCP\Authentication\Events\TokenInvalidatedEvent::class, TokenInvalidatedListener::class);
7273
}
74+
75+
if (version_compare($config->getSystemValueString('version', '0.0.0'), '34.0.0', '>=')) {
76+
$context->registerAlternativeLoginProvider(AlternativeLoginProvider::class);
77+
}
7378
}
7479

7580
public function boot(IBootContext $context): void {
@@ -83,7 +88,9 @@ public function boot(IBootContext $context): void {
8388

8489
try {
8590
$context->injectFn(\Closure::fromCallable([$this, 'registerRedirect']));
86-
$context->injectFn(\Closure::fromCallable([$this, 'registerLogin']));
91+
if (version_compare($this->getContainer()->get(IConfig::class)->getSystemValueString('version', '0.0.0'), '34.0.0', '<')) {
92+
$context->injectFn(\Closure::fromCallable([$this, 'registerLogin']));
93+
}
8794
} catch (Throwable $e) {
8895
}
8996
}
@@ -93,7 +100,6 @@ private function checkLoginToken(TokenService $tokenService): void {
93100
}
94101

95102
private function registerRedirect(IRequest $request, IURLGenerator $urlGenerator, SettingsService $settings, ProviderMapper $providerMapper): void {
96-
$providers = $this->getCachedProviders($providerMapper);
97103
$redirectUrl = $request->getParam('redirect_url');
98104
$absoluteRedirectUrl = !empty($redirectUrl) ? $urlGenerator->getAbsoluteURL($redirectUrl) : $redirectUrl;
99105

@@ -104,13 +110,16 @@ private function registerRedirect(IRequest $request, IURLGenerator $urlGenerator
104110
} catch (Exception $e) {
105111
// in case any errors happen when checking for the path do not apply redirect logic as it is only needed for the login
106112
}
107-
if ($isDefaultLogin && !$settings->getAllowMultipleUserBackEnds() && count($providers) === 1) {
108-
$targetUrl = $urlGenerator->linkToRoute(self::APP_ID . '.login.login', [
109-
'providerId' => $providers[0]->getId(),
110-
'redirectUrl' => $absoluteRedirectUrl
111-
]);
112-
header('Location: ' . $targetUrl);
113-
exit();
113+
if ($isDefaultLogin && !$settings->getAllowMultipleUserBackEnds()) {
114+
$providers = $this->getCachedProviders($providerMapper);
115+
if (count($providers) === 1) {
116+
$targetUrl = $urlGenerator->linkToRoute(self::APP_ID . '.login.login', [
117+
'providerId' => $providers[0]->getId(),
118+
'redirectUrl' => $absoluteRedirectUrl
119+
]);
120+
header('Location: ' . $targetUrl);
121+
exit();
122+
}
114123
}
115124
}
116125

0 commit comments

Comments
 (0)