mirror of
https://github.com/pocket-id/pocket-id.git
synced 2026-05-13 08:29:53 +00:00
394 lines
15 KiB
Go
394 lines
15 KiB
Go
package common
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
)
|
|
|
|
type AppError interface {
|
|
error
|
|
|
|
HttpStatusCode() int
|
|
}
|
|
|
|
type AppErrorDescription interface {
|
|
AppError
|
|
|
|
Description() string
|
|
}
|
|
|
|
// Custom error types for various conditions
|
|
|
|
type AlreadyInUseError struct {
|
|
Property string
|
|
}
|
|
|
|
func (e AlreadyInUseError) Error() string {
|
|
return e.Property + " is already in use"
|
|
}
|
|
func (e AlreadyInUseError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
func (e AlreadyInUseError) Is(target error) bool {
|
|
// Ignore the field property when checking if an error is of the type AlreadyInUseError
|
|
x := &AlreadyInUseError{}
|
|
return errors.As(target, &x)
|
|
}
|
|
|
|
type SetupNotAvailableError struct{}
|
|
|
|
func (e SetupNotAvailableError) Error() string { return "not found" }
|
|
func (e SetupNotAvailableError) HttpStatusCode() int { return http.StatusNotFound }
|
|
|
|
type TokenInvalidOrExpiredError struct{}
|
|
|
|
func (e TokenInvalidOrExpiredError) Error() string { return "token is invalid or expired" }
|
|
func (e TokenInvalidOrExpiredError) HttpStatusCode() int { return http.StatusUnauthorized }
|
|
|
|
type DeviceCodeInvalid struct{}
|
|
|
|
func (e DeviceCodeInvalid) Error() string {
|
|
return "one time access code must be used on the device it was generated for"
|
|
}
|
|
func (e DeviceCodeInvalid) HttpStatusCode() int { return http.StatusUnauthorized }
|
|
|
|
type TokenInvalidError struct{}
|
|
|
|
func (e TokenInvalidError) Error() string { return "Token is invalid" }
|
|
func (e TokenInvalidError) HttpStatusCode() int { return http.StatusUnauthorized }
|
|
|
|
type OidcMissingAuthorizationError struct{}
|
|
|
|
func (e OidcMissingAuthorizationError) Error() string { return "missing authorization" }
|
|
func (e OidcMissingAuthorizationError) HttpStatusCode() int { return http.StatusForbidden }
|
|
|
|
type OidcGrantTypeNotSupportedError struct{}
|
|
|
|
func (e OidcGrantTypeNotSupportedError) Error() string { return "grant type not supported" }
|
|
func (e OidcGrantTypeNotSupportedError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcMissingClientCredentialsError struct{}
|
|
|
|
func (e OidcMissingClientCredentialsError) Error() string { return "client id or secret not provided" }
|
|
func (e OidcMissingClientCredentialsError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcClientSecretInvalidError struct{}
|
|
|
|
func (e OidcClientSecretInvalidError) Error() string { return "invalid client secret" }
|
|
func (e OidcClientSecretInvalidError) HttpStatusCode() int { return http.StatusUnauthorized }
|
|
|
|
type OidcClientAssertionInvalidError struct{}
|
|
|
|
func (e OidcClientAssertionInvalidError) Error() string { return "invalid client assertion" }
|
|
func (e OidcClientAssertionInvalidError) HttpStatusCode() int { return http.StatusUnauthorized }
|
|
|
|
type OidcInvalidAuthorizationCodeError struct{}
|
|
|
|
func (e OidcInvalidAuthorizationCodeError) Error() string { return "invalid authorization code" }
|
|
func (e OidcInvalidAuthorizationCodeError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcClientNotFoundError struct{}
|
|
|
|
func (e OidcClientNotFoundError) Error() string { return "client not found" }
|
|
func (e OidcClientNotFoundError) HttpStatusCode() int { return http.StatusNotFound }
|
|
|
|
type OidcMissingCallbackURLError struct{}
|
|
|
|
func (e OidcMissingCallbackURLError) Error() string {
|
|
return "unable to detect callback url, it might be necessary for an admin to fix this"
|
|
}
|
|
func (e OidcMissingCallbackURLError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcInvalidCallbackURLError struct{}
|
|
|
|
func (e OidcInvalidCallbackURLError) Error() string {
|
|
return "invalid callback URL, it might be necessary for an admin to fix this"
|
|
}
|
|
func (e OidcInvalidCallbackURLError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type FileTypeNotSupportedError struct{}
|
|
|
|
func (e FileTypeNotSupportedError) Error() string { return "file type not supported" }
|
|
func (e FileTypeNotSupportedError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type FileTooLargeError struct {
|
|
MaxSize string
|
|
}
|
|
|
|
func (e FileTooLargeError) Error() string {
|
|
return fmt.Sprintf("The file can't be larger than %s", e.MaxSize)
|
|
}
|
|
func (e FileTooLargeError) HttpStatusCode() int { return http.StatusRequestEntityTooLarge }
|
|
|
|
type NotSignedInError struct{}
|
|
|
|
func (e NotSignedInError) Error() string { return "You are not signed in" }
|
|
func (e NotSignedInError) HttpStatusCode() int { return http.StatusUnauthorized }
|
|
|
|
type MissingAccessToken struct{}
|
|
|
|
func (e MissingAccessToken) Error() string { return "Missing access token" }
|
|
func (e MissingAccessToken) HttpStatusCode() int { return http.StatusUnauthorized }
|
|
|
|
type MissingPermissionError struct{}
|
|
|
|
func (e MissingPermissionError) Error() string {
|
|
return "You don't have permission to perform this action"
|
|
}
|
|
func (e MissingPermissionError) HttpStatusCode() int { return http.StatusForbidden }
|
|
|
|
type TooManyRequestsError struct{}
|
|
|
|
func (e TooManyRequestsError) Error() string { return "Too many requests" }
|
|
func (e TooManyRequestsError) HttpStatusCode() int { return http.StatusTooManyRequests }
|
|
|
|
type UserIdNotProvidedError struct{}
|
|
|
|
func (e UserIdNotProvidedError) Error() string { return "User id not provided" }
|
|
func (e UserIdNotProvidedError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type UserNotFoundError struct{}
|
|
|
|
func (e UserNotFoundError) Error() string { return "User not found" }
|
|
func (e UserNotFoundError) HttpStatusCode() int { return http.StatusNotFound }
|
|
|
|
type ClientIdOrSecretNotProvidedError struct{}
|
|
|
|
func (e ClientIdOrSecretNotProvidedError) Error() string { return "Client id or secret not provided" }
|
|
func (e ClientIdOrSecretNotProvidedError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type WrongFileTypeError struct {
|
|
ExpectedFileType string
|
|
}
|
|
|
|
func (e WrongFileTypeError) Error() string {
|
|
return fmt.Sprintf("File must be of type %s", e.ExpectedFileType)
|
|
}
|
|
func (e WrongFileTypeError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type MissingSessionIdError struct{}
|
|
|
|
func (e MissingSessionIdError) Error() string { return "Missing session id" }
|
|
func (e MissingSessionIdError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type ReservedClaimError struct {
|
|
Key string
|
|
}
|
|
|
|
func (e ReservedClaimError) Error() string {
|
|
return fmt.Sprintf("Claim %s is reserved and can't be used", e.Key)
|
|
}
|
|
func (e ReservedClaimError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type DuplicateClaimError struct {
|
|
Key string
|
|
}
|
|
|
|
func (e DuplicateClaimError) Error() string {
|
|
return fmt.Sprintf("Claim %s is already defined", e.Key)
|
|
}
|
|
func (e DuplicateClaimError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcInvalidCodeVerifierError struct{}
|
|
|
|
func (e OidcInvalidCodeVerifierError) Error() string { return "Invalid code verifier" }
|
|
func (e OidcInvalidCodeVerifierError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcMissingCodeChallengeError struct{}
|
|
|
|
func (e OidcMissingCodeChallengeError) Error() string { return "Missing code challenge" }
|
|
func (e OidcMissingCodeChallengeError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type LdapUserUpdateError struct{}
|
|
|
|
func (e LdapUserUpdateError) Error() string { return "LDAP users can't be updated" }
|
|
func (e LdapUserUpdateError) HttpStatusCode() int { return http.StatusForbidden }
|
|
|
|
type LdapUserGroupUpdateError struct{}
|
|
|
|
func (e LdapUserGroupUpdateError) Error() string { return "LDAP user groups can't be updated" }
|
|
func (e LdapUserGroupUpdateError) HttpStatusCode() int { return http.StatusForbidden }
|
|
|
|
type OidcAccessDeniedError struct{}
|
|
|
|
func (e OidcAccessDeniedError) Error() string { return "You're not allowed to access this service" }
|
|
func (e OidcAccessDeniedError) HttpStatusCode() int { return http.StatusForbidden }
|
|
|
|
type OidcClientIdNotMatchingError struct{}
|
|
|
|
func (e OidcClientIdNotMatchingError) Error() string {
|
|
return "Client id in request doesn't match client id in token"
|
|
}
|
|
func (e OidcClientIdNotMatchingError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcNoCallbackURLError struct{}
|
|
|
|
func (e OidcNoCallbackURLError) Error() string {
|
|
return "No callback URL provided"
|
|
}
|
|
func (e OidcNoCallbackURLError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type UiConfigDisabledError struct{}
|
|
|
|
func (e UiConfigDisabledError) Error() string {
|
|
return "The configuration can't be changed since the UI configuration is disabled"
|
|
}
|
|
func (e UiConfigDisabledError) HttpStatusCode() int { return http.StatusForbidden }
|
|
|
|
type InvalidUUIDError struct{}
|
|
|
|
func (e InvalidUUIDError) Error() string { return "Invalid UUID" }
|
|
func (e InvalidUUIDError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OneTimeAccessDisabledError struct{}
|
|
|
|
func (e OneTimeAccessDisabledError) Error() string { return "One-time access is disabled" }
|
|
func (e OneTimeAccessDisabledError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type InvalidAPIKeyError struct{}
|
|
|
|
func (e InvalidAPIKeyError) Error() string { return "Invalid Api Key" }
|
|
func (e InvalidAPIKeyError) HttpStatusCode() int { return http.StatusUnauthorized }
|
|
|
|
type NoAPIKeyProvidedError struct{}
|
|
|
|
func (e NoAPIKeyProvidedError) Error() string { return "No API Key Provided" }
|
|
func (e NoAPIKeyProvidedError) HttpStatusCode() int { return http.StatusUnauthorized }
|
|
|
|
type APIKeyNotFoundError struct{}
|
|
|
|
func (e APIKeyNotFoundError) Error() string { return "API Key Not Found" }
|
|
func (e APIKeyNotFoundError) HttpStatusCode() int { return http.StatusUnauthorized }
|
|
|
|
type APIKeyNotExpiredError struct{}
|
|
|
|
func (e APIKeyNotExpiredError) Error() string { return "API Key is not expired yet" }
|
|
func (e APIKeyNotExpiredError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type APIKeyExpirationDateError struct{}
|
|
|
|
func (e APIKeyExpirationDateError) Error() string {
|
|
return "API Key expiration time must be in the future"
|
|
}
|
|
func (e APIKeyExpirationDateError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type APIKeyAuthNotAllowedError struct{}
|
|
|
|
func (e APIKeyAuthNotAllowedError) Error() string {
|
|
return "API key authentication is not allowed for this endpoint"
|
|
}
|
|
func (e APIKeyAuthNotAllowedError) HttpStatusCode() int { return http.StatusForbidden }
|
|
|
|
type OidcInvalidRefreshTokenError struct{}
|
|
|
|
func (e OidcInvalidRefreshTokenError) Error() string { return "refresh token is invalid or expired" }
|
|
func (e OidcInvalidRefreshTokenError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcMissingRefreshTokenError struct{}
|
|
|
|
func (e OidcMissingRefreshTokenError) Error() string { return "refresh token is required" }
|
|
func (e OidcMissingRefreshTokenError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcMissingAuthorizationCodeError struct{}
|
|
|
|
func (e OidcMissingAuthorizationCodeError) Error() string { return "authorization code is required" }
|
|
func (e OidcMissingAuthorizationCodeError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type UserDisabledError struct{}
|
|
|
|
func (e UserDisabledError) Error() string { return "User account is disabled" }
|
|
func (e UserDisabledError) HttpStatusCode() int { return http.StatusForbidden }
|
|
|
|
type ValidationError struct{ Message string }
|
|
|
|
func (e ValidationError) Error() string { return e.Message }
|
|
|
|
func (e ValidationError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcDeviceCodeExpiredError struct{}
|
|
|
|
func (e OidcDeviceCodeExpiredError) Error() string { return "device code has expired" }
|
|
func (e OidcDeviceCodeExpiredError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcInvalidDeviceCodeError struct{}
|
|
|
|
func (e OidcInvalidDeviceCodeError) Error() string { return "invalid device code" }
|
|
func (e OidcInvalidDeviceCodeError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcSlowDownError struct{}
|
|
|
|
func (e OidcSlowDownError) Error() string { return "polling too frequently" }
|
|
func (e OidcSlowDownError) HttpStatusCode() int { return http.StatusTooManyRequests }
|
|
|
|
type OidcAuthorizationPendingError struct{}
|
|
|
|
func (e OidcAuthorizationPendingError) Error() string { return "authorization is still pending" }
|
|
func (e OidcAuthorizationPendingError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type ReauthenticationRequiredError struct{}
|
|
|
|
func (e ReauthenticationRequiredError) Error() string { return "reauthentication required" }
|
|
func (e ReauthenticationRequiredError) HttpStatusCode() int { return http.StatusUnauthorized }
|
|
|
|
type OpenSignupDisabledError struct{}
|
|
|
|
func (e OpenSignupDisabledError) Error() string { return "Open user signup is not enabled" }
|
|
|
|
func (e OpenSignupDisabledError) HttpStatusCode() int { return http.StatusForbidden }
|
|
|
|
type ClientIdAlreadyExistsError struct{}
|
|
|
|
func (e ClientIdAlreadyExistsError) Error() string { return "Client ID already in use" }
|
|
|
|
func (e ClientIdAlreadyExistsError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type UserEmailNotSetError struct{}
|
|
|
|
func (e UserEmailNotSetError) Error() string { return "The user does not have an email address set" }
|
|
|
|
func (e UserEmailNotSetError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type ImageNotFoundError struct{}
|
|
|
|
func (e ImageNotFoundError) Error() string { return "Image not found" }
|
|
|
|
func (e ImageNotFoundError) HttpStatusCode() int { return http.StatusNotFound }
|
|
|
|
type InvalidEmailVerificationTokenError struct{}
|
|
|
|
func (e InvalidEmailVerificationTokenError) Error() string { return "Invalid email verification token" }
|
|
|
|
func (e InvalidEmailVerificationTokenError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
// OIDC prompt parameter errors - used for redirect error responses
|
|
|
|
type OidcLoginRequiredError struct{}
|
|
|
|
func (e OidcLoginRequiredError) Error() string { return "login_required" }
|
|
func (e OidcLoginRequiredError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcConsentRequiredError struct{}
|
|
|
|
func (e OidcConsentRequiredError) Error() string { return "consent_required" }
|
|
func (e OidcConsentRequiredError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcInteractionRequiredError struct{}
|
|
|
|
func (e OidcInteractionRequiredError) Error() string { return "interaction_required" }
|
|
func (e OidcInteractionRequiredError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
|
|
type OidcInvalidRequestError struct{ description string }
|
|
|
|
func NewOidcInvalidRequestError(description string) *OidcInvalidRequestError {
|
|
return &OidcInvalidRequestError{description: description}
|
|
}
|
|
|
|
func (e OidcInvalidRequestError) Error() string { return "invalid_request" }
|
|
func (e OidcInvalidRequestError) HttpStatusCode() int { return http.StatusBadRequest }
|
|
func (e OidcInvalidRequestError) Description() string { return e.description }
|
|
|
|
type OidcAccountSelectionRequiredError struct{}
|
|
|
|
func (e OidcAccountSelectionRequiredError) Error() string { return "account_selection_required" }
|
|
func (e OidcAccountSelectionRequiredError) HttpStatusCode() int { return http.StatusBadRequest }
|