diff --git a/crates/caldav/src/principal/mod.rs b/crates/caldav/src/principal/mod.rs index c533ed1..3bae264 100644 --- a/crates/caldav/src/principal/mod.rs +++ b/crates/caldav/src/principal/mod.rs @@ -2,7 +2,9 @@ use crate::Error; use rustical_dav::extensions::CommonPropertiesExtension; use rustical_dav::privileges::UserPrivilegeSet; use rustical_dav::resource::{PrincipalUri, Resource, ResourceName}; -use rustical_dav::xml::{Resourcetype, ResourcetypeInner, SupportedReportSet}; +use rustical_dav::xml::{ + GroupMemberSet, GroupMembership, Resourcetype, ResourcetypeInner, SupportedReportSet, +}; use rustical_store::auth::User; mod service; @@ -82,9 +84,9 @@ impl Resource for PrincipalResource { )) } PrincipalPropName::AlternateUriSet => PrincipalProp::AlternateUriSet, - PrincipalPropName::PrincipalCollectionSet => { - PrincipalProp::PrincipalCollectionSet(puri.principal_collection().into()) - } + // PrincipalPropName::PrincipalCollectionSet => { + // PrincipalProp::PrincipalCollectionSet(puri.principal_collection().into()) + // } PrincipalPropName::SupportedReportSet => { PrincipalProp::SupportedReportSet(SupportedReportSet::all()) } diff --git a/crates/caldav/src/principal/prop.rs b/crates/caldav/src/principal/prop.rs index 010ffec..56c1d9c 100644 --- a/crates/caldav/src/principal/prop.rs +++ b/crates/caldav/src/principal/prop.rs @@ -1,6 +1,6 @@ use rustical_dav::{ extensions::CommonPropertiesProp, - xml::{HrefElement, SupportedReportSet}, + xml::{GroupMemberSet, GroupMembership, HrefElement, SupportedReportSet}, }; use rustical_store::auth::user::PrincipalType; use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize}; @@ -24,8 +24,8 @@ pub enum PrincipalProp { GroupMemberSet(GroupMemberSet), #[xml(ns = "rustical_dav::namespace::NS_DAV", rename = b"alternate-URI-set")] AlternateUriSet, - #[xml(ns = "rustical_dav::namespace::NS_DAV")] - PrincipalCollectionSet(HrefElement), + // #[xml(ns = "rustical_dav::namespace::NS_DAV")] + // PrincipalCollectionSet(HrefElement), #[xml(ns = "rustical_dav::namespace::NS_DAV", skip_deserializing)] SupportedReportSet(SupportedReportSet), @@ -41,12 +41,6 @@ pub enum PrincipalPropWrapper { Common(CommonPropertiesProp), } -#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] -pub struct GroupMembership(#[xml(ty = "untagged", flatten)] pub(super) Vec); - -#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] -pub struct GroupMemberSet(#[xml(ty = "untagged", flatten)] pub(super) Vec); - #[derive(XmlSerialize, PartialEq, Clone, VariantArray)] pub enum ReportMethod { // We don't actually support principal-match diff --git a/crates/carddav/src/principal/mod.rs b/crates/carddav/src/principal/mod.rs index 97c8398..0e8ec58 100644 --- a/crates/carddav/src/principal/mod.rs +++ b/crates/carddav/src/principal/mod.rs @@ -2,7 +2,9 @@ use crate::Error; use rustical_dav::extensions::CommonPropertiesExtension; use rustical_dav::privileges::UserPrivilegeSet; use rustical_dav::resource::{PrincipalUri, Resource, ResourceName}; -use rustical_dav::xml::{HrefElement, Resourcetype, ResourcetypeInner}; +use rustical_dav::xml::{ + GroupMemberSet, GroupMembership, HrefElement, Resourcetype, ResourcetypeInner, +}; use rustical_store::auth::User; mod service; @@ -13,6 +15,7 @@ pub use prop::*; #[derive(Debug, Clone)] pub struct PrincipalResource { principal: User, + members: Vec, } impl ResourceName for PrincipalResource { @@ -41,7 +44,7 @@ impl Resource for PrincipalResource { user: &User, prop: &PrincipalPropWrapperName, ) -> Result { - let principal_href = HrefElement::new(puri.principal_uri(&user.id)); + let principal_href = HrefElement::new(puri.principal_uri(&self.principal.id)); Ok(match prop { PrincipalPropWrapperName::Principal(prop) => { @@ -60,6 +63,14 @@ impl Resource for PrincipalResource { .collect(), )) } + PrincipalPropName::GroupMemberSet => { + PrincipalProp::GroupMemberSet(GroupMemberSet( + self.members + .iter() + .map(|principal| puri.principal_uri(principal).into()) + .collect(), + )) + } PrincipalPropName::AlternateUriSet => PrincipalProp::AlternateUriSet, PrincipalPropName::PrincipalCollectionSet => { PrincipalProp::PrincipalCollectionSet(puri.principal_collection().into()) diff --git a/crates/carddav/src/principal/prop.rs b/crates/carddav/src/principal/prop.rs index da7afc0..b1d83e5 100644 --- a/crates/carddav/src/principal/prop.rs +++ b/crates/carddav/src/principal/prop.rs @@ -1,4 +1,7 @@ -use rustical_dav::{extensions::CommonPropertiesProp, xml::HrefElement}; +use rustical_dav::{ + extensions::CommonPropertiesProp, + xml::{GroupMemberSet, GroupMembership, HrefElement}, +}; use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize}; #[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, PropName)] @@ -10,6 +13,8 @@ pub enum PrincipalProp { PrincipalUrl(HrefElement), #[xml(ns = "rustical_dav::namespace::NS_DAV")] GroupMembership(GroupMembership), + #[xml(ns = "rustical_dav::namespace::NS_DAV")] + GroupMemberSet(GroupMemberSet), #[xml(ns = "rustical_dav::namespace::NS_DAV", rename = b"alternate-URI-set")] AlternateUriSet, #[xml(ns = "rustical_dav::namespace::NS_DAV")] @@ -28,6 +33,3 @@ pub enum PrincipalPropWrapper { Principal(PrincipalProp), Common(CommonPropertiesProp), } - -#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] -pub struct GroupMembership(#[xml(ty = "untagged", flatten)] pub(super) Vec); diff --git a/crates/carddav/src/principal/service.rs b/crates/carddav/src/principal/service.rs index 5edd65f..d607f0f 100644 --- a/crates/carddav/src/principal/service.rs +++ b/crates/carddav/src/principal/service.rs @@ -65,7 +65,10 @@ impl Reso .get_principal(principal) .await? .ok_or(crate::Error::NotFound)?; - Ok(PrincipalResource { principal: user }) + Ok(PrincipalResource { + members: self.auth_provider.list_members(&user.id).await?, + principal: user, + }) } async fn get_members( diff --git a/crates/dav/src/xml/group.rs b/crates/dav/src/xml/group.rs new file mode 100644 index 0000000..fe54805 --- /dev/null +++ b/crates/dav/src/xml/group.rs @@ -0,0 +1,8 @@ +use crate::xml::HrefElement; +use rustical_xml::{XmlDeserialize, XmlSerialize}; + +#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] +pub struct GroupMembership(#[xml(ty = "untagged", flatten)] pub Vec); + +#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] +pub struct GroupMemberSet(#[xml(ty = "untagged", flatten)] pub Vec); diff --git a/crates/dav/src/xml/mod.rs b/crates/dav/src/xml/mod.rs index 2c0f454..beac1f5 100644 --- a/crates/dav/src/xml/mod.rs +++ b/crates/dav/src/xml/mod.rs @@ -13,3 +13,5 @@ pub mod sync_collection; pub use error::ErrorElement; mod report_set; pub use report_set::SupportedReportSet; +mod group; +pub use group::*;