Skip to content

Commit 55b2431

Browse files
committed
VKT(Backend): Fix Content-Type header with S3 uploads [deploy]
1 parent 48e051f commit 55b2431

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

backend/vkt/src/main/java/fi/oph/vkt/service/PublicEnrollmentService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,6 @@ public Map<String, String> getPresignedPostRequest(
566566
final String extension = FilenameUtils.getExtension(filename);
567567
final String key = examEventId + "/" + person.getUuid() + "/" + millis + "." + extension;
568568

569-
return s3Service.getPresignedPostRequest(key);
569+
return s3Service.getPresignedPostRequest(key, extension);
570570
}
571571
}

backend/vkt/src/main/java/fi/oph/vkt/service/aws/S3Service.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package fi.oph.vkt.service.aws;
22

3+
import fi.oph.vkt.util.exception.APIException;
4+
import fi.oph.vkt.util.exception.APIExceptionType;
35
import java.time.Duration;
46
import java.time.LocalDate;
57
import java.time.ZoneId;
@@ -29,11 +31,24 @@ public class S3Service {
2931
private final AwsCredentialsProvider awsCredentialsProvider;
3032

3133
private static final int MAX_SIZE_100_MB = 100 * 1024 * 1024;
32-
private static final String ACCEPTED_CONTENT_TYPES =
33-
"application/pdf,image/jpeg,image/png,image/heic,image/tiff,image/webp";
3434
private static final Duration POST_POLICY_VALID_FOR_ONE_MIN = Duration.ofMinutes(1);
3535
private static final int OBJECT_EXPIRY_MONTHS = 3;
3636

37+
private static String guessContentType(String extension) {
38+
if (extension == null) {
39+
throw new APIException(APIExceptionType.INVALID_ATTACHMENT);
40+
}
41+
return switch (extension.toLowerCase()) {
42+
case "pdf" -> "application/pdf";
43+
case "jpg", "jpeg" -> "image/jpeg";
44+
case "png" -> "image/png";
45+
case "heic" -> "image/heic";
46+
case "tiff" -> "image/tiff";
47+
case "webp" -> "image/webp";
48+
default -> throw new APIException(APIExceptionType.INVALID_ATTACHMENT);
49+
};
50+
}
51+
3752
public String getPresignedUrl(String key) {
3853
GetObjectRequest request = GetObjectRequest.builder().bucket(s3Config.getBucketName()).key(key).build();
3954
GetObjectPresignRequest presignRequest = GetObjectPresignRequest
@@ -46,16 +61,17 @@ public String getPresignedUrl(String key) {
4661
return presignedRequest.url().toExternalForm();
4762
}
4863

49-
public Map<String, String> getPresignedPostRequest(String key) {
64+
public Map<String, String> getPresignedPostRequest(String key, String extension) {
5065
final LocalDate objectExpiry = LocalDate.now().plusMonths(OBJECT_EXPIRY_MONTHS);
66+
final String contentType = guessContentType(extension);
5167

5268
S3PostObjectRequest.Builder requestBuilder = S3PostObjectRequest
5369
.builder()
5470
.bucket(s3Config.getBucketName())
5571
.expiration(POST_POLICY_VALID_FOR_ONE_MIN)
5672
.withCondition(Conditions.keyStartsWith(key))
5773
.withCondition(Conditions.contentLengthRange(0, MAX_SIZE_100_MB))
58-
.withCondition(Conditions.contentTypeHeaderEquals(ACCEPTED_CONTENT_TYPES))
74+
.withCondition(Conditions.contentTypeHeaderEquals(contentType))
5975
.withCondition(
6076
Conditions.expiresHeaderEquals(
6177
DateTimeFormatter.RFC_1123_DATE_TIME.format(objectExpiry.atStartOfDay(ZoneId.of("GMT")))

0 commit comments

Comments
 (0)