160 lines
5.0 KiB
Rust
160 lines
5.0 KiB
Rust
use super::{execute, request, token};
|
|
use serde_json::{Value, json};
|
|
use std::path::Path;
|
|
|
|
fn get(port: u16, action: &str, credentials: &str) -> (u16, Value) {
|
|
let (status, body) = request(
|
|
port,
|
|
"GET",
|
|
&format!("/demo/account/admin/roles/{action}"),
|
|
"fixture.test",
|
|
credentials,
|
|
"",
|
|
);
|
|
(status, serde_json::from_str(&body).unwrap())
|
|
}
|
|
|
|
fn post(port: u16, action: &str, credentials: &str, input: Value) -> (u16, Value) {
|
|
let (status, body) = request(
|
|
port,
|
|
"POST",
|
|
&format!("/demo/account/admin/roles/{action}"),
|
|
"fixture.test",
|
|
&format!("{credentials}Content-Type: application/json\r\n"),
|
|
&input.to_string(),
|
|
);
|
|
(status, serde_json::from_str(&body).unwrap())
|
|
}
|
|
|
|
pub(super) fn check(binary: &Path, port: u16, owner: &str) {
|
|
assert_eq!(get(port, "protected_me?unexpected=1", owner).0, 403);
|
|
assert_eq!(
|
|
post(port, "save_role", owner, json!({"unexpected":1})).0,
|
|
403
|
|
);
|
|
assert_eq!(get(port, "current_permissions", owner).1["data"], json!([]));
|
|
let bootstrap = execute(
|
|
binary,
|
|
"dever.auth.owner",
|
|
r#"{"site":"admin","user_id":1}"#,
|
|
);
|
|
assert!(
|
|
bootstrap.status.success(),
|
|
"{}",
|
|
String::from_utf8_lossy(&bootstrap.stderr)
|
|
);
|
|
assert_eq!(get(port, "protected_me", owner).0, 200);
|
|
assert_eq!(get(port, "protected_me?unexpected=1", owner).0, 400);
|
|
assert_eq!(get(port, "is_owner?user_id=1", owner).1["data"], true);
|
|
let directory = get(port, "permissions", owner).1["data"]
|
|
.as_array()
|
|
.unwrap()
|
|
.clone();
|
|
assert!(
|
|
directory
|
|
.iter()
|
|
.any(|entry| entry["key"] == "demo.account.admin.protected_me")
|
|
);
|
|
assert!(
|
|
!directory
|
|
.iter()
|
|
.any(|entry| entry["key"] == "demo.account.admin.me")
|
|
);
|
|
assert_eq!(
|
|
get(port, "current_permissions", owner).1["data"],
|
|
json!(directory)
|
|
);
|
|
for (action, input) in [
|
|
("delete_role", json!({"role_id":"owner"})),
|
|
("disable_role", json!({"role_id":"owner"})),
|
|
("revoke_role", json!({"role_id":"owner","user_id":1})),
|
|
("grant_role", json!({"role_id":"owner","user_id":2})),
|
|
(
|
|
"save_role",
|
|
json!({"id":"owner","name":"changed","all_permissions":false,"permission_keys":[]}),
|
|
),
|
|
] {
|
|
assert_eq!(post(port, action, owner, input).0, 403, "{action}");
|
|
}
|
|
let seeded = execute(
|
|
binary,
|
|
"demo.account.seed",
|
|
r#"{"subject":"reader","session":"reader-session"}"#,
|
|
);
|
|
assert!(seeded.status.success());
|
|
let reader = format!(
|
|
"Authorization: Bearer {}\r\n",
|
|
token("reader", "reader-session")
|
|
);
|
|
assert_eq!(get(port, "protected_me", &reader).0, 403);
|
|
let role = json!({"id":"reader","name":"Reader","all_permissions":false,"permission_keys":["demo.account.admin.protected_me"]});
|
|
assert_eq!(post(port, "save_role", owner, role.clone()).0, 200);
|
|
assert_eq!(
|
|
post(
|
|
port,
|
|
"grant_role",
|
|
owner,
|
|
json!({"user_id":2,"role_id":"reader"})
|
|
)
|
|
.0,
|
|
200
|
|
);
|
|
assert_eq!(get(port, "protected_me", &reader).0, 200);
|
|
assert_eq!(
|
|
get(port, "user_roles?user_id=2", &reader).1["data"][0]["permission_keys"],
|
|
json!(["demo.account.admin.protected_me"])
|
|
);
|
|
assert_eq!(get(port, "is_owner?user_id=2", &reader).1["data"], false);
|
|
assert_eq!(post(port, "save_role", &reader, role.clone()).0, 403);
|
|
let mut invalid = role.clone();
|
|
invalid["permission_keys"] = json!(["demo.account.admin.unknown"]);
|
|
assert_eq!(post(port, "save_role", owner, invalid).0, 400);
|
|
assert_eq!(get(port, "protected_me", &reader).0, 200);
|
|
assert_eq!(
|
|
post(port, "role_fail", owner, json!({"id":"rolled_back"})).0,
|
|
409
|
|
);
|
|
assert!(get(port, "role?id=rolled_back", owner).1["data"].is_null());
|
|
assert_eq!(
|
|
post(port, "disable_role", owner, json!({"role_id":"reader"})).0,
|
|
200
|
|
);
|
|
assert_eq!(get(port, "protected_me", &reader).0, 403);
|
|
assert_eq!(
|
|
get(port, "role?id=reader", owner).1["data"]["enabled"],
|
|
false
|
|
);
|
|
assert_eq!(post(port, "save_role", owner, role).0, 200);
|
|
assert_eq!(get(port, "protected_me", &reader).0, 200);
|
|
assert_eq!(
|
|
post(
|
|
port,
|
|
"revoke_role",
|
|
owner,
|
|
json!({"user_id":2,"role_id":"reader"})
|
|
)
|
|
.0,
|
|
200
|
|
);
|
|
assert_eq!(get(port, "protected_me", &reader).0, 403);
|
|
assert_eq!(
|
|
post(
|
|
port,
|
|
"grant_role",
|
|
owner,
|
|
json!({"user_id":2,"role_id":"reader"})
|
|
)
|
|
.0,
|
|
200
|
|
);
|
|
assert_eq!(
|
|
post(port, "delete_role", owner, json!({"role_id":"reader"})).0,
|
|
200
|
|
);
|
|
assert_eq!(
|
|
get(port, "user_roles?user_id=2", owner).1["data"],
|
|
json!([])
|
|
);
|
|
assert_eq!(get(port, "protected_me", &reader).0, 403);
|
|
}
|