This commit is contained in:
183
packages/java/dev/kreuzberg/SecurityLimits.java
generated
Normal file
183
packages/java/dev/kreuzberg/SecurityLimits.java
generated
Normal file
@@ -0,0 +1,183 @@
|
||||
// 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.");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user