summaryrefslogtreecommitdiff
path: root/wallet.py
diff options
context:
space:
mode:
Diffstat (limited to 'wallet.py')
-rw-r--r--wallet.py37
1 files changed, 37 insertions, 0 deletions
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()