@sphereon/ssi-sdk.vc-status-list-issuer-rest-api 0.34.1-feature.SSISDK.17.bitstring.sl.2 → 0.34.1-feature.SSISDK.17.bitstring.sl.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +20 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +20 -6
- package/dist/index.js.map +1 -1
- package/package.json +15 -15
- package/src/api-functions.ts +28 -7
package/dist/index.cjs
CHANGED
|
@@ -203,7 +203,8 @@ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
|
|
|
203
203
|
statusPurpose: details.statusList2021?.statusPurpose
|
|
204
204
|
} : {},
|
|
205
205
|
...details.type === import_ssi_types.StatusListType.BitstringStatusList ? {
|
|
206
|
-
statusPurpose: details.bitstringStatusList?.statusPurpose
|
|
206
|
+
statusPurpose: details.bitstringStatusList?.statusPurpose,
|
|
207
|
+
bitsPerStatus: details.bitstringStatusList?.bitsPerStatus
|
|
207
208
|
} : {},
|
|
208
209
|
type,
|
|
209
210
|
id: details.id,
|
|
@@ -217,10 +218,12 @@ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
|
|
|
217
218
|
};
|
|
218
219
|
}
|
|
219
220
|
response.statusCode = 200;
|
|
220
|
-
|
|
221
|
+
const result = {
|
|
221
222
|
...entry,
|
|
222
223
|
status
|
|
223
|
-
}
|
|
224
|
+
};
|
|
225
|
+
delete result.statusList;
|
|
226
|
+
return response.json(result);
|
|
224
227
|
} catch (e) {
|
|
225
228
|
return (0, import_ssi_express_support.sendErrorResponse)(response, 500, e.message, e);
|
|
226
229
|
}
|
|
@@ -274,6 +277,10 @@ function getStatusListCredentialIndexStatusEndpointLegacy(router, context, opts)
|
|
|
274
277
|
...details.type === import_ssi_types.StatusListType.StatusList2021 ? {
|
|
275
278
|
statusPurpose: details.statusList2021?.statusPurpose
|
|
276
279
|
} : {},
|
|
280
|
+
...details.type === import_ssi_types.StatusListType.BitstringStatusList ? {
|
|
281
|
+
statusPurpose: details.bitstringStatusList?.statusPurpose,
|
|
282
|
+
bitsPerStatus: details.bitstringStatusList?.bitsPerStatus
|
|
283
|
+
} : {},
|
|
277
284
|
type,
|
|
278
285
|
id: details.id,
|
|
279
286
|
statusListIndex
|
|
@@ -286,10 +293,12 @@ function getStatusListCredentialIndexStatusEndpointLegacy(router, context, opts)
|
|
|
286
293
|
};
|
|
287
294
|
}
|
|
288
295
|
response.statusCode = 200;
|
|
289
|
-
|
|
296
|
+
const result = {
|
|
290
297
|
...entry,
|
|
291
298
|
status
|
|
292
|
-
}
|
|
299
|
+
};
|
|
300
|
+
delete result.statusList;
|
|
301
|
+
return response.json(result);
|
|
293
302
|
} catch (e) {
|
|
294
303
|
return (0, import_ssi_express_support.sendErrorResponse)(response, 500, e.message, e);
|
|
295
304
|
}
|
|
@@ -370,7 +379,7 @@ function updateStatusEndpoint(router, context, opts) {
|
|
|
370
379
|
}
|
|
371
380
|
value = `${parseInt(updateItem.status)}`;
|
|
372
381
|
}
|
|
373
|
-
const updStatusListId = statusListId ?? statusListEntry.statusList?.id;
|
|
382
|
+
const updStatusListId = statusListId ?? ("statusList" in statusListEntry && statusListEntry.statusList?.id) ?? statusListEntry?.statusListId;
|
|
374
383
|
if (!updStatusListId) {
|
|
375
384
|
return (0, import_ssi_express_support.sendErrorResponse)(response, 400, "statuslist id could not be determined");
|
|
376
385
|
}
|
|
@@ -379,13 +388,18 @@ function updateStatusEndpoint(router, context, opts) {
|
|
|
379
388
|
statusListId: updStatusListId,
|
|
380
389
|
value
|
|
381
390
|
});
|
|
391
|
+
const bitsPerStatus = "bitsPerStatus" in statusListEntry && typeof statusListEntry.bitsPerStatus === "number" ? statusListEntry.bitsPerStatus : void 0;
|
|
382
392
|
statusListResult = await (0, import_ssi_sdk.updateStatusIndexFromStatusListCredential)({
|
|
383
393
|
statusListCredential,
|
|
384
394
|
statusListIndex: statusListEntry.statusListIndex,
|
|
395
|
+
...bitsPerStatus && {
|
|
396
|
+
bitsPerStatus
|
|
397
|
+
},
|
|
385
398
|
value: parseInt(value),
|
|
386
399
|
keyRef: opts.keyRef
|
|
387
400
|
}, context);
|
|
388
401
|
statusListResult = await driver.updateStatusList({
|
|
402
|
+
correlationId: statusListResult.correlationId,
|
|
389
403
|
statusListCredential: statusListResult.statusListCredential
|
|
390
404
|
});
|
|
391
405
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/statuslist-management-api-server.ts","../src/api-functions.ts","../src/types.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './statuslist-management-api-server'\nexport * from './types'\nexport * from './api-functions'\n","import { copyGlobalAuthToEndpoint, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { agentContext } from '@sphereon/ssi-sdk.core'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport {\n createNewStatusListEndpoint,\n getStatusListCredentialEndpoint,\n getStatusListCredentialIndexStatusEndpoint,\n getStatusListCredentialIndexStatusEndpointLegacy,\n updateStatusEndpoint,\n} from './api-functions'\nimport { IStatusListOpts } from './types'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\n\nexport class StatuslistManagementApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IStatusListOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins & IStatusListPlugin>; expressSupport: ExpressSupport; opts: IStatusListOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint({ opts, key: 'vcApiCredentialStatus' })\n copyGlobalAuthToEndpoint({ opts, key: 'createStatusList' })\n copyGlobalAuthToEndpoint({ opts, key: 'getStatusList' })\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n const features = opts?.enableFeatures ?? ['status-list-management', 'status-list-hosting', 'w3c-vc-api-credential-status']\n console.log(`Status List API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential Status (List) endpoints\n if (features.includes('status-list-management')) {\n createNewStatusListEndpoint(this.router, context, opts.endpointOpts.createStatusList)\n }\n if (features.includes('status-list-hosting')) {\n getStatusListCredentialEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpointLegacy(this.router, context, opts.endpointOpts.getStatusList)\n }\n if (features.includes('w3c-vc-api-credential-status')) {\n updateStatusEndpoint(this.router, context, opts.endpointOpts.vcApiCredentialStatus)\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IStatusListOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\n/*\nfunction copyGlobalAuthToEndpoint(opts: IStatusListOpts, key: string) {\n if (opts?.endpointOpts?.globalAuth) {\n // @ts-ignore\n opts.endpointOpts[key] = {\n // @ts-ignore\n ...opts.endpointOpts[key],\n // @ts-ignore\n endpoint: {...opts.endpointOpts.globalAuth, ...opts.endpointOpts[key]?.endpoint},\n }\n }\n}\n*/\n","import { checkAuth, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport {\n checkStatusIndexFromStatusListCredential,\n CreateNewStatusListFuncArgs,\n StatusListResult,\n updateStatusIndexFromStatusListCredential,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { getDriver } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport Debug from 'debug'\nimport { Request, Response, Router } from 'express'\nimport {\n EntryIdType,\n ICredentialStatusListEndpointOpts,\n IRequiredContext,\n IW3CredentialStatusEndpointOpts,\n StatusListIdType,\n UpdateIndexedCredentialStatusRequest,\n UpdateW3cCredentialStatusRequest,\n} from './types'\nimport { StatusListCredential, StatusListType } from '@sphereon/ssi-types'\nimport { IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'\n\nconst debug = Debug('sphereon:ssi-sdk:status-list')\n\nfunction sendStatuslistResponse(details: StatusListResult, statuslistPayload: StatusListCredential, response: Response) {\n let payload: Buffer | StatusListCredential\n\n switch (details.proofFormat) {\n case 'jwt':\n case 'cbor':\n payload = Buffer.from(statuslistPayload as string, 'ascii')\n break\n default:\n payload = statuslistPayload\n }\n\n return response.status(200).setHeader('Content-Type', details.statuslistContentType).send(payload)\n}\n\nfunction buildStatusListId(request: Request): string {\n const protocol = request.headers['x-forwarded-proto']?.toString() ?? request.protocol\n let host = request.headers['x-forwarded-host']?.toString() ?? request.get('host')\n const forwardedPort = request.headers['x-forwarded-port']?.toString()\n\n if (forwardedPort && !(protocol === 'https' && forwardedPort === '443') && !(protocol === 'http' && forwardedPort === '80')) {\n host += `:${forwardedPort}`\n }\n\n const forwardedPrefix = request.headers['x-forwarded-prefix']?.toString() ?? ''\n\n return `${protocol}://${host}${forwardedPrefix}${request.originalUrl.split('?')[0].replace(/\\/status\\/index\\/.*/, '')}`\n}\n\nexport function createNewStatusListEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Create new status list endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListArgs: CreateNewStatusListFuncArgs = request.body.statusList\n if (!statusListArgs) {\n return sendErrorResponse(response, 400, 'No statusList details supplied')\n }\n const details = await context.agent.slCreateStatusList(statusListArgs)\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const correlationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(correlationId ? { correlationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nfunction lookupType(details: StatusListResult) {\n return details.type === StatusListType.StatusList2021\n ? 'StatusList2021Entry'\n : details.type === StatusListType.BitstringStatusList\n ? 'BitstringStatusListEntry'\n : details.type\n}\n\nexport function getStatusListCredentialIndexStatusEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/status-lists/:statusListId/status/entry-by-id/:entryId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListIdType = (request.query.statusListIdType as StatusListIdType) ?? StatusListIdType.StatusListId\n const entryIdType = (request.query.entryIdType as EntryIdType) ?? EntryIdType.StatusListIndex\n\n let statusListIndex: number | undefined\n let entityCorrelationId: string | undefined\n let statusListId: string | undefined\n let statusListCorrelationId: string | undefined\n\n if (entryIdType === EntryIdType.StatusListIndex) {\n try {\n statusListIndex = Number.parseInt(request.params.entryId)\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } else {\n entityCorrelationId = request.params.entryId\n }\n\n if (statusListIdType === StatusListIdType.StatusListId) {\n statusListId = request.params.statusListId\n } else {\n statusListCorrelationId = request.params.statusListId\n }\n\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: statusListId }),\n dbName: opts.dbName,\n })\n\n const details = await driver.getStatusList()\n if (statusListIndex && statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex }),\n errorOnNotFound: false,\n })\n\n const type = lookupType(details)\n const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n ...(details.type === StatusListType.BitstringStatusList ? { statusPurpose: details.bitstringStatusList?.statusPurpose } : {}),\n type,\n id: details.id,\n statusListIndex: resultStatusIndex,\n })\n\n if (!entry) {\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex: resultStatusIndex,\n }\n }\n\n response.statusCode = 200\n return response.json({ ...entry, status })\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialIndexStatusEndpointLegacy(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index/status/index/:statusListIndex'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n const statusListIndexStr = request.params.statusListIndex\n let statusListIndex: number\n try {\n statusListIndex = Number.parseInt(statusListIndexStr)\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const statusListCorrelationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n if (statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n const entityCorrelationId = request.query.entityCorrelationId?.toString()\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex: statusListIndex }),\n errorOnNotFound: false,\n })\n const type = details.type === StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n type,\n id: details.id,\n statusListIndex,\n })\n if (!entry) {\n // The fact we have nothing on it means the status is okay\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex,\n }\n }\n response.statusCode = 200\n return response.json({ ...entry, status })\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function updateStatusEndpoint(router: Router, context: IRequiredContext, opts: IW3CredentialStatusEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Update credential status endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/status', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const updateRequest = request.body as UpdateW3cCredentialStatusRequest | UpdateIndexedCredentialStatusRequest\n const statusListId = updateRequest.statusListId ?? request.query.statusListId?.toString() ?? opts.statusListId // TODO why query params when we have a JSON body ??\n const statusListCorrelationId = updateRequest.statusListCorrelationId ?? request.query.statusListrelationId?.toString() ?? opts.correlationId\n const entryCorrelationId = updateRequest.entryCorrelationId ?? request.query.entryCorrelationId?.toString()\n\n // TODO: Move mostly to driver\n if (!statusListId && !statusListCorrelationId) {\n return sendErrorResponse(response, 400, 'No statusList id or correlation Id provided or deduced for the API or in the request')\n } else if (!updateRequest.credentialStatus || updateRequest.credentialStatus.length === 0) {\n return sendErrorResponse(response, 400, 'No statusList updates supplied')\n }\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n let statusListResult: StatusListResult = await driver.getStatusList()\n\n // Get status list entry based on request type\n let statusListEntry: IStatusListEntryEntity | undefined\n if ('credentialId' in updateRequest) {\n if (!updateRequest.credentialId) {\n return sendErrorResponse(response, 400, 'No credentialId supplied')\n }\n // unfortunately the W3C API works by credentialId. Which means you will have to map listIndices during issuance\n statusListEntry = await driver.getStatusListEntryByCredentialId({\n statusListId,\n statusListCorrelationId,\n entryCorrelationId,\n credentialId: updateRequest.credentialId,\n errorOnNotFound: true,\n })\n } else {\n statusListEntry = await driver.getStatusListEntryByIndex({\n ...(statusListResult.id && { statusListId: statusListResult.id }),\n ...(statusListResult.correlationId && { statusListCorrelationId: statusListResult.correlationId }),\n ...(entryCorrelationId ? { entryCorrelationId } : { statusListIndex: updateRequest.statusListIndex }),\n errorOnNotFound: true,\n })\n }\n\n if (!statusListEntry) {\n const identifier = 'credentialId' in updateRequest ? updateRequest.credentialId : `index ${updateRequest.statusListIndex}`\n return sendErrorResponse(response, 404, `Status list entry for ${identifier} not found for ${statusListId}`)\n }\n\n let statusListCredential = statusListResult.statusListCredential\n for (const updateItem of updateRequest.credentialStatus) {\n if (!updateItem.status) {\n return sendErrorResponse(response, 400, `Required 'status' value was missing in the credentialStatus array`)\n }\n\n let value: string = '1'\n if (updateItem.status === '0' || updateItem.status.toLowerCase() === 'false') {\n value = '0'\n } else if (updateItem.status !== '1' && updateItem.status.toLowerCase() !== 'true') {\n if (updateItem.type === StatusListType.StatusList2021) {\n // 2021 only allows 0 and 1\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n } else if (parseInt(updateItem.status) < 0 || parseInt(updateItem.status) > 255) {\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n }\n value = `${parseInt(updateItem.status)}`\n }\n\n const updStatusListId = statusListId ?? statusListEntry.statusList?.id // When input was statusListCorrelationId the statusList id should come from statusListEntry\n if (!updStatusListId) {\n return sendErrorResponse(response, 400, 'statuslist id could not be determined')\n }\n await driver.updateStatusListEntry({ ...statusListEntry, statusListId: updStatusListId, value })\n\n // todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well\n statusListResult = await updateStatusIndexFromStatusListCredential(\n {\n statusListCredential: statusListCredential,\n statusListIndex: statusListEntry.statusListIndex,\n value: parseInt(value),\n keyRef: opts.keyRef,\n },\n context,\n )\n statusListResult = await driver.updateStatusList({ statusListCredential: statusListResult.statusListCredential })\n }\n\n return sendStatuslistResponse(statusListResult, statusListResult.statusListCredential, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n","import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-support'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport { StatusListType } from '@sphereon/ssi-types'\nimport { IAgentContext } from '@veramo/core'\n\nexport type IRequiredContext = IAgentContext<IRequiredPlugins & IStatusListPlugin>\n\nexport interface IStatusListOpts {\n endpointOpts: IStatusListEndpointOpts\n enableFeatures?: statusListFeatures[] // Feature to enable. If not defined or empty, all features will be enabled\n}\n\nexport interface IStatusListEndpointOpts {\n basePath?: string\n globalAuth?: GenericAuthArgs\n vcApiCredentialStatus: IW3CredentialStatusEndpointOpts\n createStatusList: ICredentialStatusListEndpointOpts\n getStatusList: ICredentialStatusListEndpointOpts\n}\n\nexport type statusListFeatures = 'w3c-vc-api-credential-status' | 'status-list-management' | 'status-list-hosting'\n\nexport interface ICredentialStatusListEndpointOpts extends ISingleEndpointOpts {\n dbName: string\n}\n\nexport interface IW3CredentialStatusEndpointOpts extends ICredentialStatusListEndpointOpts {\n statusListId?: string\n correlationId?: string\n keyRef?: string\n}\n\nexport interface UpdateW3cCredentialStatusRequest extends UpdateCredentialStatusRequest {\n credentialId: string\n}\n\nexport interface UpdateIndexedCredentialStatusRequest extends UpdateCredentialStatusRequest {\n statusListIndex?: number\n}\n\ninterface UpdateCredentialStatusRequest {\n credentialStatus: UpdateCredentialStatusItem[]\n statusListId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n statusListCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n entryCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n}\n\nexport interface UpdateCredentialStatusItem {\n type?: StatusListType // makes very little sense, but listed in the spec. Would expect a purpose\n status: string\n}\n\nexport enum StatusListIdType {\n StatusListId = 'StatusListId',\n StatusListCorrelationId = 'StatusListCorrelationId',\n}\n\nexport enum EntryIdType {\n StatusListIndex = 'StatusListIndex',\n EntryCorrelationId = 'StatusListCorrelationId',\n}\n"],"mappings":"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","names":["import_ssi_express_support","import_ssi_sdk","import_ssi_sdk","StatusListIdType","EntryIdType","debug","Debug","sendStatuslistResponse","details","statuslistPayload","response","payload","proofFormat","Buffer","from","status","setHeader","statuslistContentType","send","buildStatusListId","request","protocol","headers","toString","host","get","forwardedPort","forwardedPrefix","originalUrl","split","replace","createNewStatusListEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","statusListArgs","body","statusList","sendErrorResponse","agent","slCreateStatusList","statusListCredential","e","message","getStatusListCredentialEndpoint","correlationId","query","driver","getDriver","id","dbName","getStatusList","lookupType","type","StatusListType","StatusList2021","BitstringStatusList","getStatusListCredentialIndexStatusEndpoint","statusListIdType","StatusListIdType","StatusListId","entryIdType","EntryIdType","StatusListIndex","statusListIndex","entityCorrelationId","statusListId","statusListCorrelationId","Number","parseInt","params","entryId","error","length","entry","getStatusListEntryByIndex","errorOnNotFound","resultStatusIndex","checkStatusIndexFromStatusListCredential","statusPurpose","statusList2021","bitstringStatusList","value","statusCode","json","getStatusListCredentialIndexStatusEndpointLegacy","statusListIndexStr","updateStatusEndpoint","JSON","stringify","updateRequest","statusListrelationId","entryCorrelationId","credentialStatus","statusListResult","statusListEntry","credentialId","getStatusListEntryByCredentialId","identifier","updateItem","toLowerCase","updStatusListId","updateStatusListEntry","updateStatusIndexFromStatusListCredential","keyRef","updateStatusList","StatuslistManagementApiServer","router","_router","_express","_agent","_opts","constructor","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","key","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createNewStatusListEndpoint","createStatusList","getStatusListCredentialEndpoint","getStatusList","getStatusListCredentialIndexStatusEndpoint","getStatusListCredentialIndexStatusEndpointLegacy","updateStatusEndpoint","vcApiCredentialStatus","use","basePath"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/statuslist-management-api-server.ts","../src/api-functions.ts","../src/types.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './statuslist-management-api-server'\nexport * from './types'\nexport * from './api-functions'\n","import { copyGlobalAuthToEndpoint, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { agentContext } from '@sphereon/ssi-sdk.core'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport {\n createNewStatusListEndpoint,\n getStatusListCredentialEndpoint,\n getStatusListCredentialIndexStatusEndpoint,\n getStatusListCredentialIndexStatusEndpointLegacy,\n updateStatusEndpoint,\n} from './api-functions'\nimport { IStatusListOpts } from './types'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\n\nexport class StatuslistManagementApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IStatusListOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins & IStatusListPlugin>; expressSupport: ExpressSupport; opts: IStatusListOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint({ opts, key: 'vcApiCredentialStatus' })\n copyGlobalAuthToEndpoint({ opts, key: 'createStatusList' })\n copyGlobalAuthToEndpoint({ opts, key: 'getStatusList' })\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n const features = opts?.enableFeatures ?? ['status-list-management', 'status-list-hosting', 'w3c-vc-api-credential-status']\n console.log(`Status List API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential Status (List) endpoints\n if (features.includes('status-list-management')) {\n createNewStatusListEndpoint(this.router, context, opts.endpointOpts.createStatusList)\n }\n if (features.includes('status-list-hosting')) {\n getStatusListCredentialEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpointLegacy(this.router, context, opts.endpointOpts.getStatusList)\n }\n if (features.includes('w3c-vc-api-credential-status')) {\n updateStatusEndpoint(this.router, context, opts.endpointOpts.vcApiCredentialStatus)\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IStatusListOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\n/*\nfunction copyGlobalAuthToEndpoint(opts: IStatusListOpts, key: string) {\n if (opts?.endpointOpts?.globalAuth) {\n // @ts-ignore\n opts.endpointOpts[key] = {\n // @ts-ignore\n ...opts.endpointOpts[key],\n // @ts-ignore\n endpoint: {...opts.endpointOpts.globalAuth, ...opts.endpointOpts[key]?.endpoint},\n }\n }\n}\n*/\n","import { checkAuth, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport {\n checkStatusIndexFromStatusListCredential,\n CreateNewStatusListFuncArgs,\n StatusListResult,\n updateStatusIndexFromStatusListCredential,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { getDriver } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport Debug from 'debug'\nimport { Request, Response, Router } from 'express'\nimport {\n EntryIdType,\n ICredentialStatusListEndpointOpts,\n IRequiredContext,\n IW3CredentialStatusEndpointOpts,\n StatusListIdType,\n UpdateIndexedCredentialStatusRequest,\n UpdateW3cCredentialStatusRequest,\n} from './types'\nimport { StatusListCredential, StatusListType } from '@sphereon/ssi-types'\nimport { IBitstringStatusListEntryEntity, IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'\n\nconst debug = Debug('sphereon:ssi-sdk:status-list')\n\nfunction sendStatuslistResponse(details: StatusListResult, statuslistPayload: StatusListCredential, response: Response) {\n let payload: Buffer | StatusListCredential\n\n switch (details.proofFormat) {\n case 'jwt':\n case 'cbor':\n payload = Buffer.from(statuslistPayload as string, 'ascii')\n break\n default:\n payload = statuslistPayload\n }\n\n return response.status(200).setHeader('Content-Type', details.statuslistContentType).send(payload)\n}\n\nfunction buildStatusListId(request: Request): string {\n const protocol = request.headers['x-forwarded-proto']?.toString() ?? request.protocol\n let host = request.headers['x-forwarded-host']?.toString() ?? request.get('host')\n const forwardedPort = request.headers['x-forwarded-port']?.toString()\n\n if (forwardedPort && !(protocol === 'https' && forwardedPort === '443') && !(protocol === 'http' && forwardedPort === '80')) {\n host += `:${forwardedPort}`\n }\n\n const forwardedPrefix = request.headers['x-forwarded-prefix']?.toString() ?? ''\n\n return `${protocol}://${host}${forwardedPrefix}${request.originalUrl.split('?')[0].replace(/\\/status\\/index\\/.*/, '')}`\n}\n\nexport function createNewStatusListEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Create new status list endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListArgs: CreateNewStatusListFuncArgs = request.body.statusList\n if (!statusListArgs) {\n return sendErrorResponse(response, 400, 'No statusList details supplied')\n }\n const details = await context.agent.slCreateStatusList(statusListArgs)\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const correlationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(correlationId ? { correlationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nfunction lookupType(details: StatusListResult) {\n return details.type === StatusListType.StatusList2021\n ? 'StatusList2021Entry'\n : details.type === StatusListType.BitstringStatusList\n ? 'BitstringStatusListEntry'\n : details.type\n}\n\nexport function getStatusListCredentialIndexStatusEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/status-lists/:statusListId/status/entry-by-id/:entryId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListIdType = (request.query.statusListIdType as StatusListIdType) ?? StatusListIdType.StatusListId\n const entryIdType = (request.query.entryIdType as EntryIdType) ?? EntryIdType.StatusListIndex\n\n let statusListIndex: number | undefined\n let entityCorrelationId: string | undefined\n let statusListId: string | undefined\n let statusListCorrelationId: string | undefined\n\n if (entryIdType === EntryIdType.StatusListIndex) {\n try {\n statusListIndex = Number.parseInt(request.params.entryId)\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } else {\n entityCorrelationId = request.params.entryId\n }\n\n if (statusListIdType === StatusListIdType.StatusListId) {\n statusListId = request.params.statusListId\n } else {\n statusListCorrelationId = request.params.statusListId\n }\n\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: statusListId }),\n dbName: opts.dbName,\n })\n\n const details = await driver.getStatusList()\n if (statusListIndex && statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex }),\n errorOnNotFound: false,\n })\n\n const type = lookupType(details)\n const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n ...(details.type === StatusListType.BitstringStatusList\n ? {\n statusPurpose: details.bitstringStatusList?.statusPurpose,\n bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,\n }\n : {}),\n type,\n id: details.id,\n statusListIndex: resultStatusIndex,\n })\n\n if (!entry) {\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex: resultStatusIndex,\n }\n }\n\n response.statusCode = 200\n const result = { ...entry, status }\n delete result.statusList // we asked for the status, not the entire list\n return response.json(result)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialIndexStatusEndpointLegacy(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index/status/index/:statusListIndex'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n const statusListIndexStr = request.params.statusListIndex\n let statusListIndex: number\n try {\n statusListIndex = Number.parseInt(statusListIndexStr)\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const statusListCorrelationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n if (statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n const entityCorrelationId = request.query.entityCorrelationId?.toString()\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex: statusListIndex }),\n errorOnNotFound: false,\n })\n const type = details.type === StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n ...(details.type === StatusListType.BitstringStatusList\n ? {\n statusPurpose: details.bitstringStatusList?.statusPurpose,\n bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,\n }\n : {}),\n type,\n id: details.id,\n statusListIndex,\n })\n if (!entry) {\n // The fact we have nothing on it means the status is okay\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex,\n }\n }\n response.statusCode = 200\n const result = { ...entry, status }\n delete result.statusList // we asked for the status, not the entire list\n return response.json(result)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function updateStatusEndpoint(router: Router, context: IRequiredContext, opts: IW3CredentialStatusEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Update credential status endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/status', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const updateRequest = request.body as UpdateW3cCredentialStatusRequest | UpdateIndexedCredentialStatusRequest\n const statusListId = updateRequest.statusListId ?? request.query.statusListId?.toString() ?? opts.statusListId // TODO why query params when we have a JSON body ??\n const statusListCorrelationId = updateRequest.statusListCorrelationId ?? request.query.statusListrelationId?.toString() ?? opts.correlationId\n const entryCorrelationId = updateRequest.entryCorrelationId ?? request.query.entryCorrelationId?.toString()\n\n // TODO: Move mostly to driver\n if (!statusListId && !statusListCorrelationId) {\n return sendErrorResponse(response, 400, 'No statusList id or correlation Id provided or deduced for the API or in the request')\n } else if (!updateRequest.credentialStatus || updateRequest.credentialStatus.length === 0) {\n return sendErrorResponse(response, 400, 'No statusList updates supplied')\n }\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n let statusListResult: StatusListResult = await driver.getStatusList()\n\n // Get status list entry based on request type\n let statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined\n if ('credentialId' in updateRequest) {\n if (!updateRequest.credentialId) {\n return sendErrorResponse(response, 400, 'No credentialId supplied')\n }\n // unfortunately the W3C API works by credentialId. Which means you will have to map listIndices during issuance\n statusListEntry = await driver.getStatusListEntryByCredentialId({\n statusListId,\n statusListCorrelationId,\n entryCorrelationId,\n credentialId: updateRequest.credentialId,\n errorOnNotFound: true,\n })\n } else {\n statusListEntry = await driver.getStatusListEntryByIndex({\n ...(statusListResult.id && { statusListId: statusListResult.id }),\n ...(statusListResult.correlationId && { statusListCorrelationId: statusListResult.correlationId }),\n ...(entryCorrelationId ? { entryCorrelationId } : { statusListIndex: updateRequest.statusListIndex }),\n errorOnNotFound: true,\n })\n }\n\n if (!statusListEntry) {\n const identifier = 'credentialId' in updateRequest ? updateRequest.credentialId : `index ${updateRequest.statusListIndex}`\n return sendErrorResponse(response, 404, `Status list entry for ${identifier} not found for ${statusListId}`)\n }\n\n let statusListCredential = statusListResult.statusListCredential\n for (const updateItem of updateRequest.credentialStatus) {\n if (!updateItem.status) {\n return sendErrorResponse(response, 400, `Required 'status' value was missing in the credentialStatus array`)\n }\n\n let value: string = '1'\n if (updateItem.status === '0' || updateItem.status.toLowerCase() === 'false') {\n value = '0'\n } else if (updateItem.status !== '1' && updateItem.status.toLowerCase() !== 'true') {\n if (updateItem.type === StatusListType.StatusList2021) {\n // 2021 only allows 0 and 1\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n } else if (parseInt(updateItem.status) < 0 || parseInt(updateItem.status) > 255) {\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n }\n value = `${parseInt(updateItem.status)}`\n }\n\n const updStatusListId = statusListId ?? ('statusList' in statusListEntry && statusListEntry.statusList?.id) ?? statusListEntry?.statusListId // When input was statusListCorrelationId the statusList id should come from statusListEntry\n if (!updStatusListId) {\n return sendErrorResponse(response, 400, 'statuslist id could not be determined')\n }\n await driver.updateStatusListEntry({ ...statusListEntry, statusListId: updStatusListId, value })\n const bitsPerStatus =\n 'bitsPerStatus' in statusListEntry && typeof statusListEntry.bitsPerStatus === 'number' ? statusListEntry.bitsPerStatus : undefined\n\n // todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well\n statusListResult = await updateStatusIndexFromStatusListCredential(\n {\n statusListCredential: statusListCredential,\n statusListIndex: statusListEntry.statusListIndex,\n ...(bitsPerStatus && { bitsPerStatus }),\n value: parseInt(value),\n keyRef: opts.keyRef,\n },\n context,\n )\n statusListResult = await driver.updateStatusList({\n correlationId: statusListResult.correlationId!, // FIXME?\n statusListCredential: statusListResult.statusListCredential,\n })\n }\n\n return sendStatuslistResponse(statusListResult, statusListResult.statusListCredential, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n","import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-support'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport { StatusListType } from '@sphereon/ssi-types'\nimport { IAgentContext } from '@veramo/core'\n\nexport type IRequiredContext = IAgentContext<IRequiredPlugins & IStatusListPlugin>\n\nexport interface IStatusListOpts {\n endpointOpts: IStatusListEndpointOpts\n enableFeatures?: statusListFeatures[] // Feature to enable. If not defined or empty, all features will be enabled\n}\n\nexport interface IStatusListEndpointOpts {\n basePath?: string\n globalAuth?: GenericAuthArgs\n vcApiCredentialStatus: IW3CredentialStatusEndpointOpts\n createStatusList: ICredentialStatusListEndpointOpts\n getStatusList: ICredentialStatusListEndpointOpts\n}\n\nexport type statusListFeatures = 'w3c-vc-api-credential-status' | 'status-list-management' | 'status-list-hosting'\n\nexport interface ICredentialStatusListEndpointOpts extends ISingleEndpointOpts {\n dbName: string\n}\n\nexport interface IW3CredentialStatusEndpointOpts extends ICredentialStatusListEndpointOpts {\n statusListId?: string\n correlationId?: string\n keyRef?: string\n}\n\nexport interface UpdateW3cCredentialStatusRequest extends UpdateCredentialStatusRequest {\n credentialId: string\n}\n\nexport interface UpdateIndexedCredentialStatusRequest extends UpdateCredentialStatusRequest {\n statusListIndex?: number\n}\n\ninterface UpdateCredentialStatusRequest {\n credentialStatus: UpdateCredentialStatusItem[]\n statusListId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n statusListCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n entryCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n}\n\nexport interface UpdateCredentialStatusItem {\n type?: StatusListType // makes very little sense, but listed in the spec. Would expect a purpose\n status: string\n}\n\nexport enum StatusListIdType {\n StatusListId = 'StatusListId',\n StatusListCorrelationId = 'StatusListCorrelationId',\n}\n\nexport enum EntryIdType {\n StatusListIndex = 'StatusListIndex',\n EntryCorrelationId = 'StatusListCorrelationId',\n}\n"],"mappings":"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","names":["import_ssi_express_support","import_ssi_sdk","import_ssi_sdk","StatusListIdType","EntryIdType","debug","Debug","sendStatuslistResponse","details","statuslistPayload","response","payload","proofFormat","Buffer","from","status","setHeader","statuslistContentType","send","buildStatusListId","request","protocol","headers","toString","host","get","forwardedPort","forwardedPrefix","originalUrl","split","replace","createNewStatusListEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","statusListArgs","body","statusList","sendErrorResponse","agent","slCreateStatusList","statusListCredential","e","message","getStatusListCredentialEndpoint","correlationId","query","driver","getDriver","id","dbName","getStatusList","lookupType","type","StatusListType","StatusList2021","BitstringStatusList","getStatusListCredentialIndexStatusEndpoint","statusListIdType","StatusListIdType","StatusListId","entryIdType","EntryIdType","StatusListIndex","statusListIndex","entityCorrelationId","statusListId","statusListCorrelationId","Number","parseInt","params","entryId","error","length","entry","getStatusListEntryByIndex","errorOnNotFound","resultStatusIndex","checkStatusIndexFromStatusListCredential","statusPurpose","statusList2021","bitstringStatusList","bitsPerStatus","value","statusCode","result","json","getStatusListCredentialIndexStatusEndpointLegacy","statusListIndexStr","updateStatusEndpoint","JSON","stringify","updateRequest","statusListrelationId","entryCorrelationId","credentialStatus","statusListResult","statusListEntry","credentialId","getStatusListEntryByCredentialId","identifier","updateItem","toLowerCase","updStatusListId","updateStatusListEntry","undefined","updateStatusIndexFromStatusListCredential","keyRef","updateStatusList","StatuslistManagementApiServer","router","_router","_express","_agent","_opts","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","key","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createNewStatusListEndpoint","createStatusList","getStatusListCredentialEndpoint","getStatusList","getStatusListCredentialIndexStatusEndpoint","getStatusListCredentialIndexStatusEndpointLegacy","updateStatusEndpoint","vcApiCredentialStatus","use","basePath"]}
|
package/dist/index.js
CHANGED
|
@@ -162,7 +162,8 @@ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
|
|
|
162
162
|
statusPurpose: details.statusList2021?.statusPurpose
|
|
163
163
|
} : {},
|
|
164
164
|
...details.type === StatusListType.BitstringStatusList ? {
|
|
165
|
-
statusPurpose: details.bitstringStatusList?.statusPurpose
|
|
165
|
+
statusPurpose: details.bitstringStatusList?.statusPurpose,
|
|
166
|
+
bitsPerStatus: details.bitstringStatusList?.bitsPerStatus
|
|
166
167
|
} : {},
|
|
167
168
|
type,
|
|
168
169
|
id: details.id,
|
|
@@ -176,10 +177,12 @@ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
|
|
|
176
177
|
};
|
|
177
178
|
}
|
|
178
179
|
response.statusCode = 200;
|
|
179
|
-
|
|
180
|
+
const result = {
|
|
180
181
|
...entry,
|
|
181
182
|
status
|
|
182
|
-
}
|
|
183
|
+
};
|
|
184
|
+
delete result.statusList;
|
|
185
|
+
return response.json(result);
|
|
183
186
|
} catch (e) {
|
|
184
187
|
return sendErrorResponse(response, 500, e.message, e);
|
|
185
188
|
}
|
|
@@ -233,6 +236,10 @@ function getStatusListCredentialIndexStatusEndpointLegacy(router, context, opts)
|
|
|
233
236
|
...details.type === StatusListType.StatusList2021 ? {
|
|
234
237
|
statusPurpose: details.statusList2021?.statusPurpose
|
|
235
238
|
} : {},
|
|
239
|
+
...details.type === StatusListType.BitstringStatusList ? {
|
|
240
|
+
statusPurpose: details.bitstringStatusList?.statusPurpose,
|
|
241
|
+
bitsPerStatus: details.bitstringStatusList?.bitsPerStatus
|
|
242
|
+
} : {},
|
|
236
243
|
type,
|
|
237
244
|
id: details.id,
|
|
238
245
|
statusListIndex
|
|
@@ -245,10 +252,12 @@ function getStatusListCredentialIndexStatusEndpointLegacy(router, context, opts)
|
|
|
245
252
|
};
|
|
246
253
|
}
|
|
247
254
|
response.statusCode = 200;
|
|
248
|
-
|
|
255
|
+
const result = {
|
|
249
256
|
...entry,
|
|
250
257
|
status
|
|
251
|
-
}
|
|
258
|
+
};
|
|
259
|
+
delete result.statusList;
|
|
260
|
+
return response.json(result);
|
|
252
261
|
} catch (e) {
|
|
253
262
|
return sendErrorResponse(response, 500, e.message, e);
|
|
254
263
|
}
|
|
@@ -329,7 +338,7 @@ function updateStatusEndpoint(router, context, opts) {
|
|
|
329
338
|
}
|
|
330
339
|
value = `${parseInt(updateItem.status)}`;
|
|
331
340
|
}
|
|
332
|
-
const updStatusListId = statusListId ?? statusListEntry.statusList?.id;
|
|
341
|
+
const updStatusListId = statusListId ?? ("statusList" in statusListEntry && statusListEntry.statusList?.id) ?? statusListEntry?.statusListId;
|
|
333
342
|
if (!updStatusListId) {
|
|
334
343
|
return sendErrorResponse(response, 400, "statuslist id could not be determined");
|
|
335
344
|
}
|
|
@@ -338,13 +347,18 @@ function updateStatusEndpoint(router, context, opts) {
|
|
|
338
347
|
statusListId: updStatusListId,
|
|
339
348
|
value
|
|
340
349
|
});
|
|
350
|
+
const bitsPerStatus = "bitsPerStatus" in statusListEntry && typeof statusListEntry.bitsPerStatus === "number" ? statusListEntry.bitsPerStatus : void 0;
|
|
341
351
|
statusListResult = await updateStatusIndexFromStatusListCredential({
|
|
342
352
|
statusListCredential,
|
|
343
353
|
statusListIndex: statusListEntry.statusListIndex,
|
|
354
|
+
...bitsPerStatus && {
|
|
355
|
+
bitsPerStatus
|
|
356
|
+
},
|
|
344
357
|
value: parseInt(value),
|
|
345
358
|
keyRef: opts.keyRef
|
|
346
359
|
}, context);
|
|
347
360
|
statusListResult = await driver.updateStatusList({
|
|
361
|
+
correlationId: statusListResult.correlationId,
|
|
348
362
|
statusListCredential: statusListResult.statusListCredential
|
|
349
363
|
});
|
|
350
364
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/statuslist-management-api-server.ts","../src/api-functions.ts","../src/types.ts"],"sourcesContent":["import { copyGlobalAuthToEndpoint, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { agentContext } from '@sphereon/ssi-sdk.core'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport {\n createNewStatusListEndpoint,\n getStatusListCredentialEndpoint,\n getStatusListCredentialIndexStatusEndpoint,\n getStatusListCredentialIndexStatusEndpointLegacy,\n updateStatusEndpoint,\n} from './api-functions'\nimport { IStatusListOpts } from './types'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\n\nexport class StatuslistManagementApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IStatusListOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins & IStatusListPlugin>; expressSupport: ExpressSupport; opts: IStatusListOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint({ opts, key: 'vcApiCredentialStatus' })\n copyGlobalAuthToEndpoint({ opts, key: 'createStatusList' })\n copyGlobalAuthToEndpoint({ opts, key: 'getStatusList' })\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n const features = opts?.enableFeatures ?? ['status-list-management', 'status-list-hosting', 'w3c-vc-api-credential-status']\n console.log(`Status List API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential Status (List) endpoints\n if (features.includes('status-list-management')) {\n createNewStatusListEndpoint(this.router, context, opts.endpointOpts.createStatusList)\n }\n if (features.includes('status-list-hosting')) {\n getStatusListCredentialEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpointLegacy(this.router, context, opts.endpointOpts.getStatusList)\n }\n if (features.includes('w3c-vc-api-credential-status')) {\n updateStatusEndpoint(this.router, context, opts.endpointOpts.vcApiCredentialStatus)\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IStatusListOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\n/*\nfunction copyGlobalAuthToEndpoint(opts: IStatusListOpts, key: string) {\n if (opts?.endpointOpts?.globalAuth) {\n // @ts-ignore\n opts.endpointOpts[key] = {\n // @ts-ignore\n ...opts.endpointOpts[key],\n // @ts-ignore\n endpoint: {...opts.endpointOpts.globalAuth, ...opts.endpointOpts[key]?.endpoint},\n }\n }\n}\n*/\n","import { checkAuth, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport {\n checkStatusIndexFromStatusListCredential,\n CreateNewStatusListFuncArgs,\n StatusListResult,\n updateStatusIndexFromStatusListCredential,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { getDriver } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport Debug from 'debug'\nimport { Request, Response, Router } from 'express'\nimport {\n EntryIdType,\n ICredentialStatusListEndpointOpts,\n IRequiredContext,\n IW3CredentialStatusEndpointOpts,\n StatusListIdType,\n UpdateIndexedCredentialStatusRequest,\n UpdateW3cCredentialStatusRequest,\n} from './types'\nimport { StatusListCredential, StatusListType } from '@sphereon/ssi-types'\nimport { IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'\n\nconst debug = Debug('sphereon:ssi-sdk:status-list')\n\nfunction sendStatuslistResponse(details: StatusListResult, statuslistPayload: StatusListCredential, response: Response) {\n let payload: Buffer | StatusListCredential\n\n switch (details.proofFormat) {\n case 'jwt':\n case 'cbor':\n payload = Buffer.from(statuslistPayload as string, 'ascii')\n break\n default:\n payload = statuslistPayload\n }\n\n return response.status(200).setHeader('Content-Type', details.statuslistContentType).send(payload)\n}\n\nfunction buildStatusListId(request: Request): string {\n const protocol = request.headers['x-forwarded-proto']?.toString() ?? request.protocol\n let host = request.headers['x-forwarded-host']?.toString() ?? request.get('host')\n const forwardedPort = request.headers['x-forwarded-port']?.toString()\n\n if (forwardedPort && !(protocol === 'https' && forwardedPort === '443') && !(protocol === 'http' && forwardedPort === '80')) {\n host += `:${forwardedPort}`\n }\n\n const forwardedPrefix = request.headers['x-forwarded-prefix']?.toString() ?? ''\n\n return `${protocol}://${host}${forwardedPrefix}${request.originalUrl.split('?')[0].replace(/\\/status\\/index\\/.*/, '')}`\n}\n\nexport function createNewStatusListEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Create new status list endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListArgs: CreateNewStatusListFuncArgs = request.body.statusList\n if (!statusListArgs) {\n return sendErrorResponse(response, 400, 'No statusList details supplied')\n }\n const details = await context.agent.slCreateStatusList(statusListArgs)\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const correlationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(correlationId ? { correlationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nfunction lookupType(details: StatusListResult) {\n return details.type === StatusListType.StatusList2021\n ? 'StatusList2021Entry'\n : details.type === StatusListType.BitstringStatusList\n ? 'BitstringStatusListEntry'\n : details.type\n}\n\nexport function getStatusListCredentialIndexStatusEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/status-lists/:statusListId/status/entry-by-id/:entryId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListIdType = (request.query.statusListIdType as StatusListIdType) ?? StatusListIdType.StatusListId\n const entryIdType = (request.query.entryIdType as EntryIdType) ?? EntryIdType.StatusListIndex\n\n let statusListIndex: number | undefined\n let entityCorrelationId: string | undefined\n let statusListId: string | undefined\n let statusListCorrelationId: string | undefined\n\n if (entryIdType === EntryIdType.StatusListIndex) {\n try {\n statusListIndex = Number.parseInt(request.params.entryId)\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } else {\n entityCorrelationId = request.params.entryId\n }\n\n if (statusListIdType === StatusListIdType.StatusListId) {\n statusListId = request.params.statusListId\n } else {\n statusListCorrelationId = request.params.statusListId\n }\n\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: statusListId }),\n dbName: opts.dbName,\n })\n\n const details = await driver.getStatusList()\n if (statusListIndex && statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex }),\n errorOnNotFound: false,\n })\n\n const type = lookupType(details)\n const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n ...(details.type === StatusListType.BitstringStatusList ? { statusPurpose: details.bitstringStatusList?.statusPurpose } : {}),\n type,\n id: details.id,\n statusListIndex: resultStatusIndex,\n })\n\n if (!entry) {\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex: resultStatusIndex,\n }\n }\n\n response.statusCode = 200\n return response.json({ ...entry, status })\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialIndexStatusEndpointLegacy(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index/status/index/:statusListIndex'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n const statusListIndexStr = request.params.statusListIndex\n let statusListIndex: number\n try {\n statusListIndex = Number.parseInt(statusListIndexStr)\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const statusListCorrelationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n if (statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n const entityCorrelationId = request.query.entityCorrelationId?.toString()\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex: statusListIndex }),\n errorOnNotFound: false,\n })\n const type = details.type === StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n type,\n id: details.id,\n statusListIndex,\n })\n if (!entry) {\n // The fact we have nothing on it means the status is okay\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex,\n }\n }\n response.statusCode = 200\n return response.json({ ...entry, status })\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function updateStatusEndpoint(router: Router, context: IRequiredContext, opts: IW3CredentialStatusEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Update credential status endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/status', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const updateRequest = request.body as UpdateW3cCredentialStatusRequest | UpdateIndexedCredentialStatusRequest\n const statusListId = updateRequest.statusListId ?? request.query.statusListId?.toString() ?? opts.statusListId // TODO why query params when we have a JSON body ??\n const statusListCorrelationId = updateRequest.statusListCorrelationId ?? request.query.statusListrelationId?.toString() ?? opts.correlationId\n const entryCorrelationId = updateRequest.entryCorrelationId ?? request.query.entryCorrelationId?.toString()\n\n // TODO: Move mostly to driver\n if (!statusListId && !statusListCorrelationId) {\n return sendErrorResponse(response, 400, 'No statusList id or correlation Id provided or deduced for the API or in the request')\n } else if (!updateRequest.credentialStatus || updateRequest.credentialStatus.length === 0) {\n return sendErrorResponse(response, 400, 'No statusList updates supplied')\n }\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n let statusListResult: StatusListResult = await driver.getStatusList()\n\n // Get status list entry based on request type\n let statusListEntry: IStatusListEntryEntity | undefined\n if ('credentialId' in updateRequest) {\n if (!updateRequest.credentialId) {\n return sendErrorResponse(response, 400, 'No credentialId supplied')\n }\n // unfortunately the W3C API works by credentialId. Which means you will have to map listIndices during issuance\n statusListEntry = await driver.getStatusListEntryByCredentialId({\n statusListId,\n statusListCorrelationId,\n entryCorrelationId,\n credentialId: updateRequest.credentialId,\n errorOnNotFound: true,\n })\n } else {\n statusListEntry = await driver.getStatusListEntryByIndex({\n ...(statusListResult.id && { statusListId: statusListResult.id }),\n ...(statusListResult.correlationId && { statusListCorrelationId: statusListResult.correlationId }),\n ...(entryCorrelationId ? { entryCorrelationId } : { statusListIndex: updateRequest.statusListIndex }),\n errorOnNotFound: true,\n })\n }\n\n if (!statusListEntry) {\n const identifier = 'credentialId' in updateRequest ? updateRequest.credentialId : `index ${updateRequest.statusListIndex}`\n return sendErrorResponse(response, 404, `Status list entry for ${identifier} not found for ${statusListId}`)\n }\n\n let statusListCredential = statusListResult.statusListCredential\n for (const updateItem of updateRequest.credentialStatus) {\n if (!updateItem.status) {\n return sendErrorResponse(response, 400, `Required 'status' value was missing in the credentialStatus array`)\n }\n\n let value: string = '1'\n if (updateItem.status === '0' || updateItem.status.toLowerCase() === 'false') {\n value = '0'\n } else if (updateItem.status !== '1' && updateItem.status.toLowerCase() !== 'true') {\n if (updateItem.type === StatusListType.StatusList2021) {\n // 2021 only allows 0 and 1\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n } else if (parseInt(updateItem.status) < 0 || parseInt(updateItem.status) > 255) {\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n }\n value = `${parseInt(updateItem.status)}`\n }\n\n const updStatusListId = statusListId ?? statusListEntry.statusList?.id // When input was statusListCorrelationId the statusList id should come from statusListEntry\n if (!updStatusListId) {\n return sendErrorResponse(response, 400, 'statuslist id could not be determined')\n }\n await driver.updateStatusListEntry({ ...statusListEntry, statusListId: updStatusListId, value })\n\n // todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well\n statusListResult = await updateStatusIndexFromStatusListCredential(\n {\n statusListCredential: statusListCredential,\n statusListIndex: statusListEntry.statusListIndex,\n value: parseInt(value),\n keyRef: opts.keyRef,\n },\n context,\n )\n statusListResult = await driver.updateStatusList({ statusListCredential: statusListResult.statusListCredential })\n }\n\n return sendStatuslistResponse(statusListResult, statusListResult.statusListCredential, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n","import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-support'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport { StatusListType } from '@sphereon/ssi-types'\nimport { IAgentContext } from '@veramo/core'\n\nexport type IRequiredContext = IAgentContext<IRequiredPlugins & IStatusListPlugin>\n\nexport interface IStatusListOpts {\n endpointOpts: IStatusListEndpointOpts\n enableFeatures?: statusListFeatures[] // Feature to enable. If not defined or empty, all features will be enabled\n}\n\nexport interface IStatusListEndpointOpts {\n basePath?: string\n globalAuth?: GenericAuthArgs\n vcApiCredentialStatus: IW3CredentialStatusEndpointOpts\n createStatusList: ICredentialStatusListEndpointOpts\n getStatusList: ICredentialStatusListEndpointOpts\n}\n\nexport type statusListFeatures = 'w3c-vc-api-credential-status' | 'status-list-management' | 'status-list-hosting'\n\nexport interface ICredentialStatusListEndpointOpts extends ISingleEndpointOpts {\n dbName: string\n}\n\nexport interface IW3CredentialStatusEndpointOpts extends ICredentialStatusListEndpointOpts {\n statusListId?: string\n correlationId?: string\n keyRef?: string\n}\n\nexport interface UpdateW3cCredentialStatusRequest extends UpdateCredentialStatusRequest {\n credentialId: string\n}\n\nexport interface UpdateIndexedCredentialStatusRequest extends UpdateCredentialStatusRequest {\n statusListIndex?: number\n}\n\ninterface UpdateCredentialStatusRequest {\n credentialStatus: UpdateCredentialStatusItem[]\n statusListId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n statusListCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n entryCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n}\n\nexport interface UpdateCredentialStatusItem {\n type?: StatusListType // makes very little sense, but listed in the spec. Would expect a purpose\n status: string\n}\n\nexport enum StatusListIdType {\n StatusListId = 'StatusListId',\n StatusListCorrelationId = 'StatusListCorrelationId',\n}\n\nexport enum EntryIdType {\n StatusListIndex = 'StatusListIndex',\n EntryCorrelationId = 'StatusListCorrelationId',\n}\n"],"mappings":"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","names":["copyGlobalAuthToEndpoint","agentContext","express","checkAuth","sendErrorResponse","checkStatusIndexFromStatusListCredential","updateStatusIndexFromStatusListCredential","getDriver","Debug","StatusListIdType","EntryIdType","StatusListType","debug","Debug","sendStatuslistResponse","details","statuslistPayload","response","payload","proofFormat","Buffer","from","status","setHeader","statuslistContentType","send","buildStatusListId","request","protocol","headers","toString","host","get","forwardedPort","forwardedPrefix","originalUrl","split","replace","createNewStatusListEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","statusListArgs","body","statusList","sendErrorResponse","agent","slCreateStatusList","statusListCredential","e","message","getStatusListCredentialEndpoint","correlationId","query","driver","getDriver","id","dbName","getStatusList","lookupType","type","StatusListType","StatusList2021","BitstringStatusList","getStatusListCredentialIndexStatusEndpoint","statusListIdType","StatusListIdType","StatusListId","entryIdType","EntryIdType","StatusListIndex","statusListIndex","entityCorrelationId","statusListId","statusListCorrelationId","Number","parseInt","params","entryId","error","length","entry","getStatusListEntryByIndex","errorOnNotFound","resultStatusIndex","checkStatusIndexFromStatusListCredential","statusPurpose","statusList2021","bitstringStatusList","value","statusCode","json","getStatusListCredentialIndexStatusEndpointLegacy","statusListIndexStr","updateStatusEndpoint","JSON","stringify","updateRequest","statusListrelationId","entryCorrelationId","credentialStatus","statusListResult","statusListEntry","credentialId","getStatusListEntryByCredentialId","identifier","updateItem","toLowerCase","updStatusListId","updateStatusListEntry","updateStatusIndexFromStatusListCredential","keyRef","updateStatusList","StatuslistManagementApiServer","router","_router","_express","_agent","_opts","constructor","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","key","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createNewStatusListEndpoint","createStatusList","getStatusListCredentialEndpoint","getStatusList","getStatusListCredentialIndexStatusEndpoint","getStatusListCredentialIndexStatusEndpointLegacy","updateStatusEndpoint","vcApiCredentialStatus","use","basePath"]}
|
|
1
|
+
{"version":3,"sources":["../src/statuslist-management-api-server.ts","../src/api-functions.ts","../src/types.ts"],"sourcesContent":["import { copyGlobalAuthToEndpoint, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { agentContext } from '@sphereon/ssi-sdk.core'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport {\n createNewStatusListEndpoint,\n getStatusListCredentialEndpoint,\n getStatusListCredentialIndexStatusEndpoint,\n getStatusListCredentialIndexStatusEndpointLegacy,\n updateStatusEndpoint,\n} from './api-functions'\nimport { IStatusListOpts } from './types'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\n\nexport class StatuslistManagementApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IStatusListOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins & IStatusListPlugin>; expressSupport: ExpressSupport; opts: IStatusListOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint({ opts, key: 'vcApiCredentialStatus' })\n copyGlobalAuthToEndpoint({ opts, key: 'createStatusList' })\n copyGlobalAuthToEndpoint({ opts, key: 'getStatusList' })\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n const features = opts?.enableFeatures ?? ['status-list-management', 'status-list-hosting', 'w3c-vc-api-credential-status']\n console.log(`Status List API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential Status (List) endpoints\n if (features.includes('status-list-management')) {\n createNewStatusListEndpoint(this.router, context, opts.endpointOpts.createStatusList)\n }\n if (features.includes('status-list-hosting')) {\n getStatusListCredentialEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpointLegacy(this.router, context, opts.endpointOpts.getStatusList)\n }\n if (features.includes('w3c-vc-api-credential-status')) {\n updateStatusEndpoint(this.router, context, opts.endpointOpts.vcApiCredentialStatus)\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IStatusListOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\n/*\nfunction copyGlobalAuthToEndpoint(opts: IStatusListOpts, key: string) {\n if (opts?.endpointOpts?.globalAuth) {\n // @ts-ignore\n opts.endpointOpts[key] = {\n // @ts-ignore\n ...opts.endpointOpts[key],\n // @ts-ignore\n endpoint: {...opts.endpointOpts.globalAuth, ...opts.endpointOpts[key]?.endpoint},\n }\n }\n}\n*/\n","import { checkAuth, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport {\n checkStatusIndexFromStatusListCredential,\n CreateNewStatusListFuncArgs,\n StatusListResult,\n updateStatusIndexFromStatusListCredential,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { getDriver } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport Debug from 'debug'\nimport { Request, Response, Router } from 'express'\nimport {\n EntryIdType,\n ICredentialStatusListEndpointOpts,\n IRequiredContext,\n IW3CredentialStatusEndpointOpts,\n StatusListIdType,\n UpdateIndexedCredentialStatusRequest,\n UpdateW3cCredentialStatusRequest,\n} from './types'\nimport { StatusListCredential, StatusListType } from '@sphereon/ssi-types'\nimport { IBitstringStatusListEntryEntity, IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'\n\nconst debug = Debug('sphereon:ssi-sdk:status-list')\n\nfunction sendStatuslistResponse(details: StatusListResult, statuslistPayload: StatusListCredential, response: Response) {\n let payload: Buffer | StatusListCredential\n\n switch (details.proofFormat) {\n case 'jwt':\n case 'cbor':\n payload = Buffer.from(statuslistPayload as string, 'ascii')\n break\n default:\n payload = statuslistPayload\n }\n\n return response.status(200).setHeader('Content-Type', details.statuslistContentType).send(payload)\n}\n\nfunction buildStatusListId(request: Request): string {\n const protocol = request.headers['x-forwarded-proto']?.toString() ?? request.protocol\n let host = request.headers['x-forwarded-host']?.toString() ?? request.get('host')\n const forwardedPort = request.headers['x-forwarded-port']?.toString()\n\n if (forwardedPort && !(protocol === 'https' && forwardedPort === '443') && !(protocol === 'http' && forwardedPort === '80')) {\n host += `:${forwardedPort}`\n }\n\n const forwardedPrefix = request.headers['x-forwarded-prefix']?.toString() ?? ''\n\n return `${protocol}://${host}${forwardedPrefix}${request.originalUrl.split('?')[0].replace(/\\/status\\/index\\/.*/, '')}`\n}\n\nexport function createNewStatusListEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Create new status list endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListArgs: CreateNewStatusListFuncArgs = request.body.statusList\n if (!statusListArgs) {\n return sendErrorResponse(response, 400, 'No statusList details supplied')\n }\n const details = await context.agent.slCreateStatusList(statusListArgs)\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const correlationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(correlationId ? { correlationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nfunction lookupType(details: StatusListResult) {\n return details.type === StatusListType.StatusList2021\n ? 'StatusList2021Entry'\n : details.type === StatusListType.BitstringStatusList\n ? 'BitstringStatusListEntry'\n : details.type\n}\n\nexport function getStatusListCredentialIndexStatusEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/status-lists/:statusListId/status/entry-by-id/:entryId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListIdType = (request.query.statusListIdType as StatusListIdType) ?? StatusListIdType.StatusListId\n const entryIdType = (request.query.entryIdType as EntryIdType) ?? EntryIdType.StatusListIndex\n\n let statusListIndex: number | undefined\n let entityCorrelationId: string | undefined\n let statusListId: string | undefined\n let statusListCorrelationId: string | undefined\n\n if (entryIdType === EntryIdType.StatusListIndex) {\n try {\n statusListIndex = Number.parseInt(request.params.entryId)\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } else {\n entityCorrelationId = request.params.entryId\n }\n\n if (statusListIdType === StatusListIdType.StatusListId) {\n statusListId = request.params.statusListId\n } else {\n statusListCorrelationId = request.params.statusListId\n }\n\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: statusListId }),\n dbName: opts.dbName,\n })\n\n const details = await driver.getStatusList()\n if (statusListIndex && statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex }),\n errorOnNotFound: false,\n })\n\n const type = lookupType(details)\n const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n ...(details.type === StatusListType.BitstringStatusList\n ? {\n statusPurpose: details.bitstringStatusList?.statusPurpose,\n bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,\n }\n : {}),\n type,\n id: details.id,\n statusListIndex: resultStatusIndex,\n })\n\n if (!entry) {\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex: resultStatusIndex,\n }\n }\n\n response.statusCode = 200\n const result = { ...entry, status }\n delete result.statusList // we asked for the status, not the entire list\n return response.json(result)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialIndexStatusEndpointLegacy(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index/status/index/:statusListIndex'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n const statusListIndexStr = request.params.statusListIndex\n let statusListIndex: number\n try {\n statusListIndex = Number.parseInt(statusListIndexStr)\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const statusListCorrelationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n if (statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n const entityCorrelationId = request.query.entityCorrelationId?.toString()\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex: statusListIndex }),\n errorOnNotFound: false,\n })\n const type = details.type === StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n ...(details.type === StatusListType.BitstringStatusList\n ? {\n statusPurpose: details.bitstringStatusList?.statusPurpose,\n bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,\n }\n : {}),\n type,\n id: details.id,\n statusListIndex,\n })\n if (!entry) {\n // The fact we have nothing on it means the status is okay\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex,\n }\n }\n response.statusCode = 200\n const result = { ...entry, status }\n delete result.statusList // we asked for the status, not the entire list\n return response.json(result)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function updateStatusEndpoint(router: Router, context: IRequiredContext, opts: IW3CredentialStatusEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Update credential status endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/status', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const updateRequest = request.body as UpdateW3cCredentialStatusRequest | UpdateIndexedCredentialStatusRequest\n const statusListId = updateRequest.statusListId ?? request.query.statusListId?.toString() ?? opts.statusListId // TODO why query params when we have a JSON body ??\n const statusListCorrelationId = updateRequest.statusListCorrelationId ?? request.query.statusListrelationId?.toString() ?? opts.correlationId\n const entryCorrelationId = updateRequest.entryCorrelationId ?? request.query.entryCorrelationId?.toString()\n\n // TODO: Move mostly to driver\n if (!statusListId && !statusListCorrelationId) {\n return sendErrorResponse(response, 400, 'No statusList id or correlation Id provided or deduced for the API or in the request')\n } else if (!updateRequest.credentialStatus || updateRequest.credentialStatus.length === 0) {\n return sendErrorResponse(response, 400, 'No statusList updates supplied')\n }\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n let statusListResult: StatusListResult = await driver.getStatusList()\n\n // Get status list entry based on request type\n let statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined\n if ('credentialId' in updateRequest) {\n if (!updateRequest.credentialId) {\n return sendErrorResponse(response, 400, 'No credentialId supplied')\n }\n // unfortunately the W3C API works by credentialId. Which means you will have to map listIndices during issuance\n statusListEntry = await driver.getStatusListEntryByCredentialId({\n statusListId,\n statusListCorrelationId,\n entryCorrelationId,\n credentialId: updateRequest.credentialId,\n errorOnNotFound: true,\n })\n } else {\n statusListEntry = await driver.getStatusListEntryByIndex({\n ...(statusListResult.id && { statusListId: statusListResult.id }),\n ...(statusListResult.correlationId && { statusListCorrelationId: statusListResult.correlationId }),\n ...(entryCorrelationId ? { entryCorrelationId } : { statusListIndex: updateRequest.statusListIndex }),\n errorOnNotFound: true,\n })\n }\n\n if (!statusListEntry) {\n const identifier = 'credentialId' in updateRequest ? updateRequest.credentialId : `index ${updateRequest.statusListIndex}`\n return sendErrorResponse(response, 404, `Status list entry for ${identifier} not found for ${statusListId}`)\n }\n\n let statusListCredential = statusListResult.statusListCredential\n for (const updateItem of updateRequest.credentialStatus) {\n if (!updateItem.status) {\n return sendErrorResponse(response, 400, `Required 'status' value was missing in the credentialStatus array`)\n }\n\n let value: string = '1'\n if (updateItem.status === '0' || updateItem.status.toLowerCase() === 'false') {\n value = '0'\n } else if (updateItem.status !== '1' && updateItem.status.toLowerCase() !== 'true') {\n if (updateItem.type === StatusListType.StatusList2021) {\n // 2021 only allows 0 and 1\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n } else if (parseInt(updateItem.status) < 0 || parseInt(updateItem.status) > 255) {\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n }\n value = `${parseInt(updateItem.status)}`\n }\n\n const updStatusListId = statusListId ?? ('statusList' in statusListEntry && statusListEntry.statusList?.id) ?? statusListEntry?.statusListId // When input was statusListCorrelationId the statusList id should come from statusListEntry\n if (!updStatusListId) {\n return sendErrorResponse(response, 400, 'statuslist id could not be determined')\n }\n await driver.updateStatusListEntry({ ...statusListEntry, statusListId: updStatusListId, value })\n const bitsPerStatus =\n 'bitsPerStatus' in statusListEntry && typeof statusListEntry.bitsPerStatus === 'number' ? statusListEntry.bitsPerStatus : undefined\n\n // todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well\n statusListResult = await updateStatusIndexFromStatusListCredential(\n {\n statusListCredential: statusListCredential,\n statusListIndex: statusListEntry.statusListIndex,\n ...(bitsPerStatus && { bitsPerStatus }),\n value: parseInt(value),\n keyRef: opts.keyRef,\n },\n context,\n )\n statusListResult = await driver.updateStatusList({\n correlationId: statusListResult.correlationId!, // FIXME?\n statusListCredential: statusListResult.statusListCredential,\n })\n }\n\n return sendStatuslistResponse(statusListResult, statusListResult.statusListCredential, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n","import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-support'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport { StatusListType } from '@sphereon/ssi-types'\nimport { IAgentContext } from '@veramo/core'\n\nexport type IRequiredContext = IAgentContext<IRequiredPlugins & IStatusListPlugin>\n\nexport interface IStatusListOpts {\n endpointOpts: IStatusListEndpointOpts\n enableFeatures?: statusListFeatures[] // Feature to enable. If not defined or empty, all features will be enabled\n}\n\nexport interface IStatusListEndpointOpts {\n basePath?: string\n globalAuth?: GenericAuthArgs\n vcApiCredentialStatus: IW3CredentialStatusEndpointOpts\n createStatusList: ICredentialStatusListEndpointOpts\n getStatusList: ICredentialStatusListEndpointOpts\n}\n\nexport type statusListFeatures = 'w3c-vc-api-credential-status' | 'status-list-management' | 'status-list-hosting'\n\nexport interface ICredentialStatusListEndpointOpts extends ISingleEndpointOpts {\n dbName: string\n}\n\nexport interface IW3CredentialStatusEndpointOpts extends ICredentialStatusListEndpointOpts {\n statusListId?: string\n correlationId?: string\n keyRef?: string\n}\n\nexport interface UpdateW3cCredentialStatusRequest extends UpdateCredentialStatusRequest {\n credentialId: string\n}\n\nexport interface UpdateIndexedCredentialStatusRequest extends UpdateCredentialStatusRequest {\n statusListIndex?: number\n}\n\ninterface UpdateCredentialStatusRequest {\n credentialStatus: UpdateCredentialStatusItem[]\n statusListId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n statusListCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n entryCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n}\n\nexport interface UpdateCredentialStatusItem {\n type?: StatusListType // makes very little sense, but listed in the spec. Would expect a purpose\n status: string\n}\n\nexport enum StatusListIdType {\n StatusListId = 'StatusListId',\n StatusListCorrelationId = 'StatusListCorrelationId',\n}\n\nexport enum EntryIdType {\n StatusListIndex = 'StatusListIndex',\n EntryCorrelationId = 'StatusListCorrelationId',\n}\n"],"mappings":"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","names":["copyGlobalAuthToEndpoint","agentContext","express","checkAuth","sendErrorResponse","checkStatusIndexFromStatusListCredential","updateStatusIndexFromStatusListCredential","getDriver","Debug","StatusListIdType","EntryIdType","StatusListType","debug","Debug","sendStatuslistResponse","details","statuslistPayload","response","payload","proofFormat","Buffer","from","status","setHeader","statuslistContentType","send","buildStatusListId","request","protocol","headers","toString","host","get","forwardedPort","forwardedPrefix","originalUrl","split","replace","createNewStatusListEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","statusListArgs","body","statusList","sendErrorResponse","agent","slCreateStatusList","statusListCredential","e","message","getStatusListCredentialEndpoint","correlationId","query","driver","getDriver","id","dbName","getStatusList","lookupType","type","StatusListType","StatusList2021","BitstringStatusList","getStatusListCredentialIndexStatusEndpoint","statusListIdType","StatusListIdType","StatusListId","entryIdType","EntryIdType","StatusListIndex","statusListIndex","entityCorrelationId","statusListId","statusListCorrelationId","Number","parseInt","params","entryId","error","length","entry","getStatusListEntryByIndex","errorOnNotFound","resultStatusIndex","checkStatusIndexFromStatusListCredential","statusPurpose","statusList2021","bitstringStatusList","bitsPerStatus","value","statusCode","result","json","getStatusListCredentialIndexStatusEndpointLegacy","statusListIndexStr","updateStatusEndpoint","JSON","stringify","updateRequest","statusListrelationId","entryCorrelationId","credentialStatus","statusListResult","statusListEntry","credentialId","getStatusListEntryByCredentialId","identifier","updateItem","toLowerCase","updStatusListId","updateStatusListEntry","undefined","updateStatusIndexFromStatusListCredential","keyRef","updateStatusList","StatuslistManagementApiServer","router","_router","_express","_agent","_opts","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","key","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createNewStatusListEndpoint","createStatusList","getStatusListCredentialEndpoint","getStatusList","getStatusListCredentialIndexStatusEndpoint","getStatusListCredentialIndexStatusEndpointLegacy","updateStatusEndpoint","vcApiCredentialStatus","use","basePath"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sphereon/ssi-sdk.vc-status-list-issuer-rest-api",
|
|
3
3
|
"description": "Sphereon SSI-SDK plugin for Status List management, like StatusList2021. Issuer drivers module",
|
|
4
|
-
"version": "0.34.1-feature.SSISDK.17.bitstring.sl.
|
|
4
|
+
"version": "0.34.1-feature.SSISDK.17.bitstring.sl.24+d486d9b6",
|
|
5
5
|
"source": "src/index.ts",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.cjs",
|
|
@@ -24,15 +24,15 @@
|
|
|
24
24
|
"start:dev2": "node --experimental-specifier-resolution=node --loader ts-node/esm __tests__/agent.ts"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@sphereon/ssi-express-support": "0.34.1-feature.SSISDK.17.bitstring.sl.
|
|
28
|
-
"@sphereon/ssi-sdk-ext.did-utils": "0.29.
|
|
29
|
-
"@sphereon/ssi-sdk-ext.identifier-resolution": "0.29.
|
|
30
|
-
"@sphereon/ssi-sdk-ext.jwt-service": "0.29.
|
|
31
|
-
"@sphereon/ssi-sdk.core": "0.34.1-feature.SSISDK.17.bitstring.sl.
|
|
32
|
-
"@sphereon/ssi-sdk.data-store": "0.34.1-feature.SSISDK.17.bitstring.sl.
|
|
33
|
-
"@sphereon/ssi-sdk.vc-status-list": "0.34.1-feature.SSISDK.17.bitstring.sl.
|
|
34
|
-
"@sphereon/ssi-sdk.vc-status-list-issuer-drivers": "0.34.1-feature.SSISDK.17.bitstring.sl.
|
|
35
|
-
"@sphereon/ssi-types": "0.34.1-feature.SSISDK.17.bitstring.sl.
|
|
27
|
+
"@sphereon/ssi-express-support": "0.34.1-feature.SSISDK.17.bitstring.sl.24+d486d9b6",
|
|
28
|
+
"@sphereon/ssi-sdk-ext.did-utils": "0.29.1-next.3",
|
|
29
|
+
"@sphereon/ssi-sdk-ext.identifier-resolution": "0.29.1-next.3",
|
|
30
|
+
"@sphereon/ssi-sdk-ext.jwt-service": "0.29.1-next.3",
|
|
31
|
+
"@sphereon/ssi-sdk.core": "0.34.1-feature.SSISDK.17.bitstring.sl.24+d486d9b6",
|
|
32
|
+
"@sphereon/ssi-sdk.data-store": "0.34.1-feature.SSISDK.17.bitstring.sl.24+d486d9b6",
|
|
33
|
+
"@sphereon/ssi-sdk.vc-status-list": "0.34.1-feature.SSISDK.17.bitstring.sl.24+d486d9b6",
|
|
34
|
+
"@sphereon/ssi-sdk.vc-status-list-issuer-drivers": "0.34.1-feature.SSISDK.17.bitstring.sl.24+d486d9b6",
|
|
35
|
+
"@sphereon/ssi-types": "0.34.1-feature.SSISDK.17.bitstring.sl.24+d486d9b6",
|
|
36
36
|
"@sphereon/vc-status-list": "7.0.0-next.0",
|
|
37
37
|
"@veramo/core": "4.2.0",
|
|
38
38
|
"debug": "^4.3.5",
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@sphereon/did-uni-client": "^0.6.3",
|
|
47
|
-
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.29.
|
|
48
|
-
"@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.29.
|
|
49
|
-
"@sphereon/ssi-sdk.agent-config": "0.34.1-feature.SSISDK.17.bitstring.sl.
|
|
50
|
-
"@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.34.1-feature.SSISDK.17.bitstring.sl.
|
|
47
|
+
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.29.1-next.3",
|
|
48
|
+
"@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.29.1-next.3",
|
|
49
|
+
"@sphereon/ssi-sdk.agent-config": "0.34.1-feature.SSISDK.17.bitstring.sl.24+d486d9b6",
|
|
50
|
+
"@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.34.1-feature.SSISDK.17.bitstring.sl.24+d486d9b6",
|
|
51
51
|
"@sphereon/ssi-sdk.data-store": "workspace:*",
|
|
52
52
|
"@types/body-parser": "^1.19.5",
|
|
53
53
|
"@types/cookie-parser": "^1.4.7",
|
|
@@ -91,5 +91,5 @@
|
|
|
91
91
|
"SSI",
|
|
92
92
|
"StatusList2021"
|
|
93
93
|
],
|
|
94
|
-
"gitHead": "
|
|
94
|
+
"gitHead": "d486d9b69ca1a5c0df614642a2d1e158a60edee8"
|
|
95
95
|
}
|
package/src/api-functions.ts
CHANGED
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
UpdateW3cCredentialStatusRequest,
|
|
19
19
|
} from './types'
|
|
20
20
|
import { StatusListCredential, StatusListType } from '@sphereon/ssi-types'
|
|
21
|
-
import { IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'
|
|
21
|
+
import { IBitstringStatusListEntryEntity, IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'
|
|
22
22
|
|
|
23
23
|
const debug = Debug('sphereon:ssi-sdk:status-list')
|
|
24
24
|
|
|
@@ -162,7 +162,12 @@ export function getStatusListCredentialIndexStatusEndpoint(router: Router, conte
|
|
|
162
162
|
const status = await checkStatusIndexFromStatusListCredential({
|
|
163
163
|
statusListCredential: details.statusListCredential,
|
|
164
164
|
...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),
|
|
165
|
-
...(details.type === StatusListType.BitstringStatusList
|
|
165
|
+
...(details.type === StatusListType.BitstringStatusList
|
|
166
|
+
? {
|
|
167
|
+
statusPurpose: details.bitstringStatusList?.statusPurpose,
|
|
168
|
+
bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,
|
|
169
|
+
}
|
|
170
|
+
: {}),
|
|
166
171
|
type,
|
|
167
172
|
id: details.id,
|
|
168
173
|
statusListIndex: resultStatusIndex,
|
|
@@ -177,7 +182,9 @@ export function getStatusListCredentialIndexStatusEndpoint(router: Router, conte
|
|
|
177
182
|
}
|
|
178
183
|
|
|
179
184
|
response.statusCode = 200
|
|
180
|
-
|
|
185
|
+
const result = { ...entry, status }
|
|
186
|
+
delete result.statusList // we asked for the status, not the entire list
|
|
187
|
+
return response.json(result)
|
|
181
188
|
} catch (e) {
|
|
182
189
|
return sendErrorResponse(response, 500, (e as Error).message, e)
|
|
183
190
|
}
|
|
@@ -224,6 +231,12 @@ export function getStatusListCredentialIndexStatusEndpointLegacy(router: Router,
|
|
|
224
231
|
const status = await checkStatusIndexFromStatusListCredential({
|
|
225
232
|
statusListCredential: details.statusListCredential,
|
|
226
233
|
...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),
|
|
234
|
+
...(details.type === StatusListType.BitstringStatusList
|
|
235
|
+
? {
|
|
236
|
+
statusPurpose: details.bitstringStatusList?.statusPurpose,
|
|
237
|
+
bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,
|
|
238
|
+
}
|
|
239
|
+
: {}),
|
|
227
240
|
type,
|
|
228
241
|
id: details.id,
|
|
229
242
|
statusListIndex,
|
|
@@ -237,7 +250,9 @@ export function getStatusListCredentialIndexStatusEndpointLegacy(router: Router,
|
|
|
237
250
|
}
|
|
238
251
|
}
|
|
239
252
|
response.statusCode = 200
|
|
240
|
-
|
|
253
|
+
const result = { ...entry, status }
|
|
254
|
+
delete result.statusList // we asked for the status, not the entire list
|
|
255
|
+
return response.json(result)
|
|
241
256
|
} catch (e) {
|
|
242
257
|
return sendErrorResponse(response, 500, (e as Error).message, e)
|
|
243
258
|
}
|
|
@@ -270,7 +285,7 @@ export function updateStatusEndpoint(router: Router, context: IRequiredContext,
|
|
|
270
285
|
let statusListResult: StatusListResult = await driver.getStatusList()
|
|
271
286
|
|
|
272
287
|
// Get status list entry based on request type
|
|
273
|
-
let statusListEntry: IStatusListEntryEntity | undefined
|
|
288
|
+
let statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined
|
|
274
289
|
if ('credentialId' in updateRequest) {
|
|
275
290
|
if (!updateRequest.credentialId) {
|
|
276
291
|
return sendErrorResponse(response, 400, 'No credentialId supplied')
|
|
@@ -316,23 +331,29 @@ export function updateStatusEndpoint(router: Router, context: IRequiredContext,
|
|
|
316
331
|
value = `${parseInt(updateItem.status)}`
|
|
317
332
|
}
|
|
318
333
|
|
|
319
|
-
const updStatusListId = statusListId ?? statusListEntry.statusList?.id // When input was statusListCorrelationId the statusList id should come from statusListEntry
|
|
334
|
+
const updStatusListId = statusListId ?? ('statusList' in statusListEntry && statusListEntry.statusList?.id) ?? statusListEntry?.statusListId // When input was statusListCorrelationId the statusList id should come from statusListEntry
|
|
320
335
|
if (!updStatusListId) {
|
|
321
336
|
return sendErrorResponse(response, 400, 'statuslist id could not be determined')
|
|
322
337
|
}
|
|
323
338
|
await driver.updateStatusListEntry({ ...statusListEntry, statusListId: updStatusListId, value })
|
|
339
|
+
const bitsPerStatus =
|
|
340
|
+
'bitsPerStatus' in statusListEntry && typeof statusListEntry.bitsPerStatus === 'number' ? statusListEntry.bitsPerStatus : undefined
|
|
324
341
|
|
|
325
342
|
// todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well
|
|
326
343
|
statusListResult = await updateStatusIndexFromStatusListCredential(
|
|
327
344
|
{
|
|
328
345
|
statusListCredential: statusListCredential,
|
|
329
346
|
statusListIndex: statusListEntry.statusListIndex,
|
|
347
|
+
...(bitsPerStatus && { bitsPerStatus }),
|
|
330
348
|
value: parseInt(value),
|
|
331
349
|
keyRef: opts.keyRef,
|
|
332
350
|
},
|
|
333
351
|
context,
|
|
334
352
|
)
|
|
335
|
-
statusListResult = await driver.updateStatusList({
|
|
353
|
+
statusListResult = await driver.updateStatusList({
|
|
354
|
+
correlationId: statusListResult.correlationId!, // FIXME?
|
|
355
|
+
statusListCredential: statusListResult.statusListCredential,
|
|
356
|
+
})
|
|
336
357
|
}
|
|
337
358
|
|
|
338
359
|
return sendStatuslistResponse(statusListResult, statusListResult.statusListCredential, response)
|