lots of fixes

master
quadrismegistus 4 years ago
parent 99cf9a49d9
commit a5946ed470

@ -277,8 +277,11 @@ class TextInputPopupCard(MDDialog2):
) )
self.ids.text.text_color=rgb(*COLOR_TEXT) self.ids.text.text_color=rgb(*COLOR_TEXT)
self.ids.text.font_name=FONT_PATH self.ids.text.font_name=FONT_PATH
self.size=('333sp','111sp') self.size=('400sp','400sp')
self.adaptive_height=True self.adaptive_height=True
self.ids.text.font_size='28sp'
for widget in self.ids.button_box.children:
widget.font_size='18sp'
# wait and show # wait and show
async def open(self,maxwait=666,pulse=0.1): async def open(self,maxwait=666,pulse=0.1):
@ -348,6 +351,11 @@ class BooleanInputPopupCard(MDDialog2):
self.ids.text.text_color=rgb(*COLOR_TEXT) self.ids.text.text_color=rgb(*COLOR_TEXT)
self.ids.text.font_name=FONT_PATH self.ids.text.font_name=FONT_PATH
self.ids.text.font_size='22sp'
for widget in self.ids.button_box.children:
widget.font_size='22sp'
# wait and show # wait and show
async def open(self,maxwait=666,pulse=0.1): async def open(self,maxwait=666,pulse=0.1):
@ -587,6 +595,17 @@ class MainApp(MDApp, Logger):
# commie = Comrad(username) # commie = Comrad(username)
# if self.exists_locally_as_contact() # if self.exists_locally_as_contact()
def open_map(self):
if self.map is None:
from comrad.app.screens.map import MapWidget
self.map = MapWidget()
self.map.open()
def close_map(self):
if self.map is not None:
self.map.dismiss()
self.map=None
@property @property
def callbacks(self): def callbacks(self):
return { return {
@ -785,6 +804,7 @@ class MainApp(MDApp, Logger):
if yesno: if yesno:
self.msg_dialog = BooleanInputPopupCard(msg,comrad_name=comrad_name,**y) self.msg_dialog = BooleanInputPopupCard(msg,comrad_name=comrad_name,**y)
else: else:
self.msg_dialog = TextInputPopupCard(msg,password=get_pass,comrad_name=comrad_name,**y) self.msg_dialog = TextInputPopupCard(msg,password=get_pass,comrad_name=comrad_name,**y)
@ -886,11 +906,20 @@ class MainApp(MDApp, Logger):
self.remove_widget(self.msg_dialog) self.remove_widget(self.msg_dialog)
async def prompt_addcontact(self,post_data): async def prompt_addcontact(self,post_data,screen=None,post_id=None,post_card=None):
meet_name = post_data.get('meet_name') meet_name = post_data.get('meet_name')
meet_uri = post_data.get('meet').decode() meet_uri = post_data.get('meet').decode()
yn=await self.get_input(f"Exchange public keys with {meet_name}? It will allow you and @{meet_name} to read and write encrypted messages to one another.",yesno=True) yn=await self.get_input(f"Exchange public keys with {meet_name}? It will allow you and @{meet_name} to read and write encrypted messages to one another.",yesno=True)
if screen:
num_slides=len(screen.carousel.slides)
i=screen.carousel.index
self.log('changing slide??',num_slides,i)
screen.carousel.index=(i+1 if i<num_slides else 0)
if post_card is not None:
screen.carousel.remove_widget(post_card)
if yn: if yn:
fnfn = self.comrad.save_uri_as_qrcode( fnfn = self.comrad.save_uri_as_qrcode(
@ -898,13 +927,22 @@ class MainApp(MDApp, Logger):
name=meet_name name=meet_name
) )
await self.stat(f'''Saved {meet_name}'s public key:\n{meet_uri}.''',img_src=fnfn) await self.stat(f'''Saved {meet_name}'s public key:\n{meet_uri}.''',img_src=fnfn)
self.open_map()
await self.stat('Now returning the invitation...') await self.stat('Now returning the invitation...')
res = await self.comrad.meet_async(meet_name,returning=True) res = await self.comrad.meet_async(meet_name,returning=True)
if res.get('success'): if res.get('success'):
await self.stat('Invitation successfully sent.') await self.stat('Invitation successfully sent.')
do_pause()
else: else:
self.stat(res.get('status')) await self.stat(res.get('status'))
self.close_map()
#delete this msg
if post_id:
self.comrad.delete_post(post_id)
# async def meet(self,other_name,other_uri=None): # async def meet(self,other_name,other_uri=None):

@ -150,8 +150,9 @@
<BooleanInputPopupCard>: <BooleanInputPopupCard>:
type: "custom" type: "custom"
size_hint: (None, None) size_hint: (None, None)
size: ('200dp','200dp') size: ('400dp','400dp')
md_bg_color: rgb(*COLOR_TEXT) md_bg_color: rgb(*COLOR_TEXT)

@ -107,6 +107,8 @@ class PostCard(MDCard):
self.author = data.get('author','[Anonymous]') self.author = data.get('author','[Anonymous]')
self.recipient = data.get('to_name','') self.recipient = data.get('to_name','')
self.post_data = data.get('post_data', {}) self.post_data = data.get('post_data', {})
self.screen=data.get('screen')
self.post_id=data.get('post_id')
if not self.recipient: if not self.recipient:
self.recipient=self.app.channel self.recipient=self.app.channel
@ -226,64 +228,23 @@ class PostCard(MDCard):
### ###
# Add any buttons? Any prompts? # Any prompts?
if self.post_data.get('type')=='prompt': if self.post_data.get('type')=='prompt':
# # prepare button layout
# self.button_layout = MDBoxLayout()
# self.button_layout.adaptive_width=True
# self.button_layout.height='56dp'
# self.button_layout.spacing='10dp'
# self.button_layout.pos_hint={'center_x': .5, 'y':0.05}
if self.post_data.get('prompt_id')=='addcontact': if self.post_data.get('prompt_id')=='addcontact':
def on_touch_down(touch): def on_touch_down(touch):
if hasattr(self,'_touched') and self._touched: return if hasattr(self,'_touched') and self._touched: return
if self.collide_point(*touch.pos): if self.collide_point(*touch.pos):
asyncio.create_task(self.app.prompt_addcontact(self.post_data)) asyncio.create_task(
self._touched=True self.app.prompt_addcontact(
self.post_data,
screen=self.screen,
post_id=self.post_id,
post_card=self,
)
)
# self._touched=True
self.on_touch_down=on_touch_down self.on_touch_down=on_touch_down
# # self.stat(f"Add @{meet_name}'s public key to your address book? It will allow you and @{meet_name} to read and write encrypted messages to one another.")
# if do_adduser.strip().lower()=='y':
# import pyqrcode
# print('meet_uri',meet_uri,'???')
# qr = pyqrcode.create(meet_uri)
# fnfn = os.path.join(PATH_QRCODES,meet_name+'.png') # self.get_path_qrcode(name=name)
# qr.png(fnfn,scale=5)
# clear_screen()
# self.stat(f'The public key of @{meet_name} has been saved as a QRcode to {fnfn}')
# print(qrstr)
# do_pause()
# clear_screen()
# self.button = MDRectangleFlatButton()
# self.post_button = PostButton()
# self.post_button.screen = self
# self.post_status = PostStatus()
# self.post_status_added = False
# self.button_layout.add_widget(self.upload_button)
# self.button_layout.add_widget(self.post_button)
# self.upload_button.font_size='8sp'
# self.post_button.font_size='8sp'
# self.post_button.md_bg_color=rgb(*COLOR_CARD)
# self.upload_button.md_bg_color=rgb(*COLOR_CARD)
# self.post_status.md_bg_color=rgb(*COLOR_CARD)
# post.add_widget(self.button_layout)
@ -350,7 +311,8 @@ class FeedScreen(ProtectedScreen):
def on_pre_enter(self): def on_pre_enter(self):
if not super().on_pre_enter(): return if not super().on_pre_enter(): return
if self.updated: if self.updated:
if not self.app.comrad.updated or self.updated>=self.app.comrad.updated: if False: # @HACK!!!
# if not self.app.comrad.updated or self.updated>=self.app.comrad.updated:
self.log('NOT UPDATING!') self.log('NOT UPDATING!')
return return
# self.root.clear_widgets() # self.root.clear_widgets()
@ -360,6 +322,7 @@ class FeedScreen(ProtectedScreen):
self.root.remove_widget(self.app.map) self.root.remove_widget(self.app.map)
if not hasattr(self,'get_posts'): self.get_posts=self.app.comrad.posts if not hasattr(self,'get_posts'): self.get_posts=self.app.comrad.posts
self.carousel = self.ids.post_carousel
for post in self.posts: for post in self.posts:
self.ids.post_carousel.remove_widget(post) self.ids.post_carousel.remove_widget(post)
@ -379,6 +342,8 @@ class FeedScreen(ProtectedScreen):
'content':post.msg.get('txt') if type(post.msg)==dict else str(post.msg), 'content':post.msg.get('txt') if type(post.msg)==dict else str(post.msg),
'timestamp':post.timestamp, 'timestamp':post.timestamp,
'post_data':post.data, 'post_data':post.data,
'screen':self,
'post_id':post.post_id,
} }
post_obj = PostCard(data) post_obj = PostCard(data)
self.posts.append(post_obj) self.posts.append(post_obj)

@ -144,7 +144,7 @@ class PostScreen(ProtectedScreen):
inp_towhom.width = '100sp' inp_towhom.width = '100sp'
inp_towhom.font_name='assets/font.otf' inp_towhom.font_name='assets/font.otf'
# inp_towhom.height = '75sp' # inp_towhom.height = '75sp'
# self.post_card.to_name = inp_towhom.text
inp_towhom.adaptive_height=True inp_towhom.adaptive_height=True
inp_towhom.background_color=rgb(*COLOR_CARD) inp_towhom.background_color=rgb(*COLOR_CARD)
inp_towhom.color=rgb(*COLOR_CARD) inp_towhom.color=rgb(*COLOR_CARD)
@ -327,7 +327,13 @@ class PostScreen(ProtectedScreen):
#await self.app.post(content=content, channel = channel, file_id=file_id, file_ext=file_ext) #await self.app.post(content=content, channel = channel, file_id=file_id, file_ext=file_ext)
# post? # post?
res = await self.app.comrad.post_async(content) if recipient==WORLD_NAME:
res = await self.app.comrad.post_async(content)
else:
res = await self.app.comrad.msg_async(
recipient,
content
)
self.log('GOT BACK RES:',res) self.log('GOT BACK RES:',res)

@ -858,8 +858,13 @@ class ComradX(Caller):
'post':post_obj 'post':post_obj
} }
def msgs(self,*x,**y): return self.messages(*x,**y) def msgs(self,*x,**y): return self.messages(*x,**y)
def messages(self, def messages(self,
unread=None, unread=None,
inbox_prefix='/inbox/', inbox_prefix='/inbox/',
@ -919,7 +924,15 @@ class ComradX(Caller):
prefix=f'{post_prefix}{self.name}/', prefix=f'{post_prefix}{self.name}/',
) )
self.log('found encrypted post store:',post_encr) self.log('found encrypted post store:',post_encr)
if not post_encr:
# this is an invalid post_id!
self.delete_post(
post_id=post_id,
inbox_uri=self.uri,
inbox_prefix='/inbox/'
)
return {'success':False,'status':'No post found.'}
# first from op to me? # first from op to me?
try: try:
msg_from_op_b_encr = post_encr msg_from_op_b_encr = post_encr
@ -928,7 +941,7 @@ class ComradX(Caller):
self.privkey.data, self.privkey.data,
self.op.pubkey.data self.op.pubkey.data
).unwrap(msg_from_op_b_encr) ).unwrap(msg_from_op_b_encr)
self.log('decrypted??',msg_from_op_b) # self.log('decrypted??',msg_from_op_b)
except (ThemisError,TypeError) as e: except (ThemisError,TypeError) as e:
self.log(f'!!!!! {e} !!!!!') self.log(f'!!!!! {e} !!!!!')
return { return {
@ -938,9 +951,9 @@ class ComradX(Caller):
# decoded? # decoded?
msg_from_op = pickle.loads(msg_from_op_b) msg_from_op = pickle.loads(msg_from_op_b)
self.log('decoded?',msg_from_op) # self.log('decoded?',msg_from_op)
self.log('msg_from_op is now',msg_from_op) # self.log('msg_from_op is now',msg_from_op)
# this really to me? # this really to me?
if msg_from_op.get('to_name') != self.name: if msg_from_op.get('to_name') != self.name:

@ -14,7 +14,8 @@ from pythemis.exception import ThemisError
LOG_GET_SET = 0 LOG_GET_SET = 0
# [ComradX.get_inbox_crypt()] --> inbox crypt: VUVDMgAAAC2WUhTIAlSExnnuWskKUYTzK/PoKBPztt/GNvXCusQCsHHD9Rx0 /inbox/mbot/ []
# [ComradX.get_inbox_crypt()] --> inbox crypt: b'VUVDMgAAAC2xvQhQA3SLt8rXwiDmuRKip4BsmnPqbhNxFEkZbqZGUAVCFd9S' /inbox/mbot/ [b'ODIyY2MyNTY5Njg0NDJhYTk0ODVhODBlYTBhOTE3YWI=']
@ -141,10 +142,9 @@ class Crypt(Logger):
def delete(self,k,prefix=''): def delete(self,k,prefix=''):
k_b=self.package_key(k,prefix=prefix) k_b=self.package_key(k,prefix=prefix)
k_b_hash = self.hash(k_b) k_b_hash = self.hash(k_b)
self.log(f'deleting {k_b_hash}')
v = self.db.command('del',k_b_hash) v = self.db.command('del',k_b_hash)
self.log('<--',v) self.log('<-- # keys removed:',v,'did key exist?',self.has(k,prefix=prefix))
return v return v
@ -225,11 +225,12 @@ class CryptList(Crypt): # like inbox
return vals return vals
def remove(self,val): def remove(self,val):
self.log('<--',val) self.log('<-- removing value:',val,'\nfrom values:',self.values)
if type(val)==list: return [self.remove(x) for x in val] if type(val)==list: return [self.remove(x) for x in val]
val_x = self.package_val(val) val_x = self.package_val(val)
self.db.command('lrem',self.keyname,'0',val_x) res = self.db.command('lrem',self.keyname,'0',val_x)
self.log('res remove:',res)
return val if res else None

@ -281,21 +281,21 @@ class Keymaker(Logger):
def find_pubkey(self,name=None): def find_pubkey(self,name=None):
self.log('<-',name) # self.log('<-',name)
if not name: name=self.name if not name: name=self.name
self.log('<---',name) # self.log('<---',name)
if self.name==name and 'pubkey' in self._keychain and self._keychain['pubkey']: if self.name==name and 'pubkey' in self._keychain and self._keychain['pubkey']:
pk=self._keychain['pubkey'] pk=self._keychain['pubkey']
return ComradAsymmetricPublicKey(b64dec(pk)) if type(pk)==bytes else pk return ComradAsymmetricPublicKey(b64dec(pk)) if type(pk)==bytes else pk
res = self.crypt_keys.get(name, prefix='/pubkey/') res = self.crypt_keys.get(name, prefix='/pubkey/')
self.log(f'crypt_keys({name}) -->',res) # self.log(f'crypt_keys({name}) -->',res)
if not res: if not res:
res = self.load_qr(name) res = self.load_qr(name)
self.log(f'load_qr({name}) -->',res) # self.log(f'load_qr({name}) -->',res)
if not res: return if not res: return
key = ComradAsymmetricPublicKey(b64dec(res)) key = ComradAsymmetricPublicKey(b64dec(res))
self.log('-->',key) # self.log('-->',key)
return key return key
# self.log('I don\'t know my public key! Do I need to register?') # self.log('I don\'t know my public key! Do I need to register?')
# raise ComradException(f'I don\'t know my public key!\n{self}\n{self._keychain}') # raise ComradException(f'I don\'t know my public key!\n{self}\n{self._keychain}')
@ -385,10 +385,8 @@ class Keymaker(Logger):
@property @property
def uri_id(self): def uri_id(self):
if not self._uri_id: pubkey = self.find_pubkey()
pubkey = self.pubkey #find_pubkey() return pubkey.data_b64
self._uri_id = pubkey.data_b64
return self._uri_id
@property @property
def uri(self): def uri(self):

@ -319,6 +319,9 @@ class Operator(Keymaker):
if not crypt: crypt=self.crypt_data if not crypt: crypt=self.crypt_data
if not uri: uri=self.uri if not uri: uri=self.uri
prefix+=self.name+'/' prefix+=self.name+'/'
self.log(f'I am {self.name} and my uri is {self.uri}.')
inbox_crypt = CryptList( inbox_crypt = CryptList(
crypt=self.crypt_data, crypt=self.crypt_data,
keyname=uri, keyname=uri,
@ -339,30 +342,39 @@ class Operator(Keymaker):
# delete from posts # delete from posts
deleted_post_ids=[] deleted_post_ids=[]
for post_id in post_ids: for post_id in post_ids:
if self.crypt_data.delete( self.log('deleting post id?',post_id)
del_res = self.crypt_data.delete(
post_id, post_id,
prefix=post_prefix prefix=f'{post_prefix}{self.name}/',
): )
#del_res = 1
self.log('del_res =',del_res)
if del_res:
deleted_post_ids.append(post_id) deleted_post_ids.append(post_id)
self.log('deleted_post_ids',deleted_post_ids,'...') self.log('deleted_post_ids',deleted_post_ids,'...')
res = { res = {
'deleted':post_ids, 'deleted':deleted_post_ids,
} }
# delete from inbox # delete from inbox
inbox_uri = self.uri if not inbox_uri else inbox_uri #inbox_uri = self.uri if not inbox_uri else inbox_uri
if inbox_uri: # if inbox_uri:
inbox_db=self.get_inbox_crypt( # inbox_db=self.get_inbox_crypt(
uri=inbox_uri, # uri=inbox_uri,
) # )
res['deleted_from_inbox']=inbox_db.remove( # res['deleted_from_inbox']=inbox_db.remove(
deleted_post_ids # deleted_post_ids
) # )
inbox_db=self.get_inbox_crypt(
prefix='/inbox/'
)
self.log('inbox!?',inbox_db.values)
res['deleted_from_inbox']=inbox_db.remove(post_ids)
self.log('-->',res) self.log('-->',res)
res['success']=True res['success']=True
res['status']=f'Deleted {len(post_ids)} posts.' res['status']=f'Deleted {len(deleted_post_ids)} posts.'
return res return res

Loading…
Cancel
Save