From 2bedd7500554ce6ea3d12e107b793b6b4eab3d66 Mon Sep 17 00:00:00 2001 From: Apprentice Alf Date: Tue, 8 Feb 2011 17:21:51 +0000 Subject: [PATCH] tools v3.4 --- Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py | 14 + Calibre_Plugins/Win_OpenSSL_0.9.8o.txt | 26 - Calibre_Plugins/ignobleepub_plugin.zip | Bin 6658 -> 6820 bytes .../ignobleepub_plugin/ignobleepub_plugin.py | 4 +- Calibre_Plugins/ignobleepub_plugin/zipfix.py | 36 +- Calibre_Plugins/ineptepub_plugin.zip | Bin 11018 -> 11178 bytes .../ineptepub_plugin/ineptepub_plugin.py | 5 +- Calibre_Plugins/ineptepub_plugin/zipfix.py | 36 +- Calibre_Plugins/ineptpdf_plugin.zip | Bin 21834 -> 22059 bytes .../ineptpdf_plugin/ineptpdf_plugin.py | 39 +- Calibre_Plugins/k4mobidedrm_plugin.zip | Bin 43982 -> 44083 bytes .../k4mobidedrm_plugin/k4mobidedrm_plugin.py | 4 +- DeDRM_Macintosh_Application/DeDRM.app.txt | Bin 106492 -> 106668 bytes .../DeDRM.app/Contents/Info.plist | 4 +- .../Contents/Resources/Scripts/main.scpt | Bin 230240 -> 230488 bytes .../DeDRM.app/Contents/Resources/genbook.py | 14 + .../DeDRM.app/Contents/Resources/ineptpdf.py | 35 +- .../Contents/Resources/k4mobidedrm.py | 4 +- .../DeDRM.app/Contents/Resources/zipfix.py | 36 +- .../DeDRM_WinApp/DeDRM_lib/lib/genbook.py | 14 + .../DeDRM_WinApp/DeDRM_lib/lib/ineptpdf.py | 35 +- .../DeDRM_WinApp/DeDRM_lib/lib/k4mobidedrm.py | 4 +- .../DeDRM_WinApp/DeDRM_lib/lib/zipfix.py | 36 +- .../ReadMe_DeDRM_WinApp.txt | 4 +- KindleBooks_Tools/KindleBooks/lib/genbook.py | 14 + .../KindleBooks/lib/k4mobidedrm.py | 4 +- Mobi_Additional_Tools/k4mdumpkinfo.py | 476 ------------------ ePub_Fixer/README_ePub_Fixer.txt | 4 +- ePub_Fixer/lib/zipfix.py | 36 +- 29 files changed, 234 insertions(+), 650 deletions(-) delete mode 100644 Calibre_Plugins/Win_OpenSSL_0.9.8o.txt delete mode 100644 Mobi_Additional_Tools/k4mdumpkinfo.py diff --git a/Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py b/Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py index a483dec..19be51a 100644 --- a/Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py +++ b/Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py @@ -192,6 +192,8 @@ class GParser(object): argres[j] = int(argres[j]) return result def getGlyphDim(self, gly): + if self.gdpi[gly] == 0: + return 0, 0 maxh = (self.gh[gly] * self.dpi) / self.gdpi[gly] maxw = (self.gw[gly] * self.dpi) / self.gdpi[gly] return maxh, maxw @@ -320,6 +322,18 @@ def generateBook(bookDir, raw, fixedimage): print 'Processing Meta Data and creating OPF' meta_array = getMetaArray(metaFile) + # replace special chars in title and authors like & < > + title = meta_array['Title'] + title = title.replace('&','&') + title = title.replace('<','<') + title = title.replace('>','>') + meta_array['Title'] = title + authors = meta_array['Authors'] + authors = authors.replace('&','&') + authors = authors.replace('<','<') + authors = authors.replace('>','>') + meta_array['Authors'] = authors + xname = os.path.join(xmlDir, 'metadata.xml') metastr = '' for key in meta_array: diff --git a/Calibre_Plugins/Win_OpenSSL_0.9.8o.txt b/Calibre_Plugins/Win_OpenSSL_0.9.8o.txt deleted file mode 100644 index c3ee4fb..0000000 --- a/Calibre_Plugins/Win_OpenSSL_0.9.8o.txt +++ /dev/null @@ -1,26 +0,0 @@ -Installing openssl on Windows 64-bit (Windows 2000 and higher) - -Win64 OpenSSL v0.9.8o (8Mb) -http://www.slproweb.com/download/Win64OpenSSL-0_9_8o.exe -(if you get an error message about missing Visual C++ redistributables... cancel the install and install the below support program from Microsoft, THEN install OpenSSL) - -Visual C++ 2008 Redistributables (x64) (1.7Mb) -http://www.microsoft.com/downloads/details.aspx?familyid=bd2a6171-e2d6-4230-b809-9a8d7548c1b6 - - - -Installing openssl on Windows 32-bit (Windows 2000 and higher) - -Win32 OpenSSL v0.9.8o (8Mb) -http://www.slproweb.com/download/Win32OpenSSL-0_9_8o.exe -(if you get an error message about missing Visual C++ redistributables... cancel the install and install the below support program from Microsoft, THEN install OpenSSL) - -Visual C++ 2008 Redistributables (1.7Mb) -http://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF - - - -Other versions of OpenSSL (and versions for Windows older than Windows 2000) can be found on the following website. - -Shining Light Productions -http://www.slproweb.com/products/Win32OpenSSL.html diff --git a/Calibre_Plugins/ignobleepub_plugin.zip b/Calibre_Plugins/ignobleepub_plugin.zip index 8eba53394f6ccefb0487f472a3eccf4f7f376708..3e0bfe1caf6f149542e41d753faa0bfe0be966dc 100644 GIT binary patch delta 6617 zcmZXZRa6uV*lvgJkPtx{9J;$fx^w7;p~InjC~@eL7En@pF8(`m7>PFl z{;e$d_@m0QB(N^1_lYBCRAp3QK9EsecTGii)T=^)Zx>2;$|D_r%bx}Q96J`2Sz3RW zGQ^+!S7CKjuT+uSGQJ4ClCy6_7Dne$>Eheg*l1ZBrD%zz*uFUGl#u4KJ5{_Zc_?$x z^jYnTf{8c>ILbvNfRvgVP}rtQAtF1xF>C_d(gQlbd%d4Ot_Xq&ocFup7fuvmoQ>mY z2J4nt6F{3P+2QG|9A0b&=4C(BP{=XY6mZbE5AT%1FUd4sOvhnsZ6k6@8A!ZH<5}j+ zPL($~d}0eC75pOTHJSWyjz}$gbLlGfb76Mx=__T393zGPh&c+_AQrpL5Ue}emWIPy zJ$Il)%`&JFgo_}FVlaJ=YJE05#S%vPLFVa4FalZ4Y2|c~3w1ZiO7F_95{7 z)oVt$8s$48ZaAgWz&z1_{|SgOtKNW}ovw*mJ1(Sv`+%RZj1XeyiNB;){ThR+2y2TA zDr}ubz5u65wkJ$yYEVm6R%d%G*eia+`IlU0ZkvzP4WBIuuCR0Mg^4bmN2pN>)CR1B zEQUlr;1xg&$y#0TyU)Is_UiXiEmX2+?t7-{suz$Q%06P0nI)y1;jiG2&Yb|k=#ie^el)HVSM3dGyv zjj7czV$&W?ex)4=Xip#qD#IBC)X(|EhY#wsY@#Q0^ZjU zcP_K*m<_Q!!{#^AAm9mgJLpe#>wd(S>G6NbuFB#WY>$=$+9n@GPJA0_#L}&U(wU5D z;x@=NAo4|v#u_Fi)-TU(+P7libQ%JC>@-59W9IUi6d9tEYV5L<3nhW}{i zR_w0IcOf(bBe#o~NBqJe)ry-?^xm2YXMK5dn>mch_hT~>+91wGPB>UMio>oWYzUZE z+DfKE!OuQS`pYj?F3|O*?*Uc^E@wWaLXI#J4uDIn^{S|hfcD(e=ZiYY7>DPzzv|$~Is^Cgs z0*<-rFY(&yQ8$65;6YWRi@Ih1An^PKIUt$kptv22gQAkamQRk>jmGgk5Ew{7Zqxz( z4;+M~N2AiCybt~Xj{XW{!bq42aT0&?QaSB$UttWN;!wfWd*rg1mRGEzwY~VO4L<4wkqVmqZwjGQ786Ie~tl&k*q(A z5pA6`i%?O1fL?z+0?(K;oYVJA9!()uU2O%^Z&>=U=WIO87{j!TPS3mmoyLQv;_5i>XVO$zvkH6WNztvIxEx( znJ(CY@~KWh+4CfbSl5|Sc245oru}?&50(ZYFZto&g87fr)030qBibW?jCDcq3svG4 zr=HrEuAaNQn|>eDOvQceQ@c^01R~0PT;gI~#$CqoI98mTan$AfeGWvgbIz-uaQNZQ zRsW}0Xxn3eA4IAv7be=tG0SW|Lmro)XZ7u|h-V%*KK8D3b6X$uhcD-iRMoY<0c{g$}-f%O}hg&e#F*XT7jFngco$mt;ERcS)dvLYSnKT&CaNj!&nd|8#&0EsMd+93 zHBYi#Y`!n${OV+ikv!c-K!%H4$7XIz+?ViY*Zl`Vj+paBK9}97^MR&|g!6hP;Qoe&LY}vT3$Vk(Hi7aA{Fcdm$(Q7D z$|>71tSMze>oRXzDSnV+?hRZa!9i^oy6;z+Gg+I|E|_^t(P)(lqruw@$G&UAmA4vo zlipm$@PdTz$xlUo$Rt0nF1kj%f_JU9*3sxFp!E%0T5_$jAQWk% z!DZh_i3G>KkLU2Hq3SwE8VfH>y1TOm`GvZp$@vEaI?`TOji}kqzQXJKRS2|&s>t?U zMlC)Gx2!9&Vv?*WZK8fgm+wrw7I$g+CumRUs|Q(|dw1=SggKX@J%0(K9UN$RIm&ui zTXVFoEHC9^^x`apXgS$((HGdx!h<6zfwulC8p_HDb{3M@&3v^xvH0rpFwzQH6&
Kh^FvW@Ez8#=1Y&VtotJ-4)_9{C3|tK|9{h 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 SjQ?dx`YI(o<__imto{#A8nPS! delta 6419 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 diff --git a/Calibre_Plugins/ignobleepub_plugin/ignobleepub_plugin.py b/Calibre_Plugins/ignobleepub_plugin/ignobleepub_plugin.py index 50cb51f..04ffc33 100644 --- a/Calibre_Plugins/ignobleepub_plugin/ignobleepub_plugin.py +++ b/Calibre_Plugins/ignobleepub_plugin/ignobleepub_plugin.py @@ -46,6 +46,8 @@ # - Incorporated SomeUpdates zipfix routine. # 0.1.2 - bug fix for non-ascii file names in encryption.xml # 0.1.3 - Try PyCrypto on Windows first +# 0.1.4 - update zipfix to deal with mimetype not in correct place +# 0.1.5 - update zipfix to deal with completely missing mimetype files """ Decrypt Barnes & Noble ADEPT encrypted EPUB books. @@ -271,7 +273,7 @@ class IgnobleDeDRM(FileTypePlugin): Credit given to I <3 Cabbages for the original stand-alone scripts.' supported_platforms = ['linux', 'osx', 'windows'] author = 'DiapDealer' - version = (0, 1, 4) + version = (0, 1, 5) minimum_calibre_version = (0, 6, 44) # Compiled python libraries cannot be imported in earlier versions. file_types = set(['epub']) on_import = True diff --git a/Calibre_Plugins/ignobleepub_plugin/zipfix.py b/Calibre_Plugins/ignobleepub_plugin/zipfix.py index 4c862a7..a1aafde 100644 --- a/Calibre_Plugins/ignobleepub_plugin/zipfix.py +++ b/Calibre_Plugins/ignobleepub_plugin/zipfix.py @@ -13,9 +13,20 @@ _FILENAME_LEN_OFFSET = 26 _EXTRA_LEN_OFFSET = 28 _FILENAME_OFFSET = 30 _MAX_SIZE = 64 * 1024 +_MIMETYPE = 'application/epub+zip' + +class ZipInfo(zipfile.ZipInfo): + def __init__(self, *args, **kwargs): + if 'compress_type' in kwargs: + compress_type = kwargs.pop('compress_type') + super(ZipInfo, self).__init__(*args, **kwargs) + self.compress_type = compress_type class fixZip: def __init__(self, zinput, zoutput): + self.ztype = 'zip' + if zinput.lower().find('.epub') >= 0 : + self.ztype = 'epub' self.inzip = zipfile.ZipFile(zinput,'r') self.outzip = zipfile.ZipFile(zoutput,'w') # open the input zip for reading only as a raw file @@ -81,30 +92,15 @@ class fixZip: # get the zipinfo for each member of the input archive # and copy member over to output archive # if problems exist with local vs central filename, fix them - # also fix bad epub compression - - # write mimetype file first, if present, and with no compression - for zinfo in self.inzip.infolist(): - if zinfo.filename == "mimetype": - nzinfo = zinfo - try: - data = self.inzip.read(zinfo.filename) - except zipfile.BadZipfile or zipfile.error: - local_name = self.getlocalname(zinfo) - data = self.getfiledata(zinfo) - nzinfo.filename = local_name - nzinfo.date_time = zinfo.date_time - nzinfo.compress_type = zipfile.ZIP_STORED - nzinfo.flag_bits = 0 - nzinfo.internal_attr = 0 - nzinfo.extra = "" - self.outzip.writestr(nzinfo,data) - break + # if epub write mimetype file first, with no compression + if self.ztype == 'epub': + nzinfo = ZipInfo('mimetype', compress_type=zipfile.ZIP_STORED) + self.outzip.writestr(nzinfo, _MIMETYPE) # write the rest of the files for zinfo in self.inzip.infolist(): - if zinfo.filename != "mimetype": + if zinfo.filename != "mimetype" or self.ztype == '.zip': data = None nzinfo = zinfo try: diff --git a/Calibre_Plugins/ineptepub_plugin.zip b/Calibre_Plugins/ineptepub_plugin.zip index 6c4d6f62b026bb8a4651e103d8d220e279b2035b..2ce5bce5732527b47f2125871b3b3378bf43c5cf 100644 GIT binary patch delta 7170 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 delta 6993 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 diff --git a/Calibre_Plugins/ineptepub_plugin/ineptepub_plugin.py b/Calibre_Plugins/ineptepub_plugin/ineptepub_plugin.py index e155a3c..d0541b5 100644 --- a/Calibre_Plugins/ineptepub_plugin/ineptepub_plugin.py +++ b/Calibre_Plugins/ineptepub_plugin/ineptepub_plugin.py @@ -47,7 +47,8 @@ # result of Calibre changing to python 2.7. # 0.1.3 - bug fix for epubs with non-ascii chars in file names # 0.1.4 - default to try PyCrypto first on Windows - +# 0.1.5 - update zipfix to handle out of position mimetypes +# 0.1.6 - update zipfix to handle completely missing mimetype files """ Decrypt Adobe ADEPT-encrypted EPUB books. @@ -371,7 +372,7 @@ class IneptDeDRM(FileTypePlugin): Credit given to I <3 Cabbages for the original stand-alone scripts.' supported_platforms = ['linux', 'osx', 'windows'] author = 'DiapDealer' - version = (0, 1, 5) + version = (0, 1, 6) minimum_calibre_version = (0, 6, 44) # Compiled python libraries cannot be imported in earlier versions. file_types = set(['epub']) on_import = True diff --git a/Calibre_Plugins/ineptepub_plugin/zipfix.py b/Calibre_Plugins/ineptepub_plugin/zipfix.py index 4c862a7..a1aafde 100644 --- a/Calibre_Plugins/ineptepub_plugin/zipfix.py +++ b/Calibre_Plugins/ineptepub_plugin/zipfix.py @@ -13,9 +13,20 @@ _FILENAME_LEN_OFFSET = 26 _EXTRA_LEN_OFFSET = 28 _FILENAME_OFFSET = 30 _MAX_SIZE = 64 * 1024 +_MIMETYPE = 'application/epub+zip' + +class ZipInfo(zipfile.ZipInfo): + def __init__(self, *args, **kwargs): + if 'compress_type' in kwargs: + compress_type = kwargs.pop('compress_type') + super(ZipInfo, self).__init__(*args, **kwargs) + self.compress_type = compress_type class fixZip: def __init__(self, zinput, zoutput): + self.ztype = 'zip' + if zinput.lower().find('.epub') >= 0 : + self.ztype = 'epub' self.inzip = zipfile.ZipFile(zinput,'r') self.outzip = zipfile.ZipFile(zoutput,'w') # open the input zip for reading only as a raw file @@ -81,30 +92,15 @@ class fixZip: # get the zipinfo for each member of the input archive # and copy member over to output archive # if problems exist with local vs central filename, fix them - # also fix bad epub compression - - # write mimetype file first, if present, and with no compression - for zinfo in self.inzip.infolist(): - if zinfo.filename == "mimetype": - nzinfo = zinfo - try: - data = self.inzip.read(zinfo.filename) - except zipfile.BadZipfile or zipfile.error: - local_name = self.getlocalname(zinfo) - data = self.getfiledata(zinfo) - nzinfo.filename = local_name - nzinfo.date_time = zinfo.date_time - nzinfo.compress_type = zipfile.ZIP_STORED - nzinfo.flag_bits = 0 - nzinfo.internal_attr = 0 - nzinfo.extra = "" - self.outzip.writestr(nzinfo,data) - break + # if epub write mimetype file first, with no compression + if self.ztype == 'epub': + nzinfo = ZipInfo('mimetype', compress_type=zipfile.ZIP_STORED) + self.outzip.writestr(nzinfo, _MIMETYPE) # write the rest of the files for zinfo in self.inzip.infolist(): - if zinfo.filename != "mimetype": + if zinfo.filename != "mimetype" or self.ztype == '.zip': data = None nzinfo = zinfo try: diff --git a/Calibre_Plugins/ineptpdf_plugin.zip b/Calibre_Plugins/ineptpdf_plugin.zip index d0b8f2aa656eaee865f581d1cd7c91ad0e7b7de2..3174938628833546c32afdfed67b70ad449d8707 100644 GIT binary patch delta 18031 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 CJ^Ba$ delta 17828 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 H00000M|^HY diff --git a/Calibre_Plugins/ineptpdf_plugin/ineptpdf_plugin.py b/Calibre_Plugins/ineptpdf_plugin/ineptpdf_plugin.py index d519820..5e3caf3 100644 --- a/Calibre_Plugins/ineptpdf_plugin/ineptpdf_plugin.py +++ b/Calibre_Plugins/ineptpdf_plugin/ineptpdf_plugin.py @@ -47,7 +47,10 @@ # ** NOTE ** There is no plugin customization data for the Inept PDF DeDRM plugin. # # Revision history: -# 0.1 - Initial release +# 0.1 - Initial release +# 0.1.1 - back port ineptpdf 8.4.X support for increased number of encryption methods +# 0.1.2 - back port ineptpdf 8.4.X bug fixes +# 0.1.3 - add in fix for improper rejection of session bookkeys with len(bookkey) = length + 1 """ Decrypts Adobe ADEPT-encrypted PDF files. @@ -1544,16 +1547,30 @@ class PDFDocument(object): bookkey = bookkey[index:] ebx_V = int_value(param.get('V', 4)) ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6)) - # added because of the booktype / decryption book session key error - if ebx_V == 3: - V = 3 - elif ebx_V < 4 or ebx_type < 6: - V = ord(bookkey[0]) - bookkey = bookkey[1:] + # added because of improper booktype / decryption book session key errors + if length > 0: + if len(bookkey) == length: + if ebx_V == 3: + V = 3 + else: + V = 2 + elif len(bookkey) == length + 1: + V = ord(bookkey[0]) + bookkey = bookkey[1:] + else: + print "ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type) + print "length is %d and len(bookkey) is %d" % (length, len(bookkey)) + print "bookkey[0] is %d" % ord(bookkey[0]) + raise ADEPTError('error decrypting book session key - mismatched length') else: - V = 2 - if length and len(bookkey) != length: - raise ADEPTError('error decrypting book session key') + # proper length unknown try with whatever you have + print "ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type) + print "length is %d and len(bookkey) is %d" % (length, len(bookkey)) + print "bookkey[0] is %d" % ord(bookkey[0]) + if ebx_V == 3: + V = 3 + else: + V = 2 self.decrypt_key = bookkey self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 self.decipher = self.decrypt_rc4 @@ -2116,7 +2133,7 @@ class IneptPDFDeDRM(FileTypePlugin): Credit given to I <3 Cabbages for the original stand-alone scripts.' supported_platforms = ['linux', 'osx', 'windows'] author = 'DiapDealer' - version = (0, 1, 2) + version = (0, 1, 3) minimum_calibre_version = (0, 6, 44) # Compiled python libraries cannot be imported in earlier versions. file_types = set(['pdf']) on_import = True diff --git a/Calibre_Plugins/k4mobidedrm_plugin.zip b/Calibre_Plugins/k4mobidedrm_plugin.zip index 1efffbbc1eb6b3bf84ed514b2d7f70d3d5964b20..14af1cc742060e9319345a819063fb8b86b51324 100644 GIT binary patch delta 7236 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 BBY6M- diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist index dba2839..1eef22d 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 2.1, Copyright © 2010–2011 by Apprentice Alf and others. + DeDRM 2.2, Copyright © 2010–2011 by Apprentice Alf and others. CFBundleIconFile droplet CFBundleInfoDictionaryVersion @@ -34,7 +34,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.1 + 2.2 CFBundleSignature dplt LSMinimumSystemVersion diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/Scripts/main.scpt b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/Scripts/main.scpt index 16313fe16ec1c26549a7814006037555af799240..80448cabd90996b52fb7dc565b84a3cc982c6cc9 100644 GIT binary patch delta 63211 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
  • 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 z%0A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 z�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

    >g$x5_UMUGI-pO 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 diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py index a483dec..19be51a 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py @@ -192,6 +192,8 @@ class GParser(object): argres[j] = int(argres[j]) return result def getGlyphDim(self, gly): + if self.gdpi[gly] == 0: + return 0, 0 maxh = (self.gh[gly] * self.dpi) / self.gdpi[gly] maxw = (self.gw[gly] * self.dpi) / self.gdpi[gly] return maxh, maxw @@ -320,6 +322,18 @@ def generateBook(bookDir, raw, fixedimage): print 'Processing Meta Data and creating OPF' meta_array = getMetaArray(metaFile) + # replace special chars in title and authors like & < > + title = meta_array['Title'] + title = title.replace('&','&') + title = title.replace('<','<') + title = title.replace('>','>') + meta_array['Title'] = title + authors = meta_array['Authors'] + authors = authors.replace('&','&') + authors = authors.replace('<','<') + authors = authors.replace('>','>') + meta_array['Authors'] = authors + xname = os.path.join(xmlDir, 'metadata.xml') metastr = '' for key in meta_array: diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptpdf.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptpdf.py index ccdd9e4..40e97cd 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptpdf.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptpdf.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -# ineptpdf.pyw, version 7.7 +# ineptpdf.pyw, version 7.9 from __future__ import with_statement @@ -33,6 +33,7 @@ from __future__ import with_statement # 7.6 - backported AES and other fixes from version 8.4.48 # 7.7 - On Windows try PyCrypto first and OpenSSL next # 7.8 - Modify interface to allow use of import +# 7.9 - Bug fix for some session key errors when len(bookkey) > length required """ Decrypts Adobe ADEPT-encrypted PDF files. @@ -1531,16 +1532,30 @@ class PDFDocument(object): bookkey = bookkey[index:] ebx_V = int_value(param.get('V', 4)) ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6)) - # added because of the booktype / decryption book session key error - if ebx_V == 3: - V = 3 - elif ebx_V < 4 or ebx_type < 6: - V = ord(bookkey[0]) - bookkey = bookkey[1:] + # added because of improper booktype / decryption book session key errors + if length > 0: + if len(bookkey) == length: + if ebx_V == 3: + V = 3 + else: + V = 2 + elif len(bookkey) == length + 1: + V = ord(bookkey[0]) + bookkey = bookkey[1:] + else: + print "ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type) + print "length is %d and len(bookkey) is %d" % (length, len(bookkey)) + print "bookkey[0] is %d" % ord(bookkey[0]) + raise ADEPTError('error decrypting book session key - mismatched length') else: - V = 2 - if length and len(bookkey) != length: - raise ADEPTError('error decrypting book session key') + # proper length unknown try with whatever you have + print "ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type) + print "length is %d and len(bookkey) is %d" % (length, len(bookkey)) + print "bookkey[0] is %d" % ord(bookkey[0]) + if ebx_V == 3: + V = 3 + else: + V = 2 self.decrypt_key = bookkey self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 self.decipher = self.decrypt_rc4 diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py index 776ca6e..6d37a5b 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py @@ -29,7 +29,7 @@ from __future__ import with_statement # and import that ZIP into Calibre using its plugin configuration GUI. -__version__ = '2.2' +__version__ = '2.3' class Unbuffered: def __init__(self, stream): @@ -250,7 +250,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, 2, 2) # The version number of this plugin + version = (0, 2, 3) # The version number of this plugin file_types = set(['prc','mobi','azw','azw1','tpz']) # The file types that this plugin will be applied to on_import = True # Run this plugin during the import priority = 210 # run this plugin before mobidedrm, k4pcdedrm, k4dedrm diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/zipfix.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/zipfix.py index 4c862a7..a1aafde 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/zipfix.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/zipfix.py @@ -13,9 +13,20 @@ _FILENAME_LEN_OFFSET = 26 _EXTRA_LEN_OFFSET = 28 _FILENAME_OFFSET = 30 _MAX_SIZE = 64 * 1024 +_MIMETYPE = 'application/epub+zip' + +class ZipInfo(zipfile.ZipInfo): + def __init__(self, *args, **kwargs): + if 'compress_type' in kwargs: + compress_type = kwargs.pop('compress_type') + super(ZipInfo, self).__init__(*args, **kwargs) + self.compress_type = compress_type class fixZip: def __init__(self, zinput, zoutput): + self.ztype = 'zip' + if zinput.lower().find('.epub') >= 0 : + self.ztype = 'epub' self.inzip = zipfile.ZipFile(zinput,'r') self.outzip = zipfile.ZipFile(zoutput,'w') # open the input zip for reading only as a raw file @@ -81,30 +92,15 @@ class fixZip: # get the zipinfo for each member of the input archive # and copy member over to output archive # if problems exist with local vs central filename, fix them - # also fix bad epub compression - - # write mimetype file first, if present, and with no compression - for zinfo in self.inzip.infolist(): - if zinfo.filename == "mimetype": - nzinfo = zinfo - try: - data = self.inzip.read(zinfo.filename) - except zipfile.BadZipfile or zipfile.error: - local_name = self.getlocalname(zinfo) - data = self.getfiledata(zinfo) - nzinfo.filename = local_name - nzinfo.date_time = zinfo.date_time - nzinfo.compress_type = zipfile.ZIP_STORED - nzinfo.flag_bits = 0 - nzinfo.internal_attr = 0 - nzinfo.extra = "" - self.outzip.writestr(nzinfo,data) - break + # if epub write mimetype file first, with no compression + if self.ztype == 'epub': + nzinfo = ZipInfo('mimetype', compress_type=zipfile.ZIP_STORED) + self.outzip.writestr(nzinfo, _MIMETYPE) # write the rest of the files for zinfo in self.inzip.infolist(): - if zinfo.filename != "mimetype": + if zinfo.filename != "mimetype" or self.ztype == '.zip': data = None nzinfo = zinfo try: diff --git a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/genbook.py b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/genbook.py index a483dec..19be51a 100644 --- a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/genbook.py +++ b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/genbook.py @@ -192,6 +192,8 @@ class GParser(object): argres[j] = int(argres[j]) return result def getGlyphDim(self, gly): + if self.gdpi[gly] == 0: + return 0, 0 maxh = (self.gh[gly] * self.dpi) / self.gdpi[gly] maxw = (self.gw[gly] * self.dpi) / self.gdpi[gly] return maxh, maxw @@ -320,6 +322,18 @@ def generateBook(bookDir, raw, fixedimage): print 'Processing Meta Data and creating OPF' meta_array = getMetaArray(metaFile) + # replace special chars in title and authors like & < > + title = meta_array['Title'] + title = title.replace('&','&') + title = title.replace('<','<') + title = title.replace('>','>') + meta_array['Title'] = title + authors = meta_array['Authors'] + authors = authors.replace('&','&') + authors = authors.replace('<','<') + authors = authors.replace('>','>') + meta_array['Authors'] = authors + xname = os.path.join(xmlDir, 'metadata.xml') metastr = '' for key in meta_array: diff --git a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/ineptpdf.py b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/ineptpdf.py index ccdd9e4..40e97cd 100644 --- a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/ineptpdf.py +++ b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/ineptpdf.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -# ineptpdf.pyw, version 7.7 +# ineptpdf.pyw, version 7.9 from __future__ import with_statement @@ -33,6 +33,7 @@ from __future__ import with_statement # 7.6 - backported AES and other fixes from version 8.4.48 # 7.7 - On Windows try PyCrypto first and OpenSSL next # 7.8 - Modify interface to allow use of import +# 7.9 - Bug fix for some session key errors when len(bookkey) > length required """ Decrypts Adobe ADEPT-encrypted PDF files. @@ -1531,16 +1532,30 @@ class PDFDocument(object): bookkey = bookkey[index:] ebx_V = int_value(param.get('V', 4)) ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6)) - # added because of the booktype / decryption book session key error - if ebx_V == 3: - V = 3 - elif ebx_V < 4 or ebx_type < 6: - V = ord(bookkey[0]) - bookkey = bookkey[1:] + # added because of improper booktype / decryption book session key errors + if length > 0: + if len(bookkey) == length: + if ebx_V == 3: + V = 3 + else: + V = 2 + elif len(bookkey) == length + 1: + V = ord(bookkey[0]) + bookkey = bookkey[1:] + else: + print "ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type) + print "length is %d and len(bookkey) is %d" % (length, len(bookkey)) + print "bookkey[0] is %d" % ord(bookkey[0]) + raise ADEPTError('error decrypting book session key - mismatched length') else: - V = 2 - if length and len(bookkey) != length: - raise ADEPTError('error decrypting book session key') + # proper length unknown try with whatever you have + print "ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type) + print "length is %d and len(bookkey) is %d" % (length, len(bookkey)) + print "bookkey[0] is %d" % ord(bookkey[0]) + if ebx_V == 3: + V = 3 + else: + V = 2 self.decrypt_key = bookkey self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 self.decipher = self.decrypt_rc4 diff --git a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4mobidedrm.py b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4mobidedrm.py index 776ca6e..6d37a5b 100644 --- a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4mobidedrm.py +++ b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4mobidedrm.py @@ -29,7 +29,7 @@ from __future__ import with_statement # and import that ZIP into Calibre using its plugin configuration GUI. -__version__ = '2.2' +__version__ = '2.3' class Unbuffered: def __init__(self, stream): @@ -250,7 +250,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, 2, 2) # The version number of this plugin + version = (0, 2, 3) # The version number of this plugin file_types = set(['prc','mobi','azw','azw1','tpz']) # The file types that this plugin will be applied to on_import = True # Run this plugin during the import priority = 210 # run this plugin before mobidedrm, k4pcdedrm, k4dedrm diff --git a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/zipfix.py b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/zipfix.py index 4c862a7..a1aafde 100644 --- a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/zipfix.py +++ b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/zipfix.py @@ -13,9 +13,20 @@ _FILENAME_LEN_OFFSET = 26 _EXTRA_LEN_OFFSET = 28 _FILENAME_OFFSET = 30 _MAX_SIZE = 64 * 1024 +_MIMETYPE = 'application/epub+zip' + +class ZipInfo(zipfile.ZipInfo): + def __init__(self, *args, **kwargs): + if 'compress_type' in kwargs: + compress_type = kwargs.pop('compress_type') + super(ZipInfo, self).__init__(*args, **kwargs) + self.compress_type = compress_type class fixZip: def __init__(self, zinput, zoutput): + self.ztype = 'zip' + if zinput.lower().find('.epub') >= 0 : + self.ztype = 'epub' self.inzip = zipfile.ZipFile(zinput,'r') self.outzip = zipfile.ZipFile(zoutput,'w') # open the input zip for reading only as a raw file @@ -81,30 +92,15 @@ class fixZip: # get the zipinfo for each member of the input archive # and copy member over to output archive # if problems exist with local vs central filename, fix them - # also fix bad epub compression - - # write mimetype file first, if present, and with no compression - for zinfo in self.inzip.infolist(): - if zinfo.filename == "mimetype": - nzinfo = zinfo - try: - data = self.inzip.read(zinfo.filename) - except zipfile.BadZipfile or zipfile.error: - local_name = self.getlocalname(zinfo) - data = self.getfiledata(zinfo) - nzinfo.filename = local_name - nzinfo.date_time = zinfo.date_time - nzinfo.compress_type = zipfile.ZIP_STORED - nzinfo.flag_bits = 0 - nzinfo.internal_attr = 0 - nzinfo.extra = "" - self.outzip.writestr(nzinfo,data) - break + # if epub write mimetype file first, with no compression + if self.ztype == 'epub': + nzinfo = ZipInfo('mimetype', compress_type=zipfile.ZIP_STORED) + self.outzip.writestr(nzinfo, _MIMETYPE) # write the rest of the files for zinfo in self.inzip.infolist(): - if zinfo.filename != "mimetype": + if zinfo.filename != "mimetype" or self.ztype == '.zip': data = None nzinfo = zinfo try: diff --git a/DeDRM_Windows_Application/ReadMe_DeDRM_WinApp.txt b/DeDRM_Windows_Application/ReadMe_DeDRM_WinApp.txt index 73c13b0..8e1cfea 100644 --- a/DeDRM_Windows_Application/ReadMe_DeDRM_WinApp.txt +++ b/DeDRM_Windows_Application/ReadMe_DeDRM_WinApp.txt @@ -1,5 +1,5 @@ -ReadMe_DeDRM_WinApp_v1.3 ------------------------- +ReadMe_DeDRM_WinApp_v1.2 +----------------------- DeDRM_WinApp is a pure python drag and drop application that allows users to drag and drop ebooks or folders of ebooks onto theDeDRM_Drop_Target to have the DRM removed. It repackages the"tools" python software in one easy to use program. diff --git a/KindleBooks_Tools/KindleBooks/lib/genbook.py b/KindleBooks_Tools/KindleBooks/lib/genbook.py index a483dec..19be51a 100644 --- a/KindleBooks_Tools/KindleBooks/lib/genbook.py +++ b/KindleBooks_Tools/KindleBooks/lib/genbook.py @@ -192,6 +192,8 @@ class GParser(object): argres[j] = int(argres[j]) return result def getGlyphDim(self, gly): + if self.gdpi[gly] == 0: + return 0, 0 maxh = (self.gh[gly] * self.dpi) / self.gdpi[gly] maxw = (self.gw[gly] * self.dpi) / self.gdpi[gly] return maxh, maxw @@ -320,6 +322,18 @@ def generateBook(bookDir, raw, fixedimage): print 'Processing Meta Data and creating OPF' meta_array = getMetaArray(metaFile) + # replace special chars in title and authors like & < > + title = meta_array['Title'] + title = title.replace('&','&') + title = title.replace('<','<') + title = title.replace('>','>') + meta_array['Title'] = title + authors = meta_array['Authors'] + authors = authors.replace('&','&') + authors = authors.replace('<','<') + authors = authors.replace('>','>') + meta_array['Authors'] = authors + xname = os.path.join(xmlDir, 'metadata.xml') metastr = '' for key in meta_array: diff --git a/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py b/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py index 776ca6e..6d37a5b 100644 --- a/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py +++ b/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py @@ -29,7 +29,7 @@ from __future__ import with_statement # and import that ZIP into Calibre using its plugin configuration GUI. -__version__ = '2.2' +__version__ = '2.3' class Unbuffered: def __init__(self, stream): @@ -250,7 +250,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, 2, 2) # The version number of this plugin + version = (0, 2, 3) # The version number of this plugin file_types = set(['prc','mobi','azw','azw1','tpz']) # The file types that this plugin will be applied to on_import = True # Run this plugin during the import priority = 210 # run this plugin before mobidedrm, k4pcdedrm, k4dedrm diff --git a/Mobi_Additional_Tools/k4mdumpkinfo.py b/Mobi_Additional_Tools/k4mdumpkinfo.py deleted file mode 100644 index e7e119d..0000000 --- a/Mobi_Additional_Tools/k4mdumpkinfo.py +++ /dev/null @@ -1,476 +0,0 @@ -# engine to remove drm from Kindle for Mac books -# for personal use for archiving and converting your ebooks -# PLEASE DO NOT PIRATE! -# We want all authors and Publishers, and eBook stores to live long and prosperous lives -# -# it borrows heavily from works by CMBDTC, IHeartCabbages, skindle, -# unswindle, DiapDealer, some_updates and many many others - -from __future__ import with_statement - -class Unbuffered: - def __init__(self, stream): - self.stream = stream - def write(self, data): - self.stream.write(data) - self.stream.flush() - def __getattr__(self, attr): - return getattr(self.stream, attr) - -import sys -sys.stdout=Unbuffered(sys.stdout) -import os, csv, getopt -from struct import pack -from struct import unpack -import zlib - -# for handling sub processes -import subprocess -from subprocess import Popen, PIPE, STDOUT - -#Exception Handling -class K4MDEDRMError(Exception): - pass -class K4MDEDRMFatal(Exception): - pass - -# -# crypto routines -# -import hashlib - -def MD5(message): - ctx = hashlib.md5() - ctx.update(message) - return ctx.digest() - -def SHA1(message): - ctx = hashlib.sha1() - ctx.update(message) - return ctx.digest() - -def SHA256(message): - ctx = hashlib.sha256() - ctx.update(message) - return ctx.digest() - -# interface to needed routines in openssl's libcrypto -def _load_crypto_libcrypto(): - from ctypes import CDLL, byref, POINTER, c_void_p, c_char_p, c_int, c_long, \ - Structure, c_ulong, create_string_buffer, addressof, string_at, cast - from ctypes.util import find_library - - libcrypto = find_library('crypto') - if libcrypto is None: - raise K4MDEDRMError('libcrypto not found') - libcrypto = CDLL(libcrypto) - - AES_MAXNR = 14 - c_char_pp = POINTER(c_char_p) - c_int_p = POINTER(c_int) - - class AES_KEY(Structure): - _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), ('rounds', c_int)] - AES_KEY_p = POINTER(AES_KEY) - - def F(restype, name, argtypes): - func = getattr(libcrypto, name) - func.restype = restype - func.argtypes = argtypes - return func - - AES_cbc_encrypt = F(None, 'AES_cbc_encrypt',[c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p,c_int]) - - AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key',[c_char_p, c_int, AES_KEY_p]) - - PKCS5_PBKDF2_HMAC_SHA1 = F(c_int, 'PKCS5_PBKDF2_HMAC_SHA1', - [c_char_p, c_ulong, c_char_p, c_ulong, c_ulong, c_ulong, c_char_p]) - - class LibCrypto(object): - def __init__(self): - self._blocksize = 0 - self._keyctx = None - self.iv = 0 - def set_decrypt_key(self, userkey, iv): - self._blocksize = len(userkey) - if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : - raise K4MDEDRMError('AES improper key used') - return - keyctx = self._keyctx = AES_KEY() - self.iv = iv - rv = AES_set_decrypt_key(userkey, len(userkey) * 8, keyctx) - if rv < 0: - raise K4MDEDRMError('Failed to initialize AES key') - def decrypt(self, data): - out = create_string_buffer(len(data)) - rv = AES_cbc_encrypt(data, out, len(data), self._keyctx, self.iv, 0) - if rv == 0: - raise K4MDEDRMError('AES decryption failed') - return out.raw - def keyivgen(self, passwd): - salt = '16743' - saltlen = 5 - passlen = len(passwd) - iter = 0x3e8 - keylen = 80 - out = create_string_buffer(keylen) - rv = PKCS5_PBKDF2_HMAC_SHA1(passwd, passlen, salt, saltlen, iter, keylen, out) - return out.raw - return LibCrypto - -def _load_crypto(): - LibCrypto = None - try: - LibCrypto = _load_crypto_libcrypto() - except (ImportError, K4MDEDRMError): - pass - return LibCrypto - -LibCrypto = _load_crypto() - -# -# Utility Routines -# - -# uses a sub process to get the Hard Drive Serial Number using ioreg -# returns with the first found serial number in that class -def GetVolumeSerialNumber(): - 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') - 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:-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 -def GetUserName(): - username = os.getenv('USER') - return username - -MAX_PATH = 255 - -# -# start of Kindle specific routines -# - -global kindleDatabase - -# Various character maps used to decrypt books. Probably supposed to act as obfuscation -charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" -charMap2 = "ZB0bYyc1xDdW2wEV3Ff7KkPpL8UuGA4gz-Tme9Nn_tHh5SvXCsIiR6rJjQaqlOoM" -charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -charMap4 = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789" - -# Encode the bytes in data with the characters in map -def encode(data, map): - result = "" - for char in data: - value = ord(char) - Q = (value ^ 0x80) // len(map) - R = value % len(map) - result += map[Q] - result += map[R] - return result - -# Hash the bytes in data and then encode the digest with the characters in map -def encodeHash(data,map): - return encode(MD5(data),map) - -# Decode the string in data with the characters in map. Returns the decoded bytes -def decode(data,map): - result = "" - for i in range (0,len(data)-1,2): - high = map.find(data[i]) - low = map.find(data[i+1]) - if (high == -1) or (low == -1) : - break - value = (((high * len(map)) ^ 0x80) & 0xFF) + low - result += pack("B",value) - return result - -# implements an Pseudo Mac Version of Windows built-in Crypto routine -def CryptUnprotectData(encryptedData): - sp = GetVolumeSerialNumber() + '!@#' + GetUserName() - passwdData = encode(SHA256(sp),charMap1) - crp = LibCrypto() - key_iv = crp.keyivgen(passwdData) - key = key_iv[0:32] - iv = key_iv[32:48] - crp.set_decrypt_key(key,iv) - cleartext = crp.decrypt(encryptedData) - return cleartext - -# Locate and open the .kindle-info file -def openKindleInfo(): - home = os.getenv('HOME') - kinfopath = home + '/Library/Application Support/Amazon/Kindle/storage/.kindle-info' - if not os.path.exists(kinfopath): - kinfopath = home + '/Library/Application Support/Amazon/Kindle for Mac/storage/.kindle-info' - if not os.path.exists(kinfopath): - raise K4MDEDRMError('Error: .kindle-info file can not be found') - return open(kinfopath,'r') - -# Parse the Kindle.info file and return the records as a list of key-values -def parseKindleInfo(): - DB = {} - infoReader = openKindleInfo() - infoReader.read(1) - data = infoReader.read() - items = data.split('[') - for item in items: - splito = item.split(':') - DB[splito[0]] =splito[1] - return DB - -# Get a record from the Kindle.info file for the key "hashedKey" (already hashed and encoded). Return the decoded and decrypted record -def getKindleInfoValueForHash(hashedKey): - global kindleDatabase - encryptedValue = decode(kindleDatabase[hashedKey],charMap2) - cleartext = CryptUnprotectData(encryptedValue) - return decode(cleartext, charMap1) - -# Get a record from the Kindle.info file for the string in "key" (plaintext). Return the decoded and decrypted record -def getKindleInfoValueForKey(key): - return getKindleInfoValueForHash(encodeHash(key,charMap2)) - -# Find if the original string for a hashed/encoded string is known. If so return the original string othwise return an empty string. -def findNameForHash(hash): - names = ["kindle.account.tokens","kindle.cookie.item","eulaVersionAccepted","login_date","kindle.token.item","login","kindle.key.item","kindle.name.info","kindle.device.info", "MazamaRandomNumber"] - result = "" - for name in names: - if hash == encodeHash(name, charMap2): - result = name - break - return result - -# Print all the records from the kindle.info file (option -i) -def printKindleInfo(): - for record in kindleDatabase: - name = findNameForHash(record) - if name != "" : - print (name) - print ("--------------------------") - else : - print ("Unknown Record") - print getKindleInfoValueForHash(record) - print "\n" - -# -# PID generation routines -# - -# Returns two bit at offset from a bit field -def getTwoBitsFromBitField(bitField,offset): - byteNumber = offset // 4 - bitPosition = 6 - 2*(offset % 4) - return ord(bitField[byteNumber]) >> bitPosition & 3 - -# Returns the six bits at offset from a bit field -def getSixBitsFromBitField(bitField,offset): - offset *= 3 - value = (getTwoBitsFromBitField(bitField,offset) <<4) + (getTwoBitsFromBitField(bitField,offset+1) << 2) +getTwoBitsFromBitField(bitField,offset+2) - return value - -# 8 bits to six bits encoding from hash to generate PID string -def encodePID(hash): - global charMap3 - PID = "" - for position in range (0,8): - PID += charMap3[getSixBitsFromBitField(hash,position)] - return PID - - -# -# Main -# - -def main(argv=sys.argv): - global kindleDatabase - - kindleDatabase = None - - # - # Read the encrypted database - # - - try: - kindleDatabase = parseKindleInfo() - except Exception, message: - print(message) - - if kindleDatabase != None : - printKindleInfo() - - return 0 - -import signal -import threading -import subprocess -from subprocess import Popen, PIPE, STDOUT - -# **heavily** chopped up and modfied version of asyncproc.py -# to make it actually work on Windows as well as Mac/Linux -# For the original see: -# "http://www.lysator.liu.se/~bellman/download/" -# author is "Thomas Bellman " -# available under GPL version 3 or Later - -# create an asynchronous subprocess whose output can be collected in -# a non-blocking manner - -# What a mess! Have to use threads just to get non-blocking io -# in a cross-platform manner - -# luckily all thread use is hidden within this class - -class Process(object): - def __init__(self, *params, **kwparams): - if len(params) <= 3: - kwparams.setdefault('stdin', subprocess.PIPE) - if len(params) <= 4: - kwparams.setdefault('stdout', subprocess.PIPE) - if len(params) <= 5: - kwparams.setdefault('stderr', subprocess.PIPE) - self.__pending_input = [] - self.__collected_outdata = [] - self.__collected_errdata = [] - self.__exitstatus = None - self.__lock = threading.Lock() - self.__inputsem = threading.Semaphore(0) - self.__quit = False - - self.__process = subprocess.Popen(*params, **kwparams) - - if self.__process.stdin: - self.__stdin_thread = threading.Thread( - name="stdin-thread", - target=self.__feeder, args=(self.__pending_input, - self.__process.stdin)) - self.__stdin_thread.setDaemon(True) - self.__stdin_thread.start() - - if self.__process.stdout: - self.__stdout_thread = threading.Thread( - name="stdout-thread", - target=self.__reader, args=(self.__collected_outdata, - self.__process.stdout)) - self.__stdout_thread.setDaemon(True) - self.__stdout_thread.start() - - if self.__process.stderr: - self.__stderr_thread = threading.Thread( - name="stderr-thread", - target=self.__reader, args=(self.__collected_errdata, - self.__process.stderr)) - self.__stderr_thread.setDaemon(True) - self.__stderr_thread.start() - - def pid(self): - return self.__process.pid - - def kill(self, signal): - self.__process.send_signal(signal) - - # check on subprocess (pass in 'nowait') to act like poll - def wait(self, flag): - if flag.lower() == 'nowait': - rc = self.__process.poll() - else: - rc = self.__process.wait() - if rc != None: - if self.__process.stdin: - self.closeinput() - if self.__process.stdout: - self.__stdout_thread.join() - if self.__process.stderr: - self.__stderr_thread.join() - return self.__process.returncode - - def terminate(self): - if self.__process.stdin: - self.closeinput() - self.__process.terminate() - - # thread gets data from subprocess stdout - def __reader(self, collector, source): - while True: - data = os.read(source.fileno(), 65536) - self.__lock.acquire() - collector.append(data) - self.__lock.release() - if data == "": - source.close() - break - return - - # thread feeds data to subprocess stdin - def __feeder(self, pending, drain): - while True: - self.__inputsem.acquire() - self.__lock.acquire() - if not pending and self.__quit: - drain.close() - self.__lock.release() - break - data = pending.pop(0) - self.__lock.release() - drain.write(data) - - # non-blocking read of data from subprocess stdout - def read(self): - self.__lock.acquire() - outdata = "".join(self.__collected_outdata) - del self.__collected_outdata[:] - self.__lock.release() - return outdata - - # non-blocking read of data from subprocess stderr - def readerr(self): - self.__lock.acquire() - errdata = "".join(self.__collected_errdata) - del self.__collected_errdata[:] - self.__lock.release() - return errdata - - # non-blocking write to stdin of subprocess - def write(self, data): - if self.__process.stdin is None: - raise ValueError("Writing to process with stdin not a pipe") - self.__lock.acquire() - self.__pending_input.append(data) - self.__inputsem.release() - self.__lock.release() - - # close stdinput of subprocess - def closeinput(self): - self.__lock.acquire() - self.__quit = True - self.__inputsem.release() - self.__lock.release() - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/ePub_Fixer/README_ePub_Fixer.txt b/ePub_Fixer/README_ePub_Fixer.txt index fb71e9d..b864d07 100644 --- a/ePub_Fixer/README_ePub_Fixer.txt +++ b/ePub_Fixer/README_ePub_Fixer.txt @@ -1,8 +1,8 @@ ePub_Fixer -ePubs are specially crafted zip archives whose first file is an uncompresssed "mimetype" file. Unfortunately, many of the DRM encoded Adobe Adept and Barnes & Noble ePubs are not "proper" zip archives in that the names of some files in the zip central directory do NOT match the local name given in archive itself, or they do not have an uncompressed mimetype file as the first file in the archive. These types of epubs are technically incorrect/corrupted and can not be read by many other programs. +ePubs are specially crafted zip archives. Unfortunately, many of the DRM encoded Adobe Adept and Barnes & Noble ePubs are not "proper" zip archives in that the names of some files in the zip central directory do NOT match the local name given in archive itself. This type of zip archive is technically incorrect/corrupted and can not be read by many other programs. -ePub_Fixer was designed to fix improperly created zip archives of these types. +ePub_Fixer was designed to fix improperly created zip archives of this type. 1. Simply double-click to launch ePub_Fixer.pyw. diff --git a/ePub_Fixer/lib/zipfix.py b/ePub_Fixer/lib/zipfix.py index 4c862a7..a1aafde 100644 --- a/ePub_Fixer/lib/zipfix.py +++ b/ePub_Fixer/lib/zipfix.py @@ -13,9 +13,20 @@ _FILENAME_LEN_OFFSET = 26 _EXTRA_LEN_OFFSET = 28 _FILENAME_OFFSET = 30 _MAX_SIZE = 64 * 1024 +_MIMETYPE = 'application/epub+zip' + +class ZipInfo(zipfile.ZipInfo): + def __init__(self, *args, **kwargs): + if 'compress_type' in kwargs: + compress_type = kwargs.pop('compress_type') + super(ZipInfo, self).__init__(*args, **kwargs) + self.compress_type = compress_type class fixZip: def __init__(self, zinput, zoutput): + self.ztype = 'zip' + if zinput.lower().find('.epub') >= 0 : + self.ztype = 'epub' self.inzip = zipfile.ZipFile(zinput,'r') self.outzip = zipfile.ZipFile(zoutput,'w') # open the input zip for reading only as a raw file @@ -81,30 +92,15 @@ class fixZip: # get the zipinfo for each member of the input archive # and copy member over to output archive # if problems exist with local vs central filename, fix them - # also fix bad epub compression - - # write mimetype file first, if present, and with no compression - for zinfo in self.inzip.infolist(): - if zinfo.filename == "mimetype": - nzinfo = zinfo - try: - data = self.inzip.read(zinfo.filename) - except zipfile.BadZipfile or zipfile.error: - local_name = self.getlocalname(zinfo) - data = self.getfiledata(zinfo) - nzinfo.filename = local_name - nzinfo.date_time = zinfo.date_time - nzinfo.compress_type = zipfile.ZIP_STORED - nzinfo.flag_bits = 0 - nzinfo.internal_attr = 0 - nzinfo.extra = "" - self.outzip.writestr(nzinfo,data) - break + # if epub write mimetype file first, with no compression + if self.ztype == 'epub': + nzinfo = ZipInfo('mimetype', compress_type=zipfile.ZIP_STORED) + self.outzip.writestr(nzinfo, _MIMETYPE) # write the rest of the files for zinfo in self.inzip.infolist(): - if zinfo.filename != "mimetype": + if zinfo.filename != "mimetype" or self.ztype == '.zip': data = None nzinfo = zinfo try: