From e89e0e1694661ed8a1adff47c25eb44f8293a4ea Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Sun, 7 Mar 2021 14:13:46 +0000
Subject: [PATCH] =?UTF-8?q?API:=20Resize=20up=C3=9Floaded=20images=20if=20?=
 =?UTF-8?q?they=20exceed=20the=20maximum=20size?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 mod/wall_upload.php | 40 +++++++++++++++++++++++++++-------------
 1 file changed, 27 insertions(+), 13 deletions(-)

diff --git a/mod/wall_upload.php b/mod/wall_upload.php
index c3ba323043..feb960f7aa 100644
--- a/mod/wall_upload.php
+++ b/mod/wall_upload.php
@@ -168,19 +168,6 @@ function wall_upload_post(App $a, $desktopmode = true)
 	Logger::log("File upload src: " . $src . " - filename: " . $filename .
 		" - size: " . $filesize . " - type: " . $filetype, Logger::DEBUG);
 
-	$maximagesize = DI::config()->get('system', 'maximagesize');
-
-	if (($maximagesize) && ($filesize > $maximagesize)) {
-		$msg = DI::l10n()->t('Image exceeds size limit of %s', Strings::formatBytes($maximagesize));
-		if ($r_json) {
-			echo json_encode(['error' => $msg]);
-		} else {
-			echo  $msg. EOL;
-		}
-		@unlink($src);
-		exit();
-	}
-
 	$imagedata = @file_get_contents($src);
 	$Image = new Image($imagedata, $filetype);
 
@@ -204,12 +191,39 @@ function wall_upload_post(App $a, $desktopmode = true)
 	}
 	if ($max_length > 0) {
 		$Image->scaleDown($max_length);
+		$filesize = strlen($Image->asString());
 		Logger::log("File upload: Scaling picture to new size " . $max_length, Logger::DEBUG);
 	}
 
 	$width = $Image->getWidth();
 	$height = $Image->getHeight();
 
+	$maximagesize = DI::config()->get('system', 'maximagesize');
+
+	if (!empty($maximagesize) && ($filesize > $maximagesize)) {
+		// Scale down to multiples of 640 until the maximum size isn't exceeded anymore
+		foreach ([5120, 2560, 1280, 640] as $pixels) {
+			if (($filesize > $maximagesize) && (max($width, $height) > $pixels)) {
+				Logger::info('Resize', ['size' => $filesize, 'width' => $width, 'height' => $height, 'max' => $maximagesize, 'pixels' => $pixels]);
+				$Image->scaleDown($pixels);
+				$filesize = strlen($Image->asString());
+				$width = $Image->getWidth();
+				$height = $Image->getHeight();
+			}
+		}
+		if ($filesize > $maximagesize) {
+			Logger::notice('Image size is too big', ['size' => $filesize, 'max' => $maximagesize]);
+			$msg = DI::l10n()->t('Image exceeds size limit of %s', Strings::formatBytes($maximagesize));
+			if ($r_json) {
+				echo json_encode(['error' => $msg]);
+			} else {
+				echo  $msg. EOL;
+			}
+			@unlink($src);
+			exit();
+		}
+	}
+
 	$resource_id = Photo::newResource();
 
 	$smallest = 0;