Skip to content
Snippets Groups Projects
Commit b81ca324 authored by Berend Sliedrecht's avatar Berend Sliedrecht
Browse files

feat: more improvements to revocation


Signed-off-by: default avatarBerend Sliedrecht <berend@animo.id>
parent a91ca886
No related branches found
No related tags found
2 merge requests!37Draft: Modifications for manual testing,!25feat(ssi): revocation ssi-abstraction
......@@ -77,3 +77,26 @@ export class EventAnonCredsRevocationRegisterRevocationStatusList extends BaseEv
);
}
}
export type EventAnonCredsRevocationTailsFileInput = BaseEventInput<{
revocationRegistryDefinitionId: string;
}>;
export class EventAnonCredsRevocationTailsFile extends BaseEvent<{
tailsFile: Uint8Array;
}> {
public static token = 'anoncreds.revocation.tailsFile';
public get instance() {
return this.data;
}
public static fromEvent(e: EventAnonCredsRevocationTailsFile) {
return new EventAnonCredsRevocationTailsFile(
e.data,
e.tenantId,
e.id,
e.type,
e.timestamp,
);
}
}
......@@ -3,6 +3,7 @@ AFJ_EXT_PORT=3010
NATS_URL=nats://localhost:4222
ECSURL=http://localhost:9200/
AGENT_HOST=https://gaiax.vereign.com
TAILS_SERVER_BASE_URL=http://localhost:3000/tails
AGENT_NAME=ssi-abstraction-agent
AGENT_PEER_PORT=:4000
......
......@@ -34,6 +34,7 @@
"@ocm/shared": "workspace:*",
"axios": "^1.6.2",
"express": "^4.17.3",
"form-data": "^4.0.0",
"joi": "^17.6.0",
"nats": "^2.18.0",
"rxjs": "^7.2.0",
......
......@@ -49,6 +49,7 @@ import { parseDid } from '../common/utils.js';
import { LEDGERS } from '../config/ledger.js';
import { AgentLogger } from './logger.js';
import { TailsFileService } from './revocation/TailsFileService.js';
export type TenantAgent = Agent<Omit<AgentService['modules'], 'tenants'>>;
export type AppAgent = Agent<AgentService['modules']>;
......@@ -99,6 +100,8 @@ export class AgentService implements OnApplicationShutdown {
const { autoAcceptConnection, autoAcceptCredential, autoAcceptProof } =
this.configService.get('agent');
const tailsServerBaseUrl = this.configService.get('tailsServerBaseUrl');
return {
connections: new ConnectionsModule({
autoAcceptConnections: autoAcceptConnection,
......@@ -131,6 +134,7 @@ export class AgentService implements OnApplicationShutdown {
anoncreds: new AnonCredsModule({
anoncreds,
registries: [new IndyVdrAnonCredsRegistry()],
tailsFileService: new TailsFileService({ tailsServerBaseUrl }),
}),
indyVdr: new IndyVdrModule({ indyVdr, networks: this.ledgers }),
......
import type { AnonCredsRevocationRegistryDefinition } from '@aries-framework/anoncreds';
import type { AgentContext } from '@aries-framework/core';
import { BasicTailsFileService } from '@aries-framework/anoncreds/build/services/tails/BasicTailsFileService.js';
import FormData from 'form-data';
import fs from 'fs';
export class TailsFileService extends BasicTailsFileService {
private tailsServerBaseUrl?: string;
public constructor(options?: {
tailsDirectoryPath?: string;
tailsServerBaseUrl?: string;
}) {
super(options);
this.tailsServerBaseUrl = options?.tailsServerBaseUrl;
}
public async uploadTailsFile(
agentContext: AgentContext,
options: {
revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition;
},
) {
const revocationRegistryDefinition = options.revocationRegistryDefinition;
const localTailsFilePath = revocationRegistryDefinition.value.tailsLocation;
const pathParts = localTailsFilePath.split('/');
const tailsFileId = pathParts[pathParts.length - 1];
const data = new FormData();
const readStream = fs.createReadStream(localTailsFilePath);
data.append('file', readStream);
const response = await agentContext.config.agentDependencies.fetch(
`${this.tailsServerBaseUrl}/${tailsFileId}`,
{
method: 'PUT',
body: data,
},
);
if (response.status !== 200) {
throw new Error('Cannot upload tails file');
}
return {
tailsFileUrl: `${this.tailsServerBaseUrl}/${encodeURIComponent(tailsFileId)}`,
};
}
}
......@@ -7,6 +7,8 @@ import {
EventAnonCredsRevocationRegisterRevocationStatusListInput,
EventAnonCredsRevocationRevoke,
EventAnonCredsRevocationRevokeInput,
EventAnonCredsRevocationTailsFile,
EventAnonCredsRevocationTailsFileInput,
} from '@ocm/shared';
import { RevocationService } from './revocation.service.js';
......@@ -48,4 +50,14 @@ export class RevocationController {
options.tenantId,
);
}
@MessagePattern(EventAnonCredsRevocationTailsFile.token)
public async getTailsFile(
options: EventAnonCredsRevocationTailsFileInput,
): Promise<EventAnonCredsRevocationTailsFile> {
return new EventAnonCredsRevocationTailsFile(
await this.revocationService.getTailsFile(options),
options.tenantId,
);
}
}
......@@ -5,9 +5,12 @@ import type {
EventAnonCredsRevocationRegisterRevocationStatusListInput,
EventAnonCredsRevocationRevoke,
EventAnonCredsRevocationRevokeInput,
EventAnonCredsRevocationTailsFile,
EventAnonCredsRevocationTailsFileInput,
} from '@ocm/shared';
import { Injectable } from '@nestjs/common';
import { readFile } from 'node:fs/promises';
import { AgentService } from '../agent.service.js';
import { WithTenantService } from '../withTenantService.js';
......@@ -216,4 +219,31 @@ export class RevocationService {
return {};
});
}
public async getTailsFile({
tenantId,
revocationRegistryDefinitionId,
}: EventAnonCredsRevocationTailsFileInput): Promise<
EventAnonCredsRevocationTailsFile['data']
> {
return this.withTenantService.invoke(tenantId, async (t) => {
const result = await t.modules.anoncreds.getRevocationRegistryDefinition(
revocationRegistryDefinitionId,
);
if (!result.revocationRegistryDefinition) {
throw new Error(
`error: ${result.resolutionMetadata.error}. Message: ${result.resolutionMetadata.message}`,
);
}
const { tailsLocation } = result.revocationRegistryDefinition.value;
const content = await readFile(tailsLocation);
return {
tailsFile: Uint8Array.from(content),
};
});
}
}
......@@ -8,6 +8,7 @@ import { validationSchema } from '../validation.js';
const mockConfig = (port: number = 3001, withLedger = false): AppConfig => ({
agentHost: '',
port: 3000,
tailsServerBaseUrl: 'http://localhost:8080',
jwtSecret: '',
nats: {
url: 'localhost',
......
......@@ -4,6 +4,7 @@ export interface AppConfig {
agentHost: string;
port: number;
jwtSecret: string;
tailsServerBaseUrl: string;
nats: {
url: string;
......@@ -29,6 +30,7 @@ export const config = (): AppConfig => ({
agentHost: process.env.AGENT_HOST || '',
port: parseInt(process.env.PORT || '3000'),
jwtSecret: process.env.JWT_SECRET || '',
tailsServerBaseUrl: process.env.TAILS_SERVER_BASE_URL || '',
nats: {
url: process.env.NATS_URL || '',
......
......@@ -5,6 +5,7 @@ export const validationSchema = Joi.object({
NATS_USER: Joi.string().optional(),
NATS_PASSWORD: Joi.string().optional(),
PORT: Joi.number().required(),
TAILS_SERVER_BASE_URL: Joi.string().required(),
AGENT_NAME: Joi.string().required(),
AGENT_WALLET_ID: Joi.string().required(),
......
......@@ -19,10 +19,10 @@ importers:
version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nestjs/core':
specifier: ^10.3.0
version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nestjs/microservices':
specifier: ^10.3.0
version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@typescript-eslint/eslint-plugin':
specifier: ^6.12.0
version: 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3)
......@@ -631,7 +631,7 @@ importers:
version: 3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14)
'@nestjs/core':
specifier: ^10.3.0
version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nestjs/microservices':
specifier: ^10.3.0
version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
......@@ -647,6 +647,9 @@ importers:
express:
specifier: ^4.17.3
version: 4.18.2
form-data:
specifier: ^4.0.0
version: 4.0.0
joi:
specifier: ^17.6.0
version: 17.11.1
......@@ -668,7 +671,7 @@ importers:
version: 10.1.0(chokidar@3.5.3)(typescript@5.3.3)
'@nestjs/testing':
specifier: ^10.2.10
version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)
version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)
'@types/express':
specifier: ^4.17.21
version: 4.17.21
......@@ -4338,37 +4341,6 @@ packages:
transitivePeerDependencies:
- encoding
 
/@nestjs/core@10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1):
resolution: {integrity: sha512-N06P5ncknW/Pm8bj964WvLIZn2gNhHliCBoAO1LeBvNImYkecqKcrmLbY49Fa1rmMfEM3MuBHeDys3edeuYAOA==}
requiresBuild: true
peerDependencies:
'@nestjs/common': ^10.0.0
'@nestjs/microservices': ^10.0.0
'@nestjs/platform-express': ^10.0.0
'@nestjs/websockets': ^10.0.0
reflect-metadata: ^0.1.12
rxjs: ^7.1.0
peerDependenciesMeta:
'@nestjs/microservices':
optional: true
'@nestjs/platform-express':
optional: true
'@nestjs/websockets':
optional: true
dependencies:
'@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nestjs/microservices': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nuxtjs/opencollective': 0.3.2
fast-safe-stringify: 2.1.1
iterare: 1.2.1
path-to-regexp: 3.2.0
reflect-metadata: 0.1.14
rxjs: 7.8.1
tslib: 2.6.2
uid: 2.0.2
transitivePeerDependencies:
- encoding
/@nestjs/mapped-types@2.0.4(@nestjs/common@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14):
resolution: {integrity: sha512-xl+gUSp0B+ln1VSNoUftlglk8dfpUes3DHGxKZ5knuBxS5g2H/8p9/DSBOYWUfO5f4u9s6ffBPZ71WO+tbe5SA==}
peerDependencies:
......@@ -4432,49 +4404,6 @@ packages:
rxjs: 7.8.1
tslib: 2.6.2
 
/@nestjs/microservices@10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1):
resolution: {integrity: sha512-CZj27dEN4Rh6t9cRXv5EEg+HwkOUk02DDdS7x4eLcphnP4wgsLNDEo8vQ2gbQHFGpZhLUyeeynjNGkpV9T3+og==}
peerDependencies:
'@grpc/grpc-js': '*'
'@nestjs/common': ^10.0.0
'@nestjs/core': ^10.0.0
'@nestjs/websockets': ^10.0.0
amqp-connection-manager: '*'
amqplib: '*'
cache-manager: '*'
ioredis: '*'
kafkajs: '*'
mqtt: '*'
nats: '*'
reflect-metadata: ^0.1.12
rxjs: ^7.1.0
peerDependenciesMeta:
'@grpc/grpc-js':
optional: true
'@nestjs/websockets':
optional: true
amqp-connection-manager:
optional: true
amqplib:
optional: true
cache-manager:
optional: true
ioredis:
optional: true
kafkajs:
optional: true
mqtt:
optional: true
nats:
optional: true
dependencies:
'@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
iterare: 1.2.1
reflect-metadata: 0.1.14
rxjs: 7.8.1
tslib: 2.6.2
/@nestjs/platform-express@10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0):
resolution: {integrity: sha512-E4hUW48bYv8OHbP9XQg6deefmXb0pDSSuE38SdhA0mJ37zGY7C5EqqBUdlQk4ttfD+OdnbIgJ1zOokT6dd2d7A==}
peerDependencies:
......@@ -4599,7 +4528,7 @@ packages:
dependencies:
'@nestjs/axios': 3.0.1(@nestjs/common@10.3.0)(axios@1.6.5)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nestjs/microservices': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
boxen: 5.1.2
check-disk-space: 3.4.0
......@@ -4607,25 +4536,6 @@ packages:
rxjs: 7.8.1
dev: false
 
/@nestjs/testing@10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0):
resolution: {integrity: sha512-8DM+bw1qASCvaEnoHUQhypCOf54+G5R21MeFBMvnSk5DtKaWVZuzDP2GjLeYCpTH19WeP6LrrjHv3rX2LKU02A==}
peerDependencies:
'@nestjs/common': ^10.0.0
'@nestjs/core': ^10.0.0
'@nestjs/microservices': ^10.0.0
'@nestjs/platform-express': ^10.0.0
peerDependenciesMeta:
'@nestjs/microservices':
optional: true
'@nestjs/platform-express':
optional: true
dependencies:
'@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
'@nestjs/microservices': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)
tslib: 2.6.2
dev: true
/@nestjs/testing@10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0):
resolution: {integrity: sha512-8DM+bw1qASCvaEnoHUQhypCOf54+G5R21MeFBMvnSk5DtKaWVZuzDP2GjLeYCpTH19WeP6LrrjHv3rX2LKU02A==}
peerDependencies:
......@@ -9120,7 +9030,7 @@ packages:
semver: 7.5.4
tapable: 2.2.1
typescript: 5.3.3
webpack: 5.89.0(@swc/core@1.3.103)
webpack: 5.89.0
dev: true
 
/form-data@3.0.1:
......
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