diff --git a/komrade/backend/callers.py b/komrade/backend/callers.py index b76354a..eaaa24b 100644 --- a/komrade/backend/callers.py +++ b/komrade/backend/callers.py @@ -12,6 +12,7 @@ class Caller(Operator): """ def ring_ring(self,msg): + # stop return super().ring_ring( msg, to_whom=self.op, diff --git a/komrade/backend/keymaker.py b/komrade/backend/keymaker.py index 56b5e9a..6549a9a 100644 --- a/komrade/backend/keymaker.py +++ b/komrade/backend/keymaker.py @@ -107,7 +107,14 @@ class Keymaker(Logger): raise KomradeException(f'I don\'t know my public key!\n{self}\n{self._keychain}') #return None - + + @property + def keys(self): + return sorted(list(self.keychain().keys())) + + @property + def top_keys(self): + return [k for k in self.keys if k.count('_')==0] def keychain(self,look_for=KEYMAKER_DEFAULT_ALL_KEY_NAMES): # load existing keychain @@ -158,7 +165,6 @@ class Keymaker(Logger): def load_qr(self,name): # try to load? contact_fnfn = os.path.join(PATH_QRCODES,name+'.png') - print(contact_fnfn,os.path.exists(contact_fnfn)) if not os.path.exists(contact_fnfn): return '' # with open(contact_fnfn,'rb') as f: dat=f.read() from pyzbar.pyzbar import decode diff --git a/komrade/backend/messages.py b/komrade/backend/messages.py index a048ab2..12e921d 100644 --- a/komrade/backend/messages.py +++ b/komrade/backend/messages.py @@ -40,19 +40,12 @@ class Message(Logger): def __repr__(self): return f""" - - self.caller={self.callee} - self.from_name={self.from_name} - self.from_pubkey={self.from_pubkey} - - self.callee={self.caller} - self.to_name={self.to_name} - self.to_pubkey={self.to_pubkey} - + + self.caller={self.caller} + self.callee={self.callee} self.msg={self.msg} - - self._route={self.route} - + self.route={self.route} + """ @@ -110,7 +103,7 @@ class Message(Logger): return False return True - def decrypt(self,recursive=True): + def decrypt(self,recursive=False): # get callers caller,callee = self.get_callers() self.log(f'attempting to decrypt msg {self.msg} from {caller} to {callee}') @@ -134,7 +127,7 @@ class Message(Logger): return decr_msg - def encrypt(self,recursive=True): + def encrypt(self,recursive=False): """ Assuming that a recursive message looks like this: @@ -163,7 +156,7 @@ class Message(Logger): """ if self.is_encrypted: return - self.log(f'attempting to encrypt msg {self.msg} from {self.caller} to {self.callee}') + # self.log(f'attempting to encrypt msg {self.msg} from {self.caller} to {self.callee}') self.log(f'I now look like v1: {self}') if not self.has_embedded_msg: @@ -180,7 +173,7 @@ class Message(Logger): self.caller.privkey, self.callee.pubkey ) - self.log('created an encrypted msg:',encr_msg) + # self.log('created an encrypted msg:',encr_msg) self.msg_decr = self.msg self.msg = encr_msg self.msg_d['_msg'] = encr_msg @@ -193,28 +186,21 @@ class Message(Logger): ## creating/encrypting/rolling up messages def encrypt_to_send(self,msg_json,from_privkey,to_pubkey): - self.log('msg_json',msg_json) - self.log('from_privkey',from_privkey) - self.log('to_pubkey',to_pubkey) - - - if not msg_json or not from_privkey or not to_pubkey: - self.log('not enough info!',msg_json,from_privkey,to_pubkey) - whattttttt - return b'' - self.log('packing for transmission: msg_json',type(msg_json),msg_json) + raise KomradeException(f'not enough info!') + + # self.log('packing for transmission: msg_json',type(msg_json),msg_json) msg_b = package_for_transmission(msg_json) - self.log('packing for transmission: msg_b',type(msg_b),msg_b) + # self.log('packing for transmission: msg_b',type(msg_b),msg_b) # try: - self.log('from privkey =',from_privkey) - self.log('to pubkey =',to_pubkey) + # self.log('from privkey =',from_privkey) + # self.log('to pubkey =',to_pubkey) msg_encr = SMessage( from_privkey, to_pubkey, ).wrap(msg_b) - self.log('msg_encr',msg_encr) + # self.log('msg_encr',msg_encr) # stop return msg_encr # except ThemisError as e: @@ -281,7 +267,7 @@ def test_msg(): print('?keychains?') pprint(phone.pubkey) - msg={'_please':'forge_new_keys'} + msg={'_route':'forge_new_keys'} resp_msp_obj = phone.ring_ring(msg) diff --git a/komrade/backend/operators.py b/komrade/backend/operators.py index 5e1279b..e37fe9e 100644 --- a/komrade/backend/operators.py +++ b/komrade/backend/operators.py @@ -72,20 +72,22 @@ class Operator(Keymaker): '_to_name':another.name, '_msg':msg, } - self.log(f'I am a {type(self)} packaging a message to {another}: {msg_d}') + # self.log(f'I am {self} packaging a message to {another}: {msg_d}') from komrade.backend.messages import Message msg_obj = Message(msg_d,caller=self,callee=another) - self.log('created msg obj:',msg_obj) + # self.log('created msg obj:',msg_obj) + + return msg_obj def seal_msg(self,msg_obj): # make sure encrypted - msg_obj.encrypt() + # msg_obj.encrypt() # return pure binary version of self's entire msg_d msg_b = package_for_transmission(msg_obj.msg_d) - # encrypte by omega key + # encrypt by omega key msg_b_encr = self.omega_key.encrypt(msg_b) return msg_b_encr @@ -99,23 +101,39 @@ class Operator(Keymaker): from komrade.backend.messages import Message msg_obj = Message(msg_d) # decrypt msg - msg_obj.decrypt() + # msg_obj.decrypt() return msg_obj + + def __repr__(self): + clsname=(type(self)).__name__ + keystr='+'.join(self.top_keys) + return f'[{clsname}] {self.name} ({keystr})' + def ring_ring(self,msg,to_whom,get_resp_from=None): + # ring ring + self.log(f'ring ring! I, {self}, have been told to pass a message {msg} onto {to_whom}, by way of function {get_resp_from}') + # get encr msg obj msg_obj = self.compose_msg_to(msg, to_whom) - # pass onto next person - + self.log(f'here is the message object I made, to send to {to_whom}: {msg_obj}') + + # encrypting + msg_obj.encrypt() + # self.log(f'now I look like: {msg_obj}') # get pure encrypted binary, sealed - msg_sealed = self.seal_msg(msg_obj) + #msg_sealed = self.seal_msg(msg_obj) # pass onto next person... if not get_resp_from: get_resp_from=to_whom.ring_ring - resp_msg_b = get_resp_from(msg_sealed) + resp_msg_obj = get_resp_from(msg_obj) + self.log('resp_msg_obj <-',resp_msg_obj) + + # decrypt? + resp_msg_obj.decrypt() # unseal msg - resp_msg_obj = self.unseal_msg(resp_msg_b) + # resp_msg_obj = self.unseal_msg(resp_msg_b) return resp_msg_obj \ No newline at end of file diff --git a/komrade/backend/people.py b/komrade/backend/people.py index 77a496a..0679c81 100644 --- a/komrade/backend/people.py +++ b/komrade/backend/people.py @@ -7,20 +7,20 @@ class Persona(Caller): def __init__(self, name, passphrase=DEBUG_DEFAULT_PASSPHRASE): super().__init__(name=name,passphrase=passphrase) - self.boot(create=False) + # self.boot(create=False) - def boot(self,create=False): - # Do I already have my keys? - # yes? -- login + # def boot(self,create=False): + # # Do I already have my keys? + # # yes? -- login - keys = self.keychain() - if keys.get('pubkey') and keys.get('privkey'): - self.log('booted!') - return True + # keys = self.keychain() + # if keys.get('pubkey') and keys.get('privkey'): + # self.log('booted!') + # return True - # If not, forge them -- only once! - if not have_keys and create: - self.get_new_keys() + # # If not, forge them -- only once! + # if not have_keys and create: + # self.get_new_keys() def exists_locally_as_contact(self): @@ -30,9 +30,10 @@ class Persona(Caller): return self.pubkey and self.privkey def exists_on_server(self): - answer = self.phone.ring_ring( - msg={'_please':'does_username_exist','name':self.name} - ) + return self.ring_ring({ + '_route':'does_username_exist', + 'name':self.name + }) # login? @@ -52,7 +53,7 @@ class Persona(Caller): # form request msg_to_op = { - '_please':'forge_new_keys', + '_route':'forge_new_keys', 'name':name, 'passphrase':hashish(passphrase.encode()) } @@ -85,7 +86,7 @@ class Persona(Caller): def send_msg_to(self,msg,to_whom): msg = self.compose_msg_to(msg,to_whom) - {'_please':'deliver_to', 'msg':msg} + {'_route':'deliver_to', 'msg':msg} return self.ring_ring(msg) @@ -96,12 +97,12 @@ if __name__=='__main__': marx = Persona('marx') elon = Persona('elon') - marx.register() + # marx.register() # elon.register() # person.register() # print(person.pubkey) # elon.send_msg_to('youre dumb',marx) - #Caller('elon').ring_ring({'_please':'say_hello','_msg':'my dumb message to operator'}) + #Caller('elon').ring_ring({'_route':'say_hello','_msg':'my dumb message to operator'}) print(marx.exists_on_server()) \ No newline at end of file diff --git a/komrade/backend/the_operator.py b/komrade/backend/the_operator.py index 55f3561..3b39a3f 100644 --- a/komrade/backend/the_operator.py +++ b/komrade/backend/the_operator.py @@ -118,7 +118,7 @@ class TheOperator(Operator): ### ROUTES def forge_new_keys(self,data): self.log('about to make some new keys!',data) - # return {'_please':'well_hello_to_you_too'} + # return {'_route':'well_hello_to_you_too'} # get keys forged_keys_plus_id = super().forge_new_keys(**data) diff --git a/komrade/backend/the_telephone.py b/komrade/backend/the_telephone.py index 9a5cfc4..bcb5f4d 100644 --- a/komrade/backend/the_telephone.py +++ b/komrade/backend/the_telephone.py @@ -18,8 +18,11 @@ class TheTelephone(Operator): return self.telephone_keychain.get('pubkey') def send_and_receive(self,msg_b): + # seal for transport + msg_b_sealed = self.seal_msg(msg_b) + # prepare for transmission across net - msg_b64 = b64encode(msg_b) + msg_b64 = b64encode(msg_b_sealed) msg_b64_str = msg_b64.decode() msg_b64_str_esc = msg_b64_str.replace('/','_') self.log('msg_b64_str_esc',type(msg_b64_str_esc),msg_b64_str_esc) @@ -38,7 +41,10 @@ class TheTelephone(Operator): resp_msg_b64 = resp_msg_b64_str.encode() resp_msg_b = b64decode(resp_msg_b64) - return resp_msg_b + + # unseal + resp_msg_b_unsealed = self.unseal_msg(resp_msg_b) + return resp_msg_b_unsealed def ring_ring(self,msg): @@ -58,7 +64,7 @@ def test_call(): # caller.boot(create=True) # print(caller.keychain()) # phone = TheTelephone() - # req_json = {'_please':'forge_new_keys','name':name, 'pubkey_is_public':pubkey_is_public}} + # req_json = {'_route':'forge_new_keys','name':name, 'pubkey_is_public':pubkey_is_public}} # req_json_s = jsonify(req_json) # res = phone.req({'forge_new_keys':{'name':'marx', 'pubkey_is_public':True}}) # print(res) diff --git a/komrade/constants.py b/komrade/constants.py index ce0e7de..588b90c 100644 --- a/komrade/constants.py +++ b/komrade/constants.py @@ -82,9 +82,9 @@ KEYMAKER_DEFAULT_KEYS_TO_GEN += KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_CLIENT KEYMAKER_DEFAULT_KEYS_TO_GEN = list(set(KEYMAKER_DEFAULT_KEYS_TO_GEN)) KEYMAKER_DEFAULT_KEYS_TO_GEN.sort(key=lambda x: x.count('_')) -print('KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_SERVER',KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_SERVER) -print('KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_CLIENT',KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_CLIENT) -print('KEYMAKER_DEFAULT_KEYS_TO_GEN',KEYMAKER_DEFAULT_KEYS_TO_GEN) +# print('KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_SERVER',KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_SERVER) +# print('KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_CLIENT',KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_CLIENT) +# print('KEYMAKER_DEFAULT_KEYS_TO_GEN',KEYMAKER_DEFAULT_KEYS_TO_GEN) KEY_TYPE_ASYMMETRIC_PUBKEY = 'asymmetric_pubkey' @@ -154,4 +154,4 @@ ALLOW_CLEARNET = True DEBUG_DEFAULT_PASSPHRASE = 'all your base are belong to us' -ROUTE_KEYNAME = '_please' \ No newline at end of file +ROUTE_KEYNAME = '_route' \ No newline at end of file diff --git a/komrade/utils.py b/komrade/utils.py index dbe7cc4..508d47e 100644 --- a/komrade/utils.py +++ b/komrade/utils.py @@ -24,6 +24,12 @@ def log(*x): tolog=' '.join(str(_) for _ in x) LOG(tolog) +def clear_screen(): + import os + os.system('cls' if os.name == 'nt' else 'clear') + +def pause(): + input('') import inspect class Logger(object): @@ -33,6 +39,11 @@ class Logger(object): mytype = type(self).__name__ caller = calframe[1][3] log(f'\n[{mytype}.{caller}()]',*x) + try: + pause() + clear_screen() + except KeyboardInterrupt: + exit() import binascii,base64 def isBase64(sb):