You've already forked authentication-service
mirror of
https://github.com/matrix-org/matrix-authentication-service.git
synced 2025-11-20 12:02:22 +03:00
Better userinfo error codes
This commit is contained in:
@@ -18,7 +18,11 @@ use axum::{
|
|||||||
response::{IntoResponse, Response},
|
response::{IntoResponse, Response},
|
||||||
Json,
|
Json,
|
||||||
};
|
};
|
||||||
use mas_axum_utils::{jwt::JwtResponse, user_authorization::UserAuthorization, FancyError};
|
use hyper::StatusCode;
|
||||||
|
use mas_axum_utils::{
|
||||||
|
jwt::JwtResponse,
|
||||||
|
user_authorization::{AuthorizationVerificationError, UserAuthorization},
|
||||||
|
};
|
||||||
use mas_jose::{
|
use mas_jose::{
|
||||||
constraints::Constrainable,
|
constraints::Constrainable,
|
||||||
jwt::{JsonWebSignatureHeader, Jwt},
|
jwt::{JsonWebSignatureHeader, Jwt},
|
||||||
@@ -29,6 +33,7 @@ use oauth2_types::scope;
|
|||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use serde_with::skip_serializing_none;
|
use serde_with::skip_serializing_none;
|
||||||
use sqlx::PgPool;
|
use sqlx::PgPool;
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
#[skip_serializing_none]
|
#[skip_serializing_none]
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
@@ -47,13 +52,52 @@ struct SignedUserInfo {
|
|||||||
user_info: UserInfo,
|
user_info: UserInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Error)]
|
||||||
|
pub enum RouteError {
|
||||||
|
#[error(transparent)]
|
||||||
|
Internal(Box<dyn std::error::Error + Send + Sync + 'static>),
|
||||||
|
|
||||||
|
#[error(transparent)]
|
||||||
|
Anyhow(#[from] anyhow::Error),
|
||||||
|
|
||||||
|
#[error("failed to authenticate")]
|
||||||
|
AuthorizationVerificationError(#[from] AuthorizationVerificationError),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IntoResponse for RouteError {
|
||||||
|
fn into_response(self) -> axum::response::Response {
|
||||||
|
match self {
|
||||||
|
Self::Internal(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()).into_response(),
|
||||||
|
Self::Anyhow(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()).into_response(),
|
||||||
|
Self::AuthorizationVerificationError(_e) => StatusCode::UNAUTHORIZED.into_response(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<sqlx::Error> for RouteError {
|
||||||
|
fn from(e: sqlx::Error) -> Self {
|
||||||
|
Self::Internal(Box::new(e))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<mas_keystore::WrongAlgorithmError> for RouteError {
|
||||||
|
fn from(e: mas_keystore::WrongAlgorithmError) -> Self {
|
||||||
|
Self::Internal(Box::new(e))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<mas_jose::jwt::JwtSignatureError> for RouteError {
|
||||||
|
fn from(e: mas_jose::jwt::JwtSignatureError) -> Self {
|
||||||
|
Self::Internal(Box::new(e))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn get(
|
pub async fn get(
|
||||||
State(url_builder): State<UrlBuilder>,
|
State(url_builder): State<UrlBuilder>,
|
||||||
State(pool): State<PgPool>,
|
State(pool): State<PgPool>,
|
||||||
State(key_store): State<Keystore>,
|
State(key_store): State<Keystore>,
|
||||||
user_authorization: UserAuthorization,
|
user_authorization: UserAuthorization,
|
||||||
) -> Result<Response, FancyError> {
|
) -> Result<Response, RouteError> {
|
||||||
// TODO: error handling
|
|
||||||
let (_clock, mut rng) = crate::rng_and_clock()?;
|
let (_clock, mut rng) = crate::rng_and_clock()?;
|
||||||
let mut conn = pool.acquire().await?;
|
let mut conn = pool.acquire().await?;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user