1 // Copyright 2018 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "core/fpdfdoc/cpdf_metadata.h"
6
7 #include "core/fpdfapi/parser/cpdf_stream.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9
TEST(CPDF_MetadataTest,CheckSharedFormEmailAtTopLevel)10 TEST(CPDF_MetadataTest, CheckSharedFormEmailAtTopLevel) {
11 static const char data[] =
12 "<?xml charset=\"utf-8\"?>\n"
13 "<node xmlns:adhocwf=\"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/\">\n"
14 "<adhocwf:workflowType>0</adhocwf:workflowType>\n"
15 "<adhocwf:version>1.1</adhocwf:version>\n"
16 "</node>";
17
18 auto stream = pdfium::MakeRetain<CPDF_Stream>();
19 stream->SetData(ByteStringView(data).raw_span());
20 CPDF_Metadata metadata(stream);
21
22 auto results = metadata.CheckForSharedForm();
23 ASSERT_EQ(1U, results.size());
24 EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormEmail, results[0]);
25 }
26
TEST(CPDF_MetadataTest,CheckSharedFormAcrobatAtTopLevel)27 TEST(CPDF_MetadataTest, CheckSharedFormAcrobatAtTopLevel) {
28 static const char data[] =
29 "<?xml charset=\"utf-8\"?>\n"
30 "<node xmlns:adhocwf=\"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/\">\n"
31 "<adhocwf:workflowType>1</adhocwf:workflowType>\n"
32 "<adhocwf:version>1.1</adhocwf:version>\n"
33 "</node>";
34
35 auto stream = pdfium::MakeRetain<CPDF_Stream>();
36 stream->SetData(ByteStringView(data).raw_span());
37 CPDF_Metadata metadata(stream);
38
39 auto results = metadata.CheckForSharedForm();
40 ASSERT_EQ(1U, results.size());
41 EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormAcrobat, results[0]);
42 }
43
TEST(CPDF_MetadataTest,CheckSharedFormFilesystemAtTopLevel)44 TEST(CPDF_MetadataTest, CheckSharedFormFilesystemAtTopLevel) {
45 static const char data[] =
46 "<?xml charset=\"utf-8\"?>\n"
47 "<node xmlns:adhocwf=\"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/\">\n"
48 "<adhocwf:workflowType>2</adhocwf:workflowType>\n"
49 "<adhocwf:version>1.1</adhocwf:version>\n"
50 "</node>";
51
52 auto stream = pdfium::MakeRetain<CPDF_Stream>();
53 stream->SetData(ByteStringView(data).raw_span());
54 CPDF_Metadata metadata(stream);
55
56 auto results = metadata.CheckForSharedForm();
57 ASSERT_EQ(1U, results.size());
58 EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormFilesystem, results[0]);
59 }
60
TEST(CPDF_MetadataTest,CheckSharedFormWithoutWorkflow)61 TEST(CPDF_MetadataTest, CheckSharedFormWithoutWorkflow) {
62 static const char data[] =
63 "<?xml charset=\"utf-8\"?>\n"
64 "<node xmlns:adhocwf=\"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/\">\n"
65 "<adhocwf:state>2</adhocwf:state>\n"
66 "<adhocwf:version>1.1</adhocwf:version>\n"
67 "</node>";
68
69 auto stream = pdfium::MakeRetain<CPDF_Stream>();
70 stream->SetData(ByteStringView(data).raw_span());
71 CPDF_Metadata metadata(stream);
72
73 auto results = metadata.CheckForSharedForm();
74 EXPECT_EQ(0U, results.size());
75 }
76
TEST(CPDF_MetadataTest,CheckSharedFormAsChild)77 TEST(CPDF_MetadataTest, CheckSharedFormAsChild) {
78 static const char data[] =
79 "<?xml charset=\"utf-8\"?>\n"
80 "<grandparent><parent>\n"
81 "<node xmlns:adhocwf=\"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/\">\n"
82 "<adhocwf:workflowType>0</adhocwf:workflowType>\n"
83 "<adhocwf:version>1.1</adhocwf:version>\n"
84 "</node>"
85 "</parent></grandparent>";
86
87 auto stream = pdfium::MakeRetain<CPDF_Stream>();
88 stream->SetData(ByteStringView(data).raw_span());
89 CPDF_Metadata metadata(stream);
90
91 auto results = metadata.CheckForSharedForm();
92 ASSERT_EQ(1U, results.size());
93 EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormEmail, results[0]);
94 }
95
TEST(CPDF_MetadataTest,CheckSharedFormAsNoAdhoc)96 TEST(CPDF_MetadataTest, CheckSharedFormAsNoAdhoc) {
97 static const char data[] =
98 "<?xml charset=\"utf-8\"?>\n"
99 "<node></node>";
100
101 auto stream = pdfium::MakeRetain<CPDF_Stream>();
102 stream->SetData(ByteStringView(data).raw_span());
103 CPDF_Metadata metadata(stream);
104
105 auto results = metadata.CheckForSharedForm();
106 EXPECT_EQ(0U, results.size());
107 }
108
TEST(CPDF_MetadataTest,CheckSharedFormExceedMaxDepth)109 TEST(CPDF_MetadataTest, CheckSharedFormExceedMaxDepth) {
110 // Node <parent> has the depth of 130, which exceeds the maximum node depth of
111 // `kMaxMetaDataDepth`.
112 static const char kData[] =
113 "<?xml charset=\"utf-8\"?>\n"
114 "<node><node><node><node><node><node><node><node><node><node>\n"
115 "<node><node><node><node><node><node><node><node><node><node>\n"
116 "<node><node><node><node><node><node><node><node><node><node>\n"
117 "<node><node><node><node><node><node><node><node><node><node>\n"
118 "<node><node><node><node><node><node><node><node><node><node>\n"
119 "<node><node><node><node><node><node><node><node><node><node>\n"
120 "<node><node><node><node><node><node><node><node><node><node>\n"
121 "<node><node><node><node><node><node><node><node><node><node>\n"
122 "<node><node><node><node><node><node><node><node><node><node>\n"
123 "<node><node><node><node><node><node><node><node><node><node>\n"
124 "<node><node><node><node><node><node><node><node><node><node>\n"
125 "<node><node><node><node><node><node><node><node><node><node>\n"
126 "<node><node><node><node><node><node><node><node><node><node>\n"
127 "<parent>\n"
128 "<node xmlns:adhocwf=\"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/\">\n"
129 "<adhocwf:workflowType>0</adhocwf:workflowType>\n"
130 "<adhocwf:version>1.1</adhocwf:version>\n"
131 "</node>"
132 "</parent>";
133
134 auto stream = pdfium::MakeRetain<CPDF_Stream>();
135 stream->SetData(ByteStringView(kData).raw_span());
136 CPDF_Metadata metadata(stream);
137
138 auto results = metadata.CheckForSharedForm();
139 ASSERT_EQ(0U, results.size());
140 }
141
TEST(CPDF_MetadataTest,CheckSharedFormWrongNamespace)142 TEST(CPDF_MetadataTest, CheckSharedFormWrongNamespace) {
143 static const char data[] =
144 "<?xml charset=\"utf-8\"?>\n"
145 "<node xmlns:adhocwf=\"http://ns.adobe.com/AcrobatAdhocWorkflow/2.0/\">\n"
146 "<adhocwf:workflowType>1</adhocwf:workflowType>\n"
147 "<adhocwf:version>1.1</adhocwf:version>\n"
148 "</node>";
149
150 auto stream = pdfium::MakeRetain<CPDF_Stream>();
151 stream->SetData(ByteStringView(data).raw_span());
152 CPDF_Metadata metadata(stream);
153
154 auto results = metadata.CheckForSharedForm();
155 EXPECT_EQ(0U, results.size());
156 }
157
TEST(CPDF_MetadataTest,CheckSharedFormMultipleErrors)158 TEST(CPDF_MetadataTest, CheckSharedFormMultipleErrors) {
159 static const char data[] =
160 "<?xml charset=\"utf-8\"?>\n"
161 "<grandparent>"
162 "<parent>\n"
163 "<node xmlns:adhocwf=\"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/\">\n"
164 "<adhocwf:workflowType>0</adhocwf:workflowType>\n"
165 "<adhocwf:version>1.1</adhocwf:version>\n"
166 "</node>"
167 "</parent>"
168 "<node2 "
169 "xmlns:adhocwf=\"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/\">\n"
170 "<adhocwf:workflowType>2</adhocwf:workflowType>\n"
171 "<adhocwf:version>1.1</adhocwf:version>\n"
172 "</node2>"
173 "<node3 "
174 "xmlns:adhocwf=\"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/\">\n"
175 "<adhocwf:workflowType>1</adhocwf:workflowType>\n"
176 "<adhocwf:version>1.1</adhocwf:version>\n"
177 "</node3>"
178 "</grandparent>";
179
180 auto stream = pdfium::MakeRetain<CPDF_Stream>();
181 stream->SetData(ByteStringView(data).raw_span());
182 CPDF_Metadata metadata(stream);
183
184 auto results = metadata.CheckForSharedForm();
185 ASSERT_EQ(3U, results.size());
186 EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormEmail, results[0]);
187 EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormFilesystem, results[1]);
188 EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormAcrobat, results[2]);
189 }
190