Skip to content
Snippets Groups Projects
Commit 630af650 authored by Steffen Schulze's avatar Steffen Schulze
Browse files

Merge branch 'fix/idunion' into 'main'

Add support for externally registered DID

See merge request eclipse/xfsc/ocm/ocm-engine!52
parents 3bb204f0 bd646889
Branches feat/tsa-checks
No related tags found
No related merge requests found
Pipeline #41595 failed
......@@ -11,10 +11,11 @@ AGENT_WALLET_ID=ssi-wallet-id
AGENT_WALLET_KEY=ssi-wallet-key
AGENT_HOST=http://localhost
AGENT_INBOUND_PORT=3001
AGENT_PUBLIC_DID_SEED=6b8b882e2618fa5d45ee7229ca000000
AGENT_LEDGER_ID=ID_UNION
AGENT_INDY_DID_SEED=00000000000_OCM_E1_Test_Endorser
AGENT_INDY_DID=RVKyFidnaqJPznu8bgodDb
AGENT_AUTO_ACCEPT_CONNECTION=true
AGENT_AUTO_ACCEPT_CREDENTIAL=contentApproved
AGENT_LEDGER_ID=BCOVRIN_TEST
TAILS_SERVER_BASE_URL=http://localhost:9000
TAILS_SERVER_BUCKET_NAME=ssi
......
......@@ -128,10 +128,12 @@ export class DidsService {
>;
const indyDidSeed = this.configService.get('agent.indyDidSeed') as string;
const indyDid = this.configService.get('agent.indyDid') as string;
const indyDids = await registerIndyDids({
ledgerIds,
seed: indyDidSeed,
did: indyDid,
});
const privKey = {
......
......@@ -8,6 +8,7 @@ import { LEDGERS } from '../../config/ledger.js';
type RegisterPublicDidOptions = {
ledgerIds: Array<LedgerIds>;
seed: string;
did?: string;
};
type LedgerRegistrationBody = {
......@@ -20,20 +21,42 @@ type LedgerRegistrationBody = {
type RegisterPublicDidResponse = {
seed: string;
did: string;
verkey: string;
verkey?: string;
namespace: string;
};
export const registerPublicDids = async ({
ledgerIds,
seed,
did,
}: RegisterPublicDidOptions): Promise<Array<RegisterPublicDidResponse>> => {
const responses: Array<RegisterPublicDidResponse> = [];
for (const ledgerId of ledgerIds) {
try {
const ledgerRegisterUrl = LEDGERS[ledgerId].registerNymUrl;
const ledgerNamespace = LEDGERS[ledgerId].namespace;
const ledgerConfig = LEDGERS[ledgerId];
const ledgerNamespace = ledgerConfig.namespace;
if (did) {
const indyDid = `did:indy:${ledgerNamespace}:${did}`;
logger.warn(
`Agent DID '${indyDid}' provided in config. Assuming it was registered manually.`,
);
responses.push({
did: indyDid,
seed,
namespace: ledgerNamespace,
});
continue;
} else if (
!('registerNymUrl' in ledgerConfig) ||
!ledgerConfig.registerNymUrl
) {
throw new Error(
`Ledger ${ledgerId} does not have a 'registerNymUrl'. Must register DID manually and provide it in 'AGENT_INDY_DID' env variable. Cannot continue without a DID.`,
);
}
try {
const body: LedgerRegistrationBody = {
role: 'ENDORSER',
seed,
......@@ -41,7 +64,7 @@ export const registerPublicDids = async ({
const res = await axios({
method: 'post',
url: ledgerRegisterUrl,
url: ledgerConfig.registerNymUrl,
data: body,
});
......@@ -57,5 +80,6 @@ export const registerPublicDids = async ({
if (err instanceof axios.AxiosError) logAxiosError(err);
}
}
return responses;
};
......@@ -143,23 +143,46 @@ export class RevocationService {
}: EventAnonCredsRevocationRegisterRevocationStatusListInput): Promise<
EventAnonCredsRevocationRegisterRevocationStatusList['data']
> {
const endorserDid = await this.agentService.getEndorserDid(issuerDid);
return this.withTenantService.invoke(tenantId, async (t) => {
const result = await t.modules.anoncreds.registerRevocationStatusList({
options: {},
revocationStatusList: {
revocationRegistryDefinitionId,
issuerId: issuerDid,
},
});
const { revocationStatusListState } =
await t.modules.anoncreds.registerRevocationStatusList({
options: {
endorserMode: 'external',
endorserDid,
},
revocationStatusList: {
revocationRegistryDefinitionId,
issuerId: issuerDid,
},
});
if (result.revocationStatusListState.state !== 'finished') {
if (
revocationStatusListState.state !== 'action' ||
revocationStatusListState.action !== 'endorseIndyTransaction'
) {
throw new Error(
`Error registering the revocation status list. Error: ${JSON.stringify(
result,
)}`,
`Error registering revocation registry definition: ${
revocationStatusListState.state === 'failed'
? revocationStatusListState.reason
: 'Not Finished'
}`,
);
}
const signedRevocationRegistryDefinitionRequest =
await this.agentService.endorseTransaction(
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
revocationStatusListState.revocationStatusListRequest,
endorserDid,
);
await t.modules.indyVdr.submitTransaction(
signedRevocationRegistryDefinitionRequest,
issuerDid,
);
return {};
});
}
......
......@@ -6,10 +6,11 @@ export const agentConfig = registerAs('agent', () => ({
walletId: process.env.AGENT_WALLET_ID || '',
walletKey: process.env.AGENT_WALLET_KEY || '',
ledgerIds: process.env.AGENT_LEDGER_ID?.split(',') || [],
indyDidSeed: process.env.AGENT_INDY_DID_SEED || '',
indyDid: process.env.AGENT_INDY_DID || '',
host: process.env.AGENT_HOST || '',
inboundPort: Number(process.env.AGENT_INBOUND_PORT || '3001'),
path: process.env.AGENT_URL_PATH || '',
indyDidSeed: process.env.AGENT_INDY_DID_SEED || '',
autoAcceptConnection: process.env.AGENT_AUTO_ACCEPT_CONNECTION === 'true',
autoAcceptCredential:
(process.env.AGENT_AUTO_ACCEPT_CREDENTIAL as AutoAcceptCredential) ||
......
export const LEDGERS = {
ID_UNION: {
registerNymUrl: 'https://idu.cloudcompass.ca/register',
namespace: 'idunion:test',
genesisTransaction: `{"reqSignature":{},"txn":{"data":{"data":{"alias":"MainIncubator","blskey":"14MPfxHnRvCL5dnbpD3SjxekAGnKyjkmifDFLnMJAvHcvEAarDLWX6KawhubPujSmmUMqRmQfPQzBambrdUqBGgHDryDS6Aj8BioWRwZkyTcH1zzkVQ7vZjE5S6ri5epkiS1VkVX42Z22z4cohdHVuKTgeQB5mjAwi55xNeRxpxhrNb","blskey_pop":"QoqRe3vMPr5Bt1qHDstYewWkxb5VEdugnvumLCWpkZAeUpdqjjaSTSKKJtT7U7aCe8CmShGSdCZFWs9hcpmMSGfMnmon7R99UTJj4jEr48smyxo1UpBcgooznc8N8USkZ8hSec3bRbN9y6NppuaFzfgt1WmJ3cdFi9L1Wbj1fNs5CK","client_ip":"35.207.81.15","client_port":"9702","node_ip":"35.207.81.15","node_port":"9701","services":["VALIDATOR"]},"dest":"EQ2oCtWpMdUCzKgQ2hvbyQ2i6VyJuQF9LcpHRfiah6rW"},"metadata":{"from":"2MZYuPv2Km7Q1eD4GCsSb6"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"0a35c047f19448f12a0c2961d8e3085140b8149d87291acbdaf56ed956900d48"},"ver":"1"}
{"reqSignature":{},"txn":{"data":{"data":{"alias":"tubzecm","blskey":"3Zpdx6LMWPdybnQKPq62S3TaWUhwypr7RV2BBFkeFigjKuue7KJ7rh5w1gZY9qgugww9vZnpURLSjBuTonJpfyfN5nn2ofwFQQa3viiT77hhFf6kQqoMH53f66ZfBNWU2LzphQikXsma9zjZWALMtMsNWx7ftNZ8yzMrZpf1X6VqYX5","blskey_pop":"RbPQSMsV8iuxNXVFNEUPvb6k1wQe1rxaXroMMkpHTstiiJfCApER38jW79Ew1yrnt5ndz7wJeDRU7CkLNzJ6pEZaRYjLzhZL2shRgyaGqnMqkxvD1ewxNMSz7cSgBSChwUgLBxsms5iDyshwAM5dx8B1GayMyATcFxAdgCRiDv3EHm","client_ip":"141.23.35.186","client_port":"9702","node_ip":"141.23.35.186","node_port":"9701","services":["VALIDATOR"]},"dest":"Ddqm5GATTcEb5hrgMBbVL8w6R6mtTHjUpdpyCeWg3pVS"},"metadata":{"from":"JhyMn8Nn3xy2zsXjPaPu3B"},"type":"0"},"txnMetadata":{"seqNo":2,"txnId":"e2f9efff1bfef015098ae299a665154fa39a898a5071d0af03c7f2311fe8577f"},"ver":"1"}
......
......@@ -22,10 +22,11 @@ export const validationSchema = Joi.object({
AGENT_HOST: Joi.string().required(),
AGENT_INBOUND_PORT: Joi.string(),
AGENT_URL_PATH: Joi.string(),
AGENT_INDY_DID_SEED: Joi.string().optional(),
AGENT_AUTO_ACCEPT_CONNECTION: Joi.boolean().default(true),
AGENT_AUTO_ACCEPT_CREDENTIAL: Joi.string().default(
AutoAcceptCredential.ContentApproved,
),
AGENT_ID_UNION_KEY: Joi.string(),
AGENT_LEDGER_ID: Joi.string().required(),
AGENT_INDY_DID_SEED: Joi.string().required(),
AGENT_INDY_DID: Joi.string().optional(),
});
......@@ -29,7 +29,6 @@ import {
import { randomBytes } from 'crypto';
import { firstValueFrom } from 'rxjs';
import { natsConfig } from '../dist/config/nats.config.js';
import { AgentModule } from '../src/agent/agent.module.js';
import { AnonCredsCredentialsModule } from '../src/agent/anoncredsCredentials/anoncredsCredentials.module.js';
import { ConnectionsModule } from '../src/agent/connections/connections.module.js';
......@@ -43,8 +42,9 @@ import { SchemasService } from '../src/agent/schemas/schemas.service.js';
import { TenantsModule } from '../src/agent/tenants/tenants.module.js';
import { TenantsService } from '../src/agent/tenants/tenants.service.js';
import { mockConfigModule } from '../src/config/__tests__/mockConfig.js';
import { natsConfig } from '../src/config/nats.config.js';
describe.skip('Revocation', () => {
describe('Revocation', () => {
const TOKEN = 'REVOCATION_CLIENT_SERVICE';
let app: INestApplication;
let client: ClientProxy;
......
......@@ -79,10 +79,11 @@ services:
AGENT_WALLET_KEY: ssi-wallet-key
AGENT_HOST: http://ssi-abstraction
AGENT_INBOUND_PORT: 3001
AGENT_INDY_DID_SEED: 000000000000000_OCM_E2E_ENDORSER
AGENT_LEDGER_ID: ID_UNION
AGENT_INDY_DID_SEED: 00000000000_OCM_E1_Test_Endorser
AGENT_INDY_DID: RVKyFidnaqJPznu8bgodDb
AGENT_AUTO_ACCEPT_CONNECTION: true
AGENT_AUTO_ACCEPT_CREDENTIAL: contentApproved
AGENT_LEDGER_ID: BCOVRIN_TEST
TAILS_SERVER_BASE_URL: http://s3:9000
TAILS_SERVER_BUCKET_NAME: ssi
S3_ACCESS_KEY: ssi-abstraction
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment