mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-07 19:22:14 +09:00
refactor(media): share one external proxy url codec across every service (#1794)
This commit is contained in:
@@ -7,6 +7,7 @@ edition.workspace = true
|
||||
license.workspace = true
|
||||
|
||||
[dependencies]
|
||||
fluxer_common = { path = "../fluxer_common" }
|
||||
anyhow = "1.0.102"
|
||||
base64 = "0.22.1"
|
||||
fluxer-svc = { path = "../fluxer_svc", default-features = false }
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
use base64::prelude::*;
|
||||
use hmac::{Hmac, KeyInit, Mac};
|
||||
use sha2::Sha256;
|
||||
use url::Url;
|
||||
|
||||
const V2_PATH_PREFIX: &str = "v2/";
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct MediaProxyUrlBuilder {
|
||||
endpoint: String,
|
||||
@@ -66,28 +61,14 @@ impl MediaProxyUrlBuilder {
|
||||
return Some(input_url.to_owned());
|
||||
}
|
||||
|
||||
let proxy_path = build_external_media_proxy_path(parsed.as_str());
|
||||
let signature = create_signature(&proxy_path, &self.secret_key);
|
||||
Some(format!(
|
||||
"{}/external/{signature}/{proxy_path}",
|
||||
self.endpoint
|
||||
))
|
||||
fluxer_common::external_media_path::build_external_media_proxy_url(
|
||||
&self.endpoint,
|
||||
parsed.as_str(),
|
||||
self.secret_key.as_bytes(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fn build_external_media_proxy_path(input_url: &str) -> String {
|
||||
format!(
|
||||
"{V2_PATH_PREFIX}{}",
|
||||
BASE64_URL_SAFE_NO_PAD.encode(input_url)
|
||||
)
|
||||
}
|
||||
|
||||
fn create_signature(input: &str, secret: &str) -> String {
|
||||
let mut mac = Hmac::<Sha256>::new_from_slice(secret.as_bytes()).expect("HMAC accepts any key");
|
||||
mac.update(input.as_bytes());
|
||||
BASE64_URL_SAFE_NO_PAD.encode(mac.finalize().into_bytes())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
@@ -153,7 +134,7 @@ mod tests {
|
||||
.expect("proxy url");
|
||||
|
||||
assert!(url.starts_with("https://media.example.test/external/"));
|
||||
assert!(url.contains("/v2/"));
|
||||
assert!(url.contains("/https/"));
|
||||
assert_eq!(
|
||||
builder.external_proxy_url("https://media.example.test/external/existing"),
|
||||
Some("https://media.example.test/external/existing".to_owned())
|
||||
|
||||
Reference in New Issue
Block a user