diff --git a/application/src/test/java/org/thingsboard/server/controller/ImageControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/ImageControllerTest.java index 912820c723..3de85e737f 100644 --- a/application/src/test/java/org/thingsboard/server/controller/ImageControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/ImageControllerTest.java @@ -333,25 +333,26 @@ public class ImageControllerTest extends AbstractControllerTest { }); loginTenantAdmin(); - String filename = "large_decoded_image.png"; - TbResourceInfo imageInfo = uploadImage(HttpMethod.POST, "/api/image", filename, "image/png", PNG_IMAGE); - - ImageDescriptor imageDescriptor = imageInfo.getDescriptor(ImageDescriptor.class); - assertThat(imageDescriptor.getWidth()).isEqualTo(200); - assertThat(imageDescriptor.getHeight()).isEqualTo(160); - - ImageDescriptor previewDescriptor = imageDescriptor.getPreviewDescriptor(); - assertThat(previewDescriptor.getMediaType()).isEqualTo("image/gif"); - assertThat(previewDescriptor.getWidth()).isEqualTo(1); - assertThat(previewDescriptor.getHeight()).isEqualTo(1); - - assertThat(downloadImagePreview("tenant", filename)).containsExactly(ImageUtils.PLACEHOLDER_PREVIEW); - - // Reset maxResourceSize - loginSysAdmin(); - updateDefaultTenantProfileConfig(tenantProfileConfig -> { - tenantProfileConfig.setMaxResourceSize(0); - }); + try { + String filename = "large_decoded_image.png"; + TbResourceInfo imageInfo = uploadImage(HttpMethod.POST, "/api/image", filename, "image/png", PNG_IMAGE); + + ImageDescriptor imageDescriptor = imageInfo.getDescriptor(ImageDescriptor.class); + assertThat(imageDescriptor.getWidth()).isEqualTo(200); + assertThat(imageDescriptor.getHeight()).isEqualTo(160); + + ImageDescriptor previewDescriptor = imageDescriptor.getPreviewDescriptor(); + assertThat(previewDescriptor.getMediaType()).isEqualTo("image/gif"); + assertThat(previewDescriptor.getWidth()).isEqualTo(1); + assertThat(previewDescriptor.getHeight()).isEqualTo(1); + + assertThat(downloadImagePreview("tenant", filename)).containsExactly(ImageUtils.PLACEHOLDER_PREVIEW); + } finally { + loginSysAdmin(); + updateDefaultTenantProfileConfig(tenantProfileConfig -> { + tenantProfileConfig.setMaxResourceSize(0); + }); + } } @Test diff --git a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseImageService.java b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseImageService.java index 3df2d945dc..1777af5742 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseImageService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseImageService.java @@ -138,8 +138,8 @@ public class BaseImageService extends BaseResourceService implements ImageServic resourceValidator.validate(image, TbResourceInfo::getTenantId); ImageDescriptor descriptor = image.getDescriptor(ImageDescriptor.class); - long maxDecodedImageSize = resourceValidator.getMaxResourceSize(image.getTenantId()); - Pair result = processImage(image.getData(), descriptor, maxDecodedImageSize); + long maxResourceSize = resourceValidator.getMaxResourceSize(image.getTenantId()); + Pair result = processImage(image.getData(), descriptor, maxResourceSize); descriptor = result.getLeft(); image.setEtag(descriptor.getEtag()); image.setDescriptorValue(descriptor); @@ -153,14 +153,14 @@ public class BaseImageService extends BaseResourceService implements ImageServic return new TbResourceInfo(doSaveResource(image)); } - private Pair processImage(byte[] data, ImageDescriptor descriptor, long maxDecodedImageSize) throws Exception { - if (maxDecodedImageSize > 0) { + private Pair processImage(byte[] data, ImageDescriptor descriptor, long maxResourceSize) throws Exception { + if (maxResourceSize > 0) { int[] dimensions = ImageUtils.getImageDimensions(data, descriptor.getMediaType()); if (dimensions != null) { long decodedSize = (long) dimensions[0] * dimensions[1] * 4; - if (decodedSize > maxDecodedImageSize) { - log.info("Image decoded size ({} bytes) exceeds max decoded image size ({} bytes), skipping preview generation", - decodedSize, maxDecodedImageSize); + if (decodedSize > maxResourceSize) { + log.info("Image decoded size ({} bytes) exceeds maxResourceSize ({} bytes), skipping preview generation", + decodedSize, maxResourceSize); descriptor.setWidth(dimensions[0]); descriptor.setHeight(dimensions[1]); descriptor.setSize(data.length); diff --git a/dao/src/main/java/org/thingsboard/server/dao/util/ImageUtils.java b/dao/src/main/java/org/thingsboard/server/dao/util/ImageUtils.java index 3d53e9fd10..7cb9b26ac2 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/util/ImageUtils.java +++ b/dao/src/main/java/org/thingsboard/server/dao/util/ImageUtils.java @@ -86,6 +86,9 @@ public class ImageUtils { return null; } try (ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(data))) { + if (iis == null) { + return null; + } var readers = ImageIO.getImageReaders(iis); if (readers.hasNext()) { ImageReader reader = readers.next();