From f9fab60e5ee77c0cf57744e39b5685902189a38b Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Wed, 29 May 2024 08:47:56 +0200 Subject: test report sync-collection --- aero-proto/src/dav/controller.rs | 2 +- aero-proto/src/dav/resource.rs | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) (limited to 'aero-proto') diff --git a/aero-proto/src/dav/controller.rs b/aero-proto/src/dav/controller.rs index 7e1f416..76dd15d 100644 --- a/aero-proto/src/dav/controller.rs +++ b/aero-proto/src/dav/controller.rs @@ -184,7 +184,7 @@ impl Controller { }, }; extension = Some(realization::Multistatus::Sync(sync::Multistatus { - sync_token: sync::SyncToken(new_token.to_string()), + sync_token: sync::SyncToken(format!("{}{}", BASE_TOKEN_URI, new_token)), })); } _ => { diff --git a/aero-proto/src/dav/resource.rs b/aero-proto/src/dav/resource.rs index 297a1c1..b6c0ed5 100644 --- a/aero-proto/src/dav/resource.rs +++ b/aero-proto/src/dav/resource.rs @@ -21,6 +21,16 @@ use aero_dav::versioningtypes as vers; use super::node::PropertyStream; use crate::dav::node::{Content, DavNode, PutPolicy}; +/// Why "https://aerogramme.0"? +/// Because tokens must be valid URI. +/// And numeric TLD are ~mostly valid in URI (check the .42 TLD experience) +/// and at the same time, they are not used sold by the ICANN and there is no plan to use them. +/// So I am sure that the URL remains invalid, avoiding leaking requests to an hardcoded URL in the +/// future. +/// The best option would be to make it configurable ofc, so someone can put a domain name +/// that they control, it would probably improve compatibility (maybe some WebDAV spec tells us +/// how to handle/resolve this URI but I am not aware of that...). But that's not the plan for +/// now. So here we are: https://aerogramme.0. pub const BASE_TOKEN_URI: &str = "https://aerogramme.0/sync/"; #[derive(Clone)] @@ -575,7 +585,31 @@ impl DavNode for CalendarNode { let col = self.col.clone(); let calname = self.calname.clone(); async move { - let sync_token = sync_token.unwrap(); + let sync_token = match sync_token { + Some(v) => v, + None => { + let token = col + .token() + .await + .or(Err(std::io::Error::from(std::io::ErrorKind::Interrupted)))?; + let ok_nodes = col + .dag() + .await + .idx_by_filename + .iter() + .map(|(filename, blob_id)| { + Box::new(EventNode { + col: col.clone(), + calname: calname.clone(), + filename: filename.to_string(), + blob_id: *blob_id, + }) as Box + }) + .collect(); + + return Ok((token, ok_nodes, vec![])); + } + }; let (new_token, listed_changes) = match col.diff(sync_token).await { Ok(v) => v, Err(e) => { -- cgit v1.2.3