1
0
mirror of https://github.com/matrix-org/matrix-authentication-service.git synced 2025-08-09 04:22:45 +03:00

storage: impl Repository for Box<impl Repository + ?Sized>

This commit is contained in:
Quentin Gliech
2023-01-23 18:12:50 +01:00
parent a9facab131
commit 6a8c79c497
20 changed files with 152 additions and 40 deletions

View File

@@ -63,7 +63,7 @@ pub async fn get(
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng); let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng);
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let session = if let Some(session) = maybe_session { let session = if let Some(session) = maybe_session {
session session
@@ -126,7 +126,7 @@ pub async fn post(
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
cookie_jar.verify_form(&clock, form)?; cookie_jar.verify_form(&clock, form)?;
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let session = if let Some(session) = maybe_session { let session = if let Some(session) = maybe_session {
session session

View File

@@ -67,7 +67,7 @@ pub async fn post(
let content_type = content_type.map(|TypedHeader(h)| h.to_string()); let content_type = content_type.map(|TypedHeader(h)| h.to_string());
let (session_info, _cookie_jar) = cookie_jar.session_info(); let (session_info, _cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let mut request = async_graphql::http::receive_body( let mut request = async_graphql::http::receive_body(
content_type, content_type,
@@ -103,7 +103,7 @@ pub async fn get(
RawQuery(query): RawQuery, RawQuery(query): RawQuery,
) -> Result<impl IntoResponse, FancyError> { ) -> Result<impl IntoResponse, FancyError> {
let (session_info, _cookie_jar) = cookie_jar.session_info(); let (session_info, _cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let mut request = let mut request =
async_graphql::http::parse_query_string(&query.unwrap_or_default())?.data(Mutex::new(repo)); async_graphql::http::parse_query_string(&query.unwrap_or_default())?.data(Mutex::new(repo));

View File

@@ -86,7 +86,7 @@ pub(crate) async fn get(
) -> Result<Response, RouteError> { ) -> Result<Response, RouteError> {
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let grant = repo let grant = repo
.oauth2_authorization_grant() .oauth2_authorization_grant()

View File

@@ -167,7 +167,7 @@ pub(crate) async fn get(
let templates = templates.clone(); let templates = templates.clone();
let callback_destination = callback_destination.clone(); let callback_destination = callback_destination.clone();
async move { async move {
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let prompt = params.auth.prompt.as_deref().unwrap_or_default(); let prompt = params.auth.prompt.as_deref().unwrap_or_default();
// Check if the request/request_uri/registration params are used. If so, reply // Check if the request/request_uri/registration params are used. If so, reply

View File

@@ -82,7 +82,7 @@ pub(crate) async fn get(
) -> Result<Response, RouteError> { ) -> Result<Response, RouteError> {
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let grant = repo let grant = repo
.oauth2_authorization_grant() .oauth2_authorization_grant()
@@ -138,7 +138,7 @@ pub(crate) async fn post(
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let grant = repo let grant = repo
.oauth2_authorization_grant() .oauth2_authorization_grant()

View File

@@ -130,7 +130,7 @@ pub(crate) async fn post(
) -> Result<impl IntoResponse, RouteError> { ) -> Result<impl IntoResponse, RouteError> {
let client = client_authorization let client = client_authorization
.credentials .credentials
.fetch(&mut *repo) .fetch(&mut repo)
.await .await
.unwrap() .unwrap()
.ok_or(RouteError::ClientNotFound)?; .ok_or(RouteError::ClientNotFound)?;

View File

@@ -168,7 +168,7 @@ pub(crate) async fn post(
) -> Result<impl IntoResponse, RouteError> { ) -> Result<impl IntoResponse, RouteError> {
let client = client_authorization let client = client_authorization
.credentials .credentials
.fetch(&mut *repo) .fetch(&mut repo)
.await? .await?
.ok_or(RouteError::ClientNotFound)?; .ok_or(RouteError::ClientNotFound)?;

View File

@@ -103,7 +103,7 @@ pub async fn get(
State(key_store): State<Keystore>, State(key_store): State<Keystore>,
user_authorization: UserAuthorization, user_authorization: UserAuthorization,
) -> Result<Response, RouteError> { ) -> Result<Response, RouteError> {
let session = user_authorization.protected(&mut *repo, &clock).await?; let session = user_authorization.protected(&mut repo, &clock).await?;
let browser_session = repo let browser_session = repo
.browser_session() .browser_session()

View File

@@ -128,7 +128,7 @@ pub(crate) async fn get(
let (user_session_info, cookie_jar) = cookie_jar.session_info(); let (user_session_info, cookie_jar) = cookie_jar.session_info();
let (csrf_token, mut cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng); let (csrf_token, mut cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng);
let maybe_user_session = user_session_info.load_session(&mut *repo).await?; let maybe_user_session = user_session_info.load_session(&mut repo).await?;
let render = match (maybe_user_session, link.user_id) { let render = match (maybe_user_session, link.user_id) {
(Some(session), Some(user_id)) if session.user.id == user_id => { (Some(session), Some(user_id)) if session.user.id == user_id => {
@@ -249,7 +249,7 @@ pub(crate) async fn post(
} }
let (user_session_info, cookie_jar) = cookie_jar.session_info(); let (user_session_info, cookie_jar) = cookie_jar.session_info();
let maybe_user_session = user_session_info.load_session(&mut *repo).await?; let maybe_user_session = user_session_info.load_session(&mut repo).await?;
let session = match (maybe_user_session, link.user_id, form) { let session = match (maybe_user_session, link.user_id, form) {
(Some(session), None, FormData::Link) => { (Some(session), None, FormData::Link) => {

View File

@@ -46,7 +46,7 @@ pub(crate) async fn get(
let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng); let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng);
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let session = if let Some(session) = maybe_session { let session = if let Some(session) = maybe_session {
session session
@@ -76,7 +76,7 @@ pub(crate) async fn post(
let form = cookie_jar.verify_form(&clock, form)?; let form = cookie_jar.verify_form(&clock, form)?;
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let session = if let Some(session) = maybe_session { let session = if let Some(session) = maybe_session {
session session
@@ -98,7 +98,7 @@ pub(crate) async fn post(
}; };
start_email_verification( start_email_verification(
&mailer, &mailer,
&mut *repo, &mut repo,
&mut rng, &mut rng,
&clock, &clock,
&session.user, &session.user,

View File

@@ -55,10 +55,10 @@ pub(crate) async fn get(
) -> Result<Response, FancyError> { ) -> Result<Response, FancyError> {
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
if let Some(session) = maybe_session { if let Some(session) = maybe_session {
render(&mut rng, &clock, templates, session, cookie_jar, &mut *repo).await render(&mut rng, &clock, templates, session, cookie_jar, &mut repo).await
} else { } else {
let login = mas_router::Login::default(); let login = mas_router::Login::default();
Ok((cookie_jar, login.go()).into_response()) Ok((cookie_jar, login.go()).into_response())
@@ -130,7 +130,7 @@ pub(crate) async fn post(
) -> Result<Response, FancyError> { ) -> Result<Response, FancyError> {
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let mut session = if let Some(session) = maybe_session { let mut session = if let Some(session) = maybe_session {
session session
@@ -149,7 +149,7 @@ pub(crate) async fn post(
.await?; .await?;
let next = mas_router::AccountVerifyEmail::new(email.id); let next = mas_router::AccountVerifyEmail::new(email.id);
start_email_verification(&mailer, &mut *repo, &mut rng, &clock, &session.user, email) start_email_verification(&mailer, &mut repo, &mut rng, &clock, &session.user, email)
.await?; .await?;
repo.save().await?; repo.save().await?;
return Ok((cookie_jar, next.go()).into_response()); return Ok((cookie_jar, next.go()).into_response());
@@ -168,7 +168,7 @@ pub(crate) async fn post(
} }
let next = mas_router::AccountVerifyEmail::new(email.id); let next = mas_router::AccountVerifyEmail::new(email.id);
start_email_verification(&mailer, &mut *repo, &mut rng, &clock, &session.user, email) start_email_verification(&mailer, &mut repo, &mut rng, &clock, &session.user, email)
.await?; .await?;
repo.save().await?; repo.save().await?;
return Ok((cookie_jar, next.go()).into_response()); return Ok((cookie_jar, next.go()).into_response());
@@ -211,7 +211,7 @@ pub(crate) async fn post(
templates.clone(), templates.clone(),
session, session,
cookie_jar, cookie_jar,
&mut *repo, &mut repo,
) )
.await?; .await?;

View File

@@ -48,7 +48,7 @@ pub(crate) async fn get(
let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng); let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng);
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let session = if let Some(session) = maybe_session { let session = if let Some(session) = maybe_session {
session session
@@ -90,7 +90,7 @@ pub(crate) async fn post(
let form = cookie_jar.verify_form(&clock, form)?; let form = cookie_jar.verify_form(&clock, form)?;
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let session = if let Some(session) = maybe_session { let session = if let Some(session) = maybe_session {
session session

View File

@@ -39,7 +39,7 @@ pub(crate) async fn get(
let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng); let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng);
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let session = if let Some(session) = maybe_session { let session = if let Some(session) = maybe_session {
session session

View File

@@ -52,7 +52,7 @@ pub(crate) async fn get(
) -> Result<Response, FancyError> { ) -> Result<Response, FancyError> {
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
if let Some(session) = maybe_session { if let Some(session) = maybe_session {
render(&mut rng, &clock, templates, session, cookie_jar).await render(&mut rng, &clock, templates, session, cookie_jar).await
@@ -93,7 +93,7 @@ pub(crate) async fn post(
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let session = if let Some(session) = maybe_session { let session = if let Some(session) = maybe_session {
session session

View File

@@ -33,7 +33,7 @@ pub async fn get(
) -> Result<impl IntoResponse, FancyError> { ) -> Result<impl IntoResponse, FancyError> {
let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng); let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng);
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let session = session_info.load_session(&mut *repo).await?; let session = session_info.load_session(&mut repo).await?;
let ctx = IndexContext::new(url_builder.oidc_discovery()) let ctx = IndexContext::new(url_builder.oidc_discovery())
.maybe_with_session(session) .maybe_with_session(session)

View File

@@ -59,7 +59,7 @@ pub(crate) async fn get(
let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng); let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng);
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
if maybe_session.is_some() { if maybe_session.is_some() {
let reply = query.go_next(); let reply = query.go_next();
@@ -70,7 +70,7 @@ pub(crate) async fn get(
LoginContext::default().with_upstrem_providers(providers), LoginContext::default().with_upstrem_providers(providers),
query, query,
csrf_token, csrf_token,
&mut *repo, &mut repo,
&templates, &templates,
) )
.await?; .await?;
@@ -116,7 +116,7 @@ pub(crate) async fn post(
.with_upstrem_providers(providers), .with_upstrem_providers(providers),
query, query,
csrf_token, csrf_token,
&mut *repo, &mut repo,
&templates, &templates,
) )
.await?; .await?;
@@ -126,7 +126,7 @@ pub(crate) async fn post(
match login( match login(
password_manager, password_manager,
&mut *repo, &mut repo,
rng, rng,
&clock, &clock,
&form.username, &form.username,
@@ -148,7 +148,7 @@ pub(crate) async fn post(
LoginContext::default().with_form_state(state), LoginContext::default().with_form_state(state),
query, query,
csrf_token, csrf_token,
&mut *repo, &mut repo,
&templates, &templates,
) )
.await?; .await?;

View File

@@ -32,7 +32,7 @@ pub(crate) async fn post(
let (session_info, mut cookie_jar) = cookie_jar.session_info(); let (session_info, mut cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
if let Some(session) = maybe_session { if let Some(session) = maybe_session {
repo.browser_session().finish(&clock, session).await?; repo.browser_session().finish(&clock, session).await?;

View File

@@ -51,7 +51,7 @@ pub(crate) async fn get(
let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng); let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng);
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let session = if let Some(session) = maybe_session { let session = if let Some(session) = maybe_session {
session session
@@ -63,7 +63,7 @@ pub(crate) async fn get(
}; };
let ctx = ReauthContext::default(); let ctx = ReauthContext::default();
let next = query.load_context(&mut *repo).await?; let next = query.load_context(&mut repo).await?;
let ctx = if let Some(next) = next { let ctx = if let Some(next) = next {
ctx.with_post_action(next) ctx.with_post_action(next)
} else { } else {
@@ -89,7 +89,7 @@ pub(crate) async fn post(
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
let session = if let Some(session) = maybe_session { let session = if let Some(session) = maybe_session {
session session

View File

@@ -69,7 +69,7 @@ pub(crate) async fn get(
let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng); let (csrf_token, cookie_jar) = cookie_jar.csrf_token(&clock, &mut rng);
let (session_info, cookie_jar) = cookie_jar.session_info(); let (session_info, cookie_jar) = cookie_jar.session_info();
let maybe_session = session_info.load_session(&mut *repo).await?; let maybe_session = session_info.load_session(&mut repo).await?;
if maybe_session.is_some() { if maybe_session.is_some() {
let reply = query.go_next(); let reply = query.go_next();
@@ -79,7 +79,7 @@ pub(crate) async fn get(
RegisterContext::default(), RegisterContext::default(),
query, query,
csrf_token, csrf_token,
&mut *repo, &mut repo,
&templates, &templates,
) )
.await?; .await?;
@@ -174,7 +174,7 @@ pub(crate) async fn post(
RegisterContext::default().with_form_state(state), RegisterContext::default().with_form_state(state),
query, query,
csrf_token, csrf_token,
&mut *repo, &mut repo,
&templates, &templates,
) )
.await?; .await?;

View File

@@ -265,3 +265,115 @@ where
)) ))
} }
} }
impl<R: Repository + ?Sized> Repository for Box<R> {
type Error = R::Error;
fn save(self: Box<Self>) -> BoxFuture<'static, Result<(), Self::Error>>
where
Self: Sized,
{
// This shouldn't be callable?
unimplemented!()
}
fn cancel(self: Box<Self>) -> BoxFuture<'static, Result<(), Self::Error>>
where
Self: Sized,
{
// This shouldn't be callable?
unimplemented!()
}
fn upstream_oauth_link<'c>(
&'c mut self,
) -> Box<dyn UpstreamOAuthLinkRepository<Error = Self::Error> + 'c> {
(**self).upstream_oauth_link()
}
fn upstream_oauth_provider<'c>(
&'c mut self,
) -> Box<dyn UpstreamOAuthProviderRepository<Error = Self::Error> + 'c> {
(**self).upstream_oauth_provider()
}
fn upstream_oauth_session<'c>(
&'c mut self,
) -> Box<dyn UpstreamOAuthSessionRepository<Error = Self::Error> + 'c> {
(**self).upstream_oauth_session()
}
fn user<'c>(&'c mut self) -> Box<dyn UserRepository<Error = Self::Error> + 'c> {
(**self).user()
}
fn user_email<'c>(&'c mut self) -> Box<dyn UserEmailRepository<Error = Self::Error> + 'c> {
(**self).user_email()
}
fn user_password<'c>(
&'c mut self,
) -> Box<dyn UserPasswordRepository<Error = Self::Error> + 'c> {
(**self).user_password()
}
fn browser_session<'c>(
&'c mut self,
) -> Box<dyn BrowserSessionRepository<Error = Self::Error> + 'c> {
(**self).browser_session()
}
fn oauth2_client<'c>(
&'c mut self,
) -> Box<dyn OAuth2ClientRepository<Error = Self::Error> + 'c> {
(**self).oauth2_client()
}
fn oauth2_authorization_grant<'c>(
&'c mut self,
) -> Box<dyn OAuth2AuthorizationGrantRepository<Error = Self::Error> + 'c> {
(**self).oauth2_authorization_grant()
}
fn oauth2_session<'c>(
&'c mut self,
) -> Box<dyn OAuth2SessionRepository<Error = Self::Error> + 'c> {
(**self).oauth2_session()
}
fn oauth2_access_token<'c>(
&'c mut self,
) -> Box<dyn OAuth2AccessTokenRepository<Error = Self::Error> + 'c> {
(**self).oauth2_access_token()
}
fn oauth2_refresh_token<'c>(
&'c mut self,
) -> Box<dyn OAuth2RefreshTokenRepository<Error = Self::Error> + 'c> {
(**self).oauth2_refresh_token()
}
fn compat_session<'c>(
&'c mut self,
) -> Box<dyn CompatSessionRepository<Error = Self::Error> + 'c> {
(**self).compat_session()
}
fn compat_sso_login<'c>(
&'c mut self,
) -> Box<dyn CompatSsoLoginRepository<Error = Self::Error> + 'c> {
(**self).compat_sso_login()
}
fn compat_access_token<'c>(
&'c mut self,
) -> Box<dyn CompatAccessTokenRepository<Error = Self::Error> + 'c> {
(**self).compat_access_token()
}
fn compat_refresh_token<'c>(
&'c mut self,
) -> Box<dyn CompatRefreshTokenRepository<Error = Self::Error> + 'c> {
(**self).compat_refresh_token()
}
}