Skip to content

Commit 2440549

Browse files
Support two more endpoints
* GET /api/users/without-permissions * POST /api/users/bulk-delete
1 parent 1822234 commit 2440549

File tree

4 files changed

+65
-4
lines changed

4 files changed

+65
-4
lines changed

src/api.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ use crate::{
2929
commons::{BindingDestinationType, UserLimitTarget, VirtualHostLimitTarget},
3030
path,
3131
requests::{
32-
self, EnforcedLimitParams, ExchangeParams, Permissions, PolicyParams, QueueParams,
33-
RuntimeParameterDefinition, UserParams, VirtualHostParams, XArguments,
32+
self, BulkUserDelete, EnforcedLimitParams, ExchangeParams, Permissions, PolicyParams,
33+
QueueParams, RuntimeParameterDefinition, UserParams, VirtualHostParams, XArguments,
3434
},
3535
responses::{self, BindingInfo, DefinitionSet},
3636
};
@@ -241,6 +241,16 @@ where
241241
Ok(response)
242242
}
243243

244+
/// Lists users in the internal database that do not have access
245+
/// to any virtual hosts.
246+
pub async fn list_users_without_permissions(&self) -> Result<Vec<responses::User>> {
247+
let response = self
248+
.http_get("users/without-permissions", None, None)
249+
.await?;
250+
let response = response.json().await?;
251+
Ok(response)
252+
}
253+
244254
/// Lists all client connections across the cluster.
245255
pub async fn list_connections(&self) -> Result<Vec<responses::Connection>> {
246256
let response = self.http_get("connections", None, None).await?;
@@ -614,6 +624,14 @@ where
614624
Ok(())
615625
}
616626

627+
pub async fn delete_users(&self, usernames: Vec<&str>) -> Result<()> {
628+
let delete = BulkUserDelete { usernames };
629+
let _response = self
630+
.http_post(path!("users", "bulk-delete"), &delete, None, None)
631+
.await?;
632+
Ok(())
633+
}
634+
617635
pub async fn clear_permissions(
618636
&self,
619637
vhost: &str,

src/blocking_api.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ use crate::{
1919
commons::{BindingDestinationType, UserLimitTarget, VirtualHostLimitTarget},
2020
path,
2121
requests::{
22-
self, EnforcedLimitParams, ExchangeParams, Permissions, PolicyParams, QueueParams,
23-
RuntimeParameterDefinition, UserParams, VirtualHostParams, XArguments,
22+
self, BulkUserDelete, EnforcedLimitParams, ExchangeParams, Permissions, PolicyParams,
23+
QueueParams, RuntimeParameterDefinition, UserParams, VirtualHostParams, XArguments,
2424
},
2525
responses::{self, BindingInfo, DefinitionSet},
2626
};
@@ -560,6 +560,12 @@ where
560560
Ok(())
561561
}
562562

563+
pub fn delete_users(&self, usernames: Vec<&str>) -> Result<()> {
564+
let delete = BulkUserDelete { usernames };
565+
let _response = self.http_post(path!("users", "bulk-delete"), &delete, None, None)?;
566+
Ok(())
567+
}
568+
563569
pub fn clear_permissions(&self, vhost: &str, username: &str, idempotently: bool) -> Result<()> {
564570
let excludes = if idempotently {
565571
Some(StatusCode::NOT_FOUND)

src/requests.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,12 @@ impl<'a> ExchangeParams<'a> {
321321
}
322322
}
323323

324+
#[derive(Serialize, Deserialize)]
325+
pub struct BulkUserDelete<'a> {
326+
#[serde(borrow, rename = "users")]
327+
pub usernames: Vec<&'a str>,
328+
}
329+
324330
pub type RuntimeParameterValue = Map<String, Value>;
325331

326332
/// Represents a [runtime parameter](https://rabbitmq.com/docs/parameters/).

tests/user_tests.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,34 @@ fn test_user_deletion() {
109109
let result2 = rc.delete_user(name, false);
110110
assert!(result2.is_ok());
111111
}
112+
113+
#[test]
114+
fn test_bulk_user_deletion() {
115+
let endpoint = endpoint();
116+
let rc = Client::new(&endpoint, USERNAME, PASSWORD);
117+
118+
let salt = password_hashing::salt();
119+
let password_hash =
120+
password_hashing::base64_encoded_salted_password_hash_sha256(&salt, "del3te_me");
121+
122+
let name1 = "del3te_me_1";
123+
let params1 = UserParams {
124+
name: name1,
125+
password_hash: &password_hash,
126+
tags: "management",
127+
};
128+
let result1 = rc.create_user(&params1);
129+
assert!(result1.is_ok());
130+
131+
let name2 = "del3te_me_2";
132+
let params2 = UserParams {
133+
name: name2,
134+
password_hash: &password_hash,
135+
tags: "management",
136+
};
137+
let result2 = rc.create_user(&params2);
138+
assert!(result2.is_ok());
139+
140+
let result2 = rc.delete_users(vec![name1, name2]);
141+
assert!(result2.is_ok());
142+
}

0 commit comments

Comments
 (0)