From 36c6da6de620197d29c1ec4eeecd5772e82435ed Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 22 Jan 2021 12:00:32 +0100 Subject: [PATCH] Do not show 2FA settings if the user has no providers available Signed-off-by: Christoph Wurst --- .../Settings/Personal/Security/TwoFactor.php | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/apps/settings/lib/Settings/Personal/Security/TwoFactor.php b/apps/settings/lib/Settings/Personal/Security/TwoFactor.php index ca20274b33de5..30d8a40a8f611 100644 --- a/apps/settings/lib/Settings/Personal/Security/TwoFactor.php +++ b/apps/settings/lib/Settings/Personal/Security/TwoFactor.php @@ -26,6 +26,8 @@ namespace OCA\Settings\Settings\Personal\Security; +use Exception; +use OCA\TwoFactorBackupCodes\Provider\BackupCodesProvider; use function array_filter; use function array_map; use function is_null; @@ -69,6 +71,10 @@ public function getForm(): TemplateResponse { } public function getSection(): string { + if (!$this->shouldShow()) { + // TODO: this isn't nice, but it works. Look for ways to properly hide a setting conditionally + return ''; + } return 'security'; } @@ -76,6 +82,30 @@ public function getPriority(): int { return 15; } + private function shouldShow(): bool { + $user = $this->userSession->getUser(); + if (is_null($user)) { + // Actually impossible, but still … + return false; + } + try { + $providers = $this->providerLoader->getProviders($user); + } catch (Exception $e) { + // Let's hope for the best + 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. + 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)) {