From 48b3663c5a718356f73a409d97142ad0a17f6fb7 Mon Sep 17 00:00:00 2001 From: MMGen Date: Sat, 2 Jun 2018 12:50:41 +0000 Subject: [PATCH] eth/tw.py: check data integrity on write --- mmgen/altcoins/eth/tw.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/mmgen/altcoins/eth/tw.py b/mmgen/altcoins/eth/tw.py index 71b10350..b644c3e7 100755 --- a/mmgen/altcoins/eth/tw.py +++ b/mmgen/altcoins/eth/tw.py @@ -26,7 +26,6 @@ from mmgen.obj import ETHAmt,TwMMGenID,TwComment,TwLabel from mmgen.tw import TrackingWallet,TwAddrList,TwUnspentOutputs from mmgen.addr import AddrData -# No file locking - 2 processes accessing the wallet at the same time will corrupt it class EthereumTrackingWallet(TrackingWallet): data_dir = os.path.join(g.altcoin_data_dir,'eth',g.proto.data_subdir) @@ -35,10 +34,13 @@ class EthereumTrackingWallet(TrackingWallet): def __init__(self): check_or_create_dir(self.data_dir) try: - self.data = json.loads(get_data_from_file(self.tw_file,silent=True)) + self.orig_data = get_data_from_file(self.tw_file,silent=True) + self.data = json.loads(self.orig_data) except: try: os.stat(self.tw_file) - except: self.data = {} + except: + self.orig_data = '' + self.data = {} else: die(2,"File '{}' exists but does not contain valid json data") else: for d in self.data: @@ -53,13 +55,12 @@ class EthereumTrackingWallet(TrackingWallet): die(3,"MMGen ID '{}' does not match tracking wallet!".format(label.mmid)) self.data[addr] = { 'mmid': label.mmid, 'comment': label.comment } + # use 'check_data' to make sure wallet hasn't been altered by another program def write(self): - write_data_to_file( - self.tw_file, - json.dumps(self.data), - 'Ethereum address data', - ask_overwrite=False, - silent=True) + write_data_to_file( self.tw_file, + json.dumps(self.data),'Ethereum address data', + ask_overwrite=False,ignore_opt_outdir=True,silent=True, + check_data=True,cmp_data=self.orig_data) def delete_all(self): self.data = {}