@ajna-inc/openbadges 0.1.0
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/LICENSE +202 -0
- package/build/OpenBadgesModule.d.ts +10 -0
- package/build/OpenBadgesModule.js +75 -0
- package/build/OpenBadgesModule.js.map +1 -0
- package/build/OpenBadgesModuleConfig.d.ts +96 -0
- package/build/OpenBadgesModuleConfig.js +50 -0
- package/build/OpenBadgesModuleConfig.js.map +1 -0
- package/build/api/OpenBadgesApi.d.ts +48 -0
- package/build/api/OpenBadgesApi.js +81 -0
- package/build/api/OpenBadgesApi.js.map +1 -0
- package/build/api/index.d.ts +1 -0
- package/build/api/index.js +18 -0
- package/build/api/index.js.map +1 -0
- package/build/constants.d.ts +12 -0
- package/build/constants.js +27 -0
- package/build/constants.js.map +1 -0
- package/build/cryptosuites/EcdsaSd2023.d.ts +143 -0
- package/build/cryptosuites/EcdsaSd2023.js +518 -0
- package/build/cryptosuites/EcdsaSd2023.js.map +1 -0
- package/build/cryptosuites/EddsaRdfc2022.d.ts +112 -0
- package/build/cryptosuites/EddsaRdfc2022.js +356 -0
- package/build/cryptosuites/EddsaRdfc2022.js.map +1 -0
- package/build/cryptosuites/constants.d.ts +14 -0
- package/build/cryptosuites/constants.js +22 -0
- package/build/cryptosuites/constants.js.map +1 -0
- package/build/cryptosuites/contextPreprocessor.d.ts +24 -0
- package/build/cryptosuites/contextPreprocessor.js +127 -0
- package/build/cryptosuites/contextPreprocessor.js.map +1 -0
- package/build/cryptosuites/dataIntegrityV2Context.d.ts +144 -0
- package/build/cryptosuites/dataIntegrityV2Context.js +86 -0
- package/build/cryptosuites/dataIntegrityV2Context.js.map +1 -0
- package/build/cryptosuites/index.d.ts +11 -0
- package/build/cryptosuites/index.js +33 -0
- package/build/cryptosuites/index.js.map +1 -0
- package/build/http/OpenBadgesHttpModule.d.ts +9 -0
- package/build/http/OpenBadgesHttpModule.js +120 -0
- package/build/http/OpenBadgesHttpModule.js.map +1 -0
- package/build/http/OpenBadgesHttpModuleConfig.d.ts +55 -0
- package/build/http/OpenBadgesHttpModuleConfig.js +78 -0
- package/build/http/OpenBadgesHttpModuleConfig.js.map +1 -0
- package/build/http/endpoints/authorize.d.ts +3 -0
- package/build/http/endpoints/authorize.js +79 -0
- package/build/http/endpoints/authorize.js.map +1 -0
- package/build/http/endpoints/consent.d.ts +3 -0
- package/build/http/endpoints/consent.js +25 -0
- package/build/http/endpoints/consent.js.map +1 -0
- package/build/http/endpoints/credentials.d.ts +4 -0
- package/build/http/endpoints/credentials.js +85 -0
- package/build/http/endpoints/credentials.js.map +1 -0
- package/build/http/endpoints/did.d.ts +3 -0
- package/build/http/endpoints/did.js +48 -0
- package/build/http/endpoints/did.js.map +1 -0
- package/build/http/endpoints/introspect.d.ts +3 -0
- package/build/http/endpoints/introspect.js +37 -0
- package/build/http/endpoints/introspect.js.map +1 -0
- package/build/http/endpoints/jwks.d.ts +3 -0
- package/build/http/endpoints/jwks.js +46 -0
- package/build/http/endpoints/jwks.js.map +1 -0
- package/build/http/endpoints/profile.d.ts +4 -0
- package/build/http/endpoints/profile.js +58 -0
- package/build/http/endpoints/profile.js.map +1 -0
- package/build/http/endpoints/refresh.d.ts +15 -0
- package/build/http/endpoints/refresh.js +134 -0
- package/build/http/endpoints/refresh.js.map +1 -0
- package/build/http/endpoints/registration.d.ts +3 -0
- package/build/http/endpoints/registration.js +42 -0
- package/build/http/endpoints/registration.js.map +1 -0
- package/build/http/endpoints/revoke.d.ts +3 -0
- package/build/http/endpoints/revoke.js +38 -0
- package/build/http/endpoints/revoke.js.map +1 -0
- package/build/http/endpoints/serviceDescription.d.ts +3 -0
- package/build/http/endpoints/serviceDescription.js +52 -0
- package/build/http/endpoints/serviceDescription.js.map +1 -0
- package/build/http/endpoints/statusList.d.ts +10 -0
- package/build/http/endpoints/statusList.js +95 -0
- package/build/http/endpoints/statusList.js.map +1 -0
- package/build/http/endpoints/token.d.ts +3 -0
- package/build/http/endpoints/token.js +147 -0
- package/build/http/endpoints/token.js.map +1 -0
- package/build/http/middleware/auth.d.ts +5 -0
- package/build/http/middleware/auth.js +48 -0
- package/build/http/middleware/auth.js.map +1 -0
- package/build/http/router.d.ts +13 -0
- package/build/http/router.js +36 -0
- package/build/http/router.js.map +1 -0
- package/build/http/tenants.d.ts +2 -0
- package/build/http/tenants.js +20 -0
- package/build/http/tenants.js.map +1 -0
- package/build/http/util/auth.d.ts +8 -0
- package/build/http/util/auth.js +43 -0
- package/build/http/util/auth.js.map +1 -0
- package/build/index.d.ts +46 -0
- package/build/index.js +71 -0
- package/build/index.js.map +1 -0
- package/build/models/ClrCredential.d.ts +112 -0
- package/build/models/ClrCredential.js +52 -0
- package/build/models/ClrCredential.js.map +1 -0
- package/build/models/EndorsementCredential.d.ts +89 -0
- package/build/models/EndorsementCredential.js +11 -0
- package/build/models/EndorsementCredential.js.map +1 -0
- package/build/models/StatusListCredential.d.ts +81 -0
- package/build/models/StatusListCredential.js +28 -0
- package/build/models/StatusListCredential.js.map +1 -0
- package/build/models/index.d.ts +8 -0
- package/build/models/index.js +25 -0
- package/build/models/index.js.map +1 -0
- package/build/repository/OpenBadgeCredentialRecord.d.ts +44 -0
- package/build/repository/OpenBadgeCredentialRecord.js +46 -0
- package/build/repository/OpenBadgeCredentialRecord.js.map +1 -0
- package/build/repository/OpenBadgeCredentialRepository.d.ts +8 -0
- package/build/repository/OpenBadgeCredentialRepository.js +38 -0
- package/build/repository/OpenBadgeCredentialRepository.js.map +1 -0
- package/build/repository/OpenBadgesAuthCodeRecord.d.ts +35 -0
- package/build/repository/OpenBadgesAuthCodeRecord.js +28 -0
- package/build/repository/OpenBadgesAuthCodeRecord.js.map +1 -0
- package/build/repository/OpenBadgesAuthCodeRepository.d.ts +6 -0
- package/build/repository/OpenBadgesAuthCodeRepository.js +32 -0
- package/build/repository/OpenBadgesAuthCodeRepository.js.map +1 -0
- package/build/repository/OpenBadgesConsentRecord.d.ts +24 -0
- package/build/repository/OpenBadgesConsentRecord.js +23 -0
- package/build/repository/OpenBadgesConsentRecord.js.map +1 -0
- package/build/repository/OpenBadgesConsentRepository.d.ts +6 -0
- package/build/repository/OpenBadgesConsentRepository.js +32 -0
- package/build/repository/OpenBadgesConsentRepository.js.map +1 -0
- package/build/repository/OpenBadgesKeyBindingRecord.d.ts +24 -0
- package/build/repository/OpenBadgesKeyBindingRecord.js +32 -0
- package/build/repository/OpenBadgesKeyBindingRecord.js.map +1 -0
- package/build/repository/OpenBadgesKeyBindingRepository.d.ts +7 -0
- package/build/repository/OpenBadgesKeyBindingRepository.js +35 -0
- package/build/repository/OpenBadgesKeyBindingRepository.js.map +1 -0
- package/build/repository/OpenBadgesOAuthRecord.d.ts +35 -0
- package/build/repository/OpenBadgesOAuthRecord.js +25 -0
- package/build/repository/OpenBadgesOAuthRecord.js.map +1 -0
- package/build/repository/OpenBadgesOAuthRepository.d.ts +8 -0
- package/build/repository/OpenBadgesOAuthRepository.js +38 -0
- package/build/repository/OpenBadgesOAuthRepository.js.map +1 -0
- package/build/repository/OpenBadgesProfileRecord.d.ts +21 -0
- package/build/repository/OpenBadgesProfileRecord.js +22 -0
- package/build/repository/OpenBadgesProfileRecord.js.map +1 -0
- package/build/repository/OpenBadgesProfileRepository.d.ts +6 -0
- package/build/repository/OpenBadgesProfileRepository.js +32 -0
- package/build/repository/OpenBadgesProfileRepository.js.map +1 -0
- package/build/repository/OpenBadgesRevocationCacheRecord.d.ts +23 -0
- package/build/repository/OpenBadgesRevocationCacheRecord.js +23 -0
- package/build/repository/OpenBadgesRevocationCacheRecord.js.map +1 -0
- package/build/repository/OpenBadgesRevocationCacheRepository.d.ts +6 -0
- package/build/repository/OpenBadgesRevocationCacheRepository.js +32 -0
- package/build/repository/OpenBadgesRevocationCacheRepository.js.map +1 -0
- package/build/repository/OpenBadgesServiceDescriptionRecord.d.ts +21 -0
- package/build/repository/OpenBadgesServiceDescriptionRecord.js +22 -0
- package/build/repository/OpenBadgesServiceDescriptionRecord.js.map +1 -0
- package/build/repository/OpenBadgesServiceDescriptionRepository.d.ts +6 -0
- package/build/repository/OpenBadgesServiceDescriptionRepository.js +32 -0
- package/build/repository/OpenBadgesServiceDescriptionRepository.js.map +1 -0
- package/build/repository/OpenBadgesTokenRecord.d.ts +39 -0
- package/build/repository/OpenBadgesTokenRecord.js +36 -0
- package/build/repository/OpenBadgesTokenRecord.js.map +1 -0
- package/build/repository/OpenBadgesTokenRepository.d.ts +9 -0
- package/build/repository/OpenBadgesTokenRepository.js +45 -0
- package/build/repository/OpenBadgesTokenRepository.js.map +1 -0
- package/build/repository/StatusListRecord.d.ts +49 -0
- package/build/repository/StatusListRecord.js +47 -0
- package/build/repository/StatusListRecord.js.map +1 -0
- package/build/repository/StatusListRepository.d.ts +24 -0
- package/build/repository/StatusListRepository.js +52 -0
- package/build/repository/StatusListRepository.js.map +1 -0
- package/build/repository/index.d.ts +18 -0
- package/build/repository/index.js +35 -0
- package/build/repository/index.js.map +1 -0
- package/build/services/AchievementValidator.d.ts +158 -0
- package/build/services/AchievementValidator.js +238 -0
- package/build/services/AchievementValidator.js.map +1 -0
- package/build/services/ConsumerService.d.ts +24 -0
- package/build/services/ConsumerService.js +143 -0
- package/build/services/ConsumerService.js.map +1 -0
- package/build/services/ContextService.d.ts +14 -0
- package/build/services/ContextService.js +54 -0
- package/build/services/ContextService.js.map +1 -0
- package/build/services/DataIntegrityService.d.ts +51 -0
- package/build/services/DataIntegrityService.js +134 -0
- package/build/services/DataIntegrityService.js.map +1 -0
- package/build/services/DidCommLinkService.d.ts +7 -0
- package/build/services/DidCommLinkService.js +20 -0
- package/build/services/DidCommLinkService.js.map +1 -0
- package/build/services/DisplayMapper.d.ts +9 -0
- package/build/services/DisplayMapper.js +26 -0
- package/build/services/DisplayMapper.js.map +1 -0
- package/build/services/IssuerService.d.ts +38 -0
- package/build/services/IssuerService.js +225 -0
- package/build/services/IssuerService.js.map +1 -0
- package/build/services/JwtService.d.ts +19 -0
- package/build/services/JwtService.js +229 -0
- package/build/services/JwtService.js.map +1 -0
- package/build/services/KeyService.d.ts +102 -0
- package/build/services/KeyService.js +439 -0
- package/build/services/KeyService.js.map +1 -0
- package/build/services/OAuthClient.d.ts +26 -0
- package/build/services/OAuthClient.js +127 -0
- package/build/services/OAuthClient.js.map +1 -0
- package/build/services/ProofService.d.ts +15 -0
- package/build/services/ProofService.js +43 -0
- package/build/services/ProofService.js.map +1 -0
- package/build/services/RevocationService.d.ts +59 -0
- package/build/services/RevocationService.js +319 -0
- package/build/services/RevocationService.js.map +1 -0
- package/build/services/VerifyService.d.ts +17 -0
- package/build/services/VerifyService.js +54 -0
- package/build/services/VerifyService.js.map +1 -0
- package/build/services/crypto/CryptoDriver.d.ts +9 -0
- package/build/services/crypto/CryptoDriver.js +7 -0
- package/build/services/crypto/CryptoDriver.js.map +1 -0
- package/build/services/crypto/JsonLdCryptoDriver.d.ts +17 -0
- package/build/services/crypto/JsonLdCryptoDriver.js +45 -0
- package/build/services/crypto/JsonLdCryptoDriver.js.map +1 -0
- package/build/services/crypto/JwtCryptoDriver.d.ts +13 -0
- package/build/services/crypto/JwtCryptoDriver.js +42 -0
- package/build/services/crypto/JwtCryptoDriver.js.map +1 -0
- package/build/services/index.d.ts +12 -0
- package/build/services/index.js +29 -0
- package/build/services/index.js.map +1 -0
- package/build/utils/validate.d.ts +17 -0
- package/build/utils/validate.js +107 -0
- package/build/utils/validate.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.JwtCryptoDriver = void 0;
|
|
16
|
+
const core_1 = require("@credo-ts/core");
|
|
17
|
+
const CryptoDriver_1 = require("./CryptoDriver");
|
|
18
|
+
const JwtService_1 = require("../JwtService");
|
|
19
|
+
let JwtCryptoDriver = class JwtCryptoDriver extends CryptoDriver_1.CryptoDriver {
|
|
20
|
+
constructor(jwt) {
|
|
21
|
+
super();
|
|
22
|
+
this.jwt = jwt;
|
|
23
|
+
}
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
+
async sign(agentContext, document, keyHint) {
|
|
26
|
+
const jwt = await this.jwt.signVcJwt(agentContext, document, keyHint);
|
|
27
|
+
return { ...document, proof: { type: 'JwtProof2020', jwt } };
|
|
28
|
+
}
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
+
async verify(agentContext, input) {
|
|
31
|
+
const jwtStr = typeof input === 'string' ? input : String(input?.proof?.jwt || '');
|
|
32
|
+
const res = await this.jwt.verifyVcJwt(agentContext, jwtStr);
|
|
33
|
+
return { verified: !!res.verified, credential: res.payload?.vc, error: res.error };
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
exports.JwtCryptoDriver = JwtCryptoDriver;
|
|
37
|
+
exports.JwtCryptoDriver = JwtCryptoDriver = __decorate([
|
|
38
|
+
(0, core_1.injectable)(),
|
|
39
|
+
__param(0, (0, core_1.inject)(JwtService_1.JwtService)),
|
|
40
|
+
__metadata("design:paramtypes", [JwtService_1.JwtService])
|
|
41
|
+
], JwtCryptoDriver);
|
|
42
|
+
//# sourceMappingURL=JwtCryptoDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JwtCryptoDriver.js","sourceRoot":"","sources":["../../../src/services/crypto/JwtCryptoDriver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yCAAmD;AAEnD,iDAA6C;AAC7C,8CAA0C;AAGnC,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,2BAAY;IAC/C,YAAwD,GAAe;QACrE,KAAK,EAAE,CAAA;QAD+C,QAAG,GAAH,GAAG,CAAY;IAEvE,CAAC;IAED,8DAA8D;IACvD,KAAK,CAAC,IAAI,CAAC,YAA0B,EAAE,QAAa,EAAE,OAAa;QACxE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QACrE,OAAO,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,CAAA;IAC9D,CAAC;IAED,8DAA8D;IACvD,KAAK,CAAC,MAAM,CAAC,YAA0B,EAAE,KAAU;QACxD,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;QAClF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;QAC5D,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;IACpF,CAAC;CACF,CAAA;AAjBY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,iBAAU,GAAE;IAES,WAAA,IAAA,aAAM,EAAC,uBAAU,CAAC,CAAA;qCAAuB,uBAAU;GAD5D,eAAe,CAiB3B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './IssuerService';
|
|
2
|
+
export * from './VerifyService';
|
|
3
|
+
export * from './ConsumerService';
|
|
4
|
+
export * from './OAuthClient';
|
|
5
|
+
export * from './DidCommLinkService';
|
|
6
|
+
export * from './DisplayMapper';
|
|
7
|
+
export * from './RevocationService';
|
|
8
|
+
export * from './JwtService';
|
|
9
|
+
export * from './ProofService';
|
|
10
|
+
export * from './crypto/CryptoDriver';
|
|
11
|
+
export * from './crypto/JsonLdCryptoDriver';
|
|
12
|
+
export * from './crypto/JwtCryptoDriver';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./IssuerService"), exports);
|
|
18
|
+
__exportStar(require("./VerifyService"), exports);
|
|
19
|
+
__exportStar(require("./ConsumerService"), exports);
|
|
20
|
+
__exportStar(require("./OAuthClient"), exports);
|
|
21
|
+
__exportStar(require("./DidCommLinkService"), exports);
|
|
22
|
+
__exportStar(require("./DisplayMapper"), exports);
|
|
23
|
+
__exportStar(require("./RevocationService"), exports);
|
|
24
|
+
__exportStar(require("./JwtService"), exports);
|
|
25
|
+
__exportStar(require("./ProofService"), exports);
|
|
26
|
+
__exportStar(require("./crypto/CryptoDriver"), exports);
|
|
27
|
+
__exportStar(require("./crypto/JsonLdCryptoDriver"), exports);
|
|
28
|
+
__exportStar(require("./crypto/JwtCryptoDriver"), exports);
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAA+B;AAC/B,kDAA+B;AAC/B,oDAAiC;AACjC,gDAA6B;AAC7B,uDAAoC;AACpC,kDAA+B;AAC/B,sDAAmC;AACnC,+CAA4B;AAC5B,iDAA8B;AAC9B,wDAAqC;AACrC,8DAA2C;AAC3C,2DAAwC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type ValidationIssue = {
|
|
2
|
+
code: string;
|
|
3
|
+
message: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function isObject(value: unknown): value is Record<string, unknown>;
|
|
6
|
+
export declare function ensureContexts(credential: any): ValidationIssue[];
|
|
7
|
+
export declare function ensureTypes(credential: any): ValidationIssue[];
|
|
8
|
+
export declare function validateObEnvelope(credential: unknown): ValidationIssue[];
|
|
9
|
+
export declare function ensureEndorsementTypes(credential: any): ValidationIssue[];
|
|
10
|
+
/**
|
|
11
|
+
* Validates an EndorsementCredential envelope
|
|
12
|
+
* EndorsementCredentials have a different structure than OpenBadgeCredentials:
|
|
13
|
+
* - type must include 'VerifiableCredential' and 'EndorsementCredential'
|
|
14
|
+
* - credentialSubject.type must be 'EndorsementSubject'
|
|
15
|
+
* - credentialSubject.id is required (the entity being endorsed)
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateEndorsementEnvelope(credential: unknown): ValidationIssue[];
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isObject = isObject;
|
|
4
|
+
exports.ensureContexts = ensureContexts;
|
|
5
|
+
exports.ensureTypes = ensureTypes;
|
|
6
|
+
exports.validateObEnvelope = validateObEnvelope;
|
|
7
|
+
exports.ensureEndorsementTypes = ensureEndorsementTypes;
|
|
8
|
+
exports.validateEndorsementEnvelope = validateEndorsementEnvelope;
|
|
9
|
+
const constants_1 = require("../constants");
|
|
10
|
+
function isObject(value) {
|
|
11
|
+
return value != null && typeof value === 'object' && !Array.isArray(value);
|
|
12
|
+
}
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
function ensureContexts(credential) {
|
|
15
|
+
const issues = [];
|
|
16
|
+
const ctx = credential?.['@context'];
|
|
17
|
+
const contexts = Array.isArray(ctx) ? ctx : ctx ? [ctx] : [];
|
|
18
|
+
if (!contexts.includes(constants_1.VC_V2_CONTEXT)) {
|
|
19
|
+
issues.push({ code: 'missing_vc_v2_context', message: 'Missing VC v2 context' });
|
|
20
|
+
}
|
|
21
|
+
if (!contexts.includes(constants_1.OBV3_CONTEXT)) {
|
|
22
|
+
issues.push({ code: 'missing_obv3_context', message: 'Missing OBv3 context' });
|
|
23
|
+
}
|
|
24
|
+
return issues;
|
|
25
|
+
}
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
function ensureTypes(credential) {
|
|
28
|
+
const issues = [];
|
|
29
|
+
const types = Array.isArray(credential?.type) ? credential.type : [];
|
|
30
|
+
for (const t of constants_1.REQUIRED_TYPES) {
|
|
31
|
+
if (!types.includes(t))
|
|
32
|
+
issues.push({ code: 'missing_type', message: `Missing required type ${t}` });
|
|
33
|
+
}
|
|
34
|
+
return issues;
|
|
35
|
+
}
|
|
36
|
+
function validateObEnvelope(credential) {
|
|
37
|
+
const issues = [];
|
|
38
|
+
if (!isObject(credential))
|
|
39
|
+
return [{ code: 'invalid_json', message: 'Credential must be a JSON object' }];
|
|
40
|
+
issues.push(...ensureContexts(credential));
|
|
41
|
+
issues.push(...ensureTypes(credential));
|
|
42
|
+
// Minimal OBv3 required fields
|
|
43
|
+
const issuer = credential?.issuer;
|
|
44
|
+
const issuerId = typeof issuer === 'string' ? issuer : issuer?.id;
|
|
45
|
+
if (!issuerId)
|
|
46
|
+
issues.push({ code: 'missing_issuer', message: 'Missing issuer or issuer.id' });
|
|
47
|
+
const cs = credential?.credentialSubject;
|
|
48
|
+
if (!cs || (typeof cs !== 'object' && !Array.isArray(cs))) {
|
|
49
|
+
issues.push({ code: 'missing_credentialSubject', message: 'Missing credentialSubject' });
|
|
50
|
+
}
|
|
51
|
+
// If achievement present, ensure basic fields
|
|
52
|
+
const achievement = credential?.credentialSubject?.achievement;
|
|
53
|
+
if (achievement) {
|
|
54
|
+
if (!achievement?.type)
|
|
55
|
+
issues.push({ code: 'missing_achievement_type', message: 'Achievement.type is recommended' });
|
|
56
|
+
if (!achievement?.name)
|
|
57
|
+
issues.push({ code: 'missing_achievement_name', message: 'Achievement.name is recommended' });
|
|
58
|
+
}
|
|
59
|
+
return issues;
|
|
60
|
+
}
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
62
|
+
function ensureEndorsementTypes(credential) {
|
|
63
|
+
const issues = [];
|
|
64
|
+
const types = Array.isArray(credential?.type) ? credential.type : [];
|
|
65
|
+
for (const t of constants_1.ENDORSEMENT_TYPES) {
|
|
66
|
+
if (!types.includes(t))
|
|
67
|
+
issues.push({ code: 'missing_type', message: `Missing required type ${t}` });
|
|
68
|
+
}
|
|
69
|
+
return issues;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Validates an EndorsementCredential envelope
|
|
73
|
+
* EndorsementCredentials have a different structure than OpenBadgeCredentials:
|
|
74
|
+
* - type must include 'VerifiableCredential' and 'EndorsementCredential'
|
|
75
|
+
* - credentialSubject.type must be 'EndorsementSubject'
|
|
76
|
+
* - credentialSubject.id is required (the entity being endorsed)
|
|
77
|
+
*/
|
|
78
|
+
function validateEndorsementEnvelope(credential) {
|
|
79
|
+
const issues = [];
|
|
80
|
+
if (!isObject(credential))
|
|
81
|
+
return [{ code: 'invalid_json', message: 'Credential must be a JSON object' }];
|
|
82
|
+
// Check contexts
|
|
83
|
+
issues.push(...ensureContexts(credential));
|
|
84
|
+
// Check endorsement-specific types
|
|
85
|
+
issues.push(...ensureEndorsementTypes(credential));
|
|
86
|
+
// Check issuer
|
|
87
|
+
const issuer = credential?.issuer;
|
|
88
|
+
const issuerId = typeof issuer === 'string' ? issuer : issuer?.id;
|
|
89
|
+
if (!issuerId)
|
|
90
|
+
issues.push({ code: 'missing_issuer', message: 'Missing issuer or issuer.id' });
|
|
91
|
+
// Check credentialSubject
|
|
92
|
+
const cs = credential?.credentialSubject;
|
|
93
|
+
if (!cs || typeof cs !== 'object') {
|
|
94
|
+
issues.push({ code: 'missing_credentialSubject', message: 'Missing credentialSubject' });
|
|
95
|
+
return issues;
|
|
96
|
+
}
|
|
97
|
+
// EndorsementSubject requires id (the entity being endorsed)
|
|
98
|
+
if (!cs.id) {
|
|
99
|
+
issues.push({ code: 'missing_endorsement_subject_id', message: 'EndorsementSubject requires id of the entity being endorsed' });
|
|
100
|
+
}
|
|
101
|
+
// Check type is EndorsementSubject
|
|
102
|
+
if (cs.type !== 'EndorsementSubject') {
|
|
103
|
+
issues.push({ code: 'invalid_endorsement_subject_type', message: 'credentialSubject.type must be EndorsementSubject' });
|
|
104
|
+
}
|
|
105
|
+
return issues;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":";;AAIA,4BAEC;AAGD,wCAWC;AAGD,kCAOC;AAED,gDAsBC;AAGD,wDAOC;AASD,kEAiCC;AA1GD,4CAA6F;AAI7F,SAAgB,QAAQ,CAAC,KAAc;IACrC,OAAO,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC5E,CAAC;AAED,8DAA8D;AAC9D,SAAgB,cAAc,CAAC,UAAe;IAC5C,MAAM,MAAM,GAAsB,EAAE,CAAA;IACpC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,UAAU,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,yBAAa,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAA;IAClF,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,wBAAY,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAA;IAChF,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,8DAA8D;AAC9D,SAAgB,WAAW,CAAC,UAAe;IACzC,MAAM,MAAM,GAAsB,EAAE,CAAA;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IACpE,KAAK,MAAM,CAAC,IAAI,0BAAc,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,yBAAyB,CAAC,EAAE,EAAE,CAAC,CAAA;IACtG,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAgB,kBAAkB,CAAC,UAAmB;IACpD,MAAM,MAAM,GAAsB,EAAE,CAAA;IACpC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAA;IACzG,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;IAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAA;IACvC,+BAA+B;IAC/B,MAAM,MAAM,GAAI,UAAkB,EAAE,MAAM,CAAA;IAC1C,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAA;IACjE,IAAI,CAAC,QAAQ;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAA;IAE9F,MAAM,EAAE,GAAI,UAAkB,EAAE,iBAAiB,CAAA;IACjD,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAA;IAC1F,CAAC;IAED,8CAA8C;IAC9C,MAAM,WAAW,GAAI,UAAkB,EAAE,iBAAiB,EAAE,WAAW,CAAA;IACvE,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,EAAE,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAA;QACrH,IAAI,CAAC,WAAW,EAAE,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAA;IACvH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,8DAA8D;AAC9D,SAAgB,sBAAsB,CAAC,UAAe;IACpD,MAAM,MAAM,GAAsB,EAAE,CAAA;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IACpE,KAAK,MAAM,CAAC,IAAI,6BAAiB,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,yBAAyB,CAAC,EAAE,EAAE,CAAC,CAAA;IACtG,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,2BAA2B,CAAC,UAAmB;IAC7D,MAAM,MAAM,GAAsB,EAAE,CAAA;IACpC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAA;IAEzG,iBAAiB;IACjB,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;IAE1C,mCAAmC;IACnC,MAAM,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAA;IAElD,eAAe;IACf,MAAM,MAAM,GAAI,UAAkB,EAAE,MAAM,CAAA;IAC1C,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAA;IACjE,IAAI,CAAC,QAAQ;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAA;IAE9F,0BAA0B;IAC1B,MAAM,EAAE,GAAI,UAAkB,EAAE,iBAAiB,CAAA;IACjD,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAA;QACxF,OAAO,MAAM,CAAA;IACf,CAAC;IAED,6DAA6D;IAC7D,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,OAAO,EAAE,6DAA6D,EAAE,CAAC,CAAA;IACjI,CAAC;IAED,mCAAmC;IACnC,IAAI,EAAE,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,OAAO,EAAE,mDAAmD,EAAE,CAAC,CAAA;IACzH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ajna-inc/openbadges",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "OpenBadges v3.0 module for Credo-TS with OAuth 2.0 provider support",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"main": "build/index",
|
|
7
|
+
"types": "build/index",
|
|
8
|
+
"files": [
|
|
9
|
+
"build"
|
|
10
|
+
],
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/ajna-inc/credo-ts",
|
|
17
|
+
"directory": "packages/openbadges"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@digitalcredentials/jsonld": "^6.0.0",
|
|
21
|
+
"@digitalcredentials/jsonld-signatures": "^9.4.0",
|
|
22
|
+
"@digitalcredentials/vc": "^6.0.1",
|
|
23
|
+
"@stablelib/ed25519": "^1.0.3",
|
|
24
|
+
"bs58": "^5.0.0",
|
|
25
|
+
"class-transformer": "^0.5.1",
|
|
26
|
+
"class-validator": "0.14.1",
|
|
27
|
+
"jose": "^5.0.0",
|
|
28
|
+
"tsyringe": "^4.8.0"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"@credo-ts/core": "^0.5.0",
|
|
32
|
+
"express": "^4.18.0"
|
|
33
|
+
},
|
|
34
|
+
"peerDependenciesMeta": {
|
|
35
|
+
"express": {
|
|
36
|
+
"optional": true
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/express": "^4.17.21",
|
|
41
|
+
"@types/jest": "^29.5.12",
|
|
42
|
+
"@types/node": "^20.14.2",
|
|
43
|
+
"express": "^4.21.0",
|
|
44
|
+
"jest": "^29.7.0",
|
|
45
|
+
"rimraf": "^5.0.5",
|
|
46
|
+
"supertest": "^7.0.0",
|
|
47
|
+
"ts-jest": "^29.1.2",
|
|
48
|
+
"typescript": "~5.5.2"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "pnpm run clean && pnpm run compile",
|
|
52
|
+
"clean": "rimraf ./build",
|
|
53
|
+
"compile": "tsc -p tsconfig.build.json",
|
|
54
|
+
"test": "jest",
|
|
55
|
+
"test:jsonld": "jest --testPathPattern=jsonld"
|
|
56
|
+
}
|
|
57
|
+
}
|