aboutsummaryrefslogtreecommitdiffstats
path: root/src/commands
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-11-04 01:29:57 +0100
committersalmonik <salmonik@tuta.io>2026-11-04 01:29:57 +0100
commit4b2b4af606237def78273a42e881ae9f971cb505 (patch)
tree47735062971b7dcddfbe3ad385ccbf2570fa6245 /src/commands
parentdocker: install ImageMagick for image compress/convert (diff)
downloadsenator-sperma-4b2b4af606237def78273a42e881ae9f971cb505.tar.gz
senator-sperma-4b2b4af606237def78273a42e881ae9f971cb505.zip
net: block private and link-local URLs
Diffstat (limited to 'src/commands')
-rw-r--r--src/commands/cron.rs3
-rw-r--r--src/commands/music.rs4
-rw-r--r--src/commands/utilities.rs5
3 files changed, 12 insertions, 0 deletions
diff --git a/src/commands/cron.rs b/src/commands/cron.rs
index ebaa96d..301ae3d 100644
--- a/src/commands/cron.rs
+++ b/src/commands/cron.rs
@@ -45,6 +45,9 @@ pub async fn dodaj_audio(
45 }; 45 };
46 46
47 let guild_id = ctx.guild_id().ok_or_else(lang::err_not_in_guild)?; 47 let guild_id = ctx.guild_id().ok_or_else(lang::err_not_in_guild)?;
48 if !ctx.data().copyparty.is_own_url(&full_url) {
49 crate::net::ensure_public_http_url(&full_url).await?;
50 }
48 database::add_cron_job( 51 database::add_cron_job(
49 &ctx.data().db_pool, 52 &ctx.data().db_pool,
50 guild_id.get() as i64, 53 guild_id.get() as i64,
diff --git a/src/commands/music.rs b/src/commands/music.rs
index 245eb88..baa91b1 100644
--- a/src/commands/music.rs
+++ b/src/commands/music.rs
@@ -121,6 +121,10 @@ async fn resolve_source(
121 let url = name.clone(); 121 let url = name.clone();
122 let display_name = clean_name(url.rsplit('/').next().unwrap_or(&url)); 122 let display_name = clean_name(url.rsplit('/').next().unwrap_or(&url));
123 123
124 if !ctx.data().copyparty.is_own_url(&url) {
125 crate::net::ensure_public_http_url(&url).await?;
126 }
127
124 // yt-dlp platforms → download; everything else (radio, HLS, 128 // yt-dlp platforms → download; everything else (radio, HLS,
125 // playlists, Copyparty, direct media) → ffmpeg stream. 129 // playlists, Copyparty, direct media) → ffmpeg stream.
126 let kind = classify_url(&url); 130 let kind = classify_url(&url);
diff --git a/src/commands/utilities.rs b/src/commands/utilities.rs
index c26fd0e..7a2e65d 100644
--- a/src/commands/utilities.rs
+++ b/src/commands/utilities.rs
@@ -496,6 +496,11 @@ async fn run_download(
496 fformat: Option<&str>, 496 fformat: Option<&str>,
497 filename_user: Option<&str>, 497 filename_user: Option<&str>,
498) -> Result<()> { 498) -> Result<()> {
499 // Copyparty may legitimately live on localhost/LAN; every other host must
500 // be public. This blocks metadata endpoints and internal services.
501 if !ctx.data().copyparty.is_own_url(url) {
502 crate::net::ensure_public_http_url(url).await?;
503 }
499 let fmt = fformat.unwrap_or("mp4"); 504 let fmt = fformat.unwrap_or("mp4");
500 let is_audio = matches!(fmt, "mp3" | "wav" | "m4a"); 505 let is_audio = matches!(fmt, "mp3" | "wav" | "m4a");
501 let dl_dir = format!("{}/dl_{}", crate::config::TEMP_PATH, uuid::Uuid::new_v4()); 506 let dl_dir = format!("{}/dl_{}", crate::config::TEMP_PATH, uuid::Uuid::new_v4());