@friggframework/core 2.0.0-next.5 → 2.0.0-next.51
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/CLAUDE.md +693 -0
- package/README.md +959 -50
- package/application/commands/README.md +421 -0
- package/application/commands/credential-commands.js +224 -0
- package/application/commands/entity-commands.js +315 -0
- package/application/commands/integration-commands.js +179 -0
- package/application/commands/user-commands.js +213 -0
- package/application/index.js +69 -0
- package/core/CLAUDE.md +690 -0
- package/core/Worker.js +8 -21
- package/core/create-handler.js +2 -7
- package/credential/repositories/credential-repository-factory.js +47 -0
- package/credential/repositories/credential-repository-interface.js +98 -0
- package/credential/repositories/credential-repository-mongo.js +307 -0
- package/credential/repositories/credential-repository-postgres.js +313 -0
- package/credential/repositories/credential-repository.js +302 -0
- package/credential/use-cases/get-credential-for-user.js +21 -0
- package/credential/use-cases/update-authentication-status.js +15 -0
- package/database/MONGODB_TRANSACTION_FIX.md +198 -0
- package/database/adapters/lambda-invoker.js +97 -0
- package/database/config.js +154 -0
- package/database/encryption/README.md +684 -0
- package/database/encryption/encryption-schema-registry.js +141 -0
- package/database/encryption/field-encryption-service.js +226 -0
- package/database/encryption/logger.js +79 -0
- package/database/encryption/prisma-encryption-extension.js +222 -0
- package/database/index.js +25 -12
- package/database/models/WebsocketConnection.js +16 -10
- package/database/models/readme.md +1 -0
- package/database/prisma.js +222 -0
- package/database/repositories/health-check-repository-factory.js +43 -0
- package/database/repositories/health-check-repository-interface.js +87 -0
- package/database/repositories/health-check-repository-mongodb.js +91 -0
- package/database/repositories/health-check-repository-postgres.js +82 -0
- package/database/repositories/health-check-repository.js +108 -0
- package/database/repositories/migration-status-repository-s3.js +137 -0
- package/database/use-cases/check-database-health-use-case.js +29 -0
- package/database/use-cases/check-database-state-use-case.js +81 -0
- package/database/use-cases/check-encryption-health-use-case.js +83 -0
- package/database/use-cases/get-database-state-via-worker-use-case.js +61 -0
- package/database/use-cases/get-migration-status-use-case.js +93 -0
- package/database/use-cases/run-database-migration-use-case.js +137 -0
- package/database/use-cases/test-encryption-use-case.js +253 -0
- package/database/use-cases/trigger-database-migration-use-case.js +157 -0
- package/database/utils/mongodb-collection-utils.js +91 -0
- package/database/utils/mongodb-schema-init.js +106 -0
- package/database/utils/prisma-runner.js +400 -0
- package/database/utils/prisma-schema-parser.js +182 -0
- package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +517 -0
- package/encrypt/Cryptor.js +34 -168
- package/encrypt/index.js +1 -2
- package/encrypt/test-encrypt.js +0 -2
- package/generated/prisma-mongodb/client.d.ts +1 -0
- package/generated/prisma-mongodb/client.js +4 -0
- package/generated/prisma-mongodb/default.d.ts +1 -0
- package/generated/prisma-mongodb/default.js +4 -0
- package/generated/prisma-mongodb/edge.d.ts +1 -0
- package/generated/prisma-mongodb/edge.js +334 -0
- package/generated/prisma-mongodb/index-browser.js +316 -0
- package/generated/prisma-mongodb/index.d.ts +22898 -0
- package/generated/prisma-mongodb/index.js +359 -0
- package/generated/prisma-mongodb/package.json +183 -0
- package/generated/prisma-mongodb/query-engine-debian-openssl-3.0.x +0 -0
- package/generated/prisma-mongodb/query-engine-rhel-openssl-3.0.x +0 -0
- package/generated/prisma-mongodb/runtime/binary.d.ts +1 -0
- package/generated/prisma-mongodb/runtime/binary.js +289 -0
- package/generated/prisma-mongodb/runtime/edge-esm.js +34 -0
- package/generated/prisma-mongodb/runtime/edge.js +34 -0
- package/generated/prisma-mongodb/runtime/index-browser.d.ts +370 -0
- package/generated/prisma-mongodb/runtime/index-browser.js +16 -0
- package/generated/prisma-mongodb/runtime/library.d.ts +3982 -0
- package/generated/prisma-mongodb/runtime/react-native.js +83 -0
- package/generated/prisma-mongodb/runtime/wasm-compiler-edge.js +84 -0
- package/generated/prisma-mongodb/runtime/wasm-engine-edge.js +36 -0
- package/generated/prisma-mongodb/schema.prisma +362 -0
- package/generated/prisma-mongodb/wasm-edge-light-loader.mjs +4 -0
- package/generated/prisma-mongodb/wasm-worker-loader.mjs +4 -0
- package/generated/prisma-mongodb/wasm.d.ts +1 -0
- package/generated/prisma-mongodb/wasm.js +341 -0
- package/generated/prisma-postgresql/client.d.ts +1 -0
- package/generated/prisma-postgresql/client.js +4 -0
- package/generated/prisma-postgresql/default.d.ts +1 -0
- package/generated/prisma-postgresql/default.js +4 -0
- package/generated/prisma-postgresql/edge.d.ts +1 -0
- package/generated/prisma-postgresql/edge.js +356 -0
- package/generated/prisma-postgresql/index-browser.js +338 -0
- package/generated/prisma-postgresql/index.d.ts +25072 -0
- package/generated/prisma-postgresql/index.js +381 -0
- package/generated/prisma-postgresql/package.json +183 -0
- package/generated/prisma-postgresql/query-engine-debian-openssl-3.0.x +0 -0
- package/generated/prisma-postgresql/query-engine-rhel-openssl-3.0.x +0 -0
- package/generated/prisma-postgresql/query_engine_bg.js +2 -0
- package/generated/prisma-postgresql/query_engine_bg.wasm +0 -0
- package/generated/prisma-postgresql/runtime/binary.d.ts +1 -0
- package/generated/prisma-postgresql/runtime/binary.js +289 -0
- package/generated/prisma-postgresql/runtime/edge-esm.js +34 -0
- package/generated/prisma-postgresql/runtime/edge.js +34 -0
- package/generated/prisma-postgresql/runtime/index-browser.d.ts +370 -0
- package/generated/prisma-postgresql/runtime/index-browser.js +16 -0
- package/generated/prisma-postgresql/runtime/library.d.ts +3982 -0
- package/generated/prisma-postgresql/runtime/react-native.js +83 -0
- package/generated/prisma-postgresql/runtime/wasm-compiler-edge.js +84 -0
- package/generated/prisma-postgresql/runtime/wasm-engine-edge.js +36 -0
- package/generated/prisma-postgresql/schema.prisma +345 -0
- package/generated/prisma-postgresql/wasm-edge-light-loader.mjs +4 -0
- package/generated/prisma-postgresql/wasm-worker-loader.mjs +4 -0
- package/generated/prisma-postgresql/wasm.d.ts +1 -0
- package/generated/prisma-postgresql/wasm.js +363 -0
- package/handlers/WEBHOOKS.md +653 -0
- package/handlers/app-definition-loader.js +38 -0
- package/handlers/app-handler-helpers.js +56 -0
- package/handlers/backend-utils.js +180 -0
- package/handlers/database-migration-handler.js +227 -0
- package/handlers/integration-event-dispatcher.js +54 -0
- package/handlers/routers/HEALTHCHECK.md +342 -0
- package/handlers/routers/auth.js +15 -0
- package/handlers/routers/db-migration.handler.js +29 -0
- package/handlers/routers/db-migration.js +256 -0
- package/handlers/routers/health.js +519 -0
- package/handlers/routers/integration-defined-routers.js +45 -0
- package/handlers/routers/integration-webhook-routers.js +67 -0
- package/handlers/routers/user.js +63 -0
- package/handlers/routers/websocket.js +57 -0
- package/handlers/use-cases/check-external-apis-health-use-case.js +81 -0
- package/handlers/use-cases/check-integrations-health-use-case.js +44 -0
- package/handlers/workers/db-migration.js +352 -0
- package/handlers/workers/integration-defined-workers.js +27 -0
- package/index.js +77 -22
- package/integrations/WEBHOOK-QUICKSTART.md +151 -0
- package/integrations/index.js +12 -10
- package/integrations/integration-base.js +296 -54
- package/integrations/integration-router.js +381 -182
- package/integrations/options.js +1 -1
- package/integrations/repositories/integration-mapping-repository-factory.js +50 -0
- package/integrations/repositories/integration-mapping-repository-interface.js +106 -0
- package/integrations/repositories/integration-mapping-repository-mongo.js +161 -0
- package/integrations/repositories/integration-mapping-repository-postgres.js +227 -0
- package/integrations/repositories/integration-mapping-repository.js +156 -0
- package/integrations/repositories/integration-repository-factory.js +44 -0
- package/integrations/repositories/integration-repository-interface.js +127 -0
- package/integrations/repositories/integration-repository-mongo.js +303 -0
- package/integrations/repositories/integration-repository-postgres.js +352 -0
- package/integrations/repositories/process-repository-factory.js +46 -0
- package/integrations/repositories/process-repository-interface.js +90 -0
- package/integrations/repositories/process-repository-mongo.js +190 -0
- package/integrations/repositories/process-repository-postgres.js +217 -0
- package/integrations/tests/doubles/dummy-integration-class.js +83 -0
- package/integrations/tests/doubles/test-integration-repository.js +99 -0
- package/integrations/use-cases/create-integration.js +83 -0
- package/integrations/use-cases/create-process.js +128 -0
- package/integrations/use-cases/delete-integration-for-user.js +101 -0
- package/integrations/use-cases/find-integration-context-by-external-entity-id.js +72 -0
- package/integrations/use-cases/get-integration-for-user.js +78 -0
- package/integrations/use-cases/get-integration-instance-by-definition.js +67 -0
- package/integrations/use-cases/get-integration-instance.js +83 -0
- package/integrations/use-cases/get-integrations-for-user.js +88 -0
- package/integrations/use-cases/get-possible-integrations.js +27 -0
- package/integrations/use-cases/get-process.js +87 -0
- package/integrations/use-cases/index.js +19 -0
- package/integrations/use-cases/load-integration-context.js +71 -0
- package/integrations/use-cases/update-integration-messages.js +44 -0
- package/integrations/use-cases/update-integration-status.js +32 -0
- package/integrations/use-cases/update-integration.js +93 -0
- package/integrations/use-cases/update-process-metrics.js +201 -0
- package/integrations/use-cases/update-process-state.js +119 -0
- package/integrations/utils/map-integration-dto.js +37 -0
- package/jest-global-setup-noop.js +3 -0
- package/jest-global-teardown-noop.js +3 -0
- package/logs/logger.js +0 -4
- package/{module-plugin → modules}/entity.js +1 -1
- package/{module-plugin → modules}/index.js +0 -8
- package/modules/module-factory.js +56 -0
- package/modules/module.js +221 -0
- package/modules/repositories/module-repository-factory.js +33 -0
- package/modules/repositories/module-repository-interface.js +129 -0
- package/modules/repositories/module-repository-mongo.js +377 -0
- package/modules/repositories/module-repository-postgres.js +426 -0
- package/modules/repositories/module-repository.js +316 -0
- package/{module-plugin → modules}/requester/requester.js +1 -0
- package/{module-plugin → modules}/test/mock-api/api.js +8 -3
- package/{module-plugin → modules}/test/mock-api/definition.js +12 -8
- package/modules/tests/doubles/test-module-factory.js +16 -0
- package/modules/tests/doubles/test-module-repository.js +39 -0
- package/modules/use-cases/get-entities-for-user.js +32 -0
- package/modules/use-cases/get-entity-options-by-id.js +59 -0
- package/modules/use-cases/get-entity-options-by-type.js +34 -0
- package/modules/use-cases/get-module-instance-from-type.js +31 -0
- package/modules/use-cases/get-module.js +55 -0
- package/modules/use-cases/process-authorization-callback.js +122 -0
- package/modules/use-cases/refresh-entity-options.js +59 -0
- package/modules/use-cases/test-module-auth.js +55 -0
- package/modules/utils/map-module-dto.js +18 -0
- package/package.json +82 -50
- package/prisma-mongodb/schema.prisma +362 -0
- package/prisma-postgresql/migrations/20250930193005_init/migration.sql +315 -0
- package/prisma-postgresql/migrations/20251006135218_init/migration.sql +9 -0
- package/prisma-postgresql/migrations/20251010000000_remove_unused_entity_reference_map/migration.sql +3 -0
- package/prisma-postgresql/migrations/migration_lock.toml +3 -0
- package/prisma-postgresql/schema.prisma +345 -0
- package/queues/queuer-util.js +28 -15
- package/syncs/manager.js +468 -443
- package/syncs/repositories/sync-repository-factory.js +38 -0
- package/syncs/repositories/sync-repository-interface.js +109 -0
- package/syncs/repositories/sync-repository-mongo.js +239 -0
- package/syncs/repositories/sync-repository-postgres.js +319 -0
- package/syncs/sync.js +0 -1
- package/token/repositories/token-repository-factory.js +33 -0
- package/token/repositories/token-repository-interface.js +131 -0
- package/token/repositories/token-repository-mongo.js +212 -0
- package/token/repositories/token-repository-postgres.js +257 -0
- package/token/repositories/token-repository.js +219 -0
- package/types/core/index.d.ts +2 -2
- package/types/integrations/index.d.ts +2 -6
- package/types/module-plugin/index.d.ts +5 -59
- package/types/syncs/index.d.ts +0 -2
- package/user/repositories/user-repository-factory.js +46 -0
- package/user/repositories/user-repository-interface.js +198 -0
- package/user/repositories/user-repository-mongo.js +291 -0
- package/user/repositories/user-repository-postgres.js +350 -0
- package/user/tests/doubles/test-user-repository.js +72 -0
- package/user/use-cases/authenticate-user.js +127 -0
- package/user/use-cases/authenticate-with-shared-secret.js +48 -0
- package/user/use-cases/create-individual-user.js +61 -0
- package/user/use-cases/create-organization-user.js +47 -0
- package/user/use-cases/create-token-for-user-id.js +30 -0
- package/user/use-cases/get-user-from-adopter-jwt.js +149 -0
- package/user/use-cases/get-user-from-bearer-token.js +77 -0
- package/user/use-cases/get-user-from-x-frigg-headers.js +106 -0
- package/user/use-cases/login-user.js +122 -0
- package/user/user.js +93 -0
- package/utils/backend-path.js +38 -0
- package/utils/index.js +6 -0
- package/websocket/repositories/websocket-connection-repository-factory.js +37 -0
- package/websocket/repositories/websocket-connection-repository-interface.js +106 -0
- package/websocket/repositories/websocket-connection-repository-mongo.js +156 -0
- package/websocket/repositories/websocket-connection-repository-postgres.js +196 -0
- package/websocket/repositories/websocket-connection-repository.js +161 -0
- package/database/models/State.js +0 -9
- package/database/models/Token.js +0 -70
- package/database/mongo.js +0 -45
- package/encrypt/Cryptor.test.js +0 -32
- package/encrypt/encrypt.js +0 -132
- package/encrypt/encrypt.test.js +0 -1069
- package/errors/base-error.test.js +0 -32
- package/errors/fetch-error.test.js +0 -79
- package/errors/halt-error.test.js +0 -11
- package/errors/validation-errors.test.js +0 -120
- package/integrations/create-frigg-backend.js +0 -31
- package/integrations/integration-factory.js +0 -251
- package/integrations/integration-mapping.js +0 -43
- package/integrations/integration-model.js +0 -46
- package/integrations/integration-user.js +0 -144
- package/integrations/test/integration-base.test.js +0 -144
- package/lambda/TimeoutCatcher.test.js +0 -68
- package/logs/logger.test.js +0 -76
- package/module-plugin/auther.js +0 -393
- package/module-plugin/credential.js +0 -22
- package/module-plugin/entity-manager.js +0 -70
- package/module-plugin/manager.js +0 -169
- package/module-plugin/module-factory.js +0 -61
- package/module-plugin/requester/requester.test.js +0 -28
- package/module-plugin/test/auther.test.js +0 -97
- /package/{module-plugin → modules}/ModuleConstants.js +0 -0
- /package/{module-plugin → modules}/requester/api-key.js +0 -0
- /package/{module-plugin → modules}/requester/basic.js +0 -0
- /package/{module-plugin → modules}/requester/oauth-2.js +0 -0
- /package/{module-plugin → modules}/test/mock-api/mocks/hubspot.js +0 -0
package/encrypt/Cryptor.js
CHANGED
|
@@ -1,36 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cryptor - Encryption Service Adapter
|
|
3
|
+
*
|
|
4
|
+
* Infrastructure Layer adapter for AWS KMS and local AES encryption.
|
|
5
|
+
* Provides envelope encryption pattern for field-level encryption.
|
|
6
|
+
*
|
|
7
|
+
* Envelope Encryption Pattern:
|
|
8
|
+
* 1. Generate Data Encryption Key (DEK) via KMS or locally
|
|
9
|
+
* 2. Encrypt field value with DEK using AES-256-CTR
|
|
10
|
+
* 3. Encrypt DEK with Master Key (KMS CMK or AES_KEY)
|
|
11
|
+
* 4. Return format: "keyId:encryptedText:encryptedKey"
|
|
12
|
+
*
|
|
13
|
+
* Benefits:
|
|
14
|
+
* - Reduces KMS API calls (unique DEK per operation)
|
|
15
|
+
* - Master key never leaves KMS
|
|
16
|
+
* - Enables key rotation without re-encrypting data
|
|
17
|
+
*/
|
|
18
|
+
|
|
1
19
|
const crypto = require('crypto');
|
|
2
|
-
const
|
|
3
|
-
const { get, set } = require('lodash');
|
|
20
|
+
const { KMSClient, GenerateDataKeyCommand, DecryptCommand } = require('@aws-sdk/client-kms');
|
|
4
21
|
const aes = require('./aes');
|
|
5
22
|
|
|
6
|
-
const hasValue = (a) => a !== undefined && a !== null && a !== '';
|
|
7
|
-
|
|
8
23
|
class Cryptor {
|
|
9
|
-
constructor({
|
|
24
|
+
constructor({ shouldUseAws }) {
|
|
10
25
|
this.shouldUseAws = shouldUseAws;
|
|
11
|
-
this.fields = fields;
|
|
12
|
-
|
|
13
|
-
this.permutationsByField = {};
|
|
14
|
-
|
|
15
|
-
for (const field of fields) {
|
|
16
|
-
this.permutationsByField[field] = this.calculatePermutations(
|
|
17
|
-
field.split('.')
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
26
|
}
|
|
21
27
|
|
|
22
28
|
async generateDataKey() {
|
|
23
29
|
if (this.shouldUseAws) {
|
|
24
|
-
const kmsClient = new
|
|
25
|
-
const
|
|
26
|
-
.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
.promise();
|
|
30
|
+
const kmsClient = new KMSClient({});
|
|
31
|
+
const command = new GenerateDataKeyCommand({
|
|
32
|
+
KeyId: process.env.KMS_KEY_ARN,
|
|
33
|
+
KeySpec: 'AES_256',
|
|
34
|
+
});
|
|
35
|
+
const dataKey = await kmsClient.send(command);
|
|
31
36
|
|
|
32
37
|
const keyId = Buffer.from(dataKey.KeyId).toString('base64');
|
|
33
|
-
const encryptedKey = dataKey.CiphertextBlob.toString('base64');
|
|
38
|
+
const encryptedKey = Buffer.from(dataKey.CiphertextBlob).toString('base64');
|
|
34
39
|
const plaintext = dataKey.Plaintext;
|
|
35
40
|
return { keyId, encryptedKey, plaintext };
|
|
36
41
|
}
|
|
@@ -56,7 +61,7 @@ class Cryptor {
|
|
|
56
61
|
const key = availableKeys[keyId];
|
|
57
62
|
|
|
58
63
|
if (!key) {
|
|
59
|
-
throw new Error(
|
|
64
|
+
throw new Error('Encryption key not found');
|
|
60
65
|
}
|
|
61
66
|
|
|
62
67
|
return key;
|
|
@@ -64,13 +69,12 @@ class Cryptor {
|
|
|
64
69
|
|
|
65
70
|
async decryptDataKey(keyId, encryptedKey) {
|
|
66
71
|
if (this.shouldUseAws) {
|
|
67
|
-
const kmsClient = new
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
.promise();
|
|
72
|
+
const kmsClient = new KMSClient({});
|
|
73
|
+
const command = new DecryptCommand({
|
|
74
|
+
KeyId: keyId,
|
|
75
|
+
CiphertextBlob: encryptedKey,
|
|
76
|
+
});
|
|
77
|
+
const dataKey = await kmsClient.send(command);
|
|
74
78
|
|
|
75
79
|
return dataKey.Plaintext;
|
|
76
80
|
}
|
|
@@ -79,146 +83,9 @@ class Cryptor {
|
|
|
79
83
|
return aes.decrypt(encryptedKey, key);
|
|
80
84
|
}
|
|
81
85
|
|
|
82
|
-
// If the field has a value in the document, apply async function f to that field.
|
|
83
|
-
async setInDocument(doc, f) {
|
|
84
|
-
// Use the Mongoose document get/set when available (not for insertMany)
|
|
85
|
-
if (doc.get) {
|
|
86
|
-
for (const field of this.fields) {
|
|
87
|
-
const value = doc.get(field);
|
|
88
|
-
if (hasValue(value)) {
|
|
89
|
-
doc.set(field, await f(value));
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Otherwise use permutations.
|
|
96
|
-
for (const field of this.fields) {
|
|
97
|
-
const updatedDoc = await this.applyAll(doc, field, f);
|
|
98
|
-
Object.assign(doc, updatedDoc);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Calculate all possible permutations for a nested field. For example a
|
|
103
|
-
// field "deeply.nested.field" might be referred to in a Mongo query as
|
|
104
|
-
// { deeply: { 'nested.field': {} } } or { 'deeply.nested.field': {} }
|
|
105
|
-
// etc. For a given path, this gives all path parts to check in a format
|
|
106
|
-
// that lodash understands when using get and set with an array of path
|
|
107
|
-
// parts e.g. get(o, ['deeply', 'nested.parts'])
|
|
108
|
-
calculatePermutations = (parts) => {
|
|
109
|
-
if (!parts.length) return [];
|
|
110
|
-
if (parts.length === 1) return [parts];
|
|
111
|
-
|
|
112
|
-
const combos = [];
|
|
113
|
-
|
|
114
|
-
for (let i = 0; i < parts.length; i += 1) {
|
|
115
|
-
const frontPath = parts.slice(0, i + 1).join('.');
|
|
116
|
-
const rest = parts.slice(i + 1);
|
|
117
|
-
|
|
118
|
-
if (rest.length) {
|
|
119
|
-
combos.push(
|
|
120
|
-
...this.calculatePermutations(rest).map((child) => [
|
|
121
|
-
frontPath,
|
|
122
|
-
...child,
|
|
123
|
-
])
|
|
124
|
-
);
|
|
125
|
-
} else {
|
|
126
|
-
combos.push([frontPath]);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return combos;
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
// Encrypt all possible permutations of a field (possibly nested), if there
|
|
134
|
-
// is a value at that path permutation.
|
|
135
|
-
async applyAll(o, field, f) {
|
|
136
|
-
const clone = { ...o };
|
|
137
|
-
const permutations = this.permutationsByField[field];
|
|
138
|
-
|
|
139
|
-
for (const path of permutations) {
|
|
140
|
-
const value = get(o, path);
|
|
141
|
-
if (hasValue(value)) {
|
|
142
|
-
set(clone, path, await f(value));
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return clone;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
async processFieldsInDocuments(docs, f) {
|
|
150
|
-
const promises = docs
|
|
151
|
-
.filter(Boolean)
|
|
152
|
-
.flatMap((doc) => this.setInDocument(doc, f));
|
|
153
|
-
|
|
154
|
-
return Promise.all(promises);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
async encryptFieldsInDocuments(docs) {
|
|
158
|
-
await this.processFieldsInDocuments(docs, this.encrypt.bind(this));
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
async decryptFieldsInDocuments(docs) {
|
|
162
|
-
await this.processFieldsInDocuments(docs, this.decrypt.bind(this));
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
async encryptFieldsInQuery(query) {
|
|
166
|
-
for (const field of this.fields) {
|
|
167
|
-
const originalUpdate = query.getUpdate();
|
|
168
|
-
const updatedUpdate = await this.applyAll(
|
|
169
|
-
originalUpdate,
|
|
170
|
-
field,
|
|
171
|
-
this.encrypt.bind(this)
|
|
172
|
-
);
|
|
173
|
-
|
|
174
|
-
if (originalUpdate.$set) {
|
|
175
|
-
const updatedSetUpdate = await this.applyAll(
|
|
176
|
-
originalUpdate.$set,
|
|
177
|
-
field,
|
|
178
|
-
this.encrypt.bind(this)
|
|
179
|
-
);
|
|
180
|
-
updatedUpdate.$set = { ...updatedSetUpdate };
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (originalUpdate.$setOnInsert) {
|
|
184
|
-
const updatedSetOnInsertUpdate = await this.applyAll(
|
|
185
|
-
originalUpdate.$setOnInsert,
|
|
186
|
-
field,
|
|
187
|
-
this.encrypt.bind(this)
|
|
188
|
-
);
|
|
189
|
-
updatedUpdate.$setOnInsert = { ...updatedSetOnInsertUpdate };
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
query.setUpdate(updatedUpdate);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
expectNotToUpdateManyEncrypted(update) {
|
|
197
|
-
for (const field of this.fields) {
|
|
198
|
-
if (update.$set && hasValue(update.$set[field])) {
|
|
199
|
-
throw new Error(
|
|
200
|
-
'Attempted to update encrypted field of multiple documents'
|
|
201
|
-
);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if (update.$setOnInsert && hasValue(update.$setOnInsert[field])) {
|
|
205
|
-
throw new Error(
|
|
206
|
-
'Attempted to update encrypted field of multiple documents'
|
|
207
|
-
);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
if (hasValue(update[field])) {
|
|
211
|
-
throw new Error(
|
|
212
|
-
'Attempted to update encrypted field of multiple documents'
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
86
|
async encrypt(text) {
|
|
219
87
|
const { keyId, encryptedKey, plaintext } = await this.generateDataKey();
|
|
220
88
|
const encryptedText = aes.encrypt(text, plaintext);
|
|
221
|
-
|
|
222
89
|
return `${keyId}:${encryptedText}:${encryptedKey}`;
|
|
223
90
|
}
|
|
224
91
|
|
|
@@ -228,7 +95,6 @@ class Cryptor {
|
|
|
228
95
|
const encryptedText = `${split[1]}:${split[2]}`;
|
|
229
96
|
const encryptedKey = Buffer.from(split[3], 'base64');
|
|
230
97
|
const plaintext = await this.decryptDataKey(keyId, encryptedKey);
|
|
231
|
-
|
|
232
98
|
return aes.decrypt(encryptedText, plaintext);
|
|
233
99
|
}
|
|
234
100
|
}
|
package/encrypt/index.js
CHANGED
package/encrypt/test-encrypt.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./index"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./index"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./default"
|