Skip to content

Commit 77c2867

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

File tree

3 files changed

+116
-9
lines changed

3 files changed

+116
-9
lines changed
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 string $name,
17+
private 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: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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+
/**
22+
* @psalm-suppress UndefinedClass
23+
*/
24+
class AlternativeLoginProvider implements IAlternativeLoginProvider {
25+
public function __construct(
26+
private IRequest $request,
27+
private IUrlGenerator $urlGenerator,
28+
private ProviderMapper $providerMapper,
29+
private IConfig $config,
30+
private IL10N $l10n,
31+
private ID4MeService $id4MeService,
32+
) {
33+
}
34+
35+
public function getAlternativeLogin(): array {
36+
$alternativeLogins = [];
37+
$redirectUrl = $this->request->getParam('redirect_url');
38+
$absoluteRedirectUrl = !empty($redirectUrl) ? $this->urlGenerator->getAbsoluteURL($redirectUrl) : $redirectUrl;
39+
$providers = $this->providerMapper->getProviders();
40+
$customLoginLabel = $this->config->getSystemValue('user_oidc', [])['login_label'] ?? '';
41+
foreach ($providers as $provider) {
42+
$alternativeLogins[] = new AlternativeLogin(
43+
$customLoginLabel
44+
? preg_replace('/{name}/', $provider->getIdentifier(), $customLoginLabel)
45+
: $this->l10n->t('Login with %1s', [$provider->getIdentifier()]),
46+
$this->urlGenerator->linkToRoute(Application::APP_ID . '.login.login', ['providerId' => $provider->getId(), 'redirectUrl' => $absoluteRedirectUrl]),
47+
);
48+
}
49+
50+
if ($this->id4MeService->getID4ME()) {
51+
$alternativeLogins[] = new AlternativeLogin(
52+
'ID4ME',
53+
$this->urlGenerator->linkToRoute(Application::APP_ID . '.id4me.login'),
54+
);
55+
}
56+
57+
return $alternativeLogins;
58+
}
59+
}

lib/AppInfo/Application.php

Lines changed: 22 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,14 @@ 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+
/**
77+
* @psalm-suppress UndefinedInterfaceMethod
78+
* @psalm-suppress MissingDependency
79+
*/
80+
$context->registerAlternativeLoginProvider(AlternativeLoginProvider::class);
81+
}
7382
}
7483

7584
public function boot(IBootContext $context): void {
@@ -83,7 +92,9 @@ public function boot(IBootContext $context): void {
8392

8493
try {
8594
$context->injectFn(\Closure::fromCallable([$this, 'registerRedirect']));
86-
$context->injectFn(\Closure::fromCallable([$this, 'registerLogin']));
95+
if (version_compare($this->getContainer()->get(IConfig::class)->getSystemValueString('version', '0.0.0'), '34.0.0', '<')) {
96+
$context->injectFn(\Closure::fromCallable([$this, 'registerLogin']));
97+
}
8798
} catch (Throwable $e) {
8899
}
89100
}
@@ -93,7 +104,6 @@ private function checkLoginToken(TokenService $tokenService): void {
93104
}
94105

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

@@ -104,13 +114,16 @@ private function registerRedirect(IRequest $request, IURLGenerator $urlGenerator
104114
} catch (Exception $e) {
105115
// in case any errors happen when checking for the path do not apply redirect logic as it is only needed for the login
106116
}
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();
117+
if ($isDefaultLogin && !$settings->getAllowMultipleUserBackEnds()) {
118+
$providers = $this->getCachedProviders($providerMapper);
119+
if (count($providers) === 1) {
120+
$targetUrl = $urlGenerator->linkToRoute(self::APP_ID . '.login.login', [
121+
'providerId' => $providers[0]->getId(),
122+
'redirectUrl' => $absoluteRedirectUrl
123+
]);
124+
header('Location: ' . $targetUrl);
125+
exit();
126+
}
114127
}
115128
}
116129

0 commit comments

Comments
 (0)