@raytio/core 8.1.0 → 9.0.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.
Files changed (79) hide show
  1. package/README.md +460 -1
  2. package/dist/accessApplication/createAA.js +0 -1
  3. package/dist/crypto/decryptKeys.js +0 -2
  4. package/dist/crypto/decryptSharedData.js +7 -4
  5. package/dist/crypto/helpers.d.ts +1 -1
  6. package/dist/general/index.d.ts +1 -0
  7. package/dist/general/index.js +1 -0
  8. package/dist/general/types.d.ts +6 -0
  9. package/dist/general/types.js +13 -0
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.js +1 -0
  12. package/dist/rules/calculateScore.d.ts +11 -0
  13. package/dist/rules/calculateScore.js +52 -0
  14. package/dist/rules/convertInstanceToRuleInput.d.ts +3 -0
  15. package/dist/rules/convertInstanceToRuleInput.js +140 -0
  16. package/dist/rules/evaluateScoreCondition.d.ts +2 -0
  17. package/dist/rules/evaluateScoreCondition.js +45 -0
  18. package/dist/rules/helpers/addInfiniteThresholdBoundaries.d.ts +8 -0
  19. package/dist/rules/helpers/addInfiniteThresholdBoundaries.js +11 -0
  20. package/dist/rules/helpers/checkTypeofValue.d.ts +3 -0
  21. package/dist/rules/helpers/checkTypeofValue.js +43 -0
  22. package/dist/rules/helpers/getValuesFromPath.d.ts +3 -0
  23. package/dist/rules/helpers/getValuesFromPath.js +50 -0
  24. package/dist/rules/helpers/index.d.ts +5 -0
  25. package/dist/rules/helpers/index.js +17 -0
  26. package/dist/rules/helpers/symbols.d.ts +2 -0
  27. package/dist/rules/helpers/symbols.js +5 -0
  28. package/dist/rules/helpers/thresholds.d.ts +5 -0
  29. package/dist/rules/helpers/thresholds.js +47 -0
  30. package/dist/rules/index.d.ts +6 -0
  31. package/dist/rules/index.js +20 -0
  32. package/dist/rules/operators/bool.d.ts +2 -0
  33. package/dist/rules/operators/bool.js +17 -0
  34. package/dist/rules/operators/date.d.ts +2 -0
  35. package/dist/rules/operators/date.js +91 -0
  36. package/dist/rules/operators/hfield.d.ts +2 -0
  37. package/dist/rules/operators/hfield.js +33 -0
  38. package/dist/rules/operators/hschema.d.ts +2 -0
  39. package/dist/rules/operators/hschema.js +21 -0
  40. package/dist/rules/operators/index.d.ts +3 -0
  41. package/dist/rules/operators/index.js +11 -0
  42. package/dist/rules/operators/number.d.ts +2 -0
  43. package/dist/rules/operators/number.js +41 -0
  44. package/dist/rules/operators/string.d.ts +2 -0
  45. package/dist/rules/operators/string.js +58 -0
  46. package/dist/rules/types/config.d.ts +86 -0
  47. package/dist/rules/types/config.js +2 -0
  48. package/dist/rules/types/dataValueTypes.d.ts +19 -0
  49. package/dist/rules/types/dataValueTypes.js +4 -0
  50. package/dist/rules/types/index.d.ts +3 -0
  51. package/dist/rules/types/index.js +15 -0
  52. package/dist/rules/types/internal.d.ts +20 -0
  53. package/dist/rules/types/internal.js +2 -0
  54. package/dist/{verifications/checkVerifications.d.ts → util/canonicalJsonify.d.ts} +0 -0
  55. package/dist/util/canonicalJsonify.js +48 -0
  56. package/dist/util/handleResponse.js +0 -1
  57. package/dist/util/index.d.ts +1 -0
  58. package/dist/util/index.js +1 -0
  59. package/dist/verifications/cleanInstance.d.ts +9 -0
  60. package/dist/verifications/cleanInstance.js +15 -0
  61. package/dist/verifications/getPOVerification.d.ts +5 -2
  62. package/dist/verifications/getPOVerification.js +3 -4
  63. package/dist/verifications/index.d.ts +2 -1
  64. package/dist/verifications/index.js +2 -1
  65. package/dist/verifications/safeHarbour.d.ts +2 -3
  66. package/dist/verifications/safeHarbour.js +2 -2
  67. package/dist/verifications/verifyCheck/getOwnRealVerifications.d.ts +13 -0
  68. package/dist/verifications/verifyCheck/getOwnRealVerifications.js +63 -0
  69. package/dist/verifications/{getRealVerifications.d.ts → verifyCheck/getSomeoneElsesRealVerifications.d.ts} +6 -2
  70. package/dist/verifications/{getRealVerifications.js → verifyCheck/getSomeoneElsesRealVerifications.js} +26 -16
  71. package/dist/verifications/verifyCheck/index.d.ts +2 -0
  72. package/dist/verifications/verifyCheck/index.js +14 -0
  73. package/dist/verifications/verifyCheck/operations/checkOwnVerification.d.ts +9 -0
  74. package/dist/verifications/verifyCheck/operations/checkOwnVerification.js +31 -0
  75. package/dist/verifications/verifyCheck/operations/checkSomeoneElsesVerifications.d.ts +1 -0
  76. package/dist/verifications/{checkVerifications.js → verifyCheck/operations/checkSomeoneElsesVerifications.js} +4 -4
  77. package/dist/verifications/verifyCheck/operations/index.d.ts +2 -0
  78. package/dist/verifications/verifyCheck/operations/index.js +14 -0
  79. package/package.json +8 -8
@@ -1,29 +1,35 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getRealVerifications = void 0;
3
+ exports.getSomeoneElsesRealVerifications = void 0;
4
4
  const ramda_1 = require("ramda");
5
- const crypto_1 = require("../crypto");
6
- const checkVerifications_1 = require("./checkVerifications");
7
- const maybeRereference_1 = require("./maybeRereference");
8
- const getValuesForAField = (fieldName) => (0, ramda_1.pipe)((0, ramda_1.map)(x => { var _a; return (_a = x.properties) === null || _a === void 0 ? void 0 : _a[fieldName]; }), (0, ramda_1.filter)(x => !!x), // truthy only
9
- (0, ramda_1.reject)(crypto_1.isEncrypted), // ignore encrypted properties. this function will be called again once they're decrypted
10
- ramda_1.uniq);
5
+ const operations_1 = require("./operations");
6
+ const maybeRereference_1 = require("../maybeRereference");
7
+ const crypto_1 = require("../../crypto");
8
+ const getValuesForAField = (fieldName, POs) => (0, ramda_1.uniq)(
9
+ // truthy only, and ignore encrypted properties. this function will be called again once they're decrypted
10
+ POs.map(x => { var _a; return (_a = x.properties) === null || _a === void 0 ? void 0 : _a[fieldName]; }).filter(x => !!x && !(0, crypto_1.isEncrypted)(x)));
11
11
  /**
12
12
  * Given a list of verifications and decrypted profile objects, this function calls
13
13
  * the Raytio API to verify the credibility of these verifications, returning only valid
14
14
  * verifications.
15
+ *
16
+ * ❗ prefer `getOwnRealVerifications` if the data to be verified belongs to the current user.
17
+ *
15
18
  * @returns a list of fileNames/values that are verified.
16
19
  */
17
- const getRealVerifications = async ({ apiUrl, verifications, profileObjects, controller, UNSAFE_treatNoValueAsVerified, }) => {
20
+ const getSomeoneElsesRealVerifications = async ({ aId, apiUrl, verifications, profileObjects, controller, UNSAFE_treatNoValueAsVerified, }) => {
18
21
  // for each verification (including passed: false), create a list of every possible that
19
22
  // value that that verification might have been for. Flatten the list
20
23
  // and send the whole thing to the API.
21
24
  const toVerify = verifications.flatMap(ver => {
22
- const values = getValuesForAField(ver.properties.field)(profileObjects);
25
+ const values = getValuesForAField(ver.properties.field, profileObjects);
23
26
  return values.flatMap(value => ver.properties.verifications.map(({ signature }) => ({
24
27
  verifications: [
25
28
  Object.assign({ signature }, (ver.n_id.startsWith("HASHED::")
26
- ? { hashed_n_id: ver.n_id.slice(8) }
29
+ ? {
30
+ hashed_n_id: ver.n_id.split("::")[1],
31
+ a_id: ver.n_id.split("::")[2],
32
+ }
27
33
  : { n_id: ver.n_id })),
28
34
  ],
29
35
  data_to_verify: [{ value: (0, maybeRereference_1.maybeRereference)(value) }],
@@ -32,19 +38,21 @@ const getRealVerifications = async ({ apiUrl, verifications, profileObjects, con
32
38
  // the API can't cope with an empty array
33
39
  if (!toVerify.length)
34
40
  return [];
35
- const apiResponse = await (0, checkVerifications_1.checkVerifications)({
41
+ const apiResponse = await (0, operations_1.checkSomeoneElsesVerifications)({
36
42
  apiUrl,
37
43
  toVerify,
38
44
  controller,
39
45
  });
40
46
  // do NOT expose the `verified` prop from the /verify_check API to avoid semantic confusion,
41
47
  // since verified: true does not mean that the verification is verified!
42
- const realVers = (0, ramda_1.pipe)((0, ramda_1.filter)(x => x.verified ||
48
+ const realVers = apiResponse
49
+ .filter(x => x.verified ||
43
50
  // if UNSAFE_treatNoValueAsVerified is enabled, and we don't know the value of this field,
44
51
  // treat is as verified if the `passed` property is true (this is NOT a safe check).
45
52
  (!!UNSAFE_treatNoValueAsVerified &&
46
53
  x.data.value === UNSAFE_treatNoValueAsVerified &&
47
- x.data.passed)), (0, ramda_1.map)(({ signature, data, n_id: nID, valid_until }) => ({
54
+ x.data.passed))
55
+ .map(({ signature, data, n_id: nID, valid_until }) => ({
48
56
  fieldName: data.field,
49
57
  value: data.value,
50
58
  provider: {
@@ -59,8 +67,10 @@ const getRealVerifications = async ({ apiUrl, verifications, profileObjects, con
59
67
  signature,
60
68
  verified: data.passed,
61
69
  nID,
62
- belongsToNId: data.source_n_id,
63
- })))(apiResponse);
70
+ belongsToNId: data.source_hashed_n_id
71
+ ? `HASHED::${data.source_hashed_n_id}::${aId}`
72
+ : data.source_n_id,
73
+ }));
64
74
  return realVers;
65
75
  };
66
- exports.getRealVerifications = getRealVerifications;
76
+ exports.getSomeoneElsesRealVerifications = getSomeoneElsesRealVerifications;
@@ -0,0 +1,2 @@
1
+ export * from "./getOwnRealVerifications";
2
+ export * from "./getSomeoneElsesRealVerifications";
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./getOwnRealVerifications"), exports);
14
+ __exportStar(require("./getSomeoneElsesRealVerifications"), exports);
@@ -0,0 +1,9 @@
1
+ import { UId, VerificationPayload } from "@raytio/types";
2
+ declare type SingleVerToCheck = {
3
+ verObject: VerificationPayload<false>;
4
+ signature: string;
5
+ userId: UId;
6
+ value: unknown;
7
+ };
8
+ export declare const checkOwnVerification: ({ verObject, signature, userId, value, }: SingleVerToCheck) => Promise<boolean>;
9
+ export {};
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkOwnVerification = exports.checkSignature = void 0;
4
+ const util_1 = require("../../../util");
5
+ let cache; // eslint-disable-line fp/no-let
6
+ const base64ToArrayBuffer = (str) => Uint8Array.from(atob(str), c => c.charCodeAt(0));
7
+ async function getJwk() {
8
+ // eslint-disable-next-line fp/no-mutation
9
+ cache || (cache = fetch("https://api-docs.rayt.io/lookups/raytio.pem")
10
+ .then(r => r.text())
11
+ .then(pem => crypto.subtle.importKey("spki", base64ToArrayBuffer(pem.split("-----")[2].trim()), { name: "RSA-PSS", hash: "SHA-512" }, false, ["verify"])));
12
+ return cache;
13
+ }
14
+ /** @internal exported only for tests */
15
+ async function checkSignature(publicCryptoKey, signature, data) {
16
+ // the logic must match https://gitlab.com/raytio/mono/-/blob/devo/common/signing/signing/sign.py
17
+ const signatureBuf = base64ToArrayBuffer(signature);
18
+ const isVerified = await crypto.subtle.verify({ name: "RSA-PSS", hash: "SHA-512", saltLength: 512 / 8 }, publicCryptoKey, signatureBuf, new TextEncoder().encode(data));
19
+ return isVerified;
20
+ }
21
+ exports.checkSignature = checkSignature;
22
+ const checkOwnVerification = async ({ verObject, signature, userId, value, }) => {
23
+ const jwk = await getJwk();
24
+ if (!userId)
25
+ throw new Error("No userId supplied");
26
+ const exapandedObject = Object.assign(Object.assign({}, verObject), { sub: userId, value });
27
+ const stringified = (0, util_1.canonicalJsonify)(exapandedObject);
28
+ const result = await checkSignature(jwk, signature, stringified);
29
+ return result;
30
+ };
31
+ exports.checkOwnVerification = checkOwnVerification;
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.checkVerifications = void 0;
4
- const util_1 = require("../util");
3
+ exports.checkSomeoneElsesVerifications = void 0;
4
+ const util_1 = require("../../../util");
5
5
  /** @internal */
6
- const checkVerifications = async ({ apiUrl, toVerify, controller, }) => {
6
+ const checkSomeoneElsesVerifications = async ({ apiUrl, toVerify, controller, }) => {
7
7
  const response = await fetch(`${apiUrl}/extract_verify/v2/verify_check`, {
8
8
  method: "POST",
9
9
  body: JSON.stringify(toVerify),
@@ -13,4 +13,4 @@ const checkVerifications = async ({ apiUrl, toVerify, controller, }) => {
13
13
  // extra `m` items are garbage and don't have the verified field.
14
14
  return response.filter(ver => "verified" in ver);
15
15
  };
16
- exports.checkVerifications = checkVerifications;
16
+ exports.checkSomeoneElsesVerifications = checkSomeoneElsesVerifications;
@@ -0,0 +1,2 @@
1
+ export * from "./checkOwnVerification";
2
+ export * from "./checkSomeoneElsesVerifications";
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./checkOwnVerification"), exports);
14
+ __exportStar(require("./checkSomeoneElsesVerifications"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raytio/core",
3
- "version": "8.1.0",
3
+ "version": "9.0.0",
4
4
  "license": "MIT",
5
5
  "main": "index",
6
6
  "types": "index",
@@ -15,22 +15,22 @@
15
15
  "test": "jest"
16
16
  },
17
17
  "dependencies": {
18
- "@raytio/maxcryptor": "3.0.1",
19
- "@raytio/types": "5.2.0",
20
- "ramda": "0.27.1"
18
+ "@raytio/maxcryptor": "3.1.0",
19
+ "@raytio/types": "5.2.1",
20
+ "ramda": "0.28.0"
21
21
  },
22
22
  "devDependencies": {
23
- "@types/ramda": "0.27.44",
24
- "jest": "27.1.0",
23
+ "@types/ramda": "0.27.64",
24
+ "jest": "27.4.7",
25
25
  "localstorage-polyfill": "1.0.1",
26
- "ts-jest": "27.0.5"
26
+ "ts-jest": "27.1.3"
27
27
  },
28
28
  "jest": {
29
29
  "transform": {
30
30
  "^.+\\.(t|j)sx?$": "ts-jest"
31
31
  },
32
32
  "testEnvironment": "node",
33
- "collectCoverage": true,
33
+ "collectCoverage": false,
34
34
  "coverageThreshold": {
35
35
  "global": {
36
36
  "statements": 100