cassproject 5.0.20 → 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.
Files changed (107) hide show
  1. package/package.json +49 -52
  2. package/src/com/eduworks/ec/array/EcArray.js +1 -1
  3. package/src/com/eduworks/ec/array/EcAsyncHelper.js +1 -1
  4. package/src/com/eduworks/ec/array/EcObject.js +1 -1
  5. package/src/com/eduworks/ec/crypto/EcAes.js +1 -1
  6. package/src/com/eduworks/ec/crypto/EcAesCtrAsync.js +20 -22
  7. package/src/com/eduworks/ec/crypto/EcCrypto.js +8 -4
  8. package/src/com/eduworks/ec/crypto/EcPk.js +7 -7
  9. package/src/com/eduworks/ec/crypto/EcPpk.js +7 -7
  10. package/src/com/eduworks/ec/crypto/EcRsaOaepAsync.js +20 -19
  11. package/src/com/eduworks/ec/crypto/EcRsaOaepAsyncWorker.js +7 -6
  12. package/src/com/eduworks/ec/crypto/forgeAsync.js +1 -9
  13. package/src/com/eduworks/ec/crypto/forgeAsyncNode.js +8 -8
  14. package/src/com/eduworks/ec/graph/EcDirectedGraph.js +1 -2
  15. package/src/com/eduworks/ec/graph/EcFrameworkGraph.js +18 -24
  16. package/src/com/eduworks/ec/promises/helpers.js +1 -3
  17. package/src/com/eduworks/ec/remote/EcRemote.js +9 -9
  18. package/src/com/eduworks/ec/task/EcAsyncTask.js +5 -20
  19. package/src/com/eduworks/ec/task/EcAsyncTaskManager.js +3 -4
  20. package/src/com/eduworks/ec/task/EcAsyncTaskWorker.js +9 -11
  21. package/src/com/eduworks/schema/cfd/competency/CfdFramework.js +36 -37
  22. package/src/com/eduworks/schema/ebac/EbacContact.js +3 -9
  23. package/src/com/eduworks/schema/ebac/EbacContactGrant.js +3 -9
  24. package/src/com/eduworks/schema/ebac/EbacCredential.js +3 -9
  25. package/src/com/eduworks/schema/ebac/EbacCredentialCommit.js +3 -9
  26. package/src/com/eduworks/schema/ebac/EbacCredentialRequest.js +3 -9
  27. package/src/com/eduworks/schema/ebac/EbacCredentials.js +3 -9
  28. package/src/com/eduworks/schema/ebac/EbacEncryptedSecret.js +3 -9
  29. package/src/com/eduworks/schema/ebac/EbacEncryptedValue.js +5 -12
  30. package/src/com/eduworks/schema/ebac/EbacSignature.js +1 -6
  31. package/src/index/env.js +6 -3
  32. package/src/index/polyfills.js +13 -27
  33. package/src/org/angles/schema/angles/VideoStory.js +1 -1
  34. package/src/org/cass/competency/EcCompetency.js +1 -2
  35. package/src/org/cass/competency/EcDirectory.js +1 -2
  36. package/src/org/cass/competency/EcFramework.js +9 -12
  37. package/src/org/cass/exporter/CSVExport.js +12 -13
  38. package/src/org/cass/importer/ASNImport.js +3 -6
  39. package/src/org/cass/importer/CSVImport.js +9 -17
  40. package/src/org/cass/importer/CTDLASNCSVConceptImport.js +25 -121
  41. package/src/org/cass/importer/CTDLASNCSVImport.js +88 -133
  42. package/src/org/cass/importer/FrameworkImport.js +16 -30
  43. package/src/org/cass/importer/MedbiqImport.js +3 -4
  44. package/src/org/cass/importer/TabStructuredImport.js +6 -6
  45. package/src/org/cass/profile/EcAssertion.js +40 -51
  46. package/src/org/cassproject/ebac/identity/EcContactGrant.js +2 -2
  47. package/src/org/cassproject/ebac/identity/EcIdentityManager.js +56 -62
  48. package/src/org/cassproject/ebac/identity/EcRekeyRequest.js +3 -2
  49. package/src/org/cassproject/ebac/identity/remote/EcRemoteIdentityManager.js +51 -62
  50. package/src/org/cassproject/ebac/identity/remote/OAuth2FileBasedRemoteIdentityManager.js +56 -70
  51. package/src/org/cassproject/ebac/identity/remote/RemoteIdentityManagerInterface.js +3 -3
  52. package/src/org/cassproject/ebac/repository/EcEncryptedValue.js +51 -44
  53. package/src/org/cassproject/ebac/repository/EcRepository.js +228 -301
  54. package/src/org/cassproject/general/repository/GeneralFile.js +8 -9
  55. package/src/org/cassproject/schema/cass/competency/Competency.js +10 -11
  56. package/src/org/cassproject/schema/cass/competency/Framework.js +10 -11
  57. package/src/org/cassproject/schema/cass/competency/Level.js +10 -11
  58. package/src/org/cassproject/schema/cass/competency/Relation.js +10 -11
  59. package/src/org/cassproject/schema/cass/competency/RollupRule.js +7 -7
  60. package/src/org/cassproject/schema/cass/profile/Assertion.js +20 -27
  61. package/src/org/cassproject/schema/cass/profile/AssertionEnvelope.js +3 -5
  62. package/src/org/cassproject/schema/general/EcRemoteLinkedData.js +41 -44
  63. package/src/org/json/ld/EcLinkedData.js +10 -12
  64. package/src/org/schema/EcOrganization.js +10 -10
  65. package/src/org/schema/EcQuestion.js +8 -8
  66. package/src/org/w3/skos/Concept.js +6 -6
  67. package/src/org/w3/skos/ConceptScheme.js +6 -6
  68. package/src/org/w3/skos/EcConcept.js +1 -2
  69. package/src/org/w3/skos/EcConceptScheme.js +1 -2
  70. package/src/test/0.start.test.js +1 -1
  71. package/src/test/0.testLibraries.test.js +172 -0
  72. package/src/test/1.ASNImport.test.js +122 -0
  73. package/src/test/1.CSVExport.test.js +57 -0
  74. package/src/test/1.CSVImport.test.js +185 -0
  75. package/src/test/1.CTDLASNCSVConceptImport.test.js +348 -0
  76. package/src/test/1.CTDLASNCSVImport.import.test.js +497 -0
  77. package/src/test/1.Ebac.schema.test.js +107 -0
  78. package/src/test/1.EcAssertion.decrypt.test.js +98 -0
  79. package/src/test/1.EcAssertion.pinned.test.js +160 -0
  80. package/src/test/1.EcCrypto.formats.test.js +293 -0
  81. package/src/test/1.EcCrypto.generateUUID.test.js +47 -0
  82. package/src/test/1.EcEncryptedValue.helpers.test.js +236 -0
  83. package/src/test/1.EcHelpers.misc.test.js +259 -0
  84. package/src/test/1.EcIdentityManager.keys.test.js +439 -0
  85. package/src/test/1.EcOrganization.rekey.test.js +68 -0
  86. package/src/test/1.EcRemote.responses.test.js +155 -0
  87. package/src/test/1.EcRemoteIdentityManager.flows.test.js +326 -0
  88. package/src/test/1.EcRemoteLinkedData.pinned.test.js +473 -0
  89. package/src/test/1.EcRepository.l0.test.js +14 -5
  90. package/src/test/1.EcRepository.l1.test.js +16 -7
  91. package/src/test/1.EcRepository.l2.test.js +20 -11
  92. package/src/test/1.EcRepository.unit.test.js +961 -0
  93. package/src/test/1.EcRsaOaep.test.js +2 -12
  94. package/src/test/1.EcRsaOaepAsync.test.js +2 -12
  95. package/src/test/1.EcRsaOaepAsyncWorker.test.js +2 -12
  96. package/src/test/1.EcRsaOaepAsyncWorker.workers.test.js +147 -0
  97. package/src/test/1.FrameworkImport.test.js +170 -0
  98. package/src/test/1.MedbiqImport.test.js +92 -0
  99. package/src/test/1.OAuth2FileBasedRemoteIdentityManager.test.js +399 -0
  100. package/src/test/1.TabStructuredImport.test.js +61 -0
  101. package/src/test/1.polyfills.test.js +89 -0
  102. package/src/test/1.schema.competency.pinned.test.js +384 -0
  103. package/src/test/3.EcFrameworkGraph.test.js +3 -2
  104. package/src/test/4.schema.test.js +33 -28
  105. package/src/test/4.skyId.test.js +4 -2
  106. package/src/test/cypressValue.js +9 -0
  107. 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.indexOf("http") != -1) return 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
- .replace(/\//g, ".");
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 reuse = EcEncryptedValue.secretReuseMap[[...owners, ...readers].join(",")];
318
- if (reuse != null) {
319
- if (reuse.expires > Date.now() && reuse.secret == newSecret) {
320
- if (reuse.encryptedSecret?.[pk] == null) {
321
- let eSecret = new EbacEncryptedSecret();
322
- eSecret.secret = newSecret;
323
- if (reuse.encryptedSecret == null)
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
- let p = Promise.all(promises).then((secrets) => {
353
- v.secret = secrets;
354
- return v;
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[typeSplit.length - 1]
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
- let p = Promise.all(promises).then((secrets) => {
634
- this.secret = secrets;
635
- });
636
- return p;
641
+ return Promise.all(promises);
642
+ }).then((secrets) => {
643
+ this.secret = secrets;
637
644
  });
638
645
  }
639
646
  };