From 0210b677c5bc0f04585f580c96fb98098c0cfc2b Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 12 Apr 2021 10:13:11 +0200 Subject: [PATCH] Expose maximum picture sizes Signed-off-by: Thomas Citharel --- config/config.exs | 6 +++--- js/src/graphql/config.ts | 5 +++++ js/src/types/config.model.ts | 5 +++++ js/tests/unit/specs/mocks/config.ts | 6 ++++++ lib/graphql/resolvers/config.ex | 5 +++++ lib/graphql/schema/config.ex | 11 +++++++++++ lib/web/endpoint.ex | 5 ++++- 7 files changed, 39 insertions(+), 4 deletions(-) diff --git a/config/config.exs b/config/config.exs index ea57f6449..e99cea93a 100644 --- a/config/config.exs +++ b/config/config.exs @@ -25,9 +25,9 @@ config :mobilizon, :instance, allow_relay: true, federating: true, remote_limit: 100_000, - upload_limit: 10_000_000, - avatar_upload_limit: 2_000_000, - banner_upload_limit: 4_000_000, + upload_limit: 10_485_760, + avatar_upload_limit: 2_097_152, + banner_upload_limit: 4_194_304, remove_orphan_uploads: true, orphan_upload_grace_period_hours: 48, remove_unconfirmed_users: true, diff --git a/js/src/graphql/config.ts b/js/src/graphql/config.ts index 6e514ef35..80e79b624 100644 --- a/js/src/graphql/config.ts +++ b/js/src/graphql/config.ts @@ -75,6 +75,11 @@ export const CONFIG = gql` label } } + uploadLimits { + default + avatar + banner + } } } `; diff --git a/js/src/types/config.model.ts b/js/src/types/config.model.ts index 6d391d0a8..d4105a63f 100644 --- a/js/src/types/config.model.ts +++ b/js/src/types/config.model.ts @@ -89,4 +89,9 @@ export interface IConfig { ldap: boolean; oauthProviders: IOAuthProvider[]; }; + uploadLimits: { + default: number; + avatar: number; + banner: number; + }; } diff --git a/js/tests/unit/specs/mocks/config.ts b/js/tests/unit/specs/mocks/config.ts index 856288302..70ee08d75 100644 --- a/js/tests/unit/specs/mocks/config.ts +++ b/js/tests/unit/specs/mocks/config.ts @@ -102,6 +102,12 @@ export const configMock = { }, ], slogan: null, + uploadLimits: { + __typename: "UploadLimits", + default: 10_000_000, + avatar: 2_000_000, + banner: 4_000_000, + }, }, }, }; diff --git a/lib/graphql/resolvers/config.ex b/lib/graphql/resolvers/config.ex index a1b8c3e8c..f7b15a063 100644 --- a/lib/graphql/resolvers/config.ex +++ b/lib/graphql/resolvers/config.ex @@ -134,6 +134,11 @@ defmodule Mobilizon.GraphQL.Resolvers.Config do auth: %{ ldap: Config.ldap_enabled?(), oauth_providers: Config.oauth_consumer_strategies() + }, + upload_limits: %{ + default: Config.get([:instance, :upload_limit]), + avatar: Config.get([:instance, :avatar_upload_limit]), + banner: Config.get([:instance, :banner_upload_limit]) } } end diff --git a/lib/graphql/schema/config.ex b/lib/graphql/schema/config.ex index a2d9d02ab..1feafb1bb 100644 --- a/lib/graphql/schema/config.ex +++ b/lib/graphql/schema/config.ex @@ -33,6 +33,8 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do description: "The instance's enabled resource providers" ) + field(:upload_limits, :upload_limits, description: "The configuration for upload limits") + field(:timezones, list_of(:string), description: "The instance's available timezones") field(:features, :features, description: "The instance's features") field(:version, :string, description: "The instance's version") @@ -283,6 +285,15 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do field(:label, :string, description: "The label for the auth provider") end + @desc """ + An upload limits configuration + """ + object :upload_limits do + field(:default, :integer, description: "The default limitation, in bytes") + field(:avatar, :integer, description: "The avatar limitation, in bytes") + field(:banner, :integer, description: "The banner limitation, in bytes") + end + object :config_queries do @desc "Get the instance config" field :config, :config do diff --git a/lib/web/endpoint.ex b/lib/web/endpoint.ex index 40b1aa74c..5d062f6a5 100644 --- a/lib/web/endpoint.ex +++ b/lib/web/endpoint.ex @@ -62,9 +62,12 @@ defmodule Mobilizon.Web.Endpoint do plug(Plug.RequestId) plug(Plug.Logger) + upload_limit = + Keyword.get(Application.get_env(:mobilizon, :instance, []), :upload_limit, 10_485_760) + plug( Plug.Parsers, - parsers: [:urlencoded, {:multipart, length: 10_000_000}, :json, Absinthe.Plug.Parser], + parsers: [:urlencoded, {:multipart, length: upload_limit}, :json, Absinthe.Plug.Parser], pass: ["*/*"], json_decoder: Jason )