diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/WhiteLabelService.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/WhiteLabelService.java index 8545bebcd9..68313eb878 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/WhiteLabelService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/WhiteLabelService.java @@ -87,9 +87,7 @@ public interface WhiteLabelService { @GET @Path("/favicon") - @Produces(MediaType.APPLICATION_OCTET_STREAM) @ApiOperation( - produces = MediaType.APPLICATION_OCTET_STREAM, httpMethod = HTTPConstants.HEADER_GET, value = "Get whitelabel favicon", notes = "Get whitelabel favicon for the tenant of the logged in user", @@ -123,9 +121,7 @@ public interface WhiteLabelService { @GET @Path("/logo") - @Produces(MediaType.APPLICATION_OCTET_STREAM) @ApiOperation( - produces = MediaType.APPLICATION_OCTET_STREAM, httpMethod = HTTPConstants.HEADER_GET, value = "Get whitelabel logo", notes = "Get whitelabel logo for the tenant of the logged in user", diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/WhiteLabelServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/WhiteLabelServiceImpl.java index 901885985d..69cb3d9ea7 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/WhiteLabelServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/WhiteLabelServiceImpl.java @@ -20,6 +20,7 @@ package org.wso2.carbon.device.mgt.jaxrs.service.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.common.FileResponse; import org.wso2.carbon.device.mgt.common.exceptions.MetadataManagementException; import org.wso2.carbon.device.mgt.common.exceptions.NotFoundException; import org.wso2.carbon.device.mgt.common.metadata.mgt.WhiteLabelTheme; @@ -52,8 +53,8 @@ public class WhiteLabelServiceImpl implements WhiteLabelService { @Path("/favicon") public Response getWhiteLabelFavicon() { try { - byte[] fileContent = DeviceMgtAPIUtils.getWhiteLabelManagementService().getWhiteLabelFavicon(); - return sendFileStream(fileContent); + FileResponse fileResponse = DeviceMgtAPIUtils.getWhiteLabelManagementService().getWhiteLabelFavicon(); + return sendFileStream(fileResponse); } catch (NotFoundException e) { String msg = "Favicon white label image cannot be found in the system. Updating the whitelabel theme might" + "help restore it"; @@ -71,8 +72,8 @@ public class WhiteLabelServiceImpl implements WhiteLabelService { @Path("/logo") public Response getWhiteLabelLogo() { try { - byte[] fileContent = DeviceMgtAPIUtils.getWhiteLabelManagementService().getWhiteLabelLogo(); - return sendFileStream(fileContent); + FileResponse fileResponse = DeviceMgtAPIUtils.getWhiteLabelManagementService().getWhiteLabelLogo(); + return sendFileStream(fileResponse); } catch (NotFoundException e) { String msg = "Logo white label image cannot be found in the system. Updating the whitelabel theme might" + "help restore it"; @@ -131,14 +132,14 @@ public class WhiteLabelServiceImpl implements WhiteLabelService { } /** - * Useful to send files as application/octet-stream responses + * Useful to send file responses */ - private Response sendFileStream(byte[] content) { - try (ByteArrayInputStream binaryDuplicate = new ByteArrayInputStream(content)) { + private Response sendFileStream(FileResponse fileResponse) { + try (ByteArrayInputStream binaryDuplicate = new ByteArrayInputStream(fileResponse.getFileContent())) { Response.ResponseBuilder response = Response - .ok(binaryDuplicate, MediaType.APPLICATION_OCTET_STREAM); + .ok(binaryDuplicate, fileResponse.getMimeType()); response.status(Response.Status.OK); - response.header("Content-Length", content.length); + response.header("Content-Length", fileResponse.getFileContent().length); return response.build(); } catch (IOException e) { String msg = "Error occurred while creating input stream from buffer array. "; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/FileResponse.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/FileResponse.java new file mode 100644 index 0000000000..d2b29e34b9 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/FileResponse.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2022, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.wso2.carbon.device.mgt.common; + +public class FileResponse { + private byte[] fileContent; + private String mimeType; + + private String name; + + public byte[] getFileContent() { + return fileContent; + } + + public void setFileContent(byte[] fileContent) { + this.fileContent = fileContent; + } + + public String getMimeType() { + return mimeType; + } + + public void setMimeType(String mimeType) { + this.mimeType = mimeType; + } + + public enum ImageExtension { + SVG() { + @Override + public String mimeType() { + return "image/svg+xml"; + } + }, + PNG, + JPG, + JPEG, + GIF; + + public String mimeType() { + return "application/octet-stream"; + } + + public static String mimeTypeOf(String extension) { + ImageExtension imageExtension = ImageExtension.valueOf(extension.toUpperCase()); + return imageExtension.mimeType(); + } + + @Override + public String toString() { + return this.name().toLowerCase(); + } + + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/metadata/mgt/WhiteLabelManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/metadata/mgt/WhiteLabelManagementService.java index e1536b8059..68a630a19f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/metadata/mgt/WhiteLabelManagementService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/metadata/mgt/WhiteLabelManagementService.java @@ -18,6 +18,7 @@ package org.wso2.carbon.device.mgt.common.metadata.mgt; +import org.wso2.carbon.device.mgt.common.FileResponse; import org.wso2.carbon.device.mgt.common.exceptions.MetadataManagementException; import org.wso2.carbon.device.mgt.common.exceptions.NotFoundException; @@ -32,7 +33,7 @@ public interface WhiteLabelManagementService { * @throws MetadataManagementException if error occurred while retrieving favicon * @throws NotFoundException if favicon is not found */ - byte[] getWhiteLabelFavicon() throws + FileResponse getWhiteLabelFavicon() throws MetadataManagementException, NotFoundException; /** @@ -41,7 +42,7 @@ public interface WhiteLabelManagementService { * @throws MetadataManagementException if error occurred while retrieving logo * @throws NotFoundException if logo is not found */ - byte[] getWhiteLabelLogo() throws + FileResponse getWhiteLabelLogo() throws MetadataManagementException, NotFoundException; /** diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/common/util/FileUtil.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/common/util/FileUtil.java index 60d1538af9..269e6b7957 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/common/util/FileUtil.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/common/util/FileUtil.java @@ -88,7 +88,7 @@ public class FileUtil { String suffix = generateDuplicateFileNameSuffix(fileNameCount); String fileNameWithoutExtension = extractFileNameWithoutExtension(fileName); String fileNameWithSuffix = fileNameWithoutExtension + suffix; - fileNameWithSuffix = fileNameWithSuffix + '.' + extractFileExtension(fileName); + fileNameWithSuffix = fileNameWithSuffix + '.' + extractFileExtensionFileName(fileName); return fileNameWithSuffix; } @@ -111,13 +111,27 @@ public class FileUtil { return suffix; } + /** + * Use to extract file extension from file path + * + * @param filePath path of the file + * @return extension of the file + */ + public static String extractFileExtensionFromFilePath(String filePath) { + File file = new File(filePath); + return extractFileExtensionFileName(file.getName()); + } + /** * Use to extract file extension from file name * * @param fileName name of the file * @return extension of the file */ - private static String extractFileExtension(String fileName) { + public static String extractFileExtensionFileName(String fileName) { + if (!fileName.contains(".")) { + return ""; + } return fileName.substring(fileName.lastIndexOf('.') + 1); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/metadata/mgt/WhiteLabelManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/metadata/mgt/WhiteLabelManagementServiceImpl.java index b9ea1091bf..6dfbda673b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/metadata/mgt/WhiteLabelManagementServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/metadata/mgt/WhiteLabelManagementServiceImpl.java @@ -28,6 +28,7 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.mgt.common.Base64File; +import org.wso2.carbon.device.mgt.common.FileResponse; import org.wso2.carbon.device.mgt.common.exceptions.MetadataManagementException; import org.wso2.carbon.device.mgt.common.exceptions.NotFoundException; import org.wso2.carbon.device.mgt.common.exceptions.TransactionManagementException; @@ -37,6 +38,8 @@ import org.wso2.carbon.device.mgt.common.metadata.mgt.WhiteLabelImageRequestPayl import org.wso2.carbon.device.mgt.common.metadata.mgt.WhiteLabelManagementService; import org.wso2.carbon.device.mgt.common.metadata.mgt.WhiteLabelTheme; import org.wso2.carbon.device.mgt.common.metadata.mgt.WhiteLabelThemeCreateRequest; +import org.wso2.carbon.device.mgt.core.common.util.FileUtil; +import org.wso2.carbon.device.mgt.core.common.util.HttpUtil; import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager; import org.wso2.carbon.device.mgt.core.config.metadata.mgt.MetaDataConfiguration; import org.wso2.carbon.device.mgt.core.config.metadata.mgt.whitelabel.WhiteLabelConfiguration; @@ -46,7 +49,6 @@ import org.wso2.carbon.device.mgt.core.metadata.mgt.dao.MetadataManagementDAOExc import org.wso2.carbon.device.mgt.core.metadata.mgt.dao.MetadataManagementDAOFactory; import org.wso2.carbon.device.mgt.core.metadata.mgt.dao.util.MetadataConstants; import org.wso2.carbon.device.mgt.core.metadata.mgt.util.WhiteLabelStorageUtil; - import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -66,10 +68,10 @@ public class WhiteLabelManagementServiceImpl implements WhiteLabelManagementServ } @Override - public byte[] getWhiteLabelFavicon() throws MetadataManagementException, NotFoundException { + public FileResponse getWhiteLabelFavicon() throws MetadataManagementException, NotFoundException { try { WhiteLabelTheme whiteLabelTheme = getWhiteLabelTheme(); - return getImageContent(whiteLabelTheme.getFaviconImage(), WhiteLabelImage.ImageName.FAVICON); + return getImageFileResponse(whiteLabelTheme.getFaviconImage(), WhiteLabelImage.ImageName.FAVICON); } catch (IOException e) { String msg = "Error occurred while getting byte content of favicon"; log.error(msg, e); @@ -78,10 +80,10 @@ public class WhiteLabelManagementServiceImpl implements WhiteLabelManagementServ } @Override - public byte[] getWhiteLabelLogo() throws MetadataManagementException, NotFoundException { + public FileResponse getWhiteLabelLogo() throws MetadataManagementException, NotFoundException { try { WhiteLabelTheme whiteLabelTheme = getWhiteLabelTheme(); - return getImageContent(whiteLabelTheme.getLogoImage(), WhiteLabelImage.ImageName.LOGO); + return getImageFileResponse(whiteLabelTheme.getLogoImage(), WhiteLabelImage.ImageName.LOGO); } catch (IOException e) { String msg = "Error occurred while getting byte content of logo"; log.error(msg, e); @@ -90,21 +92,36 @@ public class WhiteLabelManagementServiceImpl implements WhiteLabelManagementServ } /** - * Useful to get white label image file byte content for provided {@link WhiteLabelImage.ImageName} + * Useful to get white label image file response for provided {@link WhiteLabelImage.ImageName} */ - private byte[] getImageContent(WhiteLabelImage image, WhiteLabelImage.ImageName imageName) throws + private FileResponse getImageFileResponse(WhiteLabelImage image, WhiteLabelImage.ImageName imageName) throws IOException, MetadataManagementException, NotFoundException { if (image.getImageLocationType() == WhiteLabelImage.ImageLocationType.URL) { - return getImageStreamFromUrl(image.getImageLocation()); + return getImageFileResponseFromUrl(image.getImageLocation()); } + return getImageFileResponseFromStorage(image, imageName); + } + + /** + * Useful to get white label image file response from provided image info + */ + private FileResponse getImageFileResponseFromStorage(WhiteLabelImage image, WhiteLabelImage.ImageName imageName) + throws IOException, NotFoundException, MetadataManagementException { + FileResponse fileResponse = new FileResponse(); InputStream fileStream = WhiteLabelStorageUtil.getWhiteLabelImageStream(image, imageName); - return IOUtils.toByteArray(fileStream); + byte[] fileContent = IOUtils.toByteArray(fileStream); + String fileExtension = FileUtil.extractFileExtensionFromFilePath(image.getImageLocation()); + String mimeType = FileResponse.ImageExtension.mimeTypeOf(fileExtension); + fileResponse.setMimeType(mimeType); + fileResponse.setFileContent(fileContent); + return fileResponse; } /** - * Useful to get white label image file byte content from provided url + * Useful to get white label image file response from provided url */ - private byte[] getImageStreamFromUrl(String url) throws IOException, NotFoundException { + private FileResponse getImageFileResponseFromUrl(String url) throws IOException, NotFoundException { + FileResponse fileResponse = new FileResponse(); try(CloseableHttpClient client = HttpClients.createDefault()) { HttpGet imageGetRequest = new HttpGet(url); HttpResponse response = client.execute(imageGetRequest); @@ -114,7 +131,11 @@ public class WhiteLabelManagementServiceImpl implements WhiteLabelManagementServ log.error(msg); throw new NotFoundException(msg); } - return IOUtils.toByteArray(imageStream); + byte[] fileContent = IOUtils.toByteArray(imageStream); + fileResponse.setFileContent(fileContent); + String mimeType = HttpUtil.getContentType(response); + fileResponse.setMimeType(mimeType); + return fileResponse; } }