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")],