ACL enhancements.

main
Mauro D 2022-07-21 16:53:38 +00:00
parent f5e9922294
commit 9461f63842
5 changed files with 57 additions and 5 deletions

View File

@ -188,6 +188,19 @@ impl Client {
request.send_single::<QueryResponse>().await request.send_single::<QueryResponse>().await
} }
pub async fn email_query_changes(
&self,
since_query_state: impl Into<String>,
filter: Option<impl Into<Filter<super::query::Filter>>>,
) -> crate::Result<QueryChangesResponse> {
let mut request = self.build();
let query_request = request.query_email_changes(since_query_state);
if let Some(filter) = filter {
query_request.filter(filter);
}
request.send_single::<QueryChangesResponse>().await
}
pub async fn email_parse( pub async fn email_parse(
&self, &self,
blob_id: &str, blob_id: &str,

View File

@ -56,6 +56,10 @@ impl Mailbox<Get> {
pub fn acl(&self) -> Option<&HashMap<String, Vec<ACL>>> { pub fn acl(&self) -> Option<&HashMap<String, Vec<ACL>>> {
self.acl.as_ref() self.acl.as_ref()
} }
pub fn take_acl(&mut self) -> Option<HashMap<String, Vec<ACL>>> {
self.acl.take()
}
} }
impl MailboxRights { impl MailboxRights {

View File

@ -93,7 +93,14 @@ pub struct Mailbox<State = Get> {
#[serde(flatten)] #[serde(flatten)]
#[serde(skip_deserializing)] #[serde(skip_deserializing)]
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
acl_patch: Option<HashMap<String, Vec<ACL>>>, acl_patch: Option<HashMap<String, ACLPatch>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub(crate) enum ACLPatch {
Replace(Vec<ACL>),
Set(bool),
} }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]

View File

@ -2,7 +2,7 @@ use std::collections::HashMap;
use crate::{core::set::SetObject, principal::ACL, Get, Set}; use crate::{core::set::SetObject, principal::ACL, Get, Set};
use super::{Mailbox, Role, SetArguments}; use super::{ACLPatch, Mailbox, Role, SetArguments};
impl Mailbox<Set> { impl Mailbox<Set> {
pub fn name(&mut self, name: impl Into<String>) -> &mut Self { pub fn name(&mut self, name: impl Into<String>) -> &mut Self {
@ -54,9 +54,18 @@ impl Mailbox<Set> {
} }
pub fn acl(&mut self, id: &str, acl: impl IntoIterator<Item = ACL>) -> &mut Self { pub fn acl(&mut self, id: &str, acl: impl IntoIterator<Item = ACL>) -> &mut Self {
self.acl_patch self.acl_patch.get_or_insert_with(HashMap::new).insert(
.get_or_insert_with(HashMap::new) format!("acl/{}", id),
.insert(format!("acl/{}", id), acl.into_iter().collect()); ACLPatch::Replace(acl.into_iter().collect()),
);
self
}
pub fn acl_set(&mut self, id: &str, acl: ACL, set: bool) -> &mut Self {
self.acl_patch.get_or_insert_with(HashMap::new).insert(
format!("acl/{}/{}", id, acl.to_string()),
ACLPatch::Set(set),
);
self self
} }
} }

View File

@ -159,6 +159,25 @@ impl Display for Property {
} }
} }
impl Display for ACL {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ACL::Read => write!(f, "read"),
ACL::Modify => write!(f, "modify"),
ACL::Delete => write!(f, "delete"),
ACL::ReadItems => write!(f, "readItems"),
ACL::AddItems => write!(f, "addItems"),
ACL::ModifyItems => write!(f, "modifyItems"),
ACL::RemoveItems => write!(f, "removeItems"),
ACL::CreateChild => write!(f, "createChild"),
ACL::Administer => write!(f, "administer"),
ACL::SetSeen => write!(f, "setSeen"),
ACL::SetKeywords => write!(f, "setKeywords"),
ACL::Submit => write!(f, "submit"),
}
}
}
impl Object for Principal<Set> { impl Object for Principal<Set> {
type Property = Property; type Property = Property;