mirror of
https://github.com/openwrt/packages.git
synced 2025-12-10 12:41:22 +00:00
dufs: Update to 0.45.0
Removed upstreamed patches. Release note: https://github.com/sigoden/dufs/releases/tag/v0.45.0 Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
@@ -5,12 +5,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dufs
|
||||
PKG_VERSION:=0.44.0
|
||||
PKG_RELEASE:=2
|
||||
PKG_VERSION:=0.45.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://codeload.github.com/sigoden/dufs/tar.gz/v$(PKG_VERSION)?
|
||||
PKG_HASH:=940fe767946699bdecb9be24700f9abe5a08e913ff7edf1a5388c8a540ff1e0f
|
||||
PKG_HASH:=62aa2cadd77e1bd9d96c77cbd832a53ffc364301c549001bf8fd9d023cbd8ab1
|
||||
|
||||
PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
|
||||
PKG_LICENSE:=Apache-2.0 MIT
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
From b2f244a4cfeb492b38ad9b92692e230e04540ea0 Mon Sep 17 00:00:00 2001
|
||||
From: sigoden <sigoden@gmail.com>
|
||||
Date: Sat, 16 Aug 2025 07:36:19 +0800
|
||||
Subject: [PATCH] feat: make dir urls inherit `?noscript` params (#614)
|
||||
|
||||
---
|
||||
src/noscript.rs | 13 ++++++++-----
|
||||
1 file changed, 8 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/src/noscript.rs
|
||||
+++ b/src/noscript.rs
|
||||
@@ -55,17 +55,20 @@ pub fn generate_noscript_html(data: &Ind
|
||||
|
||||
fn render_parent() -> String {
|
||||
let value = "../";
|
||||
- format!("<tr><td><a href=\"{value}\">{value}</a></td><td></td><td></td></tr>")
|
||||
+ format!("<tr><td><a href=\"{value}?noscript\">{value}</a></td><td></td><td></td></tr>")
|
||||
}
|
||||
|
||||
fn render_path_item(path: &PathItem) -> String {
|
||||
- let href = encode_uri(&path.name);
|
||||
- let suffix = if path.path_type.is_dir() { "/" } else { "" };
|
||||
- let name = escape_str_pcdata(&path.name);
|
||||
+ let mut href = encode_uri(&path.name);
|
||||
+ let mut name = escape_str_pcdata(&path.name).to_string();
|
||||
+ if path.path_type.is_dir() {
|
||||
+ href.push_str("/?noscript");
|
||||
+ name.push('/');
|
||||
+ };
|
||||
let mtime = format_mtime(path.mtime).unwrap_or_default();
|
||||
let size = format_size(path.size, path.path_type);
|
||||
|
||||
- format!("<tr><td><a href=\"{href}{suffix}\">{name}{suffix}</a></td><td>{mtime}</td><td>{size}</td></tr>")
|
||||
+ format!("<tr><td><a href=\"{href}\">{name}</a></td><td>{mtime}</td><td>{size}</td></tr>")
|
||||
}
|
||||
|
||||
fn format_mtime(mtime: u64) -> Option<String> {
|
||||
@@ -1,110 +0,0 @@
|
||||
From f8a7873582567a85095ca9d2124b185cd3eb2ffd Mon Sep 17 00:00:00 2001
|
||||
From: sigoden <sigoden@gmail.com>
|
||||
Date: Tue, 19 Aug 2025 07:51:52 +0800
|
||||
Subject: [PATCH] fix: perms on `dufs -A -a @/:ro` (#619)
|
||||
|
||||
---
|
||||
src/auth.rs | 9 ++++++---
|
||||
src/server.rs | 4 ++--
|
||||
tests/auth.rs | 18 ++++++++++++++++++
|
||||
3 files changed, 26 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/src/auth.rs
|
||||
+++ b/src/auth.rs
|
||||
@@ -30,6 +30,7 @@ lazy_static! {
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub struct AccessControl {
|
||||
+ empty: bool,
|
||||
use_hashed_password: bool,
|
||||
users: IndexMap<String, (String, AccessPaths)>,
|
||||
anonymous: Option<AccessPaths>,
|
||||
@@ -38,6 +39,7 @@ pub struct AccessControl {
|
||||
impl Default for AccessControl {
|
||||
fn default() -> Self {
|
||||
AccessControl {
|
||||
+ empty: true,
|
||||
use_hashed_password: false,
|
||||
users: IndexMap::new(),
|
||||
anonymous: Some(AccessPaths::new(AccessPerm::ReadWrite)),
|
||||
@@ -48,7 +50,7 @@ impl Default for AccessControl {
|
||||
impl AccessControl {
|
||||
pub fn new(raw_rules: &[&str]) -> Result<Self> {
|
||||
if raw_rules.is_empty() {
|
||||
- return Ok(Default::default());
|
||||
+ return Ok(Self::default());
|
||||
}
|
||||
let new_raw_rules = split_rules(raw_rules);
|
||||
let mut use_hashed_password = false;
|
||||
@@ -93,13 +95,14 @@ impl AccessControl {
|
||||
}
|
||||
|
||||
Ok(Self {
|
||||
+ empty: false,
|
||||
use_hashed_password,
|
||||
users,
|
||||
anonymous,
|
||||
})
|
||||
}
|
||||
|
||||
- pub fn exist(&self) -> bool {
|
||||
+ pub fn has_users(&self) -> bool {
|
||||
!self.users.is_empty()
|
||||
}
|
||||
|
||||
@@ -111,7 +114,7 @@ impl AccessControl {
|
||||
token: Option<&String>,
|
||||
guard_options: bool,
|
||||
) -> (Option<String>, Option<AccessPaths>) {
|
||||
- if self.users.is_empty() {
|
||||
+ if self.empty {
|
||||
return (None, Some(AccessPaths::new(AccessPerm::ReadWrite)));
|
||||
}
|
||||
|
||||
--- a/src/server.rs
|
||||
+++ b/src/server.rs
|
||||
@@ -962,7 +962,7 @@ impl Server {
|
||||
uri_prefix: self.args.uri_prefix.clone(),
|
||||
allow_upload: self.args.allow_upload,
|
||||
allow_delete: self.args.allow_delete,
|
||||
- auth: self.args.auth.exist(),
|
||||
+ auth: self.args.auth.has_users(),
|
||||
user,
|
||||
editable,
|
||||
};
|
||||
@@ -1226,7 +1226,7 @@ impl Server {
|
||||
allow_search: self.args.allow_search,
|
||||
allow_archive: self.args.allow_archive,
|
||||
dir_exists: exist,
|
||||
- auth: self.args.auth.exist(),
|
||||
+ auth: self.args.auth.has_users(),
|
||||
user,
|
||||
paths,
|
||||
};
|
||||
--- a/tests/auth.rs
|
||||
+++ b/tests/auth.rs
|
||||
@@ -126,6 +126,24 @@ fn auth_skip_if_no_auth_user(server: Tes
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
+fn auth_no_skip_if_anonymous(
|
||||
+ #[with(&["--auth", "@/:ro"])] server: TestServer,
|
||||
+) -> Result<(), Error> {
|
||||
+ let url = format!("{}index.html", server.url());
|
||||
+ let resp = fetch!(b"GET", &url)
|
||||
+ .basic_auth("user", Some("pass"))
|
||||
+ .send()?;
|
||||
+ assert_eq!(resp.status(), 401);
|
||||
+ let resp = fetch!(b"GET", &url).send()?;
|
||||
+ assert_eq!(resp.status(), 200);
|
||||
+ let resp = fetch!(b"DELETE", &url)
|
||||
+ .basic_auth("user", Some("pass"))
|
||||
+ .send()?;
|
||||
+ assert_eq!(resp.status(), 401);
|
||||
+ Ok(())
|
||||
+}
|
||||
+
|
||||
+#[rstest]
|
||||
fn auth_check(
|
||||
#[with(&["--auth", "user:pass@/:rw", "--auth", "user2:pass2@/", "-A"])] server: TestServer,
|
||||
) -> Result<(), Error> {
|
||||
@@ -1,96 +0,0 @@
|
||||
From 4016715187db5bd84c7d15ea6abcd99fd4a0a667 Mon Sep 17 00:00:00 2001
|
||||
From: sigoden <sigoden@gmail.com>
|
||||
Date: Tue, 19 Aug 2025 08:58:59 +0800
|
||||
Subject: [PATCH] fix: login btn does not work for readonly annoymous (#620)
|
||||
|
||||
---
|
||||
assets/index.js | 7 ++++---
|
||||
src/server.rs | 13 ++++++++++++-
|
||||
tests/auth.rs | 16 ++++++++++++++--
|
||||
3 files changed, 30 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/assets/index.js
|
||||
+++ b/assets/index.js
|
||||
@@ -534,7 +534,7 @@ async function setupAuth() {
|
||||
$loginBtn.classList.remove("hidden");
|
||||
$loginBtn.addEventListener("click", async () => {
|
||||
try {
|
||||
- await checkAuth();
|
||||
+ await checkAuth("login");
|
||||
} catch { }
|
||||
location.reload();
|
||||
});
|
||||
@@ -782,9 +782,10 @@ async function saveChange() {
|
||||
}
|
||||
}
|
||||
|
||||
-async function checkAuth() {
|
||||
+async function checkAuth(variant) {
|
||||
if (!DATA.auth) return;
|
||||
- const res = await fetch(baseUrl(), {
|
||||
+ const qs = variant ? `?${variant}` : "";
|
||||
+ const res = await fetch(baseUrl() + qs, {
|
||||
method: "CHECKAUTH",
|
||||
});
|
||||
await assertResOK(res);
|
||||
--- a/src/server.rs
|
||||
+++ b/src/server.rs
|
||||
@@ -211,7 +211,18 @@ impl Server {
|
||||
}
|
||||
|
||||
if method.as_str() == "CHECKAUTH" {
|
||||
- *res.body_mut() = body_full(user.clone().unwrap_or_default());
|
||||
+ match user.clone() {
|
||||
+ Some(user) => {
|
||||
+ *res.body_mut() = body_full(user);
|
||||
+ }
|
||||
+ None => {
|
||||
+ if has_query_flag(&query_params, "login") || !access_paths.perm().readwrite() {
|
||||
+ self.auth_reject(&mut res)?
|
||||
+ } else {
|
||||
+ *res.body_mut() = body_full("");
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
return Ok(res);
|
||||
} else if method.as_str() == "LOGOUT" {
|
||||
self.auth_reject(&mut res)?;
|
||||
--- a/tests/auth.rs
|
||||
+++ b/tests/auth.rs
|
||||
@@ -147,7 +147,7 @@ fn auth_no_skip_if_anonymous(
|
||||
fn auth_check(
|
||||
#[with(&["--auth", "user:pass@/:rw", "--auth", "user2:pass2@/", "-A"])] server: TestServer,
|
||||
) -> Result<(), Error> {
|
||||
- let url = format!("{}index.html", server.url());
|
||||
+ let url = format!("{}", server.url());
|
||||
let resp = fetch!(b"CHECKAUTH", &url).send()?;
|
||||
assert_eq!(resp.status(), 401);
|
||||
let resp = send_with_digest_auth(fetch!(b"CHECKAUTH", &url), "user", "pass")?;
|
||||
@@ -161,7 +161,7 @@ fn auth_check(
|
||||
fn auth_check2(
|
||||
#[with(&["--auth", "user:pass@/:rw|user2:pass2@/", "-A"])] server: TestServer,
|
||||
) -> Result<(), Error> {
|
||||
- let url = format!("{}index.html", server.url());
|
||||
+ let url = format!("{}", server.url());
|
||||
let resp = fetch!(b"CHECKAUTH", &url).send()?;
|
||||
assert_eq!(resp.status(), 401);
|
||||
let resp = send_with_digest_auth(fetch!(b"CHECKAUTH", &url), "user", "pass")?;
|
||||
@@ -171,6 +171,18 @@ fn auth_check2(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
+#[rstest]
|
||||
+fn auth_check3(
|
||||
+ #[with(&["--auth", "user:pass@/:rw", "--auth", "@/dir1:rw", "-A"])] server: TestServer,
|
||||
+) -> Result<(), Error> {
|
||||
+ let url = format!("{}dir1/", server.url());
|
||||
+ let resp = fetch!(b"CHECKAUTH", &url).send()?;
|
||||
+ assert_eq!(resp.status(), 200);
|
||||
+ let resp = fetch!(b"CHECKAUTH", format!("{url}?login")).send()?;
|
||||
+ assert_eq!(resp.status(), 401);
|
||||
+ Ok(())
|
||||
+}
|
||||
+
|
||||
#[rstest]
|
||||
fn auth_logout(
|
||||
#[with(&["--auth", "user:pass@/:rw", "-A"])] server: TestServer,
|
||||
Reference in New Issue
Block a user