WIP DAV types & encoder

This commit is contained in:
Quentin 2024-02-28 10:20:28 +01:00
parent 239df7bd14
commit c10eb33585
Signed by: quentin
GPG key ID: E9602264D639FF68
3 changed files with 224 additions and 4 deletions

16
src/dav/encoder.rs Normal file
View file

@ -0,0 +1,16 @@
pub trait Encode {
fn write(&self, a: &mut u64) -> String;
}
#[cfg(test)]
mod tests {
// Note this useful idiom: importing names from outer (for mod tests) scope.
use super::*;
#[test]
fn test_href() {
}
}

View file

@ -1,3 +1,6 @@
mod types;
mod encoder;
use std::net::SocketAddr; use std::net::SocketAddr;
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
@ -129,13 +132,17 @@ async fn router(user: std::sync::Arc<User>, req: Request<impl hyper::body::Body>
[ username, ..] if *username != user.username => return Ok(Response::builder() [ username, ..] if *username != user.username => return Ok(Response::builder()
.status(403) .status(403)
.body(Full::new(Bytes::from("Accessing other user ressources is not allowed")))?), .body(Full::new(Bytes::from("Accessing other user ressources is not allowed")))?),
[ _ ] => tracing::info!(user=username, "user home"), [ _ ] => tracing::info!("user home"),
[ _, "calendar" ] => tracing::info!(user=username, cat=coltype, "user cat of coll"), [ _, "calendar" ] => tracing::info!("user calendars"),
[ _, "calendar", colname ] => tracing::info!(user=username, cat=coltype, name=colname, "user coll"), [ _, "calendar", colname ] => tracing::info!(name=colname, "selected calendar"),
[ _, "calendar", colname, member ] => tracing::info!(user=username, cat=coltype, name=colname, obj=member, "accessing file"), [ _, "calendar", colname, member ] => tracing::info!(name=colname, obj=member, "selected event"),
_ => return Ok(Response::builder() _ => return Ok(Response::builder()
.status(404) .status(404)
.body(Full::new(Bytes::from("Resource not found")))?), .body(Full::new(Bytes::from("Resource not found")))?),
} }
Ok(Response::new(Full::new(Bytes::from("Hello World!")))) Ok(Response::new(Full::new(Bytes::from("Hello World!"))))
} }
async fn collections(user: std::sync::Arc<User>, req: Request<impl hyper::body::Body>) -> Result<Response<Full<Bytes>>> {
unimplemented!();
}

197
src/dav/types.rs Normal file
View file

@ -0,0 +1,197 @@
pub enum Error {
/// Name: lock-token-matches-request-uri
///
/// Use with: 409 Conflict
///
/// Purpose: (precondition) -- A request may include a Lock-Token header
/// to identify a lock for the UNLOCK method. However, if the
/// Request-URI does not fall within the scope of the lock identified
/// by the token, the server SHOULD use this error. The lock may have
/// a scope that does not include the Request-URI, or the lock could
/// have disappeared, or the token may be invalid.
LockTokenMatchesRequestUri,
/// Name: lock-token-submitted (precondition)
///
/// Use with: 423 Locked
///
/// Purpose: The request could not succeed because a lock token should
/// have been submitted. This element, if present, MUST contain at
/// least one URL of a locked resource that prevented the request. In
/// cases of MOVE, COPY, and DELETE where collection locks are
/// involved, it can be difficult for the client to find out which
/// locked resource made the request fail -- but the server is only
/// responsible for returning one such locked resource. The server
/// MAY return every locked resource that prevented the request from
/// succeeding if it knows them all.
///
/// <!ELEMENT lock-token-submitted (href+) >
LockTokenSubmitted(Vec<String>),
NoConflictingLock,
NoExternalEntities,
PreservedLiveProperties,
PropfindFiniteDepth,
Calendar(u64),
}
/// 14.1. activelock XML Element
///
/// Name: activelock
///
/// Purpose: Describes a lock on a resource.
/// <!ELEMENT activelock (lockscope, locktype, depth, owner?, timeout?,
/// locktoken?, lockroot)>
pub struct ActiveLock {
lockscope: u64,
locktype: u64,
depth: Depth,
owner: Option<u64>,
timeout: Option<u64>,
}
/// allprop XML Element
///
/// Name: allprop
///
/// Purpose: Specifies that all names and values of dead properties and
/// the live properties defined by this document existing on the
/// resource are to be returned.
///
/// <!ELEMENT allprop EMPTY >
pub struct AllProp{}
/// collection XML Element
///
/// Name: collection
///
/// Purpose: Identifies the associated resource as a collection. The
/// DAV:resourcetype property of a collection resource MUST contain
/// this element. It is normally empty but extensions may add sub-
/// elements.
///
/// <!ELEMENT collection EMPTY >
pub struct Collection{}
/// depth XML Element
///
/// Name: depth
///
/// Purpose: Used for representing depth values in XML content (e.g.,
/// in lock information).
///
/// Value: "0" | "1" | "infinity"
///
/// <!ELEMENT depth (#PCDATA) >
pub enum Depth {
Zero,
One,
Infinity
}
/// 14.6. exclusive XML Element
///
/// Name: exclusive
///
/// Purpose: Specifies an exclusive lock.
///
/// <!ELEMENT exclusive EMPTY >
pub struct Exclusive {}
pub struct Href(String);
pub struct Status(String);
pub struct ResponseDescription(String);
pub struct Location(Href);
/// 14.18. prop XML Element
///
/// Name: prop
///
/// Purpose: Contains properties related to a resource.
///
/// Description: A generic container for properties defined on
/// resources. All elements inside a 'prop' XML element MUST define
/// properties related to the resource, although possible property
/// names are in no way limited to those property names defined in
/// this document or other standards. This element MUST NOT contain
/// text or mixed content.
///
/// <!ELEMENT prop ANY >
pub struct Prop {
something: u64,
}
/// propstat XML Element
///
/// Name: propstat
///
/// Purpose: Groups together a prop and status element that is
/// associated with a particular 'href' element.
///
/// Description: The propstat XML element MUST contain one prop XML
/// element and one status XML element. The contents of the prop XML
/// element MUST only list the names of properties to which the result
/// in the status element applies. The optional precondition/
/// postcondition element and 'responsedescription' text also apply to
/// the properties named in 'prop'.
///
/// <!ELEMENT propstat (prop, status, error?, responsedescription?) >
pub struct PropStat {
prop: Prop,
status: Status,
error: Option<Error>,
responsedescription: Option<ResponseDescription>,
}
/// 14.24. response XML Element
///
/// Name: response
///
/// Purpose: Holds a single response describing the effect of a method
/// on resource and/or its properties.
///
/// Description: The 'href' element contains an HTTP URL pointing to a
/// WebDAV resource when used in the 'response' container. A
/// particular 'href' value MUST NOT appear more than once as the
/// child of a 'response' XML element under a 'multistatus' XML
/// element. This requirement is necessary in order to keep
/// processing costs for a response to linear time. Essentially, this
/// prevents having to search in order to group together all the
/// responses by 'href'. There are, however, no requirements
/// regarding ordering based on 'href' values. The optional
/// precondition/postcondition element and 'responsedescription' text
/// can provide additional information about this resource relative to
/// the request or result.
///
/// <!ELEMENT response (href, ((href*, status)|(propstat+)),
/// error?, responsedescription? , location?) >
pub struct Response {
href: Vec<Href>,
status: Status,
propstat: Vec<PropStat>,
error: Option<Error>,
responsedescription: Option<ResponseDescription>,
location: Option<u64>,
}
/// 14.16. multistatus XML Element
///
/// Name: multistatus
///
/// Purpose: Contains multiple response messages.
///
/// Description: The 'responsedescription' element at the top level is
/// used to provide a general message describing the overarching
/// nature of the response. If this value is available, an
/// application may use it instead of presenting the individual
/// response descriptions contained within the responses.
///
/// <!ELEMENT multistatus (response*, responsedescription?) >
pub struct Multistatus {
responses: Vec<Response>,
responsedescription: Option<ResponseDescription>,
}