分散式即时通讯协定
dimp的Python项目详细描述
分散式即时消息传递协议(python)
说话很便宜,给你看密码!
依赖性
pip3installdimp
公共扩展
facebook.py
classFacebook(Barrack):""" Access database to load/save user's private key, meta and profiles """defsave_private_key(self,private_key:PrivateKey,identifier:ID)->bool:# TODO: save private key into safety storagepassdefsave_meta(self,meta:Meta,identifier:ID)->bool:ifnotmeta.match_identifier(identifier):returnFalse# TODO: save meta to local/persistent storagepassdefsave_profile(self,profile:Profile)->bool:ifnotself.verify_profile(profile):returnFalse# TODO: save to local storagepassdefverify_profile(self,profile:Profile)->bool:ifprofileisNone:returnFalseelifprofile.valid:# already verifiedreturnTrueidentifier=profile.identifiermeta=Noneifidentifier.type.is_user():# verify with user's meta.keymeta=self.meta(identifier=identifier)elifidentifier.type.is_group():# verify with group owner's meta.keygroup=self.group(identifier=identifier)ifgroupisnotNone:meta=self.meta(identifier=group.owner)ifmetaisnotNone:returnprofile.verify(public_key=meta.key)## ISocialNetworkDataSource#defuser(self,identifier:ID)->User:entity=super().user(identifier=identifier)ifentityisnotNone:returnentitymeta=self.meta(identifier=identifier)ifmetaisnotNone:key=self.private_key_for_signature(identifier=identifier)ifkeyisNone:entity=User(identifier=identifier)else:entity=LocalUser(identifier=identifier)self.cache_user(user=entity)returnentitydefgroup(self,identifier:ID)->Group:entity=super().group(identifier=identifier)ifentityisnotNone:returnentitymeta=self.meta(identifier=identifier)ifmetaisnotNone:entity=Group(identifier=identifier)self.cache_group(group=entity)returnentity## global#facebook=Facebook()
keystore.py
classKeyStore(KeyCache):""" For reuse symmetric key """defsave_keys(self,key_map:dict)->bool:# TODO: save to local cachepassdefload_keys(self)->dict:# TODO: load from local cachepass## global#keystore=KeyStore()
messanger.py
classMessanger(Transceiver,ITransceiverDelegate):""" Transform and send message """def__init__(self):super().__init__()self.delegate=self## ITransceiverDelegate#defsend_package(self,data:bytes,handler:ICompletionHandler)->bool:# TODO: send out datapassdefupload_data(self,data:bytes,msg:InstantMessage)->str:# TODO: upload onto FTP serverpassdefdownload_data(self,url:str,msg:InstantMessage)->bytes:# TODO: download from FTP serverpass## global#messanger=Messanger()messanger.barrack=facebookmessanger.key_cache=keystore
用户帐户
register.py
defregister(username:str)->User:# 1. generate private keysk=PrivateKey({'algorithm':'RSA'})# 2. generate meta with username(as seed) and private keymeta=Meta.generate(private_key=sk,seed=username)# 3. generate ID with network type by metaidentifier=meta.generate_identifier(network=network)# 4. save private key and meta infofacebook.save_private_key(private_key=sk,identifier=identifier)facebook.save_meta(meta=meta,identifier=identifier)# 5. create user with IDreturnfacebook.user(identifier)
信息
发送.py
defpack(content:Content,sender:ID,receiver:ID)->ReliableMessage:msg=InstantMessage.new(content=content,sender=sender,receiver=receiver)returnmessanger.encrypt_sign(msg)if__name__=='__main__':moki=ID("moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk");hulk=ID("hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj");content=TextContent.new(text='Hello world!')msg=pack(content=content,sender=moki,receiver=hulk)# TODO: send out the request datarequest=json.dumps(msg)+'\n'data=request.encode('utf-8')
接收.py
defreceive(pack:bytes)->InstantMessage:msg=json.loads(pack.decode('utf-8'))r_msg=ReliableMessage(msg)i_msg=messanger.verify_decrypt(r_msg)# TODO: process message contentpass
版权所有©2019 Albert Moky