diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfDocumentTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfDocumentTest.cs index e1bae12dff..272f412bc7 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfDocumentTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfDocumentTest.cs @@ -501,7 +501,7 @@ public virtual void MergedSiblingWidgetsRemovePageTest() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void RootCannotBeReferenceFromTrailerTest() { String filename = SOURCE_FOLDER + "rootCannotBeReferenceFromTrailerTest.pdf"; PdfReader corruptedReader = new PdfReader(filename); diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfObjectTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfObjectTest.cs index 7632e22b5a..2989f2315e 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfObjectTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfObjectTest.cs @@ -154,7 +154,7 @@ public virtual void PdtIndirectReferenceLateInitializing1() { [LogMessage(iText.IO.Logs.IoLogMessageConstant.FLUSHED_OBJECT_CONTAINS_REFERENCE_WHICH_NOT_REFER_TO_ANY_OBJECT )] [LogMessage(iText.IO.Logs.IoLogMessageConstant.INDIRECT_REFERENCE_USED_IN_FLUSHED_OBJECT_MADE_FREE)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void PdtIndirectReferenceLateInitializing2() { MemoryStream baos = new MemoryStream(); PdfDocument document = new PdfDocument(new PdfWriter(baos)); diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderDecodeTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderDecodeTest.cs index 9120f58764..04551fe9fe 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderDecodeTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderDecodeTest.cs @@ -58,7 +58,7 @@ public virtual void NoMemoryHandlerTest() { [NUnit.Framework.Test] [LogMessage(iText.IO.Logs.IoLogMessageConstant.INVALID_INDIRECT_REFERENCE)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void DefaultMemoryHandlerTest() { using (PdfDocument pdfDocument = new PdfDocument(new PdfReader(SOURCE_FOLDER + "timing.pdf"), new PdfWriter (new MemoryStream()))) { @@ -78,7 +78,7 @@ public virtual void DefaultMemoryHandlerTest() { [NUnit.Framework.Test] [LogMessage(iText.IO.Logs.IoLogMessageConstant.INVALID_INDIRECT_REFERENCE)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void CustomMemoryHandlerSingleTest() { MemoryLimitsAwareHandler handler = new MemoryLimitsAwareHandler(); handler.SetMaxSizeOfSingleDecompressedPdfStream(1000); @@ -103,7 +103,7 @@ public virtual void CustomMemoryHandlerSingleTest() { [NUnit.Framework.Test] [LogMessage(iText.IO.Logs.IoLogMessageConstant.INVALID_INDIRECT_REFERENCE)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void OneFilterCustomMemoryHandlerSingleTest() { MemoryLimitsAwareHandler handler = new MemoryLimitsAwareHandler(); handler.SetMaxSizeOfSingleDecompressedPdfStream(20); @@ -123,7 +123,7 @@ public virtual void OneFilterCustomMemoryHandlerSingleTest() { [NUnit.Framework.Test] [LogMessage(iText.IO.Logs.IoLogMessageConstant.INVALID_INDIRECT_REFERENCE)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void OverriddenMemoryHandlerAllStreamsAreSuspiciousTest() { MemoryLimitsAwareHandler handler = new _MemoryLimitsAwareHandler_175(); handler.SetMaxSizeOfSingleDecompressedPdfStream(20); @@ -153,7 +153,7 @@ public override bool IsMemoryLimitsAwarenessRequiredOnDecompression(PdfArray fil [NUnit.Framework.Test] [LogMessage(iText.IO.Logs.IoLogMessageConstant.INVALID_INDIRECT_REFERENCE)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void OverriddenMemoryHandlerNoStreamsAreSuspiciousTest() { MemoryLimitsAwareHandler handler = new _MemoryLimitsAwareHandler_210(); handler.SetMaxSizeOfSingleDecompressedPdfStream(20); @@ -194,7 +194,7 @@ public virtual void DifferentFiltersEmptyTest() { [NUnit.Framework.Test] [LogMessage(iText.IO.Logs.IoLogMessageConstant.INVALID_INDIRECT_REFERENCE)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void CustomMemoryHandlerSumTest() { MemoryLimitsAwareHandler handler = new MemoryLimitsAwareHandler(); handler.SetMaxSizeOfDecompressedPdfStreamsSum(100000); @@ -211,7 +211,7 @@ public virtual void CustomMemoryHandlerSumTest() { [NUnit.Framework.Test] [LogMessage(iText.IO.Logs.IoLogMessageConstant.INVALID_INDIRECT_REFERENCE)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void PageSumTest() { MemoryLimitsAwareHandler handler = new MemoryLimitsAwareHandler(); handler.SetMaxSizeOfDecompressedPdfStreamsSum(1500000); @@ -226,7 +226,7 @@ public virtual void PageSumTest() { [NUnit.Framework.Test] [LogMessage(iText.IO.Logs.IoLogMessageConstant.INVALID_INDIRECT_REFERENCE)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void PageAsSingleStreamTest() { MemoryLimitsAwareHandler handler = new MemoryLimitsAwareHandler(); handler.SetMaxSizeOfSingleDecompressedPdfStream(1500000); diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs index e1320af607..2c2477278c 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs @@ -675,7 +675,8 @@ public virtual void PagesTest11() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT, Count = 1)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE, + Count = 1)] public virtual void CorrectSimpleDoc1() { String filename = SOURCE_FOLDER + "correctSimpleDoc1.pdf"; PdfReader reader = new PdfReader(filename); @@ -702,7 +703,8 @@ public virtual void CorrectSimpleDoc2() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT, Count = 1)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE, + Count = 1)] public virtual void CorrectSimpleDoc3() { String filename = SOURCE_FOLDER + "correctSimpleDoc3.pdf"; PdfReader reader = new PdfReader(filename); @@ -716,7 +718,7 @@ public virtual void CorrectSimpleDoc3() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] [LogMessage(iText.IO.Logs.IoLogMessageConstant.INVALID_INDIRECT_REFERENCE)] public virtual void CorrectSimpleDoc4() { String filename = SOURCE_FOLDER + "correctSimpleDoc4.pdf"; @@ -736,7 +738,7 @@ public virtual void CorrectSimpleDoc4() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void FixPdfTest01() { String filename = SOURCE_FOLDER + "OnlyTrailer.pdf"; PdfReader reader = new PdfReader(filename); @@ -802,7 +804,7 @@ public virtual void FixPdfTest04() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void FixPdfTest05() { String filename = SOURCE_FOLDER + "CompressionWrongShift.pdf"; PdfReader reader = new PdfReader(filename); @@ -850,7 +852,7 @@ public virtual void FixPdfTest07() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void FixPdfTest08() { String filename = SOURCE_FOLDER + "XRefSectionWithFreeReferences2.pdf"; PdfReader reader = new PdfReader(filename); @@ -870,7 +872,7 @@ public virtual void FixPdfTest08() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void FixPdfTest09() { String filename = SOURCE_FOLDER + "XRefSectionWithFreeReferences3.pdf"; PdfReader reader = new PdfReader(filename); @@ -911,7 +913,7 @@ public virtual void FixPdfTest10() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void FixPdfTest11() { String filename = SOURCE_FOLDER + "XRefSectionWithoutSize.pdf"; PdfReader reader = new PdfReader(filename); @@ -928,7 +930,7 @@ public virtual void FixPdfTest11() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void FixPdfTest12() { String filename = SOURCE_FOLDER + "XRefWithBreaks.pdf"; PdfReader reader = new PdfReader(filename); @@ -1003,7 +1005,7 @@ public virtual void FixPdfTest14() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void FixPdfTest15() { String filename = SOURCE_FOLDER + "XRefWithInvalidGenerations3.pdf"; PdfReader reader = new PdfReader(filename); @@ -1037,7 +1039,7 @@ public virtual void FixPdfTest16() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void FixPdfTest17() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; PdfReader reader = new PdfReader(filename); @@ -1054,7 +1056,7 @@ public virtual void FixPdfTest17() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void FixPdfTest18() { String filename = SOURCE_FOLDER + "noXrefAndTrailerWithInfo.pdf"; PdfReader reader = new PdfReader(filename); @@ -1148,7 +1150,7 @@ public virtual void AppendModeWith10PagesWithCompression() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void AppendModeWith10PagesFix1() { String filename = SOURCE_FOLDER + "10PagesDocumentAppendedFix1.pdf"; PdfReader reader = new PdfReader(filename); @@ -1170,7 +1172,7 @@ public virtual void AppendModeWith10PagesFix1() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void AppendModeWith10PagesFix2() { String filename = SOURCE_FOLDER + "10PagesDocumentAppendedFix2.pdf"; PdfReader reader = new PdfReader(filename); @@ -1438,7 +1440,7 @@ public virtual void IncrementalUpdateWithOnlyZeroObjectUpdate() { [NUnit.Framework.Test] [LogMessage(iText.IO.Logs.IoLogMessageConstant.INVALID_INDIRECT_REFERENCE, Count = 1)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] [LogMessage(iText.IO.Logs.IoLogMessageConstant.ENCOUNTERED_INVALID_MCR)] public virtual void WrongTagStructureFlushingTest() { //wrong /Pg number @@ -1925,7 +1927,7 @@ public virtual void EndObjInsteadOfArrayClosingBracketTest() { [NUnit.Framework.Test] [LogMessage(KernelExceptionMessageConstant.UNEXPECTED_TOKEN)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void NameInsteadOfArrayClosingBracketTest() { String fileName = SOURCE_FOLDER + "invalidArrayNameToken.pdf"; PdfDocument document = new PdfDocument(new PdfReader(fileName)); @@ -1974,7 +1976,7 @@ public virtual void StartArrayInsteadOfArrayClosingBracketTest() { [NUnit.Framework.Test] [LogMessage(KernelExceptionMessageConstant.UNEXPECTED_TOKEN)] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void StringInsteadOfArrayClosingBracketTest() { String fileName = SOURCE_FOLDER + "invalidArrayStringToken.pdf"; PdfDocument document = new PdfDocument(new PdfReader(fileName)); @@ -2092,7 +2094,7 @@ public virtual void XrefStreamPointsItselfConservativeModeTest() { } } - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] [NUnit.Framework.Test] public virtual void ExactLimitOfObjectNrSizeTest() { String fileName = SOURCE_FOLDER + "exactLimitOfObjectNr.pdf"; @@ -2104,7 +2106,7 @@ public virtual void ExactLimitOfObjectNrSizeTest() { } } - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] [NUnit.Framework.Test] public virtual void JustBeforeLimitOfObjectNrSizeTest() { String inputFile = SOURCE_FOLDER + "justBeforeLimitOfObjectNr.pdf"; @@ -2141,7 +2143,8 @@ public virtual void XrefStreamsHaveCycledReferencesConservativeModeTest() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT, Count = 1)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE, + Count = 1)] public virtual void XrefTablesHaveCycledReferencesTest() { String fileName = SOURCE_FOLDER + "cycledReferencesInXrefTables.pdf"; using (PdfReader pdfReader = new PdfReader(fileName)) { @@ -2152,7 +2155,8 @@ public virtual void XrefTablesHaveCycledReferencesTest() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT, Count = 1)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE, + Count = 1)] public virtual void XrefTablePointsItselfTest() { String fileName = SOURCE_FOLDER + "xrefTablePointsItself.pdf"; using (PdfReader pdfReader = new PdfReader(fileName)) { @@ -2418,7 +2422,8 @@ public virtual void ConformanceLevelCacheTest() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT, Count = 1)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE, + Count = 1)] public virtual void InvalidXrefTableRebuildsCorrectlyWhenTrailerIsBeforeObjects() { // when a pdf is Linearized the following can occur: // xref table @@ -2562,6 +2567,42 @@ public override bool IsMemoryLimitsAwarenessRequiredOnDecompression(PdfArray fil } } + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] + [NUnit.Framework.Test] + public virtual void IncorrectFilePositionInSubsectionCauseTest() { + PdfReader pdfReader = new PdfReader(SOURCE_FOLDER + "incorrectFilePositionInSubsection.pdf").SetStrictnessLevel + (PdfReader.StrictnessLevel.LENIENT); + new PdfDocument(pdfReader); + NUnit.Framework.Assert.IsTrue(pdfReader.HasRebuiltXref(), "Need rebuildXref()"); + } + + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] + [NUnit.Framework.Test] + public virtual void NoSubsectionCauseTest() { + PdfReader pdfReader = new PdfReader(SOURCE_FOLDER + "noSubsection.pdf").SetStrictnessLevel(PdfReader.StrictnessLevel + .LENIENT); + new PdfDocument(pdfReader); + NUnit.Framework.Assert.IsTrue(pdfReader.HasRebuiltXref(), "Need rebuildXref()"); + } + + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] + [NUnit.Framework.Test] + public virtual void InvalidRefCauseXrefRebuildTest() { + PdfReader pdfReader = new PdfReader(SOURCE_FOLDER + "invalidRefCauseXrefRebuild.pdf").SetStrictnessLevel(PdfReader.StrictnessLevel + .LENIENT); + new PdfDocument(pdfReader); + NUnit.Framework.Assert.IsTrue(pdfReader.HasRebuiltXref(), "Need rebuildXref()"); + } + + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] + [NUnit.Framework.Test] + public virtual void StartxrefNotFoundCauseTest() { + PdfReader pdfReader = new PdfReader(SOURCE_FOLDER + "startxrefNotFound.pdf").SetStrictnessLevel(PdfReader.StrictnessLevel + .LENIENT); + new PdfDocument(pdfReader); + NUnit.Framework.Assert.IsTrue(pdfReader.HasRebuiltXref(), "Need rebuildXref()"); + } + private static PdfDictionary GetTestPdfDictionary() { Dictionary tmpMap = new Dictionary(); tmpMap.Put(new PdfName("b"), new PdfName("c")); diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfTokenizerTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfTokenizerTest.cs index e0a2d47ab2..2d79494145 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfTokenizerTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfTokenizerTest.cs @@ -79,7 +79,7 @@ public virtual void EncodingTest() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void ReadPdfStringTest() { String author = "This string9078 contains \u00A5two octal characters\u00C7"; String creator = "iText\r 6\n"; diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfXrefTableTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfXrefTableTest.cs index 03bd5d6681..f3b6bb7619 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfXrefTableTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfXrefTableTest.cs @@ -48,17 +48,17 @@ public static void AfterClass() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT, LogLevel = - LogLevelConstants.ERROR)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE, + LogLevel = LogLevelConstants.ERROR)] public virtual void OpenInvalidDocWithHugeRefTest() { String inputFile = SOURCE_FOLDER + "invalidDocWithHugeRef.pdf"; - MemoryLimitsAwareHandler memoryLimitsAwareHandler = new _MemoryLimitsAwareHandler_67(); + MemoryLimitsAwareHandler memoryLimitsAwareHandler = new _MemoryLimitsAwareHandler_68(); NUnit.Framework.Assert.DoesNotThrow(() => new PdfDocument(new PdfReader(inputFile, new ReaderProperties(). SetMemoryLimitsAwareHandler(memoryLimitsAwareHandler)))); } - private sealed class _MemoryLimitsAwareHandler_67 : MemoryLimitsAwareHandler { - public _MemoryLimitsAwareHandler_67() { + private sealed class _MemoryLimitsAwareHandler_68 : MemoryLimitsAwareHandler { + public _MemoryLimitsAwareHandler_68() { } public override void CheckIfXrefStructureExceedsTheLimit(int requestedCapacity) { @@ -66,8 +66,8 @@ public override void CheckIfXrefStructureExceedsTheLimit(int requestedCapacity) } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT, LogLevel = - LogLevelConstants.ERROR)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE, + LogLevel = LogLevelConstants.ERROR)] public virtual void OpenInvalidDocWithHugeRefTestDefaultMemoryLimitAwareHandler() { String inputFile = SOURCE_FOLDER + "invalidDocWithHugeRef.pdf"; NUnit.Framework.Assert.Catch(typeof(MemoryLimitsAwareException), () => new PdfDocument(new PdfReader(inputFile @@ -75,8 +75,8 @@ public virtual void OpenInvalidDocWithHugeRefTestDefaultMemoryLimitAwareHandler( } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT, LogLevel = - LogLevelConstants.ERROR)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE, + LogLevel = LogLevelConstants.ERROR)] public virtual void OpenWithWriterInvalidDocWithHugeRefTest() { String inputFile = SOURCE_FOLDER + "invalidDocWithHugeRef.pdf"; MemoryStream outputStream = new ByteArrayOutputStream(); diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/incorrectFilePositionInSubsection.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/incorrectFilePositionInSubsection.pdf new file mode 100644 index 0000000000..3e9731b7bb Binary files /dev/null and b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/incorrectFilePositionInSubsection.pdf differ diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/invalidRefCauseXrefRebuild.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/invalidRefCauseXrefRebuild.pdf new file mode 100644 index 0000000000..c4fed73c02 Binary files /dev/null and b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/invalidRefCauseXrefRebuild.pdf differ diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/noSubsection.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/noSubsection.pdf new file mode 100644 index 0000000000..c146b9abe2 Binary files /dev/null and b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/noSubsection.pdf differ diff --git a/itext.tests/itext.sign.tests/itext/signatures/validation/v1/RevocationDataValidatorTest.cs b/itext.tests/itext.sign.tests/itext/signatures/validation/v1/RevocationDataValidatorTest.cs index 6421d3462e..b8560be6bd 100644 --- a/itext.tests/itext.sign.tests/itext/signatures/validation/v1/RevocationDataValidatorTest.cs +++ b/itext.tests/itext.sign.tests/itext/signatures/validation/v1/RevocationDataValidatorTest.cs @@ -250,6 +250,32 @@ public virtual void ValidityAssuredTest() { .VALIDITY_ASSURED).WithCertificate(certificate))); } + [NUnit.Framework.Test] + public virtual void NoRevAvailTest() { + String checkCertFileName = SOURCE_FOLDER + "noRevAvailCertWithoutCA.pem"; + IX509Certificate certificate = (IX509Certificate)PemFileHelper.ReadFirstChain(checkCertFileName)[0]; + DateTime checkDate = TimeTestUtil.TEST_DATE_TIME; + ValidationReport report = new ValidationReport(); + RevocationDataValidator validator = validatorChainBuilder.BuildRevocationDataValidator(); + validator.Validate(report, baseContext, certificate, checkDate); + AssertValidationReport.AssertThat(report, (a) => a.HasStatus(ValidationReport.ValidationResult.VALID).HasLogItem + ((la) => la.WithCheckName(RevocationDataValidator.REVOCATION_DATA_CHECK).WithMessage(RevocationDataValidator + .NO_REV_AVAILABLE, (m) => certificate.GetSubjectDN()).WithCertificate(certificate))); + } + + [NUnit.Framework.Test] + public virtual void NoRevAvailWithCATest() { + String checkCertFileName = SOURCE_FOLDER + "noRevAvailCert.pem"; + IX509Certificate certificate = (IX509Certificate)PemFileHelper.ReadFirstChain(checkCertFileName)[0]; + DateTime checkDate = TimeTestUtil.TEST_DATE_TIME; + ValidationReport report = new ValidationReport(); + RevocationDataValidator validator = validatorChainBuilder.BuildRevocationDataValidator(); + validator.Validate(report, baseContext, certificate, checkDate); + AssertValidationReport.AssertThat(report, (a) => a.HasStatus(ValidationReport.ValidationResult.INDETERMINATE + ).HasLogItem((la) => la.WithCheckName(RevocationDataValidator.REVOCATION_DATA_CHECK).WithMessage(RevocationDataValidator + .NO_REV_AVAILABLE_CA, (m) => certificate.GetSubjectDN()).WithCertificate(certificate))); + } + [NUnit.Framework.Test] public virtual void SelfSignedCertificateIsNotValidatedTest() { DateTime checkDate = TimeTestUtil.TEST_DATE_TIME; @@ -385,7 +411,7 @@ public virtual void CrlEncodingErrorTest() { parameters.SetFreshness(ValidatorContexts.All(), CertificateSources.All(), TimeBasedContexts.All(), TimeSpan.FromDays (2)); RevocationDataValidator validator = validatorChainBuilder.BuildRevocationDataValidator(); - validator.AddCrlClient(new _ICrlClient_516(crl)).Validate(report, baseContext, checkCert, TimeTestUtil.TEST_DATE_TIME + validator.AddCrlClient(new _ICrlClient_557(crl)).Validate(report, baseContext, checkCert, TimeTestUtil.TEST_DATE_TIME ); AssertValidationReport.AssertThat(report, (a) => a.HasStatus(ValidationReport.ValidationResult.INDETERMINATE ).HasLogItem((la) => la.WithCheckName(RevocationDataValidator.REVOCATION_DATA_CHECK).WithMessage(MessageFormatUtil @@ -394,8 +420,8 @@ public virtual void CrlEncodingErrorTest() { ))); } - private sealed class _ICrlClient_516 : ICrlClient { - public _ICrlClient_516(byte[] crl) { + private sealed class _ICrlClient_557 : ICrlClient { + public _ICrlClient_557(byte[] crl) { this.crl = crl; } @@ -493,7 +519,7 @@ public virtual void ResponsesFromValidationClientArePassedTest() { mockCrlValidator.OnCallDo((c) => NUnit.Framework.Assert.AreEqual(crlGeneration, c.responseGenerationDate)); ValidationReport report = new ValidationReport(); RevocationDataValidator validator = validatorChainBuilder.GetRevocationDataValidator(); - ValidationOcspClient ocspClient = new _ValidationOcspClient_635(); + ValidationOcspClient ocspClient = new _ValidationOcspClient_676(); TestOcspResponseBuilder ocspBuilder = new TestOcspResponseBuilder(responderCert, ocspRespPrivateKey); byte[] ocspResponseBytes = new TestOcspClient().AddBuilderForCertIssuer(caCert, ocspBuilder).GetEncoded(checkCert , caCert, null); @@ -501,7 +527,7 @@ public virtual void ResponsesFromValidationClientArePassedTest() { )); ocspClient.AddResponse(basicOCSPResp, ocspGeneration, TimeBasedContext.HISTORICAL); validator.AddOcspClient(ocspClient); - ValidationCrlClient crlClient = new _ValidationCrlClient_650(); + ValidationCrlClient crlClient = new _ValidationCrlClient_691(); TestCrlBuilder crlBuilder = new TestCrlBuilder(caCert, caPrivateKey, checkDate); byte[] crlResponseBytes = new List(new TestCrlClient().AddBuilderForCertIssuer(crlBuilder).GetEncoded (checkCert, null))[0]; @@ -511,8 +537,8 @@ public virtual void ResponsesFromValidationClientArePassedTest() { validator.Validate(report, baseContext, checkCert, checkDate); } - private sealed class _ValidationOcspClient_635 : ValidationOcspClient { - public _ValidationOcspClient_635() { + private sealed class _ValidationOcspClient_676 : ValidationOcspClient { + public _ValidationOcspClient_676() { } public override byte[] GetEncoded(IX509Certificate checkCert, IX509Certificate issuerCert, String url) { @@ -521,8 +547,8 @@ public override byte[] GetEncoded(IX509Certificate checkCert, IX509Certificate i } } - private sealed class _ValidationCrlClient_650 : ValidationCrlClient { - public _ValidationCrlClient_650() { + private sealed class _ValidationCrlClient_691 : ValidationCrlClient { + public _ValidationCrlClient_691() { } public override ICollection GetEncoded(IX509Certificate checkCert, String url) { @@ -588,18 +614,18 @@ public virtual void TimeBasedContextProperlySetOnlineClientsTest() { RevocationDataValidator validator = validatorChainBuilder.GetRevocationDataValidator(); TestOcspResponseBuilder ocspBuilder = new TestOcspResponseBuilder(responderCert, ocspRespPrivateKey); TestOcspClient testOcspClient = new TestOcspClient().AddBuilderForCertIssuer(caCert, ocspBuilder); - OcspClientBouncyCastle ocspClient = new _OcspClientBouncyCastle_729(testOcspClient); + OcspClientBouncyCastle ocspClient = new _OcspClientBouncyCastle_770(testOcspClient); validator.AddOcspClient(ocspClient); TestCrlBuilder crlBuilder = new TestCrlBuilder(caCert, caPrivateKey, checkDate); TestCrlClient testCrlClient = new TestCrlClient().AddBuilderForCertIssuer(crlBuilder); - CrlClientOnline crlClient = new _CrlClientOnline_739(testCrlClient); + CrlClientOnline crlClient = new _CrlClientOnline_780(testCrlClient); validator.AddCrlClient(crlClient); validator.Validate(report, baseContext.SetTimeBasedContext(TimeBasedContext.HISTORICAL), checkCert, checkDate ); } - private sealed class _OcspClientBouncyCastle_729 : OcspClientBouncyCastle { - public _OcspClientBouncyCastle_729(TestOcspClient testOcspClient) { + private sealed class _OcspClientBouncyCastle_770 : OcspClientBouncyCastle { + public _OcspClientBouncyCastle_770(TestOcspClient testOcspClient) { this.testOcspClient = testOcspClient; } @@ -610,8 +636,8 @@ public override byte[] GetEncoded(IX509Certificate checkCert, IX509Certificate r private readonly TestOcspClient testOcspClient; } - private sealed class _CrlClientOnline_739 : CrlClientOnline { - public _CrlClientOnline_739(TestCrlClient testCrlClient) { + private sealed class _CrlClientOnline_780 : CrlClientOnline { + public _CrlClientOnline_780(TestCrlClient testCrlClient) { this.testCrlClient = testCrlClient; } diff --git a/itext.tests/itext.sign.tests/itext/signatures/validation/v1/SignatureValidatorIntegrationTest.cs b/itext.tests/itext.sign.tests/itext/signatures/validation/v1/SignatureValidatorIntegrationTest.cs index dcdee4f480..960cd68e1f 100644 --- a/itext.tests/itext.sign.tests/itext/signatures/validation/v1/SignatureValidatorIntegrationTest.cs +++ b/itext.tests/itext.sign.tests/itext/signatures/validation/v1/SignatureValidatorIntegrationTest.cs @@ -78,7 +78,7 @@ public virtual void ValidLatestSignatureTest() { certificateRetriever.SetTrustedCertificates(JavaCollectionsUtil.SingletonList(rootCert)); AddRevDataClients(); SignatureValidator signatureValidator = builder.BuildSignatureValidator(document); - report = signatureValidator.ValidateLatestSignature(document); + report = signatureValidator.ValidateSignatures(); } AssertValidationReport.AssertThat(report, (a) => a.HasStatus(ValidationReport.ValidationResult.VALID).HasLogItems (3, (al) => al.WithCertificate(rootCert).WithCheckName(CertificateChainValidator.CERTIFICATE_CHECK).WithMessage @@ -102,7 +102,6 @@ public virtual void ShortValidityCertsWithOcspTest() { SignatureValidator signatureValidator = builder.BuildSignatureValidator(document); report = signatureValidator.ValidateSignatures(); } - // ocsp validation date is wrong but why AssertValidationReport.AssertThat(report, (a) => a.HasStatus(ValidationReport.ValidationResult.VALID).HasLogItem ((al) => al.WithCheckName(DocumentRevisionsValidator.DOC_MDP_CHECK).WithMessage(DocumentRevisionsValidator .UNEXPECTED_ENTRY_IN_XREF, (i) => 30)).HasLogItem((al) => al.WithCheckName(SignatureValidator.SIGNATURE_VERIFICATION @@ -176,6 +175,68 @@ public virtual void ValidateMultipleDocumentsTest() { NUnit.Framework.Assert.AreEqual(2, validationOcspClient.GetResponses().Count); } + [NUnit.Framework.Test] + public virtual void ValidateSingleSignatureTest1() { + String rootCertName = CERTS_SRC + "root_cert.pem"; + IX509Certificate rootCert = (IX509Certificate)PemFileHelper.ReadFirstChain(rootCertName)[0]; + ValidationReport report1; + ValidationReport report2; + using (PdfDocument document = new PdfDocument(new PdfReader(SOURCE_FOLDER + "validateSingleSignature1.pdf" + ))) { + certificateRetriever.SetTrustedCertificates(JavaCollectionsUtil.SingletonList(rootCert)); + AddRevDataClients(); + SignatureValidator signatureValidator1 = builder.BuildSignatureValidator(document); + report1 = signatureValidator1.ValidateSignature("Signature1"); + SignatureValidator signatureValidator2 = builder.BuildSignatureValidator(document); + report2 = signatureValidator2.ValidateSignature("Signature2"); + } + // Signature1 set access permissions to level 3, Signature2 - to level 1, after that annotation was added. + AssertValidationReport.AssertThat(report1, (a) => a.HasStatus(ValidationReport.ValidationResult.VALID).HasNumberOfLogs + (4).HasNumberOfFailures(0).HasLogItem((al) => al.WithCheckName(DocumentRevisionsValidator.DOC_MDP_CHECK + ).WithMessage(DocumentRevisionsValidator.UNEXPECTED_ENTRY_IN_XREF, (i) => 17).WithStatus(ReportItem.ReportItemStatus + .INFO)).HasLogItem((al) => al.WithCheckName(SignatureValidator.SIGNATURE_VERIFICATION).WithMessage(SignatureValidator + .VALIDATING_SIGNATURE_NAME, (p) => "Signature1")).HasLogItems(2, (al) => al.WithCertificate(rootCert). + WithCheckName(CertificateChainValidator.CERTIFICATE_CHECK).WithMessage(CertificateChainValidator.CERTIFICATE_TRUSTED + , (i) => rootCert.GetSubjectDN()))); + AssertValidationReport.AssertThat(report2, (a) => a.HasStatus(ValidationReport.ValidationResult.INVALID).HasNumberOfLogs + (4).HasNumberOfFailures(1).HasLogItem((al) => al.WithCheckName(DocumentRevisionsValidator.DOC_MDP_CHECK + ).WithMessage(DocumentRevisionsValidator.PAGE_ANNOTATIONS_MODIFIED).WithStatus(ReportItem.ReportItemStatus + .INVALID)).HasLogItem((al) => al.WithCheckName(SignatureValidator.SIGNATURE_VERIFICATION).WithMessage( + SignatureValidator.VALIDATING_SIGNATURE_NAME, (p) => "Signature2")).HasLogItems(2, (al) => al.WithCertificate + (rootCert).WithCheckName(CertificateChainValidator.CERTIFICATE_CHECK).WithMessage(CertificateChainValidator + .CERTIFICATE_TRUSTED, (i) => rootCert.GetSubjectDN()))); + } + + [NUnit.Framework.Test] + public virtual void ValidateSingleSignatureTest2() { + String rootCertName = CERTS_SRC + "root_cert.pem"; + IX509Certificate rootCert = (IX509Certificate)PemFileHelper.ReadFirstChain(rootCertName)[0]; + ValidationReport report1; + ValidationReport report2; + using (PdfDocument document = new PdfDocument(new PdfReader(SOURCE_FOLDER + "validateSingleSignature2.pdf" + ))) { + certificateRetriever.SetTrustedCertificates(JavaCollectionsUtil.SingletonList(rootCert)); + AddRevDataClients(); + SignatureValidator signatureValidator1 = builder.BuildSignatureValidator(document); + report1 = signatureValidator1.ValidateSignature("Signature1"); + SignatureValidator signatureValidator2 = builder.BuildSignatureValidator(document); + report2 = signatureValidator2.ValidateSignature("Signature2"); + } + // Signature1 set access permissions to level 1, after that annotation was added and then Signature2 applied. + AssertValidationReport.AssertThat(report1, (a) => a.HasStatus(ValidationReport.ValidationResult.INVALID).HasNumberOfFailures + (3).HasLogItem((al) => al.WithCheckName(DocumentRevisionsValidator.DOC_MDP_CHECK).WithMessage(DocumentRevisionsValidator + .PAGE_ANNOTATIONS_MODIFIED).WithStatus(ReportItem.ReportItemStatus.INVALID)).HasLogItem((al) => al.WithCheckName + (DocumentRevisionsValidator.DOC_MDP_CHECK).WithMessage(DocumentRevisionsValidator.UNEXPECTED_FORM_FIELD + , (p) => "Signature2").WithStatus(ReportItem.ReportItemStatus.INVALID)).HasLogItem((al) => al.WithCheckName + (DocumentRevisionsValidator.DOC_MDP_CHECK).WithMessage(DocumentRevisionsValidator.NOT_ALLOWED_ACROFORM_CHANGES + ).WithStatus(ReportItem.ReportItemStatus.INVALID)).HasLogItem((al) => al.WithCheckName(SignatureValidator + .SIGNATURE_VERIFICATION).WithMessage(SignatureValidator.VALIDATING_SIGNATURE_NAME, (p) => "Signature1" + ))); + AssertValidationReport.AssertThat(report2, (a) => a.HasStatus(ValidationReport.ValidationResult.VALID).HasNumberOfFailures + (0).HasLogItem((al) => al.WithCheckName(SignatureValidator.SIGNATURE_VERIFICATION).WithMessage(SignatureValidator + .VALIDATING_SIGNATURE_NAME, (p) => "Signature2"))); + } + [NUnit.Framework.Test] public virtual void RetrieveRevocationDataFromTheSignatureContainerTest() { String rootCertName = CERTS_SRC + "rootRsa.pem"; diff --git a/itext.tests/itext.sign.tests/itext/signatures/validation/v1/SignatureValidatorTest.cs b/itext.tests/itext.sign.tests/itext/signatures/validation/v1/SignatureValidatorTest.cs index b89645c76d..8e4f0987eb 100644 --- a/itext.tests/itext.sign.tests/itext/signatures/validation/v1/SignatureValidatorTest.cs +++ b/itext.tests/itext.sign.tests/itext/signatures/validation/v1/SignatureValidatorTest.cs @@ -29,6 +29,7 @@ You should have received a copy of the GNU Affero General Public License using iText.Commons.Bouncycastle.Crypto; using iText.Commons.Bouncycastle.Security; using iText.Commons.Utils; +using iText.Kernel.Exceptions; using iText.Kernel.Pdf; using iText.Signatures.Testutils; using iText.Signatures.Testutils.Builder; @@ -367,8 +368,6 @@ public virtual void TimeStampChainValidatorFailureTest() { String chainName = CERTS_SRC + "validCertsChain.pem"; IX509Certificate[] certificateChain = PemFileHelper.ReadFirstChain(chainName); IX509Certificate rootCert = (IX509Certificate)certificateChain[2]; - IX509Certificate intermediateCert = (IX509Certificate)certificateChain[1]; - IX509Certificate signCert = (IX509Certificate)certificateChain[0]; using (PdfDocument document = new PdfDocument(new PdfReader(SOURCE_FOLDER + "timestampSignatureDoc.pdf"))) { mockCertificateRetriever.SetTrustedCertificates(JavaCollectionsUtil.SingletonList(rootCert)); mockCertificateChainValidator.OnCallDo((c) => { @@ -453,5 +452,32 @@ public virtual void DocumentRevisionValidatorFailureTest() { ))); } } + + [NUnit.Framework.Test] + public virtual void ThrowExceptionOnTheSecondValidationAttempt() { + using (PdfDocument document = new PdfDocument(new PdfReader(SOURCE_FOLDER + "timestampSignatureDoc.pdf"))) { + SignatureValidator signatureValidator = builder.BuildSignatureValidator(document); + signatureValidator.ValidateSignatures(); + Exception exception = NUnit.Framework.Assert.Catch(typeof(PdfException), () => signatureValidator.ValidateSignatures + ()); + NUnit.Framework.Assert.AreEqual(SignatureValidator.VALIDATION_PERFORMED, exception.Message); + exception = NUnit.Framework.Assert.Catch(typeof(PdfException), () => signatureValidator.ValidateSignature( + "Signature1")); + NUnit.Framework.Assert.AreEqual(SignatureValidator.VALIDATION_PERFORMED, exception.Message); + } + } + + [NUnit.Framework.Test] + public virtual void SignatureWithSpecifiedNameNotFound() { + ValidationReport report; + using (PdfDocument document = new PdfDocument(new PdfReader(SOURCE_FOLDER + "timestampSignatureDoc.pdf"))) { + SignatureValidator signatureValidator = builder.BuildSignatureValidator(document); + report = signatureValidator.ValidateSignature("Invalid signature name"); + } + AssertValidationReport.AssertThat(report, (a) => a.HasStatus(ValidationReport.ValidationResult.INDETERMINATE + ).HasNumberOfLogs(1).HasNumberOfFailures(1).HasLogItem((l) => l.WithCheckName(SignatureValidator.SIGNATURE_VERIFICATION + ).WithMessage(SignatureValidator.SIGNATURE_NOT_FOUND, (p) => "Invalid signature name").WithStatus(ReportItem.ReportItemStatus + .INDETERMINATE))); + } } } diff --git a/itext.tests/itext.sign.tests/itext/signatures/verify/pdfinsecurity/IncrementalSavingAttackTest.cs b/itext.tests/itext.sign.tests/itext/signatures/verify/pdfinsecurity/IncrementalSavingAttackTest.cs index 5d158702e8..87c26a3581 100644 --- a/itext.tests/itext.sign.tests/itext/signatures/verify/pdfinsecurity/IncrementalSavingAttackTest.cs +++ b/itext.tests/itext.sign.tests/itext/signatures/verify/pdfinsecurity/IncrementalSavingAttackTest.cs @@ -39,7 +39,7 @@ public static void Before() { } [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] public virtual void TestISA03() { String filePath = sourceFolder + "isa-3.pdf"; String signatureName = "Signature1"; diff --git a/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/RevocationDataValidatorTest/noRevAvailCert.pem b/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/RevocationDataValidatorTest/noRevAvailCert.pem new file mode 100644 index 0000000000..1b86f4122b --- /dev/null +++ b/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/RevocationDataValidatorTest/noRevAvailCert.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIDijCCAnKgAwIBAgIGAZDC/HsyMA0GCSqGSIb3DQEBCwUAMDgxCzAJBgNVBAYTAkJZMQ4wDAYD +VQQKDAVpVGV4dDEZMBcGA1UEAwwQaVRleHRUZXN0Um9vdFJzYTAgFw0yNDA3MTcyMzE3MjRaGA8y +MTI0MDYyMzIzMTcyNFowPTEcMBoGA1UEAwwTaVRleHRUZXN0Tm9SZXZBdmFpbDENMAsGA1UECwwE +dGVzdDEOMAwGA1UECgwFaVRleHQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCc9FG+ +7SqyynBdYM3sOxE8ls7lnlmNlyiHhIka7BjDlwu+7ANUta/a2xh5M3SGFJqyOQ9Z21SFyJ3/XRcQ +bvpn454ltu6QS0cusqKL3ipkF58v/shBBlxj/w+oGC+mkJiV8kKYA1n672aI04BZi0SI3dGWLxn9 +S90y6ewXYGAx+/mdPLxwtQWF67UZRfvyTSGRpRFgjSZLHrDydvp0UrbsZLFtJIsZm2kV/ALiX9Xj +BAD2ZdPa7vGfek695dOX03J/WsT/rBggRGKT9qxZMhBVzamdUV4y3bXnqcB7fPpqtVdYslBLKJaj +2XnBnfUrMUGv/DeBeK8KOjv91xBLRwczAgMBAAGjgZIwgY8wDwYDVR0TAQH/BAUwAwEB/zAPBgkr +BgEFBQcwAQUEAgUAMAsGA1UdDwQEAwIGwDATBgNVHSUEDDAKBggrBgEFBQcDCTAJBgNVHTgEAgUA +MB8GA1UdIwQYMBaAFCmDtomMMsK6Vi+UTmnCrNwKNIVBMB0GA1UdDgQWBBQpg7aJjDLCulYvlE5p +wqzcCjSFQTANBgkqhkiG9w0BAQsFAAOCAQEAQnCZWiSh43VOvCRNIo2/Iy6bNgqGEVTRpIo7c7i2 +pLBoln0LwSZq8qscba+0EZ16U6JRxpJ2qsQ1qSWCiv4OfwGDxqOKJT8EJxpR8MYjj2UVKHKPHdPI +cP2SWRNTxelVLg3A5Twgf/LhDXSUMXVmZ7oViYt/hQc37+tcmVmyHAfEkPnx0d8VQcpmS3TuF2/u +QfxtyRekPMAAmlYshwjeEGQ7tzO6QKdEvony+jSia+wnAvO/jyYVin17afwMcPYqEpQCXN0xC8QL +Im+4nIdVbeIVLkUD9wWmZyDulX6YCQwFkYqUnK9mop3nqNCYXxppKfdNYMk3MiPzPsFuCyapfQ== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/RevocationDataValidatorTest/noRevAvailCertWithoutCA.pem b/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/RevocationDataValidatorTest/noRevAvailCertWithoutCA.pem new file mode 100644 index 0000000000..fdc4799d97 --- /dev/null +++ b/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/RevocationDataValidatorTest/noRevAvailCertWithoutCA.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIDgTCCAmmgAwIBAgIGAZDFnFH8MA0GCSqGSIb3DQEBCwUAMDgxCzAJBgNVBAYTAkJZMQ4wDAYD +VQQKDAVpVGV4dDEZMBcGA1UEAwwQaVRleHRUZXN0Um9vdFJzYTAgFw0yNDA3MTgxMTMxMTRaGA8y +MTI0MDYyNDExMzExNFowRjElMCMGA1UEAwwcaVRleHRUZXN0Tm9SZXZBdmFpbFdpdGhvdXRDQTEN +MAsGA1UECwwEdGVzdDEOMAwGA1UECgwFaVRleHQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCNLM4D1cmHha3WodOrf6DmKsSIDNMP/FlUXWnbIqDQ3dbeb/JwHKVe2UicPzqZq5Ees6Qq +Pg8z9TzT/YRQDQglci3v82yn3ufy5REw7dGaGzoHU/vgCeDlygRd25tbhdsLfIfedKtz0tQIbJab +0jFlvvzgrmY6Q4Pk22IF5ujQE+N/z4ft8xs5BuII8szCaAacV6MsswzqeNbfYhmnmbs+25fZD0qs +wlVsO9OjVOqLlDVQAeSIO7ip1Ws/6LBG8fAjXsPm0BX7a1MxkyDsrUUFWfq3Pz2aK7DW1F34MPWE +YX0LAFIP269fG+S91fVtrw8b7b8WBQxWi8jv4OOl6kkTAgMBAAGjgYAwfjAPBgkrBgEFBQcwAQUE +AgUAMAsGA1UdDwQEAwIGwDATBgNVHSUEDDAKBggrBgEFBQcDCTAJBgNVHTgEAgUAMB8GA1UdIwQY +MBaAFCmDtomMMsK6Vi+UTmnCrNwKNIVBMB0GA1UdDgQWBBQpg7aJjDLCulYvlE5pwqzcCjSFQTAN +BgkqhkiG9w0BAQsFAAOCAQEAK93ANxcNwQCqM/ZDqcpkHtk+fXcKFLgSkpAQWxWjxEeumlRD61Yi +8dJ6VfIy95Flh4Kbg6EH1UsrkiquOQ2+k/V1oE5hJu7RT7RqSDu3VCcMAtekRwdfY6AGCX/9IHqE +CazzShdcCr/YZ2jz3Uy/kr6/fu4sq1enAunsM6WMuO7bZU/WYimzHu9TTRQ00oFjCW5s3TFgP3HV +BfaL4oSh7Ksvjsu2ZqjwFb8J5DT/oObIdeAw/Pl3NShjALbQ5PJkzkLp00FcT4A1ItKkW+p/xwPk +QCR2NnYjIk9yvhFgse5/VrYkNlJEknzN4upJ2ldVCC2F5yVyQ+mG7b8l7MgEKA== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/SignatureValidatorIntegrationTest/certs/root_cert.pem b/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/SignatureValidatorIntegrationTest/certs/root_cert.pem new file mode 100644 index 0000000000..9e88d77c4c --- /dev/null +++ b/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/SignatureValidatorIntegrationTest/certs/root_cert.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDSzCCAjOgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwNTELMAkGA1UEBhMCQkUx +DjAMBgNVBAoMBWlUZXh0MRYwFAYDVQQDDA1pVGV4dFRlc3RSb290MCAXDTAwMDEw +MTAwMDAwMFoYDzI1MDAwMTAxMDAwMDAwWjA1MQswCQYDVQQGEwJCRTEOMAwGA1UE +CgwFaVRleHQxFjAUBgNVBAMMDWlUZXh0VGVzdFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCu7i/J0WEuTz8rwYTkQsAAwarnoiSYxEdolqz2b5jl +nSDjPs0uifW2bChiWWkGMeHgAtXl6NsaCaSR7UvgzZ2ah1PtyJ4IaYEG5uXsPH8L +X+m5BHt9RmplVYIYPFejb6ffdtpeCnwk7EPpd6UAc1WbFA6WwyEOG0D6HvjTRjW4 +OOIn48XVN8HzpGMvO9Afz5tunPuDCxhcdNGMn6BvBHJ9fLcl5xbyzURwUm4cE35V +q2RzbFfxsOh3saU2FHYY9w7Vh6VcOPPlP1RMARVP9KLt36mQlLfgPxW4xU3v97Ji +6NmkB7rbEi58jtrLs6T0FEPGkf2YFU451mFFqeVnLfh/AgMBAAGjYzBhMB0GA1Ud +DgQWBBTJedkaWwgZlvir4jCx+E02XFK+RjAfBgNVHSMEGDAWgBTJedkaWwgZlvir +4jCx+E02XFK+RjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB5jANBgkq +hkiG9w0BAQsFAAOCAQEAQ+M7mqNO3sLxIM+TzG2tHIgKPke5Bju1s+/tk6b8rY65 +9CLYNtQYakturcq5ApjOk/1WvPEcypiRze6Jy+i6/38Fi0VeRi6fN0z4EMa7/6lL +P63QTkZ1BRI9OiP+p0dOCY2hUyjOvJ9mEJH1H6rFLONwgKIWInIBFh9zIkE7Qn98 +G/1+ebUXGkarlENknUcgMWgG0B9lSroC+as0TPt3N2HnYYoUIg8iIIk2kEan8iwx +n3FKAKDDHWB+9B1H49yY5YwGjXNo7XJsk6hmR97CMRmnKLnlaklKu4l2C2E/mnDb +6Mq9vMmwK6+VJZB75423I/7WvsX9QvNK+kti/xNIpg== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/SignatureValidatorIntegrationTest/validateSingleSignature1.pdf b/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/SignatureValidatorIntegrationTest/validateSingleSignature1.pdf new file mode 100644 index 0000000000..218e5a36cb Binary files /dev/null and b/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/SignatureValidatorIntegrationTest/validateSingleSignature1.pdf differ diff --git a/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/SignatureValidatorIntegrationTest/validateSingleSignature2.pdf b/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/SignatureValidatorIntegrationTest/validateSingleSignature2.pdf new file mode 100644 index 0000000000..fe7b0c6a0d Binary files /dev/null and b/itext.tests/itext.sign.tests/resources/itext/signatures/validation/v1/SignatureValidatorIntegrationTest/validateSingleSignature2.pdf differ diff --git a/itext/itext.io/itext/io/logs/IoLogMessageConstant.cs b/itext/itext.io/itext/io/logs/IoLogMessageConstant.cs index 8674f1d709..9c56db1b7e 100644 --- a/itext/itext.io/itext/io/logs/IoLogMessageConstant.cs +++ b/itext/itext.io/itext/io/logs/IoLogMessageConstant.cs @@ -372,7 +372,10 @@ public const String IMAGE_HAS_INCORRECT_OR_UNSUPPORTED_BASE_COLOR_SPACE_IN_INDEX // replaced by com.itextpdf.kernel.logs.KernelLogMessageConstant#XOBJECT_STRUCT_PARENT_INDEX_MISSED_AND_RECREATED "XObject has no StructParents entry in its stream, no " + "entry in ParentTree will be created for the corresponding structure elements"; - public const String XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT = "Error occurred while reading cross reference table. Cross reference table will be rebuilt."; + public const String XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT = "Error occurred while " + "reading cross reference table. Cross reference table will be rebuilt. No additional information available"; + + public const String XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE = "Error occurred while " + + "reading cross reference table. Cross reference table will be rebuilt. Reason: {0}"; private IoLogMessageConstant() { } diff --git a/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs b/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs index 1d3298e591..f833553255 100644 --- a/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs +++ b/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs @@ -282,7 +282,7 @@ public const String CONTENT_STREAM_MUST_NOT_INVOKE_OPERATORS_THAT_SPECIFY_COLORS public const String INVALID_CROSS_REFERENCE_ENTRY_IN_THIS_XREF_SUBSECTION = "Invalid cross reference entry " + "in this xref subsection."; - public const String INVALID_INDIRECT_REFERENCE = "Invalid indirect reference {0}."; + public const String INVALID_INDIRECT_REFERENCE = "Invalid indirect reference {0} {1} R."; public const String INVALID_INPUT_FOR_TYPE_2_FUNCTION = "Invalid input value for PDF Type 2 Function, value should be a single number."; diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs b/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs index 4c0eb3f76c..7e2098550b 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs @@ -804,8 +804,7 @@ protected internal virtual void ReadPdf() { } catch (Exception ex) { if (PdfReader.StrictnessLevel.CONSERVATIVE.IsStricter(this.GetStrictnessLevel())) { - ILogger logger = ITextLogManager.GetLogger(typeof(iText.Kernel.Pdf.PdfReader)); - logger.LogError(ex, iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT); + LogXrefException(ex); RebuildXref(); } else { @@ -917,8 +916,8 @@ protected internal virtual PdfObject ReadReference(bool readAsDirect) { return CreatePdfNullInstance(readAsDirect); } else { - throw new PdfException(KernelExceptionMessageConstant.INVALID_INDIRECT_REFERENCE, MessageFormatUtil.Format - ("{0} {1} R", reference.GetObjNumber(), reference.GetGenNumber())); + throw new PdfException(MessageFormatUtil.Format(KernelExceptionMessageConstant.INVALID_INDIRECT_REFERENCE, + reference.GetObjNumber(), reference.GetGenNumber()), reference); } } } @@ -1737,6 +1736,23 @@ private void ProcessXref(PdfXrefTable xrefTable) { } } + private static void LogXrefException(Exception ex) { + ILogger logger = ITextLogManager.GetLogger(typeof(iText.Kernel.Pdf.PdfReader)); + if (ex.InnerException != null) { + logger.LogError(MessageFormatUtil.Format(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE + , ex.InnerException.Message)); + } + else { + if (ex.Message != null) { + logger.LogError(MessageFormatUtil.Format(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE + , ex.Message)); + } + else { + logger.LogError(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT); + } + } + } + protected internal class ReusableRandomAccessSource : IRandomAccessSource { private ByteBuffer buffer; diff --git a/itext/itext.sign/itext/signatures/OID.cs b/itext/itext.sign/itext/signatures/OID.cs index fac2f1341b..20a268a852 100644 --- a/itext/itext.sign/itext/signatures/OID.cs +++ b/itext/itext.sign/itext/signatures/OID.cs @@ -130,6 +130,10 @@ public sealed class X509Extensions { /// Extension for certificates from ETSI EN 319 412-1 V1.4.4. public const String VALIDITY_ASSURED_SHORT_TERM = "0.4.0.194121.2.1"; + /// Extension for certificates from RFC 9608 which indicates that no revocation information is available. + /// + public const String NO_REV_AVAILABLE = "2.5.29.56"; + /// According to https://tools.ietf.org/html/rfc5280 4.2. /// /// According to https://tools.ietf.org/html/rfc5280 4.2. "Certificate Extensions": diff --git a/itext/itext.sign/itext/signatures/validation/v1/DocumentRevisionsValidator.cs b/itext/itext.sign/itext/signatures/validation/v1/DocumentRevisionsValidator.cs index 761030c79d..ba936a315a 100644 --- a/itext/itext.sign/itext/signatures/validation/v1/DocumentRevisionsValidator.cs +++ b/itext/itext.sign/itext/signatures/validation/v1/DocumentRevisionsValidator.cs @@ -348,6 +348,25 @@ public virtual iText.Signatures.Validation.V1.DocumentRevisionsValidator SetUnex /// public virtual ValidationReport ValidateAllDocumentRevisions(ValidationContext context, PdfDocument document ) { + return ValidateAllDocumentRevisions(context, document, null); + } + +//\cond DO_NOT_DOCUMENT + /// + /// Validate all document revisions according to docMDP and fieldMDP transform methods and collect validation report + /// related to the single signature field checks if specified. + /// + /// the validation context in which to validate document revisions + /// the document to be validated + /// signature field to collect validation result for. If null, all signatures will be checked + /// + /// + /// + /// + /// which contains detailed validation results. + /// + internal virtual ValidationReport ValidateAllDocumentRevisions(ValidationContext context, PdfDocument document + , String signatureName) { ResetClassFields(); ValidationContext localContext = context.SetValidatorContext(ValidatorContext.DOCUMENT_REVISIONS_VALIDATOR ); @@ -375,13 +394,16 @@ public virtual ValidationReport ValidateAllDocumentRevisions(ValidationContext c .INFO)); return report; } - bool signatureFound = false; + bool updateAccessPermissions = true; + bool documentSigned = false; bool certificationSignatureFound = false; - PdfSignature currentSignature = signatureUtil.GetSignature(signatures[0]); + bool collectRevisionsValidationReport = signatureName == null; + String currentSignatureName = signatures[0]; + PdfSignature currentSignature = signatureUtil.GetSignature(currentSignatureName); for (int i = 0; i < documentRevisions.Count; i++) { - if (currentSignature != null && RevisionContainsSignature(documentRevisions[i], signatures[0], document, report - )) { - signatureFound = true; + if (currentSignature != null && RevisionContainsSignature(documentRevisions[i], currentSignatureName, document + , report)) { + documentSigned = true; if (IsCertificationSignature(currentSignature)) { if (certificationSignatureFound) { report.AddReportItem(new ReportItem(DOC_MDP_CHECK, TOO_MANY_CERTIFICATION_SIGNATURES, ReportItem.ReportItemStatus @@ -389,34 +411,48 @@ public virtual ValidationReport ValidateAllDocumentRevisions(ValidationContext c } else { certificationSignatureFound = true; - UpdateCertificationSignatureAccessPermissions(currentSignature, report); + if (updateAccessPermissions) { + UpdateCertificationSignatureAccessPermissions(currentSignature, report); + } } } - UpdateApprovalSignatureAccessPermissions(signatureUtil.GetSignatureFormFieldDictionary(signatures[0]), report - ); - UpdateApprovalSignatureFieldLock(documentRevisions[i], signatureUtil.GetSignatureFormFieldDictionary(signatures - [0]), document, report); + if (updateAccessPermissions) { + UpdateApprovalSignatureAccessPermissions(signatureUtil.GetSignatureFormFieldDictionary(currentSignatureName + ), report); + UpdateApprovalSignatureFieldLock(documentRevisions[i], signatureUtil.GetSignatureFormFieldDictionary(currentSignatureName + ), document, report); + } + if (signatureName != null && signatureName.Equals(currentSignatureName)) { + updateAccessPermissions = false; + collectRevisionsValidationReport = true; + } signatures.JRemoveAt(0); if (signatures.IsEmpty()) { currentSignature = null; } else { - currentSignature = signatureUtil.GetSignature(signatures[0]); + currentSignatureName = signatures[0]; + currentSignature = signatureUtil.GetSignature(currentSignatureName); } } - if (signatureFound && i < documentRevisions.Count - 1) { - ValidateRevision(documentRevisions[i], documentRevisions[i + 1], document, report, localContext); + if (documentSigned && i < documentRevisions.Count - 1) { + ValidationReport validationReport = new ValidationReport(); + ValidateRevision(documentRevisions[i], documentRevisions[i + 1], document, validationReport, localContext); + if (collectRevisionsValidationReport) { + report.Merge(validationReport); + } } if (StopValidation(report, localContext)) { break; } } - if (!signatureFound) { + if (!documentSigned) { report.AddReportItem(new ReportItem(DOC_MDP_CHECK, SIGNATURE_REVISION_NOT_FOUND, ReportItem.ReportItemStatus .INVALID)); } return report; } +//\endcond //\cond DO_NOT_DOCUMENT internal virtual void ValidateRevision(DocumentRevision previousRevision, DocumentRevision currentRevision diff --git a/itext/itext.sign/itext/signatures/validation/v1/RevocationDataValidator.cs b/itext/itext.sign/itext/signatures/validation/v1/RevocationDataValidator.cs index 12dcdaa265..7ad381561c 100644 --- a/itext/itext.sign/itext/signatures/validation/v1/RevocationDataValidator.cs +++ b/itext/itext.sign/itext/signatures/validation/v1/RevocationDataValidator.cs @@ -58,6 +58,16 @@ public class RevocationDataValidator { internal const String VALIDITY_ASSURED = "Certificate is trusted due to validity assured - short term extension."; //\endcond +//\cond DO_NOT_DOCUMENT + internal const String NO_REV_AVAILABLE = "noRevAvail extension from RFC 9608 is present on {0} certificate. " + + "Revocation data checks are not required."; +//\endcond + +//\cond DO_NOT_DOCUMENT + internal const String NO_REV_AVAILABLE_CA = "noRevAvail extension from RFC 9608 is present on {0} certificate, " + + "however this certificate is a CA, which is not allowed."; +//\endcond + //\cond DO_NOT_DOCUMENT internal const String CANNOT_PARSE_OCSP = "OCSP response from \"{0}\" OCSP response cannot be parsed."; //\endcond @@ -184,6 +194,17 @@ public virtual void Validate(ValidationReport report, ValidationContext context, .INFO)); return; } + if (CertificateUtil.GetExtensionValueByOid(certificate, OID.X509Extensions.NO_REV_AVAILABLE) != null) { + if (certificate.GetBasicConstraints() < 0) { + report.AddReportItem(new CertificateReportItem(certificate, REVOCATION_DATA_CHECK, MessageFormatUtil.Format + (NO_REV_AVAILABLE, certificate.GetSubjectDN()), ReportItem.ReportItemStatus.INFO)); + } + else { + report.AddReportItem(new CertificateReportItem(certificate, REVOCATION_DATA_CHECK, MessageFormatUtil.Format + (NO_REV_AVAILABLE_CA, certificate.GetSubjectDN()), ReportItem.ReportItemStatus.INDETERMINATE)); + } + return; + } if (CertificateSource.OCSP_ISSUER == localContext.GetCertificateSource()) { // Check if Authorised OCSP Responder certificate has id-pkix-ocsp-nocheck extension, in which case we // do not perform revocation check for it. diff --git a/itext/itext.sign/itext/signatures/validation/v1/SignatureValidator.cs b/itext/itext.sign/itext/signatures/validation/v1/SignatureValidator.cs index 2c361986ac..ccc5011bea 100644 --- a/itext/itext.sign/itext/signatures/validation/v1/SignatureValidator.cs +++ b/itext/itext.sign/itext/signatures/validation/v1/SignatureValidator.cs @@ -32,6 +32,7 @@ You should have received a copy of the GNU Affero General Public License using iText.Commons.Bouncycastle.Cert.Ocsp; using iText.Commons.Bouncycastle.Security; using iText.Commons.Utils; +using iText.Kernel.Exceptions; using iText.Kernel.Pdf; using iText.Signatures; using iText.Signatures.Validation.V1.Context; @@ -98,6 +99,14 @@ public class SignatureValidator { internal const String ADD_KNOWN_CERTIFICATES_FAILED = "Unexpected exception occurred adding known certificates to certificate retriever."; //\endcond +//\cond DO_NOT_DOCUMENT + internal const String SIGNATURE_NOT_FOUND = "Document doesn't contain signature field {0}."; +//\endcond + +//\cond DO_NOT_DOCUMENT + internal const String VALIDATION_PERFORMED = "Validation has already been performed. " + "You should create new SignatureValidator instance for each validation call."; +//\endcond + private static readonly IBouncyCastleFactory BOUNCY_CASTLE_FACTORY = BouncyCastleFactoryCreator.GetFactory (); @@ -122,6 +131,8 @@ public class SignatureValidator { private ValidationCrlClient validationCrlClient; + private bool validationPerformed = false; + /// /// Creates new instance of /// . @@ -170,6 +181,10 @@ public virtual iText.Signatures.Validation.V1.SignatureValidator SetEventCountin /// which contains detailed validation results /// public virtual ValidationReport ValidateSignatures() { + if (validationPerformed) { + throw new PdfException(VALIDATION_PERFORMED); + } + validationPerformed = true; ValidationReport report = new ValidationReport(); SafeCalling.OnRuntimeExceptionLog(() => { documentRevisionsValidator.SetEventCountingMetaInfo(metaInfo); @@ -182,30 +197,34 @@ public virtual ValidationReport ValidateSignatures() { if (StopValidation(report, validationContext)) { return report; } - SignatureUtil util = new SignatureUtil(originalDocument); - IList signatureNames = util.GetSignatureNames(); - JavaCollectionsUtil.Reverse(signatureNames); - foreach (String fieldName in signatureNames) { - try { - using (PdfDocument doc = new PdfDocument(new PdfReader(util.ExtractRevision(fieldName)), new DocumentProperties - ().SetEventCountingMetaInfo(metaInfo))) { - ValidationReport subReport = ValidateLatestSignature(doc); - report.Merge(subReport); - if (StopValidation(report, validationContext)) { - return report; - } - } - } - catch (System.IO.IOException e) { - report.AddReportItem(new ReportItem(SIGNATURE_VERIFICATION, REVISIONS_RETRIEVAL_FAILED, e, ReportItem.ReportItemStatus - .INDETERMINATE)); - } - catch (Exception e) { - report.AddReportItem(new ReportItem(SIGNATURE_VERIFICATION, REVISIONS_RETRIEVAL_FAILED, e, ReportItem.ReportItemStatus - .INDETERMINATE)); - } + return report.Merge(Validate(null)); + } + + /// Validate single signature in the document. + /// name of the signature to validate + /// + /// + /// + /// which contains detailed validation results. + /// + public virtual ValidationReport ValidateSignature(String signatureName) { + if (validationPerformed) { + throw new PdfException(VALIDATION_PERFORMED); } - return report; + validationPerformed = true; + ValidationReport report = new ValidationReport(); + SafeCalling.OnRuntimeExceptionLog(() => { + documentRevisionsValidator.SetEventCountingMetaInfo(metaInfo); + ValidationReport revisionsValidationReport = documentRevisionsValidator.ValidateAllDocumentRevisions(validationContext + , originalDocument, signatureName); + report.Merge(revisionsValidationReport); + } + , report, (e) => new ReportItem(SIGNATURE_VERIFICATION, REVISIONS_VALIDATION_FAILED, e, ReportItem.ReportItemStatus + .INDETERMINATE)); + if (StopValidation(report, validationContext)) { + return report; + } + return report.Merge(Validate(signatureName)); } //\cond DO_NOT_DOCUMENT @@ -267,6 +286,47 @@ internal virtual ValidationReport ValidateLatestSignature(PdfDocument document) } //\endcond + private ValidationReport Validate(String signatureName) { + ValidationReport validationReport = new ValidationReport(); + bool validateSingleSignature = signatureName != null; + SignatureUtil util = new SignatureUtil(originalDocument); + IList signatureNames = util.GetSignatureNames(); + JavaCollectionsUtil.Reverse(signatureNames); + foreach (String fieldName in signatureNames) { + ValidationReport subReport = new ValidationReport(); + try { + using (PdfDocument doc = new PdfDocument(new PdfReader(util.ExtractRevision(fieldName)), new DocumentProperties + ().SetEventCountingMetaInfo(metaInfo))) { + subReport.Merge(ValidateLatestSignature(doc)); + } + } + catch (System.IO.IOException e) { + subReport.AddReportItem(new ReportItem(SIGNATURE_VERIFICATION, REVISIONS_RETRIEVAL_FAILED, e, ReportItem.ReportItemStatus + .INDETERMINATE)); + } + catch (Exception e) { + subReport.AddReportItem(new ReportItem(SIGNATURE_VERIFICATION, REVISIONS_RETRIEVAL_FAILED, e, ReportItem.ReportItemStatus + .INDETERMINATE)); + } + if (!validateSingleSignature) { + validationReport.Merge(subReport); + if (StopValidation(subReport, validationContext)) { + return validationReport; + } + } + else { + if (fieldName.Equals(signatureName)) { + return subReport; + } + } + } + if (validateSingleSignature) { + validationReport.AddReportItem(new ReportItem(SIGNATURE_VERIFICATION, MessageFormatUtil.Format(SIGNATURE_NOT_FOUND + , signatureName), ReportItem.ReportItemStatus.INDETERMINATE)); + } + return validationReport; + } + private void FindValidationClients() { foreach (IOcspClient ocspClient in this.properties.GetOcspClients()) { if (ocspClient.GetType() == typeof(ValidationOcspClient)) { diff --git a/port-hash b/port-hash index 1238437b63..5cce292597 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -f70a9d7d2fd9a989a71f54a8722203acb5f13c28 +9edc3b01ab28f67c9c46fdfeec48979abad3fd26