1
0

better code organization

function parameters should be lowercase

Fix crash on invalid labels import

Added invoice exporting and reduced duplicate code

Better exception handling

removed json module import

some more cleanup

Cleaned up some stuff

Added exporting contacts
This commit is contained in:
Abdussamad
2018-02-15 18:07:00 +01:00
committed by SomberNight
parent 36a444ba6c
commit 5997c18aef
7 changed files with 111 additions and 75 deletions

View File

@@ -25,10 +25,11 @@ import dns
import json
import traceback
import sys
import os
from . import bitcoin
from . import dnssec
from .util import FileImportFailed, FileImportFailedEncrypted
from .util import export_meta, import_meta
class Contacts(dict):
@@ -51,18 +52,15 @@ class Contacts(dict):
self.storage.put('contacts', dict(self))
def import_file(self, path):
try:
with open(path, 'r') as f:
d = self._validate(json.loads(f.read()))
except json.decoder.JSONDecodeError:
traceback.print_exc(file=sys.stderr)
raise FileImportFailedEncrypted()
except BaseException:
traceback.print_exc(file=sys.stdout)
raise FileImportFailed()
self.update(d)
import_meta(path, self.validate, self.load_meta)
def load_meta(self, data):
self.update(data)
self.save()
def export_file(self, fileName):
export_meta(self, fileName)
def __setitem__(self, key, value):
dict.__setitem__(self, key, value)
self.save()
@@ -119,7 +117,7 @@ class Contacts(dict):
except AttributeError:
return None
def _validate(self, data):
def validate(self, data):
for k,v in list(data.items()):
if k == 'contacts':
return self._validate(v)

View File

@@ -40,7 +40,7 @@ except ImportError:
from . import bitcoin
from . import util
from .util import print_error, bh2u, bfh
from .util import FileImportFailed, FileImportFailedEncrypted
from .util import export_meta, import_meta
from . import transaction
from . import x509
from . import rsakey
@@ -468,27 +468,31 @@ class InvoiceStore(object):
continue
def import_file(self, path):
try:
with open(path, 'r') as f:
d = json.loads(f.read())
self.load(d)
except json.decoder.JSONDecodeError:
traceback.print_exc(file=sys.stderr)
raise FileImportFailedEncrypted()
except BaseException:
traceback.print_exc(file=sys.stdout)
raise FileImportFailed()
import_meta(path, self.validate, self.on_import)
#TODO: Invoice import validation
def validate(self, data):
return data
def on_import(self, data):
self.load(data)
self.save()
def save(self):
l = {}
def export_file(self, fileName):
export_meta(self.before_save(), fileName)
def before_save(self):
l= {}
for k, pr in self.invoices.items():
l[k] = {
'hex': bh2u(pr.raw),
'requestor': pr.requestor,
'txid': pr.tx
}
self.storage.put('invoices', l)
return l
def save(self):
self.storage.put('invoices', self.before_save())
def get_status(self, key):
pr = self.get(key)

View File

@@ -60,16 +60,18 @@ class InvalidPassword(Exception):
class FileImportFailed(Exception):
def __init__(self, message=''):
self.message = str(message)
def __str__(self):
return _("Failed to import file.")
return _("Failed to import from file.") + "\n" + self.message
class FileExportFailed(Exception):
def __init__(self, reason=''):
self.message = str(reason)
class FileImportFailedEncrypted(FileImportFailed):
def __str__(self):
return (_('Failed to import file.') + ' ' +
_('Perhaps it is encrypted...') + '\n' +
_('Importing encrypted files is not supported.'))
return( _("Failed to export to file.") + "\n" + self.message )
# Throw this exception to unwind the stack like when an error occurs.
# However unlike other exceptions the user won't be informed.
@@ -785,3 +787,24 @@ def setup_thread_excepthook():
def versiontuple(v):
return tuple(map(int, (v.split("."))))
def import_meta(path, validater, load_meta):
try:
with open(path, 'r') as f:
d = validater(json.loads(f.read()))
load_meta(d)
#backwards compatibility for JSONDecodeError
except ValueError:
traceback.print_exc(file=sys.stderr)
raise FileImportFailed(_("Invalid JSON code."))
except BaseException as e:
traceback.print_exc(file=sys.stdout)
raise FileImportFailed(e)
def export_meta(meta, fileName):
try:
with open(fileName, 'w+') as f:
json.dump(meta, f, indent=4, sort_keys=True)
except (IOError, os.error) as reason:
traceback.print_exc(file=sys.stderr)
raise FileExportFailed(str(reason))