Fix PDF corruption in Calibre 4 (#104)
This commit is contained in:
parent
80cbaa4841
commit
41df9ecda0
|
@ -73,3 +73,4 @@ List of changes since the fork of Apprentice Harper's repository:
|
||||||
- Fix some more Calibre-6 bugs in the Obok plugin (should fix #114).
|
- Fix some more Calibre-6 bugs in the Obok plugin (should fix #114).
|
||||||
- Fix a bug where invalid Adobe keys could cause the plugin to stop trying subsequent keys (partially fixes #109).
|
- Fix a bug where invalid Adobe keys could cause the plugin to stop trying subsequent keys (partially fixes #109).
|
||||||
- Fix DRM removal sometimes resetting the ZIP's internal "external_attr" value on Calibre 5 and newer.
|
- Fix DRM removal sometimes resetting the ZIP's internal "external_attr" value on Calibre 5 and newer.
|
||||||
|
- Fix PDF decryption issues on Calibre 4 (hopefully fixes #104).
|
|
@ -51,13 +51,14 @@
|
||||||
# 9.1.1 - Only support PyCryptodome; clean up the code
|
# 9.1.1 - Only support PyCryptodome; clean up the code
|
||||||
# 10.0.0 - Add support for "hardened" Adobe DRM (RMSDK >= 10)
|
# 10.0.0 - Add support for "hardened" Adobe DRM (RMSDK >= 10)
|
||||||
# 10.0.2 - Fix some Python2 stuff
|
# 10.0.2 - Fix some Python2 stuff
|
||||||
|
# 10.0.4 - Fix more Python2 stuff
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Decrypts Adobe ADEPT-encrypted PDF files.
|
Decrypts Adobe ADEPT-encrypted PDF files.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__license__ = 'GPL v3'
|
__license__ = 'GPL v3'
|
||||||
__version__ = "10.0.2"
|
__version__ = "10.0.4"
|
||||||
|
|
||||||
import codecs
|
import codecs
|
||||||
import hashlib
|
import hashlib
|
||||||
|
@ -200,6 +201,9 @@ def nunpack(s, default=0):
|
||||||
elif l == 2:
|
elif l == 2:
|
||||||
return struct.unpack('>H', s)[0]
|
return struct.unpack('>H', s)[0]
|
||||||
elif l == 3:
|
elif l == 3:
|
||||||
|
if sys.version_info[0] == 2:
|
||||||
|
return struct.unpack('>L', '\x00'+s)[0]
|
||||||
|
else:
|
||||||
return struct.unpack('>L', bytes([0]) + s)[0]
|
return struct.unpack('>L', bytes([0]) + s)[0]
|
||||||
elif l == 4:
|
elif l == 4:
|
||||||
return struct.unpack('>L', s)[0]
|
return struct.unpack('>L', s)[0]
|
||||||
|
@ -459,6 +463,9 @@ class PSBaseParser(object):
|
||||||
self.hex += c
|
self.hex += c
|
||||||
return (self.parse_literal_hex, i+1)
|
return (self.parse_literal_hex, i+1)
|
||||||
if self.hex:
|
if self.hex:
|
||||||
|
if sys.version_info[0] == 2:
|
||||||
|
self.token += chr(int(self.hex, 16))
|
||||||
|
else:
|
||||||
self.token += bytes([int(self.hex, 16)])
|
self.token += bytes([int(self.hex, 16)])
|
||||||
return (self.parse_literal, i)
|
return (self.parse_literal, i)
|
||||||
|
|
||||||
|
@ -543,10 +550,18 @@ class PSBaseParser(object):
|
||||||
self.oct += c
|
self.oct += c
|
||||||
return (self.parse_string_1, i+1)
|
return (self.parse_string_1, i+1)
|
||||||
if self.oct:
|
if self.oct:
|
||||||
|
if sys.version_info[0] == 2:
|
||||||
|
self.token += chr(int(self.oct, 8))
|
||||||
|
else:
|
||||||
self.token += bytes([int(self.oct, 8)])
|
self.token += bytes([int(self.oct, 8)])
|
||||||
return (self.parse_string, i)
|
return (self.parse_string, i)
|
||||||
if c in ESC_STRING:
|
if c in ESC_STRING:
|
||||||
|
|
||||||
|
if sys.version_info[0] == 2:
|
||||||
|
self.token += chr(ESC_STRING[c])
|
||||||
|
else:
|
||||||
self.token += bytes([ESC_STRING[c]])
|
self.token += bytes([ESC_STRING[c]])
|
||||||
|
|
||||||
return (self.parse_string, i+1)
|
return (self.parse_string, i+1)
|
||||||
|
|
||||||
def parse_wopen(self, s, i):
|
def parse_wopen(self, s, i):
|
||||||
|
@ -572,14 +587,19 @@ class PSBaseParser(object):
|
||||||
return (self.parse_main, i)
|
return (self.parse_main, i)
|
||||||
|
|
||||||
def parse_hexstring(self, s, i):
|
def parse_hexstring(self, s, i):
|
||||||
m1 = END_HEX_STRING.search(s, i)
|
m = END_HEX_STRING.search(s, i)
|
||||||
if not m1:
|
if not m:
|
||||||
self.token += s[i:]
|
self.token += s[i:]
|
||||||
return (self.parse_hexstring, len(s))
|
return (self.parse_hexstring, len(s))
|
||||||
j = m1.start(0)
|
j = m.start(0)
|
||||||
self.token += s[i:j]
|
self.token += s[i:j]
|
||||||
token = HEX_PAIR.sub(lambda m2: bytes([int(m2.group(0), 16)]),
|
if sys.version_info[0] == 2:
|
||||||
|
token = HEX_PAIR.sub(lambda m: chr(int(m.group(0), 16)),
|
||||||
|
SPC.sub('', self.token))
|
||||||
|
else:
|
||||||
|
token = HEX_PAIR.sub(lambda m: bytes([int(m.group(0), 16)]),
|
||||||
SPC.sub(b'', self.token))
|
SPC.sub(b'', self.token))
|
||||||
|
|
||||||
self.add_token(token)
|
self.add_token(token)
|
||||||
return (self.parse_main, j)
|
return (self.parse_main, j)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue