summaryrefslogtreecommitdiff
path: root/xpdf/xpdf-3.02-ooopwd.patch
blob: f773585b3f912e958532a7bb9634370ac43acfe5 (plain)
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