| phpMyFAQ\Auth\AuthWebAuthn::register | 597.01 | 16.2% |
| phpMyFAQ\Auth\WebAuthn\PublicKeyConverter::fromCoseToPkcs | 197.69 | 49.0% |
| phpMyFAQ\Auth\OAuth2\Repository\UserRepository::getUserEntityByUserCredentials | 43.05 | 18.2% |
| phpMyFAQ\Auth\AuthWebAuthn::authenticate | 32.29 | 80.6% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::validateClaims | 31 | 97.5% |
| phpMyFAQ\Auth\AuthLdap::checkCredentials | 20.36 | 84.4% |
| phpMyFAQ\Auth\OAuth2\AuthorizationServer::completeAuthorization | 17.58 | 40.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::findKey | 15.38 | 57.1% |
| phpMyFAQ\Auth\OAuth2\ResourceServer::authenticate | 14.86 | 58.3% |
| phpMyFAQ\Auth\AuthKeycloak::assignUserToGroups | 12.39 | 86.1% |
| phpMyFAQ\Auth\OAuth2\AuthorizationServer::issueToken | 11.76 | 61.1% |
| phpMyFAQ\Auth\EntraId\JwksProvider::loadJwks | 11 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::extractRoleNames | 10.20 | 87.5% |
| phpMyFAQ\Auth\AuthDatabase::checkCredentials | 10.06 | 91.7% |
| phpMyFAQ\Auth\EntraId\OAuth::setToken | 9 | 100.0% |
| phpMyFAQ\Auth\AuthLdap::create | 8 | 100.0% |
| phpMyFAQ\Auth\AuthWebAuthn::prepareForLogin | 8 | 96.9% |
| phpMyFAQ\Auth\Keycloak\KeycloakProviderConfigFactory::create | 8 | 96.4% |
| phpMyFAQ\Auth\OAuth2\Repository\ClientRepository::validateClient | 8 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcDiscoveryDocument::fromArray | 8 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::isValidAudience | 7.77 | 75.0% |
| phpMyFAQ\Auth\AuthKeycloak::getGroupMapping | 6.56 | 75.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::audienceMatches | 6.56 | 75.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::validateSignature | 6.10 | 85.7% |
| phpMyFAQ\Auth\ApiKeyAuthenticator::authenticate | 6.01 | 94.7% |
| phpMyFAQ\Auth\AuthKeycloak::create | 6 | 100.0% |
| phpMyFAQ\Auth\AuthLdap::assignUserToGroups | 6 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\AccessTokenRepository::persistNewAccessToken | 6 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::fetchJwks | 5.73 | 69.2% |
| phpMyFAQ\Auth\EntraId\OAuth::getOAuthToken | 5.01 | 92.6% |
| phpMyFAQ\Auth\AuthChain::authenticate | 5 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::checkCredentials | 5 | 100.0% |
| phpMyFAQ\Auth\AuthSso::checkCredentials | 5 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\AccessTokenRepository::getNewToken | 5 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\AuthCodeRepository::persistNewAuthCode | 5 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\ClientRepository::getClientEntity | 5 | 95.8% |
| phpMyFAQ\Auth\Oidc\OidcClient::buildLogoutUrl | 5 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcClient::decodeJsonResponse | 5 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcDiscoveryService::discover | 5 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::splitToken | 5 | 100.0% |
| phpMyFAQ\Auth\AuthLdap::isValidLogin | 4.68 | 42.9% |
| phpMyFAQ\Auth\ApiKeyAuthenticator::parseScopes | 4.59 | 66.7% |
| phpMyFAQ\Auth\AuthEntraId::create | 4.31 | 16.7% |
| phpMyFAQ\Auth\ApiKeyAuthenticator::isNotExpired | 4.07 | 83.3% |
| phpMyFAQ\Auth\AuthDatabase::delete | 4.05 | 85.7% |
| phpMyFAQ\Auth\AuthDatabase::update | 4.04 | 86.7% |
| phpMyFAQ\Auth\AuthDatabase::create | 4.03 | 87.5% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::decodeSegment | 4.02 | 90.0% |
| phpMyFAQ\Auth\AuthEntraId::createOAuthChallenge | 4 | 100.0% |
| phpMyFAQ\Auth\AuthHttp::checkCredentials | 4 | 100.0% |
| phpMyFAQ\Auth\EntraId\EntraIdSession::setCookie | 4 | 100.0% |
| phpMyFAQ\Auth\Keycloak\KeycloakProviderConfigFactory::toBool | 4 | 100.0% |
| phpMyFAQ\Auth\OAuth2\AuthorizationServer::isEnabled | 4 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\ScopeRepository::getScopeEntityByIdentifier | 4.00 | 94.1% |
| phpMyFAQ\Auth\OAuth2\ResourceServer::isEnabled | 4 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcClient::exchangeAuthorizationCode | 4 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::createPemFromJwk | 4.00 | 94.4% |
| phpMyFAQ\Auth\Oidc\OidcPkceGenerator::generateVerifier | 4 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcPkceGenerator::generateChallenge | 4 | 100.0% |
| phpMyFAQ\Auth\AuthWebAuthn::idList | 3.33 | 66.7% |
| phpMyFAQ\Auth\Keycloak\KeycloakProviderConfigFactory::buildDiscoveryUrl | 3.33 | 66.7% |
| phpMyFAQ\Auth\AuthKeycloak::createUser | 3.07 | 80.0% |
| phpMyFAQ\Auth\AuthKeycloak::createMediumPermission | 3.07 | 80.0% |
| phpMyFAQ\Auth\AuthLdap::createMediumPermission | 3.07 | 80.0% |
| phpMyFAQ\Auth\AuthSso::createLdapAuth | 3.07 | 80.0% |
| phpMyFAQ\Auth\AuthSso::createUser | 3.07 | 80.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::asn1Integer | 3.07 | 80.0% |
| phpMyFAQ\Auth\EntraId\JwksProvider::writeCache | 3.01 | 90.0% |
| phpMyFAQ\Auth\AuthKeycloak::getDisplayName | 3 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::redactIdentifier | 3 | 100.0% |
| phpMyFAQ\Auth\AuthLdap::createUser | 3 | 100.0% |
| phpMyFAQ\Auth\OAuth2\AuthorizationServer::buildLeagueAuthorizationServer | 3 | 100.0% |
| phpMyFAQ\Auth\OAuth2\AuthorizationServer::parseInterval | 3 | 100.0% |
| phpMyFAQ\Auth\OAuth2\AuthorizationServer::toPsr7Request | 3 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\AccessTokenRepository::isAccessTokenRevoked | 3 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\AuthCodeRepository::isAuthCodeRevoked | 3 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\RefreshTokenRepository::isRefreshTokenRevoked | 3 | 100.0% |
| phpMyFAQ\Auth\OAuth2\ResourceServer::toPsr7Request | 3 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::asn1Length | 3 | 100.0% |
| phpMyFAQ\Auth\WebAuthn\PublicKeyConverter::publicKeyToPem | 3 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::getCurrentTimestamp | 2.15 | 66.7% |
| phpMyFAQ\Auth\EntraId\EntraIdSession::setCurrentSessionKey | 2.06 | 75.0% |
| phpMyFAQ\Auth\EntraId\JwksProvider::__construct | 2.02 | 83.3% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::base64UrlDecode | 2.02 | 83.3% |
| phpMyFAQ\Auth\ApiKeyAuthenticator::hasRequiredScopes | 2.01 | 85.7% |
| phpMyFAQ\Auth\AuthDatabase::isValidLogin | 2.01 | 87.5% |
| phpMyFAQ\Auth\ApiKeyAuthenticator::getAuthenticatedUserId | 2 | 100.0% |
| phpMyFAQ\Auth\AuthEntraId::isValidLogin | 2 | 100.0% |
| phpMyFAQ\Auth\AuthHttp::isValidLogin | 2 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::isValidLogin | 2 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::findUser | 2 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::shouldAssignGroups | 2 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::shouldSynchronizeGroupsOnLogin | 2 | 100.0% |
| phpMyFAQ\Auth\AuthLdap::__construct | 2 | 100.0% |
| phpMyFAQ\Auth\AuthLdap::extractGroupNameFromDn | 2 | 100.0% |
| phpMyFAQ\Auth\AuthLdap::connect | 2 | 100.0% |
| phpMyFAQ\Auth\AuthSso::create | 2 | 100.0% |
| phpMyFAQ\Auth\AuthSso::isValidLogin | 2 | 100.0% |
| phpMyFAQ\Auth\AuthWebAuthn::prepareChallengeForRegistration | 2 | 100.0% |
| phpMyFAQ\Auth\AuthWebAuthn::getUserFromSession | 2 | 100.0% |
| phpMyFAQ\Auth\AuthWebAuthn::decodeSignedClientData | 2 | 100.0% |
| phpMyFAQ\Auth\AuthWebAuthn::byteString | 2 | 100.0% |
| phpMyFAQ\Auth\EntraId\EntraIdSession::getCurrentSessionKey | 2 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::setJwksProvider | 2 | 0.0% |
| phpMyFAQ\Auth\OAuth2\AuthorizationServer::getConfigString | 2 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Entity\ClientEntity::supportsGrantType | 2 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\RefreshTokenRepository::persistNewRefreshToken | 2 | 100.0% |
| phpMyFAQ\Auth\OAuth2\ResourceServer::getConfigString | 2 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::validate | 2 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::normalizeKey | 2 | 100.0% |
| phpMyFAQ\Auth\PasswordHasher::verify | 2 | 100.0% |
| phpMyFAQ\Auth\PasswordHasher::needsRehash | 2 | 100.0% |
| phpMyFAQ\Auth\AuthEntraId::checkCredentials | 1.12 | 50.0% |
| phpMyFAQ\Auth\ApiKeyAuthenticator::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\ApiKeyAuthenticator::getAuthenticatedApiKey | 1 | 100.0% |
| phpMyFAQ\Auth\AuthChain::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\AuthChain::setOAuth2Authenticator | 1 | 100.0% |
| phpMyFAQ\Auth\AuthChain::getAuthenticatedUserId | 1 | 100.0% |
| phpMyFAQ\Auth\AuthChain::getAuthSource | 1 | 100.0% |
| phpMyFAQ\Auth\AuthDatabase::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\AuthDatabase::rehash | 1 | 100.0% |
| phpMyFAQ\Auth\AuthEntraId::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\AuthEntraId::update | 1 | 100.0% |
| phpMyFAQ\Auth\AuthEntraId::delete | 1 | 100.0% |
| phpMyFAQ\Auth\AuthEntraId::authorize | 1 | 100.0% |
| phpMyFAQ\Auth\AuthEntraId::logout | 1 | 100.0% |
| phpMyFAQ\Auth\AuthHttp::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\AuthHttp::create | 1 | 100.0% |
| phpMyFAQ\Auth\AuthHttp::update | 1 | 100.0% |
| phpMyFAQ\Auth\AuthHttp::delete | 1 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::update | 1 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::delete | 1 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::getEmail | 1 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::getSubject | 1 | 100.0% |
| phpMyFAQ\Auth\AuthKeycloak::toBool | 1 | 100.0% |
| phpMyFAQ\Auth\AuthLdap::update | 1 | 100.0% |
| phpMyFAQ\Auth\AuthLdap::delete | 1 | 100.0% |
| phpMyFAQ\Auth\AuthSso::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\AuthSso::update | 1 | 100.0% |
| phpMyFAQ\Auth\AuthSso::delete | 1 | 100.0% |
| phpMyFAQ\Auth\AuthWebAuthn::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\AuthWebAuthn::storeUserInSession | 1 | 100.0% |
| phpMyFAQ\Auth\AuthWebAuthn::setAppId | 1 | 100.0% |
| phpMyFAQ\Auth\AuthWebAuthn::arrayToString | 1 | 100.0% |
| phpMyFAQ\Auth\AuthWebAuthn::stringToArray | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\EntraIdSession::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\EntraIdSession::createCurrentSessionKey | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\EntraIdSession::getCookie | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\JwksProvider::getKeys | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\JwksProvider::cacheFile | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::errorMessage | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::refreshToken | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::getToken | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::clearToken | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::getEntraIdSession | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::getRefreshToken | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::setRefreshToken | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::getAccessToken | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::setAccessToken | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::getName | 1 | 100.0% |
| phpMyFAQ\Auth\EntraId\OAuth::getMail | 1 | 100.0% |
| phpMyFAQ\Auth\Keycloak\KeycloakProviderConfigFactory::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\AuthorizationServer::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\AuthorizationServer::setTokenIssuer | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\AuthorizationServer::setAuthorizationCompleter | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Entity\ClientEntity::setName | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Entity\ClientEntity::setRedirectUri | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Entity\ClientEntity::setConfidential | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\AbstractRepository::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\AbstractRepository::db | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\AbstractRepository::table | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\AccessTokenRepository::revokeAccessToken | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\AuthCodeRepository::getNewAuthCode | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\AuthCodeRepository::revokeAuthCode | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\RefreshTokenRepository::getNewRefreshToken | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\RefreshTokenRepository::revokeRefreshToken | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\Repository\ScopeRepository::finalizeScopes | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\ResourceServer::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\OAuth2\ResourceServer::setTokenValidator | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcClient::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcClient::buildAuthorizationUrl | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcClient::fetchUserInfo | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcClientConfig::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcClientConfig::getScopesAsString | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcDiscoveryDocument::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcDiscoveryService::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::asn1Sequence | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::asn1ObjectIdentifier | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::asn1Null | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcIdTokenValidator::asn1BitString | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcProviderConfig::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcSession::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcSession::setAuthorizationState | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcSession::getAuthorizationState | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcSession::clearAuthorizationState | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcSession::setIdToken | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcSession::getIdToken | 1 | 100.0% |
| phpMyFAQ\Auth\Oidc\OidcSession::clearIdToken | 1 | 100.0% |
| phpMyFAQ\Auth\PasswordHasher::__construct | 1 | 100.0% |
| phpMyFAQ\Auth\PasswordHasher::hash | 1 | 100.0% |
| phpMyFAQ\Auth\PasswordHasher::isLegacyHash | 1 | 100.0% |
| phpMyFAQ\Auth\PasswordHasher::legacyHash | 1 | 100.0% |
| phpMyFAQ\Auth\WebAuthn\WebAuthnUser::getId | 1 | 100.0% |
| phpMyFAQ\Auth\WebAuthn\WebAuthnUser::setId | 1 | 100.0% |
| phpMyFAQ\Auth\WebAuthn\WebAuthnUser::getName | 1 | 100.0% |
| phpMyFAQ\Auth\WebAuthn\WebAuthnUser::setName | 1 | 100.0% |
| phpMyFAQ\Auth\WebAuthn\WebAuthnUser::getWebAuthnKeys | 1 | 100.0% |
| phpMyFAQ\Auth\WebAuthn\WebAuthnUser::setWebAuthnKeys | 1 | 100.0% |