providers[$provider->getIdentifier()] = $provider; } public function hasProvider(string $identifier): bool { return isset($this->providers[$identifier]); } public function hasProviders(): bool { return $this->providers !== []; } public function getProvider(string $identifier): MfaProviderManifestInterface { if (!$this->hasProvider($identifier)) { throw new \InvalidArgumentException('No MFA provider for identifier ' . $identifier . ' found.', 1610994735); } return $this->providers[$identifier]; } public function getProviders(): array { return $this->providers; } /** * Whether the given user has active providers */ public function hasActiveProviders(AbstractUserAuthentication $user): bool { return $this->getActiveProviders($user) !== []; } /** * Get all active providers for the given user * * @return MfaProviderManifestInterface[] */ public function getActiveProviders(AbstractUserAuthentication $user): array { return array_filter($this->providers, static function (MfaProviderManifestInterface $provider) use ($user): bool { return $provider->isActive(MfaProviderPropertyManager::create($provider, $user)); }); } /** * Get the first provider for the user which can be used for authentication. * This is either the user specified default provider, or the first active * provider based on the providers configured ordering. * * @return MfaProviderManifestInterface */ public function getFirstAuthenticationAwareProvider(AbstractUserAuthentication $user): ?MfaProviderManifestInterface { $activeProviders = $this->getActiveProviders($user); // If the user did not activate any provider yet, authentication is not possible if ($activeProviders === []) { return null; } // Check if the user has chosen a default (preferred) provider, which is still active $defaultProvider = (string)($user->uc['mfa']['defaultProvider'] ?? ''); if ($defaultProvider !== '' && isset($activeProviders[$defaultProvider])) { return $activeProviders[$defaultProvider]; } // If no default provider exists or is not valid, return the first active provider return array_shift($activeProviders); } /** * Whether the given user has locked providers */ public function hasLockedProviders(AbstractUserAuthentication $user): bool { return $this->getLockedProviders($user) !== []; } /** * Get all locked providers for the given user * * @return MfaProviderManifestInterface[] */ public function getLockedProviders(AbstractUserAuthentication $user): array { return array_filter($this->providers, static function (MfaProviderManifestInterface $provider) use ($user): bool { return $provider->isLocked(MfaProviderPropertyManager::create($provider, $user)); }); } public function allowedProvidersItemsProcFunc(array &$parameters): void { foreach ($this->providers as $provider) { $parameters['items'][] = [ 'label' => $provider->getTitle(), 'value' => $provider->getIdentifier(), 'icon' => $provider->getIconIdentifier(), 'description' => $provider->getDescription(), ]; } } }