Add principal memberships to allow group accounts

This commit is contained in:
Lennart
2025-02-02 11:58:58 +01:00
parent 031d94c9d1
commit ccae96bb17
3 changed files with 26 additions and 4 deletions

View File

@@ -77,16 +77,23 @@ impl Resource for PrincipalResource {
prop: &PrincipalPropWrapperName,
) -> Result<Self::Prop, Self::Error> {
let principal_url = Self::get_url(rmap, vec![&self.principal]).unwrap();
let home_set = CalendarHomeSet(
self.home_set
.iter()
.map(|&(home_name, _read_only)| format!("{}/{}", principal_url, home_name).into())
user.memberships()
.into_iter()
.map(|principal| Self::get_url(rmap, vec![principal]).unwrap())
.flat_map(|principal_url| {
self.home_set.iter().map(move |&(home_name, _read_only)| {
HrefElement::new(format!("{}/{}", &principal_url, home_name))
})
})
.collect(),
);
Ok(match prop {
PrincipalPropWrapperName::Principal(prop) => {
PrincipalPropWrapper::Principal(match prop {
// TODO: principal types
PrincipalPropName::CalendarUserType => {
PrincipalProp::CalendarUserType("INDIVIDUAL")
}

View File

@@ -15,6 +15,8 @@ pub struct User {
pub password: Option<String>,
#[serde(default)]
pub app_tokens: Vec<String>,
#[serde(default)]
pub memberships: Vec<String>,
}
impl User {
@@ -25,7 +27,16 @@ impl User {
if self.id == principal {
return true;
}
false
self.memberships
.iter()
.any(|membership| membership == principal)
}
/// Returns all principals the user implements
pub fn memberships(&self) -> Vec<&str> {
let mut memberships: Vec<_> = self.memberships.iter().map(String::as_ref).collect();
memberships.push(self.id.as_str());
memberships
}
}

View File

@@ -35,6 +35,10 @@ pub fn cmd_gen_config(_args: GenConfigArgs) -> anyhow::Result<()> {
app_tokens: vec![
"generate an app token hash with rustical pwhash --algorithm pbkdf2".to_owned(),
],
memberships: vec![
"Here you can specify other principals this principal should be a member of"
.to_owned(),
],
}],
}),
data_store: DataStoreConfig::Sqlite(SqliteDataStoreConfig {