diff --git a/crates/app/src/public/html/profile/settings.lisp b/crates/app/src/public/html/profile/settings.lisp index a89286f..07d24a1 100644 --- a/crates/app/src/public/html/profile/settings.lisp +++ b/crates/app/src/public/html/profile/settings.lisp @@ -583,7 +583,9 @@ (li (text "Create up to 10 stack blocks")) (li - (text "Add unlimited users to stacks"))) + (text "Add unlimited users to stacks")) + (li + (text "Increased proxied image size"))) (a ("href" "{{ config.stripe.payment_link }}?client_reference_id={{ user.id }}") ("class" "button") diff --git a/crates/app/src/routes/api/v1/util.rs b/crates/app/src/routes/api/v1/util.rs index f76060a..8714968 100644 --- a/crates/app/src/routes/api/v1/util.rs +++ b/crates/app/src/routes/api/v1/util.rs @@ -1,5 +1,5 @@ use super::auth::images::read_image; -use crate::State; +use crate::{get_user_from_token, State}; use axum::{ body::Body, extract::Query, @@ -7,10 +7,13 @@ use axum::{ response::IntoResponse, Extension, }; +use axum_extra::extract::CookieJar; use pathbufd::PathBufD; use serde::Deserialize; +use tetratto_core::model::permissions::FinePermission; -pub const MAXIMUM_PROXY_FILE_SIZE: u64 = 4194304; // 4 MiB +pub const MAXIMUM_PROXY_FILE_SIZE: u64 = 4_194_304; // 4 MiB +pub const MAXIMUM_SUPPORTER_PROXY_FILE_SIZE: u64 = 10_485_760; // 4 MiB #[derive(Deserialize)] pub struct ProxyQuery { @@ -19,10 +22,22 @@ pub struct ProxyQuery { /// Proxy an external url pub async fn proxy_request( + jar: CookieJar, Query(props): Query, Extension(data): Extension, ) -> impl IntoResponse { let data = &(data.read().await); + let user = get_user_from_token!(jar, data.0); + let maximum_size = if let Some(ref ua) = user { + if ua.permissions.check(FinePermission::SUPPORTER) { + MAXIMUM_SUPPORTER_PROXY_FILE_SIZE + } else { + MAXIMUM_PROXY_FILE_SIZE + } + } else { + MAXIMUM_PROXY_FILE_SIZE + }; + let http = &data.2; let data = &data.0.0; @@ -60,7 +75,7 @@ pub async fn proxy_request( match http.get(image_url).send().await { Ok(stream) => { let size = stream.content_length(); - if size.unwrap_or_default() > MAXIMUM_PROXY_FILE_SIZE { + if size.unwrap_or_default() > maximum_size { // return defualt image (content too big) return ( [("Content-Type", "image/svg+xml")],