1
0
mirror of https://github.com/matrix-org/matrix-authentication-service.git synced 2025-11-20 12:02:22 +03:00

WIP: repository pattern for upstream oauth2 links

This commit is contained in:
Quentin Gliech
2022-12-30 10:16:22 +01:00
parent aa1cfcefc4
commit 5969b574e2
14 changed files with 419 additions and 287 deletions

View File

@@ -25,8 +25,9 @@ use mas_oidc_client::requests::{
authorization_code::AuthorizationValidationData, jose::JwtVerificationData,
};
use mas_router::{Route, UrlBuilder};
use mas_storage::upstream_oauth2::{
add_link, complete_session, lookup_link_by_subject, lookup_session,
use mas_storage::{
upstream_oauth2::{complete_session, lookup_session},
Repository, UpstreamOAuthLinkRepository,
};
use oauth2_types::errors::ClientErrorCode;
use serde::Deserialize;
@@ -231,12 +232,17 @@ pub(crate) async fn get(
let subject = mas_jose::claims::SUB.extract_required(&mut id_token)?;
// Look for an existing link
let maybe_link = lookup_link_by_subject(&mut txn, &provider, &subject).await?;
let maybe_link = txn
.upstream_oauth_link()
.find_by_subject(&provider, &subject)
.await?;
let link = if let Some(link) = maybe_link {
link
} else {
add_link(&mut txn, &mut rng, &clock, &provider, subject).await?
txn.upstream_oauth_link()
.add(&mut rng, &clock, &provider, subject)
.await?
};
let session = complete_session(&mut txn, &clock, session, &link, response.id_token).await?;

View File

@@ -25,10 +25,9 @@ use mas_axum_utils::{
};
use mas_keystore::Encrypter;
use mas_storage::{
upstream_oauth2::{
associate_link_to_user, consume_session, lookup_link, lookup_session_on_link,
},
upstream_oauth2::{consume_session, lookup_session_on_link},
user::{add_user, authenticate_session_with_upstream, lookup_user, start_session},
Repository, UpstreamOAuthLinkRepository,
};
use mas_templates::{
EmptyContext, TemplateContext, Templates, UpstreamExistingLinkContext, UpstreamRegister,
@@ -104,7 +103,9 @@ pub(crate) async fn get(
.lookup_link(link_id)
.map_err(|_| RouteError::MissingCookie)?;
let link = lookup_link(&mut txn, link_id)
let link = txn
.upstream_oauth_link()
.lookup(link_id)
.await?
.ok_or(RouteError::LinkNotFound)?;
@@ -205,7 +206,9 @@ pub(crate) async fn post(
post_auth_action: post_auth_action.cloned(),
};
let link = lookup_link(&mut txn, link_id)
let link = txn
.upstream_oauth_link()
.lookup(link_id)
.await?
.ok_or(RouteError::LinkNotFound)?;
@@ -224,7 +227,10 @@ pub(crate) async fn post(
let mut session = match (maybe_user_session, link.user_id, form) {
(Some(session), None, FormData::Link) => {
associate_link_to_user(&mut txn, &link, &session.user).await?;
txn.upstream_oauth_link()
.associate_to_user(&link, &session.user)
.await?;
session
}
@@ -235,7 +241,9 @@ pub(crate) async fn post(
(None, None, FormData::Register { username }) => {
let user = add_user(&mut txn, &mut rng, &clock, &username).await?;
associate_link_to_user(&mut txn, &link, &user).await?;
txn.upstream_oauth_link()
.associate_to_user(&link, &user)
.await?;
start_session(&mut txn, &mut rng, &clock, user).await?
}