mirror of
https://github.com/sigoden/dufs.git
synced 2026-04-09 00:59:02 +03:00
feat: password can contain : @ | (#297)
This commit is contained in:
@@ -81,7 +81,6 @@ pub fn build_cli() -> Command {
|
||||
.long("auth")
|
||||
.help("Add auth roles, e.g. user:pass@/dir1:rw,/dir2")
|
||||
.action(ArgAction::Append)
|
||||
.value_delimiter('|')
|
||||
.value_name("rules"),
|
||||
)
|
||||
.arg(
|
||||
|
||||
17
src/auth.rs
17
src/auth.rs
@@ -53,7 +53,7 @@ impl AccessControl {
|
||||
let mut anony_paths = vec![];
|
||||
let mut users = IndexMap::new();
|
||||
for rule in raw_rules {
|
||||
let (user, list) = rule.split_once('@').ok_or_else(|| create_err(rule))?;
|
||||
let (user, list) = split_rule(rule).ok_or_else(|| create_err(rule))?;
|
||||
if user.is_empty() && anony.is_some() {
|
||||
bail!("Invalid auth, duplicate anonymous rules");
|
||||
}
|
||||
@@ -476,10 +476,25 @@ fn create_nonce() -> Result<String> {
|
||||
Ok(n[..34].to_string())
|
||||
}
|
||||
|
||||
fn split_rule(s: &str) -> Option<(&str, &str)> {
|
||||
let i = s.find("@/")?;
|
||||
Some((&s[0..i], &s[i + 1..]))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_split_rule() {
|
||||
assert_eq!(split_rule("user:pass@/:rw"), Some(("user:pass", "/:rw")));
|
||||
assert_eq!(split_rule("user:pass@@/:rw"), Some(("user:pass@", "/:rw")));
|
||||
assert_eq!(
|
||||
split_rule("user:pass@1@/:rw"),
|
||||
Some(("user:pass@1", "/:rw"))
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_access_paths() {
|
||||
let mut paths = AccessPaths::default();
|
||||
|
||||
Reference in New Issue
Block a user