Fix keyring updates with latest openurl() change

You now have to call read() before doing another openurl().
As a bonus, the code is slightly shorter.
This commit is contained in:
Laurent Bachelier 2012-04-15 20:08:04 +02:00 committed by Romain Bignon
commit c92ec6768b

View file

@ -188,12 +188,10 @@ class Repository(object):
# This is a remote repository, download file # This is a remote repository, download file
browser = WeboobBrowser() browser = WeboobBrowser()
try: try:
fpkr = browser.openurl(posixpath.join(self.url, self.KEYRING)) keyring_data = browser.readurl(posixpath.join(self.url, self.KEYRING))
fpkrsig = browser.openurl(posixpath.join(self.url, self.KEYRING + '.sig')) sig_data = browser.readurl(posixpath.join(self.url, self.KEYRING + '.sig'))
except BrowserUnavailable, e: except BrowserUnavailable, e:
raise RepositoryUnavailable(unicode(e)) raise RepositoryUnavailable(unicode(e))
keyring_data = fpkr.read()
sig_data = fpkrsig.read()
if keyring.exists(): if keyring.exists():
if not keyring.is_valid(keyring_data, sig_data): if not keyring.is_valid(keyring_data, sig_data):
raise InvalidSignature('the keyring itself') raise InvalidSignature('the keyring itself')
@ -589,21 +587,20 @@ class Repositories(object):
browser = WeboobBrowser() browser = WeboobBrowser()
progress.progress(0.2, 'Downloading module...') progress.progress(0.2, 'Downloading module...')
try: try:
fp = browser.openurl(module.url) tardata = browser.readurl(module.url)
except BrowserUnavailable, e: except BrowserUnavailable, e:
raise ModuleInstallError('Unable to fetch module: %s' % e) raise ModuleInstallError('Unable to fetch module: %s' % e)
tardata = fp.read()
# Check signature # Check signature
if module.signed and Keyring.find_gpgv(): if module.signed and Keyring.find_gpgv():
progress.progress(0.5, 'Checking module authenticity...') progress.progress(0.5, 'Checking module authenticity...')
fpsig = browser.openurl(posixpath.join(module.url + '.sig')) sig_data = browser.readurl(posixpath.join(module.url + '.sig'))
keyring_path = os.path.join(self.keyrings_dir, self.url2filename(module.repo_url)) keyring_path = os.path.join(self.keyrings_dir, self.url2filename(module.repo_url))
keyring = Keyring(keyring_path) keyring = Keyring(keyring_path)
if not keyring.exists(): if not keyring.exists():
raise ModuleInstallError('No keyring found, please update repos.') raise ModuleInstallError('No keyring found, please update repos.')
if not keyring.is_valid(tardata, fpsig.read()): if not keyring.is_valid(tardata, sig_data):
raise ModuleInstallError('Invalid signature for %s.' % module.name) raise ModuleInstallError('Invalid signature for %s.' % module.name)
@ -647,18 +644,26 @@ class Keyring(object):
self.path = path + self.EXTENSION self.path = path + self.EXTENSION
self.vpath = path + '.version' self.vpath = path + '.version'
self.version = 0 self.version = 0
# We must have both files, else it is invalid
if not os.path.exists(self.vpath) and os.path.exists(self.path):
os.remove(self.path)
if os.path.exists(self.vpath) and not os.path.exists(self.path):
os.remove(self.vpath)
if self.exists(): if self.exists():
with open(self.vpath, 'r') as f: with open(self.vpath, 'r') as f:
self.version = int(f.read().strip()) self.version = int(f.read().strip())
else:
if os.path.exists(self.path):
os.remove(self.path)
if os.path.exists(self.vpath):
os.remove(self.vpath)
def exists(self): def exists(self):
return os.path.exists(self.path) if not os.path.exists(self.vpath):
return False
if os.path.exists(self.path):
# Check the file is not empty.
# This is because there was a bug creating empty keyring files.
with open(self.path, 'r') as fp:
if len(fp.read().strip()):
return True
return False
def save(self, keyring_data, version): def save(self, keyring_data, version):
with open(self.path, 'wb') as fp: with open(self.path, 'wb') as fp: