From 9162698f89544ce7ee330d925a5f6d780c2b0dcb Mon Sep 17 00:00:00 2001 From: Apprentice Alf Date: Thu, 2 Dec 2010 18:10:46 +0000 Subject: [PATCH] tools v2.3 First appearance of DeDRM AppleScript application --- Adobe_EPUB_Tools/ineptkey.pyw | 17 + Calibre_Plugins/k4mobidedrm_plugin.zip | Bin 15804 -> 15921 bytes .../k4mobidedrm_plugin/k4mobidedrm_plugin.py | 30 +- .../k4mobidedrm_plugin/k4mutils.py | 28 +- .../k4mobidedrm_plugin/mobidedrm.py | 15 +- DeDRM_Macintosh_Application/DeDRM.app.txt | 1154 +++++++++++++++++ .../DeDRM.app}/Contents/Info.plist | 12 +- .../DeDRM.app}/Contents/MacOS/droplet | Bin .../DeDRM.app}/Contents/PkgInfo | 0 .../Resources/DeDRM Progress Source.zip | Bin 0 -> 15189 bytes .../DeDRM Progress.app/Contents/Info.plist | 30 + .../Contents/MacOS/DeDRM Progress | Bin 29592 -> 37176 bytes .../DeDRM Progress.app/Contents/PkgInfo | 1 + .../Resources/English.lproj/InfoPlist.strings | Bin 0 -> 212 bytes .../English.lproj/MainMenu.nib/classes.nib | 19 + .../English.lproj/MainMenu.nib/info.nib | 18 + .../MainMenu.nib/keyedobjects.nib | Bin 0 -> 6835 bytes .../Contents/Resources/Scripts/Window.scpt | Bin 0 -> 396 bytes .../Contents/Resources/Scripts/main.scpt | Bin 0 -> 190496 bytes .../Resources/description.rtfd/TXT.rtf | 0 .../Contents/Resources/droplet.icns | Bin .../Contents/Resources/droplet.rsrc | Bin 362 -> 362 bytes .../Contents/Resources/encodebase64.py | 46 + .../DeDRM.app/Contents/Resources/erdr2pml.py | 476 +++++++ .../Contents/Resources/ignobleepub.pyw | 323 +++++ .../Contents/Resources/ignoblekeygen.pyw | 232 ++++ .../Contents/Resources/ineptepub.pyw | 462 +++++++ .../DeDRM.app/Contents/Resources/ineptkey.pyw | 458 +++++++ .../Contents/Resources/k4mobidedrm.py | 582 +++++++++ .../DeDRM.app/Contents/Resources/k4mutils.py | 334 +++++ .../DeDRM.app/Contents/Resources/k4pcutils.py | 110 ++ .../DeDRM.app/Contents/Resources/mobidedrm.py | 112 +- .../Contents/Resources/openssl_des.py | 90 ++ .../Contents/Resources/subasyncio.py | 149 +++ .../DeDRM.app/Contents/Resources/zipfix.py | 135 ++ .../K4MobiDeDRM.pyw | 3 +- .../lib/k4mdumpkinfo.py | 333 +++++ .../lib/k4mobidedrm.py | 30 +- .../lib/k4mutils.py | 28 +- .../lib/mobidedrm.py | 15 +- .../gdb_kindle_cmds_r3.txt | 18 + .../gdb_kindle_cmds_r4.txt | 18 + .../Kindle_4_Mac_Unswindle/lib/mobidedrm.py | 15 +- .../Kindle_4_PC_Unswindle/mobidedrm.py | 15 +- Kindle_Mobi_Tools/MobiDeDRM.py | 15 +- .../Mobipocket Unlocker ReadMe.txt | 12 - .../Contents/Info.plist | 50 - .../Contents/Resources/Scripts/main.scpt | Bin 16168 -> 0 bytes .../Contents/Resources/Scripts/main.scpt.txt | 61 - .../Contents/Resources/droplet.rsrc | Bin 336 -> 0 bytes .../eReader Unlocker.app/Contents/PkgInfo | 1 - .../Contents/Resources/Scripts/main.scpt | Bin 17026 -> 0 bytes .../Contents/Resources/Scripts/main.scpt.txt | 59 - .../Resources/description.rtfd/TXT.rtf | 4 - .../Contents/Resources/droplet.icns | Bin 40275 -> 0 bytes .../Contents/Resources/eReaderDeDRM.py | 493 ------- Mobi_Additional_Tools/k4mdumpkinfo.py | 476 +++++++ Mobi_Additional_Tools/lib/mobidedrm.py | 85 +- Topaz_Tools/lib/cmbtc_dump.py | 2 +- Topaz_Tools/lib/cmbtc_v2.2.py | 2 +- Topaz_Tools/lib/k4mutils.py | 28 +- ePub_Fixer/lib/zipfix.py | 5 +- 62 files changed, 5694 insertions(+), 907 deletions(-) create mode 100644 DeDRM_Macintosh_Application/DeDRM.app.txt rename {Macintosh_Applications/eReader Unlocker.app => DeDRM_Macintosh_Application/DeDRM.app}/Contents/Info.plist (78%) rename {Macintosh_Applications/Mobipocket Unlocker.app => DeDRM_Macintosh_Application/DeDRM.app}/Contents/MacOS/droplet (100%) rename {Macintosh_Applications/Mobipocket Unlocker.app => DeDRM_Macintosh_Application/DeDRM.app}/Contents/PkgInfo (100%) create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress Source.zip create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Info.plist rename Macintosh_Applications/eReader Unlocker.app/Contents/MacOS/droplet => DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/MacOS/DeDRM Progress (58%) create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/PkgInfo create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/English.lproj/InfoPlist.strings create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/Scripts/Window.scpt create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/Scripts/main.scpt rename {Macintosh_Applications/Mobipocket Unlocker.app => DeDRM_Macintosh_Application/DeDRM.app}/Contents/Resources/description.rtfd/TXT.rtf (100%) rename {Macintosh_Applications/Mobipocket Unlocker.app => DeDRM_Macintosh_Application/DeDRM.app}/Contents/Resources/droplet.icns (100%) rename {Macintosh_Applications/eReader Unlocker.app => DeDRM_Macintosh_Application/DeDRM.app}/Contents/Resources/droplet.rsrc (70%) create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/encodebase64.py create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/erdr2pml.py create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ignobleepub.pyw create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ignoblekeygen.pyw create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptepub.pyw create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptkey.pyw create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mutils.py create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4pcutils.py rename Macintosh_Applications/Mobipocket Unlocker.app/Contents/Resources/MobiDeDRM.py => DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/mobidedrm.py (77%) create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/openssl_des.py create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/subasyncio.py create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/zipfix.py create mode 100644 Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool/lib/k4mdumpkinfo.py create mode 100644 Kindle_Mobi_Tools/Kindle_4_Mac_Unswindle/gdb_kindle_cmds_r3.txt create mode 100644 Kindle_Mobi_Tools/Kindle_4_Mac_Unswindle/gdb_kindle_cmds_r4.txt delete mode 100644 Macintosh_Applications/Mobipocket Unlocker ReadMe.txt delete mode 100644 Macintosh_Applications/Mobipocket Unlocker.app/Contents/Info.plist delete mode 100644 Macintosh_Applications/Mobipocket Unlocker.app/Contents/Resources/Scripts/main.scpt delete mode 100644 Macintosh_Applications/Mobipocket Unlocker.app/Contents/Resources/Scripts/main.scpt.txt delete mode 100644 Macintosh_Applications/Mobipocket Unlocker.app/Contents/Resources/droplet.rsrc delete mode 100644 Macintosh_Applications/eReader Unlocker.app/Contents/PkgInfo delete mode 100644 Macintosh_Applications/eReader Unlocker.app/Contents/Resources/Scripts/main.scpt delete mode 100644 Macintosh_Applications/eReader Unlocker.app/Contents/Resources/Scripts/main.scpt.txt delete mode 100644 Macintosh_Applications/eReader Unlocker.app/Contents/Resources/description.rtfd/TXT.rtf delete mode 100644 Macintosh_Applications/eReader Unlocker.app/Contents/Resources/droplet.icns delete mode 100644 Macintosh_Applications/eReader Unlocker.app/Contents/Resources/eReaderDeDRM.py create mode 100644 Mobi_Additional_Tools/k4mdumpkinfo.py diff --git a/Adobe_EPUB_Tools/ineptkey.pyw b/Adobe_EPUB_Tools/ineptkey.pyw index e0ac72e..bd66e78 100644 --- a/Adobe_EPUB_Tools/ineptkey.pyw +++ b/Adobe_EPUB_Tools/ineptkey.pyw @@ -31,6 +31,7 @@ # 5 - Clean up and improve 4.x changes; # Clean up and merge OS X support by unknown # 5.1 - add support for using OpenSSL on Windows in place of PyCrypto +# 5.2 - added support for output of key to a particular file """ Retrieve Adobe ADEPT user key. @@ -415,6 +416,20 @@ class ExceptionDialog(Tkinter.Frame): self.text.pack(fill=Tkconstants.BOTH, expand=1) self.text.insert(Tkconstants.END, text) +def cli_main(argv=sys.argv): + keypath = argv[1] + try: + success = retrieve_key(keypath) + except ADEPTError, e: + print "Key generation Error: " + str(e) + return 1 + except Exception, e: + print "General Error: " + str(e) + return 1 + if not success: + return 1 + return 0 + def main(argv=sys.argv): root = Tkinter.Tk() root.withdraw() @@ -438,4 +453,6 @@ def main(argv=sys.argv): return 0 if __name__ == '__main__': + if len(sys.argv) > 1: + sys.exit(cli_main()) sys.exit(main()) diff --git a/Calibre_Plugins/k4mobidedrm_plugin.zip b/Calibre_Plugins/k4mobidedrm_plugin.zip index a8dbe1c4f8cf560acfe3ef84fb1db307272b401b..21a61cb62de5bcb47821fe1f4bc7f3417c819ab2 100644 GIT binary patch delta 14324 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 diff --git a/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py b/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py index 4fc0337..1ad83bc 100644 --- a/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py +++ b/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py @@ -28,7 +28,7 @@ from __future__ import with_statement -__version__ = '1.1' +__version__ = '1.2' class Unbuffered: def __init__(self, stream): @@ -284,7 +284,7 @@ def getK4Pids(exth, title, kInfoFile=None): global kindleDatabase try: kindleDatabase = parseKindleInfo(kInfoFile) - except Exception as message: + except Exception, message: print(message) if kindleDatabase != None : @@ -313,6 +313,8 @@ def getK4Pids(exth, title, kInfoFile=None): exth_records = {} nitems, = unpack('>I', exth[8:12]) pos = 12 + + exth_records[209] = None # Parse the exth records, storing data indexed by type for i in xrange(nitems): type, size = unpack('>II', exth[pos: pos + 8]) @@ -397,6 +399,7 @@ def main(argv=sys.argv): kindleDatabase = None infile = args[0] outfile = args[1] + DecodeErrorString = "" try: # first try with K4PC/K4M ex = MobiPeek(infile) @@ -405,11 +408,15 @@ def main(argv=sys.argv): return 2 title = ex.getBookTitle() exth = ex.getexthData() + if exth=='': + raise DrmException("Not a Kindle Mobipocket file") pid = getK4Pids(exth, title) unlocked_file = mobidedrm.getUnencryptedBook(infile, pid) - except DrmException: + except DrmException, e: + DecodeErrorString += "Error trying default K4 info: " + str(e) + "\n" pass - except mobidedrm.DrmException: + except mobidedrm.DrmException, e: + DecodeErrorString += "Error trying default K4 info: " + str(e) + "\n" pass else: file(outfile, 'wb').write(unlocked_file) @@ -422,11 +429,15 @@ def main(argv=sys.argv): try: title = ex.getBookTitle() exth = ex.getexthData() + if exth=='': + raise DrmException("Not a Kindle Mobipocket file") pid = getK4Pids(exth, title, infoFile) unlocked_file = mobidedrm.getUnencryptedBook(infile, pid) - except DrmException: + except DrmException, e: + DecodeErrorString += "Error trying " + infoFile + " K4 info: " + str(e) + "\n" pass - except mobidedrm.DrmException: + except mobidedrm.DrmException, e: + DecodeErrorString += "Error trying " + infoFile + " K4 info: " + str(e) + "\n" pass else: file(outfile, 'wb').write(unlocked_file) @@ -445,6 +456,7 @@ def main(argv=sys.argv): return 0 # we could not unencrypt book + print DecodeErrorString print "Error: Could Not Unencrypt Book" return 1 @@ -463,7 +475,7 @@ if not __name__ == "__main__" and inCalibre: Provided by the work of many including DiapDealer, SomeUpdates, IHeartCabbages, CMBDTC, Skindle, DarkReverser, ApprenticeAlf, etc.' supported_platforms = ['osx', 'windows', 'linux'] # Platforms this plugin will run on author = 'DiapDealer, SomeUpdates' # The author of this plugin - version = (0, 1, 1) # The version number of this plugin + version = (0, 1, 3) # The version number of this plugin file_types = set(['prc','mobi','azw']) # The file types that this plugin will be applied to on_import = True # Run this plugin during the import priority = 200 # run this plugin before mobidedrm, k4pcdedrm, k4dedrm @@ -509,6 +521,8 @@ if not __name__ == "__main__" and inCalibre: return path_to_ebook title = ex.getBookTitle() exth = ex.getexthData() + if exth=='': + raise DrmException("Not a Kindle Mobipocket file") pid = getK4Pids(exth, title) unlocked_file = mobidedrm.getUnencryptedBook(path_to_ebook,pid) except DrmException: @@ -528,6 +542,8 @@ if not __name__ == "__main__" and inCalibre: try: title = ex.getBookTitle() exth = ex.getexthData() + if exth=='': + raise DrmException("Not a Kindle Mobipocket file") pid = getK4Pids(exth, title, infoFile) unlocked_file = mobidedrm.getUnencryptedBook(path_to_ebook,pid) except DrmException: diff --git a/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py b/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py index 977d81c..33771eb 100644 --- a/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py +++ b/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py @@ -237,24 +237,36 @@ LibCrypto = _load_crypto() # # uses a sub process to get the Hard Drive Serial Number using ioreg -# returns with the first found serial number in that class +# returns with the serial number of drive whose BSD Name is "disk0" def GetVolumeSerialNumber(): - cmdline = '/usr/sbin/ioreg -r -c AppleAHCIDiskDriver' + sernum = os.getenv('MYSERIALNUMBER') + if sernum != None: + return sernum + cmdline = '/usr/sbin/ioreg -l -S -w 0 -r -c AppleAHCIDiskDriver' cmdline = cmdline.encode(sys.getfilesystemencoding()) p = Process(cmdline, shell=True, bufsize=1, stdin=None, stdout=PIPE, stderr=PIPE, close_fds=False) poll = p.wait('wait') results = p.read() reslst = results.split('\n') - sernum = '9999999999' cnt = len(reslst) + bsdname = None + sernum = None + foundIt = False for j in xrange(cnt): resline = reslst[j] pp = resline.find('"Serial Number" = "') if pp >= 0: - sernum = resline[pp+19:] - sernum = sernum[:-1] - sernum = sernum.lstrip() - break + sernum = resline[pp+19:-1] + sernum = sernum.strip() + bb = resline.find('"BSD Name" = "') + if bb >= 0: + bsdname = resline[bb+14:-1] + bsdname = bsdname.strip() + if (bsdname == 'disk0') and (sernum != None): + foundIt = True + break + if not foundIt: + sernum = '9999999999' return sernum # uses unix env to get username instead of using sysctlbyname @@ -319,4 +331,4 @@ def openKindleInfo(kInfoFile=None): raise K4MDrmException('Error: .kindle-info file can not be found') return open(kinfopath,'r') else: - return open(kInfoFile, 'r') \ No newline at end of file + return open(kInfoFile, 'r') diff --git a/Calibre_Plugins/k4mobidedrm_plugin/mobidedrm.py b/Calibre_Plugins/k4mobidedrm_plugin/mobidedrm.py index eed1cce..9f17a3b 100644 --- a/Calibre_Plugins/k4mobidedrm_plugin/mobidedrm.py +++ b/Calibre_Plugins/k4mobidedrm_plugin/mobidedrm.py @@ -3,14 +3,6 @@ # This is a python script. You need a Python interpreter to run it. # For example, ActiveState Python, which exists for windows. # -# It can run standalone to convert files, or it can be installed as a -# plugin for Calibre (http://calibre-ebook.com/about) so that -# importing files with DRM 'Just Works'. -# -# To create a Calibre plugin, rename this file so that the filename -# ends in '_plugin.py', put it into a ZIP file and import that Calibre -# using its plugin configuration GUI. -# # Changelog # 0.01 - Initial version # 0.02 - Huffdic compressed books were not properly decrypted @@ -46,8 +38,9 @@ # 0.18 - It seems that multibyte entries aren't encrypted in a v7 file... # Removed the disabled Calibre plug-in code # Permit use of 8-digit PIDs +# 0.19 - It seems that multibyte entries aren't encrypted in a v6 file either. -__version__ = '0.18' +__version__ = '0.19' import sys import struct @@ -215,8 +208,8 @@ class DrmStripper: if (mobi_length >= 0xE4) and (mobi_version >= 5): extra_data_flags, = struct.unpack('>H', sect[0xF2:0xF4]) print "Extra Data Flags = %d" %extra_data_flags - if mobi_version < 7: - # multibyte utf8 data is included in the encryption for mobi_version 5 (& 6?) + if mobi_version <= 5: + # multibyte utf8 data is included in the encryption for mobi_version 5 and below # so clear that byte so that we leave it to be decrypted. extra_data_flags &= 0xFFFE diff --git a/DeDRM_Macintosh_Application/DeDRM.app.txt b/DeDRM_Macintosh_Application/DeDRM.app.txt new file mode 100644 index 0000000..099e256 --- /dev/null +++ b/DeDRM_Macintosh_Application/DeDRM.app.txt @@ -0,0 +1,1154 @@ +property prefsFileName : "com.apprenticealf.dedrm.plist" +property prefsFolderName : "com.apprenticealf.dedrm" +property handledExtensions : {"epub", "pdf", "prc", "azw", "mobi", "pdb", "der", "b64"} + +global eReaderTool +global MobipocketTool +global BNKeyGenTool +global BNePubTool +global AdobeKeyGenTool +global AdobeePubTool +global AdobePDFTool +global ZipFixTool +global ProgressApp + +global PIDs +global bnKeys +global KindleInfoList +global AdeptKeyList + +global ErrorList +global WarningList +global CompletedList +global ErrorCount +global WarningCount +global CompletedCount +global totalebooks +global completedebooks + +on folderexists(inputFolder) + try + do shell script "test -d " & quoted form of (POSIX path of inputFolder) + return true + end try + + return false +end folderexists + +on fileexists(inputFile) + try + do shell script "test -f " & quoted form of (POSIX path of inputFile) + return true + end try + + return false +end fileexists + +on GetTools() + set eReaderTool to POSIX path of file (path to me as text) & "Contents/Resources/erdr2pml.py" + set MobipocketTool to POSIX path of file (path to me as text) & "Contents/Resources/k4mobidedrm.py" + set BNKeyGenTool to POSIX path of file (path to me as text) & "Contents/Resources/ignoblekeygen.pyw" + set BNePubTool to POSIX path of file (path to me as text) & "Contents/Resources/ignobleepub.pyw" + set AdobeKeyGenTool to POSIX path of file (path to me as text) & "Contents/Resources/ineptkey.pyw" + set AdobeePubTool to POSIX path of file (path to me as text) & "Contents/Resources/ineptepub.pyw" + set AdobePDFTool to POSIX path of file (path to me as text) & "Contents/Resources/ineptpdf.pyw" + set ZipFixTool to POSIX path of file (path to me as text) & "Contents/Resources/zipfix.py" + set ProgressApp to POSIX path of file ((path to resource "DeDRM Progress.app") as string) + if not fileexists(eReaderTool) or not fileexists(MobipocketTool) or not fileexists(BNKeyGenTool) or not fileexists(BNePubTool) or not fileexists(AdobeKeyGenTool) or not fileexists(AdobeePubTool) or not folderexists(ProgressApp) then + display dialog "De-drm scripts or support files are missing from this package. Get a fresh copy." buttons {"Bother"} default button 1 with title "DeDRM Applescript" with icon stop + return false + end if + return true +end GetTools + +on unlockmobifile(encryptedFile) + --check it's a mobi file. + set BOOKMOBI to "NOTAMOBI" + try + set BOOKMOBI to read file encryptedFile from 61 for 8 + end try + if BOOKMOBI is not "BOOKMOBI" then + set TOPAZ to "NOT" + try + set TOPAZ to read file encryptedFile from 1 for 4 + end try + set ErrorCount to ErrorCount + 1 + if TOPAZ is "TPZ0" then + set ErrorList to ErrorList & encryptedFile & " is a TOPAZ file. + +" + else + set ErrorList to ErrorList & encryptedFile & " is not a Mobipocket file. + +" + end if + return + end if + set encryptedFilePath to POSIX path of file encryptedFile + tell application "Finder" + set parent_folder to (container of file encryptedFile) as text + set fileName to (name of file encryptedFile) as text + end tell + set fileExtension to "" + if fileName contains "." then + set AppleScript's text item delimiters to "." + set fileExtension to "." & the last text item of fileName + set fileName to (text items 1 through -2 of fileName) as string + end if + set unlockedFilePath to POSIX path of file (parent_folder & fileName & "_dedrmed" & fileExtension) + set shellcommand to "python " & (quoted form of MobipocketTool) + repeat with KindleInfoPath in KindleInfoList + set shellcommand to shellcommand & " -k " & quoted form of KindleInfoPath + end repeat + set PIDstring to GetPIDstring() + if PIDstring is not "" then set shellcommand to shellcommand & " -p " & PIDstring + set shellcommand to shellcommand & " " & (quoted form of encryptedFilePath) & " " & (quoted form of unlockedFilePath) + --display dialog "shellcommand: " default answer shellcommand buttons {"OK"} default button 1 giving up after 10 + try + set shellresult to do shell script shellcommand + on error errmsg + set shellresult to errmsg + end try + try + if (offset of "Error" in shellresult) > 0 then + set ErrorCount to ErrorCount + 1 + set ErrorList to (ErrorList & fileName & fileExtension & " couldn't be decoded: +" & shellresult as text) & " + +" + else if (offset of "not encrypted" in shellresult) > 0 then + set WarningCount to WarningCount + 1 + set WarningList to WarningList & fileName & fileExtension & " is not encrypted. + +" + else + set CompletedCount to CompletedCount + 1 + if CompletedList is "" then + set CompletedList to CompletedList & fileName & fileExtension + else + set CompletedList to CompletedList & ", " & fileName & fileExtension + end if + end if + end try +end unlockmobifile + +on unlockpdbfile(encryptedFile) + --check it's an eReader file. + set PNRdPPrs to "NOT_eREADER" + try + set PNRdPPrs to read file encryptedFile from 61 for 8 + end try + if PNRdPPrs is not "PNRdPPrs" then + set ErrorList to ErrorList & encryptedFile & " is not an eReader file. + +" + return + end if + set encryptedFilePath to POSIX path of file encryptedFile + tell application "Finder" + set parent_folder to (container of file encryptedFile) as text + set fileName to (name of file encryptedFile) as text + end tell + set fileExtension to "" + if fileName contains "." then + set AppleScript's text item delimiters to "." + set fileExtension to "." & the last text item of fileName + set fileName to (text items 1 through -2 of fileName) as string + end if + set pmlFile to parent_folder & fileName & "_Source:" & fileName & ".pml" + set clearFile to parent_folder & fileName & "_Source:" & fileName & ".pdb" + set clearFileNew to parent_folder & fileName & "_Source:" & fileName & "_dedrmed.pdb" + set clearFileNewName to fileName & "_dedrmed.pdb" + set sourcePath to (POSIX path of file parent_folder) & fileName & "_Source/" + set pmlzFilePath to POSIX path of file parent_folder & fileName & "_dedrmed.pmlz" + if length of bnKeys is 0 then + GetKeys() + end if + set shellresult to "Error: No eReader/Barnes & Noble Name:Number keys supplied. Can't decrypt." + repeat with BNKey in bnKeys + set encryptionName to first item of BNKey + set encryptionNumber to second item of BNKey + if length of encryptionName > 0 and length of encryptionNumber > 0 then + set shellcommand to "python " & (quoted form of eReaderTool) & " " & (quoted form of encryptedFilePath) & " " & (quoted form of encryptionName) & " " & (quoted form of encryptionNumber) + --display dialog "shellcommand: " & shellcommand buttons {"OK"} default button 1 giving up after 10 + set shellresult to "no result" + try + set shellresult to do shell script shellcommand + on error errmsg + set shellresult to errmsg + end try + --display dialog shellresult + if (offset of "Error" in shellresult) is 0 then + -- try to run dropbook and move compiled book to same folder as encrypted book + try + try + tell application "Finder" to set DropBook to (application file id "PPDr") as string + on error + error "Couldn't find DropBook application" + end try + -- now also compile back up into pdb file using DropBook if it's on this system + tell application DropBook to open file pmlFile + delay 1 -- probably don't need this, but just in case. + tell application DropBook to quit + try + tell application "Finder" + set name of file clearFile to clearFileNewName + move clearFileNew to parent_folder + end tell + on error + error "DropBook failed to compile the source folder into a pdb file." + end try + on error errmsg + set WarningCount to WarningCount + 1 + set WarningList to (WarningList & fileName & fileExtension & " couldn't be compiled back to pdb: +" & errmsg as text) & " + +" + end try + -- try to compress source folder contensts to a pmlz file for easy import into Calibre + try + set shellcommand to "cd " & quoted form of sourcePath & "; zip -r " & quoted form of pmlzFilePath & " *" + --display dialog shellcommand + set zipshellresult to do shell script shellcommand + --display dialog zipshellresult + tell application "Finder" + -- move source folder to the trash + move parent_folder & fileName & "_Source" to trash + end tell + on error errmsg + set WarningCount to WarningCount + 1 + set WarningList to (WarningList & fileName & fileExtension & "source folder couldn't be compressed to pmlz: +" & errmsg as text) & " + +" + end try + -- we've done the decrypting so exit the loop. + exit repeat + end if + end if + end repeat + try + if (offset of "incorrect eReader version 10" in shellresult) > 0 then + set WarningCount to WarningCount + 1 + set WarningList to WarningList & fileName & fileExtension & " is not encrypted. + +" + else if (offset of "Error" in shellresult) > 0 then + set ErrorCount to ErrorCount + 1 + set ErrorList to (ErrorList & fileName & fileExtension & " couldn't be decoded: +" & shellresult as text) & " + +" + else + set CompletedCount to CompletedCount + 1 + if CompletedList is "" then + set CompletedList to CompletedList & fileName & fileExtension + else + set CompletedList to CompletedList & ", " & fileName & fileExtension + end if + end if + end try +end unlockpdbfile + +on unlockepubfile(encryptedFile) + --check it's an ePub file. + set ePubSig to "NOT_ePub" + try + set ePubSig to read file encryptedFile from 31 for 28 + end try + --display dialog ePubSig + if ePubSig is not "mimetypeapplication/epub+zip" then + set ErrorList to ErrorList & encryptedFile & " is not an ePub file. + +" + return + end if + set encryptedFilePath to POSIX path of file encryptedFile + tell application "Finder" + set parent_folder to (container of file encryptedFile) as text + set fileName to (name of file encryptedFile) as text + end tell + set fileExtension to "" + if fileName contains "." then + set AppleScript's text item delimiters to "." + set fileExtension to "." & the last text item of fileName + set fileName to (text items 1 through -2 of fileName) as string + end if + + set decoded to "NO" + -- first we must fix any possible zip problems with the epub + set fixedFilePath to POSIX path of file (parent_folder & fileName & "_fixed" & fileExtension) + set shellcommand to "python " & (quoted form of ZipFixTool) & " " & (quoted form of encryptedFilePath) & " " & (quoted form of fixedFilePath) + set shellresult to "no result" + try + --display dialog "shellcommand: " default answer shellcommand buttons {"OK"} default button 1 giving up after 10 + set shellresult to do shell script shellcommand + on error errmsg + set shellresult to "Error: " & errmsg + end try + + if (offset of "Error" in shellresult) > 0 then + set ErrorCount to ErrorCount + 1 + set ErrorList to ((ErrorList & fileName & fileExtension & " had a problem with ZipFix: +" & shellresult as text) & " + +") + return + end if + + set unlockedFilePath to POSIX path of file (parent_folder & fileName & "_dedrmed" & fileExtension) + set shellresult to "no keys" + + -- first we'll try the Barnes & Noble keys + repeat with BNKey in bnKeys + + set keyfilepath to third item of BNKey + if length of keyfilepath > 0 then + set shellcommand to "python " & (quoted form of BNePubTool) & " " & (quoted form of keyfilepath) & " " & (quoted form of fixedFilePath) & " " & (quoted form of unlockedFilePath) + --display dialog "shellcommand: " & shellcommand buttons {"OK"} default button 1 giving up after 10 + set shellresult to "no result" + try + set shellresult to do shell script shellcommand + on error errmsg + set shellresult to "Error: " & errmsg + end try + if (offset of "Error" in shellresult) is 0 then + set decoded to "YES" + exit repeat + end if + if (offset of "improper key" in shellresult) is 0 then + exit repeat + end if + end if + end repeat + + if decoded is "NO" then + -- now try Adobe ePub + repeat with AdeptKey in AdeptKeyList + set shellcommand to "python " & (quoted form of AdobeePubTool) & " " & (quoted form of AdeptKey) & " " & (quoted form of fixedFilePath) & " " & (quoted form of unlockedFilePath) + --display dialog "shellcommand: " default answer shellcommand buttons {"OK"} default button 1 giving up after 10 + set shellresult to "no result" + try + set shellresult to do shell script shellcommand + on error errmsg + set shellresult to "Error: " & errmsg + end try + if (offset of "Error" in shellresult) is 0 then + set decoded to "YES" + exit repeat + end if + end repeat + end if + + if decoded is "YES" then + set CompletedCount to CompletedCount + 1 + if CompletedList is "" then + set CompletedList to CompletedList & fileName & fileExtension + else + set CompletedList to CompletedList & ", " & fileName & fileExtension + end if + else if shellresult is "no keys" then + set ErrorCount to ErrorCount + 1 + set ErrorList to (ErrorList & fileName & fileExtension & " couldn't be decoded: no keys. + +") + else + set ErrorCount to ErrorCount + 1 + set ErrorList to ((ErrorList & fileName & fileExtension & " couldn't be decoded: +" & shellresult as text) & " + +") + end if + + tell application "Finder" + move alias ((POSIX file fixedFilePath) as text) to trash + end tell +end unlockepubfile + +on unlockpdffile(encryptedFile) + --check it's an ePub file. + set PDFSig to "NOT_DF" + try + set PDFSig to read file encryptedFile from 1 for 4 + end try + --display dialog PDFSig + if PDFSig is not "%PDF" then + set ErrorCount to ErrorCount + 1 + set ErrorList to ErrorList & encryptedFile & " is not a PDF file. + +" + return + end if + set encryptedFilePath to POSIX path of file encryptedFile + tell application "Finder" + set parent_folder to (container of file encryptedFile) as text + set fileName to (name of file encryptedFile) as text + end tell + set fileExtension to "" + if fileName contains "." then + set AppleScript's text item delimiters to "." + set fileExtension to "." & the last text item of fileName + set fileName to (text items 1 through -2 of fileName) as string + end if + + set decoded to "NO" + -- first we must check we have a PDF script + if not fileexists(AdobePDFTool) then + set newFile to AdobePDFTool + try + tell me to activate + set newFile to ((choose file with prompt "Please find the ineptpdf script") as text) + end try + if not fileexists(newFile) then + set ErrorCount to ErrorCount + 1 + set ErrorList to ErrorList & encryptedFile & " is a PDF file and no ineptpdf script found. + +" + return + end if + -- set AdobePDFTool to POSIX path of file CopyToPrefs(newFile) + set AdobePDFTool to POSIX path of file newFile + WritePrefs() + end if + if not fileexists(AdobePDFTool) then + set ErrorCount to ErrorCount + 1 + set ErrorList to ErrorList & encryptedFile & " is a PDF file and no ineptpdf script found. + +" + return + end if + + set unlockedFilePath to POSIX path of file (parent_folder & fileName & "_dedrmed" & fileExtension) + set decoded to false + repeat with AdeptKey in AdeptKeyList + set shellcommand to "python " & (quoted form of AdobePDFTool) & " " & (quoted form of AdeptKey) & " " & (quoted form of encryptedFilePath) & " " & (quoted form of unlockedFilePath) + --display dialog "shellcommand: " default answer shellcommand buttons {"OK"} default button 1 giving up after 10 + set shellresult to "no result" + try + set shellresult to do shell script shellcommand + on error errmsg + set shellresult to "Error: " & errmsg + end try + if (offset of "Error" in shellresult) is 0 then + set decoded to true + exit repeat + end if + end repeat + + if decoded then + set CompletedCount to CompletedCount + 1 + if CompletedList is "" then + set CompletedList to CompletedList & fileName & fileExtension + else + set CompletedList to CompletedList & ", " & fileName & fileExtension + end if + else if shellresult is "no keys" then + set ErrorCount to ErrorCount + 1 + set ErrorList to (ErrorList & fileName & fileExtension & " couldn't be decoded: no keys. + +") + else + set ErrorCount to ErrorCount + 1 + set ErrorList to ((ErrorList & fileName & fileExtension & " couldn't be decoded: +" & shellresult as text) & " + +") + end if +end unlockpdffile + +on handlefile(droppedFile) + tell application "Finder" + set fileName to (name of file droppedFile) as text + end tell + set fileExtension to "" + if fileName contains "." then + set AppleScript's text item delimiters to "." + set fileExtension to the last text item of fileName + set fileName to (text items 1 through -2 of fileName) as string + end if + if fileExtension is "prc" or fileExtension is "mobi" or fileExtension is "azw" then + set completedebooks to completedebooks + 1 + IncProgress(fileName, completedebooks) + unlockmobifile(droppedFile as text) + else if fileExtension is "pdb" then + set completedebooks to completedebooks + 1 + IncProgress(fileName, completedebooks) + unlockpdbfile(droppedFile as text) + else if fileExtension is "epub" then + set completedebooks to completedebooks + 1 + IncProgress(fileName, completedebooks) + unlockepubfile(droppedFile as text) + else if fileExtension is "pdf" then + set completedebooks to completedebooks + 1 + IncProgress(fileName, completedebooks) + unlockpdffile(droppedFile as text) + else if fileExtension is "der" then + AddAdeptKey(droppedFile as text) + else if fileExtension is "b64" then + AddbnKey(droppedFile as text) + end if +end handlefile + +on handlefolder(droppedFolder) + tell application "Finder" to set fileList to (every file in folder droppedFolder) + tell application "Finder" to set folderList to (every folder in folder droppedFolder) + repeat with this_item in fileList + if not ProgressActive() then + exit repeat + end if + handlefile(this_item as text) + end repeat + repeat with this_item in folderList + if not ProgressActive() then + exit repeat + end if + handlefolder(this_item as text) + end repeat +end handlefolder + +on countfile(droppedFile) + tell application "Finder" + set fileName to (name of file droppedFile) as text + end tell + set fileExtension to "" + if fileName contains "." then + set AppleScript's text item delimiters to "." + set fileExtension to the last text item of fileName + set fileName to (text items 1 through -2 of fileName) as string + end if + if fileExtension is in handledExtensions then + set totalebooks to totalebooks + 1 + end if +end countfile + +on GetPIDstring() + set PIDstring to "" + repeat with PID in PIDs + if PIDstring is "" then + set PIDstring to PID + else + set PIDstring to PIDstring & "," & PID + end if + end repeat + return PIDstring +end GetPIDstring + +on GetKindleInfostring() + set KInfostring to "" + repeat with KindleInfo in KindleInfoList + if KInfostring is "" then + set KInfostring to (KindleInfo as text) + else + set KInfostring to KInfostring & " +" & (KindleInfo as text) + end if + end repeat + return KInfostring +end GetKindleInfostring + +on GetAdeptstring() + set Adeptstring to "" + repeat with AdeptKeyFile in AdeptKeyList + set AppleTypeFile to POSIX file (AdeptKeyFile as text) + tell application "Finder" + set fileName to name of file (AppleTypeFile as text) + end tell + + if Adeptstring is "" then + set Adeptstring to fileName + else + set Adeptstring to Adeptstring & " +" & fileName + end if + end repeat + return Adeptstring +end GetAdeptstring + +on GetBNKeystring() + set BNKeystring to "" + repeat with BNKey in bnKeys + if BNKeystring is "" then + set BNKeystring to first item of BNKey & ":" & second item of BNKey + else + set BNKeystring to BNKeystring & " +" & first item of BNKey & ":" & second item of BNKey + end if + if length of third item of BNKey > 0 then + set BNKeystring to BNKeystring & "*" + end if + if length of second item of BNKey > 0 then + set BNKeystring to BNKeystring & " " + end if + end repeat + return BNKeystring +end GetBNKeystring + + +on GetPIDs() + repeat + set PIDstring to GetPIDstring() + if PIDstring is "" then + set DialogPrompt to "Enter any Mobipocket PIDs one at a time:" + set FinishedButton to "None" + else + set DialogPrompt to "Current PIDs: " & PIDstring & ". + +Enter any additional Mobipocket PIDs for your Mobipocket books one at a time:" + set FinishedButton to "No More" + end if + set dialogresult to (display dialog DialogPrompt default answer "" buttons {"Delete All", "Add", FinishedButton} with title "DeDRM Applescript" default button 2) + if button returned of dialogresult is "Add" then + set PID to text returned of dialogresult + set PIDlength to length of PID + if PIDlength is 8 or PIDlength is 10 then + set PIDs to PIDs & PID + else + display dialog "PIDs must be 8 or 10 characters long." buttons {"OK"} default button 1 with title "DeDRM Applescript" with icon caution + end if + else if button returned of dialogresult is "Delete All" then + if PIDstring is not "" then + try + set dialogresult to (display dialog "Are you sure you want to delete all stored PIDs?" buttons {"Cancel", "Delete"} default button 1 with title "DeDRM Applescript") + end try + if button returned of dialogresult is "Delete" then + set PIDs to {} + end if + end if + else + exit repeat + end if + end repeat +end GetPIDs + +on GetKindleInfoFiles() + repeat + set KInfostring to GetKindleInfostring() + if KInfostring is "" then + set DialogPrompt to "To add extra Kindle Info files, click the AddÉ button. You do not need to add the Kindle Info file for the copy of Kindle for Mac on this machine." + set FinishedButton to "None" + else + set DialogPrompt to "Known extra Kindle Info file: +" & KInfostring & " + +To add extra Kindle Info files, click the AddÉ button. You do not need to add the Kindle Info file for the copy of Kindle for Mac on this machine." + set FinishedButton to "No More" + end if + set dialogresult to (display dialog DialogPrompt buttons {"Forget All", "AddÉ", FinishedButton} with title "DeDRM Applescript" default button 2) + if button returned of dialogresult is "AddÉ" then + try + set newFile to POSIX path of file ((choose file with prompt "Please select a Kindle Info file") as text) + set KindleInfoList to KindleInfoList & newFile + on error errmsg + display dialog errmsg buttons {"Bother"} default button 1 + end try + + else if button returned of dialogresult is "Forget All" then + if KInfostring is not "" then + try + set dialogresult to (display dialog "Are you sure you want to forget all extra Kindel Info files?" buttons {"Cancel", "Forget"} default button 1 with title "DeDRM Applescript") + end try + if button returned of dialogresult is "Forget" then + set KindleInfoList to {} + end if + end if + else + exit repeat + end if + end repeat +end GetKindleInfoFiles + +on GetKeys() + set bnKeyText to "" + repeat + set BNKeystring to GetBNKeystring() + if BNKeystring is "" then + set DialogPrompt to "Please enter any " + set FinishedButton to "None" + else + set DialogPrompt to "Current B&N keys*, eReader keys : +" & BNKeystring & " + +Please enter any additional " + set FinishedButton to "No More" + end if + set DialogPrompt to DialogPrompt & "eReader/Barnes & Noble Name:Number key pairs one at a time. If you're only decoding eReader files, the last 8 digits of the Number will do. The full 16 are only needed for Barnes & Noble ePubs. Only the last eight will be stored or displayed. Please separate the name and number with a colon and click \"Add\". Or to add a an already generated .b64 file, just click \"Add\" with nothing in the text field." + + set dialogresult to (display dialog DialogPrompt default answer bnKeyText buttons {"Delete All", "Add", FinishedButton} with title "DeDRM Applescript" default button 2) + if button returned of dialogresult is "Add" then + set bnKeyText to text returned of dialogresult + if bnKeyText is "" then + try + set newFile to (choose file with prompt "Please select a B&N .b64 key file") as text + -- copy to prefs + AddbnKey(newFile) + on error message + if message does not contain "cancel" then + display dialog message + end if + end try + else if not (bnKeyText contains ":") then + display dialog "Name and Number must be separated by a colon (:)." buttons {"OK"} default button 1 with title "DeDRM Applescript" with icon caution + else + set AppleScript's text item delimiters to ":" + set keyNumber to the last text item of bnKeyText + set keyName to (text items 1 through -2 of bnKeyText) as string + + if ((length of keyNumber) = 16 or (length of keyNumber) = 8) and (length of keyName) > 0 then + set shellresult to "" + set keyfilepath to "" + if (length of keyNumber) = 16 then + -- get the B&N key from this pair + set shellresult to "no result" + set scriptError to "Key Gen Script failed." + set prefsFolder to (path to preferences from user domain as string) & prefsFolderName & ":" + set keyfileName to GetUniqueName(prefsFolder, keyName & (text -8 thru -1 of keyNumber) & ".b64") + set keyfilepath to POSIX path of (prefsFolder & keyfileName) + try + set shellresult to do shell script "python " & (quoted form of BNKeyGenTool) & " " & (quoted form of keyName) & " " & (quoted form of keyNumber) & " " & quoted form of keyfilepath + on error errmsg + set shellresult to "no result" + set scriptError to errmsg + end try + end if + if shellresult is not "no result" then + set bnKeys to bnKeys & {{keyName, (text -8 thru -1 of keyNumber), keyfilepath}} + set bnKeyText to "" + else + display dialog "Error generating key from this info, error message was: " & scriptError buttons {"OK"} default button 1 with title "DeDRM Applescript" with icon caution + end if + else + display dialog "Key numbers must be 8 or 16 characters long (no spaces) and the key name must not be absent." buttons {"OK"} default button 1 with title "DeDRM Applescript" with icon caution + end if + end if + else if button returned of dialogresult is "Delete All" then + if BNKeystring is not "" then + try + set dialogresult to (display dialog "Are you sure you want to delete all stored Name:Number key pairs?" buttons {"Cancel", "Delete"} default button 1 with title "DeDRM Applescript") + end try + if button returned of dialogresult is "Delete" then + set bnKeys to {} + end if + end if + set bnKeyText to "" + else + set bnKeyText to text returned of dialogresult + if bnKeyText is not "" then + try + set dialogresult to (display dialog "You entered some text, but didn't click Add. Are you sure you want to more on to the next dialog?" buttons {"Whoops", "Yes, Move on"} default button 1 with title "DeDRM Applescript") + end try + if button returned of dialogresult is "Yes, Move on" then + exit repeat + end if + else + exit repeat + end if + end if + end repeat +end GetKeys + +on GetAdeptKeyFiles() + repeat + set Adeptstring to GetAdeptstring() + if Adeptstring is "" then + set DialogPrompt to "To add Adobe Digital Editions (Adept) key files, click the AddÉ button. " + set FinishedButton to "None" + else + set DialogPrompt to "Current Adobe Digital Editions (Adept) key files: +" & Adeptstring & " + +To add extra key files (.der), click the AddÉ button." + set FinishedButton to "No More" + end if + set dialogresult to (display dialog DialogPrompt buttons {"Forget All", "AddÉ", FinishedButton} with title "DeDRM Applescript" default button 2) + if button returned of dialogresult is "AddÉ" then + try + set newFile to (choose file with prompt "Please select an Adept key file") as text + -- copy to prefs + AddAdeptKey(newFile) + on error message + if message does not contain "cancel" then + display dialog message + end if + end try + + else if button returned of dialogresult is "Forget All" then + if Adeptstring is not "" then + try + set dialogresult to (display dialog "Are you sure you want to forget all extra Adobe Digital Editions Adept key files?" buttons {"Cancel", "Forget"} default button 1 with title "DeDRM Applescript") + end try + if button returned of dialogresult is "Forget" then + set AdeptKeyList to {} + GetAdeptKey(false) + end if + end if + else + exit repeat + end if + end repeat +end GetAdeptKeyFiles + +on GetAdeptKey(always) + set userPrefsPath to path to preferences from user domain as string + set preferencesFolderPath to userPrefsPath & prefsFolderName & ":" + if not folderexists(preferencesFolderPath) then + tell application "Finder" + set preferencesFolder to make new folder at userPrefsPath with properties {name:prefsFolderName} + end tell + end if + set userAdeptKeyPath to POSIX path of (preferencesFolderPath & "Local Adept Key.der") + if ((count of AdeptKeyList) is 0) or always then + set shellresult to "no result" + set success to true + try + set scriptError to do shell script "python " & (quoted form of AdobeKeyGenTool) & " " & quoted form of userAdeptKeyPath + on error errmsg + set success to false + set scriptError to errmsg + end try + if success then + if not (AdeptKeyList contains userAdeptKeyPath) then + set AdeptKeyList to AdeptKeyList & userAdeptKeyPath + end if + else + if (always) then + display dialog "Error generating key for Adobe Editions: " & scriptError & " + +You must have Adobe Digital Editions installed for this script to work with Adobe ePubs, or add a key file manually. " buttons {"OK"} default button 1 with title "DeDRM Applescript" with icon caution + end if + end if + end if +end GetAdeptKey + +on encodeAsBase64(theFilePath) + set posixfilepath to POSIX path of file theFilePath + set base64path to POSIX path of file ((path to me as text) & "Contents:Resources:encodebase64.py") + return do shell script "python " & quoted form of base64path & " " & quoted form of posixfilepath +end encodeAsBase64 + +on AddAdeptKey(keyfile) + set fileExtension to "" + if keyfile contains "." then + set AppleScript's text item delimiters to "." + set fileExtension to the last text item of keyfile + end if + if fileExtension is "der" then + set newPrefsFile to CopyToPrefs(keyfile) + set AdeptKeyList to AdeptKeyList & POSIX path of newPrefsFile + else + display dialog "Adobe Adept key files generated by adeptkey.pyw must have a .der extension." buttons {"OK"} default button 1 with title "DeDRM Applescript" with icon caution + end if +end AddAdeptKey + +on AddbnKey(keyfile) + set fileExtension to "" + if keyfile contains "." then + set AppleScript's text item delimiters to "." + set fileExtension to the last text item of keyfile + end if + if fileExtension is "b64" then + set newPrefsFile to CopyToPrefs(keyfile) + tell application "Finder" + set keyfileName to (name of file newPrefsFile) as text + end tell + set fileExtension to "" + set fileName to keyfileName + if keyfileName contains "." then + set AppleScript's text item delimiters to "." + set fileExtension to the last text item of keyfileName + set fileName to (text items 1 through -2 of keyfileName) as string + end if + set bnKeys to bnKeys & {{fileName, "", POSIX path of newPrefsFile}} + else + display dialog "Barnes & Noble key files generated by ignoblekeygen.pyw must have a .b64 extension." buttons {"OK"} default button 1 with title "DeDRM Applescript" with icon caution + end if +end AddbnKey + +on GetUniqueName(folderPath, fileName) + set newFileName to fileName + if fileexists(folderPath & fileName) then + -- first find new name that's unique to folder (& temporary items folder) + set namecount to 2 + set fileExtension to "" + set fileNameOnly to fileName + if fileName contains "." then + set AppleScript's text item delimiters to "." + set fileExtension to the last text item of fileName + set fileNameOnly to (text items 1 through -2 of fileName) as string + end if + repeat + set newFileName to fileNameOnly & " " & (namecount as text) & "." & fileExtension + if not fileexists(folderPath & newFileName) then + exit repeat + end if + set namecount to namecount + 1 + end repeat + end if + return newFileName +end GetUniqueName + +on CopyToPrefs(keyfilepath) + tell application "Finder" + set keyfileName to (name of file keyfilepath) as text + end tell + set keyfileApplepath to POSIX file (POSIX path of keyfilepath) + set userPrefsPath to path to preferences from user domain as string + set userTempPath to path to temporary items from user domain as string + set preferencesFolderPath to userPrefsPath & prefsFolderName & ":" + if not folderexists(preferencesFolderPath) then + tell application "Finder" + set preferencesFolder to make new folder at userPrefsPath with properties {name:prefsFolderName} + end tell + end if + if fileexists(preferencesFolderPath & keyfileName) then + -- copy to temporary items folder, rename, and then we can copy from there to the preferences folder + -- first find new name + set namecount to 2 + set fileExtension to "" + set keyfileNameOnly to keyfileName + if keyfileName contains "." then + set AppleScript's text item delimiters to "." + set fileExtension to the last text item of keyfileName + set keyfileNameOnly to (text items 1 through -2 of keyfileName) as string + end if + repeat + set newkeyfileName to keyfileNameOnly & " " & (namecount as text) & "." & fileExtension + if not fileexists(preferencesFolderPath & newkeyfileName) and not fileexists(userTempPath & newkeyfileName) then + exit repeat + end if + set namecount to namecount + 1 + end repeat + -- rename to new name + set newkeyfilepath to userTempPath & newkeyfileName + tell application "Finder" + set tempfilepath to duplicate file keyfileApplepath to folder userTempPath with replacing + set name of tempfilepath to newkeyfileName + move file newkeyfilepath to preferencesFolderPath + end tell + set newFile to preferencesFolderPath & newkeyfileName + else + tell application "Finder" + set newFile to duplicate file keyfileApplepath to folder preferencesFolderPath with replacing + end tell + end if + + return newFile as text +end CopyToPrefs + +on ReadPrefs() + -- read any existing keys from the preferences + set preferencesFilePath to (path to preferences from user domain as string) & prefsFileName + set PIDs to {} + set bnKeys to {} + set KindleInfoList to {} + set AdeptKeyList to {} + if fileexists(POSIX path of file preferencesFilePath) then + tell application "System Events" + try + set PIDs to value of property list item "PIDs" of property list file preferencesFilePath + end try + try + set bnKeys to value of property list item "bnKeys" of property list file preferencesFilePath + end try + try + set AdeptKeyList to value of property list item "AdeptKeys" of property list file preferencesFilePath + end try + try + set AdobePDFTool to value of property list item "IneptPDF" of property list file preferencesFilePath + end try + end tell + end if + set newList to {} + repeat with i from 1 to count AdeptKeyList + if fileexists(AdeptKeyList's item i) then set newList's end to AdeptKeyList's item i + end repeat + set AdeptKeyList to newList + + set newList to {} + repeat with i from 1 to count bnKeys + if (item 3 of bnKeys's item i) is "" or fileexists(item 3 of bnKeys's item i) then set newList's end to bnKeys's item i + end repeat + set bnKeys to newList + +end ReadPrefs + +on WritePrefs() + -- write keys to the preferences + set preferencesFilePath to (path to preferences from user domain as string) & prefsFileName + tell application "System Events" + set the base_dict to make new property list item with properties {kind:record} + set myPrefs to make new property list file with properties {contents:base_dict, name:preferencesFilePath} + make new property list item at end of property list items of contents of myPrefs with properties {kind:list, name:"PIDs", value:PIDs} + make new property list item at end of property list items of contents of myPrefs with properties {kind:list, name:"bnKeys", value:bnKeys} + make new property list item at end of property list items of contents of myPrefs with properties {kind:list, name:"AdeptKeys", value:AdeptKeyList} + make new property list item at end of property list items of contents of myPrefs with properties {kind:string, name:"IneptPDF", value:AdobePDFTool} + end tell +end WritePrefs + + +on InitProgress(maxcount) + try + if totalebooks > 1 then + launch application ((path to resource "DeDRM Progress.app") as string) + tell application ((path to resource "DeDRM Progress.app") as string) + activate + set contents of Çclass texFÈ "maintext" of window "main" to "Decrypting " & maxcount & " ebooks." + set contents of Çclass texFÈ "subtext" of window "main" to "Decrypting book 0: " + set Çclass maxVÈ of Çclass proIÈ "bar" of window "main" to maxcount + set Çclass conTÈ of Çclass proIÈ "bar" of window "main" to 0 + end tell + end if + end try + +end InitProgress + +on ProgressActive() + return application ((path to resource "DeDRM Progress.app") as string) is running + --tell application "System Events" to set progactive to count (every process whose name is "DeDRM Progress") + --if progactive > 0 then return true + --return false +end ProgressActive + +on IncProgress(booktitle, doingcount) + try + if ProgressActive() then + tell application ((path to resource "DeDRM Progress.app") as string) + set contents of Çclass texFÈ "subtext" of window "main" to "Decrypting book " & doingcount & ": " & booktitle + set Çclass conTÈ of Çclass proIÈ "bar" of window "main" to doingcount + end tell + end if + end try +end IncProgress + +on endProgress() + try + if ProgressActive() then tell application ((path to resource "DeDRM Progress.app") as string) to quit + end try +end endProgress + + +on run + if GetTools() then + display dialog "Drag&Drop encrypted ebooks onto this AppleScript's icon in the Finder to decode them after you have finished configuring it and it has quit. + +Click the Continue button to enter any PIDs for Mobipocket/Kindle ebooks, to enter name/number key pairs for Barnes & Noble/eReader ebooks, and to select Barnes & Noble .b64 key files and Adobe Adept .der key files. + +***You do not need to enter any extra info if decoding ebooks downloaded to your installation of Kindle for Mac, or Adobe Digital Editions. If you do not have any PIDS, name/number keys or .b64 or .der files to add, just click the Cancel button.*** + +Please only use to get access to your own books. Authors, publishers and ebook stores need to make money to produce more ebooks. Don't cheat them. + +This AppleScript is by Apprentice Alf and uses python scripts produced by CMBDTC, IHeartCabbages, DarkReverser, DiapDealer, some_updates, ApprenticeAlf and others. + +This AppleScript (but not necessarily the enclosed python scripts) is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. + +For more information, please refer to + +" with title "DeDRM Applescript" buttons {"Cancel", "Continue"} default button 2 + ReadPrefs() + GetPIDs() + GetKeys() + GetAdeptKey(true) + GetAdeptKeyFiles() + --GetKindleInfoFiles() + WritePrefs() + end if +end run + +on open some_items + if GetTools() then + try + ReadPrefs() + GetAdeptKey(false) + set ErrorList to "" + set WarningList to "" + set CompletedList to "" + set ErrorCount to 0 + set WarningCount to 0 + set CompletedCount to 0 + set totalebooks to 0 + set completedebooks to 0 + repeat with this_item in some_items + if (folder of (info for this_item) is true) then + tell application "Finder" to set totalebooks to totalebooks + (count of (every file in entire contents of folder this_item whose name extension is in handledExtensions)) + else + countfile(this_item as text) + end if + end repeat + InitProgress(totalebooks) + repeat with this_item in some_items + if totalebooks > 1 and not ProgressActive() then + exit repeat + end if + if (folder of (info for this_item) is true) then + handlefolder(this_item as text) + else + handlefile(this_item as text) + end if + end repeat + endProgress() + on error errmsg number errnum from fromobj + display dialog "An unexpected error occurred. Please report on Apprentice Alf's blog. + +Error Message: " & errmsg & " +Error Number: " & errnum & " +Error From: " & (fromobj as string) with title "DeDRM Applescript" buttons {"Bother"} default button 1 + end try + if WarningList is not "" then + set WarningText to "" + if WarningCount is 1 then + set WarningText to "There was a warning with 1 ebook:" + else + set WarningText to "There were warnings with " & WarningCount & " ebooks:" + end if + set dialogresult to display dialog WarningText & " + +" & WarningList buttons {"SaveÉ", "OK"} with title "DeDRM Applescript" default button 1 + if button returned of dialogresult is "SaveÉ" then + try + set savefile to choose file name with prompt "Where would you like to save the warnings report?" default name "DeDRM Warnings Report.txt" + set fileRef to open for access savefile with write permission + set eof fileRef to 0 + write WarningList to fileRef + close access fileRef + end try + end if + end if + if ErrorList is not "" then + set ErrorText to "" + if ErrorCount is 1 then + set ErrorText to "There was an error with 1 ebook:" + else + set ErrorText to "There were errors with " & ErrorCount & " ebooks:" + end if + set dialogresult to display dialog ErrorText & " + +" & ErrorList buttons {"SaveÉ", "Bother"} with title "DeDRM Applescript" default button 1 + if button returned of dialogresult is "SaveÉ" then + try + set savefile to choose file name with prompt "Where would you like to save the errors report?" default name "DeDRM Errors Report.txt" + set fileRef to open for access savefile with write permission + set eof fileRef to 0 + write ErrorList to fileRef + close access fileRef + end try + end if + end if + if CompletedCount > 0 then + set CompletedText to "" + if CompletedCount is 1 then + set CompletedText to "Successfully de-drmed 1 ebook:" + else + set CompletedText to "Successfully de-drmed " & CompletedCount & " ebooks:" + end if + set dialogresult to display dialog CompletedText & " + +" & CompletedList buttons {"Thanks"} with title "DeDRM Applescript" default button 1 + end if + if CompletedCount is 0 and ErrorCount is 0 and WarningCount is 0 and totalebooks is 0 then + set dialogresult to display dialog "No ebooks found in the dropped items. DeDRM can handle Mobipocket/Kindle, eReader, Adobe ePub, Barnes & noble ePub and Adobe PDF. Please try again." buttons {"OK"} with title "DeDRM Applescript" default button 1 + end if + WritePrefs() + end if +end open + diff --git a/Macintosh_Applications/eReader Unlocker.app/Contents/Info.plist b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist similarity index 78% rename from Macintosh_Applications/eReader Unlocker.app/Contents/Info.plist rename to DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist index 2ae3b8a..330ec11 100644 --- a/Macintosh_Applications/eReader Unlocker.app/Contents/Info.plist +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist @@ -23,16 +23,22 @@ CFBundleExecutable droplet + CFBundleGetInfoString + DeDRM 1.2, Copyright © 2010 by Apprentice Alf. CFBundleIconFile droplet CFBundleInfoDictionaryVersion 6.0 CFBundleName - Mobipocket Unlocker + DeDRM CFBundlePackageType APPL + CFBundleShortVersionString + 1.2 CFBundleSignature dplt + LSMinimumSystemVersion + 10.5.0 LSRequiresCarbon WindowState @@ -40,9 +46,9 @@ name ScriptWindowState positionOfDivider - 627 + 885 savedFrame - 53 78 661 691 0 0 1280 778 + 1507 -64 1262 964 1440 -150 1680 1050 selectedTabView result diff --git a/Macintosh_Applications/Mobipocket Unlocker.app/Contents/MacOS/droplet b/DeDRM_Macintosh_Application/DeDRM.app/Contents/MacOS/droplet similarity index 100% rename from Macintosh_Applications/Mobipocket Unlocker.app/Contents/MacOS/droplet rename to DeDRM_Macintosh_Application/DeDRM.app/Contents/MacOS/droplet diff --git a/Macintosh_Applications/Mobipocket Unlocker.app/Contents/PkgInfo b/DeDRM_Macintosh_Application/DeDRM.app/Contents/PkgInfo similarity index 100% rename from Macintosh_Applications/Mobipocket Unlocker.app/Contents/PkgInfo rename to DeDRM_Macintosh_Application/DeDRM.app/Contents/PkgInfo diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress Source.zip b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress Source.zip new file mode 100644 index 0000000000000000000000000000000000000000..81eb3a300ae04dd527ba7db1110383b0f15e9529 GIT binary patch literal 15189 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 + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + DeDRM Progress + CFBundleIdentifier + com.apprenticealf.DeDRMProgress + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + DeDRM Progress + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSAppleScriptEnabled + YES + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/Macintosh_Applications/eReader Unlocker.app/Contents/MacOS/droplet b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/MacOS/DeDRM Progress similarity index 58% rename from Macintosh_Applications/eReader Unlocker.app/Contents/MacOS/droplet rename to DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/MacOS/DeDRM Progress index c715860463c5434cb471de58b710cbe95976c23f..2ff942b9964ae48bae3e6b6adf0fbd35664742ed 100644 GIT binary patch literal 37176 zcmeI4U1(Eh7{}i<>6Xnf!ze>gX3Baom^KwUC{Cf#cC&u8#dcerb7yH9+hg-Za^g~# z&S)nrL{Wx)uu`e&9BjwXTxd<2)){)K^|jXB z9T-iE>=P^~;y0mb-K{;{<#WWx@iTkbU#Lct{RgFKMl@%LW=W<0TDkCpQdpwxBT7Me zq%%d+GDGp+WK7E#+1?EjbM6|}!e2EYhV*7$aYPKS^bkK9*6;FYT1%)qWZLYH0D8IX zG-rQA_DCdGU)TtXX36~is>Wt8o!gl&Jz@;S`erQi#DKqAgBa2;5F-|LFrNZiXVcWeu(te8_suyy!(F-YV<5++V}T7>}Z@KA=a0*tLH&>p30nb4Bg4s+u7}I-$GmmXG?5oaSIrq-VJ%5d!|M|Dm zzr5f5JZ$nkA4ik*KC6`ZU52`BMfU%MJa~eujIi=x*HFfY#)CWc-gG!U6nrrqjz`~0 zrUx^@t;t9-T)*Ej1Ye1!GkP+S35Kjo2w+ATKySs|zGTc$Diw=%Mbdi8*r6Nq2cJDh zvRHW<(OY?hxUAiIR(M|hk%*S5-%yXoruT}+Tp#)N&hfEsy?#rXlThhFGxNAFKwG~k zBdm3S``8+^t|0`41W14cNPq-LfCNb3;StDhT#;+4o%*M{Ry8&u%_;oNce-|JqHqW= zARj2t3lZgd^=<#g{JASN`LXA61-uP3eXTs}Ft_>W)a`9b?Lqq_@2wi!@}a68ey?gQ z?{$w27b3aM$CWyATwNM2y2tW9w=P@Nst-DA%6FON*!$`7y3 z&$@av+X!DpyDg7_%bKsQdQ;%`capvcJwnY<#BX5la1dYFwbnu zxovYCP;$W9Jk_uD>WMx*(XS0eW2vYdZ#OUP&n6;TESVh4rj!;B>j|Z`_k_~@5xYN# ziCQY1>`&mtGW7U>7R^N?StE)-;XVlzO&rwI$%M)n;k2Q&P}h#Ogl_2Jn0^Qz?Ok%x zSdWAaoNC@>CWz*A11qGE011!)36KB@kN^pg011!)36Q`tCvf@h&3jJKw-is~1z!13 zsXSf$kMX?q|1xm_kr(+qT1D->_&9#(o#KDz#eb>#{}f85Pas4J<^Qt^$33b5vndj5 z0DUPa%f% z&NG`~w?y4N{AI&N{1;mPOzyT_ogKTS_S=$Xbdnn}oZRJw_nLMf8&7FQxHlHX46v{C zH-E7K{^iB=SdZ)vnT7F^Tk3BrYW_Q6l-$j@j!ETtVKwh%l_*Zi9W|FB2@{&eE^@88JYsZU@3seRj!6#UEb<=*5L?pNe{KA*_u zn>-Y`U+Wo)#q~fn`4VAZR!plXe~~)>+4c7KS(7h$8fWDZDp>m>HTji3R#ASr&)k}P z@#&eB=K>z*`o$QrCLg>gBtQZrKmsH{0wh2J4~M`3RlGj(>#dO+{?a~A@%1`&VwbnL zv(7Ve(e>4}D%W=~c}wn*i=JZ>**h5cCf8vh#g;lXxi_HH?MYcy&(!!{bftoZ }H ztyJhRM=vA64R3KxUD2rXl(OE^KHub10mR69i~D?~HFYJ}zxl%p(|jT?D*me{y=d~% z;tSxt5zT|9q)|wK1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq;E9f8}kW!bHd3nBp$AOR8}0TLhq5+DH*AOR8}0TOs{0#ZjTzwnlsQ{%4L==AGLHT Ykyd9c-K+&Sf9wxq`Qg9i{F{IO0?@F0t^fc4 literal 29592 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 C-Wl!y diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/PkgInfo b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/PkgInfo new file mode 100644 index 0000000..bd04210 --- /dev/null +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/English.lproj/InfoPlist.strings b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..efaa0d7b2b00432a74d860a0f216e9928c7088a0 GIT binary patch literal 212 zcmZvWOA5k35C!W3xkJb@3x8X2A#N1Jg`ObBM8*6_qM(OY%dBPSc|EWD74!ZuCMIM{ zO-e$+l@}Q&y@%S;>C{wesOH`qU%CB=X4voOb#HDzhpkv<;Ms9t&7D$i#ol=$H{ob1 oV + + + + IBClasses + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + IBVersion + 1 + + diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib new file mode 100644 index 0000000..a101e01 --- /dev/null +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib @@ -0,0 +1,18 @@ + + + + + IBFramework Version + 680 + IBLastKnownRelativeProjectPath + ../Display Panel.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9L31a + targetFramework + IBCocoaFramework + + diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/DeDRM Progress.app/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..83ceb9ec651ed0bf58fdb921d8bbd2297bc7cc6c GIT binary patch literal 6835 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