From 7f7e5317784df9b256d194b915bfa2191685c2bb Mon Sep 17 00:00:00 2001 From: quadrismegistus Date: Thu, 24 Sep 2020 16:21:16 +0100 Subject: [PATCH] fixes? --- komrade/app/main.py | 3 +- komrade/app/screens/login/login.py | 15 ++++---- komrade/backend/keymaker.py | 18 ++++----- komrade/backend/komrades.py | 60 ++++++++++++++++++------------ komrade/backend/operators.py | 12 +++--- 5 files changed, 62 insertions(+), 46 deletions(-) diff --git a/komrade/app/main.py b/komrade/app/main.py index 18d7394..07e5190 100644 --- a/komrade/app/main.py +++ b/komrade/app/main.py @@ -654,6 +654,7 @@ class MainApp(MDApp, Logger): if hasattr(self,'msg_dialog') and self.msg_dialog:# and hasattr(self.msg_dialog,'card') and self.msg_dialog.card: self.msg_dialog0=self.msg_dialog self.msg_dialog0.dismiss() + self.msg_dialog0.clear_widgets() self.msg_dialog = MessagePopupCard() @@ -680,8 +681,6 @@ class MainApp(MDApp, Logger): if hasattr(self,'msg_dialog0'): self.root.remove_widget(self.msg_dialog0) - if hasattr(self.msg_dialog0,'card'): - self.msg_dialog0.remove_widget(self.msg_dialog0.card) await asyncio.sleep(0.1) while not self.msg_dialog.ok_to_continue: diff --git a/komrade/app/screens/login/login.py b/komrade/app/screens/login/login.py index 5fcb55b..fbab26c 100644 --- a/komrade/app/screens/login/login.py +++ b/komrade/app/screens/login/login.py @@ -189,13 +189,16 @@ class LoginScreen(BaseScreen): # return name=un from komrade.backend import Komrade + + kommie = Komrade(un) self.log('KOMMIE!?!?',kommie) logger.info(f'booted kommie: {kommie}') if kommie.exists_locally_as_account(): - pw=await self.app.get_input('Welcome back.') - kommie=Komrade(un,getpass_func=lambda why: pw) + pw=await self.app.get_input('Welcome back.',get_pass=True) + kommie.keychain(passphrase=pw) + logger.info(f'updated keychain: {dict_format(kommie.keychain())}') logger.info(f'is account') # self.login_status.text='You should be able to log into this account.' if kommie.privkey: @@ -237,7 +240,7 @@ class LoginScreen(BaseScreen): async def register(self,name): async def logfunc(*x,**y): if not 'komrade_name' in y: y['komrade_name']='Keymaker' - #await self.app.stat(*x,**y) + await self.app.stat(*x,**y) kommie = Komrade(name) @@ -306,10 +309,8 @@ class LoginScreen(BaseScreen): kommie._keychain['privkey_encr']=privkey_encr_obj self.log('My keychain now looks like v2:',dict_format(kommie.keychain())) - await logfunc(f'With this scrambled password we can encrypt your super-sensitive private key.') - - await logfunc(f'Private key before encryption: {privkey.discreet}',pause=True,clear=False) - await logfunc(f'Private key after encryption: {privkey_encr_obj.discreet}',pause=True,clear=False) + await logfunc(f'With this scrambled password we can encrypt your super-sensitive private key, from this:\n{privkey.discreet}',pause=True,clear=False) + await logfunc(f'To this:\n{privkey_encr_obj.discreet}',pause=True,clear=False) # ### PUBLIC KEY await logfunc('You must also register your username and public key with Komrade @Operator on the remote server',pause=False,clear=False) diff --git a/komrade/backend/keymaker.py b/komrade/backend/keymaker.py index 4b458eb..3d57738 100644 --- a/komrade/backend/keymaker.py +++ b/komrade/backend/keymaker.py @@ -233,13 +233,13 @@ KEYMAKER_DEFAULT_KEY_TYPES = { -def get_key_obj(keyname,data,key_types=KEYMAKER_DEFAULT_KEY_TYPES,getpass_func=None): +def get_key_obj(keyname,data,key_types=KEYMAKER_DEFAULT_KEY_TYPES,getpass_func=None,passphrase=None): if keyname.endswith('_decr'): # print('get_key_obj',keyname,data)#,key_types) try: data_s = data.decode() if data_s in {KEY_TYPE_SYMMETRIC_WITH_PASSPHRASE,KomradeSymmetricKeyWithPassphrase.__name__}: - return KomradeSymmetricKeyWithPassphrase(getpass_func=getpass_func) + return KomradeSymmetricKeyWithPassphrase(getpass_func=getpass_func,passphrase=passphrase) except UnicodeDecodeError: return KomradeSymmetricKeyWithoutPassphrase(data) @@ -277,7 +277,7 @@ class Keymaker(Logger): # logger.info('Keymaker booted with getpass_func',getpass_func) # boot keychain - self._keychain = self.keychain() + # self._keychain = self.keychain() def find_pubkey(self,name=None): @@ -318,7 +318,7 @@ class Keymaker(Logger): keychain[keyname] = get_key_obj(keyname,keyval,getpass_func=self.getpass_func) return keychain - def keychain(self,look_for=KEYMAKER_DEFAULT_ALL_KEY_NAMES): + def keychain(self,look_for=KEYMAKER_DEFAULT_ALL_KEY_NAMES,passphrase=None): # load existing keychain keys = self._keychain @@ -335,10 +335,10 @@ class Keymaker(Logger): if keyname in keys and keys[keyname]: continue key = self.crypt_keys.get(uri,prefix=f'/{keyname}/') # print('found in crypt:',key,'for',keyname) - if key: keys[keyname]=get_key_obj(keyname,key,getpass_func=self.getpass_func) + if key: keys[keyname]=get_key_obj(keyname,key,getpass_func=self.getpass_func,passphrase=passphrase) # try to assemble - keys = self.assemble(self.assemble(keys)) + keys = self.assemble(self.assemble(keys,passphrase=passphrase),passphrase=passphrase) #store to existing set self._keychain = {**keys} @@ -497,7 +497,7 @@ class Keymaker(Logger): return (uri_id,keys_saved_d,keychain) - def assemble(self,keychain,key_types=KEYMAKER_DEFAULT_KEY_TYPES,decrypt=True): + def assemble(self,keychain,key_types=KEYMAKER_DEFAULT_KEY_TYPES,decrypt=True,passphrase=None): encr_keys = [k for k in keychain.keys() if k.endswith('_encr')] for encr_key_name in encr_keys: decr_key_name = encr_key_name[:-5] + '_decr' @@ -513,12 +513,12 @@ class Keymaker(Logger): encr_key = keychain.get(encr_key_name) # self.log(f'about to decrypt {encr_key} with {decr_key} and {decr_key.cell}') unencr_key = decr_key.decrypt(encr_key.data) - keychain[unencr_key_name] = get_key_obj(unencr_key_name,unencr_key,getpass_func=self.getpass_func) + keychain[unencr_key_name] = get_key_obj(unencr_key_name,unencr_key,getpass_func=self.getpass_func,passphrase=passphrase) else: # unencr_key = keychain.get(unencr_key_name) # self.log(f'about to encrypt {unencr_key} with {decr_key}') encr_key = decr_key.encrypt(unencr_key.data) - keychain[encr_key_name] = get_key_obj(encr_key_name,encr_key,getpass_func=self.getpass_func) + keychain[encr_key_name] = get_key_obj(encr_key_name,encr_key,getpass_func=self.getpass_func,passphrase=passphrase) except ThemisError as e: #exit('Incorrect password.') #self.log('error!!',e,decrypt,decr_key,encr_key,decr_key_name,encr_key_name) diff --git a/komrade/backend/komrades.py b/komrade/backend/komrades.py index a4bddfb..fc4a412 100644 --- a/komrade/backend/komrades.py +++ b/komrade/backend/komrades.py @@ -18,7 +18,7 @@ class KomradeX(Caller): # logger.info('booting KomradeX with getpass_func:',getpass_func) super().__init__(name=name, callbacks=callbacks, getpass_func=getpass_func) self.log(f'Starting up with callbacks: {self._callbacks}') - self.boot(create=False) + # self.boot(create=False) # special? if self.name==WORLD_NAME: if os.path.exists(PATH_SUPER_SECRET_OP_KEY): @@ -33,42 +33,56 @@ class KomradeX(Caller): def boot(self,create=False,ping=False): - # Do I already have my keys? - # yes? -- login + return - keys = self.keychain() - # self.log(f'booting {self}!',dict_format(keys)) + # # Do I already have my keys? + # # yes? -- login - if keys.get('pubkey') and keys.get('privkey'): - # self.log('already booted! @'+self.name) - return True + # keys = self.keychain() + # # self.log(f'booting {self}!',dict_format(keys)) + + # if keys.get('pubkey') and keys.get('privkey'): + # # self.log('already booted! @'+self.name) + # return True - if self.exists_locally_as_account(): - self.log(f'this account (@{self.name}) can be logged into') - return self.login() + # if self.exists_locally_as_account(): + # self.log(f'this account (@{self.name}) can be logged into') + # return #self.login() - elif self.exists_locally_as_contact(): - self.log(f'this account (@{self.name}) is a contact') - return #pass #??? + # elif self.exists_locally_as_contact(): + # self.log(f'this account (@{self.name}) is a contact') + # return #pass #??? - elif ping and self.exists_on_server(): - self.log(f'this account exists on server. introduce?') - return + # elif ping and self.exists_on_server(): + # self.log(f'this account exists on server. introduce?') + # return - elif create: - self.log('account is free: register?') - return self.register() + # elif create: + # self.log('account is free: register?') + # return self.register() def exists_locally(self): - return bool(self.pubkey) + pubkey=self.find_pubkey() + return bool(pubkey) def exists_locally_as_contact(self): - return bool(self.pubkey) and not bool(self.privkey) + pubkey=self.find_pubkey() + if not pubkey: return False + uri=pubkey.data_b64 + if self.crypt_keys.get(uri,prefix='/privkey_encr/'): + return False + return True def exists_locally_as_account(self): - return bool(self.pubkey) and bool(self.privkey_encr) + #return bool(self.pubkey) and bool(self.privkey_encr) + pubkey=self.find_pubkey() + if not pubkey: return False + uri=pubkey.data_b64 + if self.crypt_keys.get(uri,prefix='/privkey_encr/'): + return True + return False def exists_on_server(self): answer = self.phone.ring_ring({ diff --git a/komrade/backend/operators.py b/komrade/backend/operators.py index 797f566..23f7f05 100644 --- a/komrade/backend/operators.py +++ b/komrade/backend/operators.py @@ -49,8 +49,8 @@ def Komrade(name=None,pubkey=None,*x,**y): # print('found!',name,PHONEBOOK[name],PHONEBOOK[name].keychain()) PHONEBOOK[name] = kommie - if kommie.pubkey: - PHONEBOOK[kommie.pubkey.data_b64] = kommie + pubkey=kommie.find_pubkey(name) + if pubkey: PHONEBOOK[pubkey.data_b64] = kommie return kommie @@ -102,10 +102,12 @@ class Operator(Keymaker): getpass_func=getpass_func ) - # add to phonebook - if name: PHONEBOOK[name]=self - if self.pubkey: PHONEBOOK[self.pubkey.data_b64]=self + if name: + PHONEBOOK[name]=self + pubkey=self.find_pubkey(name) + if pubkey: + PHONEBOOK[pubkey.data_b64]=self self._inbox_crypt=None