Upstream commit: 474dd0229cb20cf513036619781ed97bd8073c3f Enterprise-only files removed or emptied: 63 Enterprise-only snippets removed: 117 in 50 files Dangling module declarations removed: 5 Cargo edits turning enterprise off: 14 Verification: clean Enterprise feature gates left for rebuilt features: 19 in 18 files Produced by tools/fork/strip.py. The full report is in docs/fork/strip-reports/ on main.
108 lines
4.1 KiB
Rust
108 lines
4.1 KiB
Rust
/*
|
|
* SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <[email protected]>
|
|
*
|
|
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
|
|
*/
|
|
|
|
use crate::{DavError, DavErrorCondition};
|
|
use common::{DavResources, Server};
|
|
use dav_proto::schema::{
|
|
property::{CardDavProperty, DavProperty, WebDavProperty},
|
|
response::CardCondition,
|
|
};
|
|
use hyper::StatusCode;
|
|
use trc::AddContext;
|
|
use types::{collection::Collection, field::ContactField};
|
|
|
|
pub mod copy_move;
|
|
pub mod delete;
|
|
pub mod get;
|
|
pub mod mkcol;
|
|
pub mod proppatch;
|
|
pub mod query;
|
|
pub mod update;
|
|
|
|
pub(crate) static CARD_CONTAINER_PROPS: [DavProperty; 23] = [
|
|
DavProperty::WebDav(WebDavProperty::CreationDate),
|
|
DavProperty::WebDav(WebDavProperty::DisplayName),
|
|
DavProperty::WebDav(WebDavProperty::GetETag),
|
|
DavProperty::WebDav(WebDavProperty::GetLastModified),
|
|
DavProperty::WebDav(WebDavProperty::ResourceType),
|
|
DavProperty::WebDav(WebDavProperty::LockDiscovery),
|
|
DavProperty::WebDav(WebDavProperty::SupportedLock),
|
|
DavProperty::WebDav(WebDavProperty::CurrentUserPrincipal),
|
|
DavProperty::WebDav(WebDavProperty::SyncToken),
|
|
DavProperty::WebDav(WebDavProperty::Owner),
|
|
DavProperty::WebDav(WebDavProperty::SupportedPrivilegeSet),
|
|
DavProperty::WebDav(WebDavProperty::CurrentUserPrivilegeSet),
|
|
DavProperty::WebDav(WebDavProperty::Acl),
|
|
DavProperty::WebDav(WebDavProperty::AclRestrictions),
|
|
DavProperty::WebDav(WebDavProperty::InheritedAclSet),
|
|
DavProperty::WebDav(WebDavProperty::PrincipalCollectionSet),
|
|
DavProperty::WebDav(WebDavProperty::SupportedReportSet),
|
|
DavProperty::WebDav(WebDavProperty::QuotaAvailableBytes),
|
|
DavProperty::WebDav(WebDavProperty::QuotaUsedBytes),
|
|
DavProperty::CardDav(CardDavProperty::AddressbookDescription),
|
|
DavProperty::CardDav(CardDavProperty::SupportedAddressData),
|
|
DavProperty::CardDav(CardDavProperty::SupportedCollationSet),
|
|
DavProperty::CardDav(CardDavProperty::MaxResourceSize),
|
|
];
|
|
|
|
pub(crate) static CARD_ITEM_PROPS: [DavProperty; 20] = [
|
|
DavProperty::WebDav(WebDavProperty::CreationDate),
|
|
DavProperty::WebDav(WebDavProperty::DisplayName),
|
|
DavProperty::WebDav(WebDavProperty::GetETag),
|
|
DavProperty::WebDav(WebDavProperty::GetLastModified),
|
|
DavProperty::WebDav(WebDavProperty::ResourceType),
|
|
DavProperty::WebDav(WebDavProperty::LockDiscovery),
|
|
DavProperty::WebDav(WebDavProperty::SupportedLock),
|
|
DavProperty::WebDav(WebDavProperty::CurrentUserPrincipal),
|
|
DavProperty::WebDav(WebDavProperty::SyncToken),
|
|
DavProperty::WebDav(WebDavProperty::Owner),
|
|
DavProperty::WebDav(WebDavProperty::SupportedPrivilegeSet),
|
|
DavProperty::WebDav(WebDavProperty::CurrentUserPrivilegeSet),
|
|
DavProperty::WebDav(WebDavProperty::Acl),
|
|
DavProperty::WebDav(WebDavProperty::AclRestrictions),
|
|
DavProperty::WebDav(WebDavProperty::InheritedAclSet),
|
|
DavProperty::WebDav(WebDavProperty::PrincipalCollectionSet),
|
|
DavProperty::WebDav(WebDavProperty::GetContentLanguage),
|
|
DavProperty::WebDav(WebDavProperty::GetContentLength),
|
|
DavProperty::WebDav(WebDavProperty::GetContentType),
|
|
DavProperty::CardDav(CardDavProperty::AddressData {
|
|
properties: Vec::new(),
|
|
version: None,
|
|
}),
|
|
];
|
|
|
|
pub(crate) async fn assert_is_unique_uid(
|
|
server: &Server,
|
|
resources: &DavResources,
|
|
account_id: u32,
|
|
addressbook_id: u32,
|
|
uid: Option<&str>,
|
|
) -> crate::Result<()> {
|
|
if let Some(uid) = uid {
|
|
let hits = server
|
|
.document_ids_matching(
|
|
account_id,
|
|
Collection::ContactCard,
|
|
ContactField::Uid,
|
|
uid.as_bytes(),
|
|
)
|
|
.await
|
|
.caused_by(trc::location!())?;
|
|
if !hits.is_empty() {
|
|
for path in resources.children(addressbook_id) {
|
|
if hits.contains(path.document_id()) {
|
|
return Err(DavError::Condition(DavErrorCondition::new(
|
|
StatusCode::PRECONDITION_FAILED,
|
|
CardCondition::NoUidConflict(resources.format_resource(path).into()),
|
|
)));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|