UNPKG

@sphereon/gx-compliance-client

Version:

<!--suppress HtmlDeprecatedAttribute --> <h1 align="center"> <br> <a href="https://www.sphereon.com"><img src="https://sphereon.com/content/themes/sphereon/assets/img/logo.svg" alt="Sphereon" width="400"></a> <br>Gaia-X Compliance client (Typescript

269 lines (268 loc) 13.5 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GXComplianceClient = void 0; const index_1 = require("../index"); const DID_1 = require("./DID"); const CredentialHandler_1 = require("./CredentialHandler"); const utils_1 = require("../utils"); const utils_2 = require("../utils"); const utils_3 = require("../utils"); /** * {@inheritDoc IGXComplianceClient} */ class GXComplianceClient { constructor(config) { this.credentialHandler = new CredentialHandler_1.CredentialHandler(this); this.schema = index_1.schema.IGaiaxComplianceClient; this.methods = { submitComplianceCredential: this.submitComplianceCredential.bind(this), acquireComplianceCredentialFromExistingParticipant: this.acquireComplianceCredentialFromExistingParticipant.bind(this), acquireComplianceCredentialFromUnsignedParticipant: this.acquireComplianceCredentialFromUnsignedParticipant.bind(this), submitServiceOffering: this.submitServiceOffering.bind(this), createAndSubmitServiceOffering: this.createAndSubmitServiceOffering.bind(this), createDIDFromX509: this.createDIDFromX509.bind(this), exportDIDDocument: this.exportDIDDocument.bind(this), exportDIDToPath: this.exportDIDToPath.bind(this), issueVerifiableCredential: this.credentialHandler.issueVerifiableCredential.bind(this), issueVerifiablePresentation: this.credentialHandler.issueVerifiablePresentation.bind(this), checkVerifiableCredential: this.credentialHandler.checkVerifiableCredential.bind(this), checkVerifiablePresentation: this.credentialHandler.checkVerifiablePresentation.bind(this), onboardParticipantWithCredential: this.onboardParticipantWithCredential.bind(this), onboardParticipantWithCredentialIds: this.onboardParticipantWithCredentialIds.bind(this), verifySelfDescription: this.verifySelfDescription.bind(this), }; this._config = config; } client() { return this; } config() { return this.client()._config; } /** {@inheritDoc IGXComplianceClient.submitComplianceCredential} */ submitComplianceCredential(args, _context) { return __awaiter(this, void 0, void 0, function* () { console.log(JSON.stringify(args.selfDescriptionVP, null, 2)); try { return (yield (0, utils_2.postRequest)(this.getApiVersionedUrl() + '/compliance', JSON.stringify(args.selfDescriptionVP))); } catch (e) { throw new Error('Error on fetching complianceVC: ' + e); } }); } /** {@inheritDoc IGXComplianceClient.acquireComplianceCredentialFromExistingParticipant} */ acquireComplianceCredentialFromExistingParticipant(args, context) { return __awaiter(this, void 0, void 0, function* () { const selfDescribedVC = yield context.agent.dataStoreGetVerifiableCredential({ hash: args.participantSDId, }); const did = selfDescribedVC.credentialSubject['id']; const signInfo = yield (0, utils_3.extractSignInfo)({ did, section: 'authentication' }, context); const uniqueVP = yield this.credentialHandler.issueVerifiablePresentation({ keyRef: signInfo.keyRef, verifiableCredentials: [selfDescribedVC], challenge: GXComplianceClient.getDateChallenge(), domain: signInfo.participantDomain, persist: true, }, context); return this.acquireComplianceCredential({ verifiablePresentation: uniqueVP.verifiablePresentation, }, context); }); } /** {@inheritDoc IGXComplianceClient.acquireComplianceCredentialFromUnsignedParticipant} */ acquireComplianceCredentialFromUnsignedParticipant(args, context) { return __awaiter(this, void 0, void 0, function* () { const signInfo = yield (0, utils_3.extractSignInfo)({ did: args.credential.credentialSubject.id, section: 'assertionMethod', }, context); const selfDescription = yield this.credentialHandler.issueVerifiableCredential({ credential: args.credential, domain: signInfo.participantDomain, keyRef: signInfo.keyRef, persist: true, }, context); console.log(selfDescription.hash); const uniqueVP = yield this.credentialHandler.issueVerifiablePresentation({ challenge: GXComplianceClient.getDateChallenge(), keyRef: signInfo.keyRef, verifiableCredentials: [selfDescription.verifiableCredential], domain: signInfo.participantDomain, }, context); const verifiableCredentialResponse = (yield this.acquireComplianceCredential({ verifiablePresentation: uniqueVP.verifiablePresentation, }, context)); return verifiableCredentialResponse; }); } /** {@inheritDoc IGXComplianceClient.createAndSubmitServiceOffering} */ createAndSubmitServiceOffering(args, context) { var _a; return __awaiter(this, void 0, void 0, function* () { //TODO: implement fetching compliance VC from data storage if (!args.complianceId && !args.complianceVC) { throw new Error('You should provide either complianceId or complete complianceVC'); } const complianceIsPersisted = args.complianceId; const complianceCredential = complianceIsPersisted ? yield context.agent.dataStoreGetVerifiableCredential({ hash: args.complianceId, }) : args.complianceVC; const did = (0, index_1.asDID)((_a = args.domain) !== null && _a !== void 0 ? _a : (0, index_1.extractSubjectDIDFromVCs)([complianceCredential])); const serviceOffering = yield this.credentialHandler.issueVerifiableCredential({ domain: did, keyRef: args.keyRef, credential: args.serviceOfferingCredential, persist: true, }, context); const serviceOfferingVP = yield this.credentialHandler.issueVerifiablePresentation({ challenge: args.challenge ? args.challenge : GXComplianceClient.getDateChallenge(), keyRef: args.keyRef, // purpose: args.purpose, verifiableCredentials: [complianceCredential, serviceOffering.verifiableCredential], domain: did, persist: true, }, context); return yield this.submitServiceOffering({ serviceOfferingVP: serviceOfferingVP.verifiablePresentation, }, context); }); } /** {@inheritDoc IGXComplianceClient.submitServiceOffering} */ submitServiceOffering(args, _context) { return __awaiter(this, void 0, void 0, function* () { try { return (yield (0, utils_2.postRequest)(this.getApiVersionedUrl() + '/service-offering/verify/raw', JSON.stringify(args.serviceOfferingVP))); } catch (e) { throw new Error('Error on fetching complianceVC: ' + e); } }); } /** {@inheritDoc IGXComplianceClient.createDIDFromX509} */ createDIDFromX509(args, context) { return __awaiter(this, void 0, void 0, function* () { return DID_1.DID.createDIDFromX509(Object.assign(Object.assign({}, args), { kms: args.kms ? args.kms : this._config.kmsName ? this._config.kmsName : 'local' }), context); }); } exportDIDDocument({ domain, services }, context) { return __awaiter(this, void 0, void 0, function* () { return DID_1.DID.exportDocument({ domain, services }, context); }); } exportDIDToPath({ domain, services, path }, context) { return __awaiter(this, void 0, void 0, function* () { return DID_1.DID.exportToPath({ domain, path, services }, context); }); } /** {@inheritDoc IGXComplianceClient.verifyUnsignedSelfDescribedCredential} */ verifySelfDescription(args, context) { return __awaiter(this, void 0, void 0, function* () { if (!args.verifiableCredential && !args.id) { throw new Error('You should provide either vc id or vc itself'); } const vc = args.verifiableCredential ? args.verifiableCredential : yield context.agent.dataStoreGetVerifiableCredential({ hash: args.id, }); const valid = context.agent.verifyCredentialLDLocal({ credential: vc, purpose: new index_1.AssertionProofPurpose(), fetchRemoteContexts: true, }); if (!valid) { throw Error(`Invalid verifiable credential supplied`); } let url = this.getApiVersionedUrl(); if (vc.type.indexOf('ServiceOffering') != -1) { url = url + '/service-offering/validate/vc'; } else if (vc.type.indexOf('LegalPerson') != -1 || vc.type.indexOf('NaturalPerson') != -1) { url = url + '/participant/validate/vc'; } try { return (yield (0, utils_2.postRequest)(url, JSON.stringify(vc))); } catch (e) { throw new Error('Error on fetching complianceCredential: ' + e.message); } }); } /** * Below are the helper functions for this agent. These are for inner functionality of the agent */ acquireComplianceCredential(args, context) { return __awaiter(this, void 0, void 0, function* () { const complianceCredential = yield this.submitComplianceCredential({ selfDescriptionVP: args.verifiablePresentation, }, context); const hash = yield context.agent.dataStoreSaveVerifiableCredential({ verifiableCredential: complianceCredential, }); return { verifiableCredential: complianceCredential, hash, }; }); } static getDateChallenge() { return new Date().toISOString().substring(0, 10); } onboardParticipantWithCredential(args, context) { var _a; return __awaiter(this, void 0, void 0, function* () { const onboardingVP = yield this.credentialHandler.issueVerifiablePresentation({ keyRef: args.keyRef, // purpose: args.purpose, verifiableCredentials: [args.complianceVC, args.selfDescriptionVC], challenge: args.challenge ? args.challenge : GXComplianceClient.getDateChallenge(), domain: (0, index_1.asDID)((_a = args.domain) !== null && _a !== void 0 ? _a : (0, index_1.extractSubjectDIDFromVCs)([args.selfDescriptionVC])), persist: true, }, context); const apiType = (0, utils_1.extractApiTypeFromVC)(args.selfDescriptionVC); const URL = `${this.getApiVersionedUrl()}/${apiType}/verify/raw?store=true`; try { return (yield (0, utils_2.postRequest)(URL, JSON.stringify(onboardingVP))); } catch (e) { throw new Error('Error on onboarding a complianceVC: ' + e); } }); } onboardParticipantWithCredentialIds(args, context) { return __awaiter(this, void 0, void 0, function* () { const complianceCredential = yield context.agent.dataStoreGetVerifiableCredential({ hash: args.complianceId, }); const selfDescriptionVC = yield context.agent.dataStoreGetVerifiableCredential({ hash: args.selfDescriptionId, }); const did = selfDescriptionVC.credentialSubject['id']; const signInfo = yield (0, utils_3.extractSignInfo)({ did, section: 'authentication' }, context); return this.onboardParticipantWithCredential({ complianceVC: complianceCredential, selfDescriptionVC: selfDescriptionVC, keyRef: signInfo.keyRef, domain: signInfo.participantDomain, challenge: GXComplianceClient.getDateChallenge(), }, context); }); } getApiVersionedUrl() { return (0, utils_2.getApiVersionedUrl)(this._config); } } exports.GXComplianceClient = GXComplianceClient;