cassproject 5.0.22 → 5.0.23
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/package.json +47 -50
- package/src/com/eduworks/ec/array/EcArray.js +1 -1
- package/src/com/eduworks/ec/array/EcAsyncHelper.js +1 -1
- package/src/com/eduworks/ec/array/EcObject.js +1 -1
- package/src/com/eduworks/ec/crypto/EcAes.js +1 -1
- package/src/com/eduworks/ec/crypto/EcAesCtrAsync.js +20 -22
- package/src/com/eduworks/ec/crypto/EcCrypto.js +8 -4
- package/src/com/eduworks/ec/crypto/EcPk.js +7 -7
- package/src/com/eduworks/ec/crypto/EcPpk.js +7 -7
- package/src/com/eduworks/ec/crypto/EcRsaOaepAsync.js +20 -19
- package/src/com/eduworks/ec/crypto/EcRsaOaepAsyncWorker.js +7 -6
- package/src/com/eduworks/ec/crypto/forgeAsyncNode.js +8 -8
- package/src/com/eduworks/ec/graph/EcDirectedGraph.js +1 -2
- package/src/com/eduworks/ec/graph/EcFrameworkGraph.js +18 -24
- package/src/com/eduworks/ec/promises/helpers.js +1 -3
- package/src/com/eduworks/ec/remote/EcRemote.js +9 -9
- package/src/com/eduworks/ec/task/EcAsyncTask.js +5 -20
- package/src/com/eduworks/ec/task/EcAsyncTaskManager.js +3 -4
- package/src/com/eduworks/ec/task/EcAsyncTaskWorker.js +9 -11
- package/src/com/eduworks/schema/cfd/competency/CfdFramework.js +36 -37
- package/src/com/eduworks/schema/ebac/EbacContact.js +3 -9
- package/src/com/eduworks/schema/ebac/EbacContactGrant.js +3 -9
- package/src/com/eduworks/schema/ebac/EbacCredential.js +3 -9
- package/src/com/eduworks/schema/ebac/EbacCredentialCommit.js +3 -9
- package/src/com/eduworks/schema/ebac/EbacCredentialRequest.js +3 -9
- package/src/com/eduworks/schema/ebac/EbacCredentials.js +3 -9
- package/src/com/eduworks/schema/ebac/EbacEncryptedSecret.js +3 -9
- package/src/com/eduworks/schema/ebac/EbacEncryptedValue.js +5 -12
- package/src/com/eduworks/schema/ebac/EbacSignature.js +1 -6
- package/src/index/env.js +6 -3
- package/src/index/polyfills.js +13 -27
- package/src/org/angles/schema/angles/VideoStory.js +1 -1
- package/src/org/cass/competency/EcCompetency.js +1 -2
- package/src/org/cass/competency/EcDirectory.js +1 -2
- package/src/org/cass/competency/EcFramework.js +9 -12
- package/src/org/cass/exporter/CSVExport.js +12 -13
- package/src/org/cass/importer/ASNImport.js +3 -6
- package/src/org/cass/importer/CSVImport.js +9 -17
- package/src/org/cass/importer/CTDLASNCSVConceptImport.js +25 -121
- package/src/org/cass/importer/CTDLASNCSVImport.js +88 -133
- package/src/org/cass/importer/FrameworkImport.js +16 -30
- package/src/org/cass/importer/MedbiqImport.js +3 -4
- package/src/org/cass/importer/TabStructuredImport.js +6 -6
- package/src/org/cass/profile/EcAssertion.js +40 -51
- package/src/org/cassproject/ebac/identity/EcContactGrant.js +2 -2
- package/src/org/cassproject/ebac/identity/EcIdentityManager.js +56 -62
- package/src/org/cassproject/ebac/identity/remote/EcRemoteIdentityManager.js +51 -62
- package/src/org/cassproject/ebac/identity/remote/OAuth2FileBasedRemoteIdentityManager.js +56 -70
- package/src/org/cassproject/ebac/identity/remote/RemoteIdentityManagerInterface.js +3 -3
- package/src/org/cassproject/ebac/repository/EcEncryptedValue.js +51 -44
- package/src/org/cassproject/ebac/repository/EcRepository.js +228 -301
- package/src/org/cassproject/general/repository/GeneralFile.js +8 -9
- package/src/org/cassproject/schema/cass/competency/Competency.js +10 -11
- package/src/org/cassproject/schema/cass/competency/Framework.js +10 -11
- package/src/org/cassproject/schema/cass/competency/Level.js +10 -11
- package/src/org/cassproject/schema/cass/competency/Relation.js +10 -11
- package/src/org/cassproject/schema/cass/competency/RollupRule.js +7 -7
- package/src/org/cassproject/schema/cass/profile/Assertion.js +20 -27
- package/src/org/cassproject/schema/cass/profile/AssertionEnvelope.js +3 -5
- package/src/org/cassproject/schema/general/EcRemoteLinkedData.js +41 -44
- package/src/org/json/ld/EcLinkedData.js +10 -12
- package/src/org/schema/EcOrganization.js +10 -10
- package/src/org/schema/EcQuestion.js +8 -8
- package/src/org/w3/skos/Concept.js +6 -6
- package/src/org/w3/skos/ConceptScheme.js +6 -6
- package/src/org/w3/skos/EcConcept.js +1 -2
- package/src/org/w3/skos/EcConceptScheme.js +1 -2
- package/src/test/0.start.test.js +1 -1
- package/src/test/0.testLibraries.test.js +172 -0
- package/src/test/1.ASNImport.test.js +122 -0
- package/src/test/1.CSVExport.test.js +57 -0
- package/src/test/1.CSVImport.test.js +185 -0
- package/src/test/1.CTDLASNCSVConceptImport.test.js +348 -0
- package/src/test/1.CTDLASNCSVImport.import.test.js +497 -0
- package/src/test/1.Ebac.schema.test.js +107 -0
- package/src/test/1.EcAssertion.decrypt.test.js +98 -0
- package/src/test/1.EcAssertion.pinned.test.js +160 -0
- package/src/test/1.EcCrypto.formats.test.js +293 -0
- package/src/test/1.EcCrypto.generateUUID.test.js +47 -0
- package/src/test/1.EcEncryptedValue.helpers.test.js +236 -0
- package/src/test/1.EcHelpers.misc.test.js +259 -0
- package/src/test/1.EcIdentityManager.keys.test.js +439 -0
- package/src/test/1.EcOrganization.rekey.test.js +68 -0
- package/src/test/1.EcRemote.responses.test.js +155 -0
- package/src/test/1.EcRemoteIdentityManager.flows.test.js +326 -0
- package/src/test/1.EcRemoteLinkedData.pinned.test.js +473 -0
- package/src/test/1.EcRepository.l0.test.js +14 -5
- package/src/test/1.EcRepository.l1.test.js +16 -7
- package/src/test/1.EcRepository.l2.test.js +20 -11
- package/src/test/1.EcRepository.unit.test.js +961 -0
- package/src/test/1.EcRsaOaep.test.js +2 -12
- package/src/test/1.EcRsaOaepAsync.test.js +2 -12
- package/src/test/1.EcRsaOaepAsyncWorker.test.js +2 -12
- package/src/test/1.EcRsaOaepAsyncWorker.workers.test.js +147 -0
- package/src/test/1.FrameworkImport.test.js +170 -0
- package/src/test/1.MedbiqImport.test.js +92 -0
- package/src/test/1.OAuth2FileBasedRemoteIdentityManager.test.js +399 -0
- package/src/test/1.TabStructuredImport.test.js +61 -0
- package/src/test/1.polyfills.test.js +89 -0
- package/src/test/1.schema.competency.pinned.test.js +384 -0
- package/src/test/3.EcFrameworkGraph.test.js +3 -2
- package/src/test/4.schema.test.js +33 -28
- package/src/test/4.skyId.test.js +4 -2
- package/src/test/cypressValue.js +9 -0
- package/src/test/2.EcCompetency.test.js +0 -17
|
@@ -15,6 +15,32 @@ const base64 = require("base64-arraybuffer");
|
|
|
15
15
|
const EcRemoteLinkedData = require("../../schema/general/EcRemoteLinkedData");
|
|
16
16
|
require("../../general/AuditLogger.js")
|
|
17
17
|
|
|
18
|
+
function encryptSecretFor(pk, secret) {
|
|
19
|
+
let eSecret = new EbacEncryptedSecret();
|
|
20
|
+
eSecret.secret = secret;
|
|
21
|
+
return EcRsaOaepAsyncWorker.encrypt(
|
|
22
|
+
EcPk.fromPem(pk),
|
|
23
|
+
eSecret.toEncryptableJson()
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// The secret already encrypted for pk under this reuse entry (encrypting it on first use),
|
|
28
|
+
// or null when there is no usable entry. A stale or mismatched entry is dropped.
|
|
29
|
+
function reusedEncryptedSecret(reuseMap, key, pk, secret) {
|
|
30
|
+
let reuse = reuseMap[key];
|
|
31
|
+
if (reuse == null) return null;
|
|
32
|
+
if (!(reuse.expires > Date.now() && reuse.secret == secret)) {
|
|
33
|
+
delete reuseMap[key];
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
if (reuse.encryptedSecret?.[pk] == null) {
|
|
37
|
+
if (reuse.encryptedSecret == null)
|
|
38
|
+
reuse.encryptedSecret = {};
|
|
39
|
+
reuse.encryptedSecret[pk] = encryptSecretFor(pk, secret);
|
|
40
|
+
}
|
|
41
|
+
return reuse.encryptedSecret[pk];
|
|
42
|
+
}
|
|
43
|
+
|
|
18
44
|
/**
|
|
19
45
|
* Represents an encrypted piece of data. Provides helper functions for
|
|
20
46
|
* encryption/decryption of JSON-LD objects, and provides some searchability of
|
|
@@ -87,7 +113,7 @@ module.exports = class EcEncryptedValue extends EbacEncryptedValue {
|
|
|
87
113
|
*/
|
|
88
114
|
getEncryptedFullType() {
|
|
89
115
|
if (this.encryptedContext == null) return this.encryptedType;
|
|
90
|
-
if (this.encryptedType.
|
|
116
|
+
if (this.encryptedType.includes("http")) return this.encryptedType;
|
|
91
117
|
let computedType = this.encryptedContext;
|
|
92
118
|
if (EcObject.isObject(this.encryptedContext)) {
|
|
93
119
|
let typeParts = this.encryptedType.split(":");
|
|
@@ -107,7 +133,7 @@ module.exports = class EcEncryptedValue extends EbacEncryptedValue {
|
|
|
107
133
|
return this.getEncryptedFullType()
|
|
108
134
|
.replace("http://", "")
|
|
109
135
|
.replace("https://", "")
|
|
110
|
-
.
|
|
136
|
+
.replaceAll("/", ".");
|
|
111
137
|
}
|
|
112
138
|
static getIvSecret(length, owners, readers) {
|
|
113
139
|
if (EcEncryptedValue.secretReuse) {
|
|
@@ -241,7 +267,7 @@ module.exports = class EcEncryptedValue extends EbacEncryptedValue {
|
|
|
241
267
|
* @param {String} id ID of the value to encrypt
|
|
242
268
|
* @param {String[]} owners Owner keys to encrypt value with
|
|
243
269
|
* @param {String[]} readers Reader keys to encrypt value with
|
|
244
|
-
* @return {EcEncryptedValue} Encrypted value
|
|
270
|
+
* @return {Promise<EcEncryptedValue>} Encrypted value
|
|
245
271
|
* @memberOf EcEncryptedValue
|
|
246
272
|
* @method encryptValue
|
|
247
273
|
* @static
|
|
@@ -314,32 +340,15 @@ module.exports = class EcEncryptedValue extends EbacEncryptedValue {
|
|
|
314
340
|
if (EcEncryptedValue.secretReuse) {
|
|
315
341
|
if (owners == null) owners = [];
|
|
316
342
|
if (readers == null) readers = [];
|
|
317
|
-
let
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
reuse.encryptedSecret = {};
|
|
325
|
-
reuse.encryptedSecret[pk] = EcRsaOaepAsyncWorker.encrypt(
|
|
326
|
-
EcPk.fromPem(pk),
|
|
327
|
-
eSecret.toEncryptableJson()
|
|
328
|
-
);
|
|
329
|
-
}
|
|
330
|
-
return reuse.encryptedSecret[pk];
|
|
331
|
-
} else {
|
|
332
|
-
delete EcEncryptedValue.secretReuseMap[[...owners, ...readers].join(",")];
|
|
333
|
-
}
|
|
334
|
-
}
|
|
343
|
+
let reused = reusedEncryptedSecret(
|
|
344
|
+
EcEncryptedValue.secretReuseMap,
|
|
345
|
+
[...owners, ...readers].join(","),
|
|
346
|
+
pk,
|
|
347
|
+
newSecret
|
|
348
|
+
);
|
|
349
|
+
if (reused != null) return reused;
|
|
335
350
|
}
|
|
336
|
-
|
|
337
|
-
let eSecret = new EbacEncryptedSecret();
|
|
338
|
-
eSecret.secret = newSecret;
|
|
339
|
-
return EcRsaOaepAsyncWorker.encrypt(
|
|
340
|
-
EcPk.fromPem(pk),
|
|
341
|
-
eSecret.toEncryptableJson()
|
|
342
|
-
);
|
|
351
|
+
return encryptSecretFor(pk, newSecret);
|
|
343
352
|
};
|
|
344
353
|
if (owners != null)
|
|
345
354
|
promises = promises.concat(
|
|
@@ -349,11 +358,10 @@ module.exports = class EcEncryptedValue extends EbacEncryptedValue {
|
|
|
349
358
|
promises = promises.concat(
|
|
350
359
|
readers.map((pk) => insertSecret(pk, iv, secret))
|
|
351
360
|
);
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
return p;
|
|
361
|
+
return Promise.all(promises);
|
|
362
|
+
}).then((secrets) => {
|
|
363
|
+
v.secret = secrets;
|
|
364
|
+
return v;
|
|
357
365
|
}),
|
|
358
366
|
success,
|
|
359
367
|
failure
|
|
@@ -574,7 +582,7 @@ module.exports = class EcEncryptedValue extends EbacEncryptedValue {
|
|
|
574
582
|
let typeSplit = type.split("/");
|
|
575
583
|
return (
|
|
576
584
|
this.encryptedType == type ||
|
|
577
|
-
this.encryptedType == typeSplit
|
|
585
|
+
this.encryptedType == typeSplit.at(-1)
|
|
578
586
|
);
|
|
579
587
|
}
|
|
580
588
|
/**
|
|
@@ -584,19 +592,19 @@ module.exports = class EcEncryptedValue extends EbacEncryptedValue {
|
|
|
584
592
|
* @memberOf EcEncryptedValue
|
|
585
593
|
* @method addReader
|
|
586
594
|
*/
|
|
587
|
-
addReader(newReader, eim) {
|
|
595
|
+
addReader(newReader, eim) { // NOSONAR - Re-encrypts asynchronously; the synchronous parent stays synchronous
|
|
588
596
|
super.addReader(newReader);
|
|
589
597
|
return this.decryptSecret(eim).then((decryptedSecret) => {
|
|
590
598
|
if (decryptedSecret == null) {
|
|
591
|
-
throw "Cannot add a Reader if you don't know the secret";
|
|
599
|
+
throw "Cannot add a Reader if you don't know the secret"; // NOSONAR - Callers may catch and compare this string; an Error would change what they get.
|
|
592
600
|
}
|
|
593
601
|
return EcRsaOaepAsyncWorker.encrypt(
|
|
594
602
|
newReader,
|
|
595
603
|
decryptedSecret.toEncryptableJson()
|
|
596
|
-
).then((encryptedSecret) =>
|
|
597
|
-
EcArray.setAdd(this.secret, encryptedSecret)
|
|
598
604
|
);
|
|
599
|
-
})
|
|
605
|
+
}).then((encryptedSecret) =>
|
|
606
|
+
EcArray.setAdd(this.secret, encryptedSecret)
|
|
607
|
+
);
|
|
600
608
|
}
|
|
601
609
|
/**
|
|
602
610
|
* Removes a reader from the object, if the reader does exist.
|
|
@@ -605,7 +613,7 @@ module.exports = class EcEncryptedValue extends EbacEncryptedValue {
|
|
|
605
613
|
* @memberOf EcEncryptedValue
|
|
606
614
|
* @method removeReader
|
|
607
615
|
*/
|
|
608
|
-
removeReader(oldReader, eim) {
|
|
616
|
+
removeReader(oldReader, eim) { // NOSONAR - Re-encrypts asynchronously; the synchronous parent stays synchronous
|
|
609
617
|
return this.decryptSecret(eim).then((decryptedSecret) => {
|
|
610
618
|
if (this.reader != null) {
|
|
611
619
|
EcArray.setRemove(this.reader, oldReader.toPem());
|
|
@@ -630,10 +638,9 @@ module.exports = class EcEncryptedValue extends EbacEncryptedValue {
|
|
|
630
638
|
)
|
|
631
639
|
)
|
|
632
640
|
);
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
return p;
|
|
641
|
+
return Promise.all(promises);
|
|
642
|
+
}).then((secrets) => {
|
|
643
|
+
this.secret = secrets;
|
|
637
644
|
});
|
|
638
645
|
}
|
|
639
646
|
};
|