Skip to content

Commit 2017093

Browse files
committed
Refactor of image ContentType validation
1 parent 4464f04 commit 2017093

File tree

6 files changed

+248
-36
lines changed

6 files changed

+248
-36
lines changed

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/UploadDownloadPanelFactory.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import java.io.ByteArrayInputStream;
1010
import java.io.InputStream;
1111
import java.io.Serializable;
12-
import java.util.Arrays;
1312
import java.util.List;
1413
import java.util.Objects;
1514

@@ -25,9 +24,12 @@
2524
import com.evolveum.midpoint.prism.path.ItemPath;
2625
import com.evolveum.midpoint.util.DOMUtil;
2726
import com.evolveum.midpoint.web.component.input.UploadDownloadPanel;
27+
import com.evolveum.midpoint.web.component.input.validator.FileValidatorFactory;
2828
import com.evolveum.midpoint.web.component.prism.InputPanel;
2929
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
3030

31+
import static com.evolveum.midpoint.common.MimeTypeUtil.MIME_IMAGE_JPEG;
32+
3133
/**
3234
* @author katkav
3335
*/
@@ -93,11 +95,16 @@ public List<String> getAllowedUploadContentTypes() {
9395
ItemPath path = panelCtx.getValueWrapperModel().getObject().getParent().getPath();
9496

9597
if (Objects.equals(path, ItemPath.create(FocusType.F_JPEG_PHOTO))) {
96-
return Arrays.asList("image/*");
98+
return FileValidatorFactory.ALLOWED_UPLOAD_IMAGE_CONTENT_TYPES;
9799
}
98100

99101
return super.getAllowedUploadContentTypes();
100102
}
103+
104+
@Override
105+
public String getDownloadContentType() {
106+
return MIME_IMAGE_JPEG;
107+
}
101108
};
102109

103110
return panel;

gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/UploadDownloadPanel.java

Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import com.evolveum.midpoint.web.component.AjaxSubmitButton;
3434
import com.evolveum.midpoint.web.component.prism.InputPanel;
3535
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
36+
import com.evolveum.midpoint.web.component.input.validator.ContentTypeFileValidator;
37+
import com.evolveum.midpoint.web.component.input.validator.FileValidatorFactory;
3638

3739
/**
3840
* @author shood
@@ -65,13 +67,6 @@ public List<String> getAllowedUploadContentTypes() {
6567
return allowedUploadContentTypes;
6668
}
6769

68-
public void setAllowedUploadContentTypes(List<String> allowedUploadContentTypes) {
69-
if (allowedUploadContentTypes == null) {
70-
allowedUploadContentTypes = new ArrayList<>();
71-
}
72-
this.allowedUploadContentTypes = allowedUploadContentTypes;
73-
}
74-
7570
@Override
7671
protected void onInitialize() {
7772
super.onInitialize();
@@ -119,42 +114,23 @@ protected void onError(AjaxRequestTarget target) {
119114
fileUpload.add((IValidator<List<FileUpload>>) validatable -> {
120115

121116
List<FileUpload> list = validatable.getValue();
122-
if (list == null) {
117+
if (list == null || list.isEmpty()) {
123118
return;
124119
}
125120

126121
if (getAllowedUploadContentTypes().isEmpty()) {
127122
return;
128123
}
129124

130-
String label = fileUpload.getLabel() != null ? fileUpload.getLabel().getObject() : fileUpload.getId();
125+
final String label = fileUpload.getLabel() != null ? fileUpload.getLabel().getObject() : fileUpload.getId();
126+
final List<MimeType> allowedTypes = FileValidatorFactory.getMimeTypes(getAllowedUploadContentTypes());
131127

132128
try {
133-
List<MimeType> allowedTypes = getAllowedUploadContentTypes().stream()
134-
.map(s -> {
135-
try {
136-
return new MimeType(s);
137-
} catch (MimeTypeParseException ex) {
138-
return null;
139-
}
140-
})
141-
.filter(m -> m != null)
142-
.toList();
143-
144129
for (FileUpload fu : list) {
145-
String contentType = fu.getContentType();
146-
MimeType mime = new MimeType(contentType);
147-
148-
boolean matched = false;
149-
for (MimeType allowed : allowedTypes) {
150-
if (allowed.match(mime)) {
151-
matched = true;
152-
break;
153-
}
154-
}
155-
156-
if (!matched) {
157-
String msg = getPageBase().getString("UploadDownloadPanel.validationContentNotAllowed", label, contentType);
130+
final ContentTypeFileValidator contentTypeFileValidator = new ContentTypeFileValidator(allowedTypes);
131+
final String deniedContentType = contentTypeFileValidator.validate(fu);
132+
if (!"".equals(deniedContentType)) {
133+
String msg = getPageBase().getString("UploadDownloadPanel.validationContentNotAllowed", label, deniedContentType);
158134
validatable.error(new ValidationError(msg));
159135
}
160136
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright (C) 2010-2026 Evolveum and contributors
3+
*
4+
* Licensed under the EUPL-1.2 or later.
5+
*/
6+
7+
package com.evolveum.midpoint.web.component.input.validator;
8+
9+
import jakarta.activation.MimeType;
10+
import jakarta.activation.MimeTypeParseException;
11+
import org.apache.wicket.markup.html.form.upload.FileUpload;
12+
13+
import java.util.List;
14+
15+
/**
16+
* @author matisovaa
17+
*
18+
*/
19+
public class ContentTypeFileValidator {
20+
private final List<MimeType> allowedTypes;
21+
22+
public ContentTypeFileValidator(List<MimeType> allowedTypes) {
23+
this.allowedTypes = allowedTypes;
24+
}
25+
26+
public String validate(final FileUpload fileUpload) throws MimeTypeParseException {
27+
String contentType = fileUpload.getContentType();
28+
MimeType fileMime = new MimeType(contentType);
29+
30+
for (MimeType allowed : allowedTypes) {
31+
if (allowed.match(fileMime)) {
32+
return "";
33+
}
34+
}
35+
36+
return contentType;
37+
}
38+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright (C) 2010-2026 Evolveum and contributors
3+
*
4+
* Licensed under the EUPL-1.2 or later.
5+
*/
6+
7+
package com.evolveum.midpoint.web.component.input.validator;
8+
9+
import jakarta.activation.MimeType;
10+
import jakarta.activation.MimeTypeParseException;
11+
12+
import java.util.Arrays;
13+
import java.util.List;
14+
import java.util.Objects;
15+
16+
import static com.evolveum.midpoint.common.MimeTypeUtil.MIME_IMAGE_JPEG;
17+
import static com.evolveum.midpoint.common.MimeTypeUtil.MIME_IMAGE_PNG;
18+
19+
/**
20+
* @author matisovaa
21+
*
22+
*/
23+
public class FileValidatorFactory {
24+
public static final List<String> ALLOWED_UPLOAD_IMAGE_CONTENT_TYPES = Arrays.asList(MIME_IMAGE_JPEG, MIME_IMAGE_PNG);
25+
26+
public static List<MimeType> getMimeTypes(final List<String> stringMimeTypes) {
27+
return stringMimeTypes.stream()
28+
.map(s -> {
29+
try {
30+
return new MimeType(s);
31+
} catch (MimeTypeParseException ex) {
32+
return null;
33+
}
34+
})
35+
.filter(Objects::nonNull)
36+
.toList();
37+
}
38+
}

gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/WorkItemDetailsPanel.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161
import com.evolveum.prism.xml.ns._public.types_3.ChangeTypeType;
6262
import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType;
6363

64+
import static com.evolveum.midpoint.common.MimeTypeUtil.MIME_IMAGE_JPEG;
65+
6466
/**
6567
* Created by honchar
6668
*/
@@ -318,7 +320,7 @@ public InputStream getInputStream() {
318320

319321
@Override
320322
public String getDownloadContentType() {
321-
return "image/jpeg";
323+
return MIME_IMAGE_JPEG;
322324
}
323325

324326
};
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
/*
2+
* Copyright (C) 2010-2026 Evolveum and contributors
3+
*
4+
* Licensed under the EUPL-1.2 or later.
5+
*/
6+
7+
package com.evolveum.midpoint.web.component;
8+
9+
import org.apache.commons.fileupload2.core.FileItem;
10+
import org.apache.commons.fileupload2.core.FileItemHeaders;
11+
import org.apache.commons.fileupload2.core.FileItemHeadersProvider;
12+
import org.apache.wicket.markup.html.form.upload.FileUpload;
13+
import org.springframework.test.context.ActiveProfiles;
14+
import org.testng.annotations.Test;
15+
16+
import java.io.IOException;
17+
import java.io.InputStream;
18+
import java.io.OutputStream;
19+
import java.nio.charset.Charset;
20+
import java.nio.file.Path;
21+
22+
import static com.evolveum.midpoint.common.MimeTypeUtil.*;
23+
24+
import com.evolveum.midpoint.web.component.input.validator.ContentTypeFileValidator;
25+
import com.evolveum.midpoint.web.component.input.validator.FileValidatorFactory;
26+
27+
import static org.testng.Assert.assertEquals;
28+
29+
/**
30+
* @author matisovaa
31+
*
32+
*/
33+
@ActiveProfiles("test")
34+
public class FileValidatorTest {
35+
36+
@Test
37+
public void test4299ContentTypeFileValidator_validJPEG() throws Exception {
38+
final FileUpload fu = new FileUpload(this.getFileItem(MIME_IMAGE_JPEG));
39+
final ContentTypeFileValidator contentTypeFileValidator =
40+
new ContentTypeFileValidator(FileValidatorFactory.getMimeTypes(FileValidatorFactory.ALLOWED_UPLOAD_IMAGE_CONTENT_TYPES));
41+
final String deniedContentType = contentTypeFileValidator.validate(fu);
42+
assertEquals(deniedContentType, "");
43+
}
44+
45+
@Test
46+
public void test4299ContentTypeFileValidator_validPNG() throws Exception {
47+
final FileUpload fu = new FileUpload(this.getFileItem(MIME_IMAGE_PNG));
48+
final ContentTypeFileValidator contentTypeFileValidator =
49+
new ContentTypeFileValidator(FileValidatorFactory.getMimeTypes(FileValidatorFactory.ALLOWED_UPLOAD_IMAGE_CONTENT_TYPES));
50+
final String deniedContentType = contentTypeFileValidator.validate(fu);
51+
assertEquals(deniedContentType, "");
52+
}
53+
54+
@Test
55+
public void test4299ContentTypeFileValidator_invalid() throws Exception {
56+
final FileUpload fu = new FileUpload(this.getFileItem(MIME_APPLICATION_XML));
57+
final ContentTypeFileValidator contentTypeFileValidator =
58+
new ContentTypeFileValidator(FileValidatorFactory.getMimeTypes(FileValidatorFactory.ALLOWED_UPLOAD_IMAGE_CONTENT_TYPES));
59+
final String deniedContentType = contentTypeFileValidator.validate(fu);
60+
assertEquals(deniedContentType, MIME_APPLICATION_XML);
61+
}
62+
63+
private FileItem getFileItem(final String contentType) {
64+
return new FileItem() {
65+
@Override
66+
public FileItem delete() throws IOException {
67+
return null;
68+
}
69+
70+
@Override
71+
public byte[] get() throws IOException {
72+
return new byte[0];
73+
}
74+
75+
@Override
76+
public String getContentType() {
77+
return contentType;
78+
}
79+
80+
@Override
81+
public String getFieldName() {
82+
return "";
83+
}
84+
85+
@Override
86+
public InputStream getInputStream() throws IOException {
87+
return null;
88+
}
89+
90+
@Override
91+
public String getName() {
92+
return "";
93+
}
94+
95+
@Override
96+
public OutputStream getOutputStream() throws IOException {
97+
return null;
98+
}
99+
100+
@Override
101+
public long getSize() {
102+
return 0;
103+
}
104+
105+
@Override
106+
public String getString() throws IOException {
107+
return "";
108+
}
109+
110+
@Override
111+
public String getString(Charset charset) throws IOException {
112+
return "";
113+
}
114+
115+
@Override
116+
public boolean isFormField() {
117+
return false;
118+
}
119+
120+
@Override
121+
public boolean isInMemory() {
122+
return false;
123+
}
124+
125+
@Override
126+
public FileItem setFieldName(String s) {
127+
return null;
128+
}
129+
130+
@Override
131+
public FileItem setFormField(boolean b) {
132+
return null;
133+
}
134+
135+
@Override
136+
public FileItem write(Path path) throws IOException {
137+
return null;
138+
}
139+
140+
@Override
141+
public FileItemHeaders getHeaders() {
142+
return null;
143+
}
144+
145+
@Override
146+
public FileItemHeadersProvider setHeaders(FileItemHeaders fileItemHeaders) {
147+
return null;
148+
}
149+
};
150+
}
151+
}

0 commit comments

Comments
 (0)