Skip to content

Commit 891f8e6

Browse files
authored
disallow metadata changes for dms (#1170)
1 parent 7e51928 commit 891f8e6

File tree

3 files changed

+40
-15
lines changed

3 files changed

+40
-15
lines changed

.github/workflows/release-swift-bindings-nix.yml

+6
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ jobs:
4949
with:
5050
workspaces: |
5151
.
52+
- name: Install Nix
53+
uses: cachix/install-nix-action@v17
54+
with:
55+
# Mostly to avoid GitHub rate limiting
56+
extra_nix_config: |
57+
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
5258
- name: Generate bindings
5359
working-directory: bindings_ffi
5460
run: |

flake.nix

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
# https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/android.section.md
5252
androidHome = "${androidComposition.androidsdk}/libexec/android-sdk";
5353
androidComposition = androidenv.composeAndroidPackages sdkArgs;
54-
packages = with pkgs; [ swiftformat cargo-ndk ];
5554

5655
# Packages available to flake while building the environment
5756
nativeBuildInputs = with pkgs; [ pkg-config ];
@@ -62,6 +61,7 @@
6261
kotlin
6362
androidsdk
6463
jdk17
64+
cargo-ndk
6565

6666
# System Libraries
6767
sqlite

xmtp_mls/src/groups/mod.rs

+33-14
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ pub enum GroupError {
199199
MissingPendingCommit,
200200
#[error("Sync failed to wait for intent")]
201201
SyncFailedToWait,
202+
#[error("cannot change metadata of DM")]
203+
DmGroupMetadataForbidden,
202204
}
203205

204206
impl RetryableError for GroupError {
@@ -596,8 +598,7 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
596598
///
597599
/// If so, adds/removes those group members
598600
pub async fn update_installations(&self) -> Result<(), GroupError> {
599-
let conn = self.context().store().conn()?;
600-
let provider = XmtpOpenMlsProvider::from(conn);
601+
let provider = self.client.mls_provider()?;
601602
self.maybe_update_installations(&provider, Some(0)).await?;
602603
Ok(())
603604
}
@@ -794,12 +795,15 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
794795
/// Updates the name of the group. Will error if the user does not have the appropriate permissions
795796
/// to perform these updates.
796797
pub async fn update_group_name(&self, group_name: String) -> Result<(), GroupError> {
798+
let provider = self.client.mls_provider()?;
799+
if self.metadata(&provider)?.conversation_type == ConversationType::Dm {
800+
return Err(GroupError::DmGroupMetadataForbidden);
801+
}
797802
let intent_data: Vec<u8> =
798803
UpdateMetadataIntentData::new_update_group_name(group_name).into();
799804
let intent = self.queue_intent(IntentKind::MetadataUpdate, intent_data)?;
800805

801-
self.sync_until_intent_resolved(&self.client.mls_provider()?, intent.id)
802-
.await
806+
self.sync_until_intent_resolved(&provider, intent.id).await
803807
}
804808

805809
/// Updates the permission policy of the group. This requires super admin permissions.
@@ -809,6 +813,10 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
809813
permission_policy: PermissionPolicyOption,
810814
metadata_field: Option<MetadataField>,
811815
) -> Result<(), GroupError> {
816+
let provider = self.client.mls_provider()?;
817+
if self.metadata(&provider)?.conversation_type == ConversationType::Dm {
818+
return Err(GroupError::DmGroupMetadataForbidden);
819+
}
812820
if permission_update_type == PermissionUpdateType::UpdateMetadata
813821
&& metadata_field.is_none()
814822
{
@@ -824,8 +832,7 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
824832

825833
let intent = self.queue_intent(IntentKind::UpdatePermission, intent_data)?;
826834

827-
self.sync_until_intent_resolved(&self.client.mls_provider()?, intent.id)
828-
.await
835+
self.sync_until_intent_resolved(&provider, intent.id).await
829836
}
830837

831838
/// Retrieves the group name from the group's mutable metadata extension.
@@ -847,12 +854,15 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
847854
&self,
848855
group_description: String,
849856
) -> Result<(), GroupError> {
857+
let provider = self.client.mls_provider()?;
858+
if self.metadata(&provider)?.conversation_type == ConversationType::Dm {
859+
return Err(GroupError::DmGroupMetadataForbidden);
860+
}
850861
let intent_data: Vec<u8> =
851862
UpdateMetadataIntentData::new_update_group_description(group_description).into();
852863
let intent = self.queue_intent(IntentKind::MetadataUpdate, intent_data)?;
853864

854-
self.sync_until_intent_resolved(&self.client.mls_provider()?, intent.id)
855-
.await
865+
self.sync_until_intent_resolved(&provider, intent.id).await
856866
}
857867

858868
pub fn group_description(&self, provider: impl OpenMlsProvider) -> Result<String, GroupError> {
@@ -873,13 +883,16 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
873883
&self,
874884
group_image_url_square: String,
875885
) -> Result<(), GroupError> {
886+
let provider = self.client.mls_provider()?;
887+
if self.metadata(&provider)?.conversation_type == ConversationType::Dm {
888+
return Err(GroupError::DmGroupMetadataForbidden);
889+
}
876890
let intent_data: Vec<u8> =
877891
UpdateMetadataIntentData::new_update_group_image_url_square(group_image_url_square)
878892
.into();
879893
let intent = self.queue_intent(IntentKind::MetadataUpdate, intent_data)?;
880894

881-
self.sync_until_intent_resolved(&self.client.mls_provider()?, intent.id)
882-
.await
895+
self.sync_until_intent_resolved(&provider, intent.id).await
883896
}
884897

885898
/// Retrieves the image URL (square) of the group from the group's mutable metadata extension.
@@ -903,12 +916,15 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
903916
&self,
904917
pinned_frame_url: String,
905918
) -> Result<(), GroupError> {
919+
let provider = self.client.mls_provider()?;
920+
if self.metadata(&provider)?.conversation_type == ConversationType::Dm {
921+
return Err(GroupError::DmGroupMetadataForbidden);
922+
}
906923
let intent_data: Vec<u8> =
907924
UpdateMetadataIntentData::new_update_group_pinned_frame_url(pinned_frame_url).into();
908925
let intent = self.queue_intent(IntentKind::MetadataUpdate, intent_data)?;
909926

910-
self.sync_until_intent_resolved(&self.client.mls_provider()?, intent.id)
911-
.await
927+
self.sync_until_intent_resolved(&provider, intent.id).await
912928
}
913929

914930
pub fn group_pinned_frame_url(
@@ -968,6 +984,10 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
968984
action_type: UpdateAdminListType,
969985
inbox_id: String,
970986
) -> Result<(), GroupError> {
987+
let provider = self.client.mls_provider()?;
988+
if self.metadata(&provider)?.conversation_type == ConversationType::Dm {
989+
return Err(GroupError::DmGroupMetadataForbidden);
990+
}
971991
let intent_action_type = match action_type {
972992
UpdateAdminListType::Add => AdminListActionType::Add,
973993
UpdateAdminListType::Remove => AdminListActionType::Remove,
@@ -978,8 +998,7 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
978998
UpdateAdminListIntentData::new(intent_action_type, inbox_id).into();
979999
let intent = self.queue_intent(IntentKind::UpdateAdminList, intent_data)?;
9801000

981-
self.sync_until_intent_resolved(&self.client.mls_provider()?, intent.id)
982-
.await
1001+
self.sync_until_intent_resolved(&provider, intent.id).await
9831002
}
9841003

9851004
/// Find the `inbox_id` of the group member who added the member to the group

0 commit comments

Comments
 (0)