def PopWorkingProto(): global _WorkingProtocols if len(_WorkingProtocols) == 0: return lid = misc.getLocalIdentity() order = lid.getProtoOrder() first = order[0] wantedproto = '' #if first contact in local identity is not working yet #but there is another working methods - switch first method if first not in _WorkingProtocols: #take (but not remove) any item from the set wantedproto = _WorkingProtocols.pop() _WorkingProtocols.add(wantedproto) # if q2q method is not the first but it works - switch to q2q # disabled because we do not use q2q now # if first != 'q2q' and 'q2q' in _WorkingProtocols: # wantedproto = 'q2q' #if udp method is not the first but it works - switch to udp if transport_control._TransportUDPEnable: if first != 'udp' and 'udp' in _WorkingProtocols: wantedproto = 'udp' #if cspace method is not the first but it works - switch to cspace if transport_control._TransportCSpaceEnable: if first != 'cspace' and 'cspace' in _WorkingProtocols: wantedproto = 'cspace' #if tcp method is not the first but it works - switch to tcp if first != 'tcp' and 'tcp' in _WorkingProtocols: wantedproto = 'tcp' dhnio.Dprint(4, 'p2p_connector.PopWorkingProto will pop %s contact order=%s _WorkingProtocols=%s' % (wantedproto, str(order), str(_WorkingProtocols))) # now move best proto on the top # other users will use this method to send to us lid.popProtoContact(wantedproto) # save local id # also need to propagate our identity # other users must know our new contacts misc.setLocalIdentity(lid) misc.saveLocalIdentity()
def doSaveMyIdentity(self, arg): global _NewIdentity misc.setLocalIdentity(_NewIdentity) misc.saveLocalIdentity()
def doVerifyAndRestore(self, arg): global _WorkingKey dhnio.Dprint(4, 'identity_restorer.doVerifyAndRestore') remote_identity_src = arg if os.path.isfile(settings.KeyFileName()): dhnio.Dprint(4, 'identity_restorer.doVerifyAndRestore will backup and remove ' + settings.KeyFileName()) dhnio.backup_and_remove(settings.KeyFileName()) if os.path.isfile(settings.LocalIdentityFilename()): dhnio.Dprint(4, 'identity_restorer.doVerifyAndRestore will backup and remove ' + settings.LocalIdentityFilename()) dhnio.backup_and_remove(settings.LocalIdentityFilename()) try: remote_ident = identity.identity(xmlsrc = remote_identity_src) local_ident = identity.identity(xmlsrc = remote_identity_src) except: # dhnio.DprintException() reactor.callLater(0.5, self.automat, 'restore-failed', ('remote identity have incorrect format', 'red')) return try: res = remote_ident.Valid() except: dhnio.DprintException() res = False if not res: reactor.callLater(0.5, self.automat, 'restore-failed', ('remote identity is not valid', 'red')) return dhncrypto.ForgetMyKey() dhnio.WriteFile(settings.KeyFileName(), _WorkingKey) try: dhncrypto.InitMyKey() except: dhncrypto.ForgetMyKey() # dhnio.DprintException() try: os.remove(settings.KeyFileName()) except: pass reactor.callLater(0.5, self.automat, 'restore-failed', ('private key is not valid', 'red')) return try: local_ident.sign() except: # dhnio.DprintException() reactor.callLater(0.5, self.automat, 'restore-failed', ('error while signing identity', 'red')) return if remote_ident.signature != local_ident.signature: reactor.callLater(0.5, self.automat, 'restore-failed', ('signature did not match', 'red')) return misc.setLocalIdentity(local_ident) misc.saveLocalIdentity() dhnio.WriteFile(settings.UserNameFilename(), misc.getIDName()) if os.path.isfile(settings.KeyFileName()+'.backup'): dhnio.Dprint(4, 'identity_restorer.doVerifyAndRestore will remove backup file for ' + settings.KeyFileName()) dhnio.remove_backuped_file(settings.KeyFileName()) if os.path.isfile(settings.LocalIdentityFilename()+'.backup'): dhnio.Dprint(4, 'identity_restorer.doVerifyAndRestore will remove backup file for ' + settings.LocalIdentityFilename()) dhnio.remove_backuped_file(settings.LocalIdentityFilename()) reactor.callLater(0.5, self.automat, 'restore-success')
def UpdateIdentity(): global _RevisionNumber global _WorkingProtocols #getting local identity lid = misc.getLocalIdentity() nowip = misc.readExternalIP() order = lid.getProtoOrder() lid.clearContacts() #prepare contacts data cdict = {} cdict['tcp'] = 'tcp://'+nowip+':'+settings.getTCPPort() if transport_control._TransportSSHEnable: cdict['ssh'] = 'ssh://'+nowip+':'+settings.getSSHPort() if transport_control._TransportHTTPEnable: cdict['http'] = 'http://'+nowip+':'+settings.getHTTPPort() if transport_control._TransportQ2QEnable: cdict['q2q'] = 'q2q://'+settings.getQ2Quserathost() if transport_control._TransportEmailEnable: cdict['email'] = 'email://'+settings.getEmailAddress() if transport_control._TransportCSpaceEnable: cdict['cspace'] = 'cspace://'+settings.getCSpaceKeyID() if transport_control._TransportUDPEnable: if stun.getUDPClient() is None or stun.getUDPClient().externalAddress is None: cdict['udp'] = 'udp://'+nowip+':'+settings.getUDPPort() else: cdict['udp'] = 'udp://'+stun.getUDPClient().externalAddress[0]+':'+str(stun.getUDPClient().externalAddress[1]) #making full order list for proto in cdict.keys(): if proto not in order: order.append(proto) #add contacts data to the local identity #check if some transport is not installed for proto in order: if settings.transportIsEnabled(proto) and settings.transportReceivingIsEnabled(proto): contact = cdict.get(proto, None) if contact is not None: lid.setProtoContact(proto, contact) else: # if protocol is disabled - mark this # because we may want to turn it on in the future _WorkingProtocols.discard(proto) #misc.setLocalIdentity(lid) del order # #if IP is not external and upnp configuration was failed for some reasons # #we want to use another contact methods, NOT tcp or ssh # if IPisLocal() and run_upnpc.last_result('tcp') != 'upnp-done': # dhnio.Dprint(4, 'p2p_connector.update_identity want to push tcp contact: local IP, no upnp ...') # lid.pushProtoContact('tcp') # misc.setLocalIdentity(lid) #update software version number revnum = _RevisionNumber.strip() repo, location = misc.ReadRepoLocation() lid.version = (revnum.strip() + ' ' + repo.strip() + ' ' + dhnio.osinfo().strip()).strip() #generate signature with changed content lid.sign() #remember the identity misc.setLocalIdentity(lid) #finally saving local identity misc.saveLocalIdentity() dhnio.Dprint(4, 'p2p_connector.UpdateIdentity') dhnio.Dprint(4, ' version: %s' % str(lid.version)) dhnio.Dprint(4, ' contacts: %s' % str(lid.contacts))