This is an automated email from the ASF dual-hosted git repository.
tballison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/main by this push:
new 0eca67e1f6 Revert "TIKA-1997 -- pkcs detection"
0eca67e1f6 is described below
commit 0eca67e1f6ea59a0b2bde7df000de2f65f91896a
Author: tallison <[email protected]>
AuthorDate: Tue Jul 14 15:08:37 2026 -0400
Revert "TIKA-1997 -- pkcs detection"
This reverts commit ffd488e9e59e4fa90a9f79e7ba0443a2476d4ed9.
---
CHANGES.txt | 9 --
docs/modules/ROOT/examples/detector-pkcs7.json | 6 -
.../ROOT/pages/configuration/detectors.adoc | 57 --------
docs/modules/ROOT/pages/configuration/index.adoc | 1 -
.../org/apache/tika/mime/tika-mimetypes.xml | 25 +---
.../org/apache/tika/config/ConfigExamplesTest.java | 30 -----
.../java/org/apache/tika/mime/TestMimeTypes.java | 7 +-
.../tika/parser/crypto/Pkcs7EndToEndTest.java | 65 ----------
.../resources/config-examples/detector-pkcs7.json | 6 -
.../src/test/resources/test-documents/test.xml.p7m | Bin 2504 -> 0 bytes
.../testPKCS7_compressed_def_long.p7z | Bin 331 -> 0 bytes
.../test-documents/testPKCS7_signed_data_def.p7m | Bin 1574 -> 0 bytes
.../apache/tika/detect/crypto/Pkcs7Detector.java | 50 -------
.../apache/tika/parser/crypto/CmsClassifier.java | 143 ---------------------
.../org/apache/tika/parser/crypto/Pkcs7Parser.java | 77 +++--------
.../tika/detect/crypto/Pkcs7DetectorTest.java | 59 ---------
.../tika/parser/crypto/CmsClassifierTest.java | 62 ---------
.../tika/parser/crypto/Pkcs7DetectionTest.java | 54 --------
.../apache/tika/parser/crypto/Pkcs7ParserTest.java | 58 +++------
.../src/test/resources/test-documents/test.xml.p7m | Bin 2504 -> 0 bytes
.../test-documents/testPKCS7_certs_only_def.p7c | Bin 2972 -> 0 bytes
.../test-documents/testPKCS7_certs_only_ind.p7c | Bin 2976 -> 0 bytes
.../testPKCS7_compressed_def_long.p7z | Bin 331 -> 0 bytes
.../testPKCS7_compressed_def_short.p7z | Bin 125 -> 0 bytes
.../test-documents/testPKCS7_compressed_ind.p7z | Bin 141 -> 0 bytes
.../test-documents/testPKCS7_enveloped_def.p7m | Bin 350 -> 0 bytes
.../test-documents/testPKCS7_enveloped_ind.p7m | Bin 356 -> 0 bytes
.../test-documents/testPKCS7_signature_def.p7s | Bin 1566 -> 0 bytes
.../test-documents/testPKCS7_signature_ind.p7s | Bin 1568 -> 0 bytes
.../test-documents/testPKCS7_signed_data_def.p7m | Bin 1574 -> 0 bytes
.../test-documents/testPKCS7_signed_data_def.pem | 35 -----
.../test-documents/testPKCS7_signed_data_ind.p7m | Bin 1582 -> 0 bytes
.../resources/test-documents/testRSAKEYandCERT.p12 | Bin 1717 -> 0 bytes
33 files changed, 38 insertions(+), 706 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index 7fe618fb7e..92606e27fd 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,12 +1,3 @@
-Release 4.0.0 - ???
-
- NEW FEATURES
-
- * Content-based detection of ASN.1/DER crypto containers at parse time. An
- opt-in Pkcs7Detector surfaces the subtype at detect() time,
- but must be enabled via configuration (TIKA-1997).
-
-
Release 4.0.0-beta-1 - 6/29/2026
BREAKING CHANGES
diff --git a/docs/modules/ROOT/examples/detector-pkcs7.json
b/docs/modules/ROOT/examples/detector-pkcs7.json
deleted file mode 100644
index c4d7c5c9b8..0000000000
--- a/docs/modules/ROOT/examples/detector-pkcs7.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "detectors": [
- { "pkcs-7-detector": {} },
- { "default-detector": {} }
- ]
-}
diff --git a/docs/modules/ROOT/pages/configuration/detectors.adoc
b/docs/modules/ROOT/pages/configuration/detectors.adoc
deleted file mode 100644
index 1ef2e1c058..0000000000
--- a/docs/modules/ROOT/pages/configuration/detectors.adoc
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements. See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-= Detector Configuration
-
-A `detectors` list loads *only* the detectors it names — every other detector
is dropped.
-To add a detector while keeping the default detection chain, include a
`default-detector`
-entry (the same pattern as `default-parser`; see
xref:configuration/index.adoc[Configuration]).
-
-== Enabling the PKCS7/CMS detector
-
-Content detection of ASN.1/DER cryptographic containers is *coarse by
default*: a CMS/PKCS7
-message is detected as `application/pkcs7-signature`, and the exact CMS subtype
-(signed vs. enveloped vs. certs-only) is refined by `Pkcs7Parser` at *parse*
time — it is set
-on the output content type, the same way `PDFParser` refines a PDF to
`application/illustrator`.
-
-If you need that subtype from `Tika.detect()` *without* parsing, enable the
opt-in
-`pkcs-7-detector`. It is not loaded by default (so the common detect path
stays cheap and does
-no ASN.1 work on every stream); add it ahead of `default-detector`:
-
-[source,json]
-----
-include::example$detector-pkcs7.json[]
-----
-icon:github[]
https://github.com/apache/tika/blob/main/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/config-examples/detector-pkcs7.json[View
source on GitHub]
-
-[IMPORTANT]
-====
-List `pkcs-7-detector` *before* `default-detector`. It returns a parameterized
-`application/pkcs7-mime; smime-type=...`, which is a *sibling* of the magic
detector's
-`application/pkcs7-signature` (neither is a specialization of the other). A
`CompositeDetector`
-replaces the running type only with a strict specialization, so of two sibling
results it keeps
-the first — the opt-in detector must run first to win.
-====
-
-With this configuration, `Tika.detect()` on a signed CMS message returns
-`application/pkcs7-mime; smime-type=signed-data` instead of the coarse
-`application/pkcs7-signature`. This is verified end-to-end in
-link:https://github.com/apache/tika/blob/main/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/config/ConfigExamplesTest.java[`ConfigExamplesTest`].
-
-NOTE: The default (magic-only) path already detects the crypto *families* —
PKCS7/CMS,
-RFC 5544 timestamped-data, and PKCS12 — so most users do not need this
detector. Enable it only
-when a routing or downstream decision depends on the CMS subtype before
parsing.
diff --git a/docs/modules/ROOT/pages/configuration/index.adoc
b/docs/modules/ROOT/pages/configuration/index.adoc
index afd6f35fd7..19bcbe165f 100644
--- a/docs/modules/ROOT/pages/configuration/index.adoc
+++ b/docs/modules/ROOT/pages/configuration/index.adoc
@@ -131,7 +131,6 @@ JSON uses the backslash as an escape character, so path
options (e.g. `tesseract
=== Other Configuration
-* xref:configuration/detectors.adoc[Detectors] — Configuring content (MIME)
detection, incl. the opt-in PKCS7/CMS detector
* xref:configuration/digesters.adoc[Digesters] — Computing cryptographic
hashes of documents
* xref:configuration/encoding-detectors.adoc[Encoding Detectors] — Configuring
charset/encoding detection
diff --git
a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
index a992928769..34b9d27943 100644
--- a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
+++ b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
@@ -893,15 +893,6 @@
<mime-type type="application/pkcs7-mime">
<glob pattern="*.p7m"/>
<glob pattern="*.p7c"/>
- <!-- CMS content types in the 1.2.840.113549.1.9.16.1.* arc
(compressedData .9, authData .2,
- authEnvelopedData .23, ...) with the final OID byte masked.
timestamped-data (.31) has the
- same shape but its own higher-priority magic below. The .7 arc
(signed/enveloped/...) is
- matched by the pkcs7-signature block. Pkcs7Parser refines all of
these to the smime-type. -->
- <magic priority="50">
- <match value="0x30" offset="0">
- <match value="0x060B2A864886F70D0109100100"
mask="0xFFFFFFFFFFFFFFFFFFFFFFFF00" type="string" offset="2:6"/>
- </match>
- </magic>
</mime-type>
<mime-type type="application/pkcs7-signature">
@@ -935,13 +926,8 @@
<mime-type type="application/timestamped-data">
<glob pattern="*.tsd"/>
- <!-- CMS ContentInfo whose contentType is id-ct-timestampedData
(1.2.840.113549.1.9.16.1.31),
- matching the full OID across the DER SEQUENCE length forms (short +
1..4-byte long).
- Higher priority than the masked pkcs7-mime .9.16.1.* magic so this
exact OID wins. -->
- <magic priority="60">
- <match value="0x30" offset="0">
- <match value="0x060B2A864886F70D010910011F" type="string"
offset="2:6"/>
- </match>
+ <magic priority="50">
+ <match value="0x3080060B2A864886F7" type="string" offset="0"/>
</magic>
</mime-type>
@@ -4881,13 +4867,6 @@
<mime-type type="application/x-pkcs12">
<glob pattern="*.p12"/>
<glob pattern="*.pfx"/>
- <!-- PFX ::= SEQUENCE { version INTEGER (v3), authSafe ContentInfo
SEQUENCE, ... }: the
- INTEGER 3 then a SEQUENCE (02 01 03 30) tells it apart from CMS (OID
next) and keys. -->
- <magic priority="50">
- <match value="0x30" offset="0">
- <match value="0x02010330" offset="2:6"/>
- </match>
- </magic>
</mime-type>
<mime-type type="application/x-pkcs7-certificates">
<glob pattern="*.p7b"/>
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/config/ConfigExamplesTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/config/ConfigExamplesTest.java
index b16a94b408..1429984cbf 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/config/ConfigExamplesTest.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/config/ConfigExamplesTest.java
@@ -16,7 +16,6 @@
*/
package org.apache.tika.config;
-import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.io.InputStream;
@@ -28,10 +27,6 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.apache.tika.config.loader.TikaLoader;
-import org.apache.tika.detect.Detector;
-import org.apache.tika.io.TikaInputStream;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
/**
@@ -99,29 +94,4 @@ public class ConfigExamplesTest {
public void testFullMigrationExample() throws Exception {
loadAndValidate("migration-full-example.json");
}
-
- /** The detectors.adoc example: enabling the opt-in pkcs-7-detector yields
the CMS smime-type. */
- @Test
- public void testPkcs7DetectorConfig() throws Exception {
- Detector detector = loadDetectors("detector-pkcs7.json");
- assertEquals("application/pkcs7-mime; smime-type=signed-data",
- detect(detector, "testPKCS7_signed_data_def.p7m"));
- }
-
- private Detector loadDetectors(String resourceName) throws Exception {
- try (InputStream is = getClass().getResourceAsStream(EXAMPLES_DIR +
resourceName)) {
- assertNotNull(is, "Resource not found: " + resourceName);
- Path configFile = tempDir.resolve("tika-config.json");
- Files.writeString(configFile, new String(is.readAllBytes(),
StandardCharsets.UTF_8),
- StandardCharsets.UTF_8);
- return TikaLoader.load(configFile).loadDetectors();
- }
- }
-
- private String detect(Detector detector, String resource) throws Exception
{
- try (TikaInputStream tis = TikaInputStream.get(
- getClass().getResourceAsStream("/test-documents/" +
resource))) {
- return detector.detect(tis, new Metadata(), new
ParseContext()).toString();
- }
- }
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/mime/TestMimeTypes.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/mime/TestMimeTypes.java
index b3e220235a..ae731d9f30 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/mime/TestMimeTypes.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/mime/TestMimeTypes.java
@@ -1242,9 +1242,10 @@ public class TestMimeTypes {
// Parameters only have PEM form, always need data
assertTypeByData("application/x-x509-dsa-parameters",
"testDSAPARAMS.pem");
assertTypeByData("application/x-x509-ec-parameters",
"testECPARAMS.pem");
- // PKCS12 is now identified by content via the PFX version-3 anchor
(TIKA-1997/TIKA-3784)
- assertType("application/x-pkcs12", "testRSAKEYandCERT.p12");
- assertTypeByData("application/x-pkcs12", "testRSAKEYandCERT.p12");
+ // PKCS12 wrappers of Certs+Keys cannot currently be identified
+ // Once solved, see TIKA-3784, ought to work for name or data
+ //assertType("application/x-pkcs12", "testRSAKEYandCERT.p12");
+ //assertTypeByData("application/x-pkcs12", "testRSAKEYandCERT.p12");
// pass=tika
assertTypeByData("application/x-java-keystore", "KeyStore.jks");
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/crypto/Pkcs7EndToEndTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/crypto/Pkcs7EndToEndTest.java
deleted file mode 100644
index 2dcdc8788a..0000000000
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/crypto/Pkcs7EndToEndTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.parser.crypto;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.util.List;
-
-import org.junit.jupiter.api.Test;
-
-import org.apache.tika.TikaTest;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.TikaCoreProperties;
-
-public class Pkcs7EndToEndTest extends TikaTest {
-
- /**
- * TIKA-1997: a CMS-signed XML is detected as PKCS7, routed to
Pkcs7Parser, refined to
- * signed-data, and its inner XML payload is unwrapped and its content
extracted.
- */
- @Test
- public void testSignedXmlIsExtracted() throws Exception {
- List<Metadata> metadataList = getRecursiveMetadata("test.xml.p7m");
- // the container is refined from the coarse detected type to the CMS
subtype
- assertEquals("application/pkcs7-mime; smime-type=signed-data",
- metadataList.get(0).get(Metadata.CONTENT_TYPE));
- // the signed XML payload is unwrapped and extracted
- StringBuilder content = new StringBuilder();
- for (Metadata m : metadataList) {
- String c = m.get(TikaCoreProperties.TIKA_CONTENT);
- if (c != null) {
- content.append(c);
- }
- }
- assertContains("TEST_APP", content.toString());
- assertContains("ESTRAZIONE", content.toString());
- }
-
- /** CMS compressedData (RFC 3274) is inflated and its inner payload
extracted (here a PDF). */
- @Test
- public void testCompressedContentIsExtracted() throws Exception {
- List<Metadata> metadataList =
getRecursiveMetadata("testPKCS7_compressed_def_long.p7z");
- assertEquals("application/pkcs7-mime; smime-type=compressed-data",
- metadataList.get(0).get(Metadata.CONTENT_TYPE));
- boolean pdf = metadataList.stream()
- .map(m -> m.get(Metadata.CONTENT_TYPE))
- .anyMatch(ct -> ct != null &&
ct.startsWith("application/pdf"));
- assertTrue(pdf, "expected an embedded application/pdf inflated from
the compressed payload");
- }
-}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/config-examples/detector-pkcs7.json
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/config-examples/detector-pkcs7.json
deleted file mode 100644
index c4d7c5c9b8..0000000000
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/config-examples/detector-pkcs7.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "detectors": [
- { "pkcs-7-detector": {} },
- { "default-detector": {} }
- ]
-}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/test.xml.p7m
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/test.xml.p7m
deleted file mode 100644
index ce21cc961f..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/test.xml.p7m
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testPKCS7_compressed_def_long.p7z
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testPKCS7_compressed_def_long.p7z
deleted file mode 100644
index 74474876ed..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testPKCS7_compressed_def_long.p7z
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testPKCS7_signed_data_def.p7m
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testPKCS7_signed_data_def.p7m
deleted file mode 100644
index 1f0adb7499..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testPKCS7_signed_data_def.p7m
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/detect/crypto/Pkcs7Detector.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/detect/crypto/Pkcs7Detector.java
deleted file mode 100644
index bda01baa6f..0000000000
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/detect/crypto/Pkcs7Detector.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.detect.crypto;
-
-import java.io.IOException;
-
-import org.apache.tika.annotation.TikaComponent;
-import org.apache.tika.detect.Detector;
-import org.apache.tika.io.TikaInputStream;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.mime.MediaType;
-import org.apache.tika.parser.ParseContext;
-import org.apache.tika.parser.crypto.CmsClassifier;
-
-/**
- * Optional detector that surfaces the CMS/PKCS7 {@code smime-type} at
detection time, using the
- * same {@link CmsClassifier} as {@code Pkcs7Parser}. Marked {@code spi =
false} so it is NOT
- * auto-loaded (the default detect path stays cheap — magic gives the coarse
family and the parser
- * refines the subtype); enable it by name in a tika-config when you need the
subtype from
- * {@code detect()} without parsing.
- */
-@TikaComponent(spi = false)
-public class Pkcs7Detector implements Detector {
-
- private static final long serialVersionUID = 6879398011936510897L;
-
- @Override
- public MediaType detect(TikaInputStream tis, Metadata metadata,
ParseContext parseContext)
- throws IOException {
- if (tis == null) {
- return MediaType.OCTET_STREAM;
- }
- MediaType type = CmsClassifier.classify(tis);
- return type != null ? type : MediaType.OCTET_STREAM;
- }
-}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/CmsClassifier.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/CmsClassifier.java
deleted file mode 100644
index 2e3777ac1f..0000000000
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/CmsClassifier.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.parser.crypto;
-
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Map;
-
-import org.bouncycastle.asn1.ASN1Encodable;
-import org.bouncycastle.asn1.ASN1ObjectIdentifier;
-import org.bouncycastle.asn1.ASN1Primitive;
-import org.bouncycastle.asn1.ASN1SequenceParser;
-import org.bouncycastle.asn1.ASN1StreamParser;
-import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
-import org.bouncycastle.cms.CMSSignedDataParser;
-import org.bouncycastle.cms.CMSTypedStream;
-import org.bouncycastle.operator.DigestCalculatorProvider;
-import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder;
-
-import org.apache.tika.io.TikaInputStream;
-import org.apache.tika.mime.MediaType;
-
-/**
- * Classifies a CMS/PKCS7 stream by its {@code ContentInfo} content-type OID
(and, for signedData,
- * its sub-shape) into a refined Tika {@link MediaType}. Shared by {@link
Pkcs7Parser} (parse-time
- * labelling) and the optional detector. Reads via the spooled file and
returns {@code null} if the
- * stream is not recognizable CMS, so a caller can fall back to the coarse
type.
- */
-public final class CmsClassifier {
-
- // cap the first primitive read when peeking the content-type OID (an OID
is a few bytes)
- private static final int OID_PEEK_LIMIT = 1 << 16;
-
- static final MediaType PKCS7_MIME = MediaType.application("pkcs7-mime");
- static final MediaType PKCS7_SIGNATURE =
MediaType.application("pkcs7-signature");
- static final MediaType SIGNED = smime("signed-data");
- static final MediaType CERTS_ONLY = smime("certs-only");
- static final MediaType ENVELOPED = smime("enveloped-data");
- static final MediaType COMPRESSED = smime("compressed-data");
- static final MediaType DIGESTED = smime("digested-data");
- static final MediaType ENCRYPTED = smime("encrypted-data");
-
- private CmsClassifier() {
- }
-
- private static MediaType smime(String smimeType) {
- return new MediaType("application", "pkcs7-mime", Map.of("smime-type",
smimeType));
- }
-
- /** @return the refined media type, or {@code null} if not recognizable
CMS. */
- public static MediaType classify(TikaInputStream tis) {
- if (tis == null) {
- return null;
- }
- Path path;
- try {
- path = tis.getPath(); // spool to a file so we can read it more
than once
- } catch (Exception e) {
- return null;
- }
- if (path == null) {
- return null;
- }
- ASN1ObjectIdentifier oid = contentType(path);
- if (oid == null) {
- return null;
- }
- if (PKCSObjectIdentifiers.signedData.equals(oid)) {
- return refineSigned(path);
- } else if (PKCSObjectIdentifiers.envelopedData.equals(oid)) {
- return ENVELOPED;
- } else if (PKCSObjectIdentifiers.id_ct_compressedData.equals(oid)) {
- return COMPRESSED;
- } else if (PKCSObjectIdentifiers.digestedData.equals(oid)) {
- return DIGESTED;
- } else if (PKCSObjectIdentifiers.encryptedData.equals(oid)) {
- return ENCRYPTED;
- }
- return null; // plain data or a non-CMS OID: let the coarse type
stand
- }
-
- /** Lazily read only the outer {@code SEQUENCE}'s first element (the
ContentInfo OID). */
- private static ASN1ObjectIdentifier contentType(Path path) {
- try (InputStream is = Files.newInputStream(path)) {
- ASN1StreamParser sp = new ASN1StreamParser(is, OID_PEEK_LIMIT);
- ASN1Encodable top = sp.readObject();
- if (!(top instanceof ASN1SequenceParser)) {
- return null;
- }
- ASN1Encodable first = ((ASN1SequenceParser) top).readObject();
- if (first == null) {
- return null;
- }
- ASN1Primitive prim = first.toASN1Primitive();
- return prim instanceof ASN1ObjectIdentifier ?
(ASN1ObjectIdentifier) prim : null;
- } catch (Exception e) {
- return null;
- }
- }
-
- /**
- * Distinguish a signedData's sub-shape via BouncyCastle's streaming
parser: content present ->
- * signed-data (no drain); otherwise certs + no signers -> certs-only,
else a detached signature.
- */
- private static MediaType refineSigned(Path path) {
- try (InputStream is = Files.newInputStream(path)) {
- DigestCalculatorProvider dcp =
- new
JcaDigestCalculatorProviderBuilder().setProvider("BC").build();
- CMSSignedDataParser parser = new CMSSignedDataParser(dcp, is);
- try {
- CMSTypedStream content = parser.getSignedContent();
- if (content != null) {
- return SIGNED; // has an embedded payload; no need to
drain it to classify
- }
- boolean hasSigners =
!parser.getSignerInfos().getSigners().isEmpty();
- boolean hasCerts =
!parser.getCertificates().getMatches(null).isEmpty();
- if (hasCerts && !hasSigners) {
- return CERTS_ONLY;
- }
- return PKCS7_SIGNATURE;
- } finally {
- parser.close();
- }
- } catch (Exception e) {
- return PKCS7_MIME; // it is signedData but we could not refine
the sub-shape
- }
- }
-}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/Pkcs7Parser.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/Pkcs7Parser.java
index 75b7c570ec..a7a4dd7ec9 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/Pkcs7Parser.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/Pkcs7Parser.java
@@ -17,15 +17,11 @@
package org.apache.tika.parser.crypto;
import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
import java.util.Set;
-import org.bouncycastle.cms.CMSCompressedDataParser;
import org.bouncycastle.cms.CMSException;
import org.bouncycastle.cms.CMSSignedDataParser;
import org.bouncycastle.cms.CMSTypedStream;
-import org.bouncycastle.cms.jcajce.ZlibExpanderProvider;
import org.bouncycastle.operator.DigestCalculatorProvider;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder;
@@ -34,35 +30,31 @@ import org.xml.sax.SAXException;
import org.apache.tika.annotation.TikaComponent;
import org.apache.tika.exception.TikaException;
-import org.apache.tika.io.BoundedInputStream;
import org.apache.tika.io.TikaInputStream;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.EmptyParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
-import org.apache.tika.sax.XHTMLContentHandler;
/**
- * Parser for PKCS7/CMS data. Refines the content type to the CMS subtype
(illustrator-style:
- * coarse magic routes here, this parser sets the {@code smime-type}) and
extracts the embedded
- * content of a signed-data message. Non-signed or detached messages are
labelled but not
- * extracted (their payload is absent, encrypted, or unsupported) and never
throw.
+ * Basic parser for PKCS7 data.
*/
@TikaComponent
public class Pkcs7Parser implements Parser {
+ /**
+ * Serial version UID
+ */
private static final long serialVersionUID = -7310531559075115044L;
private static final MediaType PKCS7_MIME =
MediaType.application("pkcs7-mime");
+
private static final MediaType PKCS7_SIGNATURE =
MediaType.application("pkcs7-signature");
+
private static final Set<MediaType> SUPPORTED_TYPES =
MediaType.set(PKCS7_MIME, PKCS7_SIGNATURE);
- // cap the inflated output of a CMS compressedData so a zlib bomb (tiny
compressed -> huge
- // output) can't blow up the parse; content beyond this is dropped
- private static final long MAX_DECOMPRESSED = 100L * 1024 * 1024;
-
public Set<MediaType> getSupportedTypes(ParseContext context) {
return SUPPORTED_TYPES;
}
@@ -71,40 +63,18 @@ public class Pkcs7Parser implements Parser {
ParseContext context) throws IOException, SAXException,
TikaException {
tis.setCloseShield();
try {
- MediaType type = CmsClassifier.classify(tis);
- if (type != null) {
- metadata.set(Metadata.CONTENT_TYPE, type.toString());
- }
- if (CmsClassifier.SIGNED.equals(type)) {
- extractSignedContent(tis, handler, metadata, context);
- } else if (CmsClassifier.COMPRESSED.equals(type)) {
- extractCompressedContent(tis, handler, metadata, context);
- } else {
- // detached signature / certs-only / enveloped / encrypted /
unknown: no embedded
- // plaintext to extract (absent, encrypted, or unsupported) ->
empty doc, no throw
- XHTMLContentHandler xhtml = new XHTMLContentHandler(handler,
metadata);
- xhtml.startDocument();
- xhtml.endDocument();
- }
- } finally {
- tis.removeCloseShield();
- }
- }
-
- private void extractSignedContent(TikaInputStream tis, ContentHandler
handler, Metadata metadata,
- ParseContext context)
- throws IOException, SAXException, TikaException {
- try (InputStream is = Files.newInputStream(tis.getPath())) {
DigestCalculatorProvider digestCalculatorProvider =
new
JcaDigestCalculatorProviderBuilder().setProvider("BC").build();
- CMSSignedDataParser parser = new
CMSSignedDataParser(digestCalculatorProvider, is);
+ CMSSignedDataParser parser = new
CMSSignedDataParser(digestCalculatorProvider, tis);
try {
CMSTypedStream content = parser.getSignedContent();
- if (content != null) {
- try (TikaInputStream contentTis =
TikaInputStream.get(content.getContentStream())) {
- Parser delegate = context.get(Parser.class,
EmptyParser.INSTANCE);
- delegate.parse(contentTis, handler,
Metadata.newInstance(context), context);
- }
+ if (content == null) {
+ throw new TikaException(
+ "cannot parse detached pkcs7 signature (no signed
data to parse)");
+ }
+ try (TikaInputStream contentTis =
TikaInputStream.get(content.getContentStream())) {
+ Parser delegate = context.get(Parser.class,
EmptyParser.INSTANCE);
+ delegate.parse(contentTis, handler,
Metadata.newInstance(context), context);
}
} finally {
parser.close();
@@ -113,23 +83,8 @@ public class Pkcs7Parser implements Parser {
throw new TikaException("Unable to create
DigestCalculatorProvider", e);
} catch (CMSException e) {
throw new TikaException("Unable to parse pkcs7 signed data", e);
- }
- }
-
- /** Inflate CMS compressedData (RFC 3274, zlib) and delegate-parse the
inner payload. */
- private void extractCompressedContent(TikaInputStream tis, ContentHandler
handler,
- Metadata metadata, ParseContext
context)
- throws IOException, SAXException, TikaException {
- try (InputStream is = Files.newInputStream(tis.getPath())) {
- CMSCompressedDataParser parser = new CMSCompressedDataParser(is);
- CMSTypedStream content = parser.getContent(new
ZlibExpanderProvider());
- InputStream inflated = new BoundedInputStream(MAX_DECOMPRESSED,
content.getContentStream());
- try (TikaInputStream contentTis = TikaInputStream.get(inflated)) {
- Parser delegate = context.get(Parser.class,
EmptyParser.INSTANCE);
- delegate.parse(contentTis, handler,
Metadata.newInstance(context), context);
- }
- } catch (CMSException e) {
- throw new TikaException("Unable to parse pkcs7 compressed data",
e);
+ } finally {
+ tis.removeCloseShield();
}
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/detect/crypto/Pkcs7DetectorTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/detect/crypto/Pkcs7DetectorTest.java
deleted file mode 100644
index 220e73410b..0000000000
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/detect/crypto/Pkcs7DetectorTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.detect.crypto;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.junit.jupiter.api.Test;
-
-import org.apache.tika.io.TikaInputStream;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.mime.MediaType;
-import org.apache.tika.parser.ParseContext;
-
-/** The opt-in detector surfaces the CMS smime-type at detect time
(instantiated directly, not SPI). */
-public class Pkcs7DetectorTest {
-
- private final Pkcs7Detector detector = new Pkcs7Detector();
-
- private MediaType detect(String resource) throws Exception {
- try (TikaInputStream tis = TikaInputStream.get(
- Pkcs7DetectorTest.class.getResourceAsStream("/test-documents/"
+ resource))) {
- return detector.detect(tis, new Metadata(), new ParseContext());
- }
- }
-
- @Test
- public void testSubtypeAtDetectTime() throws Exception {
- assertEquals(MediaType.parse("application/pkcs7-mime;
smime-type=signed-data"),
- detect("testPKCS7_signed_data_def.p7m"));
- assertEquals(MediaType.parse("application/pkcs7-mime;
smime-type=enveloped-data"),
- detect("testPKCS7_enveloped_def.p7m"));
- assertEquals(MediaType.parse("application/pkcs7-mime;
smime-type=certs-only"),
- detect("testPKCS7_certs_only_def.p7c"));
- assertEquals(MediaType.application("pkcs7-signature"),
- detect("testPKCS7_signature_def.p7s"));
- }
-
- @Test
- public void testNonCmsAndNull() throws Exception {
- assertEquals(MediaType.OCTET_STREAM, detector.detect(null, new
Metadata(), new ParseContext()));
- try (TikaInputStream tis = TikaInputStream.get(new byte[]{0x30, 0x03,
0x02, 0x01, 0x00})) {
- assertEquals(MediaType.OCTET_STREAM, detector.detect(tis, new
Metadata(), new ParseContext()));
- }
- }
-}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/parser/crypto/CmsClassifierTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/parser/crypto/CmsClassifierTest.java
deleted file mode 100644
index f50619ec67..0000000000
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/parser/crypto/CmsClassifierTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.parser.crypto;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-
-import org.bouncycastle.asn1.ASN1ObjectIdentifier;
-import org.bouncycastle.asn1.DEROctetString;
-import org.bouncycastle.asn1.cms.ContentInfo;
-import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
-import org.junit.jupiter.api.Test;
-
-import org.apache.tika.io.TikaInputStream;
-import org.apache.tika.mime.MediaType;
-
-/**
- * Verifies the ContentInfo content-type OID -> smime-type mapping
directly, including the
- * digested/encrypted branches for which real fixtures are impractical. A
minimal
- * {@code ContentInfo{ contentType, content }} is enough: the classifier keys
off the OID (the
- * signedData sub-shape, which needs a full message, is exercised by the
fixtures in
- * {@link Pkcs7ParserTest}).
- */
-public class CmsClassifierTest {
-
- private String classify(ASN1ObjectIdentifier contentType) throws Exception
{
- byte[] der = new ContentInfo(contentType, new DEROctetString(new
byte[]{1, 2, 3}))
- .getEncoded();
- try (TikaInputStream tis = TikaInputStream.get(der)) {
- MediaType type = CmsClassifier.classify(tis);
- return type == null ? null : type.toString();
- }
- }
-
- @Test
- public void testContentTypeMapping() throws Exception {
- assertEquals("application/pkcs7-mime; smime-type=enveloped-data",
- classify(PKCSObjectIdentifiers.envelopedData));
- assertEquals("application/pkcs7-mime; smime-type=digested-data",
- classify(PKCSObjectIdentifiers.digestedData));
- assertEquals("application/pkcs7-mime; smime-type=encrypted-data",
- classify(PKCSObjectIdentifiers.encryptedData));
- assertEquals("application/pkcs7-mime; smime-type=compressed-data",
- classify(PKCSObjectIdentifiers.id_ct_compressedData));
- // plain data (and any unrecognized OID) is not a routed CMS container
- assertNull(classify(PKCSObjectIdentifiers.data));
- }
-}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/parser/crypto/Pkcs7DetectionTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/parser/crypto/Pkcs7DetectionTest.java
deleted file mode 100644
index 36905eeb41..0000000000
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/parser/crypto/Pkcs7DetectionTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.parser.crypto;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import java.io.InputStream;
-
-import org.junit.jupiter.api.Test;
-
-import org.apache.tika.Tika;
-
-/**
- * Content-only (magic) detection of the ASN.1/DER crypto families. Magic is
coarse — the CMS
- * subtype (signed vs enveloped) is refined by {@link Pkcs7Parser}, not magic
— so signed/enveloped
- * both detect as pkcs7-signature here.
- */
-public class Pkcs7DetectionTest {
-
- private final Tika tika = new Tika();
-
- private String detect(String resource) throws Exception {
- try (InputStream is = Pkcs7DetectionTest.class.getResourceAsStream(
- "/test-documents/" + resource)) {
- return tika.detect(is);
- }
- }
-
- @Test
- public void testContentOnlyDetection() throws Exception {
- // new/fixed magic
- assertEquals("application/x-pkcs12", detect("testRSAKEYandCERT.p12"));
- assertEquals("application/timestamped-data", detect("Test4.pdf.tsd"));
- assertEquals("application/pkcs7-mime",
detect("testPKCS7_compressed_def_long.p7z"));
- assertEquals("application/pkcs7-mime",
detect("testPKCS7_compressed_ind.p7z"));
- // existing masked CMS magic detects signed/enveloped coarsely as
pkcs7-signature by content
- assertEquals("application/pkcs7-signature",
detect("testPKCS7_signed_data_def.p7m"));
- assertEquals("application/pkcs7-signature",
detect("testPKCS7_enveloped_def.p7m"));
- }
-}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/parser/crypto/Pkcs7ParserTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/parser/crypto/Pkcs7ParserTest.java
index 36dffdc80e..dbd2c7f167 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/parser/crypto/Pkcs7ParserTest.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/java/org/apache/tika/parser/crypto/Pkcs7ParserTest.java
@@ -16,54 +16,28 @@
*/
package org.apache.tika.parser.crypto;
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
-import org.junit.jupiter.api.Test;
-import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.ContentHandler;
+import org.apache.tika.TikaTest;
+import org.apache.tika.exception.TikaException;
import org.apache.tika.io.TikaInputStream;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
+import org.apache.tika.sax.BodyContentHandler;
-public class Pkcs7ParserTest {
-
- /** Parse a fixture and return the content type the parser refined it to.
*/
- private String parsedType(String resource) throws Exception {
- Metadata metadata = new Metadata();
- try (TikaInputStream tis = TikaInputStream.get(
- Pkcs7ParserTest.class.getResourceAsStream("/test-documents/" +
resource))) {
- new Pkcs7Parser().parse(tis, new DefaultHandler(), metadata, new
ParseContext());
+public class Pkcs7ParserTest extends TikaTest {
+ public void testDetachedSignature() throws Exception {
+ try (TikaInputStream tis =
getResourceAsStream("/test-documents/testDetached.p7s")) {
+ ContentHandler handler = new BodyContentHandler();
+ Metadata metadata = new Metadata();
+ new Pkcs7Parser().parse(tis, handler, metadata, new
ParseContext());
+ } catch (NullPointerException npe) {
+ fail("should not get NPE");
+ } catch (TikaException te) {
+ assertTrue(te.toString().contains("cannot parse detached pkcs7
signature"));
}
- return metadata.get(Metadata.CONTENT_TYPE);
- }
-
- @Test
- public void testSubtypeRefinement() throws Exception {
- assertEquals("application/pkcs7-mime; smime-type=signed-data",
- parsedType("testPKCS7_signed_data_def.p7m"));
- assertEquals("application/pkcs7-mime; smime-type=signed-data",
- parsedType("testPKCS7_signed_data_ind.p7m"));
- assertEquals("application/pkcs7-mime; smime-type=signed-data",
- parsedType("test.xml.p7m"));
- assertEquals("application/pkcs7-mime; smime-type=enveloped-data",
- parsedType("testPKCS7_enveloped_def.p7m"));
- assertEquals("application/pkcs7-mime; smime-type=enveloped-data",
- parsedType("testPKCS7_enveloped_ind.p7m"));
- assertEquals("application/pkcs7-mime; smime-type=certs-only",
- parsedType("testPKCS7_certs_only_def.p7c"));
- assertEquals("application/pkcs7-mime; smime-type=certs-only",
- parsedType("testPKCS7_certs_only_ind.p7c"));
- assertEquals("application/pkcs7-mime; smime-type=compressed-data",
- parsedType("testPKCS7_compressed_def_long.p7z"));
- assertEquals("application/pkcs7-mime; smime-type=compressed-data",
- parsedType("testPKCS7_compressed_ind.p7z"));
- }
-
- /** Detached signatures are labelled pkcs7-signature and no longer throw.
*/
- @Test
- public void testDetachedSignatures() throws Exception {
- assertEquals("application/pkcs7-signature",
parsedType("testPKCS7_signature_def.p7s"));
- assertEquals("application/pkcs7-signature",
parsedType("testPKCS7_signature_ind.p7s"));
- assertEquals("application/pkcs7-signature",
parsedType("testDetached.p7s"));
}
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/test.xml.p7m
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/test.xml.p7m
deleted file mode 100644
index ce21cc961f..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/test.xml.p7m
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_certs_only_def.p7c
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_certs_only_def.p7c
deleted file mode 100644
index 5f25350c48..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_certs_only_def.p7c
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_certs_only_ind.p7c
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_certs_only_ind.p7c
deleted file mode 100644
index c0bc161e84..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_certs_only_ind.p7c
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_compressed_def_long.p7z
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_compressed_def_long.p7z
deleted file mode 100644
index 74474876ed..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_compressed_def_long.p7z
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_compressed_def_short.p7z
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_compressed_def_short.p7z
deleted file mode 100644
index da9fbfaf1b..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_compressed_def_short.p7z
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_compressed_ind.p7z
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_compressed_ind.p7z
deleted file mode 100644
index 6ec9716b65..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_compressed_ind.p7z
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_enveloped_def.p7m
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_enveloped_def.p7m
deleted file mode 100644
index dad330064d..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_enveloped_def.p7m
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_enveloped_ind.p7m
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_enveloped_ind.p7m
deleted file mode 100644
index eb182562c8..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_enveloped_ind.p7m
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signature_def.p7s
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signature_def.p7s
deleted file mode 100644
index b90e41ea17..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signature_def.p7s
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signature_ind.p7s
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signature_ind.p7s
deleted file mode 100644
index dd9400a9b4..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signature_ind.p7s
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signed_data_def.p7m
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signed_data_def.p7m
deleted file mode 100644
index 1f0adb7499..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signed_data_def.p7m
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signed_data_def.pem
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signed_data_def.pem
deleted file mode 100644
index 34ef17fd53..0000000000
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signed_data_def.pem
+++ /dev/null
@@ -1,35 +0,0 @@
------BEGIN PKCS7-----
-MIIGIgYJKoZIhvcNAQcCoIIGEzCCBg8CAQExDTALBglghkgBZQMEAgEwEwYJKoZI
-hvcNAQcBoAYEBHRleHSgggPDMIIDvzCCAyigAwIBAgICAKEwDQYJKoZIhvcNAQEF
-BQAwcjELMAkGA1UEBhMCRVMxDzANBgNVBAgTBk1hZHJpZDEPMA0GA1UEBxMGTWFk
-cmlkMQ4wDAYDVQQKEwVNSVR5QzEbMBkGA1UECxMSTUlUeUMgRE5JZSBQcnVlYmFz
-MRQwEgYDVQQDEwtDQSB1c3VhcmlvczAeFw0xMDA0MDgxMjM4MjJaFw0yMDA0MDUx
-MjM4MjJaMHwxCzAJBgNVBAYTAkVTMQ8wDQYDVQQIEwZNYWRyaWQxDzANBgNVBAcT
-Bk1hZHJpZDEOMAwGA1UEChMFTUlUeUMxGzAZBgNVBAsTEk1JVHlDIEROSWUgUHJ1
-ZWJhczEeMBwGA1UEAxMVVXN1YXJpbyBkZSBwcnVlYmFzIDYxMIGfMA0GCSqGSIb3
-DQEBAQUAA4GNADCBiQKBgQC2ehoLcO6lXWmKzJfdz2m+vRZmGeDo5OF+Q8MNdVtL
-8AKbMykP6G9JOzBT3WLhzQKszMg43DQjViN6mTQsPLYCfe/n6LmTWZkRvsIzrffM
-aL7goy47VCX1CeUQ80cuUAHJpRq7UMObNvgV/8rn+zPfYmErqZVhAckleP4/RgeC
-9QIDAQABo4IBWDCCAVQwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwHQYDVR0OBBYE
-FNhww+tqmd7gvdedMv0Gk1mEolYdMIGYBgNVHSMEgZAwgY2AFPWhaqh3T1uxBIyn
-fkjxDp/Fdo8boXKkcDBuMQ8wDQYDVQQIEwZNYWRyaWQxDzANBgNVBAcTBk1hZHJp
-ZDEOMAwGA1UEChMFTUlUeUMxGzAZBgNVBAsTEk1JVHlDIEROSWUgUHJ1ZWJhczEQ
-MA4GA1UEAxMHUm9vdCBDQTELMAkGA1UEBhMCRVOCAQMwCQYDVR0RBAIwADA2BgNV
-HRIELzAthitodHRwOi8vbWluaXN0ZXItOGpneHk5Lm1pdHljLmFnZS9QS0kvQ0Eu
-Y3J0MD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9taW5pc3Rlci04amd4eTkubWl0
-eWMuYWdlL1BLSS9jcmwuY3JsMA0GCSqGSIb3DQEBBQUAA4GBADn3vfsgfhyreHhn
-4VCG4WuG+g5qTRKpu72ZScMbyY+e3d2m6fOSMkoEC+NwaXgl4Y/vKlXGKgdhYjLD
-WjobRDVQOQRQ4Q/Wv/aPPno1CjBkYdY5rnCM/oiy8QXNjdboXRiE40kCyqj7jiop
-B20uO2a0yacC5ooWQz1pqZEhSWRDMYICHTCCAhkCAQEweDByMQswCQYDVQQGEwJF
-UzEPMA0GA1UECBMGTWFkcmlkMQ8wDQYDVQQHEwZNYWRyaWQxDjAMBgNVBAoTBU1J
-VHlDMRswGQYDVQQLExJNSVR5QyBETkllIFBydWViYXMxFDASBgNVBAMTC0NBIHVz
-dWFyaW9zAgIAoTALBglghkgBZQMEAgGggfowGAYJKoZIhvcNAQkDMQsGCSqGSIb3
-DQEHATAcBgkqhkiG9w0BCQUxDxcNMTkwMTI0MTM0MjI1WjAvBgkqhkiG9w0BCQQx
-IgQgmC2ePrmW9VnmM/TRlN7zdh2Qn1o7ZH0ahR/q1nwyydEwgY4GCSqGSIb3DQEJ
-DzGBgDB+MAsGCWCGSAFlAwQBKjAIBgYqhQMCAgkwCAYGKoUDAgIVMAsGCWCGSAFl
-AwQBFjALBglghkgBZQMEAQIwCgYIKoZIhvcNAwcwDgYIKoZIhvcNAwICAgCAMA0G
-CCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgEoMA0GCSqGSIb3DQEB
-AQUABIGAFR6+Q41Ak8HXUNnbkEQDWN3JBacSYi5mAPtHyJNHGLewKTwxOrf/nGhk
-Qq5zqvMLhci0NBU3wvW+lAKX3ytavfkRkRFlTruuH151Stkr2TRW6h132ggA2AAJ
-3gGxGqN2bYAYB6O8QY4NhmJdSi+j4bK0ayo15HhpagRfp2181lU=
------END PKCS7-----
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signed_data_ind.p7m
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signed_data_ind.p7m
deleted file mode 100644
index cf54083951..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testPKCS7_signed_data_ind.p7m
and /dev/null differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testRSAKEYandCERT.p12
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testRSAKEYandCERT.p12
deleted file mode 100644
index 1c536e8fbe..0000000000
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/test/resources/test-documents/testRSAKEYandCERT.p12
and /dev/null differ