blob: 41d09eaae8a2b67decc241231ad8e1f6ac47351b [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/device_bound_sessions/session_error.h"
#include "base/notreached.h"
namespace net::device_bound_sessions {
SessionError::SessionError(SessionError::ErrorType type) : type(type) {}
SessionError::~SessionError() = default;
SessionError::SessionError(SessionError&&) noexcept = default;
SessionError& SessionError::operator=(SessionError&&) noexcept = default;
std::optional<DeletionReason> SessionError::GetDeletionReason() const {
switch (type) {
case kSuccess:
return std::nullopt;
case kServerRequestedTermination:
return DeletionReason::kServerRequested;
case kKeyError:
case kSigningError:
case kPersistentHttpError:
case kInvalidChallenge:
case kTooManyChallenges:
return DeletionReason::kRefreshFatalError;
case kInvalidConfigJson:
case kInvalidSessionId:
case kInvalidCredentialsConfig:
case kInvalidCredentialsType:
case kInvalidCredentialsEmptyName:
case kInvalidCredentialsCookie:
case kInvalidCredentialsCookieCreationTime:
case kInvalidCredentialsCookieName:
case kInvalidCredentialsCookieParsing:
case kInvalidCredentialsCookieUnpermittedAttribute:
case kInvalidCredentialsCookieInvalidDomain:
case kInvalidCredentialsCookiePrefix:
case kInvalidFetcherUrl:
case kInvalidRefreshUrl:
case kScopeOriginSameSiteMismatch:
case kRefreshUrlSameSiteMismatch:
case kInvalidScopeOrigin:
case kScopeOriginContainsPath:
case kMismatchedSessionId:
case kRefreshInitiatorNotString:
case kRefreshInitiatorInvalidHostPattern:
case kInvalidScopeRulePath:
case kInvalidScopeRuleHostPattern:
case kScopeRuleOriginScopedHostPatternMismatch:
case kScopeRuleSiteScopedHostPatternMismatch:
case kInvalidScopeSpecification:
case kMissingScopeSpecificationType:
case kEmptyScopeSpecificationDomain:
case kEmptyScopeSpecificationPath:
case kInvalidScopeSpecificationType:
case kMissingScope:
case kNoCredentials:
case kInvalidScopeIncludeSite:
case kMissingScopeIncludeSite:
return DeletionReason::kInvalidSessionParams;
case kNetError:
case kProxyError:
case kTransientHttpError:
case kBoundCookieSetForbidden:
return std::nullopt;
// Registration-only errors never trigger session deletion.
case kSubdomainRegistrationWellKnownUnavailable:
case kSubdomainRegistrationUnauthorized:
case kSubdomainRegistrationWellKnownMalformed:
case kFederatedNotAuthorizedByProvider:
case kFederatedNotAuthorizedByRelyingParty:
case kSessionProviderWellKnownUnavailable:
case kSessionProviderWellKnownMalformed:
case kSessionProviderWellKnownHasProviderOrigin:
case kRelyingPartyWellKnownUnavailable:
case kRelyingPartyWellKnownMalformed:
case kRelyingPartyWellKnownHasRelyingOrigins:
case kFederatedKeyThumbprintMismatch:
case kInvalidFederatedSessionUrl:
case kInvalidFederatedSessionProviderSessionMissing:
case kInvalidFederatedSessionWrongProviderOrigin:
case kInvalidFederatedKey:
case kTooManyRelyingOriginLabels:
case kEmptySessionConfig:
case kRegistrationAttemptedChallenge:
NOTREACHED();
}
}
bool SessionError::IsServerError() const {
switch (type) {
case kSuccess:
case kKeyError:
case kSigningError:
case kNetError:
case kProxyError:
return false;
case kServerRequestedTermination:
case kInvalidConfigJson:
case kInvalidSessionId:
case kInvalidCredentialsConfig:
case kInvalidCredentialsType:
case kInvalidCredentialsEmptyName:
case kInvalidCredentialsCookie:
case kInvalidCredentialsCookieCreationTime:
case kInvalidCredentialsCookieName:
case kInvalidCredentialsCookieParsing:
case kInvalidCredentialsCookieUnpermittedAttribute:
case kInvalidCredentialsCookieInvalidDomain:
case kInvalidCredentialsCookiePrefix:
case kInvalidChallenge:
case kTooManyChallenges:
case kInvalidFetcherUrl:
case kInvalidRefreshUrl:
case kPersistentHttpError:
case kScopeOriginSameSiteMismatch:
case kRefreshUrlSameSiteMismatch:
case kInvalidScopeOrigin:
case kScopeOriginContainsPath:
case kTransientHttpError:
case kMismatchedSessionId:
case kRefreshInitiatorNotString:
case kRefreshInitiatorInvalidHostPattern:
case kInvalidScopeRulePath:
case kInvalidScopeRuleHostPattern:
case kScopeRuleOriginScopedHostPatternMismatch:
case kScopeRuleSiteScopedHostPatternMismatch:
case kInvalidScopeSpecification:
case kMissingScopeSpecificationType:
case kEmptyScopeSpecificationDomain:
case kEmptyScopeSpecificationPath:
case kInvalidScopeSpecificationType:
case kMissingScope:
case kNoCredentials:
case kInvalidScopeIncludeSite:
case kMissingScopeIncludeSite:
case kBoundCookieSetForbidden:
return true;
// Registration-only errors never get reported to the server.
case kSubdomainRegistrationWellKnownUnavailable:
case kSubdomainRegistrationUnauthorized:
case kSubdomainRegistrationWellKnownMalformed:
case kFederatedNotAuthorizedByProvider:
case kFederatedNotAuthorizedByRelyingParty:
case kSessionProviderWellKnownUnavailable:
case kSessionProviderWellKnownMalformed:
case kSessionProviderWellKnownHasProviderOrigin:
case kRelyingPartyWellKnownUnavailable:
case kRelyingPartyWellKnownMalformed:
case kRelyingPartyWellKnownHasRelyingOrigins:
case kFederatedKeyThumbprintMismatch:
case kInvalidFederatedSessionUrl:
case kInvalidFederatedSessionProviderSessionMissing:
case kInvalidFederatedSessionWrongProviderOrigin:
case kInvalidFederatedKey:
case kTooManyRelyingOriginLabels:
case kEmptySessionConfig:
case kRegistrationAttemptedChallenge:
NOTREACHED();
}
}
} // namespace net::device_bound_sessions