Skip to content

Commit 4146fd8

Browse files
authored
Properly validate MAX_CONTENT_SIZE when publishing extensions (#1458)
* Properly validate MAX_CONTENT_SIZE when publishing extensions * make maxContentSize configurable
1 parent 1a7a735 commit 4146fd8

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

server/src/main/java/org/eclipse/openvsx/ExtensionService.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
********************************************************************************/
1010
package org.eclipse.openvsx;
1111

12+
import com.google.common.io.ByteStreams;
1213
import jakarta.persistence.EntityManager;
1314
import jakarta.transaction.Transactional;
1415
import jakarta.transaction.Transactional.TxType;
16+
import org.apache.commons.io.FileUtils;
1517
import org.apache.commons.lang3.StringUtils;
1618
import org.eclipse.openvsx.admin.RemoveFileJobRequest;
1719
import org.eclipse.openvsx.cache.CacheService;
@@ -57,6 +59,9 @@ public class ExtensionService {
5759
@Value("${ovsx.publishing.require-license:false}")
5860
boolean requireLicense;
5961

62+
@Value("${ovsx.publishing.max-content-size:" + MAX_CONTENT_SIZE + "}")
63+
int maxContentSize;
64+
6065
public ExtensionService(
6166
EntityManager entityManager,
6267
RepositoryService repositories,
@@ -107,17 +112,19 @@ private void doPublish(TempFile extensionFile, String binaryName, PersonalAccess
107112
}
108113

109114
private TempFile createExtensionFile(InputStream content) {
110-
try (var input = new BufferedInputStream(content)) {
111-
input.mark(0);
112-
var skipped = input.skip(MAX_CONTENT_SIZE + 1);
113-
if (skipped > MAX_CONTENT_SIZE) {
114-
throw new ErrorResultException("The extension package exceeds the size limit of 512 MB.", HttpStatus.PAYLOAD_TOO_LARGE);
115-
}
116-
115+
try (var input = ByteStreams.limit(new BufferedInputStream(content), maxContentSize + 1)) {
116+
long size;
117117
var extensionFile = new TempFile("extension_", ".vsix");
118118
try(var out = Files.newOutputStream(extensionFile.getPath())) {
119-
input.reset();
120-
input.transferTo(out);
119+
size = input.transferTo(out);
120+
}
121+
122+
if (size > maxContentSize) {
123+
try {
124+
extensionFile.close();
125+
} catch (IOException _) {}
126+
var maxSize = FileUtils.byteCountToDisplaySize(maxContentSize);
127+
throw new ErrorResultException("The extension package exceeds the size limit of " + maxSize + ".", HttpStatus.PAYLOAD_TOO_LARGE);
121128
}
122129

123130
return extensionFile;

0 commit comments

Comments
 (0)