app-gui
quadrismegistus 4 years ago
parent 5ed4697d54
commit 7f7e531778

@ -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:

@ -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)

@ -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)

@ -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({

@ -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

Loading…
Cancel
Save