1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
--- misc/xpdf-3.02/xpdf/SecurityHandler.cc 2007-02-27 23:05:52.000000000 +0100
+++ misc/build/xpdf-3.02/xpdf/SecurityHandler.cc 2011-02-03 16:41:49.000000000 +0100
@@ -40,7 +40,7 @@
encryptDictA->dictLookup("Filter", &filterObj);
if (filterObj.isName("Standard")) {
- secHdlr = new StandardSecurityHandler(docA, encryptDictA);
+ secHdlr = new OOoImportSecurityhandler(docA, encryptDictA);
} else if (filterObj.isName()) {
#ifdef ENABLE_PLUGINS
if ((xsh = globalParams->getSecurityHandler(filterObj.getName()))) {
@@ -310,6 +310,60 @@
return gTrue;
}
+//------------------------------------------------------------------------
+// OOoImportSecurityhandler
+//------------------------------------------------------------------------
+
+OOoImportSecurityhandler::~OOoImportSecurityhandler()
+{
+}
+
+inline Guchar toNum( Guchar digit )
+{
+ return (digit >= '0') && digit <= '9'
+ ? digit - '0'
+ : (digit >= 'A' && digit <= 'F')
+ ? digit - 'A' + 10
+ : (digit >= 'a' && digit <= 'f')
+ ? digit - 'a' + 10
+ : Guchar(0xff);
+}
+
+GBool OOoImportSecurityhandler::authorize(void* authData)
+{
+ if( !ok )
+ return gFalse;
+ if( authData )
+ {
+ GString* ownerPassword = ((StandardAuthData *)authData)->ownerPassword;
+ if( ownerPassword )
+ {
+ const char* pStr = ownerPassword->getCString();
+ if( strncmp( pStr, "_OOO_pdfi_Credentials_", 22 ) == 0 )
+ {
+ // a hex encoded byte sequence should follow until end of string
+ // the length must match fileKeyLength
+ // if this is the case we can assume that the password checked out
+ // and the file key is valid
+ // max len is 16 (the size of the fileKey array)
+ pStr += 22;
+ size_t i = 0;
+ while( pStr[0] && pStr[1] && i < sizeof( fileKey ) )
+ {
+ fileKey[i++] = (toNum( *pStr++ ) << 4)
+ | (toNum( *pStr++ ));
+ }
+ if( i == size_t(fileKeyLength) )
+ {
+ ownerPasswordOk = gTrue;
+ return gTrue;
+ }
+ }
+ }
+ }
+ return StandardSecurityHandler::authorize( authData );
+}
+
#ifdef ENABLE_PLUGINS
//------------------------------------------------------------------------
--- misc/xpdf-3.02/xpdf/SecurityHandler.h 2007-02-27 23:05:52.000000000 +0100
+++ misc/build/xpdf-3.02/xpdf/SecurityHandler.h 2011-02-03 16:26:17.000000000 +0100
@@ -103,7 +103,7 @@
virtual int getEncVersion() { return encVersion; }
virtual CryptAlgorithm getEncAlgorithm() { return encAlgorithm; }
-private:
+protected:
int permFlags;
GBool ownerPasswordOk;
@@ -119,6 +119,17 @@
GBool ok;
};
+class OOoImportSecurityhandler : public StandardSecurityHandler
+{
+public:
+ OOoImportSecurityhandler( PDFDoc* docA, Object* encryptDictA )
+ : StandardSecurityHandler( docA, encryptDictA )
+ {}
+ virtual ~OOoImportSecurityhandler();
+
+ virtual GBool authorize(void* authData);
+};
+
#ifdef ENABLE_PLUGINS
//------------------------------------------------------------------------
// ExternalSecurityHandler
|