From ab84a8dad1b58d827f200a0cb3d6955148235245 Mon Sep 17 00:00:00 2001 From: amtoaer Date: Tue, 21 Jan 2025 22:54:20 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=AD=BE=E5=90=8D=E6=97=B6?= =?UTF-8?q?=E6=8C=89=E9=9C=80=E4=BD=BF=E7=94=A8=20String?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 14 +++++ Cargo.toml | 2 + crates/bili_sync/Cargo.toml | 4 ++ crates/bili_sync/src/bilibili/credential.rs | 63 +++++++++++++++------ 4 files changed, 66 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b095e38..1ee98ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -136,6 +136,12 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + [[package]] name = "async-attributes" version = "1.1.2" @@ -377,6 +383,7 @@ version = "2.2.0" dependencies = [ "anyhow", "arc-swap", + "assert_matches", "async-stream", "async-trait", "bili_sync_entity", @@ -384,6 +391,7 @@ dependencies = [ "chrono", "clap", "cookie", + "cow-utils", "dirs", "float-ord", "futures", @@ -674,6 +682,12 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +[[package]] +name = "cow-utils" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417bef24afe1460300965a25ff4a24b8b45ad011948302ec221e8a0a81eb2c79" + [[package]] name = "cpufeatures" version = "0.2.12" diff --git a/Cargo.toml b/Cargo.toml index 4820f25..e634f19 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,12 +17,14 @@ bili_sync_migration = { path = "crates/bili_sync_migration" } anyhow = { version = "1.0.95", features = ["backtrace"] } arc-swap = { version = "1.7.1", features = ["serde"] } +assert_matches = "1.5" async-std = { version = "1.13.0", features = ["attributes", "tokio1"] } async-stream = "0.3.6" async-trait = "0.1.85" chrono = { version = "0.4.39", features = ["serde"] } clap = { version = "4.5.26", features = ["env"] } cookie = "0.18.1" +cow-utils = "0.1.3" dirs = "6.0.0" float-ord = "0.3.2" futures = "0.3.31" diff --git a/crates/bili_sync/Cargo.toml b/crates/bili_sync/Cargo.toml index 87f0fcf..dfe8cea 100644 --- a/crates/bili_sync/Cargo.toml +++ b/crates/bili_sync/Cargo.toml @@ -18,6 +18,7 @@ bili_sync_migration = { workspace = true } chrono = { workspace = true } clap = { workspace = true } cookie = { workspace = true } +cow-utils = { workspace = true } dirs = { workspace = true } float-ord = { workspace = true } futures = { workspace = true } @@ -44,6 +45,9 @@ toml = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } +[dev-dependencies] +assert_matches = { workspace = true } + [package.metadata.release] release = true diff --git a/crates/bili_sync/src/bilibili/credential.rs b/crates/bili_sync/src/bilibili/credential.rs index a50e2ca..68ae809 100644 --- a/crates/bili_sync/src/bilibili/credential.rs +++ b/crates/bili_sync/src/bilibili/credential.rs @@ -3,6 +3,7 @@ use std::collections::HashSet; use anyhow::{bail, ensure, Context, Result}; use cookie::Cookie; +use cow_utils::CowUtils; use regex::Regex; use reqwest::{header, Method}; use rsa::pkcs8::DecodePublicKey; @@ -227,17 +228,16 @@ fn _encoded_query<'a>( mixin_key: &str, timestamp: String, ) -> Vec<(&'a str, Cow<'a, str>)> { + let disallowed = ['!', '\'', '(', ')', '*']; let mut params: Vec<(&'a str, Cow<'a, str>)> = params .into_iter() .map(|(k, v)| { ( k, - // FIXME: 总感觉这里不太好,即使 v 是 &str 也会被转换成 String - v.into() - .chars() - .filter(|&x| !"!'()*".contains(x)) - .collect::() - .into(), + match Into::>::into(v) { + Cow::Borrowed(v) => v.cow_replace(&disallowed[..], ""), + Cow::Owned(v) => v.replace(&disallowed[..], "").into(), + }, ) }) .collect(); @@ -252,6 +252,8 @@ fn _encoded_query<'a>( #[cfg(test)] mod tests { + use assert_matches::assert_matches; + use super::*; #[test] @@ -290,20 +292,47 @@ mod tests { }; let key = Option::::from(key).expect("fail to convert key"); assert_eq!(key.as_str(), "ea1db124af3c7062474693fa704f4ff8"); - assert_eq!( - dbg!(_encoded_query( + // 没有特殊字符 + assert_matches!( + &_encoded_query( vec![("foo", "114"), ("bar", "514"), ("zab", "1919810")], key.as_str(), "1702204169".to_string(), - )), - // 上面产生的结果全是 Cow::Owned,但 eq 只会比较值,这样写比较方便 - vec![ - ("bar", Cow::Borrowed("514")), - ("foo", Cow::Borrowed("114")), - ("wts", Cow::Borrowed("1702204169")), - ("zab", Cow::Borrowed("1919810")), - ("w_rid", Cow::Borrowed("8f6f2b5b3d485fe1886cec6a0be8c5d4")), - ] + )[..], + [ + ("bar", Cow::Borrowed(a)), + ("foo", Cow::Borrowed(b)), + ("wts", Cow::Owned(c)), + ("zab", Cow::Borrowed(d)), + ("w_rid", Cow::Owned(e)), + ] => { + assert_eq!(*a, "514"); + assert_eq!(*b, "114"); + assert_eq!(c, "1702204169"); + assert_eq!(*d, "1919810"); + assert_eq!(e, "8f6f2b5b3d485fe1886cec6a0be8c5d4"); + } + ); + // 有特殊字符 + assert_matches!( + &_encoded_query( + vec![("foo", "'1(1)4'"), ("bar", "!5*1!14"), ("zab", "1919810")], + key.as_str(), + "1702204169".to_string(), + )[..], + [ + ("bar", Cow::Owned(a)), + ("foo", Cow::Owned(b)), + ("wts", Cow::Owned(c)), + ("zab", Cow::Borrowed(d)), + ("w_rid", Cow::Owned(e)), + ] => { + assert_eq!(a, "5114"); + assert_eq!(b, "114"); + assert_eq!(c, "1702204169"); + assert_eq!(*d, "1919810"); + assert_eq!(e, "6a2c86c4b0648ce062ba0dac2de91a85"); + } ); } }