This is an automated email from the ASF dual-hosted git repository. tballison pushed a commit to branch TIKA-4809-stage-9 in repository https://gitbox.apache.org/repos/asf/tika.git
commit 81e06085d7e496f63e54ad7112b9f3a1f3398373 Author: tallison <[email protected]> AuthorDate: Mon Aug 10 14:01:00 2026 -0400 TIKA-4809: Remove returnStackTrace and the redaction it implied --- .../migration-to-4x/migrating-tika-server-4x.adoc | 14 +++-- .../ROOT/pages/using-tika/server/index.adoc | 34 +++++++----- .../java/org/apache/tika/utils/ExceptionUtils.java | 22 +------- .../apache/tika/server/core/TikaServerConfig.java | 8 --- .../core/TikaServerParseExceptionMapper.java | 6 +-- .../apache/tika/server/core/TikaServerProcess.java | 6 +-- .../server/core/resource/PipesParsingHelper.java | 63 +++------------------- .../tika/server/core/resource/PipesResource.java | 7 +-- .../tika/server/core/resource/TikaResource.java | 3 +- .../org/apache/tika/server/core/CXFTestBase.java | 7 +-- .../core/ConfigEndpointSecurityEnabledTest.java | 2 +- .../server/core/ConfigEndpointSecurityTest.java | 2 +- .../tika/server/core/LanguageResourceTest.java | 2 +- .../apache/tika/server/core/StackTraceTest.java | 7 +-- .../org/apache/tika/server/core/TikaPipesTest.java | 4 +- .../apache/tika/server/core/TikaResourceTest.java | 11 ++-- .../tika/server/core/TranslateResourceTest.java | 2 +- .../tika/server/standard/DetectorResourceTest.java | 2 +- .../server/standard/JsonMaxFieldLengthTest.java | 2 +- .../tika/server/standard/MetadataResourceTest.java | 2 +- .../apache/tika/server/standard/TikaPipesTest.java | 4 +- .../tika/server/standard/TikaResourceTest.java | 2 +- .../UnpackerResourceConfigDisabledTest.java | 2 +- .../tika/server/standard/UnpackerResourceTest.java | 2 +- .../standard/UnpackerResourceWithConfigTest.java | 2 +- 25 files changed, 69 insertions(+), 149 deletions(-) diff --git a/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc b/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc index 3eda1ecd1d..376789ff4c 100644 --- a/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc +++ b/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc @@ -100,8 +100,8 @@ at least a `status` field: {"status": "TIMEOUT"} ---- -When the server is configured with `returnStackTrace=true`, a `message` field is also -included (it may contain a server-side stack trace), e.g. `{"status": "TIMEOUT", "message": "Task timed out after 60000ms"}`. +A `message` field is included when one is available and may contain a server-side stack +trace, e.g. `{"status": "TIMEOUT", "message": "Task timed out after 60000ms"}`. The HTTP status codes are also more precise: @@ -132,8 +132,7 @@ xref:using-tika/server/index.adoc#_error_responses[Error Responses]): **Migration:** clients that treated any non-`200` from `/meta` as "parse failed" should check the new status codes above. Clients that inspected the response body for error text should check `tk:exception:container-exception` (full-object -endpoints) or the `422` body (`/meta/\{field}`, populated only when -`returnStackTrace=true`). +endpoints) or the `422` body (`/meta/\{field}`). Two changes to the returned metadata come with this, neither of which produces an error: @@ -172,6 +171,13 @@ The `/tika` endpoint no longer routes based on `Accept` headers. Use explicit pa The following `TikaServerConfig` options have been removed: +* `returnStackTrace` - Removed as misleading. It gated only the error-response body, while + exception detail — including messages carrying file paths and document fragments — + continued to travel in `tk:exception:*` metadata on successful parses and inside + `/unpack` zips. Setting it to `false` did not keep stack traces inside the server, which + is what the name implied. Exception detail is now always returned; filter Tika's output + with a `MetadataFilter` before forwarding it somewhere less trusted. + * `taskTimeoutMillis` - Now configured via `parse-context.timeout-limits.progressTimeoutMillis` (and optionally `totalTaskTimeoutMillis`); see xref:pipes/timeouts.adoc[Timeouts]. * `taskPulseMillis` - No longer needed * `minimumTimeoutMillis` - No longer needed diff --git a/docs/modules/ROOT/pages/using-tika/server/index.adoc b/docs/modules/ROOT/pages/using-tika/server/index.adoc index 113cdb6071..5e39c5a99b 100644 --- a/docs/modules/ROOT/pages/using-tika/server/index.adoc +++ b/docs/modules/ROOT/pages/using-tika/server/index.adoc @@ -213,9 +213,8 @@ JSON body whose shape matches the `PipesResult` status: {"status": "TIMEOUT"} ---- -The `status` field is the `PipesResult.RESULT_STATUS` enum name. By default the body -carries only the `status`. When the server is configured with `returnStackTrace=true`, -a `message` field is also included (it often contains a server-side stack trace), e.g. +The `status` field is the `PipesResult.RESULT_STATUS` enum name. A `message` field is +included when one is available, and often contains a server-side stack trace, e.g. `{"status": "TIMEOUT", "message": "Task timed out after 60000ms"}`. [cols="1,1,3"] @@ -284,13 +283,24 @@ any files already unpacked before the exception are discarded. This is a known gap, not yet addressed. |=== -By default (`returnStackTrace=false`), any exception text exposed this way is trimmed -to just the exception's class and message — not the full stack trace, which can -reveal internal file paths and library internals. For the `200 OK` family the -trimmed field is still always present when a failure occurred, so callers can detect -it either way; for the `422` family, the body carries no exception text at all unless -`returnStackTrace=true`. Set `returnStackTrace=true` to get the full trace — useful -in development, best left off in production. +[IMPORTANT] +==== +Exception detail is returned in full, and Tika does not redact it. + +Stack traces and their messages can contain the spooled file's path, the source +filename, and fragments of the document. That detail appears in `tk:exception:*` +metadata on **successful** parses as well as in error bodies — including inside the +`*.metadata.json` entries of an `/unpack` zip — so there is no single switch that keeps +it inside the server. + +A `returnStackTrace` setting previously suggested otherwise. It governed only the error +body, left the metadata untouched, and has been removed rather than left in place +implying a boundary it did not provide. + +If Tika's output is forwarded somewhere less trusted than the server itself, filter it +on the way out: configure a `MetadataFilter` to drop the fields you do not want, and +treat the whole response as potentially containing document-derived text. +==== == Configuration @@ -318,10 +328,6 @@ Server behavior beyond host/port is controlled by a JSON config file passed via |`""` (off) |`*` to allow any origin, or an explicit origin string. Empty disables CORS. -|`returnStackTrace` -|`false` -|Include parser stack traces in error responses. Useful in dev, dangerous in production (leaks internals). - |`digest` |`""` (off) |Compute a digest of the parsed bytes. Comma-separated algorithm names: `md5`, `sha1`, `sha256`, `sha384`, `sha512`. diff --git a/tika-core/src/main/java/org/apache/tika/utils/ExceptionUtils.java b/tika-core/src/main/java/org/apache/tika/utils/ExceptionUtils.java index 8f071e2569..1c8bd8dfed 100644 --- a/tika-core/src/main/java/org/apache/tika/utils/ExceptionUtils.java +++ b/tika-core/src/main/java/org/apache/tika/utils/ExceptionUtils.java @@ -21,15 +21,11 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.tika.exception.TikaException; public class ExceptionUtils { - private final static Pattern MSG_PATTERN = Pattern.compile(":[^\r\n]+"); - /** * Simple util to get stack trace. * <p> @@ -71,21 +67,5 @@ public class ExceptionUtils { return result.toString(); } - /** - * Utility method to trim the message from a stack trace - * string. - * <p> - * E.g. <code>java.lang.IllegalStateException: Potential loop detected </code> - * will be trimmed to <code>java.lang.IllegalStateException</code> - * - * @param trace string view of stack trace - * @return trimmed stack trace - */ - public static String trimMessage(String trace) { - Matcher msgMatcher = MSG_PATTERN.matcher(trace); - if (msgMatcher.find()) { - return msgMatcher.replaceFirst(""); - } - return trace; - } + } diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java index 69f30fced8..d334359007 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java @@ -70,7 +70,6 @@ private long forkedProcessShutdownMillis = DEFAULT_FORKED_PROCESS_SHUTDOWN_MILLI private boolean allowPipes = false; private boolean allowPerRequestConfig = false; private String cors = ""; - private boolean returnStackTrace = false; private String idBase = UUID .randomUUID() .toString(); @@ -268,13 +267,6 @@ private long forkedProcessShutdownMillis = DEFAULT_FORKED_PROCESS_SHUTDOWN_MILLI this.digest = digest; } - public boolean isReturnStackTrace() { - return returnStackTrace; - } - - public void setReturnStackTrace(boolean returnStackTrace) { - this.returnStackTrace = returnStackTrace; - } public TlsConfig getTlsConfig() { return tlsConfig; diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseExceptionMapper.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseExceptionMapper.java index cbf5bfbd1e..76ceac24fd 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseExceptionMapper.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseExceptionMapper.java @@ -34,10 +34,8 @@ import org.apache.tika.exception.UnsupportedFormatException; @Provider public class TikaServerParseExceptionMapper implements ExceptionMapper<TikaServerParseException> { - private final boolean returnStack; - public TikaServerParseExceptionMapper(boolean returnStack) { - this.returnStack = returnStack; + public TikaServerParseExceptionMapper() { } public Response toResponse(TikaServerParseException e) { @@ -72,7 +70,7 @@ public class TikaServerParseExceptionMapper implements ExceptionMapper<TikaServe } private Response buildResponse(Throwable cause, int i) { - if (returnStack && cause != null) { + if (cause != null) { Writer result = new StringWriter(); PrintWriter writer = new PrintWriter(result); cause.printStackTrace(writer); diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java index 93bde62770..d51586aeed 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java @@ -309,7 +309,7 @@ public class TikaServerProcess { writers.add(new JSONMessageBodyWriter()); writers.add(new TextMessageBodyWriter()); writers.addAll(loadWriterServices()); - writers.add(new TikaServerParseExceptionMapper(tikaServerConfig.isReturnStackTrace())); + writers.add(new TikaServerParseExceptionMapper()); writers.add(new JSONObjWriter()); // Add ConfigEndpointSecurityFilter to gate /config endpoints @@ -431,7 +431,7 @@ public class TikaServerProcess { // not by PipesResource. PipesParsingHelper helper = tikaResource.getPipesParsingHelper(); resourceProviders.add(new SingletonResourceProvider( - new PipesResource(helper.getPipesParser(), helper.isReturnStackTrace()))); + new PipesResource(helper.getPipesParser()))); } resourceProviders.addAll(loadResourceServices(serverStatus)); return resourceProviders; @@ -536,7 +536,7 @@ public class TikaServerProcess { // Create and return the helper PipesParsingHelper helper = new PipesParsingHelper(pipesParser, pipesConfig, - inputTempDirectory, unpackTempDirectory, tikaServerConfig.isReturnStackTrace()); + inputTempDirectory, unpackTempDirectory); // Register shutdown hook to clean up PipesParser and temp directories final Path inputDirToClean = inputTempDirectory; diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java index 2d87de0605..0b61676b14 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java @@ -34,7 +34,6 @@ import org.slf4j.LoggerFactory; import org.apache.tika.io.TikaInputStream; import org.apache.tika.metadata.Metadata; -import org.apache.tika.metadata.Property; import org.apache.tika.metadata.TikaCoreProperties; import org.apache.tika.parser.ParseContext; import org.apache.tika.pipes.api.FetchEmitTuple; @@ -73,7 +72,6 @@ public class PipesParsingHelper { private final PipesConfig pipesConfig; private final Path inputTempDirectory; private final Path unpackEmitterBasePath; - private final boolean returnStackTrace; /** * Creates a PipesParsingHelper. @@ -85,19 +83,13 @@ public class PipesParsingHelper { * @param unpackEmitterBasePath the basePath where the unpack-emitter writes files. * This is where the server will find the zip files created * by UNPACK mode. May be null if UNPACK mode won't be used. - * @param returnStackTrace whether failure responses may include the (potentially - * stack-trace-bearing) {@code PipesResult} message. When false - * (the default), error bodies carry only the status. Mirrors - * {@code TikaServerConfig.isReturnStackTrace()}. */ public PipesParsingHelper(PipesParser pipesParser, PipesConfig pipesConfig, - Path inputTempDirectory, Path unpackEmitterBasePath, - boolean returnStackTrace) { + Path inputTempDirectory, Path unpackEmitterBasePath) { this.pipesParser = pipesParser; this.pipesConfig = pipesConfig; this.inputTempDirectory = inputTempDirectory; this.unpackEmitterBasePath = unpackEmitterBasePath; - this.returnStackTrace = returnStackTrace; if (inputTempDirectory == null || !Files.isDirectory(inputTempDirectory)) { throw new IllegalArgumentException( @@ -170,7 +162,6 @@ public class PipesParsingHelper { // Process result List<Metadata> metadataList = processResult(result); - redactExceptionDetail(metadataList); return metadataList; } catch (InterruptedException e) { @@ -209,9 +200,9 @@ public class PipesParsingHelper { * Builds a JSON error response carrying a subset of the {@code PipesResult} * serialization. By default the body is just {@code {"status": "TIMEOUT"}}. The * {@code PipesResult} message frequently contains a server-side stack trace - * (e.g. for {@code *_EXCEPTION} statuses), so the {@code message} field is included - * only when {@code returnStackTrace} is enabled — matching the legacy - * {@code TikaServerParseExceptionMapper}, which gates stack traces the same way. + * (e.g. for {@code *_EXCEPTION} statuses) and is included: exception detail already + * travels in {@code tk:exception:*} metadata on successful parses, so withholding it + * here bought nothing while implying a confidentiality boundary that did not exist. * Successful-parse fields such as {@code emitData} are never part of an error body. * <p> * This allows clients to distinguish failure modes (TIMEOUT, OOM, UNSPECIFIED_CRASH, …) @@ -221,7 +212,7 @@ public class PipesParsingHelper { ObjectMapper mapper = new ObjectMapper(); ObjectNode node = mapper.createObjectNode(); node.put("status", result.status().name()); - if (returnStackTrace && result.message() != null && !result.message().isBlank()) { + if (result.message() != null && !result.message().isBlank()) { node.put("message", result.message()); } String json; @@ -284,39 +275,6 @@ public class PipesParsingHelper { return Collections.emptyList(); } - /** - * Trims CONTAINER_EXCEPTION/EMBEDDED_EXCEPTION to one line unless returnStackTrace is - * on -- unlike buildProcessFailureResponse's family, a 200 response has no other way - * to signal a per-document exception, so we can't omit these fields entirely. - */ - private void redactExceptionDetail(List<Metadata> metadataList) { - if (returnStackTrace || metadataList == null) { - return; - } - for (Metadata m : metadataList) { - summarizeInPlace(m, TikaCoreProperties.CONTAINER_EXCEPTION); - summarizeInPlace(m, TikaCoreProperties.EMBEDDED_EXCEPTION); - } - } - - private static void summarizeInPlace(Metadata m, Property property) { - String full = m.get(property); - if (full != null) { - m.set(property, summarizeStackTrace(full, false)); - } - } - - /** - * First line of a stack trace (the caught exception's own class + message); no-op if - * returnStackTrace. - */ - public static String summarizeStackTrace(String fullTrace, boolean returnStackTrace) { - if (returnStackTrace || fullTrace == null || fullTrace.isBlank()) { - return fullTrace; - } - int newline = fullTrace.indexOf('\n'); - return newline < 0 ? fullTrace : fullTrace.substring(0, newline); - } /** * Maps PipesResult status to HTTP response status. @@ -351,13 +309,6 @@ public class PipesParsingHelper { return pipesParser; } - /** - * Whether failure responses may include the (potentially stack-trace-bearing) - * {@code PipesResult} message. Mirrors {@code TikaServerConfig.isReturnStackTrace()}. - */ - public boolean isReturnStackTrace() { - return returnStackTrace; - } /** * Gets the PipesConfig instance. @@ -487,10 +438,8 @@ public class PipesParsingHelper { Metadata containerMetadata = metadataList.get(0); String containerException = containerMetadata.get(TikaCoreProperties.CONTAINER_EXCEPTION); if (containerException != null) { - // 422 already signals failure, so (unlike redactExceptionDetail's - // 200 family) the body can be omitted entirely when off. Response response = Response.status(422) - .entity(returnStackTrace ? containerException : "") + .entity(containerException) .type("text/plain") .build(); throw new WebApplicationException(response); diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java index 6b7eb9fccd..09956bbf5e 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java @@ -52,18 +52,15 @@ public class PipesResource { private static final Logger LOG = LoggerFactory.getLogger(PipesResource.class); private final PipesParser pipesParser; - private final boolean returnStackTrace; /** * @param pipesParser shared parser, also used by /tika, /rmeta, and /unpack. * Lifecycle (construction, shutdown) is owned by whoever * built it, not by this class. - * @param returnStackTrace whether parse_exception may include the full stack trace * vs. just the first line. */ - public PipesResource(PipesParser pipesParser, boolean returnStackTrace) { + public PipesResource(PipesParser pipesParser) { this.pipesParser = pipesParser; - this.returnStackTrace = returnStackTrace; } @@ -135,7 +132,7 @@ public class PipesResource { Map<String, String> statusMap = new HashMap<>(); statusMap.put("status", "ok"); // 200 response, so trim rather than omit -- same reasoning as redactExceptionDetail. - statusMap.put("parse_exception", PipesParsingHelper.summarizeStackTrace(msg, returnStackTrace)); + statusMap.put("parse_exception", msg); statusMap.put("emitted", Boolean.toString(emitted)); return statusMap; } diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java index 5ac7fe1b4b..17a0110ad1 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java @@ -815,8 +815,7 @@ public class TikaResource { } } // No separate field for the exception here, unlike JSON bodies -- append it, - // gated by returnStackTrace like TikaServerParseExceptionMapper. - if (hasException && pipesParsingHelper != null && pipesParsingHelper.isReturnStackTrace()) { + if (hasException) { content = content.isEmpty() ? exceptionMessage : content + "\n" + exceptionMessage; } final String finalContent = content; diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java index ed557ad8cb..1761be32ef 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java @@ -215,7 +215,7 @@ public abstract class CXFTestBase { pipesConfig.setEmitStrategy(new EmitStrategyConfig(EmitStrategy.PASSBACK_ALL)); this.pipesParser = PipesParser.load(tikaJsonConfig, pipesConfig, this.pipesConfigPath); PipesParsingHelper pipesParsingHelper = new PipesParsingHelper(this.pipesParser, pipesConfig, - inputTempDirectory, getUnpackEmitterBasePath(), isReturnStackTrace()); + inputTempDirectory, getUnpackEmitterBasePath()); tikaResource = new TikaResource(tika, new ServerStatus(), pipesParsingHelper, isAllowPerRequestConfig()); } finally { @@ -378,12 +378,9 @@ public abstract class CXFTestBase { } /** - * Mirrors TikaServerConfig.isReturnStackTrace(); defaults to false (production + * Mirrors TikaServerConfig.; defaults to false (production * default). Override in tests that exercise exception-detail visibility. */ - protected boolean isReturnStackTrace() { - return false; - } protected InputStream getPipesConfigInputStream() throws IOException { if (getPipesInputPath() == null) { diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java index 03a048450f..5897fdf9a7 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java @@ -53,7 +53,7 @@ public class ConfigEndpointSecurityEnabledTest extends CXFTestBase { @Override protected void setUpProviders(JAXRSServerFactoryBean sf) { List<Object> providers = new ArrayList<>(); - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); providers.add(new JSONMessageBodyWriter()); // Add security filter with allowPerRequestConfig=true providers.add(new ConfigEndpointSecurityFilter(true)); diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java index 03b45bedb5..dd9d319a51 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java @@ -54,7 +54,7 @@ public class ConfigEndpointSecurityTest extends CXFTestBase { @Override protected void setUpProviders(JAXRSServerFactoryBean sf) { List<Object> providers = new ArrayList<>(); - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); providers.add(new JSONMessageBodyWriter()); // Add security filter with allowPerRequestConfig=false providers.add(new ConfigEndpointSecurityFilter(false)); diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/LanguageResourceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/LanguageResourceTest.java index a700d20c13..d3f1e30dca 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/LanguageResourceTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/LanguageResourceTest.java @@ -53,7 +53,7 @@ public class LanguageResourceTest extends CXFTestBase { List<Object> providers = new ArrayList<>(); providers.add(new TarWriter()); providers.add(new ZipWriter()); - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); sf.setProviders(providers); } diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java index 752a8af690..c89c60e801 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java @@ -67,11 +67,6 @@ public class StackTraceTest extends CXFTestBase { @TempDir private static Path unpackTempDir; - @Override - protected boolean isReturnStackTrace() { - // Matches this class's own TikaServerParseExceptionMapper(true) below. - return true; - } @Override protected void setUpResources(JAXRSServerFactoryBean sf) { @@ -87,7 +82,7 @@ public class StackTraceTest extends CXFTestBase { @Override protected void setUpProviders(JAXRSServerFactoryBean sf) { List<Object> providers = new ArrayList<>(); - providers.add(new TikaServerParseExceptionMapper(true)); + providers.add(new TikaServerParseExceptionMapper()); providers.add(new JSONMessageBodyWriter()); providers.add(new CSVMessageBodyWriter()); //providers.add(new XMPMessageBodyWriter()); diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java index d43abc4c43..852916636c 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java @@ -153,7 +153,7 @@ public class TikaPipesTest extends CXFTestBase { PipesConfig pipesConfig = PipesConfig.load(tikaJsonConfig); pipesConfig.setEmitStrategy(new EmitStrategyConfig(EmitStrategy.EMIT_ALL)); pipesParser = PipesParser.load(tikaJsonConfig, pipesConfig, tikaConfigPath); - pipesResource = new PipesResource(pipesParser, false); + pipesResource = new PipesResource(pipesParser); rCoreProviders.add(new SingletonResourceProvider(pipesResource)); } catch (IOException | TikaConfigException e) { throw new RuntimeException(e); @@ -164,7 +164,7 @@ public class TikaPipesTest extends CXFTestBase { @Override protected void setUpProviders(JAXRSServerFactoryBean sf) { List<Object> providers = new ArrayList<>(); - providers.add(new TikaServerParseExceptionMapper(true)); + providers.add(new TikaServerParseExceptionMapper()); providers.add(new JSONObjWriter()); sf.setProviders(providers); } diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java index c0f01e0863..94eb1bf756 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java @@ -55,7 +55,7 @@ public class TikaResourceTest extends CXFTestBase { @Override protected void setUpProviders(JAXRSServerFactoryBean sf) { List<Object> providers = new ArrayList<>(); - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); providers.add(new JSONMessageBodyWriter()); sf.setProviders(providers); } @@ -109,11 +109,12 @@ public class TikaResourceTest extends CXFTestBase { assertEquals("Nikolai Lobachevsky", metadata.get("author")); assertEquals("application/mock+xml", metadata.get(Metadata.CONTENT_TYPE)); assertContains("some content", metadata.get(TikaCoreProperties.TIKA_CONTENT)); - // returnStackTrace defaults to false here, so CONTAINER_EXCEPTION is trimmed to - // the caught exception's own class + message -- the NPE detail underneath it is - // intentionally not exposed by default. + // Exception detail is reported in full. Tika does not redact it: any scheme that + // strips the message has to parse the rendered trace, and it would in any case be + // undone by the same detail travelling in tk:exception:* on other responses. Filter + // metadata before forwarding it somewhere less trusted. assertContains("TikaException", metadata.get(TikaCoreProperties.CONTAINER_EXCEPTION)); - assertNotFound("null pointer message", metadata.get(TikaCoreProperties.CONTAINER_EXCEPTION)); + assertContains("null pointer message", metadata.get(TikaCoreProperties.CONTAINER_EXCEPTION)); } @Test diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java index d79c57a937..ec7316525b 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java @@ -54,7 +54,7 @@ public class TranslateResourceTest extends CXFTestBase { List<Object> providers = new ArrayList<>(); providers.add(new TarWriter()); providers.add(new ZipWriter()); - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); sf.setProviders(providers); } diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java index cf2ebc0a1f..6ba7d2ab1b 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java @@ -55,7 +55,7 @@ public class DetectorResourceTest extends CXFTestBase { List<Object> providers = new ArrayList<>(); providers.add(new TarWriter()); providers.add(new ZipWriter()); - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); sf.setProviders(providers); } diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java index 4e2af3c6c5..b5274d2813 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java @@ -55,7 +55,7 @@ public class JsonMaxFieldLengthTest extends CXFTestBase { @Override protected void setUpProviders(JAXRSServerFactoryBean sf) { List<Object> providers = new ArrayList<>(); - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); providers.add(new JSONMessageBodyWriter()); sf.setProviders(providers); } diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java index e548f9d5c6..d099e9ea3a 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java @@ -75,7 +75,7 @@ public class MetadataResourceTest extends CXFTestBase { protected void setUpProviders(JAXRSServerFactoryBean sf) { List<Object> providers = new ArrayList<>(); // Needed by getMetadataField's TikaServerParseException throw. - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); providers.add(new JSONMessageBodyWriter()); providers.add(new CSVMessageBodyWriter()); providers.add(new XMPMessageBodyWriter()); diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java index 08844f84df..f8eb51fe27 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java @@ -145,7 +145,7 @@ public class TikaPipesTest extends CXFTestBase { PipesConfig pipesConfig = PipesConfig.load(tikaJsonConfig); pipesConfig.setEmitStrategy(new EmitStrategyConfig(EmitStrategy.EMIT_ALL)); pipesParser = PipesParser.load(tikaJsonConfig, pipesConfig, tikaConfigPath); - pipesResource = new PipesResource(pipesParser, false); + pipesResource = new PipesResource(pipesParser); rCoreProviders.add(new SingletonResourceProvider(pipesResource)); } catch (IOException | TikaConfigException e) { throw new RuntimeException(e); @@ -170,7 +170,7 @@ public class TikaPipesTest extends CXFTestBase { @Override protected void setUpProviders(JAXRSServerFactoryBean sf) { List<Object> providers = new ArrayList<>(); - providers.add(new TikaServerParseExceptionMapper(true)); + providers.add(new TikaServerParseExceptionMapper()); providers.add(new JSONObjWriter()); sf.setProviders(providers); } diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java index fce1711635..6229bb07c1 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java @@ -80,7 +80,7 @@ public class TikaResourceTest extends CXFTestBase { @Override protected void setUpProviders(JAXRSServerFactoryBean sf) { List<Object> providers = new ArrayList<>(); - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); providers.add(new JSONMessageBodyWriter()); sf.setProviders(providers); } diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java index 59e13a302e..93a00cf01a 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java @@ -66,7 +66,7 @@ public class UnpackerResourceConfigDisabledTest extends CXFTestBase { List<Object> providers = new ArrayList<>(); providers.add(new TarWriter()); providers.add(new ZipWriter()); - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); sf.setProviders(providers); } diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java index 2620d84465..1ae4bb0592 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java @@ -113,7 +113,7 @@ public class UnpackerResourceTest extends CXFTestBase { protected void setUpProviders(JAXRSServerFactoryBean sf) { List<Object> providers = new ArrayList<>(); providers.add(new ZipWriter()); - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); sf.setProviders(providers); } diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java index 92e28a6730..9d8b5ed59a 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java @@ -88,7 +88,7 @@ public class UnpackerResourceWithConfigTest extends CXFTestBase { List<Object> providers = new ArrayList<>(); providers.add(new TarWriter()); providers.add(new ZipWriter()); - providers.add(new TikaServerParseExceptionMapper(false)); + providers.add(new TikaServerParseExceptionMapper()); sf.setProviders(providers); }
