working report calendar-multiget
This commit is contained in:
parent
3c2d4e6987
commit
22e4f29555
3 changed files with 45 additions and 19 deletions
|
@ -69,7 +69,7 @@ impl<E: dav::Extension> QRead<CalendarQuery<E>> for CalendarQuery<E> {
|
||||||
|
|
||||||
impl<E: dav::Extension> QRead<CalendarMultiget<E>> for CalendarMultiget<E> {
|
impl<E: dav::Extension> QRead<CalendarMultiget<E>> for CalendarMultiget<E> {
|
||||||
async fn qread(xml: &mut Reader<impl IRead>) -> Result<Self, ParsingError> {
|
async fn qread(xml: &mut Reader<impl IRead>) -> Result<Self, ParsingError> {
|
||||||
xml.open(CAL_URN, "free-busy-query").await?;
|
xml.open(CAL_URN, "calendar-multiget").await?;
|
||||||
let mut selector = None;
|
let mut selector = None;
|
||||||
let mut href = Vec::new();
|
let mut href = Vec::new();
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ impl<E: dav::Extension> QRead<CalendarMultiget<E>> for CalendarMultiget<E> {
|
||||||
|
|
||||||
impl QRead<FreeBusyQuery> for FreeBusyQuery {
|
impl QRead<FreeBusyQuery> for FreeBusyQuery {
|
||||||
async fn qread(xml: &mut Reader<impl IRead>) -> Result<Self, ParsingError> {
|
async fn qread(xml: &mut Reader<impl IRead>) -> Result<Self, ParsingError> {
|
||||||
xml.open(CAL_URN, "calendar-multiple-get").await?;
|
xml.open(CAL_URN, "free-busy-query").await?;
|
||||||
let range = xml.find().await?;
|
let range = xml.find().await?;
|
||||||
xml.close().await?;
|
xml.close().await?;
|
||||||
Ok(FreeBusyQuery(range))
|
Ok(FreeBusyQuery(range))
|
||||||
|
|
|
@ -259,6 +259,7 @@ impl<T: IRead> Reader<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn open_start(&mut self, ns: &[u8], key: &str) -> Result<Event<'static>, ParsingError> {
|
pub async fn open_start(&mut self, ns: &[u8], key: &str) -> Result<Event<'static>, ParsingError> {
|
||||||
|
//println!("try open start tag {:?}, on {:?}", key, self.peek());
|
||||||
let evt = match self.peek() {
|
let evt = match self.peek() {
|
||||||
Event::Start(_) if self.is_tag(ns, key) => self.next().await?,
|
Event::Start(_) if self.is_tag(ns, key) => self.next().await?,
|
||||||
_ => return Err(ParsingError::Recoverable),
|
_ => return Err(ParsingError::Recoverable),
|
||||||
|
|
|
@ -103,7 +103,17 @@ impl Server {
|
||||||
match http::Builder::new().serve_connection(stream, service_fn(|req: Request<hyper::body::Incoming>| {
|
match http::Builder::new().serve_connection(stream, service_fn(|req: Request<hyper::body::Incoming>| {
|
||||||
let login = login.clone();
|
let login = login.clone();
|
||||||
tracing::info!("{:?} {:?}", req.method(), req.uri());
|
tracing::info!("{:?} {:?}", req.method(), req.uri());
|
||||||
auth(login, req)
|
async {
|
||||||
|
match auth(login, req).await {
|
||||||
|
Ok(v) => Ok(v),
|
||||||
|
Err(e) => {
|
||||||
|
tracing::error!(err=?e, "internal error");
|
||||||
|
Response::builder()
|
||||||
|
.status(500)
|
||||||
|
.body(text_body("Internal error"))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
})).await {
|
})).await {
|
||||||
Err(e) => tracing::warn!(err=?e, "connection failed"),
|
Err(e) => tracing::warn!(err=?e, "connection failed"),
|
||||||
Ok(()) => tracing::trace!("connection terminated with success"),
|
Ok(()) => tracing::trace!("connection terminated with success"),
|
||||||
|
@ -218,7 +228,7 @@ async fn router(user: std::sync::Arc<User>, req: Request<Incoming>) -> Result<Re
|
||||||
let path = req.uri().path().to_string();
|
let path = req.uri().path().to_string();
|
||||||
let path_segments: Vec<_> = path.split("/").filter(|s| *s != "").collect();
|
let path_segments: Vec<_> = path.split("/").filter(|s| *s != "").collect();
|
||||||
let method = req.method().as_str().to_uppercase();
|
let method = req.method().as_str().to_uppercase();
|
||||||
let node = match Box::new(RootNode {}).fetch(&user, &path_segments) {
|
let node = match (RootNode {}).fetch(&user, &path_segments) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
tracing::warn!(err=?e, "dav node fetch failed");
|
tracing::warn!(err=?e, "dav node fetch failed");
|
||||||
|
@ -361,12 +371,22 @@ async fn report(user: std::sync::Arc<User>, req: Request<Incoming>, node: Box<dy
|
||||||
};
|
};
|
||||||
|
|
||||||
// Getting the list of nodes
|
// Getting the list of nodes
|
||||||
/*let nodes = multiget.href.iter().map(|h| match Path::new(h.0.as_str()) {
|
let (ok_node, not_found): (Vec<_>, Vec<_>) = multiget.href.into_iter().map(|h| match Path::new(h.0.as_str()) {
|
||||||
|
Ok(Path::Abs(p)) => RootNode{}.fetch(&user, p.as_slice()).or(Err(h)),
|
||||||
|
Ok(Path::Rel(p)) => node.fetch(&user, p.as_slice()).or(Err(h)),
|
||||||
|
Err(_) => Err(h),
|
||||||
|
}).partition(|v| matches!(v, Result::Ok(_)));
|
||||||
|
let ok_node = ok_node.into_iter().filter_map(|v| v.ok()).collect();
|
||||||
|
let not_found = not_found.into_iter().filter_map(|v| v.err()).collect();
|
||||||
|
|
||||||
});*/
|
// Getting props
|
||||||
|
let props = match multiget.selector {
|
||||||
|
None | Some(cal::CalendarSelector::AllProp) => Some(dav::PropName(ALLPROP.to_vec())),
|
||||||
|
Some(cal::CalendarSelector::PropName) => None,
|
||||||
|
Some(cal::CalendarSelector::Prop(inner)) => Some(inner),
|
||||||
|
};
|
||||||
|
|
||||||
todo!();
|
serialize(status, multistatus(&user, ok_node, not_found, props))
|
||||||
//serialize(status, node.multistatus_val(&user, multiget
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn multistatus(user: &ArcUser, nodes: Vec<Box<dyn DavNode>>, not_found: Vec<dav::Href>, props: Option<dav::PropName<All>>) -> dav::Multistatus<All> {
|
fn multistatus(user: &ArcUser, nodes: Vec<Box<dyn DavNode>>, not_found: Vec<dav::Href>, props: Option<dav::PropName<All>>) -> dav::Multistatus<All> {
|
||||||
|
@ -478,7 +498,7 @@ trait DavNode: Send {
|
||||||
|
|
||||||
// recurence
|
// recurence
|
||||||
fn children(&self, user: &ArcUser) -> Vec<Box<dyn DavNode>>;
|
fn children(&self, user: &ArcUser) -> Vec<Box<dyn DavNode>>;
|
||||||
fn fetch(self: Box<Self>, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>>;
|
fn fetch(&self, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>>;
|
||||||
|
|
||||||
// node properties
|
// node properties
|
||||||
fn path(&self, user: &ArcUser) -> String;
|
fn path(&self, user: &ArcUser) -> String;
|
||||||
|
@ -541,11 +561,12 @@ trait DavNode: Send {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
struct RootNode {}
|
struct RootNode {}
|
||||||
impl DavNode for RootNode {
|
impl DavNode for RootNode {
|
||||||
fn fetch(self: Box<Self>, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>> {
|
fn fetch(&self, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>> {
|
||||||
if path.len() == 0 {
|
if path.len() == 0 {
|
||||||
return Ok(self)
|
return Ok(Box::new(self.clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
if path[0] == user.username {
|
if path[0] == user.username {
|
||||||
|
@ -585,11 +606,12 @@ impl DavNode for RootNode {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
struct HomeNode {}
|
struct HomeNode {}
|
||||||
impl DavNode for HomeNode {
|
impl DavNode for HomeNode {
|
||||||
fn fetch(self: Box<Self>, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>> {
|
fn fetch(&self, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>> {
|
||||||
if path.len() == 0 {
|
if path.len() == 0 {
|
||||||
return Ok(self)
|
return Ok(Box::new(self.clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
if path[0] == "calendar" {
|
if path[0] == "calendar" {
|
||||||
|
@ -630,11 +652,12 @@ impl DavNode for HomeNode {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
struct CalendarListNode {}
|
struct CalendarListNode {}
|
||||||
impl DavNode for CalendarListNode {
|
impl DavNode for CalendarListNode {
|
||||||
fn fetch(self: Box<Self>, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>> {
|
fn fetch(&self, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>> {
|
||||||
if path.len() == 0 {
|
if path.len() == 0 {
|
||||||
return Ok(self)
|
return Ok(Box::new(self.clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
//@FIXME hardcoded logic
|
//@FIXME hardcoded logic
|
||||||
|
@ -670,13 +693,14 @@ impl DavNode for CalendarListNode {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
struct CalendarNode {
|
struct CalendarNode {
|
||||||
name: String,
|
name: String,
|
||||||
}
|
}
|
||||||
impl DavNode for CalendarNode {
|
impl DavNode for CalendarNode {
|
||||||
fn fetch(self: Box<Self>, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>> {
|
fn fetch(&self, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>> {
|
||||||
if path.len() == 0 {
|
if path.len() == 0 {
|
||||||
return Ok(self)
|
return Ok(Box::new(self.clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
//@FIXME hardcoded logic
|
//@FIXME hardcoded logic
|
||||||
|
@ -756,14 +780,15 @@ UID:74855313FA803DA593CD579A@example.com
|
||||||
END:VEVENT
|
END:VEVENT
|
||||||
END:VCALENDAR"#;
|
END:VCALENDAR"#;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
struct EventNode {
|
struct EventNode {
|
||||||
calendar: String,
|
calendar: String,
|
||||||
event_file: String,
|
event_file: String,
|
||||||
}
|
}
|
||||||
impl DavNode for EventNode {
|
impl DavNode for EventNode {
|
||||||
fn fetch(self: Box<Self>, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>> {
|
fn fetch(&self, user: &ArcUser, path: &[&str]) -> Result<Box<dyn DavNode>> {
|
||||||
if path.len() == 0 {
|
if path.len() == 0 {
|
||||||
return Ok(self)
|
return Ok(Box::new(self.clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
Err(anyhow!("Not found"))
|
Err(anyhow!("Not found"))
|
||||||
|
|
Loading…
Reference in a new issue