diff --git a/komrade/backend/keymaker.py b/komrade/backend/keymaker.py index 57458af..163a824 100644 --- a/komrade/backend/keymaker.py +++ b/komrade/backend/keymaker.py @@ -366,6 +366,10 @@ class Keymaker(Logger): self._uri_id = pubkey.data_b64 return self._uri_id + @property + def uri(self): + return self.uri_id + ### BASE STORAGE @property def crypt_keys(self): diff --git a/komrade/backend/komrades.py b/komrade/backend/komrades.py index c16801a..cfce01f 100644 --- a/komrade/backend/komrades.py +++ b/komrade/backend/komrades.py @@ -328,7 +328,7 @@ class KomradeX(Caller): msg = { 'secret_login':self.secret_login, 'name':self.name, - 'pubkey':self.pubkey.data_b64, + 'pubkey':self.uri, 'inbox':inbox } self.log('sending msg to op:',msg) @@ -336,36 +336,67 @@ class KomradeX(Caller): res = self.ring_ring(msg,route='check_msgs') self.log('got back response:',res) - # # decrypt? + # decrypt? if not res.get('data_encr'): return {'success':False, 'status':'No data'} + inbox_encr = res['data_encr'] + + # overwrite my local inbox with encrypted one from op? + self.crypt_keys.set( + self.uri, + inbox_encr, + prefix='/inbox/', + override=True + ) + # decrypt inbox? inbox = SMessage( self.privkey.data, self.op.pubkey.data - ).unwrap(res['data_encr']) + ).unwrap(inbox_encr) self.log('inbox decrypted:',inbox) + # find the unread ones unread = [] inbox = inbox.split(b'\n') for post_id in inbox: if not post_id: continue - print('>>',post_id) - if not self.crypt_keys.get(post_id,prefix='/post/'): unread.append(post_id) - self.log(f'I {self} have {len(unread)} new messages') - # print('unread:',unread,len(unread)) - + self.log(f'I {self} have {len(unread)} new messages') return { 'success':True, 'status':'Inbox retrieved.', 'unread':unread, 'inbox':inbox } + + def read_msg(self,post_id): + # get post + post = self.crypt_keys.get(post_id,prefix='/post/') + if not post: + return { + 'success':False, + 'status':'Post not found.' + } + + # it should be twice decrypted + msg_op2me = Message( + from_whom=self.op, + to_whom=self, + msg=post_encr + ) + self.log('assuming this is the message:',msg_op2me) + + # decrypt + msg_op2me.decrypt() - def read_msgs(self,post_ids=[],inbox=None): + self.log('msg_op2me is now') + return msg_op2me + + + def download_msgs(self,post_ids=[],inbox=None): if not post_ids: # get unerad post_ids = self.check_msgs(inbox).get('unread',[]) @@ -373,17 +404,28 @@ class KomradeX(Caller): return {'success':False,'status':'No messages requested'} # ask Op for them - msgs = self.ring_ring( + res = self.ring_ring( { 'secret_login':self.secret_login, 'name':self.name, - 'pubkey':self.pubkey.data_b64, + 'pubkey':self.uri, 'post_ids':post_ids, }, - route='read_msgs' + route='download_msgs' ) - self.log('got back from op!',msgs) + self.log('got back from op!',res) + if not 'data_encr' or not res['data_encr'] or type(res['data_encr'])!=dict: + return {'success':False, 'status':'No valid data returned.'} + + # store -- encrypted! + for post_id,post_encr in res['data_encr'].items(): + print('storing...',post_id) + self.crypt_keys.set( + post_id, + post_encr, + prefix='/post/' + ) return msgs def test_register(): @@ -400,7 +442,7 @@ def test_msg(): b = Komrade('bez') b.login() - print(b.read_msgs()) + print(b.download_msgs()) # z = Komrade('zuckbot') diff --git a/komrade/backend/messages.py b/komrade/backend/messages.py index 688b998..1d2f627 100644 --- a/komrade/backend/messages.py +++ b/komrade/backend/messages.py @@ -15,16 +15,16 @@ def is_valid_msg_d(msg_d): class Message(Logger): - def __init__(self,msg_d,from_whom=None,to_whom=None,embedded_msg=None,is_encrypted=False): + def __init__(self,msg_d={},from_whom=None,to_whom=None,msg=None): # check input if not is_valid_msg_d(msg_d): raise KomradeException('This is not a valid msg_d:',msg_d) self.msg_d=msg_d - self.to_name=msg_d.get('to_name') - self.to_pubkey=msg_d.get('to') - self.from_name=msg_d.get('from_name') - self.from_pubkey=msg_d.get('from') - self.msg=msg_d.get('msg') + self.to_name=msg_d.get('to_name') if not to_whom else to_whom.name + self.to_pubkey=msg_d.get('to') if not to_whom else to_whom.uri + self.from_name=msg_d.get('from_name') if not from_whom else from_whom.name + self.from_pubkey=msg_d.get('from') if not to_whom else to_whom.uri + self.msg=msg_d.get('msg') if not msg else msg self._route=msg_d.get(ROUTE_KEYNAME) self._is_encrypted=None diff --git a/komrade/backend/the_operator.py b/komrade/backend/the_operator.py index 6d8731b..fef8c91 100644 --- a/komrade/backend/the_operator.py +++ b/komrade/backend/the_operator.py @@ -423,7 +423,7 @@ from_komrade = {from_komrade} 'data_encr':inbox_encr } - def read_msgs(self, + def download_msgs(self, msg_to_op, required_fields = [ 'secret_login', diff --git a/komrade/constants.py b/komrade/constants.py index b04afa4..f081a0c 100644 --- a/komrade/constants.py +++ b/komrade/constants.py @@ -144,7 +144,7 @@ OPERATOR_ROUTES = [ 'login', 'deliver_msg', 'check_msgs', - 'read_msgs', + 'download_msgs', ] OPERATOR_INTRO = 'Hello, this is the Operator speaking. '