Exemplo n.º 1
0
    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
Exemplo n.º 2
0
 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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
 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