184 lines
6.3 KiB
Java
184 lines
6.3 KiB
Java
|
|
// This file is auto-generated by alef — DO NOT EDIT.
|
||
|
|
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
|
||
|
|
// To regenerate: alef generate
|
||
|
|
// To verify freshness: alef verify --exit-code
|
||
|
|
// Issues & docs: https://github.com/kreuzberg-dev/alef
|
||
|
|
package dev.kreuzberg;
|
||
|
|
|
||
|
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||
|
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||
|
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||
|
|
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Configuration for security limits across extractors.
|
||
|
|
*
|
||
|
|
* All limits are intentionally conservative to prevent DoS attacks
|
||
|
|
* while still supporting legitimate documents.
|
||
|
|
*/
|
||
|
|
@JsonInclude(JsonInclude.Include.NON_ABSENT)
|
||
|
|
@JsonDeserialize(builder = SecurityLimits.Builder.class)
|
||
|
|
public record SecurityLimits(
|
||
|
|
/**
|
||
|
|
* Maximum uncompressed size for archives (500 MB)
|
||
|
|
*/
|
||
|
|
@JsonProperty("max_archive_size") long maxArchiveSize,
|
||
|
|
/**
|
||
|
|
* Maximum compression ratio before flagging as potential bomb (100:1)
|
||
|
|
*/
|
||
|
|
@JsonProperty("max_compression_ratio") long maxCompressionRatio,
|
||
|
|
/**
|
||
|
|
* Maximum number of files in archive (10,000)
|
||
|
|
*/
|
||
|
|
@JsonProperty("max_files_in_archive") long maxFilesInArchive,
|
||
|
|
/**
|
||
|
|
* Maximum nesting depth for structures (100)
|
||
|
|
*/
|
||
|
|
@JsonProperty("max_nesting_depth") long maxNestingDepth,
|
||
|
|
/**
|
||
|
|
* Maximum length of any single XML entity / attribute / token (1 MiB).
|
||
|
|
* This is a per-token cap, NOT a total cap — billion-laughs class
|
||
|
|
* attacks where a single entity expands to hundreds of MB are caught
|
||
|
|
* here, while normal long text content (a paragraph, a CDATA block) is
|
||
|
|
* caught by {@code max_content_size} instead.
|
||
|
|
*/
|
||
|
|
@JsonProperty("max_entity_length") long maxEntityLength,
|
||
|
|
/**
|
||
|
|
* Maximum string growth per document (100 MB)
|
||
|
|
*/
|
||
|
|
@JsonProperty("max_content_size") long maxContentSize,
|
||
|
|
/**
|
||
|
|
* Maximum iterations per operation
|
||
|
|
*/
|
||
|
|
@JsonProperty("max_iterations") long maxIterations,
|
||
|
|
/**
|
||
|
|
* Maximum XML depth (100 levels)
|
||
|
|
*/
|
||
|
|
@JsonProperty("max_xml_depth") long maxXmlDepth,
|
||
|
|
/**
|
||
|
|
* Maximum cells per table (100,000)
|
||
|
|
*/
|
||
|
|
@JsonProperty("max_table_cells") long maxTableCells
|
||
|
|
) {
|
||
|
|
public static Builder builder() {
|
||
|
|
return new Builder();
|
||
|
|
}
|
||
|
|
public SecurityLimits{
|
||
|
|
if (maxArchiveSize == 0) maxArchiveSize = 524288000;
|
||
|
|
if (maxCompressionRatio == 0) maxCompressionRatio = 100;
|
||
|
|
if (maxFilesInArchive == 0) maxFilesInArchive = 10000;
|
||
|
|
if (maxNestingDepth == 0) maxNestingDepth = 1024;
|
||
|
|
if (maxEntityLength == 0) maxEntityLength = 1048576;
|
||
|
|
if (maxContentSize == 0) maxContentSize = 104857600;
|
||
|
|
if (maxIterations == 0) maxIterations = 10000000;
|
||
|
|
if (maxXmlDepth == 0) maxXmlDepth = 1024;
|
||
|
|
if (maxTableCells == 0) maxTableCells = 100000;
|
||
|
|
}
|
||
|
|
|
||
|
|
// CPD-OFF
|
||
|
|
@JsonPOJOBuilder(withPrefix = "with", buildMethodName = "build")
|
||
|
|
public static final class Builder {
|
||
|
|
|
||
|
|
@JsonProperty("max_archive_size")
|
||
|
|
private long maxArchiveSize = 0;
|
||
|
|
@JsonProperty("max_compression_ratio")
|
||
|
|
private long maxCompressionRatio = 0;
|
||
|
|
@JsonProperty("max_files_in_archive")
|
||
|
|
private long maxFilesInArchive = 0;
|
||
|
|
@JsonProperty("max_nesting_depth")
|
||
|
|
private long maxNestingDepth = 0;
|
||
|
|
@JsonProperty("max_entity_length")
|
||
|
|
private long maxEntityLength = 0;
|
||
|
|
@JsonProperty("max_content_size")
|
||
|
|
private long maxContentSize = 0;
|
||
|
|
@JsonProperty("max_iterations")
|
||
|
|
private long maxIterations = 0;
|
||
|
|
@JsonProperty("max_xml_depth")
|
||
|
|
private long maxXmlDepth = 0;
|
||
|
|
@JsonProperty("max_table_cells")
|
||
|
|
private long maxTableCells = 0;
|
||
|
|
|
||
|
|
/** Sets the maxArchiveSize field. */
|
||
|
|
@JsonProperty("max_archive_size")
|
||
|
|
public Builder withMaxArchiveSize(final long value) {
|
||
|
|
this.maxArchiveSize = value;
|
||
|
|
return this;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Sets the maxCompressionRatio field. */
|
||
|
|
@JsonProperty("max_compression_ratio")
|
||
|
|
public Builder withMaxCompressionRatio(final long value) {
|
||
|
|
this.maxCompressionRatio = value;
|
||
|
|
return this;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Sets the maxFilesInArchive field. */
|
||
|
|
@JsonProperty("max_files_in_archive")
|
||
|
|
public Builder withMaxFilesInArchive(final long value) {
|
||
|
|
this.maxFilesInArchive = value;
|
||
|
|
return this;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Sets the maxNestingDepth field. */
|
||
|
|
@JsonProperty("max_nesting_depth")
|
||
|
|
public Builder withMaxNestingDepth(final long value) {
|
||
|
|
this.maxNestingDepth = value;
|
||
|
|
return this;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Sets the maxEntityLength field. */
|
||
|
|
@JsonProperty("max_entity_length")
|
||
|
|
public Builder withMaxEntityLength(final long value) {
|
||
|
|
this.maxEntityLength = value;
|
||
|
|
return this;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Sets the maxContentSize field. */
|
||
|
|
@JsonProperty("max_content_size")
|
||
|
|
public Builder withMaxContentSize(final long value) {
|
||
|
|
this.maxContentSize = value;
|
||
|
|
return this;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Sets the maxIterations field. */
|
||
|
|
@JsonProperty("max_iterations")
|
||
|
|
public Builder withMaxIterations(final long value) {
|
||
|
|
this.maxIterations = value;
|
||
|
|
return this;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Sets the maxXmlDepth field. */
|
||
|
|
@JsonProperty("max_xml_depth")
|
||
|
|
public Builder withMaxXmlDepth(final long value) {
|
||
|
|
this.maxXmlDepth = value;
|
||
|
|
return this;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Sets the maxTableCells field. */
|
||
|
|
@JsonProperty("max_table_cells")
|
||
|
|
public Builder withMaxTableCells(final long value) {
|
||
|
|
this.maxTableCells = value;
|
||
|
|
return this;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Builds the SecurityLimits instance. */
|
||
|
|
public SecurityLimits build() {
|
||
|
|
return new SecurityLimits(
|
||
|
|
maxArchiveSize,
|
||
|
|
maxCompressionRatio,
|
||
|
|
maxFilesInArchive,
|
||
|
|
maxNestingDepth,
|
||
|
|
maxEntityLength,
|
||
|
|
maxContentSize,
|
||
|
|
maxIterations,
|
||
|
|
maxXmlDepth,
|
||
|
|
maxTableCells
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// CPD-ON
|
||
|
|
public static SecurityLimits defaultInstance() {
|
||
|
|
throw new UnsupportedOperationException("defaultInstance is not yet bridged via JNI; use the Builder instead.");
|
||
|
|
}
|
||
|
|
}
|