Explicitly warn about KFX files. Bump version number to 6.5.3
This commit is contained in:
parent
fca7eaab8e
commit
956f3034ad
|
@ -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.5.2 Written 2010–2016 by Apprentice Alf et al.</string>
|
<string>DeDRM AppleScript 6.5.3 Written 2010–2017 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,13 +36,13 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>6.5.2</string>
|
<string>6.5.3</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>dplt</string>
|
<string>dplt</string>
|
||||||
<key>LSRequiresCarbon</key>
|
<key>LSRequiresCarbon</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string>Copyright © 2010–2016 Apprentice Alf and Apprentice Harper</string>
|
<string>Copyright © 2010–2017 Apprentice Alf</string>
|
||||||
<key>WindowState</key>
|
<key>WindowState</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>bundleDividerCollapsed</key>
|
<key>bundleDividerCollapsed</key>
|
||||||
|
|
|
@ -56,6 +56,7 @@ __docformat__ = 'restructuredtext en'
|
||||||
# Fix an error in wineutils.py
|
# Fix an error in wineutils.py
|
||||||
# 6.5.1 - Updated version number, added PDF check for DRM-free documents
|
# 6.5.1 - Updated version number, added PDF check for DRM-free documents
|
||||||
# 6.5.2 - Another Topaz fix
|
# 6.5.2 - Another Topaz fix
|
||||||
|
# 6.5.3 - Warn about KFX files explicitly
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -63,7 +64,7 @@ Decrypt DRMed ebooks.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
PLUGIN_NAME = u"DeDRM"
|
PLUGIN_NAME = u"DeDRM"
|
||||||
PLUGIN_VERSION_TUPLE = (6, 5, 2)
|
PLUGIN_VERSION_TUPLE = (6, 5, 3)
|
||||||
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'
|
||||||
|
|
|
@ -56,8 +56,9 @@ from __future__ import with_statement
|
||||||
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
|
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
|
||||||
# 5.2 - Fixed error in command line processing of unicode arguments
|
# 5.2 - Fixed error in command line processing of unicode arguments
|
||||||
# 5.3 - Changed Android support to allow passing of backup .ab files
|
# 5.3 - Changed Android support to allow passing of backup .ab files
|
||||||
|
# 5.4 - Recognise KFX files masquerading as azw, even if we can't decrypt them yet.
|
||||||
|
|
||||||
__version__ = '5.3'
|
__version__ = '5.4'
|
||||||
|
|
||||||
|
|
||||||
import sys, os, re
|
import sys, os, re
|
||||||
|
@ -194,7 +195,11 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
|
||||||
raise DrmException(u"Input file does not exist.")
|
raise DrmException(u"Input file does not exist.")
|
||||||
|
|
||||||
mobi = True
|
mobi = True
|
||||||
magic3 = open(infile,'rb').read(3)
|
magic8 = open(infile,'rb').read(8)
|
||||||
|
if magic8 == '\xeaDRMION\xee':
|
||||||
|
raise DrmException(u"KFX format detected. This format cannot be decrypted yet.")
|
||||||
|
|
||||||
|
magic3 = magic8[:3]
|
||||||
if magic3 == 'TPZ':
|
if magic3 == 'TPZ':
|
||||||
mobi = False
|
mobi = False
|
||||||
|
|
||||||
|
@ -215,8 +220,9 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
|
||||||
md1, md2 = mb.getPIDMetaInfo()
|
md1, md2 = mb.getPIDMetaInfo()
|
||||||
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
|
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
|
||||||
# remove any duplicates
|
# remove any duplicates
|
||||||
totalpid = list(set(totalpids))
|
totalpids = list(set(totalpids))
|
||||||
print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids))
|
print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids))
|
||||||
|
#print totalpids
|
||||||
|
|
||||||
try:
|
try:
|
||||||
mb.processBook(totalpids)
|
mb.processBook(totalpids)
|
||||||
|
|
|
@ -28,8 +28,9 @@
|
||||||
# 6.5.0 - Fix for some new tags in Topaz ebooks
|
# 6.5.0 - Fix for some new tags in Topaz ebooks
|
||||||
# 6.5.1 - Version bump to match plugin & Mac app
|
# 6.5.1 - Version bump to match plugin & Mac app
|
||||||
# 6.5.2 - Fix for a new tag in Topaz ebooks
|
# 6.5.2 - Fix for a new tag in Topaz ebooks
|
||||||
|
# 6.5.3 - Explicitly warn about KFX files
|
||||||
|
|
||||||
__version__ = '6.5.2'
|
__version__ = '6.5.3'
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import os, os.path
|
import os, os.path
|
||||||
|
|
|
@ -56,6 +56,7 @@ __docformat__ = 'restructuredtext en'
|
||||||
# Fix an error in wineutils.py
|
# Fix an error in wineutils.py
|
||||||
# 6.5.1 - Updated version number, added PDF check for DRM-free documents
|
# 6.5.1 - Updated version number, added PDF check for DRM-free documents
|
||||||
# 6.5.2 - Another Topaz fix
|
# 6.5.2 - Another Topaz fix
|
||||||
|
# 6.5.3 - Warn about KFX files explicitly
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -63,7 +64,7 @@ Decrypt DRMed ebooks.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
PLUGIN_NAME = u"DeDRM"
|
PLUGIN_NAME = u"DeDRM"
|
||||||
PLUGIN_VERSION_TUPLE = (6, 5, 2)
|
PLUGIN_VERSION_TUPLE = (6, 5, 3)
|
||||||
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'
|
||||||
|
|
|
@ -56,8 +56,9 @@ from __future__ import with_statement
|
||||||
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
|
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
|
||||||
# 5.2 - Fixed error in command line processing of unicode arguments
|
# 5.2 - Fixed error in command line processing of unicode arguments
|
||||||
# 5.3 - Changed Android support to allow passing of backup .ab files
|
# 5.3 - Changed Android support to allow passing of backup .ab files
|
||||||
|
# 5.4 - Recognise KFX files masquerading as azw, even if we can't decrypt them yet.
|
||||||
|
|
||||||
__version__ = '5.3'
|
__version__ = '5.4'
|
||||||
|
|
||||||
|
|
||||||
import sys, os, re
|
import sys, os, re
|
||||||
|
@ -194,7 +195,11 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
|
||||||
raise DrmException(u"Input file does not exist.")
|
raise DrmException(u"Input file does not exist.")
|
||||||
|
|
||||||
mobi = True
|
mobi = True
|
||||||
magic3 = open(infile,'rb').read(3)
|
magic8 = open(infile,'rb').read(8)
|
||||||
|
if magic8 == '\xeaDRMION\xee':
|
||||||
|
raise DrmException(u"KFX format detected. This format cannot be decrypted yet.")
|
||||||
|
|
||||||
|
magic3 = magic8[:3]
|
||||||
if magic3 == 'TPZ':
|
if magic3 == 'TPZ':
|
||||||
mobi = False
|
mobi = False
|
||||||
|
|
||||||
|
@ -215,8 +220,9 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
|
||||||
md1, md2 = mb.getPIDMetaInfo()
|
md1, md2 = mb.getPIDMetaInfo()
|
||||||
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
|
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
|
||||||
# remove any duplicates
|
# remove any duplicates
|
||||||
totalpid = list(set(totalpids))
|
totalpids = list(set(totalpids))
|
||||||
print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids))
|
print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids))
|
||||||
|
#print totalpids
|
||||||
|
|
||||||
try:
|
try:
|
||||||
mb.processBook(totalpids)
|
mb.processBook(totalpids)
|
||||||
|
|
|
@ -20,7 +20,7 @@ Installation
|
||||||
------------
|
------------
|
||||||
0. If you don't already have a correct version of Python and PyCrypto installed, follow the "Installing Python on Windows" and "Installing PyCrypto on Windows" sections below before continuing.
|
0. If you don't already have a correct version of Python and PyCrypto installed, follow the "Installing Python on Windows" and "Installing PyCrypto on Windows" sections below before continuing.
|
||||||
|
|
||||||
1. Drag the DeDRM_App folder from tools_v6.3.4a/DeDRM_Application_Windows to your "My Documents" folder.
|
1. Drag the DeDRM_App folder from DeDRM_Application_Windows to your "My Documents" folder.
|
||||||
|
|
||||||
2. Open the DeDRM_App folder you've just dragged, and make a short-cut of the DeDRM_Drop_Target.bat file (right-click/Create Shortcut). Drag the shortcut file onto your Desktop.
|
2. Open the DeDRM_App folder you've just dragged, and make a short-cut of the DeDRM_Drop_Target.bat file (right-click/Create Shortcut). Drag the shortcut file onto your Desktop.
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -56,6 +56,7 @@ __docformat__ = 'restructuredtext en'
|
||||||
# Fix an error in wineutils.py
|
# Fix an error in wineutils.py
|
||||||
# 6.5.1 - Updated version number, added PDF check for DRM-free documents
|
# 6.5.1 - Updated version number, added PDF check for DRM-free documents
|
||||||
# 6.5.2 - Another Topaz fix
|
# 6.5.2 - Another Topaz fix
|
||||||
|
# 6.5.3 - Warn about KFX files explicitly
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -63,7 +64,7 @@ Decrypt DRMed ebooks.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
PLUGIN_NAME = u"DeDRM"
|
PLUGIN_NAME = u"DeDRM"
|
||||||
PLUGIN_VERSION_TUPLE = (6, 5, 2)
|
PLUGIN_VERSION_TUPLE = (6, 5, 3)
|
||||||
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'
|
||||||
|
|
|
@ -56,8 +56,9 @@ from __future__ import with_statement
|
||||||
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
|
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
|
||||||
# 5.2 - Fixed error in command line processing of unicode arguments
|
# 5.2 - Fixed error in command line processing of unicode arguments
|
||||||
# 5.3 - Changed Android support to allow passing of backup .ab files
|
# 5.3 - Changed Android support to allow passing of backup .ab files
|
||||||
|
# 5.4 - Recognise KFX files masquerading as azw, even if we can't decrypt them yet.
|
||||||
|
|
||||||
__version__ = '5.3'
|
__version__ = '5.4'
|
||||||
|
|
||||||
|
|
||||||
import sys, os, re
|
import sys, os, re
|
||||||
|
@ -194,7 +195,11 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
|
||||||
raise DrmException(u"Input file does not exist.")
|
raise DrmException(u"Input file does not exist.")
|
||||||
|
|
||||||
mobi = True
|
mobi = True
|
||||||
magic3 = open(infile,'rb').read(3)
|
magic8 = open(infile,'rb').read(8)
|
||||||
|
if magic8 == '\xeaDRMION\xee':
|
||||||
|
raise DrmException(u"KFX format detected. This format cannot be decrypted yet.")
|
||||||
|
|
||||||
|
magic3 = magic8[:3]
|
||||||
if magic3 == 'TPZ':
|
if magic3 == 'TPZ':
|
||||||
mobi = False
|
mobi = False
|
||||||
|
|
||||||
|
@ -215,8 +220,9 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
|
||||||
md1, md2 = mb.getPIDMetaInfo()
|
md1, md2 = mb.getPIDMetaInfo()
|
||||||
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
|
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
|
||||||
# remove any duplicates
|
# remove any duplicates
|
||||||
totalpid = list(set(totalpids))
|
totalpids = list(set(totalpids))
|
||||||
print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids))
|
print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids))
|
||||||
|
#print totalpids
|
||||||
|
|
||||||
try:
|
try:
|
||||||
mb.processBook(totalpids)
|
mb.processBook(totalpids)
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Version 3.2.5 December 2016
|
||||||
|
# Improve detection of good text decryption.
|
||||||
|
#
|
||||||
|
# Version 3.2.4 December 2016
|
||||||
|
# Remove incorrect support for Kobo Desktop under Wine
|
||||||
|
#
|
||||||
# Version 3.2.3 October 2016
|
# Version 3.2.3 October 2016
|
||||||
# Fix for windows network user and more xml fixes
|
# Fix for windows network user and more xml fixes
|
||||||
#
|
#
|
||||||
|
@ -145,7 +151,7 @@
|
||||||
#
|
#
|
||||||
"""Manage all Kobo books, either encrypted or DRM-free."""
|
"""Manage all Kobo books, either encrypted or DRM-free."""
|
||||||
|
|
||||||
__version__ = '3.2.3'
|
__version__ = '3.2.4'
|
||||||
__about__ = u"Obok v{0}\nCopyright © 2012-2016 Physisticated et al.".format(__version__)
|
__about__ = u"Obok v{0}\nCopyright © 2012-2016 Physisticated et al.".format(__version__)
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
@ -351,9 +357,9 @@ class KoboLibrary(object):
|
||||||
self.kobodir = os.path.join(self.kobodir, u"Kobo", u"Kobo Desktop Edition")
|
self.kobodir = os.path.join(self.kobodir, u"Kobo", u"Kobo Desktop Edition")
|
||||||
elif sys.platform.startswith('darwin'):
|
elif sys.platform.startswith('darwin'):
|
||||||
self.kobodir = os.path.join(os.environ['HOME'], u"Library", u"Application Support", u"Kobo", u"Kobo Desktop Edition")
|
self.kobodir = os.path.join(os.environ['HOME'], u"Library", u"Application Support", u"Kobo", u"Kobo Desktop Edition")
|
||||||
elif linux_path != None:
|
#elif linux_path != None:
|
||||||
# Probably Linux, let's get the wine prefix and path to Kobo.
|
# Probably Linux, let's get the wine prefix and path to Kobo.
|
||||||
self.kobodir = os.path.join(linux_path, u"Local Settings", u"Application Data", u"Kobo", u"Kobo Desktop Edition")
|
# self.kobodir = os.path.join(linux_path, u"Local Settings", u"Application Data", u"Kobo", u"Kobo Desktop Edition")
|
||||||
# desktop versions use Kobo.sqlite
|
# desktop versions use Kobo.sqlite
|
||||||
kobodb = os.path.join(self.kobodir, u"Kobo.sqlite")
|
kobodb = os.path.join(self.kobodir, u"Kobo.sqlite")
|
||||||
# check for existence of file
|
# check for existence of file
|
||||||
|
@ -582,6 +588,36 @@ class KoboFile(object):
|
||||||
Returns True if the content was checked, False if it was not
|
Returns True if the content was checked, False if it was not
|
||||||
checked."""
|
checked."""
|
||||||
if self.mimetype == 'application/xhtml+xml':
|
if self.mimetype == 'application/xhtml+xml':
|
||||||
|
# assume utf-8 with no BOM
|
||||||
|
textoffset = 0
|
||||||
|
stride = 1
|
||||||
|
print u"Checking text:{0}:".format(contents[:10])
|
||||||
|
# check for byte order mark
|
||||||
|
if contents[:3]=="\xef\xbb\xbf":
|
||||||
|
# seems to be utf-8 with BOM
|
||||||
|
print u"Could be utf-8 with BOM"
|
||||||
|
textoffset = 3
|
||||||
|
elif contents[:2]=="\xfe\xff":
|
||||||
|
# seems to be utf-16BE
|
||||||
|
print u"Could be utf-16BE"
|
||||||
|
textoffset = 3
|
||||||
|
stride = 2
|
||||||
|
elif contents[:2]=="\xff\xfe":
|
||||||
|
# seems to be utf-16LE
|
||||||
|
print u"Could be utf-16LE"
|
||||||
|
textoffset = 2
|
||||||
|
stride = 2
|
||||||
|
else:
|
||||||
|
print u"Perhaps utf-8 without BOM"
|
||||||
|
|
||||||
|
# now check that the first few characters are in the ASCII range
|
||||||
|
for i in xrange(textoffset,textoffset+5*stride,stride):
|
||||||
|
if ord(contents[i])<32 or ord(contents[i])>127:
|
||||||
|
# Non-ascii, so decryption probably failed
|
||||||
|
print u"Bad character at {0}, value {1}".format(i,ord(contents[i]))
|
||||||
|
raise ValueError
|
||||||
|
print u"Seems to be good text"
|
||||||
|
return True
|
||||||
if contents[:5]=="<?xml" or contents[:8]=="\xef\xbb\xbf<?xml":
|
if contents[:5]=="<?xml" or contents[:8]=="\xef\xbb\xbf<?xml":
|
||||||
# utf-8
|
# utf-8
|
||||||
return True
|
return True
|
||||||
|
|
Loading…
Reference in New Issue