diff --git a/src/commands/clone.rs b/src/commands/clone.rs index a060a89..f30f5bd 100644 --- a/src/commands/clone.rs +++ b/src/commands/clone.rs @@ -26,6 +26,7 @@ pub async fn exec(args: CloneArgs, config: Config) { url_props.is_secure = false; } + // Ask for webdav user if url_props.user == String::new() { println!("Please enter the username of the webdav instance: "); let stdin = io::stdin(); @@ -40,18 +41,15 @@ pub async fn exec(args: CloneArgs, config: Config) { .enumerate() .await else { - todo!() + todo!("Enumerator has failed") }; dbg!(&files); dbg!(&folders); for folder in folders { - dbg!(folder.abs_path()); - // TODO - if folder.abs_path() == "/admin/tmp_test" { + if folder.abs_path() == "" { continue; } - dbg!(folder.obj_path()); fs::create_dir(folder.obj_path()).unwrap(); NsObject::from_local_path(&folder.obj_path()) .save() @@ -79,6 +77,20 @@ impl UrlProps<'_> { user: String::new(), } } + + /// Generate the url with all the informations of the instance + pub fn full_url(&self) -> String { + format!( + "{}@{}{}{}", + self.user, + match self.is_secure { + true => "https://", + false => "http://", + }, + self.domain, + self.path + ) + } } pub fn get_url_props(url: &str) -> UrlProps { diff --git a/src/services/req_props.rs b/src/services/req_props.rs index 9d89041..3d2f554 100644 --- a/src/services/req_props.rs +++ b/src/services/req_props.rs @@ -50,6 +50,7 @@ pub struct Response { pub href: String, #[serde(rename = "propstat")] propstat: Propstat, + href_prefix: Option, } impl Response { @@ -58,9 +59,13 @@ impl Response { } pub fn abs_path(&self) -> &str { + dbg!(self.href_prefix.clone()); let path = self .href - .strip_prefix("/remote.php/dav/files") + .strip_prefix(&format!( + "/remote.php/dav/files/{}", + self.href_prefix.clone().unwrap_or_default() + )) .expect(&format!( "Unexpected result when requesting props. Cannot strip from {}", self.href @@ -73,10 +78,9 @@ impl Response { } } - pub fn obj_path(&self, ) -> ObjPath { + pub fn obj_path(&self) -> ObjPath { let mut path = self.abs_path(); - // TODO - path = path.strip_prefix("/admin/tmp_test/").unwrap(); + path = path.strip_prefix("/").unwrap(); to_obj_path(&PathBuf::from(path)) } @@ -147,8 +151,13 @@ impl<'a> ReqProps<'a> { pub async fn send(&mut self) -> Result { let res = self.request.send().await; let xml = res.unwrap().text().await?; - let multistatus: Multistatus = + dbg!(&xml); + let mut multistatus: Multistatus = from_str(&xml).expect("Failed to unwrap xml response from req_props"); + multistatus + .responses + .iter_mut() + .for_each(|res| res.href_prefix = Some(self.request.service.href_prefix())); Ok(multistatus) } } diff --git a/src/services/service.rs b/src/services/service.rs index 00c4f8e..2f1d787 100644 --- a/src/services/service.rs +++ b/src/services/service.rs @@ -38,6 +38,7 @@ impl ClientConfig { pub struct Service { /// http[s]://host.xz/remote.php/dav/files url_base: String, + base_path: String, user: String, } @@ -51,7 +52,11 @@ impl From<&UrlProps<'_>> for Service { url_base.push_str(url_props.domain); url_base.push_str("/remote.php/dav/files"); - Service { url_base, user: url_props.user.clone() } + Service { + url_base, + base_path: url_props.path.to_string(), + user: url_props.user.clone(), + } } } @@ -60,10 +65,26 @@ impl Service { request .bearer_auth("rK5ud2NmrR8p586Th7v272HRgUcZcEKIEluOGjzQQRj7gWMMAISFTiJcFnnmnNiu2VVlENks") } + + fn build_url(&self, url: &str) -> String { + let mut final_url = self.url_base.clone(); + final_url.push_str("/"); + final_url.push_str(&self.user); + final_url.push_str(url); + final_url + } + + /// Return the prefix of a href + /// /user/base_path/path -> /user/base_path + pub fn href_prefix(&self) -> String { + let mut prefix = self.user.clone(); + prefix.push_str(&self.base_path); + prefix + } } pub struct Request<'a> { - service: &'a Service, + pub service: &'a Service, client: ClientConfig, method: Option, url: Option, @@ -96,15 +117,16 @@ impl<'a> Request<'a> { } pub async fn send(&mut self) -> Result { + dbg!(self.service.build_url(&self.url.clone().expect("An url must be set"))); self.service .authenticate( self.client .build() - .request(self.method.clone().expect("Method must be set"), { - let mut url = self.service.url_base.clone(); - url.push_str(&self.url.clone().expect("An url must be set")); - url - }) + .request( + self.method.clone().expect("Method must be set"), + self.service + .build_url(&self.url.clone().expect("An url must be set")), + ) .headers(self.headers.clone()), ) .send()