diff options
author | Morris Jobke <hey@morrisjobke.de> | 2021-01-22 18:26:17 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-22 18:26:17 +0300 |
commit | 1d2707ad782876482354c2dbc1f6b396b0954043 (patch) | |
tree | 0e61b7d9846fad07dfdc7e303cf2b955d1d66cd6 /apps | |
parent | 47b10c3775cf3d431ec8375285c1c607e209bc96 (diff) | |
parent | 378f116a63ede40b685518641c5333945f78a918 (diff) |
Merge pull request #25273 from nextcloud/enhancement/hide-two-factor-settings-if-no-providers
Do not show 2FA settings if the user has no providers available
Diffstat (limited to 'apps')
-rw-r--r-- | apps/settings/lib/Settings/Personal/Security/TwoFactor.php | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/apps/settings/lib/Settings/Personal/Security/TwoFactor.php b/apps/settings/lib/Settings/Personal/Security/TwoFactor.php index ca20274b33d..61f249a3181 100644 --- a/apps/settings/lib/Settings/Personal/Security/TwoFactor.php +++ b/apps/settings/lib/Settings/Personal/Security/TwoFactor.php @@ -26,6 +26,9 @@ declare(strict_types=1); namespace OCA\Settings\Settings\Personal\Security; +use Exception; +use OC\Authentication\TwoFactorAuth\MandatoryTwoFactor; +use OCA\TwoFactorBackupCodes\Provider\BackupCodesProvider; use function array_filter; use function array_map; use function is_null; @@ -42,6 +45,9 @@ class TwoFactor implements ISettings { /** @var ProviderLoader */ private $providerLoader; + /** @var MandatoryTwoFactor */ + private $mandatoryTwoFactor; + /** @var IUserSession */ private $userSession; @@ -52,10 +58,12 @@ class TwoFactor implements ISettings { private $config; public function __construct(ProviderLoader $providerLoader, + MandatoryTwoFactor $mandatoryTwoFactor, IUserSession $userSession, IConfig $config, ?string $UserId) { $this->providerLoader = $providerLoader; + $this->mandatoryTwoFactor = $mandatoryTwoFactor; $this->userSession = $userSession; $this->uid = $UserId; $this->config = $config; @@ -68,7 +76,10 @@ class TwoFactor implements ISettings { ]); } - public function getSection(): string { + public function getSection(): ?string { + if (!$this->shouldShow()) { + return null; + } return 'security'; } @@ -76,6 +87,35 @@ class TwoFactor implements ISettings { return 15; } + private function shouldShow(): bool { + $user = $this->userSession->getUser(); + if (is_null($user)) { + // Actually impossible, but still … + return false; + } + + // Anyone who's supposed to use 2FA should see 2FA settings + if ($this->mandatoryTwoFactor->isEnforcedFor($user)) { + return true; + } + + // If there is at least one provider with personal settings but it's not + // the backup codes provider, then these settings should show. + try { + $providers = $this->providerLoader->getProviders($user); + } catch (Exception $e) { + // Let's hope for the best + return true; + } + foreach ($providers as $provider) { + if ($provider instanceof IProvidesPersonalSettings + && !($provider instanceof BackupCodesProvider)) { + return true; + } + } + return false; + } + private function getTwoFactorProviderData(): array { $user = $this->userSession->getUser(); if (is_null($user)) { |