Skip to content

Commit cd60f8e

Browse files
committed
Merge branch 'pilip/user-group-removal' into 'master'
feat: Allow to remove members from group See merge request TankerHQ/sdk-rust!51
2 parents 402f93d + dee707e commit cd60f8e

File tree

3 files changed

+80
-7
lines changed

3 files changed

+80
-7
lines changed

src/core.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ impl Core {
268268
unsafe { ctanker::create_group(self.ctanker, &members).await }
269269
}
270270

271-
/// Add members to an existing group.
271+
/// Add or remove members from an existing group.
272272
///
273273
/// The Tanker status must be `Ready`.
274274
///
@@ -277,21 +277,31 @@ impl Core {
277277
/// # Arguments
278278
/// * `group_id` - Group ID to modify
279279
/// * `users_to_add` - Public identities of users to add to the group
280-
pub async fn update_group_members<S, Iter>(
280+
/// * `users_to_remove` - Public identities of users to remove from the group
281+
pub async fn update_group_members<S, AddIter, RemoveIter>(
281282
&self,
282283
group_id: &str,
283-
users_to_add: Iter,
284+
users_to_add: AddIter,
285+
users_to_remove: RemoveIter,
284286
) -> Result<(), Error>
285287
where
286288
S: AsRef<str>,
287-
Iter: IntoIterator<Item = S>,
289+
AddIter: IntoIterator<Item = S>,
290+
RemoveIter: IntoIterator<Item = S>,
288291
{
289292
let group_id = CString::new(group_id).unwrap();
290293
let users_to_add: Vec<_> = users_to_add
291294
.into_iter()
292295
.map(|r| CString::new(r.as_ref()).unwrap())
293296
.collect();
294-
unsafe { ctanker::update_group_members(self.ctanker, &group_id, &users_to_add).await }
297+
let users_to_remove: Vec<_> = users_to_remove
298+
.into_iter()
299+
.map(|r| CString::new(r.as_ref()).unwrap())
300+
.collect();
301+
unsafe {
302+
ctanker::update_group_members(self.ctanker, &group_id, &users_to_add, &users_to_remove)
303+
.await
304+
}
295305
}
296306

297307
/// Revokes one of the user's devices.

src/ctanker.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,15 +454,22 @@ pub async unsafe fn update_group_members(
454454
ctanker: CTankerPtr,
455455
group_id: &CStr,
456456
users_to_add: &[CString],
457+
users_to_remove: &[CString],
457458
) -> Result<(), Error> {
458459
let users_to_add = users_to_add.iter().map(|u| u.as_ptr()).collect::<Vec<_>>();
460+
let users_to_remove = users_to_remove
461+
.iter()
462+
.map(|u| u.as_ptr())
463+
.collect::<Vec<_>>();
459464

460465
let fut = unsafe {
461466
CFuture::<c_void>::new(tanker_update_group_members(
462467
ctanker,
463468
group_id.as_ptr(),
464469
users_to_add.as_ptr(),
465470
users_to_add.len() as u64,
471+
users_to_remove.as_ptr(),
472+
users_to_remove.len() as u64,
466473
))
467474
};
468475
fut.await.map(|_| ())

tests/group_tests.rs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,18 +95,74 @@ async fn add_member_to_group() -> Result<(), Error> {
9595

9696
let group_id = alice.create_group(&[&alice_pub_id]).await?;
9797

98-
let msg = "Für wenst'd've hätten wir Hunger?".as_bytes();
98+
let msg = b"<insert famous citation here>";
9999
let encrypted = alice.encrypt(msg, &Default::default()).await?;
100100
let resource_id = alice.get_resource_id(&encrypted)?;
101101

102102
let options = SharingOptions::new().share_with_groups(&[&group_id]);
103103
alice.share(&[resource_id], &options).await?;
104104

105-
alice.update_group_members(&group_id, &[bob_pub_id]).await?;
105+
alice
106+
.update_group_members(&group_id, &[bob_pub_id], &[])
107+
.await?;
106108

107109
assert_eq!(bob.decrypt(&encrypted).await?, msg);
108110

109111
alice.stop().await?;
110112
bob.stop().await?;
111113
Ok(())
112114
}
115+
116+
#[tokio::test(flavor = "multi_thread")]
117+
async fn remove_member_from_group() -> Result<(), Error> {
118+
let app = TestApp::get().await;
119+
let alice_id = app.create_identity(None);
120+
let alice_pub_id = app.get_public_identity(&alice_id);
121+
let alice = app.start_anonymous(&alice_id).await?;
122+
let bob_id = app.create_identity(None);
123+
let bob_pub_id = app.get_public_identity(&bob_id);
124+
let bob = app.start_anonymous(&bob_id).await?;
125+
126+
let group_id = alice.create_group(&[&alice_pub_id, &bob_pub_id]).await?;
127+
128+
let msg = b"<insert famous citation here>";
129+
let options = EncryptionOptions::new().share_with_groups(&[&group_id]);
130+
let encrypted = alice.encrypt(msg, &options).await?;
131+
132+
assert_eq!(bob.decrypt(&encrypted).await?, msg);
133+
134+
alice
135+
.update_group_members(&group_id, &[], &[bob_pub_id])
136+
.await?;
137+
138+
let encrypted = alice.encrypt(msg, &options).await?;
139+
140+
let err = bob.decrypt(&encrypted).await.unwrap_err();
141+
assert_eq!(err.code(), ErrorCode::InvalidArgument);
142+
143+
alice.stop().await?;
144+
bob.stop().await?;
145+
Ok(())
146+
}
147+
148+
#[tokio::test(flavor = "multi_thread")]
149+
async fn reject_empty_group_update() -> Result<(), Error> {
150+
let app = TestApp::get().await;
151+
let alice_id = app.create_identity(None);
152+
let alice_pub_id = app.get_public_identity(&alice_id);
153+
let alice = app.start_anonymous(&alice_id).await?;
154+
155+
let group_id = alice.create_group(&[&alice_pub_id]).await?;
156+
157+
let empty_vec = Vec::<String>::new();
158+
159+
let err = alice
160+
.update_group_members(&group_id, &empty_vec, &empty_vec)
161+
.await
162+
.unwrap_err();
163+
assert_eq!(err.code(), ErrorCode::InvalidArgument);
164+
165+
alice.stop().await?;
166+
167+
Ok(())
168+
}

0 commit comments

Comments
 (0)