mirror of
https://github.com/lennart-k/rustical.git
synced 2025-12-14 21:42:26 +00:00
Implement almost all previous features
This commit is contained in:
@@ -31,3 +31,4 @@ rustical_dav_push.workspace = true
|
||||
rustical_ical.workspace = true
|
||||
http.workspace = true
|
||||
headers.workspace = true
|
||||
tower-http.workspace = true
|
||||
|
||||
@@ -27,6 +27,7 @@ pub async fn get_objects_calendar_multiget<C: CalendarStore>(
|
||||
|
||||
for href in &cal_query.href {
|
||||
if let Some(filename) = href.strip_prefix(path) {
|
||||
let filename = filename.trim_start_matches("/");
|
||||
if let Some(object_id) = filename.strip_suffix(".ics") {
|
||||
match store.get_object(principal, cal_id, object_id).await {
|
||||
Ok(object) => result.push(object),
|
||||
|
||||
@@ -7,7 +7,7 @@ use axum::extract::{Path, State};
|
||||
use axum::response::{IntoResponse, Response};
|
||||
use axum_extra::TypedHeader;
|
||||
use headers::{ContentType, ETag, HeaderMapExt, IfNoneMatch};
|
||||
use http::StatusCode;
|
||||
use http::{HeaderMap, StatusCode};
|
||||
use rustical_ical::CalendarObject;
|
||||
use rustical_store::CalendarStore;
|
||||
use rustical_store::auth::User;
|
||||
@@ -53,13 +53,19 @@ pub async fn put_event<C: CalendarStore>(
|
||||
}): Path<CalendarObjectPathComponents>,
|
||||
State(CalendarObjectResourceService { cal_store }): State<CalendarObjectResourceService<C>>,
|
||||
user: User,
|
||||
if_none_match: Option<TypedHeader<IfNoneMatch>>,
|
||||
mut if_none_match: Option<TypedHeader<IfNoneMatch>>,
|
||||
header_map: HeaderMap,
|
||||
body: String,
|
||||
) -> Result<Response, Error> {
|
||||
if !user.is_principal(&principal) {
|
||||
return Err(crate::Error::Unauthorized);
|
||||
}
|
||||
|
||||
// https://github.com/hyperium/headers/issues/204
|
||||
if !header_map.contains_key("If-None-Match") {
|
||||
if_none_match = None;
|
||||
}
|
||||
|
||||
let overwrite = if let Some(TypedHeader(if_none_match)) = if_none_match {
|
||||
if_none_match == IfNoneMatch::any()
|
||||
} else {
|
||||
|
||||
@@ -95,7 +95,7 @@ impl<C: CalendarStore, S: SubscriptionStore> ResourceService for CalendarSetReso
|
||||
type Principal = User;
|
||||
type PrincipalUri = CalDavPrincipalUri;
|
||||
|
||||
const DAV_HEADER: &str = "1, 3, access-control, extended-mkcol";
|
||||
const DAV_HEADER: &str = "1, 3, access-control, extended-mkcol, calendar-access";
|
||||
|
||||
async fn get_resource(
|
||||
&self,
|
||||
|
||||
@@ -26,41 +26,10 @@ pub struct CalDavPrincipalUri(&'static str);
|
||||
|
||||
impl PrincipalUri for CalDavPrincipalUri {
|
||||
fn principal_uri(&self, principal: &str) -> String {
|
||||
format!("{}/{}", self.0, principal)
|
||||
format!("{}/principal/{}", self.0, principal)
|
||||
}
|
||||
}
|
||||
|
||||
// pub fn caldav_service<
|
||||
// AP: AuthenticationProvider,
|
||||
// AS: AddressbookStore,
|
||||
// C: CalendarStore,
|
||||
// S: SubscriptionStore,
|
||||
// >(
|
||||
// prefix: &'static str,
|
||||
// auth_provider: Arc<AP>,
|
||||
// store: Arc<C>,
|
||||
// addr_store: Arc<AS>,
|
||||
// subscription_store: Arc<S>,
|
||||
// ) -> impl HttpServiceFactory {
|
||||
// let birthday_store = Arc::new(ContactBirthdayStore::new(addr_store));
|
||||
//
|
||||
// RootResourceService::<_, User, CalDavPrincipalUri>::new(PrincipalResourceService {
|
||||
// auth_provider: auth_provider.clone(),
|
||||
// sub_store: subscription_store.clone(),
|
||||
// birthday_store: birthday_store.clone(),
|
||||
// cal_store: store.clone(),
|
||||
// })
|
||||
// .actix_scope()
|
||||
// .wrap(AuthenticationMiddleware::new(auth_provider.clone()))
|
||||
// .wrap(options_handler())
|
||||
// .app_data(Data::from(store.clone()))
|
||||
// .app_data(Data::from(birthday_store.clone()))
|
||||
// .app_data(Data::new(CalDavPrincipalUri::new(
|
||||
// format!("{prefix}/principal").leak(),
|
||||
// )))
|
||||
// .service(subscription_resource(subscription_store))
|
||||
// }
|
||||
|
||||
pub fn caldav_router<
|
||||
AP: AuthenticationProvider,
|
||||
AS: AddressbookStore,
|
||||
|
||||
@@ -155,7 +155,7 @@ impl<AP: AuthenticationProvider, S: SubscriptionStore, CS: CalendarStore, BS: Ca
|
||||
type Principal = User;
|
||||
type PrincipalUri = CalDavPrincipalUri;
|
||||
|
||||
const DAV_HEADER: &str = "1, 3, access-control";
|
||||
const DAV_HEADER: &str = "1, 3, access-control, calendar-access";
|
||||
|
||||
async fn get_resource(
|
||||
&self,
|
||||
|
||||
Reference in New Issue
Block a user