Skip to content

Commit 7dbac7d

Browse files
Shield OIDC: Add support for subprovider slugs
1 parent 3ee6b78 commit 7dbac7d

File tree

4 files changed

+20
-11
lines changed

4 files changed

+20
-11
lines changed

packages/providers/shield-oidc/src/provider.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ impl<U: User> OidcProvider<U> {
4242
self
4343
}
4444

45-
async fn oidc_subprovider_by_id(
45+
async fn oidc_subprovider_by_id_or_slug(
4646
&self,
4747
subprovider_id: &str,
4848
) -> Result<OidcSubprovider, ShieldError> {
@@ -54,7 +54,11 @@ impl<U: User> OidcProvider<U> {
5454
return Ok(subprovider.clone());
5555
}
5656

57-
if let Some(subprovider) = self.storage.oidc_subprovider_by_id(subprovider_id).await? {
57+
if let Some(subprovider) = self
58+
.storage
59+
.oidc_subprovider_by_id_or_slug(subprovider_id)
60+
.await?
61+
{
5862
return Ok(subprovider);
5963
}
6064

@@ -183,7 +187,7 @@ impl<U: User> Provider for OidcProvider<U> {
183187
&self,
184188
subprovider_id: &str,
185189
) -> Result<Option<Box<dyn Subprovider>>, ShieldError> {
186-
self.oidc_subprovider_by_id(subprovider_id)
190+
self.oidc_subprovider_by_id_or_slug(subprovider_id)
187191
.await
188192
.map(|subprovider| Some(Box::new(subprovider) as Box<dyn Subprovider>))
189193
}
@@ -194,7 +198,7 @@ impl<U: User> Provider for OidcProvider<U> {
194198
session: Session,
195199
) -> Result<Response, ShieldError> {
196200
let subprovider = match request.subprovider_id {
197-
Some(subprovider_id) => self.oidc_subprovider_by_id(&subprovider_id).await?,
201+
Some(subprovider_id) => self.oidc_subprovider_by_id_or_slug(&subprovider_id).await?,
198202
None => return Err(ProviderError::SubproviderMissing.into()),
199203
};
200204

@@ -287,7 +291,7 @@ impl<U: User> Provider for OidcProvider<U> {
287291
.ok_or_else(|| ShieldError::Validation("Missing authorization code.".to_owned()))?;
288292

289293
let subprovider = match request.subprovider_id {
290-
Some(subprovider_id) => self.oidc_subprovider_by_id(&subprovider_id).await?,
294+
Some(subprovider_id) => self.oidc_subprovider_by_id_or_slug(&subprovider_id).await?,
291295
None => return Err(ProviderError::SubproviderMissing.into()),
292296
};
293297

@@ -405,7 +409,7 @@ impl<U: User> Provider for OidcProvider<U> {
405409
session: Session,
406410
) -> Result<Response, ShieldError> {
407411
let subprovider = match request.subprovider_id {
408-
Some(subprovider_id) => self.oidc_subprovider_by_id(&subprovider_id).await?,
412+
Some(subprovider_id) => self.oidc_subprovider_by_id_or_slug(&subprovider_id).await?,
409413
None => return Err(ProviderError::SubproviderMissing.into()),
410414
};
411415

packages/providers/shield-oidc/src/storage.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
pub trait OidcStorage<U: User>: Storage<U> + Sync {
1212
async fn oidc_subproviders(&self) -> Result<Vec<OidcSubprovider>, StorageError>;
1313

14-
async fn oidc_subprovider_by_id(
14+
async fn oidc_subprovider_by_id_or_slug(
1515
&self,
1616
subprovider_id: &str,
1717
) -> Result<Option<OidcSubprovider>, StorageError>;

packages/storage/shield-memory/src/providers/oidc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ impl OidcStorage<User> for MemoryStorage {
2020
Ok(vec![])
2121
}
2222

23-
async fn oidc_subprovider_by_id(
23+
async fn oidc_subprovider_by_id_or_slug(
2424
&self,
2525
_subprovider_id: &str,
2626
) -> Result<Option<OidcSubprovider>, StorageError> {

packages/storage/shield-sea-orm/src/providers/oidc.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use async_trait::async_trait;
2-
use sea_orm::{ActiveModelTrait, ActiveValue, ColumnTrait, EntityTrait, QueryFilter};
2+
use sea_orm::{ActiveModelTrait, ActiveValue, ColumnTrait, Condition, EntityTrait, QueryFilter};
33
use shield::StorageError;
44
use shield_oidc::{
55
CreateOidcConnection, OidcConnection, OidcProviderPkceCodeChallenge, OidcProviderVisibility,
@@ -27,11 +27,16 @@ impl OidcStorage<User> for SeaOrmStorage {
2727
})
2828
}
2929

30-
async fn oidc_subprovider_by_id(
30+
async fn oidc_subprovider_by_id_or_slug(
3131
&self,
3232
subprovider_id: &str,
3333
) -> Result<Option<OidcSubprovider>, StorageError> {
34-
oidc_provider::Entity::find_by_id(Self::parse_uuid(subprovider_id)?)
34+
oidc_provider::Entity::find()
35+
.filter(
36+
Condition::any()
37+
.add(oidc_provider::Column::Id.eq(Self::parse_uuid(subprovider_id)?))
38+
.add(oidc_provider::Column::Slug.eq(subprovider_id.to_lowercase())),
39+
)
3540
.one(&self.database)
3641
.await
3742
.map_err(|err| StorageError::Engine(err.to_string()))

0 commit comments

Comments
 (0)