You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2026/08/12 15:47:56 UTC
(tika) 01/24: TIKA-4809: Remove returnStackTrace and the redaction it implied
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 <ta...@apache.org>
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);
}