def _addAttribToNym(self, nym, raw, enc, hsh): assert int(bool(raw)) + int(bool(enc)) + int(bool(hsh)) == 1 if raw: l = LedgerStore.RAW data = raw elif enc: l = LedgerStore.ENC data = enc elif hsh: l = LedgerStore.HASH data = hsh else: raise RuntimeError('One of raw, enc, or hash are required.') attrib = Attribute(randomString(5), data, self.activeWallet.defaultId, ledgerStore=LedgerStore.RAW) if nym != self.activeWallet.defaultId: attrib.dest = nym self.activeWallet.addAttribute(attrib) reqs = self.activeWallet.preparePending() req, = self.activeClient.submitReqs(*reqs) self.print("Adding attributes {} for {}".format(data, nym)) def chk(reply, error, *args, **kwargs): assert self.activeWallet.getAttribute(attrib).seqNo is not None self.print("Attribute added for nym {}".format(reply[TARGET_NYM]), Token.BoldBlue) self.looper.loop.call_later(.2, self._ensureReqCompleted, req.key, self.activeClient, chk)
def testLatestAttrIsReceived(nodeSet, addedSponsor, sponsorWallet, looper, sponsor, userIdA): attr1 = json.dumps({'name': 'Mario'}) attrib = Attribute(name='name', origin=sponsorWallet.defaultId, value=attr1, dest=userIdA, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, sponsor, sponsorWallet, attrib) assert attr1 in [ a.value for a in sponsorWallet.getAttributesForNym(userIdA) ] attr2 = json.dumps({'name': 'Luigi'}) attrib = Attribute(name='name', origin=sponsorWallet.defaultId, value=attr2, dest=userIdA, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, sponsor, sponsorWallet, attrib) logger.debug([a.value for a in sponsorWallet.getAttributesForNym(userIdA)]) assert attr2 in [ a.value for a in sponsorWallet.getAttributesForNym(userIdA) ]
def requestAttribute(self, attrib: Attribute, sender): """ :param attrib: attribute to add :return: number of pending txns """ self._attributes[attrib.key()] = attrib req = attrib.getRequest(sender) if req: return self.prepReq(req, key=attrib.key())
def addAttribute(self, attrib: Attribute): """ :param attrib: attribute to add :return: number of pending txns """ self._attributes[attrib.key()] = attrib req = attrib.ledgerRequest() if req: self.pendRequest(req, attrib.key()) return len(self._pending)
def addedRawAttribute(userWalletA: Wallet, sponsor: Client, sponsorWallet: Wallet, attributeData, looper): attrib = Attribute(name='test attribute', origin=sponsorWallet.defaultId, value=attributeData, dest=userWalletA.defaultId, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, sponsor, sponsorWallet, attrib) return attrib
def testUserAddAttrsForHerSelf(nodeSet, looper, userClientA, userWalletA, userIdA, attributeData): attr1 = json.dumps({'age': 25}) attrib = Attribute(name='test4 attribute', origin=userIdA, value=attr1, dest=userIdA, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, userClientA, userWalletA, attrib)
def testStewardCannotAddUsersAttribute(genned, looper, steward, stewardWallet, userIdA, attributeData): attrib = Attribute(name='test3 attribute', origin=stewardWallet.defaultId, value=attributeData, dest=userIdA, ledgerStore=LedgerStore.RAW) reqs = makeAttribRequest(steward, stewardWallet, attrib) looper.run( eventually(checkNacks, steward, reqs[0].reqId, retryWait=1, timeout=15))
def addRawAttribute(looper, client, wallet, name, value, dest=None, localName=None): if not localName: localName = name attrData = json.dumps({name: value}) attrib = Attribute(name=localName, origin=wallet.defaultId, value=attrData, dest=dest, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, client, wallet, attrib)
def getAttribute(looper, sponsor, sponsorWallet, userIdA, attributeName, attributeValue): attrib = Attribute(name=attributeName, value=None, dest=userIdA, ledgerStore=LedgerStore.RAW) req = sponsorWallet.requestAttribute(attrib, sender=sponsorWallet.defaultId) sponsor.submitReqs(req) looper.run(eventually(checkGetAttr, req.key, sponsor, attributeName, attributeValue, retryWait=1, timeout=20))
def testOnlyUsersSponsorCanAddAttribute(genned, looper, steward, stewardWallet, attributeData, anotherSponsor, userIdA): client, wallet = anotherSponsor attrib = Attribute(name='test2 attribute', origin=wallet.defaultId, value=attributeData, dest=userIdA, ledgerStore=LedgerStore.RAW) reqs = makeAttribRequest(client, wallet, attrib) looper.run( eventually(checkNacks, client, reqs[0].reqId, retryWait=1, timeout=15))
def testNonSponsorCannotAddAttributeForUser(nodeSet, nonSponsor, userIdA, looper, attributeData): with whitelistextras("UnknownIdentifier"): client, wallet = nonSponsor attrib = Attribute(name='test1 attribute', origin=wallet.defaultId, value=attributeData, dest=userIdA, ledgerStore=LedgerStore.RAW) reqs = makeAttribRequest(client, wallet, attrib) looper.run(eventually(checkNacks, client, reqs[0].reqId, "UnknownIdentifier", retryWait=1, timeout=15))
def testClientGetsResponseWithoutConsensusForUsedReqId(nodeSet, looper, steward, addedSponsor, sponsor, userWalletA, attributeName, attributeData, addedRawAttribute): lastReqId = None replies = {} for msg, sender in reversed(sponsor.inBox): if msg[OP_FIELD_NAME] == REPLY: if not lastReqId: lastReqId = msg[f.RESULT.nm][f.REQ_ID.nm] if msg.get(f.RESULT.nm, {}).get(f.REQ_ID.nm) == lastReqId: replies[sender] = msg if len(replies) == len(nodeSet): break sponsorWallet = addedSponsor attrib = Attribute(name=attributeName, origin=sponsorWallet.defaultId, value=attributeData, dest=userWalletA.defaultId, ledgerStore=LedgerStore.RAW) sponsorWallet.addAttribute(attrib) req = sponsorWallet.preparePending()[0] _, key = sponsorWallet._prepared.pop((req.identifier, req.reqId)) req.reqId = lastReqId req.signature = sponsorWallet.signMsg(msg=req.getSigningState(), identifier=req.identifier) sponsorWallet._prepared[req.identifier, req.reqId] = req, key sponsor.submitReqs(req) def chk(): nonlocal sponsor, lastReqId, replies for node in nodeSet: last = node.spylog.getLast(TestNode.getReplyFor.__name__) assert last result = last.result assert result is not None # TODO: Time is not equal as some precision is lost while storing # in oientdb, using seconds may be an option, need to think of a # use cases where time in milliseconds is required replies[node.clientstack.name][f.RESULT.nm].pop(TXN_TIME, None) result.result.pop(TXN_TIME, None) assert replies[node.clientstack.name][f.RESULT.nm] == result.result looper.run(eventually(chk, retryWait=1, timeout=5))
def sync(self, linkName, doneCallback=None): if not self.client.isReady(): raise NotConnectedToNetwork link = self.wallet.getLink(linkName, required=True) nym = getCryptonym(link.remoteIdentifier) attrib = Attribute(name=ENDPOINT, value=None, dest=nym, ledgerStore=LedgerStore.RAW) req = self.wallet.requestAttribute(attrib, sender=self.wallet.defaultId) self.client.submitReqs(req) if doneCallback: self.loop.call_later(.2, ensureReqCompleted, self.loop, req.key, self.client, self._handleSyncResp(link, doneCallback))
def getAttribute(looper, sponsor, sponsorWallet, userIdA, attributeData): attrName = list(json.loads(attributeData).keys())[0] attrValue = list(json.loads(attributeData).values())[0] attrib = Attribute(name=attrName, value=None, dest=userIdA, ledgerStore=LedgerStore.RAW) req = sponsorWallet.requestAttribute(attrib, sender=sponsorWallet.defaultId) sponsor.submitReqs(req) looper.run( eventually(checkGetAttr, req.reqId, sponsor, attrName, attrValue, retryWait=1, timeout=20))
def createAgentAndAddEndpoint(looper, agentNym, agentVerkey, agentPort, steward, stewardWallet): createNym(looper, agentNym, steward, stewardWallet, role=SPONSOR, verkey=agentVerkey) ep = '127.0.0.1:{}'.format(agentPort) attributeData = json.dumps({ENDPOINT: ep}) # TODO Faber Agent should be doing this! attrib = Attribute(name='{}_endpoint'.format(agentNym), origin=stewardWallet.defaultId, value=attributeData, dest=agentNym, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, steward, stewardWallet, attrib) return attrib