Beispiel #1
0
 def getReplyFor(self, request):
     result = self.secondaryStorage.getReply(
         request.identifier,
         request.reqId,
         type=request.operation[TXN_TYPE])
     if result:
         if request.operation[TXN_TYPE] == ATTRIB:
             result = self.hashAttribTxn(result)
         return Reply(result)
     else:
         return None
Beispiel #2
0
    def generateReply(self, ppTime: float, req: Request):
        operation = req.operation
        txnId = self.genTxnId(req.identifier, req.reqId)
        result = {TXN_ID: txnId, TXN_TIME: int(ppTime)}
        result.update(operation)
        result.update({
            f.IDENTIFIER.nm: req.identifier,
            f.REQ_ID.nm: req.reqId,
        })

        return Reply(result)
Beispiel #3
0
 def processGetIssuerKeyReq(self, request: Request, frm: str):
     self.transmitToClient(RequestAck(*request.key), frm)
     keys = self.graphStore.getIssuerKeys(request.operation[ORIGIN],
                                          request.operation[REF])
     result = {TXN_ID: self.genTxnId(request.identifier, request.reqId)}
     result.update(request.operation)
     result[DATA] = json.dumps(keys, sort_keys=True)
     result.update({
         f.IDENTIFIER.nm: request.identifier,
         f.REQ_ID.nm: request.reqId,
     })
     self.transmitToClient(Reply(result), frm)
Beispiel #4
0
 def storeTxnAndSendToClient(self, reply):
     """
     Does 4 things in following order
      1. Add reply to ledger.
      2. Send the reply to client.
      3. Add the reply to identity graph if needed.
      4. Add the reply to storage so it can be served later if the
      client requests it.
     """
     txnWithMerkleInfo = self.storeTxnInLedger(reply.result)
     self.sendReplyToClient(Reply(txnWithMerkleInfo))
     reply.result[F.seqNo.name] = txnWithMerkleInfo.get(F.seqNo.name)
     self.storeTxnInGraph(reply.result)
Beispiel #5
0
 def processGetClaimDefReq(self, request: Request, frm: str):
     issuerNym = request.operation[TARGET_NYM]
     name = request.operation[DATA][NAME]
     version = request.operation[DATA][VERSION]
     claimDef = self.graphStore.getClaimDef(issuerNym, name, version)
     result = {TXN_ID: self.genTxnId(request.identifier, request.reqId)}
     result.update(request.operation)
     result[DATA] = json.dumps(claimDef, sort_keys=True)
     result.update({
         f.IDENTIFIER.nm: request.identifier,
         f.REQ_ID.nm: request.reqId,
     })
     self.transmitToClient(Reply(result), frm)
Beispiel #6
0
 def processGetNymReq(self, request: Request, frm: str):
     self.transmitToClient(RequestAck(request.reqId), frm)
     nym = request.operation[TARGET_NYM]
     txn = self.graphStore.getAddNymTxn(nym)
     txnId = self.genTxnId(request.identifier, request.reqId)
     result = {
         f.IDENTIFIER.nm: request.identifier,
         f.REQ_ID.nm: request.reqId,
         DATA: json.dumps(txn) if txn else None,
         TXN_ID: txnId
     }
     result.update(request.operation)
     self.transmitToClient(Reply(result), frm)
Beispiel #7
0
 def getReplyFor(self, request):
     typ = request.operation.get(TXN_TYPE)
     if typ in IDENTITY_TXN_TYPES:
         result = self.secondaryStorage.getReply(request.identifier,
                                                 request.reqId,
                                                 type=request.operation[TXN_TYPE])
         if result:
             if request.operation[TXN_TYPE] == ATTRIB:
                 result = self.hashAttribTxn(result)
             return Reply(result)
         else:
             return None
     if typ in CONFIG_TXN_TYPES:
         return self.getReplyFromLedger(self.configLedger, request)
Beispiel #8
0
 def processGetNymReq(self, request: Request, frm: str):
     self.transmitToClient(RequestAck(*request.key), frm)
     nym = request.operation[TARGET_NYM]
     txn = self.graphStore.getAddNymTxn(nym)
     txnId = self.genTxnId(request.identifier, request.reqId)
     # TODO: We should have a single JSON encoder which does the
     # encoding for us, like sorting by keys, handling datetime objects.
     result = {f.IDENTIFIER.nm: request.identifier,
               f.REQ_ID.nm: request.reqId,
               DATA: json.dumps(txn, sort_keys=True) if txn else None,
               TXN_ID: txnId
               }
     result.update(request.operation)
     self.transmitToClient(Reply(result), frm)
Beispiel #9
0
 def processGetIssuerKeyReq(self, request: Request, frm: str):
     self.transmitToClient(RequestAck(request.reqId), frm)
     keys = self.graphStore.getIssuerKeys(request.operation[ORIGIN],
                                          request.operation[REFERENCE])
     # attrNames = request.operation[RAW]
     # nym = request.operation[TARGET_NYM]
     # attrs = self.graphStore.getRawAttrs(nym, attrNames)
     result = {TXN_ID: self.genTxnId(request.identifier, request.reqId)}
     result.update(request.operation)
     result[DATA] = json.dumps(keys)
     result.update({
         f.IDENTIFIER.nm: request.identifier,
         f.REQ_ID.nm: request.reqId,
     })
     self.transmitToClient(Reply(result), frm)
Beispiel #10
0
 def processGetAttrsReq(self, request: Request, frm: str):
     self.transmitToClient(RequestAck(*request.key), frm)
     attrName = request.operation[RAW]
     nym = request.operation[TARGET_NYM]
     attrWithSeqNo = self.graphStore.getRawAttrs(nym, attrName)
     result = {TXN_ID: self.genTxnId(request.identifier, request.reqId)}
     if attrWithSeqNo:
         attr = {attrName: attrWithSeqNo[attrName][0]}
         result[DATA] = json.dumps(attr, sort_keys=True)
         result[F.seqNo.name] = attrWithSeqNo[attrName][1]
     result.update(request.operation)
     result.update({
         f.IDENTIFIER.nm: request.identifier,
         f.REQ_ID.nm: request.reqId,
     })
     self.transmitToClient(Reply(result), frm)
Beispiel #11
0
 def storeTxnAndSendToClient(self, reply):
     """
     Does 4 things in following order
      1. Add reply to ledger.
      2. Send the reply to client.
      3. Add the reply to identity graph if needed.
      4. Add the reply to storage so it can be served later if the
      client requests it.
     """
     result = reply.result
     txnWithMerkleInfo = self.storeTxnInLedger(result)
     if result[TXN_TYPE] == NODE_UPGRADE:
         logger.info('{} processed {}'.format(self, NODE_UPGRADE))
         # Returning since NODE_UPGRADE is not sent to client and neither
         # goes in graph
         return
     self.sendReplyToClient(Reply(txnWithMerkleInfo),
                            (result[f.IDENTIFIER.nm], result[f.REQ_ID.nm]))
     reply.result[F.seqNo.name] = txnWithMerkleInfo.get(F.seqNo.name)
     self.storeTxnInGraph(reply.result)
Beispiel #12
0
 def processGetTxnReq(self, request: Request, frm: str):
     nym = request.operation[TARGET_NYM]
     origin = request.identifier
     if nym != origin:
         # TODO not sure this is correct; why does it matter?
         msg = "You can only receive transactions for yourself"
         self.transmitToClient(RequestNack(*request.key, msg), frm)
     else:
         self.transmitToClient(RequestAck(*request.key), frm)
         data = request.operation.get(DATA)
         addNymTxn = self.graphStore.getAddNymTxn(origin)
         txnIds = [addNymTxn[TXN_ID], ] + self.graphStore. \
             getAddAttributeTxnIds(origin)
         # If sending transactions to a user then should send user's
         # sponsor creation transaction also
         if addNymTxn.get(ROLE) == USER:
             sponsorNymTxn = self.graphStore.getAddNymTxn(
                 addNymTxn.get(f.IDENTIFIER.nm))
             txnIds = [
                 sponsorNymTxn[TXN_ID],
             ] + txnIds
         # TODO: Remove this log statement
         logger.debug("{} getting replies for {}".format(self, txnIds))
         result = self.secondaryStorage.getReplies(*txnIds, seqNo=data)
         txns = sorted(list(result.values()), key=itemgetter(F.seqNo.name))
         lastTxn = str(txns[-1][F.seqNo.name]) if len(txns) > 0 else data
         result = {TXN_ID: self.genTxnId(request.identifier, request.reqId)}
         result.update(request.operation)
         # TODO: We should have a single JSON encoder which does the
         # encoding for us, like sorting by keys, handling datetime objects.
         result[DATA] = json.dumps({
             LAST_TXN: lastTxn,
             TXNS: txns
         },
                                   default=dateTimeEncoding,
                                   sort_keys=True)
         result.update({
             f.IDENTIFIER.nm: request.identifier,
             f.REQ_ID.nm: request.reqId,
         })
         self.transmitToClient(Reply(result), frm)
Beispiel #13
0
 def getReplyFor(self, request):
     txn = self.ledger.get(identifier=request.identifier,
                           reqId=request.reqId)
     if txn:
         txn.update(self.ledger.merkleInfo(txn.get(F.seqNo.name)))
         return Reply(txn)
Beispiel #14
0
 def getReplyFor(self, request):
     result = self.secondaryStorage.getReply(
         request.identifier,
         request.reqId,
         type=request.operation[TXN_TYPE])
     return Reply(result) if result else None