Internal directory + CLI improvements

This commit is contained in:
mdecimus
2023-12-20 20:09:39 +01:00
parent d4aca0a8e0
commit 91e8597998
34 changed files with 699 additions and 360 deletions

View File

@@ -79,7 +79,7 @@ async fn imap_directory() {
assert_eq!(
&LookupResult::from(
handle
.query(QueryBy::Credentials(item.as_credentials()))
.query(QueryBy::Credentials(item.as_credentials()), true)
.await
.unwrap()
.is_some()
@@ -99,7 +99,7 @@ async fn imap_directory() {
tokio::spawn(async move {
LookupResult::from(
handle
.query(QueryBy::Credentials(item.as_credentials()))
.query(QueryBy::Credentials(item.as_credentials()), true)
.await
.unwrap()
.is_some(),

View File

@@ -158,10 +158,13 @@ async fn internal_directory() {
assert_eq!(store.vrfy("jane").await.unwrap(), vec!["jane@example.org"]);
assert_eq!(
store
.query(QueryBy::Credentials(&Credentials::new(
"jane".to_string(),
"my_secret".to_string()
)))
.query(
QueryBy::Credentials(&Credentials::new(
"jane".to_string(),
"my_secret".to_string()
)),
true
)
.await
.unwrap(),
Some(Principal {
@@ -176,10 +179,13 @@ async fn internal_directory() {
);
assert_eq!(
store
.query(QueryBy::Credentials(&Credentials::new(
"jane".to_string(),
"wrong_password".to_string()
)))
.query(
QueryBy::Credentials(&Credentials::new(
"jane".to_string(),
"wrong_password".to_string()
)),
true
)
.await
.unwrap(),
None
@@ -208,12 +214,23 @@ async fn internal_directory() {
name: "list".to_string(),
typ: Type::List,
emails: vec!["list@example.org".to_string()],
member_of: vec!["john".to_string(), "jane".to_string()],
..Default::default()
})
.await,
Ok(2)
);
assert_eq!(
store
.update_account(
QueryBy::Name("list"),
vec![PrincipalUpdate::set(
PrincipalField::Members,
PrincipalValue::StringList(vec!["john".to_string(), "jane".to_string()]),
),],
)
.await,
Ok(())
);
assert!(store.rcpt("list@example.org").await.unwrap());
assert_eq!(
store.email_to_ids("list@example.org").await.unwrap(),
@@ -221,15 +238,15 @@ async fn internal_directory() {
);
assert_eq!(
store
.map_group_ids(store.query(QueryBy::Name("list")).await.unwrap().unwrap())
.query(QueryBy::Name("list"), true)
.await
.unwrap()
.unwrap(),
Principal {
name: "list".to_string(),
id: 2,
typ: Type::List,
emails: vec!["list@example.org".to_string()],
member_of: vec!["john".to_string(), "jane".to_string()],
..Default::default()
}
);
@@ -283,7 +300,13 @@ async fn internal_directory() {
);
assert_eq!(
store
.map_group_ids(store.query(QueryBy::Name("john")).await.unwrap().unwrap())
.map_group_ids(
store
.query(QueryBy::Name("john"), true)
.await
.unwrap()
.unwrap()
)
.await
.unwrap(),
Principal {
@@ -291,7 +314,11 @@ async fn internal_directory() {
description: Some("John Doe".to_string()),
secrets: vec!["secret".to_string(), "secret2".to_string()],
emails: vec!["john@example.org".to_string()],
member_of: vec!["sales".to_string(), "support".to_string()],
member_of: vec![
"list".to_string(),
"sales".to_string(),
"support".to_string()
],
..Default::default()
}
);
@@ -327,7 +354,13 @@ async fn internal_directory() {
);
assert_eq!(
store
.map_group_ids(store.query(QueryBy::Name("john")).await.unwrap().unwrap())
.map_group_ids(
store
.query(QueryBy::Name("john"), true)
.await
.unwrap()
.unwrap()
)
.await
.unwrap(),
Principal {
@@ -335,7 +368,7 @@ async fn internal_directory() {
description: Some("John Doe".to_string()),
secrets: vec!["secret".to_string(), "secret2".to_string()],
emails: vec!["john@example.org".to_string()],
member_of: vec!["sales".to_string()],
member_of: vec!["list".to_string(), "sales".to_string()],
..Default::default()
}
);
@@ -380,7 +413,7 @@ async fn internal_directory() {
store
.map_group_ids(
store
.query(QueryBy::Name("john.doe"))
.query(QueryBy::Name("john.doe"), true)
.await
.unwrap()
.unwrap()
@@ -394,7 +427,7 @@ async fn internal_directory() {
emails: vec!["john.doe@example.org".to_string()],
quota: 1024,
typ: Type::Superuser,
member_of: vec!["sales".to_string()],
member_of: vec!["list".to_string(), "sales".to_string()],
..Default::default()
}
);
@@ -408,7 +441,7 @@ async fn internal_directory() {
.update_account(
QueryBy::Name("list"),
vec![PrincipalUpdate::remove_item(
PrincipalField::MemberOf,
PrincipalField::Members,
PrincipalValue::String("john.doe".to_string()),
)],
)
@@ -416,25 +449,15 @@ async fn internal_directory() {
Ok(())
);
assert_eq!(
store
.map_group_ids(store.query(QueryBy::Name("list")).await.unwrap().unwrap())
.await
.unwrap(),
Principal {
name: "list".to_string(),
id: 2,
typ: Type::List,
emails: vec!["list@example.org".to_string()],
member_of: vec!["jane".to_string()],
..Default::default()
}
store.email_to_ids("list@example.org").await.unwrap(),
vec![1]
);
assert_eq!(
store
.update_account(
QueryBy::Name("list"),
vec![PrincipalUpdate::add_item(
PrincipalField::MemberOf,
PrincipalField::Members,
PrincipalValue::String("john.doe".to_string()),
)],
)
@@ -442,18 +465,8 @@ async fn internal_directory() {
Ok(())
);
assert_eq!(
store
.map_group_ids(store.query(QueryBy::Name("list")).await.unwrap().unwrap())
.await
.unwrap(),
Principal {
name: "list".to_string(),
id: 2,
typ: Type::List,
emails: vec!["list@example.org".to_string()],
member_of: vec!["jane".to_string(), "john.doe".to_string()],
..Default::default()
}
store.email_to_ids("list@example.org").await.unwrap(),
vec![0, 1]
);
// Field validation

View File

@@ -46,10 +46,13 @@ async fn ldap_directory() {
// Test authentication
assert_eq!(
handle
.query(QueryBy::Credentials(&Credentials::Plain {
username: "john".to_string(),
secret: "12345".to_string()
}))
.query(
QueryBy::Credentials(&Credentials::Plain {
username: "john".to_string(),
secret: "12345".to_string()
}),
true
)
.await
.unwrap()
.unwrap()
@@ -71,10 +74,13 @@ async fn ldap_directory() {
);
assert_eq!(
handle
.query(QueryBy::Credentials(&Credentials::Plain {
username: "bill".to_string(),
secret: "password".to_string()
}))
.query(
QueryBy::Credentials(&Credentials::Plain {
username: "bill".to_string(),
secret: "password".to_string()
}),
true
)
.await
.unwrap()
.unwrap()
@@ -94,10 +100,13 @@ async fn ldap_directory() {
.into_sorted()
);
assert!(handle
.query(QueryBy::Credentials(&Credentials::Plain {
username: "bill".to_string(),
secret: "invalid".to_string()
}))
.query(
QueryBy::Credentials(&Credentials::Plain {
username: "bill".to_string(),
secret: "invalid".to_string()
}),
true
)
.await
.unwrap()
.is_none());
@@ -105,7 +114,7 @@ async fn ldap_directory() {
// Get user by name
assert_eq!(
handle
.query(QueryBy::Name("jane"))
.query(QueryBy::Name("jane"), true)
.await
.unwrap()
.unwrap()
@@ -125,7 +134,11 @@ async fn ldap_directory() {
// Get group by name
assert_eq!(
handle.query(QueryBy::Name("sales")).await.unwrap().unwrap(),
handle
.query(QueryBy::Name("sales"), true)
.await
.unwrap()
.unwrap(),
Principal {
id: base_store.get_account_id("sales").await.unwrap().unwrap(),
name: "sales".to_string(),

View File

@@ -97,7 +97,7 @@ async fn smtp_directory() {
let result: LookupResult = match item {
Item::IsAccount(v) => handle.rcpt(v).await.unwrap().into(),
Item::Authenticate(v) => handle
.query(QueryBy::Credentials(v))
.query(QueryBy::Credentials(v), true)
.await
.unwrap()
.is_some()
@@ -129,7 +129,7 @@ async fn smtp_directory() {
let result: LookupResult = match &item {
Item::IsAccount(v) => handle.rcpt(v).await.unwrap().into(),
Item::Authenticate(v) => handle
.query(QueryBy::Credentials(v))
.query(QueryBy::Credentials(v), true)
.await
.unwrap()
.is_some()

View File

@@ -133,10 +133,13 @@ async fn sql_directory() {
// Test authentication
assert_eq!(
handle
.query(QueryBy::Credentials(&Credentials::Plain {
username: "john".to_string(),
secret: "12345".to_string()
}))
.query(
QueryBy::Credentials(&Credentials::Plain {
username: "john".to_string(),
secret: "12345".to_string()
}),
true
)
.await
.unwrap()
.unwrap(),
@@ -157,10 +160,13 @@ async fn sql_directory() {
);
assert_eq!(
handle
.query(QueryBy::Credentials(&Credentials::Plain {
username: "bill".to_string(),
secret: "password".to_string()
}))
.query(
QueryBy::Credentials(&Credentials::Plain {
username: "bill".to_string(),
secret: "password".to_string()
}),
true
)
.await
.unwrap()
.unwrap(),
@@ -178,17 +184,24 @@ async fn sql_directory() {
}
);
assert!(handle
.query(QueryBy::Credentials(&Credentials::Plain {
username: "bill".to_string(),
secret: "invalid".to_string()
}))
.query(
QueryBy::Credentials(&Credentials::Plain {
username: "bill".to_string(),
secret: "invalid".to_string()
}),
true
)
.await
.unwrap()
.is_none());
// Get user by name
assert_eq!(
handle.query(QueryBy::Name("jane")).await.unwrap().unwrap(),
handle
.query(QueryBy::Name("jane"), true)
.await
.unwrap()
.unwrap(),
Principal {
id: base_store.get_account_id("jane").await.unwrap().unwrap(),
name: "jane".to_string(),
@@ -203,7 +216,11 @@ async fn sql_directory() {
// Get group by name
assert_eq!(
handle.query(QueryBy::Name("sales")).await.unwrap().unwrap(),
handle
.query(QueryBy::Name("sales"), true)
.await
.unwrap()
.unwrap(),
Principal {
id: base_store.get_account_id("sales").await.unwrap().unwrap(),
name: "sales".to_string(),