Skip to content

Commit bbbe729

Browse files
authored
Merge pull request #275 from neinteractiveliterature/can-manage-oauth-applications
Implement can_manage_oauth_applications (actual feature doesn't work …
2 parents 1cd21e0 + 0ba8f5c commit bbbe729

4 files changed

Lines changed: 43 additions & 6 deletions

File tree

crates/intercode_entities/src/generated/oauth_applications.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use sea_orm::entity::prelude::*;
44

5-
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
5+
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Default)]
66
#[sea_orm(table_name = "oauth_applications")]
77
pub struct Model {
88
#[sea_orm(primary_key)]

crates/intercode_users/src/partial_objects/ability_users_fields.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::sync::Arc;
22

33
use async_graphql::*;
4-
use intercode_entities::{staff_positions, user_con_profiles, users};
4+
use intercode_entities::{oauth_applications, staff_positions, user_con_profiles, users};
55
use intercode_graphql_core::{lax_id::LaxId, query_data::QueryData};
66
use intercode_graphql_loaders::LoaderManager;
77
use intercode_policies::{
@@ -11,7 +11,7 @@ use intercode_policies::{
1111
};
1212
use seawater::loaders::ExpectModel;
1313

14-
use crate::policies::{StaffPositionPolicy, UserAction, UserPolicy};
14+
use crate::policies::{OAuthApplicationPolicy, StaffPositionPolicy, UserAction, UserPolicy};
1515

1616
pub struct AbilityUsersFields {
1717
authorization_info: Arc<AuthorizationInfo>,
@@ -54,9 +54,16 @@ impl AbilityUsersFields {
5454
#[Object]
5555
impl AbilityUsersFields {
5656
#[graphql(name = "can_manage_oauth_applications")]
57-
async fn can_manage_oauth_applications(&self) -> bool {
58-
// TODO
59-
false
57+
async fn can_manage_oauth_applications(&self) -> Result<bool> {
58+
let authorization_info = self.authorization_info.as_ref();
59+
Ok(
60+
OAuthApplicationPolicy::action_permitted(
61+
authorization_info,
62+
&ReadManageAction::Manage,
63+
&oauth_applications::Model::default(),
64+
)
65+
.await?,
66+
)
6067
}
6168

6269
#[graphql(name = "can_manage_staff_positions")]
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
mod oauth_application_policy;
12
mod staff_position_policy;
23
mod user_policy;
34

5+
pub use oauth_application_policy::*;
46
pub use staff_position_policy::*;
57
pub use user_policy::*;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use axum::async_trait;
2+
use intercode_entities::oauth_applications;
3+
use intercode_policies::{AuthorizationInfo, Policy, ReadManageAction};
4+
use sea_orm::DbErr;
5+
6+
pub struct OAuthApplicationPolicy;
7+
8+
#[async_trait]
9+
impl Policy<AuthorizationInfo, oauth_applications::Model> for OAuthApplicationPolicy {
10+
type Action = ReadManageAction;
11+
type Error = DbErr;
12+
13+
async fn action_permitted(
14+
principal: &AuthorizationInfo,
15+
action: &ReadManageAction,
16+
_resource: &oauth_applications::Model,
17+
) -> Result<bool, Self::Error> {
18+
// Only accessible by site admins, and only with a real cookie session (so no oauth_scope)
19+
if principal.oauth_scope.is_some() {
20+
return Ok(false);
21+
}
22+
23+
match action {
24+
ReadManageAction::Read => Ok(principal.site_admin_read()),
25+
ReadManageAction::Manage => Ok(principal.site_admin_manage()),
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)