posting
quadrismegistus 4 years ago
parent 664e42ab9c
commit a9e3d7e172

@ -69,10 +69,6 @@ class KomradeX(Caller):
return answer
# login?
# def login(self):
# if keys.get('pubkey') and keys.get('privkey')
def register(self, name = None, passphrase = None, is_group=None, show_intro=0,show_body=True):
# global PHONEBOOK
@ -212,8 +208,6 @@ class KomradeX(Caller):
def login(self,passphrase=None):
# what keys do I have?
keys = self.keychain()
# self.log('here are my keys:',dict_format(keys))
# check hardware
if not 'pubkey' in keys:
@ -238,17 +232,23 @@ class KomradeX(Caller):
}
# ask operator and get response
resp_msg = self.ring_ring(
resp_msg_d = self.ring_ring(
msg,
route='login'
)
print('got resp_msg:',resp_msg)
print('got resp_msg_d:',resp_msg_d)
# get result
self.log('Got result back from operator:',resp_msg)
self.log('Got resp_msg_d back from operator:',resp_msg_d)
return resp_msg
# check msgs?
if 'res_check_msgs' in resp_msg_d:
self.do_check_msgs(resp_msg_d['res_check_msgs'])
resp_msg_d['res_refresh'] = self.refresh(check_msgs=False) # already done in previous line
self.log('-->',resp_msg_d)
return resp_msg_d
@ -344,22 +344,32 @@ class KomradeX(Caller):
)
self.log('got back response:',res)
return self.do_check_msgs(res)
def do_check_msgs(self,res):
# decrypt?
if not res.get('data_encr'):
return {'success':False, 'status':'No data'}
inbox_encr = res['data_encr']
inbox = SMessage(
self.privkey.data,
self.op.pubkey.data
).unwrap(inbox_encr)
self.log('inbox decrypted:',inbox)
# overwrite my local inbox with encrypted one from op?
self.crypt_keys.set(
return self.crypt_keys.set(
self.uri,
inbox_encr,
inbox,
prefix='/inbox/',
override=True
)
def refresh(self):
def refresh(self,check_msgs=True):
# refresh inbox
self.check_msgs()
if check_msgs:
self.check_msgs()
# status?
inbox_status = self.get_inbox_ids()
@ -371,12 +381,14 @@ class KomradeX(Caller):
# download new messages
self.download_msgs(post_ids = inbox)
return {
res = {
'success':True,
'status':'Messages refreshed',
'unread':unread,
'inbox':inbox
}
self.log('->',res)
return res
def save_inbox(self,post_ids):
self.crypt_keys.set(
@ -390,18 +402,25 @@ class KomradeX(Caller):
return self.delete_msgs([post_id])
def delete_msgs(self,post_ids):
inbox_ids = self.get_inbox_ids().get('inbox',[])
#inbox_ids = self.get_inbox_ids().get('inbox',[])
deleted=[]
for post_id in post_ids:
print('deleting post:',post_id)
#print('deleting post:',post_id)
self.crypt_keys.delete(
post_id,
prefix='/post/',
)
deleted+=[post_id]
return {
'success':not bool(set(post_ids) - set(deleted)),
'status':f'Deleted {len(deleted)} messages.',
'deleted':deleted
}
# print(post_id,inbox_ids,post_id in inbox_ids,'???')
# stop
if post_id in inbox_ids:
inbox_ids.remove(post_id)
self.save_inbox(inbox_ids)
#if post_id in inbox_ids:
# inbox_ids.remove(post_id)
#self.save_inbox(inbox_ids)
def inbox(self,topn=100,only_unread=False,delete_malformed=False):
# refreshing inbox
@ -458,19 +477,15 @@ class KomradeX(Caller):
def get_inbox_ids(self):
inbox_encr = self.crypt_keys.get(
inbox = self.crypt_keys.get(
self.uri,
prefix='/inbox/',
)
# decrypt inbox?
if inbox_encr:
inbox = SMessage(
self.privkey.data,
self.op.pubkey.data
).unwrap(inbox_encr)
self.log('inbox decrypted:',inbox)
if inbox:
inbox = inbox.split(BSEP)
self.log('inbox_l',inbox)
else:
inbox=[]
@ -482,12 +497,14 @@ class KomradeX(Caller):
unread.append(post_id)
self.log(f'I {self} have {len(unread)} new messages')
return {
res = {
'success':True,
'status':'Inbox retrieved.',
'unread':unread,
'inbox':inbox
}
self.log('->',res)
return res
def read_msg(self,post_id):
# get post

@ -53,19 +53,32 @@ class Message(Logger):
fpk=b64enc_s(self.from_pubkey)
fpk1,fpk2 = fpk[:len(fpk)//2],fpk[len(fpk)//2:]
numchar = len(b64enc_s(self.to_pubkey))
linestr = '-'*(numchar+2)
linestr = '-'*CLI_WIDTH #(numchar+2)
return f""" -------{linestr}
# return f""" -------{linestr}
from: @{self.from_name if self.from_name else ''}
[{b64enc_s(self.from_pubkey)}]
# from: @{self.from_name if self.from_name else ''}
# [{b64enc_s(self.from_pubkey)}]
to: @{self.to_name if self.to_name else ''}
[{b64enc_s(self.to_pubkey)}]
# to: @{self.to_name if self.to_name else ''}
# [{b64enc_s(self.to_pubkey)}]
-------{linestr}
# -------{linestr}
msg: {msg}
# msg: {msg}
# """
import textwrap as tw
msg_s = '\n'.join(tw.wrap(msg,CLI_WIDTH))
hdr='#'*CLI_WIDTH
return f"""
{hdr}
from: @{self.from_name if self.from_name else ''}
to: @{self.to_name if self.to_name else ''}
{hdr}
{msg_s}
{hdr}
"""

@ -151,7 +151,7 @@ class Operator(Keymaker):
def __repr__(self):
clsname=(type(self)).__name__
#name = clsname+' '+
name = '@'+ (self.name if self.name else '?') # if self.name!=clsname else clsname
name = 'Komrade @'+ (self.name if self.name else '?') # if self.name!=clsname else clsname
# try:
# keystr= 'on device: ' + ('+'.join(self.top_keys) if self.pubkey else '')
# except TypeError:

@ -541,11 +541,12 @@ from_komrade = {from_komrade}
meet_from_name = data.get('name')
meet_from_uri = data.get('pubkey')
returning = data.get('returning')
qr_str = self.qr_str(meet_uri)
if returning:
txt=f'''Komrade @{meet_name} has agreed to make your acquaintance. Their public key is {meet_uri.decode()}.'''
txt=f'''Komrade @{meet_name} has agreed to make your acquaintance.\n\nTheir public key is {meet_uri.decode()}.\n{qr_str}'''
else:
txt=f'''Komrade @{meet_name} would like to make your acquaintance. Their public key is {meet_uri.decode()}.'''
txt=f'''Komrade @{meet_name} would like to make your acquaintance.\n\nTheir public key is:\n{meet_uri.decode()}.\n{qr_str}'''
msg_from_op = Message(
msg_d = {

@ -42,13 +42,13 @@ class CLI(Logger):
while True:
try:
inp=input(f'@{self.name if self.name else "?"}: ')
inp=input(f'\nKomrade @{self.name if self.name else "?"}: ')
# self.print(inp,'??')
self.route(inp)
except (KeyboardInterrupt,EOFError) as e:
exit('\n\n@Operator: Goodbye.\n')
exit('\n\nKomrade @Operator: Goodbye.\n')
except KomradeException as e:
self.print(f'@Operator: I could not handle your request. {e}\n')
self.print(f'Komrade @Operator: I could not handle your request. {e}\n')
#await asyncio.sleep(0.5)
def route(self,inp):
@ -64,23 +64,33 @@ class CLI(Logger):
try:
res=f(dat)
except KomradeException as e:
self.print('@Operator: Message not sent.',e,'\n')
self.stat('Message not sent.',e,'\n')
def stat(self,*msgs):
prefix='@Operator: '
def stat(self,*msgs,use_prefix=True):
prefix='Komrade @Operator: '
blank=' '*len(prefix)
msg = '\n'.join([
(f'{prefix}{x}' if not i else f'{blank}{x}')
for i,x in enumerate(msgs)
])+'\n'
self.print(msg)
total_msg=[]
for i,msg in enumerate(msgs):
msg_wrapped = tw.wrap(msg,CLI_WIDTH-len(prefix))
for ii,lnn in enumerate(msg_wrapped):
prfx=prefix if (not i and not ii and use_prefix) else blank
x=prfx+lnn
# print([prfx,lnn])
total_msg+=[x]
total_msg+=['']
print()
self.print('\n'.join(total_msg))
def print(self,*x):
x=' '.join(str(xx) for xx in x)
x=str(x).replace('\r\n','\n').replace('\r','\n')
for ln in x.split('\n'):
#scan_print(ln+'\n\n')
print(ln)
# #scan_print(ln+'\n\n')
if not ln: print()
for ln2 in tw.wrap(ln,CLI_WIDTH):
print(ln2)
# x='\n'.join(tw.wrap(x,CLI_WIDTH))
# print(x)
def boot(self,indent=None):
if indent is None:
@ -159,8 +169,9 @@ class CLI(Logger):
self.komrade=Komrade(name)
res = self.komrade.login()
print('got login res:',res)
stop
# print('got login res:',res)
self.log('<- komrade.login() <-',res)
if res and type(res)==dict and 'success' in res and res['success']:
self.name=self.komrade.name
@ -173,6 +184,13 @@ class CLI(Logger):
self.help()
self.stat(res.get('status','?'))
# also see if we got a msg update
if 'res_refresh' in res:
self.check(
res=res['res_refresh'],
statd={'use_prefix':True}
)
@property
def logged_in(self):
return (self.loggedin and self.komrade and self.name)
@ -233,15 +251,20 @@ class CLI(Logger):
self.log(f'Sent msg obj to {name_or_pubkey}: {msg_obj}')
self.stat(f'Message successfully sent to @{name_or_pubkey}.\n{msg_obj}')
def check(self,dat):
if self.with_required_login():
res = self.komrade.refresh()
if not res['success']:
self.stat(res['status'])
else:
unr = res.get('unread',[])
inb = res.get('inbox',[])
self.stat(f'You have {len(unr)} unread messages, with {len(inb)} total in your inbox.')
def check(self,dat=None,res=None,statd={}):
self.log(f'<-- dat={dat}, res={res}')
if not res:
if self.with_required_login():
res = self.komrade.refresh()
if not res['success']:
self.stat(res['status'])
return
unr = res.get('unread',[])
inb = res.get('inbox',[])
self.stat(f'You have {len(unr)} unread messages,',f'with {len(inb)} total in your inbox.',**statd)
self.log(f'--> unr={unr}, inb={inb}')
# stop
def prompt_adduser(self,msg):
# self.print('prompt got:',msg)
@ -251,33 +274,41 @@ class CLI(Logger):
meet_name = msg.data.get('meet_name')
meet_uri = msg.data.get('meet')
qrstr=self.komrade.qr_str(meet_uri)
do_adduser = input(f'''@Operator: 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.\n\n{self.komrade} [y/N]: ''')
self.stat(f"Add @{meet_name}'s public key to your address book?",f'It will allow you and @{meet_name} to read and write encrypted messages to one another.')
do_adduser = input(f'''\n{self.komrade} [y/N]: ''')
if do_adduser.strip().lower()=='y':
fnfn = self.komrade.save_uri_as_qrcode(
meet_uri,
meet_name
)
clear_screen()
self.stat(f'The public key of @{meet_name} has been saved as a QRcode to {fnfn}:\n{qrstr}')
self.stat(f'The public key of @{meet_name} has been saved as a QRcode to {fnfn}')
print(qrstr)
do_pause()
clear_screen()
do_senduser = input(f'''\n@Operator: Send this user your public key as well?\n\n{self.komrade} [y/N]: ''')
self.stat('Send this user your public key as well?')
do_senduser = input(f'''\n{self.komrade} [y/N]: ''')
if do_senduser.strip().lower()=='y':
self.print('@Operator: Returning the invitation ...')
res = self.komrade.meet(meet_name,returning=True)
if res.get('success'):
self.stat(f'I sent the following message to @{meet_name}:\n\n"{res.get("msg_sent")}"')
self.stat('Returning the invitation:',f'"{res.get("msg_sent")}"',use_prefix=True)
else:
self.stat(msg.get('status'))
def prompt_msg(self,msg):
do = input(f'\n\n@Operator: Type "r" to reply, "d" to delete, or hit Enter to continue.\n{self.komrade}: ')
self.stat('Type "r" to reply to this message, "d" to delete it, or hit Enter to continue.')
do = input(f'\n{self.komrade}: ')
do=do.strip().lower()
if do=='d':
# self.print('del',msg.post_id)
self.komrade.delete_msg(msg.post_id)
res=self.komrade.delete_msg(msg.post_id)
if res.get('success'):
self.stat('Deleted message.')
else:
self.stat('Could not delete message.')
do_pause()
elif do=='r':
self.print('@todo: replying...')
else:
@ -298,7 +329,8 @@ class CLI(Logger):
else:
clear_screen()
for i,msg in enumerate(msgs):
self.stat(f'Showing most recent messages first.\n\n\n Message {i+1} of {len(msgs)}')
self.stat(f'Showing message {i+1} of {len(msgs)}.')
print()
self.print(msg)
# self.print('DATA',msg.msg_d)
if msg.data.get('prompt_id')=='addcontact':

@ -91,9 +91,12 @@ class Logger(object):
calframe = inspect.getouterframes(curframe, 2)
mytype = type(self).__name__
caller = calframe[1][3]
x=list(x)
x.insert(0,f'[{mytype}.{caller}()]')
log(
f'[{mytype}.{caller}()]'.center(CLI_WIDTH) + '\n\n',
# .center(CLI_WIDTH) + '\n\n',
*x,
off=self.off
)

Loading…
Cancel
Save