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.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<num_slides else 0)
if post_card is not None:
screen.carousel.remove_widget(post_card)
if yn:
fnfn = self.comrad.save_uri_as_qrcode(
@ -898,13 +927,22 @@ class MainApp(MDApp, Logger):
name=meet_name
)
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...')
res = await self.comrad.meet_async(meet_name,returning=True)
if res.get('success'):
await self.stat('Invitation successfully sent.')
do_pause()
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):

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

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

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

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

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

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

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

Loading…
Cancel
Save