Browse Source

eth/tw.py: check data integrity on write

MMGen 6 years ago
parent
commit
48b3663c5a
1 changed files with 10 additions and 9 deletions
  1. 10 9
      mmgen/altcoins/eth/tw.py

+ 10 - 9
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 = {}