Skip to content

Commit 4314648

Browse files
dzmitry.kachkouiText-CI
authored andcommitted
Add check for pdf names in pdfa
DEVSIX-4048 Autoported commit. Original commit hash: [e7a1b1f99]
1 parent 0761a0c commit 4314648

File tree

6 files changed

+114
-9
lines changed

6 files changed

+114
-9
lines changed

itext.tests/itext.pdfa.tests/itext/pdfa/checker/PdfA1ImplementationLimitsCheckerTest.cs

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,17 @@ public virtual void Before() {
6666

6767
[NUnit.Framework.Test]
6868
public virtual void ValidObjectsTest() {
69+
int maxNameLength = pdfA1Checker.GetMaxNameLength();
6970
int maxStringLength = pdfA1Checker.GetMaxStringLength();
7071
int maxArrayCapacity = MAX_ARRAY_CAPACITY;
7172
int maxDictionaryCapacity = MAX_DICTIONARY_CAPACITY;
7273
long maxIntegerValue = pdfA1Checker.GetMaxIntegerValue();
7374
long minIntegerValue = pdfA1Checker.GetMinIntegerValue();
7475
double maxRealValue = pdfA1Checker.GetMaxRealValue();
7576
NUnit.Framework.Assert.AreEqual(65535, maxStringLength);
77+
NUnit.Framework.Assert.AreEqual(127, maxNameLength);
7678
PdfString longString = PdfACheckerTestUtils.GetLongString(maxStringLength);
79+
PdfName longName = PdfACheckerTestUtils.GetLongName(maxNameLength);
7780
PdfArray longArray = PdfACheckerTestUtils.GetLongArray(maxArrayCapacity);
7881
PdfDictionary longDictionary = PdfACheckerTestUtils.GetLongDictionary(maxDictionaryCapacity);
7982
NUnit.Framework.Assert.AreEqual(2147483647, maxIntegerValue);
@@ -82,8 +85,8 @@ public virtual void ValidObjectsTest() {
8285
PdfNumber largeInteger = new PdfNumber(maxIntegerValue);
8386
PdfNumber negativeInteger = new PdfNumber(minIntegerValue);
8487
PdfNumber largeReal = new PdfNumber(maxRealValue - 0.001);
85-
PdfObject[] largeObjects = new PdfObject[] { longString, longArray, longDictionary, largeInteger, negativeInteger
86-
, largeReal };
88+
PdfObject[] largeObjects = new PdfObject[] { longName, longString, longArray, longDictionary, largeInteger
89+
, negativeInteger, largeReal };
8790
// No exceptions should not be thrown as all values match the
8891
// limitations provided in specification
8992
foreach (PdfObject largeObject in largeObjects) {
@@ -120,6 +123,18 @@ public virtual void IndependentLongStringTest() {
120123
;
121124
}
122125

126+
[NUnit.Framework.Test]
127+
public virtual void IndependentLongNameTest() {
128+
NUnit.Framework.Assert.That(() => {
129+
PdfName longName = BuildLongName();
130+
// An exception should be thrown as provided name is longer then
131+
// it is allowed per specification
132+
pdfA1Checker.CheckPdfObject(longName);
133+
}
134+
, NUnit.Framework.Throws.InstanceOf<PdfAConformanceException>().With.Message.EqualTo(PdfAConformanceException.PDF_NAME_IS_TOO_LONG))
135+
;
136+
}
137+
123138
[NUnit.Framework.Test]
124139
public virtual void IndependentLargeIntegerTest() {
125140
NUnit.Framework.Assert.That(() => {
@@ -200,6 +215,22 @@ public virtual void LongStringInDictionaryTest() {
200215
;
201216
}
202217

218+
[NUnit.Framework.Test]
219+
public virtual void LongNameAsKeyInDictionaryTest() {
220+
NUnit.Framework.Assert.That(() => {
221+
PdfName longName = BuildLongName();
222+
PdfDictionary dict = new PdfDictionary();
223+
dict.Put(new PdfName("Key1"), new PdfString("value1"));
224+
dict.Put(new PdfName("Key2"), new PdfString("value2"));
225+
dict.Put(longName, new PdfString("value3"));
226+
// An exception should be thrown as dictionary contains key which is longer then
227+
// it is allowed per specification
228+
pdfA1Checker.CheckPdfObject(dict);
229+
}
230+
, NUnit.Framework.Throws.InstanceOf<PdfAConformanceException>().With.Message.EqualTo(PdfAConformanceException.PDF_NAME_IS_TOO_LONG))
231+
;
232+
}
233+
203234
[NUnit.Framework.Test]
204235
public virtual void LongStringInArrayTest() {
205236
NUnit.Framework.Assert.That(() => {
@@ -224,6 +255,18 @@ public virtual void LongStringInContentStreamTest() {
224255
;
225256
}
226257

258+
[NUnit.Framework.Test]
259+
public virtual void LongNameInContentStreamTest() {
260+
NUnit.Framework.Assert.That(() => {
261+
PdfName longName = BuildLongName();
262+
// An exception should be thrown as content stream has a name which
263+
// is longer then it is allowed per specification
264+
CheckInContentStream(longName);
265+
}
266+
, NUnit.Framework.Throws.InstanceOf<PdfAConformanceException>().With.Message.EqualTo(PdfAConformanceException.PDF_NAME_IS_TOO_LONG))
267+
;
268+
}
269+
227270
[NUnit.Framework.Test]
228271
public virtual void LargeIntegerInContentStreamTest() {
229272
NUnit.Framework.Assert.That(() => {
@@ -327,6 +370,22 @@ public virtual void LongStringInDictionaryInContentStreamTest() {
327370
;
328371
}
329372

373+
[NUnit.Framework.Test]
374+
public virtual void LongNameAsKeyInDictionaryInContentStreamTest() {
375+
NUnit.Framework.Assert.That(() => {
376+
PdfName longName = BuildLongName();
377+
PdfDictionary dict = new PdfDictionary();
378+
dict.Put(new PdfName("Key1"), new PdfString("value1"));
379+
dict.Put(new PdfName("Key2"), new PdfString("value2"));
380+
dict.Put(longName, new PdfString("value3"));
381+
// An exception should be thrown as content stream has a string which
382+
// is longer then it is allowed per specification
383+
CheckInContentStream(dict);
384+
}
385+
, NUnit.Framework.Throws.InstanceOf<PdfAConformanceException>().With.Message.EqualTo(PdfAConformanceException.PDF_NAME_IS_TOO_LONG))
386+
;
387+
}
388+
330389
[NUnit.Framework.Test]
331390
public virtual void LongStringInComplexStructureTest() {
332391
NUnit.Framework.Assert.That(() => {
@@ -433,6 +492,13 @@ private PdfString BuildLongString() {
433492
return PdfACheckerTestUtils.GetLongString(testLength);
434493
}
435494

495+
private PdfName BuildLongName() {
496+
int maxAllowedLength = pdfA1Checker.GetMaxNameLength();
497+
int testLength = maxAllowedLength + 1;
498+
NUnit.Framework.Assert.AreEqual(128, testLength);
499+
return PdfACheckerTestUtils.GetLongName(testLength);
500+
}
501+
436502
private PdfArray BuildLongArray() {
437503
int testLength = MAX_ARRAY_CAPACITY + 1;
438504
return PdfACheckerTestUtils.GetLongArray(testLength);

itext.tests/itext.pdfa.tests/itext/pdfa/checker/PdfACheckerTestUtils.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,11 @@ private PdfACheckerTestUtils() {
5050
}
5151

5252
internal static PdfString GetLongString(int length) {
53-
char charToFill = 'A';
54-
char[] array = new char[length];
55-
for (int i = 0; i < array.Length; i++) {
56-
array[i] = charToFill;
57-
}
58-
return new PdfString(new String(array));
53+
return new PdfString(GetLongPlainString(length));
54+
}
55+
56+
internal static PdfName GetLongName(int length) {
57+
return new PdfName(GetLongPlainString(length));
5958
}
6059

6160
internal static PdfArray GetLongArray(int length) {
@@ -89,5 +88,14 @@ internal static String GetStreamWithValue(PdfObject @object) {
8988
return "q\n" + "BT\n" + "/F1 12 Tf\n" + "36 787.96 Td\n" + iText.IO.Util.JavaUtil.GetStringForBytes(baos.ToArray
9089
()) + " Tj\n" + "ET\n" + "Q";
9190
}
91+
92+
private static String GetLongPlainString(int length) {
93+
char charToFill = 'A';
94+
char[] array = new char[length];
95+
for (int i = 0; i < array.Length; i++) {
96+
array[i] = charToFill;
97+
}
98+
return new String(array);
99+
}
92100
}
93101
}

itext/itext.pdfa/itext/pdfa/PdfAConformanceException.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ public const String ONLY_STANDARD_BLEND_MODES_SHALL_BE_USED_FOR_THE_VALUE_OF_THE
217217
public const String OVERPRINT_MODE_SHALL_NOT_BE_ONE_WHEN_AN_ICCBASED_CMYK_COLOUR_SPACE_IS_USED_AND_WHEN_OVERPRINTING_IS_SET_TO_TRUE
218218
= "Overprint mode shall not be one when an ICCBased CMYK colour space is used and when overprinting is set to true";
219219

220+
public const String PDF_NAME_IS_TOO_LONG = "PdfName is too long";
221+
220222
public const String PDF_STRING_IS_TOO_LONG = "PdfString is too long";
221223

222224
public const String PROFILE_STREAM_OF_OUTPUTINTENT_SHALL_BE_OUTPUT_PROFILE_PRTR_OR_MONITOR_PROFILE_MNTR =

itext/itext.pdfa/itext/pdfa/checker/PdfA1Checker.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,11 @@ protected internal override void CheckContentStream(PdfStream contentStream) {
306306
protected internal override void CheckContentStreamObject(PdfObject @object) {
307307
byte type = @object.GetObjectType();
308308
switch (type) {
309+
case PdfObject.NAME: {
310+
CheckPdfName((PdfName)@object);
311+
break;
312+
}
313+
309314
case PdfObject.STRING: {
310315
CheckPdfString((PdfString)@object);
311316
break;
@@ -328,6 +333,10 @@ protected internal override void CheckContentStreamObject(PdfObject @object) {
328333
case PdfObject.DICTIONARY: {
329334
PdfDictionary dictionary = (PdfDictionary)@object;
330335
CheckPdfDictionary(dictionary);
336+
foreach (PdfName name in dictionary.KeySet()) {
337+
CheckPdfName(name);
338+
CheckPdfObject(dictionary.Get(name, false));
339+
}
331340
foreach (PdfObject obj in dictionary.Values()) {
332341
CheckContentStreamObject(obj);
333342
}
@@ -519,6 +528,18 @@ protected internal override void CheckPdfStream(PdfStream stream) {
519528
}
520529
}
521530

531+
protected internal override void CheckPdfName(PdfName name) {
532+
if (name.GetValue().Length > GetMaxNameLength()) {
533+
throw new PdfAConformanceException(PdfAConformanceException.PDF_NAME_IS_TOO_LONG);
534+
}
535+
}
536+
537+
/// <summary>Retrieve maximum allowed length of the name object.</summary>
538+
/// <returns>maximum allowed length of the name</returns>
539+
protected internal virtual int GetMaxNameLength() {
540+
return 127;
541+
}
542+
522543
protected internal override void CheckPdfString(PdfString @string) {
523544
if (@string.GetValueBytes().Length > GetMaxStringLength()) {
524545
throw new PdfAConformanceException(PdfAConformanceException.PDF_STRING_IS_TOO_LONG);

itext/itext.pdfa/itext/pdfa/checker/PdfAChecker.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,11 @@ public virtual void CheckSinglePage(PdfPage page) {
185185
/// <param name="obj">the COS object that must be checked</param>
186186
public virtual void CheckPdfObject(PdfObject obj) {
187187
switch (obj.GetObjectType()) {
188+
case PdfObject.NAME: {
189+
CheckPdfName((PdfName)obj);
190+
break;
191+
}
192+
188193
case PdfObject.NUMBER: {
189194
CheckPdfNumber((PdfNumber)obj);
190195
break;
@@ -472,6 +477,8 @@ protected internal virtual void CheckContentStreamObject(PdfObject @object) {
472477

473478
protected internal abstract void CheckPdfDictionary(PdfDictionary dictionary);
474479

480+
protected internal abstract void CheckPdfName(PdfName name);
481+
475482
protected internal abstract void CheckPdfNumber(PdfNumber number);
476483

477484
protected internal abstract void CheckPdfStream(PdfStream stream);
@@ -575,6 +582,7 @@ private void CheckArrayRecursively(PdfArray array) {
575582

576583
private void CheckDictionaryRecursively(PdfDictionary dictionary) {
577584
foreach (PdfName name in dictionary.KeySet()) {
585+
CheckPdfName(name);
578586
PdfObject @object = dictionary.Get(name, false);
579587
if (@object != null && !@object.IsIndirect()) {
580588
CheckPdfObject(@object);

port-hash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
fc5d1b27977625c725b308ad6bac076e803637ab
1+
e7a1b1f99b64a4d89ff6c904176928dde2843ac5

0 commit comments

Comments
 (0)