def claimsUsedForProof(): claim1Attr = OrderedDict() claim1Attr['first_name'] = 'Alice' claim1Attr['last_name'] = 'Garcia' claim1Attr['account_address_1'] = '321' claim1Attr['date_of_birth'] = 'May 15, 1990' claim2Attr = OrderedDict() claim2Attr['first_name'] = 'Alice' claim2Attr['last_name'] = 'Garcia' claim2Attr['account_status'] = 'active' return [ ( Link(name='Issuer 1'), ('TestClaim-1', '0.1', 'Other data'), claim1Attr ), ( Link(name='Issuer 2'), ('TestClaim-2', '0.1', 'Other claim 2 data'), claim2Attr ) ]
def _updateLinkWithLatestInfo(self, link: Link, reply): if DATA in reply and reply[DATA]: data = json.loads(reply[DATA]) ip, port = data.get(ENDPOINT).split(":") link.remoteEndPoint = (ip, int(port)) link.linkLastSynced = datetime.now() self.notifyMsgListener(" Link {} synced".format(link.name))
def loadInvitationDict(self, invitation_dict): linkInvitation = invitation_dict.get("link-invitation") if not linkInvitation: raise LinkNotFound linkName = linkInvitation["name"] existingLinkInvites = self.wallet. \ getMatchingLinks(linkName) if len(existingLinkInvites) >= 1: return self._mergeInvitation(invitation_dict) Link.validate(invitation_dict) link = self.loadInvitation(invitation_dict) return link
def loadInvitationFile(self, filePath): with open(filePath) as data_file: invitationData = json.load( data_file, object_pairs_hook=collections.OrderedDict) linkInvitation = invitationData.get("link-invitation") if not linkInvitation: raise LinkNotFound linkName = linkInvitation["name"] existingLinkInvites = self.wallet. \ getMatchingLinks(linkName) if len(existingLinkInvites) >= 1: return self._mergeInvitaion(invitationData) Link.validate(invitationData) link = self.loadInvitation(invitationData) return link
def loadInvitation(self, invitationData): linkInvitation = invitationData["link-invitation"] remoteIdentifier = linkInvitation[f.IDENTIFIER.nm] # TODO signature should be validated! signature = invitationData["sig"] linkInvitationName = linkInvitation[NAME] remoteEndPoint = linkInvitation.get("endpoint", None) remote_verkey = linkInvitation.get("verkey", None) linkNonce = linkInvitation[NONCE] proofRequestsJson = invitationData.get("proof-requests", None) proofRequests = [] if proofRequestsJson: for cr in proofRequestsJson: proofRequests.append( ProofRequest(cr[NAME], cr[VERSION], cr[ATTRIBUTES], cr[VERIFIABLE_ATTRIBUTES])) self.notifyMsgListener("1 link invitation found for {}.". format(linkInvitationName)) self.notifyMsgListener("Creating Link for {}.". format(linkInvitationName)) # TODO: Would we always have a trust anchor corresponding to a link? li = Link(name=linkInvitationName, trustAnchor=linkInvitationName, remoteIdentifier=remoteIdentifier, remoteEndPoint=remoteEndPoint, invitationNonce=linkNonce, proofRequests=proofRequests, remote_verkey=remote_verkey) self.wallet.addLink(li) return li
def loadInvitation(self, invitationData): linkInvitation = invitationData["link-invitation"] remoteIdentifier = linkInvitation[f.IDENTIFIER.nm] signature = invitationData["sig"] linkInvitationName = linkInvitation[NAME] remoteEndPoint = linkInvitation.get("endpoint", None) linkNonce = linkInvitation[NONCE] claimProofRequestsJson = invitationData.get("claim-requests", None) claimProofRequests = [] if claimProofRequestsJson: for cr in claimProofRequestsJson: claimProofRequests.append( ClaimProofRequest(cr[NAME], cr[VERSION], cr[ATTRIBUTES], cr[VERIFIABLE_ATTRIBUTES])) self.notifyMsgListener( "1 link invitation found for {}.".format(linkInvitationName)) self.notifyMsgListener( "Creating Link for {}.".format(linkInvitationName)) # TODO: Would we always have a trust anchor corresponding ot a link? li = Link(name=linkInvitationName, trustAnchor=linkInvitationName, remoteIdentifier=remoteIdentifier, remoteEndPoint=remoteEndPoint, invitationNonce=linkNonce, claimProofRequests=claimProofRequests) self.wallet.addLink(li) return li
def linkFromNonce(self, nonce, remoteIdr, remoteHa): internalId = self.getInternalIdByInvitedNonce(nonce) link = self.wallet.getLinkByInternalId(internalId) if not link: # QUESTION: We use wallet.defaultId as the local identifier, # this looks ok for test code, but not production code link = Link(str(internalId), self.wallet.defaultId, invitationNonce=nonce, remoteIdentifier=remoteIdr, remoteEndPoint=remoteHa, internalId=internalId) self.wallet.addLink(link) else: link.remoteIdentifier = remoteIdr link.remoteEndPoint = remoteHa return link
def linkFromNonce(self, nonce, remoteIdr, remoteHa=None, remotePubkey=None): internalId = self.get_internal_id_by_nonce(nonce) linkName = self.get_link_name_by_internal_id(internalId) link = self.wallet.getLinkBy(internalId=internalId) if not link: # QUESTION: We use wallet.defaultId as the local identifier, # this looks ok for test code, but not production code link = Link(linkName, self.wallet.defaultId, self.wallet.getVerkey(), invitationNonce=nonce, remoteIdentifier=remoteIdr, remoteEndPoint=remoteHa, internalId=internalId, remotePubkey=remotePubkey) self.wallet.addLink(link) else: link.remoteIdentifier = remoteIdr link.remoteEndPoint = remoteHa return link
def _updateLinkWithLatestInfo(self, link: Link, reply): link.remoteVerkey = DidVerifier( reply[VERKEY], identifier=link.remoteIdentifier).verkey if DATA in reply and reply[DATA]: data = json.loads(reply[DATA]) ep = data.get(ENDPOINT) if ep: # TODO: Validate its an IP port pair or a malicious entity # can crash the code if 'ha' in ep: ip, port = ep['ha'].split(":") link.remoteEndPoint = (ip, int(port)) if PUBKEY in ep: link.remotePubkey = ep[PUBKEY] else: link.remotePubkey = friendlyVerkeyToPubkey( link.remoteVerkey) if link.remoteVerkey else None link.linkLastSynced = datetime.now() self.notifyMsgListener(" Link {} synced".format(link.name))
def _updateLinkWithLatestInfo(self, link: Link, reply): if DATA in reply and reply[DATA]: data = json.loads(reply[DATA]) verkey = data.get(VERKEY) if verkey is not None: link.remoteVerkey = data[VERKEY] ep = data.get(ENDPOINT) if isinstance(ep, dict): # TODO: Validate its an IP port pair or a malicious entity # can crash the code if 'ha' in ep: ip, port = ep['ha'].split(":") link.remoteEndPoint = (ip, int(port)) if PUBKEY in ep: link.remotePubkey = ep[PUBKEY] else: link.remotePubkey = friendlyVerkeyToPubkey( link.full_remote_verkey) if link.full_remote_verkey else None link.linkLastSynced = datetime.now() self.notifyMsgListener(" Link {} synced".format(link.name))
def testLoadLinkInviteWithoutSig(): li = getSampleLinkInvitation() del li["sig"] with pytest.raises(InvalidLinkException) as excinfo: Link.validate(li) assert "Field not found in given input: sig" in str(excinfo.value)
def test_link_has_requested_proofs(): testLink = Link("Test") # testLink.requestedProofs