diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist
index a079e5a..898ac04 100644
--- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist
+++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist
@@ -24,7 +24,7 @@
CFBundleExecutable
droplet
CFBundleGetInfoString
- DeDRM AppleScript 6.5.2 Written 2010–2016 by Apprentice Alf et al.
+ DeDRM AppleScript 6.5.3 Written 2010–2017 by Apprentice Alf et al.
CFBundleIconFile
DeDRM
CFBundleIdentifier
@@ -36,13 +36,13 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 6.5.2
+ 6.5.3
CFBundleSignature
dplt
LSRequiresCarbon
NSHumanReadableCopyright
- Copyright © 2010–2016 Apprentice Alf and Apprentice Harper
+ Copyright © 2010–2017 Apprentice Alf
WindowState
bundleDividerCollapsed
diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py
index b359451..6fffb40 100644
--- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py
+++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py
@@ -56,6 +56,7 @@ __docformat__ = 'restructuredtext en'
# Fix an error in wineutils.py
# 6.5.1 - Updated version number, added PDF check for DRM-free documents
# 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_VERSION_TUPLE = (6, 5, 2)
+PLUGIN_VERSION_TUPLE = (6, 5, 3)
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.
RESOURCE_NAME = PLUGIN_NAME + '_Help.htm'
diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py
index 67eb4cb..c3e475c 100644
--- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py
+++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py
@@ -56,8 +56,9 @@ from __future__ import with_statement
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 5.2 - Fixed error in command line processing of unicode arguments
# 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
@@ -194,7 +195,11 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
raise DrmException(u"Input file does not exist.")
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':
mobi = False
@@ -215,8 +220,9 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
md1, md2 = mb.getPIDMetaInfo()
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
# 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 totalpids
try:
mb.processBook(totalpids)
diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_App.pyw b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_App.pyw
index c3a40d4..f4864f8 100644
--- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_App.pyw
+++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_App.pyw
@@ -28,8 +28,9 @@
# 6.5.0 - Fix for some new tags in Topaz ebooks
# 6.5.1 - Version bump to match plugin & Mac app
# 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 os, os.path
diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/__init__.py b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/__init__.py
index b359451..6fffb40 100644
--- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/__init__.py
+++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/__init__.py
@@ -56,6 +56,7 @@ __docformat__ = 'restructuredtext en'
# Fix an error in wineutils.py
# 6.5.1 - Updated version number, added PDF check for DRM-free documents
# 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_VERSION_TUPLE = (6, 5, 2)
+PLUGIN_VERSION_TUPLE = (6, 5, 3)
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.
RESOURCE_NAME = PLUGIN_NAME + '_Help.htm'
diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/k4mobidedrm.py b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/k4mobidedrm.py
index 67eb4cb..c3e475c 100644
--- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/k4mobidedrm.py
+++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/k4mobidedrm.py
@@ -56,8 +56,9 @@ from __future__ import with_statement
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 5.2 - Fixed error in command line processing of unicode arguments
# 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
@@ -194,7 +195,11 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
raise DrmException(u"Input file does not exist.")
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':
mobi = False
@@ -215,8 +220,9 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
md1, md2 = mb.getPIDMetaInfo()
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
# 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 totalpids
try:
mb.processBook(totalpids)
diff --git a/DeDRM_Windows_Application/DeDRM_App_ReadMe.txt b/DeDRM_Windows_Application/DeDRM_App_ReadMe.txt
index 056dc3f..772b946 100644
--- a/DeDRM_Windows_Application/DeDRM_App_ReadMe.txt
+++ b/DeDRM_Windows_Application/DeDRM_App_ReadMe.txt
@@ -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.
-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.
diff --git a/DeDRM_calibre_plugin/DeDRM_plugin.zip b/DeDRM_calibre_plugin/DeDRM_plugin.zip
index 9dcade7..1623337 100644
Binary files a/DeDRM_calibre_plugin/DeDRM_plugin.zip and b/DeDRM_calibre_plugin/DeDRM_plugin.zip differ
diff --git a/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py b/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py
index b359451..6fffb40 100644
--- a/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py
+++ b/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py
@@ -56,6 +56,7 @@ __docformat__ = 'restructuredtext en'
# Fix an error in wineutils.py
# 6.5.1 - Updated version number, added PDF check for DRM-free documents
# 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_VERSION_TUPLE = (6, 5, 2)
+PLUGIN_VERSION_TUPLE = (6, 5, 3)
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.
RESOURCE_NAME = PLUGIN_NAME + '_Help.htm'
diff --git a/DeDRM_calibre_plugin/DeDRM_plugin/k4mobidedrm.py b/DeDRM_calibre_plugin/DeDRM_plugin/k4mobidedrm.py
index 67eb4cb..c3e475c 100644
--- a/DeDRM_calibre_plugin/DeDRM_plugin/k4mobidedrm.py
+++ b/DeDRM_calibre_plugin/DeDRM_plugin/k4mobidedrm.py
@@ -56,8 +56,9 @@ from __future__ import with_statement
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 5.2 - Fixed error in command line processing of unicode arguments
# 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
@@ -194,7 +195,11 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
raise DrmException(u"Input file does not exist.")
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':
mobi = False
@@ -215,8 +220,9 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
md1, md2 = mb.getPIDMetaInfo()
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
# 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 totalpids
try:
mb.processBook(totalpids)
diff --git a/Other_Tools/Kobo/obok.py b/Other_Tools/Kobo/obok.py
index 149d09c..d2188e3 100644
--- a/Other_Tools/Kobo/obok.py
+++ b/Other_Tools/Kobo/obok.py
@@ -1,6 +1,12 @@
#!/usr/bin/env python
# -*- 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
# Fix for windows network user and more xml fixes
#
@@ -145,7 +151,7 @@
#
"""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__)
import sys
@@ -351,9 +357,9 @@ class KoboLibrary(object):
self.kobodir = os.path.join(self.kobodir, u"Kobo", u"Kobo Desktop Edition")
elif sys.platform.startswith('darwin'):
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.
- 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
kobodb = os.path.join(self.kobodir, u"Kobo.sqlite")
# check for existence of file
@@ -582,6 +588,36 @@ class KoboFile(object):
Returns True if the content was checked, False if it was not
checked."""
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]=="