Update to DeDRM to try to fix Linux python problem, and improve Adobe logging

This commit is contained in:
apprenticeharper 2016-01-11 06:44:44 +00:00
parent 72968d2124
commit 10963f6011
17 changed files with 180 additions and 45 deletions

View File

@ -24,7 +24,7 @@
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>droplet</string> <string>droplet</string>
<key>CFBundleGetInfoString</key> <key>CFBundleGetInfoString</key>
<string>DeDRM AppleScript 6.3.4 Written 20102015 by Apprentice Alf et al.</string> <string>DeDRM AppleScript 6.3.5 Written 20102016 by Apprentice Alf et al.</string>
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>
<string>DeDRM</string> <string>DeDRM</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@ -36,7 +36,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>6.3.4</string> <string>6.3.5</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>dplt</string> <string>dplt</string>
<key>LSRequiresCarbon</key> <key>LSRequiresCarbon</key>

View File

@ -46,6 +46,7 @@ __docformat__ = 'restructuredtext en'
# 6.3.2 - Fixed Kindle for Android help file # 6.3.2 - Fixed Kindle for Android help file
# 6.3.3 - Bug fix for Kindle for PC support # 6.3.3 - Bug fix for Kindle for PC support
# 6.3.4 - Fixes for Kindle for Android, Linux, and Kobo 3.17 # 6.3.4 - Fixes for Kindle for Android, Linux, and Kobo 3.17
# 6.3.5 - Fixes for Linux, and Kobo 3.19 and more logging
""" """
@ -53,7 +54,7 @@ Decrypt DRMed ebooks.
""" """
PLUGIN_NAME = u"DeDRM" PLUGIN_NAME = u"DeDRM"
PLUGIN_VERSION_TUPLE = (6, 3, 4) PLUGIN_VERSION_TUPLE = (6, 3, 5)
PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE]) PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE])
# Include an html helpfile in the plugin's zipfile with the following name. # Include an html helpfile in the plugin's zipfile with the following name.
RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' RESOURCE_NAME = PLUGIN_NAME + '_Help.htm'
@ -96,7 +97,7 @@ class DeDRM(FileTypePlugin):
supported_platforms = ['linux', 'osx', 'windows'] supported_platforms = ['linux', 'osx', 'windows']
author = u"Apprentice Alf, Aprentice Harper, The Dark Reverser and i♥cabbages" author = u"Apprentice Alf, Aprentice Harper, The Dark Reverser and i♥cabbages"
version = PLUGIN_VERSION_TUPLE version = PLUGIN_VERSION_TUPLE
minimum_calibre_version = (0, 7, 55) # Compiled python libraries cannot be imported in earlier versions. minimum_calibre_version = (1, 0, 0) # Compiled python libraries cannot be imported in earlier versions.
file_types = set(['epub','pdf','pdb','prc','mobi','pobi','azw','azw1','azw3','azw4','tpz']) file_types = set(['epub','pdf','pdb','prc','mobi','pobi','azw','azw1','azw3','azw4','tpz'])
on_import = True on_import = True
priority = 600 priority = 600
@ -296,11 +297,15 @@ class DeDRM(FileTypePlugin):
traceback.print_exc() traceback.print_exc()
result = 1 result = 1
of.close() try:
of.close()
except:
print u"{0} v{1}: Exception closing temporary file after {2:.1f} seconds. Ignored.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)
if result == 0: if result == 0:
# Decryption was successful. # Decryption was successful.
# Return the modified PersistentTemporary file to calibre. # Return the modified PersistentTemporary file to calibre.
print u"{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)
return of.name return of.name
print u"{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime) print u"{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)
@ -360,6 +365,7 @@ class DeDRM(FileTypePlugin):
except: except:
print u"{0} v{1}: Exception when saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime) print u"{0} v{1}: Exception when saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)
traceback.print_exc() traceback.print_exc()
print u"{0} v{1}: Decrypted with new default key after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)
# Return the modified PersistentTemporary file to calibre. # Return the modified PersistentTemporary file to calibre.
return of.name return of.name

View File

@ -3,18 +3,19 @@
from __future__ import with_statement from __future__ import with_statement
# ineptepub.pyw, version 6.1 # ineptepub.pyw, version 6.3
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102013 by some_updates, DiapDealer and Apprentice Alf # Modified 20102013 by some_updates, DiapDealer and Apprentice Alf
# Modified 20152016 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.6 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
# <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to # <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to
# install the version for Python 2.6). Save this script file as # install the version for Python 2.7). Save this script file as
# ineptepub.pyw and double-click on it to run it. # ineptepub.pyw and double-click on it to run it.
# #
# Mac OS X users: Save this script file as ineptepub.pyw. You can run this # Mac OS X users: Save this script file as ineptepub.pyw. You can run this
@ -38,13 +39,14 @@ from __future__ import with_statement
# 6.0 - moved unicode_argv call inside main for Windows DeDRM compatibility # 6.0 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 6.1 - Work if TkInter is missing # 6.1 - Work if TkInter is missing
# 6.2 - Handle UTF-8 file names inside an ePub, fix by Jose Luis # 6.2 - Handle UTF-8 file names inside an ePub, fix by Jose Luis
# 6.3 - Add additional check on DER file sanity
""" """
Decrypt Adobe Digital Editions encrypted ePub books. Decrypt Adobe Digital Editions encrypted ePub books.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "6.2" __version__ = "6.3"
import sys import sys
import os import os
@ -169,9 +171,14 @@ def _load_crypto_libcrypto():
def __init__(self, der): def __init__(self, der):
buf = create_string_buffer(der) buf = create_string_buffer(der)
pp = c_char_pp(cast(buf, c_char_p)) pp = c_char_pp(cast(buf, c_char_p))
rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der)) rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der))
if rsa is None: if rsa is None:
raise ADEPTError('Error parsing ADEPT user key DER') raise ADEPTError('Error parsing ADEPT user key DER')
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def decrypt(self, from_): def decrypt(self, from_):
rsa = self._rsa rsa = self._rsa
@ -313,6 +320,12 @@ def _load_crypto_pycrypto():
key = [key.getChild(x).value for x in xrange(1, 4)] key = [key.getChild(x).value for x in xrange(1, 4)]
key = [self.bytesToNumber(v) for v in key] key = [self.bytesToNumber(v) for v in key]
self._rsa = _RSA.construct(key) self._rsa = _RSA.construct(key)
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def bytesToNumber(self, bytes): def bytesToNumber(self, bytes):
total = 0L total = 0L

View File

@ -3,18 +3,19 @@
from __future__ import with_statement from __future__ import with_statement
# ineptpdf.pyw, version 7.11 # ineptpdf.pyw, version 8.0.2
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102012 by some_updates, DiapDealer and Apprentice Alf # Modified 20102012 by some_updates, DiapDealer and Apprentice Alf
# Modified 2015-2016 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.6 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
# <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to # <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to
# install the version for Python 2.6). Save this script file as # install the version for Python 2.7). Save this script file as
# ineptpdf.pyw and double-click on it to run it. # ineptpdf.pyw and double-click on it to run it.
# #
# Mac OS X users: Save this script file as ineptpdf.pyw. You can run this # Mac OS X users: Save this script file as ineptpdf.pyw. You can run this
@ -53,13 +54,15 @@ from __future__ import with_statement
# 7.14 - moved unicode_argv call inside main for Windows DeDRM compatibility # 7.14 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 8.0 - Work if TkInter is missing # 8.0 - Work if TkInter is missing
# 8.0.1 - Broken Metadata fix. # 8.0.1 - Broken Metadata fix.
# 8.0.2 - Add additional check on DER file sanity
""" """
Decrypts Adobe ADEPT-encrypted PDF files. Decrypts Adobe ADEPT-encrypted PDF files.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "8.0.1" __version__ = "8.0.2"
import sys import sys
import os import os
@ -198,6 +201,11 @@ def _load_crypto_libcrypto():
rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der)) rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der))
if rsa is None: if rsa is None:
raise ADEPTError('Error parsing ADEPT user key DER') raise ADEPTError('Error parsing ADEPT user key DER')
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def decrypt(self, from_): def decrypt(self, from_):
rsa = self._rsa rsa = self._rsa
@ -383,6 +391,11 @@ def _load_crypto_pycrypto():
key = [key.getChild(x).value for x in xrange(1, 4)] key = [key.getChild(x).value for x in xrange(1, 4)]
key = [self.bytesToNumber(v) for v in key] key = [self.bytesToNumber(v) for v in key]
self._rsa = _RSA.construct(key) self._rsa = _RSA.construct(key)
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def bytesToNumber(self, bytes): def bytesToNumber(self, bytes):
total = 0L total = 0L

View File

@ -26,6 +26,7 @@ def WineGetKeys(scriptpath, extension, wineprefix=""):
if not os.path.exists(outdirpath): if not os.path.exists(outdirpath):
os.makedirs(outdirpath) os.makedirs(outdirpath)
wineprefix = os.path.abspath(os.path.expanduser(os.path.expandvars(wineprefix)))
if wineprefix != "" and os.path.exists(wineprefix): if wineprefix != "" and os.path.exists(wineprefix):
cmdline = u"WINEPREFIX=\"{2}\" wine python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath,wineprefix) cmdline = u"WINEPREFIX=\"{2}\" wine python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath,wineprefix)
else: else:
@ -38,8 +39,20 @@ def WineGetKeys(scriptpath, extension, wineprefix=""):
result = p2.wait("wait") result = p2.wait("wait")
except Exception, e: except Exception, e:
print u"{0} v{1}: Wine subprocess call error: {2}".format(PLUGIN_NAME, PLUGIN_VERSION, e.args[0]) print u"{0} v{1}: Wine subprocess call error: {2}".format(PLUGIN_NAME, PLUGIN_VERSION, e.args[0])
return [] if wineprefix != "" and os.path.exists(wineprefix):
cmdline = u"WINEPREFIX=\"{2}\" wine C:\\Python27\\python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath,wineprefix)
else:
cmdline = u"wine C:\\Python27\\python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath)
print u"{0} v{1}: Command line: “{2}".format(PLUGIN_NAME, PLUGIN_VERSION, cmdline)
try:
cmdline = cmdline.encode(sys.getfilesystemencoding())
p2 = Process(cmdline, shell=True, bufsize=1, stdin=None, stdout=sys.stdout, stderr=STDOUT, close_fds=False)
result = p2.wait("wait")
except Exception, e:
print u"{0} v{1}: Wine subprocess call error: {2}".format(PLUGIN_NAME, PLUGIN_VERSION, e.args[0])
# try finding winekeys anyway, even if above code errored
winekeys = [] winekeys = []
# get any files with extension in the output dir # get any files with extension in the output dir
files = [f for f in os.listdir(outdirpath) if f.endswith(extension)] files = [f for f in os.listdir(outdirpath) if f.endswith(extension)]

View File

@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# DeDRM.pyw # DeDRM.pyw
# Copyright 2010-2015 some_updates, Apprentice Alf and Apprentice Harper # Copyright 2010-2016 some_updates, Apprentice Alf and Apprentice Harper
# Revision history: # Revision history:
# 6.0.0 - Release along with unified plugin # 6.0.0 - Release along with unified plugin
@ -19,8 +19,9 @@
# 6.3.2 - Version bump to match plugin # 6.3.2 - Version bump to match plugin
# 6.3.3 - Version bump to match plugin # 6.3.3 - Version bump to match plugin
# 6.3.4 - Version bump to match plugin # 6.3.4 - Version bump to match plugin
# 6.3.5 - Version bump to match plugin
__version__ = '6.3.4' __version__ = '6.3.5'
import sys import sys
import os, os.path import os, os.path

View File

@ -46,6 +46,7 @@ __docformat__ = 'restructuredtext en'
# 6.3.2 - Fixed Kindle for Android help file # 6.3.2 - Fixed Kindle for Android help file
# 6.3.3 - Bug fix for Kindle for PC support # 6.3.3 - Bug fix for Kindle for PC support
# 6.3.4 - Fixes for Kindle for Android, Linux, and Kobo 3.17 # 6.3.4 - Fixes for Kindle for Android, Linux, and Kobo 3.17
# 6.3.5 - Fixes for Linux, and Kobo 3.19 and more logging
""" """
@ -53,7 +54,7 @@ Decrypt DRMed ebooks.
""" """
PLUGIN_NAME = u"DeDRM" PLUGIN_NAME = u"DeDRM"
PLUGIN_VERSION_TUPLE = (6, 3, 4) PLUGIN_VERSION_TUPLE = (6, 3, 5)
PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE]) PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE])
# Include an html helpfile in the plugin's zipfile with the following name. # Include an html helpfile in the plugin's zipfile with the following name.
RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' RESOURCE_NAME = PLUGIN_NAME + '_Help.htm'
@ -96,7 +97,7 @@ class DeDRM(FileTypePlugin):
supported_platforms = ['linux', 'osx', 'windows'] supported_platforms = ['linux', 'osx', 'windows']
author = u"Apprentice Alf, Aprentice Harper, The Dark Reverser and i♥cabbages" author = u"Apprentice Alf, Aprentice Harper, The Dark Reverser and i♥cabbages"
version = PLUGIN_VERSION_TUPLE version = PLUGIN_VERSION_TUPLE
minimum_calibre_version = (0, 7, 55) # Compiled python libraries cannot be imported in earlier versions. minimum_calibre_version = (1, 0, 0) # Compiled python libraries cannot be imported in earlier versions.
file_types = set(['epub','pdf','pdb','prc','mobi','pobi','azw','azw1','azw3','azw4','tpz']) file_types = set(['epub','pdf','pdb','prc','mobi','pobi','azw','azw1','azw3','azw4','tpz'])
on_import = True on_import = True
priority = 600 priority = 600
@ -296,11 +297,15 @@ class DeDRM(FileTypePlugin):
traceback.print_exc() traceback.print_exc()
result = 1 result = 1
of.close() try:
of.close()
except:
print u"{0} v{1}: Exception closing temporary file after {2:.1f} seconds. Ignored.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)
if result == 0: if result == 0:
# Decryption was successful. # Decryption was successful.
# Return the modified PersistentTemporary file to calibre. # Return the modified PersistentTemporary file to calibre.
print u"{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)
return of.name return of.name
print u"{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime) print u"{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)
@ -360,6 +365,7 @@ class DeDRM(FileTypePlugin):
except: except:
print u"{0} v{1}: Exception when saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime) print u"{0} v{1}: Exception when saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)
traceback.print_exc() traceback.print_exc()
print u"{0} v{1}: Decrypted with new default key after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)
# Return the modified PersistentTemporary file to calibre. # Return the modified PersistentTemporary file to calibre.
return of.name return of.name

View File

@ -3,18 +3,19 @@
from __future__ import with_statement from __future__ import with_statement
# ineptepub.pyw, version 6.1 # ineptepub.pyw, version 6.3
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102013 by some_updates, DiapDealer and Apprentice Alf # Modified 20102013 by some_updates, DiapDealer and Apprentice Alf
# Modified 20152016 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.6 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
# <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to # <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to
# install the version for Python 2.6). Save this script file as # install the version for Python 2.7). Save this script file as
# ineptepub.pyw and double-click on it to run it. # ineptepub.pyw and double-click on it to run it.
# #
# Mac OS X users: Save this script file as ineptepub.pyw. You can run this # Mac OS X users: Save this script file as ineptepub.pyw. You can run this
@ -38,13 +39,14 @@ from __future__ import with_statement
# 6.0 - moved unicode_argv call inside main for Windows DeDRM compatibility # 6.0 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 6.1 - Work if TkInter is missing # 6.1 - Work if TkInter is missing
# 6.2 - Handle UTF-8 file names inside an ePub, fix by Jose Luis # 6.2 - Handle UTF-8 file names inside an ePub, fix by Jose Luis
# 6.3 - Add additional check on DER file sanity
""" """
Decrypt Adobe Digital Editions encrypted ePub books. Decrypt Adobe Digital Editions encrypted ePub books.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "6.2" __version__ = "6.3"
import sys import sys
import os import os
@ -169,9 +171,14 @@ def _load_crypto_libcrypto():
def __init__(self, der): def __init__(self, der):
buf = create_string_buffer(der) buf = create_string_buffer(der)
pp = c_char_pp(cast(buf, c_char_p)) pp = c_char_pp(cast(buf, c_char_p))
rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der)) rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der))
if rsa is None: if rsa is None:
raise ADEPTError('Error parsing ADEPT user key DER') raise ADEPTError('Error parsing ADEPT user key DER')
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def decrypt(self, from_): def decrypt(self, from_):
rsa = self._rsa rsa = self._rsa
@ -313,6 +320,12 @@ def _load_crypto_pycrypto():
key = [key.getChild(x).value for x in xrange(1, 4)] key = [key.getChild(x).value for x in xrange(1, 4)]
key = [self.bytesToNumber(v) for v in key] key = [self.bytesToNumber(v) for v in key]
self._rsa = _RSA.construct(key) self._rsa = _RSA.construct(key)
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def bytesToNumber(self, bytes): def bytesToNumber(self, bytes):
total = 0L total = 0L

View File

@ -3,18 +3,19 @@
from __future__ import with_statement from __future__ import with_statement
# ineptpdf.pyw, version 7.11 # ineptpdf.pyw, version 8.0.2
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102012 by some_updates, DiapDealer and Apprentice Alf # Modified 20102012 by some_updates, DiapDealer and Apprentice Alf
# Modified 2015-2016 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.6 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
# <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to # <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to
# install the version for Python 2.6). Save this script file as # install the version for Python 2.7). Save this script file as
# ineptpdf.pyw and double-click on it to run it. # ineptpdf.pyw and double-click on it to run it.
# #
# Mac OS X users: Save this script file as ineptpdf.pyw. You can run this # Mac OS X users: Save this script file as ineptpdf.pyw. You can run this
@ -53,13 +54,15 @@ from __future__ import with_statement
# 7.14 - moved unicode_argv call inside main for Windows DeDRM compatibility # 7.14 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 8.0 - Work if TkInter is missing # 8.0 - Work if TkInter is missing
# 8.0.1 - Broken Metadata fix. # 8.0.1 - Broken Metadata fix.
# 8.0.2 - Add additional check on DER file sanity
""" """
Decrypts Adobe ADEPT-encrypted PDF files. Decrypts Adobe ADEPT-encrypted PDF files.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "8.0.1" __version__ = "8.0.2"
import sys import sys
import os import os
@ -198,6 +201,11 @@ def _load_crypto_libcrypto():
rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der)) rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der))
if rsa is None: if rsa is None:
raise ADEPTError('Error parsing ADEPT user key DER') raise ADEPTError('Error parsing ADEPT user key DER')
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def decrypt(self, from_): def decrypt(self, from_):
rsa = self._rsa rsa = self._rsa
@ -383,6 +391,11 @@ def _load_crypto_pycrypto():
key = [key.getChild(x).value for x in xrange(1, 4)] key = [key.getChild(x).value for x in xrange(1, 4)]
key = [self.bytesToNumber(v) for v in key] key = [self.bytesToNumber(v) for v in key]
self._rsa = _RSA.construct(key) self._rsa = _RSA.construct(key)
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def bytesToNumber(self, bytes): def bytesToNumber(self, bytes):
total = 0L total = 0L

View File

@ -26,6 +26,7 @@ def WineGetKeys(scriptpath, extension, wineprefix=""):
if not os.path.exists(outdirpath): if not os.path.exists(outdirpath):
os.makedirs(outdirpath) os.makedirs(outdirpath)
wineprefix = os.path.abspath(os.path.expanduser(os.path.expandvars(wineprefix)))
if wineprefix != "" and os.path.exists(wineprefix): if wineprefix != "" and os.path.exists(wineprefix):
cmdline = u"WINEPREFIX=\"{2}\" wine python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath,wineprefix) cmdline = u"WINEPREFIX=\"{2}\" wine python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath,wineprefix)
else: else:
@ -38,8 +39,20 @@ def WineGetKeys(scriptpath, extension, wineprefix=""):
result = p2.wait("wait") result = p2.wait("wait")
except Exception, e: except Exception, e:
print u"{0} v{1}: Wine subprocess call error: {2}".format(PLUGIN_NAME, PLUGIN_VERSION, e.args[0]) print u"{0} v{1}: Wine subprocess call error: {2}".format(PLUGIN_NAME, PLUGIN_VERSION, e.args[0])
return [] if wineprefix != "" and os.path.exists(wineprefix):
cmdline = u"WINEPREFIX=\"{2}\" wine C:\\Python27\\python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath,wineprefix)
else:
cmdline = u"wine C:\\Python27\\python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath)
print u"{0} v{1}: Command line: “{2}".format(PLUGIN_NAME, PLUGIN_VERSION, cmdline)
try:
cmdline = cmdline.encode(sys.getfilesystemencoding())
p2 = Process(cmdline, shell=True, bufsize=1, stdin=None, stdout=sys.stdout, stderr=STDOUT, close_fds=False)
result = p2.wait("wait")
except Exception, e:
print u"{0} v{1}: Wine subprocess call error: {2}".format(PLUGIN_NAME, PLUGIN_VERSION, e.args[0])
# try finding winekeys anyway, even if above code errored
winekeys = [] winekeys = []
# get any files with extension in the output dir # get any files with extension in the output dir
files = [f for f in os.listdir(outdirpath) if f.endswith(extension)] files = [f for f in os.listdir(outdirpath) if f.endswith(extension)]

View File

@ -46,6 +46,7 @@ __docformat__ = 'restructuredtext en'
# 6.3.2 - Fixed Kindle for Android help file # 6.3.2 - Fixed Kindle for Android help file
# 6.3.3 - Bug fix for Kindle for PC support # 6.3.3 - Bug fix for Kindle for PC support
# 6.3.4 - Fixes for Kindle for Android, Linux, and Kobo 3.17 # 6.3.4 - Fixes for Kindle for Android, Linux, and Kobo 3.17
# 6.3.5 - Fixes for Linux, and Kobo 3.19 and more logging
""" """
@ -53,7 +54,7 @@ Decrypt DRMed ebooks.
""" """
PLUGIN_NAME = u"DeDRM" PLUGIN_NAME = u"DeDRM"
PLUGIN_VERSION_TUPLE = (6, 3, 4) PLUGIN_VERSION_TUPLE = (6, 3, 5)
PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE]) PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE])
# Include an html helpfile in the plugin's zipfile with the following name. # Include an html helpfile in the plugin's zipfile with the following name.
RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' RESOURCE_NAME = PLUGIN_NAME + '_Help.htm'
@ -96,7 +97,7 @@ class DeDRM(FileTypePlugin):
supported_platforms = ['linux', 'osx', 'windows'] supported_platforms = ['linux', 'osx', 'windows']
author = u"Apprentice Alf, Aprentice Harper, The Dark Reverser and i♥cabbages" author = u"Apprentice Alf, Aprentice Harper, The Dark Reverser and i♥cabbages"
version = PLUGIN_VERSION_TUPLE version = PLUGIN_VERSION_TUPLE
minimum_calibre_version = (0, 7, 55) # Compiled python libraries cannot be imported in earlier versions. minimum_calibre_version = (1, 0, 0) # Compiled python libraries cannot be imported in earlier versions.
file_types = set(['epub','pdf','pdb','prc','mobi','pobi','azw','azw1','azw3','azw4','tpz']) file_types = set(['epub','pdf','pdb','prc','mobi','pobi','azw','azw1','azw3','azw4','tpz'])
on_import = True on_import = True
priority = 600 priority = 600
@ -296,11 +297,15 @@ class DeDRM(FileTypePlugin):
traceback.print_exc() traceback.print_exc()
result = 1 result = 1
of.close() try:
of.close()
except:
print u"{0} v{1}: Exception closing temporary file after {2:.1f} seconds. Ignored.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)
if result == 0: if result == 0:
# Decryption was successful. # Decryption was successful.
# Return the modified PersistentTemporary file to calibre. # Return the modified PersistentTemporary file to calibre.
print u"{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)
return of.name return of.name
print u"{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime) print u"{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)
@ -360,6 +365,7 @@ class DeDRM(FileTypePlugin):
except: except:
print u"{0} v{1}: Exception when saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime) print u"{0} v{1}: Exception when saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)
traceback.print_exc() traceback.print_exc()
print u"{0} v{1}: Decrypted with new default key after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)
# Return the modified PersistentTemporary file to calibre. # Return the modified PersistentTemporary file to calibre.
return of.name return of.name

View File

@ -3,18 +3,19 @@
from __future__ import with_statement from __future__ import with_statement
# ineptepub.pyw, version 6.1 # ineptepub.pyw, version 6.3
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102013 by some_updates, DiapDealer and Apprentice Alf # Modified 20102013 by some_updates, DiapDealer and Apprentice Alf
# Modified 20152016 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.6 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
# <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to # <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to
# install the version for Python 2.6). Save this script file as # install the version for Python 2.7). Save this script file as
# ineptepub.pyw and double-click on it to run it. # ineptepub.pyw and double-click on it to run it.
# #
# Mac OS X users: Save this script file as ineptepub.pyw. You can run this # Mac OS X users: Save this script file as ineptepub.pyw. You can run this
@ -38,13 +39,14 @@ from __future__ import with_statement
# 6.0 - moved unicode_argv call inside main for Windows DeDRM compatibility # 6.0 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 6.1 - Work if TkInter is missing # 6.1 - Work if TkInter is missing
# 6.2 - Handle UTF-8 file names inside an ePub, fix by Jose Luis # 6.2 - Handle UTF-8 file names inside an ePub, fix by Jose Luis
# 6.3 - Add additional check on DER file sanity
""" """
Decrypt Adobe Digital Editions encrypted ePub books. Decrypt Adobe Digital Editions encrypted ePub books.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "6.2" __version__ = "6.3"
import sys import sys
import os import os
@ -169,9 +171,14 @@ def _load_crypto_libcrypto():
def __init__(self, der): def __init__(self, der):
buf = create_string_buffer(der) buf = create_string_buffer(der)
pp = c_char_pp(cast(buf, c_char_p)) pp = c_char_pp(cast(buf, c_char_p))
rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der)) rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der))
if rsa is None: if rsa is None:
raise ADEPTError('Error parsing ADEPT user key DER') raise ADEPTError('Error parsing ADEPT user key DER')
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def decrypt(self, from_): def decrypt(self, from_):
rsa = self._rsa rsa = self._rsa
@ -313,6 +320,12 @@ def _load_crypto_pycrypto():
key = [key.getChild(x).value for x in xrange(1, 4)] key = [key.getChild(x).value for x in xrange(1, 4)]
key = [self.bytesToNumber(v) for v in key] key = [self.bytesToNumber(v) for v in key]
self._rsa = _RSA.construct(key) self._rsa = _RSA.construct(key)
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def bytesToNumber(self, bytes): def bytesToNumber(self, bytes):
total = 0L total = 0L

View File

@ -3,18 +3,19 @@
from __future__ import with_statement from __future__ import with_statement
# ineptpdf.pyw, version 7.11 # ineptpdf.pyw, version 8.0.2
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102012 by some_updates, DiapDealer and Apprentice Alf # Modified 20102012 by some_updates, DiapDealer and Apprentice Alf
# Modified 2015-2016 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.6 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
# <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to # <http://www.voidspace.org.uk/python/modules.shtml#pycrypto> (make sure to
# install the version for Python 2.6). Save this script file as # install the version for Python 2.7). Save this script file as
# ineptpdf.pyw and double-click on it to run it. # ineptpdf.pyw and double-click on it to run it.
# #
# Mac OS X users: Save this script file as ineptpdf.pyw. You can run this # Mac OS X users: Save this script file as ineptpdf.pyw. You can run this
@ -53,13 +54,15 @@ from __future__ import with_statement
# 7.14 - moved unicode_argv call inside main for Windows DeDRM compatibility # 7.14 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 8.0 - Work if TkInter is missing # 8.0 - Work if TkInter is missing
# 8.0.1 - Broken Metadata fix. # 8.0.1 - Broken Metadata fix.
# 8.0.2 - Add additional check on DER file sanity
""" """
Decrypts Adobe ADEPT-encrypted PDF files. Decrypts Adobe ADEPT-encrypted PDF files.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "8.0.1" __version__ = "8.0.2"
import sys import sys
import os import os
@ -198,6 +201,11 @@ def _load_crypto_libcrypto():
rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der)) rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der))
if rsa is None: if rsa is None:
raise ADEPTError('Error parsing ADEPT user key DER') raise ADEPTError('Error parsing ADEPT user key DER')
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def decrypt(self, from_): def decrypt(self, from_):
rsa = self._rsa rsa = self._rsa
@ -383,6 +391,11 @@ def _load_crypto_pycrypto():
key = [key.getChild(x).value for x in xrange(1, 4)] key = [key.getChild(x).value for x in xrange(1, 4)]
key = [self.bytesToNumber(v) for v in key] key = [self.bytesToNumber(v) for v in key]
self._rsa = _RSA.construct(key) self._rsa = _RSA.construct(key)
# check if pointer is not NULL
try:
c = self._rsa.contents
except ValueError:
raise ADEPTError('Error parsing ADEPT user key DER')
def bytesToNumber(self, bytes): def bytesToNumber(self, bytes):
total = 0L total = 0L

View File

@ -39,8 +39,20 @@ def WineGetKeys(scriptpath, extension, wineprefix=""):
result = p2.wait("wait") result = p2.wait("wait")
except Exception, e: except Exception, e:
print u"{0} v{1}: Wine subprocess call error: {2}".format(PLUGIN_NAME, PLUGIN_VERSION, e.args[0]) print u"{0} v{1}: Wine subprocess call error: {2}".format(PLUGIN_NAME, PLUGIN_VERSION, e.args[0])
return [] if wineprefix != "" and os.path.exists(wineprefix):
cmdline = u"WINEPREFIX=\"{2}\" wine C:\\Python27\\python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath,wineprefix)
else:
cmdline = u"wine C:\\Python27\\python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath)
print u"{0} v{1}: Command line: “{2}".format(PLUGIN_NAME, PLUGIN_VERSION, cmdline)
try:
cmdline = cmdline.encode(sys.getfilesystemencoding())
p2 = Process(cmdline, shell=True, bufsize=1, stdin=None, stdout=sys.stdout, stderr=STDOUT, close_fds=False)
result = p2.wait("wait")
except Exception, e:
print u"{0} v{1}: Wine subprocess call error: {2}".format(PLUGIN_NAME, PLUGIN_VERSION, e.args[0])
# try finding winekeys anyway, even if above code errored
winekeys = [] winekeys = []
# get any files with extension in the output dir # get any files with extension in the output dir
files = [f for f in os.listdir(outdirpath) if f.endswith(extension)] files = [f for f in os.listdir(outdirpath) if f.endswith(extension)]

View File

@ -12,7 +12,7 @@ The is archive includes tools to remove DRM from:
- Adobe Digital Editions PDFs - Adobe Digital Editions PDFs
- Mobipocket ebooks - Mobipocket ebooks
- eReader PDB books - eReader PDB books
- Scuolabooks (Windows only solution by Hex) - Scuolabooks (Link to solution by Hex)
These tools do NOT work with Apple's iBooks FairPlay DRM (see end of this file.) These tools do NOT work with Apple's iBooks FairPlay DRM (see end of this file.)
@ -78,7 +78,7 @@ Rocket_ebooks
Information about the now-obsolete Rocket ebook format and DRM, along with source for a tool to remove the DRM. Information about the now-obsolete Rocket ebook format and DRM, along with source for a tool to remove the DRM.
Scuolabook_DRM Scuolabook_DRM
A windows-only application (including source code) for removing DRM from ScuolaBooks PDFs, created by "Hex" and included with permission. A link to the tool for removing DRM from ScuolaBooks PDFs, created by "Hex".
Windows and Python Windows and Python