]> OzVa Git service - ozva-cloud/commitdiff
refactor: propfind with auth no need to list all (#344)
authorsigoden <sigoden@gmail.com>
Thu, 11 Jan 2024 08:10:10 +0000 (16:10 +0800)
committerGitHub <noreply@github.com>
Thu, 11 Jan 2024 08:10:10 +0000 (16:10 +0800)
src/server.rs
tests/auth.rs

index e101e6fd27b5939a55eba43441581e20c5236d31..ed5b3fe87e53d7a4eeebdff445e01b81e090243e 100644 (file)
@@ -374,12 +374,13 @@ impl Server {
             method => match method.as_str() {
                 "PROPFIND" => {
                     if is_dir {
-                        let access_paths = if access_paths.perm().inherit() {
-                            // see https://github.com/sigoden/dufs/issues/229
-                            AccessPaths::new(AccessPerm::ReadOnly)
-                        } else {
-                            access_paths
-                        };
+                        let access_paths =
+                            if access_paths.perm().inherit() && authorization.is_none() {
+                                // see https://github.com/sigoden/dufs/issues/229
+                                AccessPaths::new(AccessPerm::ReadOnly)
+                            } else {
+                                access_paths
+                            };
                         self.handle_propfind_dir(path, headers, access_paths, &mut res)
                             .await?;
                     } else if is_file {
index f22af6dcdc876be5f1fab5560fe2beced2290a8d..97a4d1284bb9b146a8f13d76e8820b1ed7aec566 100644 (file)
@@ -271,7 +271,7 @@ fn auth_partial_index(
 
 #[rstest]
 fn no_auth_propfind_dir(
-    #[with(&["--auth", "user:pass@/:rw", "--auth", "@/dir-assets", "-A"])] server: TestServer,
+    #[with(&["--auth", "admin:admin@/:rw", "--auth", "@/dir-assets", "-A"])] server: TestServer,
 ) -> Result<(), Error> {
     let resp = fetch!(b"PROPFIND", server.url()).send()?;
     assert_eq!(resp.status(), 207);
@@ -281,6 +281,19 @@ fn no_auth_propfind_dir(
     Ok(())
 }
 
+#[rstest]
+fn auth_propfind_dir(
+    #[with(&["--auth", "admin:admin@/:rw", "--auth", "user:pass@/dir-assets", "-A"])]
+    server: TestServer,
+) -> Result<(), Error> {
+    let resp = fetch!(b"PROPFIND", server.url()).send_with_digest_auth("user", "pass")?;
+    assert_eq!(resp.status(), 207);
+    let body = resp.text()?;
+    assert!(body.contains("<D:href>/dir-assets/</D:href>"));
+    assert!(!body.contains("<D:href>/dir1/</D:href>"));
+    Ok(())
+}
+
 #[rstest]
 fn auth_data(
     #[with(&["-a", "user:pass@/:rw", "-a", "@/", "-A"])] server: TestServer,