From d78db75aebf941467fa449d13e3da1430fc44383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kr=C3=BChlmann?= Date: Fri, 23 Jan 2026 16:33:51 +0100 Subject: [PATCH] Use int values for canvas size --- .../service/ChannelDirectoryService.java | 25 +++++++++++++++++++ src/main/resources/static/js/dashboard.js | 10 +++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/kruhlmann/imgfloat/service/ChannelDirectoryService.java b/src/main/java/dev/kruhlmann/imgfloat/service/ChannelDirectoryService.java index 7745c8e..6163c5d 100644 --- a/src/main/java/dev/kruhlmann/imgfloat/service/ChannelDirectoryService.java +++ b/src/main/java/dev/kruhlmann/imgfloat/service/ChannelDirectoryService.java @@ -204,6 +204,7 @@ public class ChannelDirectoryService { } public CanvasSettingsRequest updateCanvasSettings(String broadcaster, CanvasSettingsRequest req, String actor) { + validateCanvasSettings(req); Channel channel = getOrCreateChannel(broadcaster); double beforeWidth = channel.getCanvasWidth(); double beforeHeight = channel.getCanvasHeight(); @@ -230,6 +231,30 @@ public class ChannelDirectoryService { return response; } + private void validateCanvasSettings(CanvasSettingsRequest req) { + Settings settings = settingsService.get(); + int canvasMaxSizePixels = settings.getMaxCanvasSideLengthPixels(); + + if ( + req.getWidth() <= 0 || + req.getWidth() > canvasMaxSizePixels || + !Double.isFinite(req.getWidth()) || + req.getWidth() % 1 != 0 + ) throw new ResponseStatusException( + BAD_REQUEST, + "Canvas width must be a whole number within [1 to " + canvasMaxSizePixels + "]" + ); + if ( + req.getHeight() <= 0 || + req.getHeight() > canvasMaxSizePixels || + !Double.isFinite(req.getHeight()) || + req.getHeight() % 1 != 0 + ) throw new ResponseStatusException( + BAD_REQUEST, + "Canvas height must be a whole number within [1 to " + canvasMaxSizePixels + "]" + ); + } + public ChannelScriptSettingsRequest getChannelScriptSettings(String broadcaster) { Channel channel = getOrCreateChannel(broadcaster); return new ChannelScriptSettingsRequest( diff --git a/src/main/resources/static/js/dashboard.js b/src/main/resources/static/js/dashboard.js index c109730..e4c2d21 100644 --- a/src/main/resources/static/js/dashboard.js +++ b/src/main/resources/static/js/dashboard.js @@ -216,12 +216,16 @@ async function fetchCanvasSettings() { } async function saveCanvasSettings() { - const width = parseFloat(elements.canvasWidth?.value) || 0; - const height = parseFloat(elements.canvasHeight?.value) || 0; - if (width <= 0 || height <= 0) { + const width = Number(elements.canvasWidth?.value); + const height = Number(elements.canvasHeight?.value); + if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) { showToast("Please enter a valid width and height.", "info"); return; } + if (!Number.isInteger(width) || !Number.isInteger(height)) { + showToast("Please enter whole-number dimensions for the canvas size.", "info"); + return; + } if (elements.canvasStatus) elements.canvasStatus.textContent = "Saving..."; setButtonBusy(elements.canvasSaveButton, true, "Saving..."); try {