From a5946ed47019ce9d67173583ca184577ec5f1458 Mon Sep 17 00:00:00 2001 From: quadrismegistus Date: Mon, 5 Oct 2020 18:33:32 +0100 Subject: [PATCH] lots of fixes --- comrad/app/main.py | 46 +++++++++++++++++++-- comrad/app/root.kv | 3 +- comrad/app/screens/feed/feed.py | 71 +++++++++------------------------ comrad/app/screens/post/post.py | 10 ++++- comrad/backend/comrades.py | 21 ++++++++-- comrad/backend/crypt.py | 15 +++---- comrad/backend/keymaker.py | 16 ++++---- comrad/backend/operators.py | 38 ++++++++++++------ 8 files changed, 127 insertions(+), 93 deletions(-) diff --git a/comrad/app/main.py b/comrad/app/main.py index 56c6013..679612b 100644 --- a/comrad/app/main.py +++ b/comrad/app/main.py @@ -277,8 +277,11 @@ class TextInputPopupCard(MDDialog2): ) self.ids.text.text_color=rgb(*COLOR_TEXT) self.ids.text.font_name=FONT_PATH - self.size=('333sp','111sp') + self.size=('400sp','400sp') 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 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.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 async def open(self,maxwait=666,pulse=0.1): @@ -587,6 +595,17 @@ class MainApp(MDApp, Logger): # commie = Comrad(username) # 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 def callbacks(self): return { @@ -785,6 +804,7 @@ class MainApp(MDApp, Logger): if yesno: self.msg_dialog = BooleanInputPopupCard(msg,comrad_name=comrad_name,**y) + else: 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) - 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_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) + + + 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: type: "custom" size_hint: (None, None) - size: ('200dp','200dp') + size: ('400dp','400dp') md_bg_color: rgb(*COLOR_TEXT) + diff --git a/comrad/app/screens/feed/feed.py b/comrad/app/screens/feed/feed.py index a2fe5dc..2988d94 100644 --- a/comrad/app/screens/feed/feed.py +++ b/comrad/app/screens/feed/feed.py @@ -107,6 +107,8 @@ class PostCard(MDCard): self.author = data.get('author','[Anonymous]') self.recipient = data.get('to_name','') self.post_data = data.get('post_data', {}) + self.screen=data.get('screen') + self.post_id=data.get('post_id') if not self.recipient: 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': - # # 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': def on_touch_down(touch): if hasattr(self,'_touched') and self._touched: return if self.collide_point(*touch.pos): - asyncio.create_task(self.app.prompt_addcontact(self.post_data)) - self._touched=True + asyncio.create_task( + 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.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): if not super().on_pre_enter(): return 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!') return # self.root.clear_widgets() @@ -360,6 +322,7 @@ class FeedScreen(ProtectedScreen): self.root.remove_widget(self.app.map) if not hasattr(self,'get_posts'): self.get_posts=self.app.comrad.posts + self.carousel = self.ids.post_carousel for post in self.posts: 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), 'timestamp':post.timestamp, 'post_data':post.data, + 'screen':self, + 'post_id':post.post_id, } post_obj = PostCard(data) self.posts.append(post_obj) diff --git a/comrad/app/screens/post/post.py b/comrad/app/screens/post/post.py index 529aa5d..bbcceee 100644 --- a/comrad/app/screens/post/post.py +++ b/comrad/app/screens/post/post.py @@ -144,7 +144,7 @@ class PostScreen(ProtectedScreen): inp_towhom.width = '100sp' inp_towhom.font_name='assets/font.otf' # inp_towhom.height = '75sp' - + # self.post_card.to_name = inp_towhom.text inp_towhom.adaptive_height=True inp_towhom.background_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) # 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) diff --git a/comrad/backend/comrades.py b/comrad/backend/comrades.py index bb58b9a..1ba2f5c 100644 --- a/comrad/backend/comrades.py +++ b/comrad/backend/comrades.py @@ -858,8 +858,13 @@ class ComradX(Caller): 'post':post_obj } + + def msgs(self,*x,**y): return self.messages(*x,**y) + + + def messages(self, unread=None, inbox_prefix='/inbox/', @@ -919,7 +924,15 @@ class ComradX(Caller): prefix=f'{post_prefix}{self.name}/', ) 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? try: msg_from_op_b_encr = post_encr @@ -928,7 +941,7 @@ class ComradX(Caller): self.privkey.data, self.op.pubkey.data ).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: self.log(f'!!!!! {e} !!!!!') return { @@ -938,9 +951,9 @@ class ComradX(Caller): # decoded? 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? if msg_from_op.get('to_name') != self.name: diff --git a/comrad/backend/crypt.py b/comrad/backend/crypt.py index de076ae..690a1dc 100644 --- a/comrad/backend/crypt.py +++ b/comrad/backend/crypt.py @@ -14,7 +14,8 @@ from pythemis.exception import ThemisError 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=''): k_b=self.package_key(k,prefix=prefix) k_b_hash = self.hash(k_b) - + self.log(f'deleting {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 @@ -225,11 +225,12 @@ class CryptList(Crypt): # like inbox return vals 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] 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 diff --git a/comrad/backend/keymaker.py b/comrad/backend/keymaker.py index 2b3ed9c..d71125c 100644 --- a/comrad/backend/keymaker.py +++ b/comrad/backend/keymaker.py @@ -281,21 +281,21 @@ class Keymaker(Logger): def find_pubkey(self,name=None): - self.log('<-',name) + # self.log('<-',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']: pk=self._keychain['pubkey'] return ComradAsymmetricPublicKey(b64dec(pk)) if type(pk)==bytes else pk 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: res = self.load_qr(name) - self.log(f'load_qr({name}) -->',res) + # self.log(f'load_qr({name}) -->',res) if not res: return key = ComradAsymmetricPublicKey(b64dec(res)) - self.log('-->',key) + # self.log('-->',key) return key # 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}') @@ -385,10 +385,8 @@ class Keymaker(Logger): @property def uri_id(self): - if not self._uri_id: - pubkey = self.pubkey #find_pubkey() - self._uri_id = pubkey.data_b64 - return self._uri_id + pubkey = self.find_pubkey() + return pubkey.data_b64 @property def uri(self): diff --git a/comrad/backend/operators.py b/comrad/backend/operators.py index 95c652d..9db6c7c 100644 --- a/comrad/backend/operators.py +++ b/comrad/backend/operators.py @@ -319,6 +319,9 @@ class Operator(Keymaker): if not crypt: crypt=self.crypt_data if not uri: uri=self.uri prefix+=self.name+'/' + + self.log(f'I am {self.name} and my uri is {self.uri}.') + inbox_crypt = CryptList( crypt=self.crypt_data, keyname=uri, @@ -339,30 +342,39 @@ class Operator(Keymaker): # delete from posts deleted_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, - 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) self.log('deleted_post_ids',deleted_post_ids,'...') res = { - 'deleted':post_ids, + 'deleted':deleted_post_ids, } # delete from inbox - inbox_uri = self.uri if not inbox_uri else inbox_uri - if inbox_uri: - inbox_db=self.get_inbox_crypt( - uri=inbox_uri, - ) - res['deleted_from_inbox']=inbox_db.remove( - deleted_post_ids - ) + #inbox_uri = self.uri if not inbox_uri else inbox_uri + # if inbox_uri: + # inbox_db=self.get_inbox_crypt( + # uri=inbox_uri, + # ) + # res['deleted_from_inbox']=inbox_db.remove( + # 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) res['success']=True - res['status']=f'Deleted {len(post_ids)} posts.' + res['status']=f'Deleted {len(deleted_post_ids)} posts.' return res