def testLatestAttrIsReceived(nodeSet, addedTrustAnchor, trustAnchorWallet, looper, trustAnchor, userIdA): attr1 = json.dumps({'name': 'Mario'}) attrib = Attribute(name='name', origin=trustAnchorWallet.defaultId, value=attr1, dest=userIdA, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, trustAnchor, trustAnchorWallet, attrib) assert attr1 in [ a.value for a in trustAnchorWallet.getAttributesForNym(userIdA) ] attr2 = json.dumps({'name': 'Luigi'}) attrib = Attribute(name='name', origin=trustAnchorWallet.defaultId, value=attr2, dest=userIdA, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, trustAnchor, trustAnchorWallet, attrib) logger.debug( [a.value for a in trustAnchorWallet.getAttributesForNym(userIdA)]) assert attr2 in [ a.value for a in trustAnchorWallet.getAttributesForNym(userIdA) ]
def requestAttribute(self, attrib: Attribute, sender): """ Used to get a raw attribute from Sovrin :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): """ Used to create a new attribute on Sovrin :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 testOnlyUsersTrustAnchorCanAddAttribute( nodeSet, looper, steward, stewardWallet, attributeData, anotherTrustAnchor, userIdA): with whitelistextras("UnauthorizedClientRequest"): client, wallet = anotherTrustAnchor attrib = Attribute(name='test2 attribute', origin=wallet.defaultId, value=attributeData, dest=userIdA, ledgerStore=LedgerStore.RAW) reqs = makeAttribRequest(client, wallet, attrib) timeout = waits.expectedReqNAckQuorumTime() looper.run( eventually( checkRejects, client, reqs[0].reqId, "UnauthorizedClientRequest('Only identity " "owner/guardian can add attribute for that identity'", retryWait=1, timeout=timeout))
def test_attr_with_no_dest_added(nodeSet, tdir, looper, trustAnchor, addedTrustAnchor, attributeData): user_wallet = Wallet() signer = DidSigner() user_wallet.addIdentifier(signer=signer) client, _ = genTestClient(nodeSet, tmpdir=tdir, usePoolLedger=True) client.registerObserver(user_wallet.handleIncomingReply) looper.add(client) looper.run(client.ensureConnectedToNodes()) makePendingTxnsRequest(client, user_wallet) createNym(looper, user_wallet.defaultId, trustAnchor, addedTrustAnchor, role=None, verkey=user_wallet.getVerkey()) attr1 = json.dumps({'age': "24"}) attrib = Attribute(name='test4 attribute', origin=user_wallet.defaultId, value=attr1, dest=None, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, client, user_wallet, attrib)
def addAgent(looper, agent, steward, stewardWallet): # 1. add Agent's NYM (by Steward) agentNym = agent.wallet.defaultId createNym(looper, agentNym, steward, stewardWallet, role=TRUST_ANCHOR, verkey=agent.wallet.getVerkey()) # 2. add client to the loop looper.add(agent.client) # 3. add attribute to the Agent's NYM with endpoint information (by # Agent's client) ep = '127.0.0.1:{}'.format(agent.port) attributeData = json.dumps({ENDPOINT: {'ha': ep}}) attrib = Attribute(name='{}_endpoint'.format(agentNym), origin=agentNym, value=attributeData, dest=agentNym, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, agent.client, agent.wallet, attrib) return attrib
def sync(self, linkName, doneCallback=None): if not self.client.isReady(): raise NotConnectedToNetwork link = self.wallet.getLink(linkName, required=True) identifier = link.remoteIdentifier identity = Identity(identifier=identifier) req = self.wallet.requestIdentity(identity, sender=self.wallet.defaultId) self.client.submitReqs(req) self.loop.call_later(.2, ensureReqCompleted, self.loop, req.key, self.client, self._handleSyncResp(link, None)) attrib = Attribute(name=ENDPOINT, value=None, dest=identifier, ledgerStore=LedgerStore.RAW) req = self.wallet.requestAttribute(attrib, sender=self.wallet.defaultId) self.client.submitReqs(req) self.loop.call_later(.2, ensureReqCompleted, self.loop, req.key, self.client, self._handleSyncResp(link, doneCallback))
def test_non_trust_anchor_cannot_add_attribute_for_user( nodeSet, nonTrustAnchor, trustAnchor, addedTrustAnchor, userIdA, looper, attributeData): with whitelistextras('UnauthorizedClientRequest'): client, wallet = nonTrustAnchor createNym(looper, wallet.defaultId, trustAnchor, addedTrustAnchor, role=None, verkey=wallet.getVerkey()) attrib = Attribute(name='test1 attribute', origin=wallet.defaultId, value=attributeData, dest=userIdA, ledgerStore=LedgerStore.RAW) reqs = makeAttribRequest(client, wallet, attrib) timeout = waits.expectedTransactionExecutionTime(len(nodeSet)) looper.run( eventually( checkRejects, client, reqs[0].reqId, "UnauthorizedClientRequest('Only identity " "owner/guardian can add attribute for that identity'", retryWait=1, timeout=timeout))
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 testAttrWithNoDestAdded(nodeSet, looper, userClientA, userWalletA, userIdA, attributeData): attr1 = json.dumps({'age': 24}) attrib = Attribute(name='test4 attribute', origin=userIdA, value=attr1, dest=None, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, userClientA, userWalletA, attrib)
def addedRawAttribute(userWalletA: Wallet, trustAnchor: Client, trustAnchorWallet: Wallet, attributeData, looper): attrib = Attribute(name='test attribute', origin=trustAnchorWallet.defaultId, value=attributeData, dest=userWalletA.defaultId, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, trustAnchor, trustAnchorWallet, attrib) return attrib
def testClientGetsResponseWithoutConsensusForUsedReqId( nodeSet, looper, steward, addedTrustAnchor, trustAnchor, userWalletA, attributeName, attributeData, addedRawAttribute): lastReqId = None replies = {} for msg, sender in reversed(trustAnchor.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 trustAnchorWallet = addedTrustAnchor attrib = Attribute(name=attributeName, origin=trustAnchorWallet.defaultId, value=attributeData, dest=userWalletA.defaultId, ledgerStore=LedgerStore.RAW) trustAnchorWallet.addAttribute(attrib) req = trustAnchorWallet.preparePending()[0] _, key = trustAnchorWallet._prepared.pop((req.identifier, req.reqId)) req.reqId = lastReqId req.signature = trustAnchorWallet.signMsg(msg=req.signingState, identifier=req.identifier) trustAnchorWallet._prepared[req.identifier, req.reqId] = req, key trustAnchor.submitReqs(req) def chk(): nonlocal trustAnchor, lastReqId, replies for node in nodeSet: last = node.spylog.getLast(TestNode.getReplyFromLedger.__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] == \ {k: v for k, v in result.result.items() if v is not None} timeout = waits.expectedTransactionExecutionTime(len(nodeSet)) looper.run(eventually(chk, retryWait=1, timeout=timeout))
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, trustAnchor, trustAnchorWallet, userIdA, attributeName, attributeValue): attrib = Attribute(name=attributeName, value=None, dest=userIdA, ledgerStore=LedgerStore.RAW) req = trustAnchorWallet.requestAttribute(attrib, sender=trustAnchorWallet.defaultId) trustAnchor.submitReqs(req) looper.run(eventually(checkGetAttr, req.key, trustAnchor, attributeName, attributeValue, retryWait=1, timeout=20))
def testStewardCannotAddUsersAttribute(nodeSet, looper, steward, stewardWallet, userIdA, attributeData): with whitelistextras("UnauthorizedClientRequest"): 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 testNonTrustAnchorCannotAddAttributeForUser(nodeSet, nonTrustAnchor, userIdA, looper, attributeData): with whitelistextras("UnknownIdentifier"): client, wallet = nonTrustAnchor 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 testOnlyUsersTrustAnchorCanAddAttribute(nodeSet, looper, steward, stewardWallet, attributeData, anotherTrustAnchor, userIdA): with whitelistextras("UnauthorizedClientRequest"): client, wallet = anotherTrustAnchor 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 testStewardCannotAddUsersAttribute(nodeSet, looper, steward, stewardWallet, userIdA, attributeData): with whitelistextras("UnauthorizedClientRequest"): attrib = Attribute(name='test3 attribute', origin=stewardWallet.defaultId, value=attributeData, dest=userIdA, ledgerStore=LedgerStore.RAW) reqs = makeAttribRequest(steward, stewardWallet, attrib) timeout = waits.expectedReqNAckQuorumTime() looper.run(eventually(checkRejects, steward, reqs[0].reqId, "UnauthorizedClientRequest('Only identity owner/guardian can add attribute for that identity'", retryWait=1, timeout=timeout))
def build_attrib(self, nym, raw=None, enc=None, hsh=None): 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.') return Attribute(randomString(5), data, self.defaultId, dest=nym, ledgerStore=LedgerStore.RAW)
def test_user_add_attrs_for_herself(nodeSet, looper, userClientA, userWalletA, userIdA, trustAnchor, addedTrustAnchor, attributeData): createNym(looper, userWalletA.defaultId, trustAnchor, addedTrustAnchor, role=None, verkey=userWalletA.getVerkey()) 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 getAttribute(looper, trustAnchor, trustAnchorWallet, userIdA, attributeName, attributeValue): attrib = Attribute(name=attributeName, value=None, dest=userIdA, ledgerStore=LedgerStore.RAW) req = trustAnchorWallet.requestAttribute( attrib, sender=trustAnchorWallet.defaultId) trustAnchor.submitReqs(req) timeout = waits.expectedTransactionExecutionTime(len(trustAnchor.nodeReg)) looper.run( eventually(checkGetAttr, req.key, trustAnchor, attributeName, attributeValue, retryWait=1, timeout=timeout))
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
def testNonTrustAnchorCannotAddAttributeForUser(nodeSet, nonTrustAnchor, userIdA, looper, attributeData): with whitelistextras('UnauthorizedClientRequest'): client, wallet = nonTrustAnchor attrib = Attribute(name='test1 attribute', origin=wallet.defaultId, value=attributeData, dest=userIdA, ledgerStore=LedgerStore.RAW) reqs = makeAttribRequest(client, wallet, attrib) timeout = waits.expectedTransactionExecutionTime(len(nodeSet)) looper.run( eventually(checkRejects, client, reqs[0].reqId, 'UnauthorizedClientRequest', retryWait=1, timeout=timeout))
def createAgentAndAddEndpoint(looper, agentNym, agentWallet, agentClient, agentPort, steward, stewardWallet): agentVerkey = agentWallet.getVerkey() createNym(looper, agentNym, steward, stewardWallet, role=SPONSOR, verkey=agentVerkey) ep = '127.0.0.1:{}'.format(agentPort) attributeData = json.dumps({ENDPOINT: ep}) attrib = Attribute(name='{}_endpoint'.format(agentNym), origin=agentNym, value=attributeData, dest=agentNym, ledgerStore=LedgerStore.RAW) addAttributeAndCheck(looper, agentClient, agentWallet, attrib) return attrib
def build_attrib(self, nym, raw=None, enc=None, hsh=None): 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.') # TODO looks like a possible error why we do not use `l` (see above)? return Attribute(randomString(5), data, self.defaultId, dest=nym, ledgerStore=LedgerStore.RAW)
def makeRequest(cli, wallet): attrib = Attribute(name=cli.name, origin=wallet.defaultId, value=self.randomRawAttr(), ledgerStore=LedgerStore.RAW) wallet.addAttribute(attrib)