72 lines
2.8 KiB
Python
72 lines
2.8 KiB
Python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
|
|
|
|
__license__ = 'GPL v3'
|
|
__docformat__ = 'restructuredtext en'
|
|
|
|
import os, sys
|
|
import binascii, hashlib, re, string
|
|
|
|
class legacy_obok(object):
|
|
def __init__(self):
|
|
self._userkey = ''
|
|
|
|
@property
|
|
def get_legacy_cookie_id(self):
|
|
if self._userkey != '':
|
|
return self._userkey
|
|
self._userkey = self.__oldcookiedeviceid()
|
|
return self._userkey
|
|
|
|
def __bytearraytostring(self, bytearr):
|
|
wincheck = re.match('@ByteArray\\((.+)\\)', bytearr)
|
|
if wincheck:
|
|
return wincheck.group(1)
|
|
return bytearr
|
|
|
|
def plist_to_dictionary(self, filename):
|
|
from subprocess import Popen, PIPE
|
|
from plistlib import readPlistFromString
|
|
'Pipe the binary plist through plutil and parse the xml output'
|
|
with open(filename, 'rb') as f:
|
|
content = f.read()
|
|
args = ['plutil', '-convert', 'xml1', '-o', '-', '--', '-']
|
|
p = Popen(args, stdin=PIPE, stdout=PIPE)
|
|
p.stdin.write(content)
|
|
out, err = p.communicate()
|
|
return readPlistFromString(out)
|
|
|
|
def __oldcookiedeviceid(self):
|
|
'''Optionally attempt to get a device id using the old cookie method.
|
|
Must have _winreg installed on Windows machines for successful key retrieval.'''
|
|
wsuid = ''
|
|
pwsdid = ''
|
|
try:
|
|
if sys.platform.startswith('win'):
|
|
import _winreg
|
|
regkey_browser = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 'Software\\Kobo\\Kobo Desktop Edition\\Browser')
|
|
cookies = _winreg.QueryValueEx(regkey_browser, 'cookies')
|
|
bytearrays = cookies[0]
|
|
elif sys.platform.startswith('darwin'):
|
|
prefs = os.path.join(os.environ['HOME'], 'Library/Preferences/com.kobo.Kobo Desktop Edition.plist')
|
|
cookies = self.plist_to_dictionary(prefs)
|
|
bytearrays = cookies['Browser.cookies']
|
|
for bytearr in bytearrays:
|
|
cookie = self.__bytearraytostring(bytearr)
|
|
wsuidcheck = re.match("^wsuid=([0-9a-f-]+)", cookie)
|
|
if(wsuidcheck):
|
|
wsuid = wsuidcheck.group(1)
|
|
pwsdidcheck = re.match('^pwsdid=([0-9a-f-]+)', cookie)
|
|
if (pwsdidcheck):
|
|
pwsdid = pwsdidcheck.group(1)
|
|
if (wsuid == '' or pwsdid == ''):
|
|
return None
|
|
preuserkey = string.join((pwsdid, wsuid), '')
|
|
userkey = hashlib.sha256(preuserkey).hexdigest()
|
|
return binascii.a2b_hex(userkey[32:])
|
|
except KeyError:
|
|
print ('No "cookies" key found in Kobo plist: no legacy user key found.')
|
|
return None
|
|
except:
|
|
print ('Error parsing Kobo plist: no legacy user key found.')
|
|
return None
|