Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: String based permission nodes #632

Open
wants to merge 27 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
7919887
rewrite community permission to use strings
Flemmli97 Nov 19, 2024
10e7a21
test and permission check fix
Flemmli97 Nov 19, 2024
1a5a899
linter
Flemmli97 Nov 19, 2024
3bbc862
linter
Flemmli97 Nov 19, 2024
3937d3e
comment
Flemmli97 Nov 19, 2024
d7a008f
Merge branch 'main' into permission_string
Flemmli97 Nov 22, 2024
a2c0522
Merge branch 'main' into permission_string
Flemmli97 Nov 22, 2024
fabd8df
update sub permission handling
Flemmli97 Nov 22, 2024
803eef5
add has_permission api call for community
Flemmli97 Nov 22, 2024
5f09d14
fix wrong permission for channel
Flemmli97 Nov 25, 2024
a0bc2d4
Merge branch 'main' into permission_string
Flemmli97 Nov 25, 2024
3281298
clippy
Flemmli97 Nov 26, 2024
b9fc066
change back to serde
Flemmli97 Nov 28, 2024
a3ad5de
Merge branch 'main' into permission_string
Flemmli97 Nov 28, 2024
ef44f59
change to display
Flemmli97 Nov 29, 2024
3ff873b
linter
Flemmli97 Nov 29, 2024
db11e3d
linter
Flemmli97 Nov 29, 2024
da5f8c6
Merge branch 'main' into permission_string
dariusc93 Nov 30, 2024
64934cf
fix tests
Flemmli97 Dec 2, 2024
0f9280f
Merge branch 'main' into permission_string
dariusc93 Dec 4, 2024
ee3cba2
Merge branch 'main' into permission_string
Flemmli97 Dec 6, 2024
7aa6011
fix test
Flemmli97 Dec 6, 2024
2cb0d6d
Merge branch 'main' into permission_string
dariusc93 Dec 10, 2024
8c8c72c
Merge branch 'main' into permission_string
dariusc93 Dec 21, 2024
c3e1429
Merge branch 'main' into permission_string
dariusc93 Dec 23, 2024
5d8b042
Merge branch 'main' into permission_string
dariusc93 Dec 30, 2024
1f51a59
Merge branch 'main' into permission_string
dariusc93 Jan 2, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ tracing = { version = "0.1" }
either = "1"
void = "1"
indexmap = { version = "2.4.0", features = ["serde"] }
enum_macro = { path = "./tools/enum_macro" }

# ipfs dependency
rust-ipfs = "0.14.0"
Expand Down
142 changes: 107 additions & 35 deletions extensions/warp-ipfs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,7 @@ use store::protocols;
use tokio_util::compat::TokioAsyncReadCompatExt;
use tracing::{Instrument, Span};
use uuid::Uuid;
use warp::raygun::community::{
CommunityChannelPermission, CommunityPermission, CommunityRole, RoleId,
};
use warp::raygun::community::{CommunityRole, RoleId};

use crate::config::{Bootstrap, DiscoveryType};
use crate::store::discovery::Discovery;
Expand Down Expand Up @@ -1897,42 +1895,67 @@ impl RayGunCommunity for WarpIpfs {
.edit_community_description(community_id, description)
.await
}
async fn grant_community_permission(
async fn grant_community_permission<T>(
&mut self,
community_id: Uuid,
permission: CommunityPermission,
permission: T,
role_id: RoleId,
) -> Result<(), Error> {
) -> Result<(), Error>
where
T: ToString + Send,
{
self.messaging_store()?
.grant_community_permission(community_id, permission, role_id)
.grant_community_permission(community_id, permission.to_string(), role_id)
.await
}
async fn revoke_community_permission(
async fn revoke_community_permission<T>(
&mut self,
community_id: Uuid,
permission: CommunityPermission,
permission: T,
role_id: RoleId,
) -> Result<(), Error> {
) -> Result<(), Error>
where
T: ToString + Send,
{
self.messaging_store()?
.revoke_community_permission(community_id, permission, role_id)
.revoke_community_permission(community_id, permission.to_string(), role_id)
.await
}
async fn grant_community_permission_for_all(
async fn grant_community_permission_for_all<T>(
&mut self,
community_id: Uuid,
permission: CommunityPermission,
) -> Result<(), Error> {
permission: T,
) -> Result<(), Error>
where
T: ToString + Send,
{
self.messaging_store()?
.grant_community_permission_for_all(community_id, permission)
.grant_community_permission_for_all(community_id, permission.to_string())
.await
}
async fn revoke_community_permission_for_all(
async fn revoke_community_permission_for_all<T>(
&mut self,
community_id: Uuid,
permission: CommunityPermission,
) -> Result<(), Error> {
permission: T,
) -> Result<(), Error>
where
T: ToString + Send,
{
self.messaging_store()?
.revoke_community_permission_for_all(community_id, permission)
.revoke_community_permission_for_all(community_id, permission.to_string())
.await
}
async fn has_community_permission<T>(
&mut self,
community_id: Uuid,
permission: T,
member: DID,
) -> Result<bool, Error>
where
T: ToString + Send,
{
self.messaging_store()?
.has_community_permission(community_id, permission.to_string(), member)
.await
}
async fn remove_community_member(
Expand Down Expand Up @@ -1965,46 +1988,95 @@ impl RayGunCommunity for WarpIpfs {
.edit_community_channel_description(community_id, channel_id, description)
.await
}
async fn grant_community_channel_permission(
async fn grant_community_channel_permission<T>(
&mut self,
community_id: Uuid,
channel_id: Uuid,
permission: CommunityChannelPermission,
permission: T,
role_id: RoleId,
) -> Result<(), Error> {
) -> Result<(), Error>
where
T: ToString + Send,
{
self.messaging_store()?
.grant_community_channel_permission(community_id, channel_id, permission, role_id)
.grant_community_channel_permission(
community_id,
channel_id,
permission.to_string(),
role_id,
)
.await
}
async fn revoke_community_channel_permission(
async fn revoke_community_channel_permission<T>(
&mut self,
community_id: Uuid,
channel_id: Uuid,
permission: CommunityChannelPermission,
permission: T,
role_id: RoleId,
) -> Result<(), Error> {
) -> Result<(), Error>
where
T: ToString + Send,
{
self.messaging_store()?
.revoke_community_channel_permission(community_id, channel_id, permission, role_id)
.revoke_community_channel_permission(
community_id,
channel_id,
permission.to_string(),
role_id,
)
.await
}
async fn grant_community_channel_permission_for_all(
async fn grant_community_channel_permission_for_all<T>(
&mut self,
community_id: Uuid,
channel_id: Uuid,
permission: CommunityChannelPermission,
) -> Result<(), Error> {
permission: T,
) -> Result<(), Error>
where
T: ToString + Send,
{
self.messaging_store()?
.grant_community_channel_permission_for_all(community_id, channel_id, permission)
.grant_community_channel_permission_for_all(
community_id,
channel_id,
permission.to_string(),
)
.await
}
async fn revoke_community_channel_permission_for_all(
async fn revoke_community_channel_permission_for_all<T>(
&mut self,
community_id: Uuid,
channel_id: Uuid,
permission: CommunityChannelPermission,
) -> Result<(), Error> {
permission: T,
) -> Result<(), Error>
where
T: ToString + Send,
{
self.messaging_store()?
.revoke_community_channel_permission_for_all(
community_id,
channel_id,
permission.to_string(),
)
.await
}
async fn has_community_channel_permission<T>(
&mut self,
community_id: Uuid,
channel_id: Uuid,
permission: T,
member: DID,
) -> Result<bool, Error>
where
T: ToString + Send,
{
self.messaging_store()?
.revoke_community_channel_permission_for_all(community_id, channel_id, permission)
.has_community_channel_permission(
community_id,
channel_id,
permission.to_string(),
member,
)
.await
}

Expand Down
54 changes: 17 additions & 37 deletions extensions/warp-ipfs/src/store/community.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,8 @@ use warp::{
error::Error,
raygun::{
community::{
Community, CommunityChannel, CommunityChannelPermission, CommunityChannelPermissions,
CommunityChannelType, CommunityInvite, CommunityPermission, CommunityPermissions,
CommunityRole, RoleId,
Community, CommunityChannel, CommunityChannelPermissions, CommunityChannelType,
CommunityInvite, CommunityPermission, CommunityPermissions, CommunityRole, RoleId,
},
Message, MessageOptions, MessagePage, MessageReference, Messages, MessagesType,
},
Expand Down Expand Up @@ -190,33 +189,9 @@ impl CommunityDocument {
let creator = keypair.to_did()?;

let mut permissions = CommunityPermissions::new();
permissions.insert(CommunityPermission::EditName, IndexSet::new());
permissions.insert(CommunityPermission::EditDescription, IndexSet::new());
permissions.insert(CommunityPermission::EditIcon, IndexSet::new());
permissions.insert(CommunityPermission::EditBanner, IndexSet::new());

permissions.insert(CommunityPermission::CreateRoles, IndexSet::new());
permissions.insert(CommunityPermission::EditRoles, IndexSet::new());
permissions.insert(CommunityPermission::DeleteRoles, IndexSet::new());

permissions.insert(CommunityPermission::GrantRoles, IndexSet::new());
permissions.insert(CommunityPermission::RevokeRoles, IndexSet::new());

permissions.insert(CommunityPermission::GrantPermissions, IndexSet::new());
permissions.insert(CommunityPermission::RevokePermissions, IndexSet::new());

permissions.insert(CommunityPermission::CreateChannels, IndexSet::new());
permissions.insert(CommunityPermission::EditChannels, IndexSet::new());
permissions.insert(CommunityPermission::DeleteChannels, IndexSet::new());

//We don't add CreateInvites permission since by default we leave it unrestricted.
permissions.insert(CommunityPermission::EditInvites, IndexSet::new());
permissions.insert(CommunityPermission::DeleteInvites, IndexSet::new());

permissions.insert(CommunityPermission::RemoveMembers, IndexSet::new());

permissions.insert(CommunityPermission::DeleteMessages, IndexSet::new());
permissions.insert(CommunityPermission::PinMessages, IndexSet::new());
for permission in CommunityPermission::default_disabled() {
permissions.insert(permission.to_string(), IndexSet::new());
}

let mut members = IndexSet::new();
members.insert(creator.clone());
Expand Down Expand Up @@ -299,14 +274,17 @@ impl CommunityDocument {
}
false
}
pub fn has_permission(&self, user: &DID, has_permission: &CommunityPermission) -> bool {
pub fn has_permission<T>(&self, user: &DID, has_permission: &T) -> bool
where
T: ToString,
{
if &self.owner == user {
return true;
}
if !self.members.contains(user) {
return false;
}
let Some(authorized_roles) = self.permissions.get(has_permission) else {
let Some(authorized_roles) = self.permissions.get(&has_permission.to_string()) else {
return true;
};
for authorized_role in authorized_roles {
Expand All @@ -318,13 +296,15 @@ impl CommunityDocument {
}
false
}

pub fn has_channel_permission(
pub fn has_channel_permission<T>(
&self,
user: &DID,
has_permission: &CommunityChannelPermission,
has_permission: &T,
channel_id: Uuid,
) -> bool {
) -> bool
where
T: ToString,
{
if &self.owner == user {
return true;
}
Expand All @@ -334,7 +314,7 @@ impl CommunityDocument {
let Some(channel) = self.channels.get(&channel_id.to_string()) else {
return false;
};
let Some(authorized_roles) = channel.permissions.get(has_permission) else {
let Some(authorized_roles) = channel.permissions.get(&has_permission.to_string()) else {
return true;
};
for authorized_role in authorized_roles {
Expand Down
Loading
Loading