2020-09-08 11:23:41 +00:00
import os , sys ; sys . path . append ( os . path . abspath ( os . path . join ( os . path . abspath ( os . path . join ( os . path . dirname ( __file__ ) , ' .. ' ) ) , ' .. ' ) ) )
from komrade import *
from komrade . backend import *
2020-09-11 14:35:47 +00:00
from komrade . backend . keymaker import *
2020-09-08 11:23:41 +00:00
2020-09-09 17:34:19 +00:00
class Persona ( Caller ) :
2020-09-08 11:23:41 +00:00
2020-09-10 17:52:07 +00:00
def __init__ ( self , name = None , passphrase = DEBUG_DEFAULT_PASSPHRASE ) :
2020-09-09 17:34:19 +00:00
super ( ) . __init__ ( name = name , passphrase = passphrase )
2020-09-11 14:35:47 +00:00
if SHOW_STATUS :
from komrade . cli import CLI
2020-09-12 07:55:23 +00:00
self . cli = CLI ( name = name , persona = self )
2020-09-09 18:31:36 +00:00
# self.boot(create=False)
2020-09-08 12:11:13 +00:00
2020-09-09 18:31:36 +00:00
# def boot(self,create=False):
# # Do I already have my keys?
# # yes? -- login
2020-09-08 12:11:13 +00:00
2020-09-09 18:31:36 +00:00
# keys = self.keychain()
# if keys.get('pubkey') and keys.get('privkey'):
# self.log('booted!')
# return True
2020-09-09 14:38:37 +00:00
2020-09-09 18:31:36 +00:00
# # If not, forge them -- only once!
# if not have_keys and create:
# self.get_new_keys()
2020-09-09 14:38:37 +00:00
2020-09-09 17:34:19 +00:00
def exists_locally_as_contact ( self ) :
return self . pubkey and not self . privkey
def exists_locally_as_persona ( self ) :
return self . pubkey and self . privkey
def exists_on_server ( self ) :
2020-09-10 21:32:59 +00:00
answer = self . phone . ring_ring ( {
2020-09-09 18:31:36 +00:00
' _route ' : ' does_username_exist ' ,
' name ' : self . name
} )
2020-09-09 22:38:57 +00:00
self . log ( ' answer?? ' , answer )
2020-09-10 08:08:50 +00:00
return answer
2020-09-08 11:23:41 +00:00
2020-09-09 17:34:19 +00:00
# login?
2020-09-09 17:36:07 +00:00
# def login(self):
# if keys.get('pubkey') and keys.get('privkey')
2020-09-09 17:34:19 +00:00
2020-09-11 14:35:47 +00:00
def register ( self , name = None , passphrase = None , is_group = None , show_intro = 0 , show_body = True ) :
2020-09-12 13:11:39 +00:00
## Defaults
2020-09-10 17:52:07 +00:00
if name and not self . name : self . name = name
if not name and self . name : name = self . name
if not name and not self . name : name = ' '
2020-09-12 13:11:39 +00:00
## 1) Have name?
2020-09-11 14:35:47 +00:00
if SHOW_STATUS and show_intro :
2020-09-12 13:11:39 +00:00
name = self . cli . status_keymaker_part1 ( name )
2020-09-12 13:17:54 +00:00
elif not name :
2020-09-12 13:11:39 +00:00
name = input ( ' @Keymaker: What is the name for this new account? \n @?: ' )
2020-09-11 14:35:47 +00:00
2020-09-12 13:11:39 +00:00
## 2) Make pub public/private keys
2020-09-11 14:35:47 +00:00
keypair = KomradeAsymmetricKey ( )
pubkey , privkey = keypair . pubkey_obj , keypair . privkey_obj
2020-09-12 07:55:23 +00:00
self . log ( f ' Keymaker has cut private and public keys: \n \n (1) { pubkey } \n \n (2) { privkey } ' )
2020-09-11 14:35:47 +00:00
2020-09-12 13:11:39 +00:00
## 3) Have passphrase?
2020-09-11 17:17:21 +00:00
if SHOW_STATUS and not passphrase :
2020-09-12 13:11:39 +00:00
passphrase = self . cli . status_keymaker_part2 ( name , passphrase , pubkey , privkey , self . crypt_keys . hash , self )
2020-09-11 14:35:47 +00:00
else :
if not passphrase : passphrase = getpass ( ' Enter a memorable password to encrypt your private key with: ' )
2020-09-10 21:32:59 +00:00
2020-09-12 13:11:39 +00:00
## 4) Get hashed password
2020-09-12 07:55:23 +00:00
passhash = self . crypt_keys . hash ( passphrase . encode ( ) )
2020-09-12 13:11:39 +00:00
self . log ( f ''' Keymaker has created a symmetric encryption cell using the disguised password: \n \n \t (2A) [Symmetric Encryption Key] \n \t ( { make_key_discreet_str ( passhash ) } ) ''' )
2020-09-12 07:55:23 +00:00
2020-09-12 13:11:39 +00:00
## 5) Encrypt private key
2020-09-12 07:55:23 +00:00
privkey_decr = KomradeSymmetricKeyWithPassphrase ( passhash )
2020-09-11 17:17:21 +00:00
privkey_encr = privkey_decr . encrypt ( privkey . data )
2020-09-12 07:55:23 +00:00
privkey_encr_obj = KomradeEncryptedAsymmetricPrivateKey ( privkey_encr )
2020-09-12 13:11:39 +00:00
self . log ( f " This pass-generated key has now transformed the private key (2) into the following encrypted form (redacted): \n \n \t (2B) [Encrypted Private Key] \n \t ( { make_key_discreet_str ( privkey_encr_obj . data_b64 ) } ) " )
2020-09-12 07:55:23 +00:00
2020-09-12 13:17:54 +00:00
## 6) Test keychain works
privkey_decr2 = KomradeSymmetricKeyWithPassphrase ( passhash )
self . _keychain [ ' pubkey ' ] = pubkey . data
self . _keychain [ ' privkey_encr ' ] = privkey_encr_obj . data
self . _keychain [ ' privkey_decr ' ] = privkey_decr
self . log ( ' My keychain now looks like: ' , dict_format ( self . keychain ( ) ) )
2020-09-12 13:11:39 +00:00
## 6) More narration?
2020-09-12 07:55:23 +00:00
if SHOW_STATUS :
2020-09-12 13:11:39 +00:00
self . cli . status_keymaker_part3 ( privkey , privkey_decr , privkey_encr , passphrase )
2020-09-10 09:00:11 +00:00
2020-09-12 13:11:39 +00:00
## 7) Save data to server
2020-09-10 10:59:37 +00:00
data = {
2020-09-12 07:55:23 +00:00
' name ' : name ,
' pubkey ' : pubkey . data ,
ROUTE_KEYNAME : ' register_new_user '
2020-09-10 10:59:37 +00:00
}
2020-09-12 13:17:54 +00:00
self . log ( ' I will be sending this data to @TheOperator, on the remote server: ' , dict_format ( data , tab = 2 ) )
2020-09-10 21:32:59 +00:00
2020-09-10 09:31:32 +00:00
# ring operator
2020-09-10 09:34:34 +00:00
# call from phone since I don't have pubkey on record on Op yet
2020-09-12 13:11:39 +00:00
# self.log('my keychain:',self._keychain,pubkey,self.op._keychain)
resp_msg_obj = self . ring_ring ( data )
2020-09-10 13:52:23 +00:00
self . log ( ' register got back from op: ' , dict_format ( resp_msg_obj , tab = 2 ) )
2020-09-10 09:34:34 +00:00
2020-09-08 15:14:48 +00:00
2020-09-09 17:34:19 +00:00
def ring_ring ( self , msg ) :
return super ( ) . ring_ring ( msg )
2020-09-09 15:30:34 +00:00
2020-09-09 17:34:19 +00:00
def send_msg_to ( self , msg , to_whom ) :
msg = self . compose_msg_to ( msg , to_whom )
2020-09-09 22:26:48 +00:00
msg . encrypt ( )
2020-09-09 15:30:34 +00:00
2020-09-09 18:31:36 +00:00
{ ' _route ' : ' deliver_to ' , ' msg ' : msg }
2020-09-09 15:30:34 +00:00
2020-09-09 17:34:19 +00:00
return self . ring_ring ( msg )
2020-09-09 15:30:34 +00:00
2020-09-09 17:34:19 +00:00
2020-09-09 15:30:34 +00:00
2020-09-10 14:00:55 +00:00
def test_register ( ) :
import random
num = random . choice ( list ( range ( 0 , 1000 ) ) )
2020-09-10 21:32:59 +00:00
botname = f ' marx { str ( num ) . zfill ( 3 ) } '
marxbot = Persona ( botname )
# marxbot=Persona()
2020-09-12 07:55:23 +00:00
marxbot . register ( passphrase = ' communise ' )
2020-09-09 15:30:34 +00:00
2020-09-08 15:14:48 +00:00
if __name__ == ' __main__ ' :
2020-09-11 14:35:47 +00:00
test_register ( )
# marx = Persona('marx')
# elon = Persona('elon')
2020-09-08 15:14:48 +00:00
2020-09-11 14:35:47 +00:00
# marx.register()
# # elon.register()
# # person.register()
# # print(person.pubkey)
2020-09-09 15:41:33 +00:00
2020-09-11 14:35:47 +00:00
# # elon.send_msg_to('youre dumb',marx)
# #Caller('elon').ring_ring({'_route':'say_hello','_msg':'my dumb message to operator'})
2020-09-09 17:39:30 +00:00
2020-09-11 14:35:47 +00:00
# # print(marx.exists_on_server())