diff --git a/backend/migrations/20241209025008_client_max_body_size.js b/backend/migrations/20241209025008_client_max_body_size.js new file mode 100644 index 000000000..600732f2e --- /dev/null +++ b/backend/migrations/20241209025008_client_max_body_size.js @@ -0,0 +1,34 @@ +const migrate_name = 'client_max_body_size'; +const logger = require('../logger').migrate; + +/** + * Migrate + * + * @see http://knexjs.org/#Schema + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.up = function (knex/*, Promise*/) { + logger.info('[' + migrate_name + '] Migrating Up...'); + + return knex.schema.table('proxy_host', function (proxy_host) { + proxy_host.integer('client_max_body_size').notNull().unsigned().defaultTo('1'); + }) + .then(() => { + logger.info('[' + migrate_name + '] proxy_host Table altered'); + }); +}; + +/** + * Undo Migrate + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.down = function (knex, Promise) { + logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); + return Promise.resolve(true); +}; \ No newline at end of file diff --git a/backend/schema/components/proxy-host-object.json b/backend/schema/components/proxy-host-object.json index 5098802b1..fb1667e17 100644 --- a/backend/schema/components/proxy-host-object.json +++ b/backend/schema/components/proxy-host-object.json @@ -9,6 +9,7 @@ "domain_names", "forward_host", "forward_port", + "client_max_body_size", "access_list_id", "certificate_id", "ssl_forced", @@ -52,6 +53,11 @@ "minimum": 1, "maximum": 65535 }, + "client_max_body_size": { + "type": "integer", + "minimum": 1, + "maximum": 4096 + }, "access_list_id": { "$ref": "../common.json#/properties/access_list_id" }, @@ -112,6 +118,9 @@ "forward_port": { "$ref": "#/properties/forward_port" }, + "client_max_body_size": { + "$ref": "#/properties/client_max_body_size" + }, "forward_path": { "type": "string" }, diff --git a/backend/schema/paths/nginx/proxy-hosts/get.json b/backend/schema/paths/nginx/proxy-hosts/get.json index 1d9f63351..222d08e5b 100644 --- a/backend/schema/paths/nginx/proxy-hosts/get.json +++ b/backend/schema/paths/nginx/proxy-hosts/get.json @@ -34,6 +34,7 @@ "domain_names": ["test.example.com"], "forward_host": "127.0.0.1", "forward_port": 8989, + "client_max_body_size": 1, "access_list_id": 0, "certificate_id": 0, "ssl_forced": false, diff --git a/backend/schema/paths/nginx/proxy-hosts/hostID/get.json b/backend/schema/paths/nginx/proxy-hosts/hostID/get.json index 5e10a9cfd..e0fb7e4d8 100644 --- a/backend/schema/paths/nginx/proxy-hosts/hostID/get.json +++ b/backend/schema/paths/nginx/proxy-hosts/hostID/get.json @@ -34,6 +34,7 @@ "domain_names": ["test.example.com"], "forward_host": "192.168.0.10", "forward_port": 8989, + "client_max_body_size": 1, "access_list_id": 0, "certificate_id": 0, "ssl_forced": false, diff --git a/backend/schema/paths/nginx/proxy-hosts/hostID/put.json b/backend/schema/paths/nginx/proxy-hosts/hostID/put.json index 5cab6e752..836b46f90 100644 --- a/backend/schema/paths/nginx/proxy-hosts/hostID/put.json +++ b/backend/schema/paths/nginx/proxy-hosts/hostID/put.json @@ -41,6 +41,9 @@ "forward_port": { "$ref": "../../../../components/proxy-host-object.json#/properties/forward_port" }, + "client_max_body_size": { + "$ref": "../../../../components/proxy-host-object.json#/properties/client_max_body_size" + }, "certificate_id": { "$ref": "../../../../components/proxy-host-object.json#/properties/certificate_id" }, @@ -100,6 +103,7 @@ "domain_names": ["test.example.com"], "forward_host": "192.168.0.10", "forward_port": 8989, + "client_max_body_size": 1, "access_list_id": 0, "certificate_id": 0, "ssl_forced": false, diff --git a/backend/schema/paths/nginx/proxy-hosts/post.json b/backend/schema/paths/nginx/proxy-hosts/post.json index 85455fb6b..6edb9fd19 100644 --- a/backend/schema/paths/nginx/proxy-hosts/post.json +++ b/backend/schema/paths/nginx/proxy-hosts/post.json @@ -29,6 +29,9 @@ "forward_port": { "$ref": "../../../components/proxy-host-object.json#/properties/forward_port" }, + "client_max_body_size": { + "$ref": "../../../components/proxy-host-object.json#/properties/client_max_body_size" + }, "certificate_id": { "$ref": "../../../components/proxy-host-object.json#/properties/certificate_id" }, @@ -88,6 +91,7 @@ "domain_names": ["test.example.com"], "forward_host": "127.0.0.1", "forward_port": 8989, + "client_max_body_size": 1, "access_list_id": 0, "certificate_id": 0, "ssl_forced": false, diff --git a/backend/templates/proxy_host.conf b/backend/templates/proxy_host.conf index d23ca46fa..356841602 100644 --- a/backend/templates/proxy_host.conf +++ b/backend/templates/proxy_host.conf @@ -47,6 +47,8 @@ proxy_http_version 1.1; } {% endif %} + client_max_body_size {{ client_max_body_size }}m; + # Custom include /data/nginx/custom/server_proxy[.]conf; } diff --git a/frontend/js/app/nginx/proxy/form.ejs b/frontend/js/app/nginx/proxy/form.ejs index 8e7a2a2df..6285aa1ef 100644 --- a/frontend/js/app/nginx/proxy/form.ejs +++ b/frontend/js/app/nginx/proxy/form.ejs @@ -81,7 +81,12 @@ - +
+
+ + +
+
diff --git a/frontend/js/app/nginx/proxy/form.js b/frontend/js/app/nginx/proxy/form.js index 4437a6ddd..7eb8152cf 100644 --- a/frontend/js/app/nginx/proxy/form.js +++ b/frontend/js/app/nginx/proxy/form.js @@ -160,6 +160,7 @@ module.exports = Mn.View.extend({ // Manipulate data.forward_port = parseInt(data.forward_port, 10); + data.client_max_body_size = parseInt(data.client_max_body_size, 10); data.block_exploits = !!data.block_exploits; data.caching_enabled = !!data.caching_enabled; data.allow_websocket_upgrade = !!data.allow_websocket_upgrade; diff --git a/frontend/js/i18n/messages.json b/frontend/js/i18n/messages.json index 0bbde4541..3a665d335 100644 --- a/frontend/js/i18n/messages.json +++ b/frontend/js/i18n/messages.json @@ -125,6 +125,7 @@ "forward-scheme": "Scheme", "forward-host": "Forward Hostname / IP", "forward-port": "Forward Port", + "client-max-body-size": "Max proxied upload size (Mb)", "delete": "Delete Proxy Host", "delete-confirm": "Are you sure you want to delete the Proxy host for: {domains}?", "help-title": "What is a Proxy Host?", diff --git a/frontend/js/models/proxy-host.js b/frontend/js/models/proxy-host.js index b82d09fef..ed3eb9bcf 100644 --- a/frontend/js/models/proxy-host.js +++ b/frontend/js/models/proxy-host.js @@ -12,6 +12,7 @@ const model = Backbone.Model.extend({ forward_scheme: 'http', forward_host: '', forward_port: null, + client_max_body_size: 1, access_list_id: 0, certificate_id: 0, ssl_forced: false, diff --git a/test/cypress/e2e/api/ProxyHosts.cy.js b/test/cypress/e2e/api/ProxyHosts.cy.js index 5bc645800..ac048a834 100644 --- a/test/cypress/e2e/api/ProxyHosts.cy.js +++ b/test/cypress/e2e/api/ProxyHosts.cy.js @@ -18,6 +18,7 @@ describe('Proxy Hosts endpoints', () => { forward_scheme: 'http', forward_host: '1.1.1.1', forward_port: 80, + client_max_body_size: 1, access_list_id: '0', certificate_id: 0, meta: {