diff options
| author | salmonik <salmonik@tuta.io> | 2026-11-04 01:29:57 +0100 |
|---|---|---|
| committer | salmonik <salmonik@tuta.io> | 2026-11-04 01:29:57 +0100 |
| commit | 4b2b4af606237def78273a42e881ae9f971cb505 (patch) | |
| tree | 47735062971b7dcddfbe3ad385ccbf2570fa6245 /src/commands | |
| parent | docker: install ImageMagick for image compress/convert (diff) | |
| download | senator-sperma-4b2b4af606237def78273a42e881ae9f971cb505.tar.gz senator-sperma-4b2b4af606237def78273a42e881ae9f971cb505.zip | |
net: block private and link-local URLs
Diffstat (limited to '')
| -rw-r--r-- | src/commands/cron.rs | 3 | ||||
| -rw-r--r-- | src/commands/music.rs | 4 | ||||
| -rw-r--r-- | src/commands/utilities.rs | 5 |
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()); |
