From 26a9388a9b7c4ab4109fad1ca9f67da01c9fba2d Mon Sep 17 00:00:00 2001 From: quadrismegistus Date: Thu, 10 Sep 2020 10:00:11 +0100 Subject: [PATCH] updates --- komrade/backend/crypt.py | 64 +++++++++++++------------- komrade/backend/keymaker.py | 2 +- komrade/backend/people.py | 79 +++++++++++++++++++++------------ komrade/backend/the_operator.py | 8 +++- komrade/constants.py | 3 ++ 5 files changed, 93 insertions(+), 63 deletions(-) diff --git a/komrade/backend/crypt.py b/komrade/backend/crypt.py index fd22c07..9605b46 100644 --- a/komrade/backend/crypt.py +++ b/komrade/backend/crypt.py @@ -16,9 +16,21 @@ LOG_GET_SET = True class Crypt(Logger): - def __init__(self,name=None,fn=None,cell=None,init_d=None): + def __init__(self,name=None,fn=None,cell=None,init_d=None,use_secret=CRYPT_USE_SECRET,path_secret=PATH_CRYPT_SECRET): if not name and fn: name=os.path.basename(fn).replace('.','_') + if use_secret and path_secret: + if not os.path.exists(path_secret): + self.secret = get_random_binary_id() + self.log('shhh! creating secret:',self.secret) + with open(path_secret,'wb') as of: + of.write(self.secret) + else: + with open(path_secret,'rb') as f: + self.secret = f.read() + else: + self.secret = b'' + self.name,self.fn,self.cell = name,fn,cell self.store = FilesystemStore(self.fn) if init_d: @@ -37,7 +49,7 @@ class Crypt(Logger): super().log(*x) def hash(self,binary_data): - return hashlib.sha256(binary_data).hexdigest() + return hashlib.sha256(binary_data + self.secret).hexdigest() # return zlib.adler32(binary_data) def force_binary(self,k_b): @@ -47,21 +59,9 @@ class Crypt(Logger): return k_b def package_key(self,k,prefix=''): - # self.log('k???',type(k),k) if not k: return b'' - # self.log('prefix???',type(prefix),prefix) k_b = self.force_binary(k) - # self.log(type(k_b),k_b) - # k_s = k_b.decode() - # self.log(type(k_s),k_s) - # k_s2 = prefix + k_s - # self.log(type(k_s2),k_s2) - # k_b2 = k_s2.encode() k_b2 = self.force_binary(prefix) + k_b - # self.log('k_b2',type(k_b2),k_b2) - # k_b = self.cell.encrypt(k_b) - # prefix_b = self.force_binary(prefix) - return k_b2 def package_val(self,k): @@ -69,7 +69,6 @@ class Crypt(Logger): if self.cell is not None: k_b = self.cell.encrypt(k_b) return k_b - def unpackage_val(self,k_b): try: if self.cell is not None: k_b = self.cell.decrypt(k_b) @@ -77,40 +76,41 @@ class Crypt(Logger): pass return k_b + def has(self,k,prefix=''): + k_b=self.package_key(k,prefix=prefix) + k_b_hash = self.hash(k_b) + try: + v=self.store.get(k_b_hash) + return True + except KeyError: + return False + def set(self,k,v,prefix=''): - # self.log('set() k -->',prefix,k) + if self.has(k,prefix=prefix): + self.log("I'm afraid I can't let you do that, overwrite someone's data!") + return False + k_b=self.package_key(k,prefix=prefix) - # self.log('set() k_b -->',k_b) k_b_hash = self.hash(k_b) - # self.log('k_b_hash',type(k_b_hash),k_b_hash) - - # self.log('set() v -->',v) v_b=self.package_val(v) self.log(f'set(\n\t{prefix}{k},\n\t{k_b}\n\t{k_b_hash}\n\t\n\t{v_b}\n)\n') - # stop - # stop - - return self.store.put(k_b_hash,v_b) + + # store + self.store.put(k_b_hash,v_b) + return True def exists(self,k,prefix=''): - return bool(self.get(k,prefix=prefix)) + return self.has(k,prefix=prefix) def get(self,k,prefix=''): - # self.log('k1? -->',prefix,k) k_b=self.package_key(k,prefix=prefix) - # self.log('k2? -->',k_b) k_b_hash = self.hash(k_b) - # self.log('k_b_hash',type(k_b_hash),k_b_hash) - try: v=self.store.get(k_b_hash) except KeyError: return None - # self.log('v? -->',v) v_b=self.unpackage_val(v) - # self.log('v_b?',v_b) - # self.log('get()',k_b,'-->',v_b) return v_b diff --git a/komrade/backend/keymaker.py b/komrade/backend/keymaker.py index c12c765..4f1f05e 100644 --- a/komrade/backend/keymaker.py +++ b/komrade/backend/keymaker.py @@ -303,7 +303,7 @@ class Keymaker(Logger): # return keys! keys_returned = self.return_keychain(keychain,keys_to_return) - return {'uri_id':uri_id,'_keychain':keys_returned} + return (uri_id,keys_returned) def return_keychain(self,keychain,keys_to_return=None): diff --git a/komrade/backend/people.py b/komrade/backend/people.py index 8ba6336..2bf1f3e 100644 --- a/komrade/backend/people.py +++ b/komrade/backend/people.py @@ -42,7 +42,6 @@ class Persona(Caller): # def login(self): # if keys.get('pubkey') and keys.get('privkey') - def register(self, name = None, passphrase = DEBUG_DEFAULT_PASSPHRASE, is_group=None): # get needed metadata if not name: name=self.name @@ -53,33 +52,57 @@ class Persona(Caller): # if is_group is None: # is_group = input('\nIs this a group account? [y/N]').strip().lower() == 'y' - # form request - msg_to_op = { - '_route':'forge_new_keys', - 'name':name, - 'passphrase':hashish(passphrase.encode()) - } - - # get message back - msg_obj = self.phone.ring_ring(msg_to_op) - phone_res = msg_obj.msg - - # URI id - uri_id = phone_res.get('uri_id') - returned_keys = phone_res.get('_keychain') - self.log('got URI from Op:',uri_id) - self.log('got returnd keys from Op:',returned_keys) - - # better have the right keys - assert set(KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_CLIENT) == set(returned_keys.keys()) - - # now save these keys! - saved_keys = self.save_keychain(name,returned_keys,uri_id=uri_id) - self.log('saved keys!',saved_keys) - - # success! - self.log('yay!!!!') - return saved_keys + # make and save keys locally + uri_id,keys_returned = self.forge_new_keys( + name=name, + passphrase=passphrase, + keys_to_save = KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_CLIENT, + keys_to_return = KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_SERVER + ) + self.log(f'my new uri is {uri_id} and I got new keys!: {dict_format(keys_returned)}') + + # save the ones we should on server + + + + + # def register(self, name = None, passphrase = DEBUG_DEFAULT_PASSPHRASE, is_group=None): + # # get needed metadata + # if not name: name=self.name + # if name is None: + # name = input('\nWhat is the name for this account? ') + # if passphrase is None: + # passphrase = getpass.getpass('\nEnter a memborable password: ') + # # if is_group is None: + # # is_group = input('\nIs this a group account? [y/N]').strip().lower() == 'y' + + # # form request + # msg_to_op = { + # '_route':'forge_new_keys', + # 'name':name, + # 'passphrase':hashish(passphrase.encode()) + # } + + # # get message back + # msg_obj = self.phone.ring_ring(msg_to_op) + # phone_res = msg_obj.msg + + # # URI id + # uri_id = phone_res.get('uri_id') + # returned_keys = phone_res.get('_keychain') + # self.log('got URI from Op:',uri_id) + # self.log('got returnd keys from Op:',returned_keys) + + # # better have the right keys + # assert set(KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_CLIENT) == set(returned_keys.keys()) + + # # now save these keys! + # saved_keys = self.save_keychain(name,returned_keys,uri_id=uri_id) + # self.log('saved keys!',saved_keys) + + # # success! + # self.log('yay!!!!') + # return saved_keys def ring_ring(self,msg): diff --git a/komrade/backend/the_operator.py b/komrade/backend/the_operator.py index c830eb1..9f2601f 100644 --- a/komrade/backend/the_operator.py +++ b/komrade/backend/the_operator.py @@ -102,12 +102,16 @@ class TheOperator(Operator): # return to Telephone/Caller return forged_keys_plus_id - def does_username_exist(self,**data): - name=data.get('name') + def does_username_exist(self,name,**data): pubkey=self.crypt_keys.get(name,prefix='/pubkey/') self.log(f'looking for {name}, found {pubkey} as pubkey') return bool(pubkey) + def register_new_user(self,name,pubkey,**data): + self.log('setting pubkey under name') + res = self.crypt_keys.set(name,pubkey,prefix='/pubkey/') + self.log('got result from crypt:',res) + return res diff --git a/komrade/constants.py b/komrade/constants.py index fede2e9..450891b 100644 --- a/komrade/constants.py +++ b/komrade/constants.py @@ -25,6 +25,9 @@ for x in [PATH_KOMRADE,PATH_KOMRADE_DATA,PATH_KOMRADE_KEYS,PATH_QRCODES]: if not os.path.exists(x): os.makedirs(x) +CRYPT_USE_SECRET = True +PATH_CRYPT_SECRET = os.path.join(PATH_KOMRADE,'.secret') + # etc BSEP=b'||||||||||' BSEP2=b'@@@@@@@@@@'