Browse Source

Rename maxDecodedImageSize to maxResourceSize; null-check ImageInputStream; wrap test cleanup in finally

pull/15411/head
Oleksandra Matviienko 2 months ago
parent
commit
65e5097b52
  1. 39
      application/src/test/java/org/thingsboard/server/controller/ImageControllerTest.java
  2. 14
      dao/src/main/java/org/thingsboard/server/dao/resource/BaseImageService.java
  3. 3
      dao/src/main/java/org/thingsboard/server/dao/util/ImageUtils.java

39
application/src/test/java/org/thingsboard/server/controller/ImageControllerTest.java

@ -333,25 +333,26 @@ public class ImageControllerTest extends AbstractControllerTest {
}); });
loginTenantAdmin(); loginTenantAdmin();
String filename = "large_decoded_image.png"; try {
TbResourceInfo imageInfo = uploadImage(HttpMethod.POST, "/api/image", filename, "image/png", PNG_IMAGE); 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); ImageDescriptor imageDescriptor = imageInfo.getDescriptor(ImageDescriptor.class);
assertThat(imageDescriptor.getHeight()).isEqualTo(160); assertThat(imageDescriptor.getWidth()).isEqualTo(200);
assertThat(imageDescriptor.getHeight()).isEqualTo(160);
ImageDescriptor previewDescriptor = imageDescriptor.getPreviewDescriptor();
assertThat(previewDescriptor.getMediaType()).isEqualTo("image/gif"); ImageDescriptor previewDescriptor = imageDescriptor.getPreviewDescriptor();
assertThat(previewDescriptor.getWidth()).isEqualTo(1); assertThat(previewDescriptor.getMediaType()).isEqualTo("image/gif");
assertThat(previewDescriptor.getHeight()).isEqualTo(1); assertThat(previewDescriptor.getWidth()).isEqualTo(1);
assertThat(previewDescriptor.getHeight()).isEqualTo(1);
assertThat(downloadImagePreview("tenant", filename)).containsExactly(ImageUtils.PLACEHOLDER_PREVIEW);
assertThat(downloadImagePreview("tenant", filename)).containsExactly(ImageUtils.PLACEHOLDER_PREVIEW);
// Reset maxResourceSize } finally {
loginSysAdmin(); loginSysAdmin();
updateDefaultTenantProfileConfig(tenantProfileConfig -> { updateDefaultTenantProfileConfig(tenantProfileConfig -> {
tenantProfileConfig.setMaxResourceSize(0); tenantProfileConfig.setMaxResourceSize(0);
}); });
}
} }
@Test @Test

14
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); resourceValidator.validate(image, TbResourceInfo::getTenantId);
ImageDescriptor descriptor = image.getDescriptor(ImageDescriptor.class); ImageDescriptor descriptor = image.getDescriptor(ImageDescriptor.class);
long maxDecodedImageSize = resourceValidator.getMaxResourceSize(image.getTenantId()); long maxResourceSize = resourceValidator.getMaxResourceSize(image.getTenantId());
Pair<ImageDescriptor, byte[]> result = processImage(image.getData(), descriptor, maxDecodedImageSize); Pair<ImageDescriptor, byte[]> result = processImage(image.getData(), descriptor, maxResourceSize);
descriptor = result.getLeft(); descriptor = result.getLeft();
image.setEtag(descriptor.getEtag()); image.setEtag(descriptor.getEtag());
image.setDescriptorValue(descriptor); image.setDescriptorValue(descriptor);
@ -153,14 +153,14 @@ public class BaseImageService extends BaseResourceService implements ImageServic
return new TbResourceInfo(doSaveResource(image)); return new TbResourceInfo(doSaveResource(image));
} }
private Pair<ImageDescriptor, byte[]> processImage(byte[] data, ImageDescriptor descriptor, long maxDecodedImageSize) throws Exception { private Pair<ImageDescriptor, byte[]> processImage(byte[] data, ImageDescriptor descriptor, long maxResourceSize) throws Exception {
if (maxDecodedImageSize > 0) { if (maxResourceSize > 0) {
int[] dimensions = ImageUtils.getImageDimensions(data, descriptor.getMediaType()); int[] dimensions = ImageUtils.getImageDimensions(data, descriptor.getMediaType());
if (dimensions != null) { if (dimensions != null) {
long decodedSize = (long) dimensions[0] * dimensions[1] * 4; long decodedSize = (long) dimensions[0] * dimensions[1] * 4;
if (decodedSize > maxDecodedImageSize) { if (decodedSize > maxResourceSize) {
log.info("Image decoded size ({} bytes) exceeds max decoded image size ({} bytes), skipping preview generation", log.info("Image decoded size ({} bytes) exceeds maxResourceSize ({} bytes), skipping preview generation",
decodedSize, maxDecodedImageSize); decodedSize, maxResourceSize);
descriptor.setWidth(dimensions[0]); descriptor.setWidth(dimensions[0]);
descriptor.setHeight(dimensions[1]); descriptor.setHeight(dimensions[1]);
descriptor.setSize(data.length); descriptor.setSize(data.length);

3
dao/src/main/java/org/thingsboard/server/dao/util/ImageUtils.java

@ -86,6 +86,9 @@ public class ImageUtils {
return null; return null;
} }
try (ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(data))) { try (ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(data))) {
if (iis == null) {
return null;
}
var readers = ImageIO.getImageReaders(iis); var readers = ImageIO.getImageReaders(iis);
if (readers.hasNext()) { if (readers.hasNext()) {
ImageReader reader = readers.next(); ImageReader reader = readers.next();

Loading…
Cancel
Save