def lookupPutKey(self, rsaKey, data, updateLevel, startNodes, callback=None): obj = Dummy() def cancelPuts(): for putOp in obj.putOps.keys(): putOp.cancel() def doNotify(): op.notify(obj.successCount, obj.updateLevel) def onPut(putOp, err, payload): del obj.putOps[putOp] if err >= 0: result, oldData, oldUpdateLevel, oldSignature = payload if result >= 0: obj.successCount += 1 elif oldUpdateLevel >= obj.updateLevel: if verifySignature(rsaKey, oldData, oldUpdateLevel, oldSignature): obj.updateLevel = oldUpdateLevel + 1 cancelPuts() obj.putOps.clear() obj.successCount = 0 obj.signature = computeSignature(rsaKey, data, obj.updateLevel) for nodeAddr in obj.nodes: doPutKey(nodeAddr) if not obj.putOps: doNotify() def doPutKey(nodeAddr): putOp = self.callPutKey( publicKeyData, data, obj.updateLevel, obj.signature, nodeAddr, lambda err, payload: onPut(putOp, err, payload), ) obj.putOps[putOp] = 1 def onResult(nodes): obj.nodes = nodes obj.successCount = 0 obj.putOps = {} obj.updateLevel = updateLevel + 1 obj.signature = computeSignature(rsaKey, data, obj.updateLevel) for nodeAddr in obj.nodes: doPutKey(nodeAddr) op.setCanceler(cancelPuts) if not obj.putOps: doNotify() publicKeyData = rsaKey.toDER_PublicKey() lookupOp = self.lookup(toId(publicKeyData), startNodes, onResult) op = AsyncOp(callback, lookupOp.cancel) return op
def lookupPutKey( self, rsaKey, data, updateLevel, startNodes, callback=None ) : obj = Dummy() def cancelPuts() : for putOp in obj.putOps.keys() : putOp.cancel() def doNotify() : op.notify( obj.successCount, obj.updateLevel ) def onPut( putOp, err, payload ) : del obj.putOps[putOp] if err >= 0 : result,oldData,oldUpdateLevel,oldSignature = payload if result >= 0 : obj.successCount += 1 elif oldUpdateLevel >= obj.updateLevel : if verifySignature(rsaKey,oldData, oldUpdateLevel,oldSignature) : obj.updateLevel = oldUpdateLevel + 1 cancelPuts() obj.putOps.clear() obj.successCount = 0 obj.signature = computeSignature( rsaKey, data, obj.updateLevel ) for nodeAddr in obj.nodes : doPutKey( nodeAddr ) if not obj.putOps : doNotify() def doPutKey( nodeAddr ) : putOp = self.callPutKey( publicKeyData, data, obj.updateLevel, obj.signature, nodeAddr, lambda err,payload : onPut(putOp,err,payload) ) obj.putOps[putOp] = 1 def onResult( nodes ) : obj.nodes = nodes obj.successCount = 0 obj.putOps = {} obj.updateLevel = updateLevel + 1 obj.signature = computeSignature( rsaKey, data, obj.updateLevel ) for nodeAddr in obj.nodes : doPutKey( nodeAddr ) op.setCanceler( cancelPuts ) if not obj.putOps : doNotify() publicKeyData = rsaKey.toDER_PublicKey() lookupOp = self.lookup( toId(publicKeyData), startNodes, onResult ) op = AsyncOp( callback, lookupOp.cancel ) return op
def lookupGetKey(self, publicKey, startNodes, callback=None): obj = Dummy() def cancelGets(): for getOp in obj.getOps.keys(): getOp.cancel() def onGet(getOp, err, payload): del obj.getOps[getOp] if err >= 0: result, data, updateLevel, signature = payload if result >= 0: if verifySignature(publicKey, data, updateLevel, signature): obj.getResults.append((data, updateLevel, signature)) if not obj.getOps: if obj.getResults: maxUpdateLevel = max([x[1] for x in obj.getResults]) obj.getResults = [x for x in obj.getResults if x[1] == maxUpdateLevel] op.notify(obj.getResults) def doGetKey(nodeAddr): getOp = self.callGetKey(publicKeyData, nodeAddr, lambda err, payload: onGet(getOp, err, payload)) obj.getOps[getOp] = 1 def onResult(nodes): obj.getOps = {} obj.getResults = [] for nodeAddr in nodes: doGetKey(nodeAddr) op.setCanceler(cancelGets) if not obj.getOps: op.notify([]) publicKeyData = publicKey.toDER_PublicKey() lookupOp = self.lookup(toId(publicKeyData), startNodes, onResult) op = AsyncOp(callback, lookupOp.cancel) return op
def lookupGetKey( self, publicKey, startNodes, callback=None ) : obj = Dummy() def cancelGets() : for getOp in obj.getOps.keys() : getOp.cancel() def onGet( getOp, err, payload ) : del obj.getOps[getOp] if err >= 0 : result,data,updateLevel,signature = payload if result >= 0 : if verifySignature(publicKey,data,updateLevel,\ signature) : obj.getResults.append( (data,updateLevel, signature) ) if not obj.getOps : if obj.getResults : maxUpdateLevel = max( [x[1] for x in obj.getResults] ) obj.getResults = [x for x in obj.getResults \ if x[1] == maxUpdateLevel] op.notify( obj.getResults ) def doGetKey( nodeAddr ) : getOp = self.callGetKey( publicKeyData, nodeAddr, lambda err,payload : onGet(getOp,err,payload) ) obj.getOps[getOp] = 1 def onResult( nodes ) : obj.getOps = {} obj.getResults = [] for nodeAddr in nodes : doGetKey( nodeAddr ) op.setCanceler( cancelGets ) if not obj.getOps : op.notify( [] ) publicKeyData = publicKey.toDER_PublicKey() lookupOp = self.lookup( toId(publicKeyData), startNodes, onResult ) op = AsyncOp( callback, lookupOp.cancel ) return op