Skip to content

Commit

Permalink
fix: handle issue revocation list on the issuer
Browse files Browse the repository at this point in the history
Signed-off-by: Nam Hoang <[email protected]>
  • Loading branch information
namhoang1604 committed Jul 28, 2023
1 parent 974c8cc commit f069715
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 22 deletions.
2 changes: 1 addition & 1 deletion packages/core-types/src/types/IRevocationList2020.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ export interface IRevocationStore extends IPluginMethodMap {
getRevocationData(
args: IRevocationListDataArgs,
req: RequestWithAgent
): Promise<{ revocationListFullUrlPath: string; indexCounter: number }>;
): Promise<{ revocationListFullUrl: string; indexCounter: number }>;
getRevocationListVC(revocationListFullUrlPath: string): Promise<any>;
}
1 change: 0 additions & 1 deletion packages/encrypted-storage/src/encrypted-storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ export class EncryptedStorage implements IAgentPlugin {
args: IEncryptAndStoreDataArgs
): Promise<IEncrypteAndStoreDataResult> {
const { data } = args;
console.log('encryptAndStoreData', JSON.stringify(data, null, 2));
const credentialHash = computeEntryHash(data);
const key = generateEncryptionKey();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ export class EncryptedDataStore {
credentialEncryptedData.credentialHash = credentialHash;
credentialEncryptedData.encryptedDataId = result.id;
credentialEncryptedData.decryptedKey = decryptedKey;
console.log('credentialEncryptedData', credentialEncryptedData);

await db
.getRepository(CredentialEncryptedData)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createCredential, createList } from '@transmute/vc-status-rl-2020';
import { IRevocationListDataArgs } from '@vckit/core-types';
import { IIdentifier, IRevocationListDataArgs } from '@vckit/core-types';
import { OrPromise } from '@veramo/utils';
import { DataSource } from 'typeorm';
import {
Expand Down Expand Up @@ -43,6 +43,7 @@ export class RevocationDataStore {
{
credential: credentialList,
...rest,
proofFormat: 'lds',
}
);

Expand All @@ -54,28 +55,46 @@ export class RevocationDataStore {

async getRevocationData(
args: IRevocationListDataArgs
): Promise<{ revocationListFullUrlPath: string; indexCounter: number }> {
): Promise<{ revocationListFullUrl: string; indexCounter: number }> {
try {
const {
revocationListPath: revocationListUrlPath,
revocationVCIssuer,
bitStringLength,
req,
} = args;

let revocationVCIdentifier: IIdentifier;
try {
revocationVCIdentifier = (await req.agent?.execute('didManagerGet', {
did: revocationVCIssuer,
})) as IIdentifier;
} catch (e) {
throw new Error(
`invalid_argument: credential.issuer must be a DID managed by this agent. ${e}`
);
}
const revocationVCIssuerDid = revocationVCIdentifier.did.replaceAll(
':',
'_'
);

const revocationListUrlPathByIssuer = `${revocationListUrlPath}/${revocationVCIssuerDid}`;

const db = await getConnectedDb(this.dbConnection);

let revocationData = await db
.getRepository(RevocationData)
.findOne({ where: { revocationListUrlPath } });
let revocationData = await db.getRepository(RevocationData).findOne({
where: { revocationListUrlPath: revocationListUrlPathByIssuer },
});

if (!revocationData) {
revocationData = await db.getRepository(RevocationData).save({
revocationListUrlPath,
revocationListUrlPath: revocationListUrlPathByIssuer,
bitStringLength: Number(bitStringLength),
});
}

const revocationListFullUrlPath = `/credentials/status/revocation-list-2020/${revocationData.listCounter}`;
const revocationListFullUrlPath = `/credentials/status/revocation-list-2020/${revocationVCIssuerDid}/${revocationData.listCounter}`;

let revocationList = await db.getRepository(RevocationList).findOne({
where: {
Expand All @@ -86,7 +105,7 @@ export class RevocationDataStore {
// Not available - create one
if (!revocationList) {
revocationList = await this.createRevocationListVC(
`${revocationListUrlPath}${revocationListFullUrlPath}`,
`${revocationListUrlPathByIssuer}${revocationListFullUrlPath}`,
Number(bitStringLength),
revocationVCIssuer,
req
Expand All @@ -100,11 +119,12 @@ export class RevocationDataStore {

await this.updateRevocationData({
revocationData,
revocationVCIssuerDid,
args,
});

return {
revocationListFullUrlPath,
revocationListFullUrl: `${revocationListUrlPathByIssuer}${revocationListFullUrlPath}`,
indexCounter: revocationData.indexCounter,
};
} catch (err) {
Expand All @@ -114,9 +134,11 @@ export class RevocationDataStore {

async updateRevocationData({
revocationData,
revocationVCIssuerDid,
args,
}: {
revocationData: RevocationData;
revocationVCIssuerDid: string;
args: IRevocationListDataArgs;
}): Promise<void> {
try {
Expand All @@ -138,10 +160,11 @@ export class RevocationDataStore {
nextBitStringLength = Number(args.bitStringLength);
}

const revocationListFullUrlPath = `/credentials/status/revocation-list-2020/${nextList}`;
const revocationListFullUrlPath = `/credentials/status/revocation-list-2020/${revocationVCIssuerDid}/${nextList}`;
const revocationListUrlPathByIssuer = `${args.revocationListPath}/${revocationVCIssuerDid}`;

const revocationList = await this.createRevocationListVC(
`${args.revocationListPath}${revocationListFullUrlPath}`,
`${revocationListUrlPathByIssuer}${revocationListFullUrlPath}`,
Number(args.bitStringLength),
args.revocationVCIssuer,
args.req
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { RequestWithAgent } from '@vckit/core-types';
import { asArray, processEntryToArray } from '@veramo/utils';
import { asArray, extractIssuer, processEntryToArray } from '@veramo/utils';
import {
NextFunction,
Request,
Expand Down Expand Up @@ -37,10 +37,12 @@ export function revocationList2020(args: {
}

try {
const revocationVCIssuer = extractIssuer(req.body.credential);

const revocationData = await req.agent.execute('getRevocationData', {
revocationListPath: args.revocationListPath,
bitStringLength: args.bitStringLength,
revocationVCIssuer: args.revocationVCIssuer,
revocationVCIssuer,
req,
});

Expand All @@ -60,10 +62,10 @@ export function revocationList2020(args: {
}

req.body.credential.credentialStatus = {
id: `${args.revocationListPath}${revocationData.revocationListFullUrlPath}`,
id: revocationData.revocationListFullUrl,
type: 'RevocationList2020Status',
revocationListIndex: revocationData.indexCounter,
revocationListCredential: `${args.revocationListPath}${revocationData.revocationListFullUrlPath}`,
revocationListCredential: revocationData.revocationListFullUrl,
};

next();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ export function revocationList2020Router(): Router {
const router = Router();

// credentials/status/revocation-list-2020
router.get('/:id', async (req: RequestWithAgent, res: Response) => {
const { id } = req.params;
router.get('/:issuer/:id', async (req: RequestWithAgent, res: Response) => {
const { id, issuer } = req.params;
const agent = req.agent;
if (!agent) throw Error('Agent not available');

try {
const revocationListFullUrlPath = req.originalUrl;
const revocationListFullUrlPath = req.originalUrl.substring(
req.originalUrl.indexOf(issuer) + issuer.length
);

const result = await agent.execute(
'getRevocationListVC',
Expand Down
2 changes: 1 addition & 1 deletion packages/revocation-list-2020/src/revocation-list-2020.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export class RevocationStatus2020 implements IAgentPlugin {

async getRevocationData(
args: IRevocationListDataArgs
): Promise<{ revocationListFullUrlPath: string; indexCounter: number }> {
): Promise<{ revocationListFullUrl: string; indexCounter: number }> {
const data = await this.store.getRevocationData(args);

return data;
Expand Down

0 comments on commit f069715

Please sign in to comment.