async def store(
        self, mediation_invite: MediationInviteRecord
    ) -> MediationInviteRecord:
        """
        Store the mediator's invite for further use when starting the agent.

        Update the currently stored invite if one already exists.
        This assumes a new invite and as such, marks it as unused.

        :param mediation_invite: mediation invite url
        :return: stored mediation invite
        """
        current_invite_record = await self.__retrieve_record(self.MEDIATION_INVITE_ID)

        if current_invite_record is None:
            await self.__storage.add_record(
                StorageRecord(
                    type=self.INVITE_RECORD_CATEGORY,
                    id=self.MEDIATION_INVITE_ID,
                    value=mediation_invite.to_json(),
                )
            )
        else:
            await self.__storage.update_record(
                current_invite_record,
                mediation_invite.to_json(),
                tags=current_invite_record.tags,
            )

        return mediation_invite
Beispiel #2
0
async def test_resolve_responder_fail(ResolveDIDMock, send_wait_Mock, resolver,
                                      profile):
    did_example = "did:sov:201029023831"
    mock_inject = MagicMock()
    mock_inject.inject.return_value = True

    records = AsyncMock()
    records.find_all_records.return_value = [
        StorageRecord(
            type="connection_metadata",
            value={"methods": ["sov"]},
            tags={
                "key": "didcomm_uniresolver",
                "connection_id": "1732d18d-c6f6-4e68-b3a7-56cc31d3313b",
            },
            id="5b9b78a061e6435bbbd7d5cde02d4192",
        )
    ]

    def inject_aux(*args):
        result = None
        if str(args[0]).find("BaseResponder") < 0:
            result = records
        return result

    profile.session.return_value.__aenter__.return_value.inject.side_effect = inject_aux

    async def aux(*args, **kwargs):
        raise DIDNotFound()

    send_wait_Mock.side_effect = aux

    with pytest.raises(ResolverError):
        await resolver.resolve(profile, did_example)
def _storage_record_for(value: str, used: bool = False) -> StorageRecord:
    return StorageRecord(
        type=MediationInviteStore.INVITE_RECORD_CATEGORY,
        value=f"""{{"invite": "{value}", "used": {str(used).lower()}}}""",
        tags={},
        id=MediationInviteStore.MEDIATION_INVITE_ID,
    )
    async def test_postgres_wallet_storage_works(self):
        """
        Ensure that postgres wallet operations work (create and open wallet, store and search, drop wallet)
        """
        postgres_url = os.environ.get("POSTGRES_URL")
        if not postgres_url:
            pytest.fail("POSTGRES_URL not configured")

        load_postgres_plugin()
        postgres_wallet = IndyWallet({
            "auto_create":
            False,
            "auto_remove":
            False,
            "name":
            "test_pg_wallet",
            "key":
            "my_postgres",
            "storage_type":
            "postgres_storage",
            "storage_config":
            '{"url":"' + postgres_url + '", "max_connections":5}',
            "storage_creds":
            '{"account":"postgres","password":"******","admin_account":"postgres","admin_password":"******"}',
        })
        await postgres_wallet.create()
        await postgres_wallet.open()

        storage = IndyStorage(postgres_wallet)

        # add and then fetch a record
        record = StorageRecord(
            value=
            '{"initiator": "self", "invitation_key": "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg", "state": "invitation", "routing_state": "none", "error_msg": null, "their_label": null, "created_at": "2019-05-14 21:58:24.143260+00:00", "updated_at": "2019-05-14 21:58:24.143260+00:00"}',
            tags={
                "initiator": "self",
                "invitation_key":
                "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                "state": "invitation",
                "routing_state": "none",
            },
            type="connection",
            id="f96f76ec-0e9b-4f32-8237-f4219e6cf0c7",
        )
        await storage.add_record(record)
        g_rec = await storage.get_record(record.type, record.id)

        # now try search
        search = None
        try:
            search = storage.search_records("connection")
            await search.open()
            records = await search.fetch(10)
        finally:
            if search:
                await search.close()

        await postgres_wallet.close()
        await postgres_wallet.remove()
Beispiel #5
0
    def test_create(self):
        record_type = "TYPE"
        record_value = "VALUE"
        record = StorageRecord(record_type, record_value)

        assert record.type == record_type
        assert record.value == record_value
        assert record.id and type(record.id) is str
        assert record.tags == {}
Beispiel #6
0
    async def add_key_for_did(self, did: str, key: str):
        """Store a verkey for lookup against a DID.

        Args:
            did: The DID to associate with this key
            key: The verkey to be added
        """
        record = StorageRecord(self.RECORD_TYPE_DID_KEY, key, {
            "did": did,
            "key": key
        })
        storage: BaseStorage = await self.context.inject(BaseStorage)
        await storage.add_record(record)
Beispiel #7
0
    async def store_did_document(self, did_doc: DIDDoc):
        """Store a DID document.

        Args:
            did_doc: The `DIDDoc` instance to be persisted
        """
        assert did_doc.did
        storage: BaseStorage = await self.context.inject(BaseStorage)
        try:
            stored_doc, record = await self.fetch_did_document(did_doc.did)
        except StorageNotFoundError:
            record = StorageRecord(self.RECORD_TYPE_DID_DOC, did_doc.to_json(),
                                   {"did": did_doc.did})
            await storage.add_record(record)
        else:
            await storage.update_record_value(record, did_doc.to_json())
        await self.remove_keys_for_did(did_doc.did)
        for key in did_doc.pubkey.values():
            if key.controller == did_doc.did:
                await self.add_key_for_did(did_doc.did, key.value)
Beispiel #8
0
async def test_resolve_not_supported(ResolveDIDMock, send_wait_Mock, resolver,
                                     profile):
    did_example = "did:sov:201029023831"
    mock_inject = MagicMock()
    mock_inject.inject.return_value = True

    records = AsyncMock()
    records.find_all_records.return_value = [
        StorageRecord(
            type="connection_metadata",
            value='{"methods": ["example"]}',
            tags={
                "key": "didcomm_uniresolver",
                "connection_id": "1732d18d-c6f6-4e68-b3a7-56cc31d3313b",
            },
            id="5b9b78a061e6435bbbd7d5cde02d4192",
        )
    ]
    profile.session.return_value.__aenter__.return_value.inject.return_value = records

    with pytest.raises(DIDMethodNotSupported):
        await resolver.resolve(profile, did_example)
Beispiel #9
0
async def test_resolve_diddoc_json(ResolveDIDMock, send_wait_Mock, resolver,
                                   profile):
    did_example = "did:sov:201029023831"
    mock_inject = MagicMock()
    mock_inject.inject.return_value = True

    records = AsyncMock()
    records.find_all_records.return_value = [
        StorageRecord(
            type="connection_metadata",
            value={"methods": ["sov"]},
            tags={
                "key": "didcomm_uniresolver",
                "connection_id": "1732d18d-c6f6-4e68-b3a7-56cc31d3313b",
            },
            id="5b9b78a061e6435bbbd7d5cde02d4192",
        )
    ]

    def inject_aux(*args):
        result = True
        if str(args[0]).find("BaseResponder") < 0:
            result = records
        return result

    profile.session.return_value.__aenter__.return_value.inject.side_effect = inject_aux

    async def aux(*args, **kwargs):
        mock = MagicMock()
        mock.did_document = json.dumps(DOC)
        return mock

    send_wait_Mock.side_effect = aux

    result = await resolver.resolve(profile, did_example)

    assert result.serialize() == DOC
Beispiel #10
0
def vc_to_storage_record(cred: VCRecord) -> StorageRecord:
    """Convert a VC record into an in-memory stored record."""
    tags = {}
    for ctx_val in cred.contexts:
        tags[f"ctxt:{ctx_val}"] = "1"
    for type_val in cred.types:
        tags[f"type:{type_val}"] = "1"
    for schema_val in cred.schema_ids:
        tags[f"schm:{schema_val}"] = "1"
    for subj_id in cred.subject_ids:
        tags[f"subj:{subj_id}"] = "1"
    if cred.issuer_id:
        tags["issuer_id"] = cred.issuer_id
    if cred.given_id:
        tags["given_id"] = cred.given_id
    if cred.cred_tags:
        tags.update(cred.cred_tags)

    return StorageRecord(
        VC_CRED_RECORD_TYPE,
        json.dumps(cred.cred_value),
        tags,
        cred.record_id,
    )
def test_missing_record(tags={}):
    return StorageRecord(type="__MISSING__", value="000000000")
def test_record(tags={}):
    return StorageRecord(type="TYPE", value="TEST", tags=tags)
    async def test_record(self):
        with async_mock.patch.object(
                test_wallet, "load_postgres_plugin",
                async_mock.MagicMock()) as mock_load, async_mock.patch.object(
                    indy.wallet, "create_wallet", async_mock.CoroutineMock(
                    )) as mock_create, async_mock.patch.object(
                        indy.wallet, "open_wallet", async_mock.CoroutineMock()
                    ) as mock_open, async_mock.patch.object(
                        indy.anoncreds, "prover_create_master_secret",
                        async_mock.CoroutineMock()
                    ) as mock_master, async_mock.patch.object(
                        indy.wallet, "close_wallet", async_mock.CoroutineMock(
                        )) as mock_close, async_mock.patch.object(
                            indy.wallet, "delete_wallet",
                            async_mock.CoroutineMock()) as mock_delete:
            fake_wallet = IndyWallet({
                "auto_create":
                True,
                "auto_remove":
                True,
                "name":
                "test_pg_wallet",
                "key":
                await IndyWallet.generate_wallet_key(),
                "key_derivation_method":
                "RAW",
                "storage_type":
                "postgres_storage",
                "storage_config":
                json.dumps({"url": "dummy"}),
                "storage_creds":
                json.dumps({
                    "account": "postgres",
                    "password": "******",
                    "admin_account": "postgres",
                    "admin_password": "******",
                }),
            })
            await fake_wallet.open()
            storage = IndyStorage(fake_wallet)

            for record_x in [
                    None,
                    StorageRecord(
                        type="connection",
                        value=json.dumps({
                            "initiator":
                            "self",
                            "invitation_key":
                            "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                            "state":
                            "invitation",
                            "routing_state":
                            "none",
                            "error_msg":
                            None,
                            "their_label":
                            None,
                            "created_at":
                            "2019-05-14 21:58:24.143260+00:00",
                            "updated_at":
                            "2019-05-14 21:58:24.143260+00:00",
                        }),
                        tags={
                            "initiator": "self",
                            "invitation_key":
                            "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                            "state": "invitation",
                            "routing_state": "none",
                        },
                        id=None,
                    ),
                    StorageRecord(
                        type=None,
                        value=json.dumps({
                            "initiator":
                            "self",
                            "invitation_key":
                            "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                            "state":
                            "invitation",
                            "routing_state":
                            "none",
                            "error_msg":
                            None,
                            "their_label":
                            None,
                            "created_at":
                            "2019-05-14 21:58:24.143260+00:00",
                            "updated_at":
                            "2019-05-14 21:58:24.143260+00:00",
                        }),
                        tags={
                            "initiator": "self",
                            "invitation_key":
                            "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                            "state": "invitation",
                            "routing_state": "none",
                        },
                        id="f96f76ec-0e9b-4f32-8237-f4219e6cf0c7",
                    ),
                    StorageRecord(
                        type="connection",
                        value=None,
                        tags={
                            "initiator": "self",
                            "invitation_key":
                            "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                            "state": "invitation",
                            "routing_state": "none",
                        },
                        id="f96f76ec-0e9b-4f32-8237-f4219e6cf0c7",
                    ),
            ]:
                with pytest.raises(StorageError):
                    await storage.add_record(record_x)

            with pytest.raises(StorageError):
                await storage.get_record(None, "dummy-id")
            with pytest.raises(StorageError):
                await storage.get_record("connection", None)

            with async_mock.patch.object(
                    test_module.non_secrets, "get_wallet_record",
                    async_mock.CoroutineMock()) as mock_get_record:
                mock_get_record.side_effect = test_module.IndyError(
                    test_module.ErrorCode.CommonInvalidStructure)
                with pytest.raises(test_module.StorageError):
                    await storage.get_record("connection", "dummy-id")

            with async_mock.patch.object(
                    test_module.non_secrets,
                    "update_wallet_record_value",
                    async_mock.CoroutineMock(),
            ) as mock_update_value, async_mock.patch.object(
                    test_module.non_secrets,
                    "update_wallet_record_tags",
                    async_mock.CoroutineMock(),
            ) as mock_update_tags, async_mock.patch.object(
                    test_module.non_secrets,
                    "delete_wallet_record",
                    async_mock.CoroutineMock(),
            ) as mock_delete:
                mock_update_value.side_effect = test_module.IndyError(
                    test_module.ErrorCode.CommonInvalidStructure)
                mock_update_tags.side_effect = test_module.IndyError(
                    test_module.ErrorCode.CommonInvalidStructure)
                mock_delete.side_effect = test_module.IndyError(
                    test_module.ErrorCode.CommonInvalidStructure)

                rec = StorageRecord(
                    type="connection",
                    value=json.dumps({
                        "initiator":
                        "self",
                        "invitation_key":
                        "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                        "state":
                        "invitation",
                        "routing_state":
                        "none",
                        "error_msg":
                        None,
                        "their_label":
                        None,
                        "created_at":
                        "2019-05-14 21:58:24.143260+00:00",
                        "updated_at":
                        "2019-05-14 21:58:24.143260+00:00",
                    }),
                    tags={
                        "initiator": "self",
                        "invitation_key":
                        "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                        "state": "invitation",
                        "routing_state": "none",
                    },
                    id="f96f76ec-0e9b-4f32-8237-f4219e6cf0c7",
                )

                with pytest.raises(test_module.StorageError):
                    await storage.update_record(rec, "dummy-value",
                                                {"tag": "tag"})

                with pytest.raises(test_module.StorageError):
                    await storage.delete_record(rec)