From fc456d6660162f7ad3a278d00288865175b30281 Mon Sep 17 00:00:00 2001 From: Brian Sherson Date: Mon, 3 Jun 2013 19:14:03 -0700 Subject: Long-needed update --- wallet.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 wallet.py (limited to 'wallet.py') diff --git a/wallet.py b/wallet.py new file mode 100644 index 0000000..05321f0 --- /dev/null +++ b/wallet.py @@ -0,0 +1,37 @@ +#!/usr/bin/python +import pickle, Crypto.Cipher.Blowfish, os, getpass +from threading import Lock + +class Wallet(dict): + def __init__(self, filename): + self.lock=Lock() + if os.path.isfile(filename): + self.f=open(filename,"rb+") + self.passwd=getpass.getpass() + self.crypt=Crypto.Cipher.Blowfish.new(self.passwd) + contents_encrypted=self.f.read() + contents=self.crypt.decrypt(contents_encrypted+"\x00"*((-len(contents_encrypted))%8)) + if contents.startswith(self.passwd): + self.update(dict(pickle.loads(contents[len(self.passwd):]))) + else: + self.f.close() + raise BaseException, "Incorrect Password" + else: + self.f=open(filename,"wb+") + passwd=self.passwd=None + while passwd==None or passwd!=self.passwd: + passwd=getpass.getpass("Enter new password: ") + self.passwd=getpass.getpass("Confirm new password: ") + if passwd!=self.passwd: print "Passwords do not match!" + self.crypt=Crypto.Cipher.Blowfish.new(self.passwd) + self.flush() + def flush(self): + contents=self.passwd+pickle.dumps(self.items(), protocol=2) + self.lock.acquire() + try: + self.f.seek(0) + self.f.write(self.crypt.encrypt(contents+"\x00"*((-len(contents))%8))) + self.f.truncate() + self.f.flush() + finally: + self.lock.release() -- cgit v1.2.3