
com.malliina.web.errors.scala Maven / Gradle / Ivy
package com.malliina.web
import java.text.ParseException
import java.time.Instant
import com.malliina.http.{ResponseError, ResponseException, StatusError}
import com.malliina.values.{ErrorMessage, TokenValue}
import scala.concurrent.duration.{Duration, DurationLong}
sealed abstract class AuthError(val key: String):
def message: ErrorMessage
case class OkError(error: ResponseError) extends AuthError("http_error"):
override def message: ErrorMessage = ErrorMessage(error match
case StatusError(r, _) => s"Status code ${r.code}."
case com.malliina.http.JsonError(_, _, _) => "JSON error."
)
object OkError:
def apply(e: ResponseException): OkError = apply(e.error)
case class PermissionError(message: ErrorMessage) extends AuthError("permission_error")
case class OAuthError(message: ErrorMessage) extends AuthError("oauth_error")
object OAuthError:
def apply(s: String): OAuthError = OAuthError(ErrorMessage(s))
case class JsonError(err: String) extends AuthError("json_error"):
override def message = ErrorMessage(s"JSON error. $err")
sealed abstract class JWTError(key: String) extends AuthError(key):
def token: TokenValue
def message: ErrorMessage
case class Expired(token: TokenValue, exp: Instant, now: Instant) extends JWTError("token_expired"):
def since: Duration = (now.toEpochMilli - exp.toEpochMilli).millis
override def message = ErrorMessage(s"Token expired $since ago, at $exp.")
case class NotYetValid(token: TokenValue, nbf: Instant, now: Instant)
extends JWTError("not_yet_valid"):
def validIn = (nbf.toEpochMilli - now.toEpochMilli).millis
override def message = ErrorMessage(
s"Token not yet valid. Valid in $validIn. Valid from $nbf, checked at $now."
)
case class IssuerMismatch(token: TokenValue, actual: Issuer, allowed: Seq[Issuer])
extends JWTError("issuer_mismatch"):
def message = ErrorMessage(
s"Issuer mismatch. Got '$actual', but expected one of '${allowed.mkString(", ")}'."
)
case class InvalidSignature(token: TokenValue) extends JWTError("invalid_signature"):
override def message = ErrorMessage("Invalid JWT signature.")
case class InvalidKeyId(token: TokenValue, kid: String, expected: Seq[String])
extends JWTError("invalid_kid"):
def message = ErrorMessage(
s"Invalid key ID. Expected one of '${expected.mkString(", ")}', but got '$kid'."
)
case class InvalidClaims(token: TokenValue, message: ErrorMessage)
extends JWTError("invalid_claims")
case class ParseError(token: TokenValue, e: ParseException) extends JWTError("parse_error"):
override def message = ErrorMessage("Parse error")
case class MissingData(token: TokenValue, message: ErrorMessage) extends JWTError("missing_data")
© 2015 - 2025 Weber Informatics LLC | Privacy Policy