def Identity(newpacket): newxml = newpacket.Payload newidentity = identity.identity(xmlsrc=newxml) # SECURITY - check that identity is signed correctly if not newidentity.Valid(): dhnio.Dprint(1,"p2p_service.Identity ERROR has non-Valid identity") return idurl = newidentity.getIDURL() if contacts.isKnown(idurl): # This checks that old public key matches new identitycache.UpdateAfterChecking(idurl, newxml) else: # TODO # may be we need to make some temporary storage # for identities who we did not know yet # just to be able to receive packets from them identitycache.UpdateAfterChecking(idurl, newxml) # Now that we have ID we can check packet if not newpacket.Valid(): # If not valid do nothing dhnio.Dprint(6, "p2p_service.Identity WARNING not Valid packet from %s" % idurl) return if newpacket.OwnerID == idurl: transport_control.SendAck(newpacket) dhnio.Dprint(6, "p2p_service.Identity from [%s], sent Ack" % nameurl.GetName(idurl)) else: dhnio.Dprint(6, "p2p_service.Identity from [%s]" % nameurl.GetName(idurl))
def CreateNewIdentity(): global _NewIdentity dhncrypto.InitMyKey() misc.loadLocalIdentity() if misc.isLocalIdentityReady(): try: lid = misc.getLocalIdentity() lid.sign() # misc.setLocalIdentity(lid) # misc.saveLocalIdentity() valid = lid.Valid() except: valid = False dhnio.DprintException() if valid: _NewIdentity = lid return dhnio.Dprint(2, 'identity_registrator.CreateNewIdentity existing local identity is not VALID') login = dhnio.ReadTextFile(settings.UserNameFilename()) externalIP = dhnio.ReadTextFile(settings.ExternalIPFilename()) localIP = dhnio.ReadTextFile(settings.LocalIPFilename()) dhnio.Dprint(4, 'identity_registrator.CreateNewIdentity %s %s ' % (login, externalIP)) idurl = 'http://'+settings.IdentityServerName()+'/'+login.lower()+'.xml' ident = identity.identity( ) ident.sources.append(idurl) cdict = {} if settings.enableTCP(): cdict['tcp'] = 'tcp://'+externalIP+':'+settings.getTCPPort() if settings.enableCSpace() and transport_control._TransportCSpaceEnable: cdict['cspace'] = 'cspace://' if settings.getCSpaceKeyID() != '': cdict['cspace'] += settings.getCSpaceKeyID() if settings.enableUDP() and transport_control._TransportUDPEnable: if stun.getUDPClient() is not None: if stun.getUDPClient().externalAddress is not None: # _altStunAddress cdict['udp'] = 'udp://'+stun.getUDPClient().externalAddress[0]+':'+str(stun.getUDPClient().externalAddress[1]) for c in misc.validTransports: if cdict.has_key(c): ident.contacts.append(cdict[c]) ident.publickey = dhncrypto.MyPublicKey() ident.date = time.ctime() #time.strftime('%b %d, %Y') revnum = dhnio.ReadTextFile(settings.RevisionNumberFile()).strip() repo, location = misc.ReadRepoLocation() ident.version = (revnum.strip() + ' ' + repo.strip() + ' ' + dhnio.osinfo().strip()).strip() ident.sign() dhnio.WriteFile(settings.LocalIdentityFilename()+'.new', ident.serialize()) _NewIdentity = ident
def check_install(): """ Return True if Private Key and local identity files exists and both is valid. """ dhnio.Dprint(2, "dhninit.check_install ") import lib.settings as settings import lib.identity as identity import lib.dhncrypto as dhncrypto keyfilename = settings.KeyFileName() keyfilenamelocation = settings.KeyFileNameLocation() if os.path.exists(keyfilenamelocation): keyfilename = dhnio.ReadTextFile(keyfilenamelocation) if not os.path.exists(keyfilename): keyfilename = settings.KeyFileName() idfilename = settings.LocalIdentityFilename() if not os.path.exists(keyfilename) or not os.path.exists(idfilename): dhnio.Dprint(2, "dhninit.check_install local key or local id not exists") return False current_key = dhnio.ReadBinaryFile(keyfilename) current_id = dhnio.ReadBinaryFile(idfilename) if current_id == "": dhnio.Dprint(2, "dhninit.check_install local identity is empty ") return False if current_key == "": dhnio.Dprint(2, "dhninit.check_install private key is empty ") return False try: dhncrypto.InitMyKey() except: dhnio.Dprint(2, "dhninit.check_install fail loading private key ") return False try: ident = identity.identity(xmlsrc=current_id) except: dhnio.Dprint(2, "dhninit.check_install fail init local identity ") return False try: res = ident.Valid() except: dhnio.Dprint(2, "dhninit.check_install wrong data in local identity ") return False if not res: dhnio.Dprint(2, "dhninit.check_install local identity is not valid ") return False dhnio.Dprint(2, "dhninit.check_install done") return True
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')