@flowerforce/flowerbase 1.7.6-beta.0 → 1.7.6-beta.10
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/README.md +125 -1
- package/dist/auth/providers/anon-user/controller.d.ts.map +1 -1
- package/dist/auth/providers/anon-user/controller.js +1 -0
- package/dist/auth/providers/custom-function/controller.d.ts.map +1 -1
- package/dist/auth/providers/custom-function/controller.js +6 -9
- package/dist/auth/providers/local-userpass/controller.d.ts.map +1 -1
- package/dist/auth/providers/local-userpass/controller.js +58 -18
- package/dist/auth/providers/local-userpass/dtos.d.ts +5 -1
- package/dist/auth/providers/local-userpass/dtos.d.ts.map +1 -1
- package/dist/auth/utils.d.ts +1 -0
- package/dist/auth/utils.d.ts.map +1 -1
- package/dist/auth/utils.js +1 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +11 -1
- package/dist/features/encryption/interface.d.ts +36 -0
- package/dist/features/encryption/interface.d.ts.map +1 -0
- package/dist/features/encryption/interface.js +2 -0
- package/dist/features/encryption/utils.d.ts +9 -0
- package/dist/features/encryption/utils.d.ts.map +1 -0
- package/dist/features/encryption/utils.js +34 -0
- package/dist/features/endpoints/utils.d.ts.map +1 -1
- package/dist/features/endpoints/utils.js +3 -0
- package/dist/features/functions/controller.d.ts +2 -0
- package/dist/features/functions/controller.d.ts.map +1 -1
- package/dist/features/functions/controller.js +7 -1
- package/dist/features/rules/interface.d.ts +6 -5
- package/dist/features/rules/interface.d.ts.map +1 -1
- package/dist/features/rules/utils.d.ts.map +1 -1
- package/dist/features/rules/utils.js +1 -11
- package/dist/features/triggers/index.d.ts.map +1 -1
- package/dist/features/triggers/index.js +4 -0
- package/dist/features/triggers/interface.d.ts +1 -1
- package/dist/features/triggers/interface.d.ts.map +1 -1
- package/dist/features/triggers/utils.d.ts.map +1 -1
- package/dist/features/triggers/utils.js +85 -33
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -4
- package/dist/monitoring/plugin.d.ts.map +1 -1
- package/dist/monitoring/plugin.js +31 -0
- package/dist/services/mongodb-atlas/index.d.ts +3 -0
- package/dist/services/mongodb-atlas/index.d.ts.map +1 -1
- package/dist/services/mongodb-atlas/index.js +136 -43
- package/dist/services/mongodb-atlas/model.d.ts +2 -1
- package/dist/services/mongodb-atlas/model.d.ts.map +1 -1
- package/dist/utils/context/helpers.d.ts.map +1 -1
- package/dist/utils/context/helpers.js +3 -2
- package/dist/utils/context/index.d.ts.map +1 -1
- package/dist/utils/context/index.js +4 -2
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +14 -3
- package/dist/utils/initializer/mongodbCSFLE.d.ts +69 -0
- package/dist/utils/initializer/mongodbCSFLE.d.ts.map +1 -0
- package/dist/utils/initializer/mongodbCSFLE.js +131 -0
- package/dist/utils/initializer/registerPlugins.d.ts +5 -1
- package/dist/utils/initializer/registerPlugins.d.ts.map +1 -1
- package/dist/utils/initializer/registerPlugins.js +27 -5
- package/dist/utils/roles/helpers.d.ts.map +1 -1
- package/dist/utils/roles/helpers.js +6 -3
- package/dist/utils/roles/machines/fieldPermissions.d.ts.map +1 -1
- package/dist/utils/roles/machines/fieldPermissions.js +19 -10
- package/dist/utils/rules-matcher/interface.d.ts +2 -0
- package/dist/utils/rules-matcher/interface.d.ts.map +1 -1
- package/dist/utils/rules-matcher/interface.js +1 -0
- package/dist/utils/rules-matcher/utils.d.ts.map +1 -1
- package/dist/utils/rules-matcher/utils.js +23 -6
- package/package.json +4 -2
- package/src/auth/providers/anon-user/controller.ts +1 -0
- package/src/auth/providers/custom-function/controller.ts +10 -11
- package/src/auth/providers/local-userpass/__tests__/controller.test.ts +200 -0
- package/src/auth/providers/local-userpass/controller.ts +87 -34
- package/src/auth/providers/local-userpass/dtos.ts +6 -1
- package/src/auth/utils.ts +1 -0
- package/src/constants.ts +11 -2
- package/src/features/encryption/interface.ts +46 -0
- package/src/features/encryption/utils.ts +22 -0
- package/src/features/endpoints/__tests__/utils.test.ts +65 -0
- package/src/features/endpoints/utils.ts +3 -0
- package/src/features/functions/__tests__/watch-filter.test.ts +11 -1
- package/src/features/functions/controller.ts +8 -0
- package/src/features/rules/interface.ts +18 -17
- package/src/features/rules/utils.ts +1 -11
- package/src/features/triggers/__tests__/index.test.ts +6 -4
- package/src/features/triggers/index.ts +5 -1
- package/src/features/triggers/interface.ts +1 -1
- package/src/features/triggers/utils.ts +86 -37
- package/src/index.ts +10 -2
- package/src/monitoring/plugin.ts +33 -0
- package/src/monitoring/ui.collections.js +7 -10
- package/src/monitoring/ui.css +378 -0
- package/src/monitoring/ui.endpoints.js +5 -10
- package/src/monitoring/ui.events.js +3 -5
- package/src/monitoring/ui.functions.js +64 -71
- package/src/monitoring/ui.html +8 -0
- package/src/monitoring/ui.js +189 -0
- package/src/monitoring/ui.shared.js +237 -2
- package/src/monitoring/ui.triggers.js +2 -3
- package/src/monitoring/ui.users.js +5 -9
- package/src/services/mongodb-atlas/__tests__/realmCompatibility.test.ts +205 -7
- package/src/services/mongodb-atlas/__tests__/utils.test.ts +27 -0
- package/src/services/mongodb-atlas/__tests__/watch-filter.test.ts +78 -0
- package/src/services/mongodb-atlas/index.ts +379 -182
- package/src/services/mongodb-atlas/model.ts +3 -1
- package/src/types/fastify-raw-body.d.ts +0 -9
- package/src/utils/__tests__/checkIsValidFieldNameFn.test.ts +74 -5
- package/src/utils/__tests__/contextExecuteCompatibility.test.ts +27 -1
- package/src/utils/__tests__/evaluateExpression.test.ts +33 -0
- package/src/utils/__tests__/generateContextData.test.ts +5 -1
- package/src/utils/__tests__/mongodbCSFLE.test.ts +105 -0
- package/src/utils/__tests__/rule.test.ts +38 -0
- package/src/utils/context/helpers.ts +3 -2
- package/src/utils/context/index.ts +4 -3
- package/src/utils/index.ts +12 -1
- package/src/utils/initializer/mongodbCSFLE.ts +224 -0
- package/src/utils/initializer/registerPlugins.ts +45 -10
- package/src/utils/roles/helpers.ts +10 -5
- package/src/utils/roles/machines/fieldPermissions.ts +17 -8
- package/src/utils/rules-matcher/interface.ts +2 -0
- package/src/utils/rules-matcher/utils.ts +33 -17
- package/src/utils/__tests__/readFileContent.test.ts +0 -35
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.setupMongoDbCSFLE = exports.buildSchemaMap = void 0;
|
|
13
|
+
const mongodb_1 = require("mongodb");
|
|
14
|
+
const constants_1 = require("../../constants");
|
|
15
|
+
function ensureUniqueKeyAltNameIndex(db, config) {
|
|
16
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17
|
+
yield db.collection(config.keyVaultCollection).createIndex({ keyAltNames: 1 }, {
|
|
18
|
+
unique: true,
|
|
19
|
+
partialFilterExpression: { keyAltNames: { $exists: true } },
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Ensure provided KMS Providers DEK keys exist in the key vault. If not, they are created.
|
|
25
|
+
*/
|
|
26
|
+
function ensureDataEncryptionKeys(clientEncryption, keyVaultDb, config) {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
const keys = [];
|
|
29
|
+
for (const kmsProvider of config.kmsProviders) {
|
|
30
|
+
const existingKey = yield keyVaultDb.collection(config.keyVaultCollection).findOne({
|
|
31
|
+
keyAltNames: kmsProvider.keyAlias,
|
|
32
|
+
});
|
|
33
|
+
if ((existingKey === null || existingKey === void 0 ? void 0 : existingKey._id) instanceof mongodb_1.Binary) {
|
|
34
|
+
keys.push({ dataKeyId: existingKey._id, dataKeyAlias: kmsProvider.keyAlias });
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const dataKeyId = yield clientEncryption.createDataKey(kmsProvider.provider, {
|
|
38
|
+
masterKey: "masterKey" in kmsProvider ? kmsProvider.masterKey : undefined,
|
|
39
|
+
keyAltNames: [kmsProvider.keyAlias],
|
|
40
|
+
});
|
|
41
|
+
console.log(`[MongoDB Encryption] Created new key with alias ${kmsProvider.keyAlias}`);
|
|
42
|
+
keys.push({ dataKeyId, dataKeyAlias: kmsProvider.keyAlias });
|
|
43
|
+
}
|
|
44
|
+
return keys;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Recursively resolve key aliases in an encryption schema to their corresponding key IDs.
|
|
49
|
+
*/
|
|
50
|
+
const resolveKeyAliases = (schema, dataKeys) => {
|
|
51
|
+
var _a, _b;
|
|
52
|
+
if ("encrypt" in schema) {
|
|
53
|
+
if (!schema.encrypt.keyAlias) {
|
|
54
|
+
return schema;
|
|
55
|
+
}
|
|
56
|
+
const keyId = (_a = dataKeys.find(k => k.dataKeyAlias === schema.encrypt.keyAlias)) === null || _a === void 0 ? void 0 : _a.dataKeyId;
|
|
57
|
+
if (!keyId) {
|
|
58
|
+
throw new Error(`Key with alias ${schema.encrypt.keyAlias} could not be found in the Key Vault.`);
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
encrypt: {
|
|
62
|
+
bsonType: schema.encrypt.bsonType,
|
|
63
|
+
algorithm: schema.encrypt.algorithm,
|
|
64
|
+
keyId: [keyId]
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const mappedSchema = {
|
|
69
|
+
bsonType: "object",
|
|
70
|
+
properties: Object.entries(schema.properties).reduce((acc, [property, config]) => {
|
|
71
|
+
acc[property] = resolveKeyAliases(config, dataKeys);
|
|
72
|
+
return acc;
|
|
73
|
+
}, {})
|
|
74
|
+
};
|
|
75
|
+
if (schema.encryptMetadata) {
|
|
76
|
+
const keyId = (_b = dataKeys.find(k => k.dataKeyAlias === schema.encryptMetadata.keyAlias)) === null || _b === void 0 ? void 0 : _b.dataKeyId;
|
|
77
|
+
if (!keyId) {
|
|
78
|
+
throw new Error(`Key with alias ${schema.encryptMetadata.keyAlias} could not be found in the Key Vault.`);
|
|
79
|
+
}
|
|
80
|
+
mappedSchema.encryptMetadata = { keyId: [keyId] };
|
|
81
|
+
}
|
|
82
|
+
return mappedSchema;
|
|
83
|
+
};
|
|
84
|
+
const buildSchemaMap = (schemas, dataKeys) => {
|
|
85
|
+
return Object.entries(schemas).reduce((acc, [key, schema]) => {
|
|
86
|
+
acc[key] = resolveKeyAliases(schema, dataKeys);
|
|
87
|
+
return acc;
|
|
88
|
+
}, {});
|
|
89
|
+
};
|
|
90
|
+
exports.buildSchemaMap = buildSchemaMap;
|
|
91
|
+
/**
|
|
92
|
+
* Setup MongoDB Client-Side Field Level Encryption (CSFLE).
|
|
93
|
+
* @see https://www.mongodb.com/docs/manual/core/csfle
|
|
94
|
+
*/
|
|
95
|
+
const setupMongoDbCSFLE = (config) => __awaiter(void 0, void 0, void 0, function* () {
|
|
96
|
+
var _a, _b;
|
|
97
|
+
if (config.kmsProviders.length === 0) {
|
|
98
|
+
throw new Error('At least one KMS Provider is required when using MongoDB encryption');
|
|
99
|
+
}
|
|
100
|
+
const requiredConfig = {
|
|
101
|
+
kmsProviders: config.kmsProviders,
|
|
102
|
+
keyVaultDb: (_a = config.keyVaultDb) !== null && _a !== void 0 ? _a : constants_1.DEFAULT_CONFIG.MONGODB_ENCRYPTION_CONFIG.keyVaultDb,
|
|
103
|
+
keyVaultCollection: (_b = config.keyVaultDb) !== null && _b !== void 0 ? _b : constants_1.DEFAULT_CONFIG.MONGODB_ENCRYPTION_CONFIG.keyVaultCollection,
|
|
104
|
+
};
|
|
105
|
+
const kmsProviders = requiredConfig.kmsProviders.reduce((acc, { provider, config }) => (Object.assign(Object.assign({}, acc), { [provider]: config })), {});
|
|
106
|
+
const keyVaultNamespace = `${requiredConfig.keyVaultDb}.${requiredConfig.keyVaultCollection}`;
|
|
107
|
+
const keyVaultClient = new mongodb_1.MongoClient(config.mongodbUrl, {
|
|
108
|
+
maxPoolSize: 1,
|
|
109
|
+
autoEncryption: {
|
|
110
|
+
keyVaultNamespace,
|
|
111
|
+
kmsProviders,
|
|
112
|
+
extraOptions: config.extraOptions
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
yield keyVaultClient.connect();
|
|
116
|
+
const keyVaultDb = keyVaultClient.db(requiredConfig.keyVaultDb);
|
|
117
|
+
yield ensureUniqueKeyAltNameIndex(keyVaultDb, requiredConfig);
|
|
118
|
+
const clientEncryption = new mongodb_1.ClientEncryption(keyVaultClient, {
|
|
119
|
+
keyVaultNamespace,
|
|
120
|
+
kmsProviders,
|
|
121
|
+
});
|
|
122
|
+
const dataKeys = yield ensureDataEncryptionKeys(clientEncryption, keyVaultDb, requiredConfig);
|
|
123
|
+
yield keyVaultClient.close();
|
|
124
|
+
return {
|
|
125
|
+
keyVaultNamespace,
|
|
126
|
+
kmsProviders,
|
|
127
|
+
schemaMap: config.schemas ? (0, exports.buildSchemaMap)(config.schemas, dataKeys) : undefined,
|
|
128
|
+
extraOptions: config.extraOptions
|
|
129
|
+
};
|
|
130
|
+
});
|
|
131
|
+
exports.setupMongoDbCSFLE = setupMongoDbCSFLE;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { FastifyInstance } from 'fastify';
|
|
2
2
|
import { CorsConfig } from '../../';
|
|
3
3
|
import { Functions } from '../../features/functions/interface';
|
|
4
|
+
import { EncryptionSchemas } from '../../features/encryption/interface';
|
|
5
|
+
import { MongoDbEncryptionConfig } from './mongodbCSFLE';
|
|
4
6
|
type RegisterFunction = FastifyInstance['register'];
|
|
5
7
|
type RegisterPluginsParams = {
|
|
6
8
|
register: RegisterFunction;
|
|
@@ -8,6 +10,8 @@ type RegisterPluginsParams = {
|
|
|
8
10
|
jwtSecret: string;
|
|
9
11
|
functionsList: Functions;
|
|
10
12
|
corsConfig?: CorsConfig;
|
|
13
|
+
encryptionSchemas?: EncryptionSchemas;
|
|
14
|
+
mongodbEncryptionConfig?: MongoDbEncryptionConfig;
|
|
11
15
|
};
|
|
12
16
|
/**
|
|
13
17
|
* > Used to register all plugins
|
|
@@ -16,6 +20,6 @@ type RegisterPluginsParams = {
|
|
|
16
20
|
* @param jwtSecret -> connection jwt
|
|
17
21
|
* @tested
|
|
18
22
|
*/
|
|
19
|
-
export declare const registerPlugins: ({ register, mongodbUrl, jwtSecret, functionsList, corsConfig }: RegisterPluginsParams) => Promise<void>;
|
|
23
|
+
export declare const registerPlugins: ({ register, mongodbUrl, jwtSecret, functionsList, corsConfig, mongodbEncryptionConfig, encryptionSchemas }: RegisterPluginsParams) => Promise<void>;
|
|
20
24
|
export {};
|
|
21
25
|
//# sourceMappingURL=registerPlugins.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerPlugins.d.ts","sourceRoot":"","sources":["../../../src/utils/initializer/registerPlugins.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAOnC,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"registerPlugins.d.ts","sourceRoot":"","sources":["../../../src/utils/initializer/registerPlugins.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAOnC,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AAEvE,OAAO,EAAqB,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAE3E,KAAK,gBAAgB,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;AAGnD,KAAK,qBAAqB,GAAG;IAC3B,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,SAAS,CAAA;IACxB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,uBAAuB,CAAC,EAAE,uBAAuB,CAAA;CAClD,CAAA;AAQD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAU,4GAQnC,qBAAqB,kBAwBvB,CAAA"}
|
|
@@ -23,6 +23,7 @@ const controller_3 = require("../../auth/providers/custom-function/controller");
|
|
|
23
23
|
const controller_4 = require("../../auth/providers/local-userpass/controller");
|
|
24
24
|
const constants_1 = require("../../constants");
|
|
25
25
|
const plugin_1 = __importDefault(require("../../monitoring/plugin"));
|
|
26
|
+
const mongodbCSFLE_1 = require("./mongodbCSFLE");
|
|
26
27
|
/**
|
|
27
28
|
* > Used to register all plugins
|
|
28
29
|
* @param register -> the fastify register method
|
|
@@ -30,13 +31,15 @@ const plugin_1 = __importDefault(require("../../monitoring/plugin"));
|
|
|
30
31
|
* @param jwtSecret -> connection jwt
|
|
31
32
|
* @tested
|
|
32
33
|
*/
|
|
33
|
-
const registerPlugins = (_a) => __awaiter(void 0, [_a], void 0, function* ({ register, mongodbUrl, jwtSecret, functionsList, corsConfig }) {
|
|
34
|
+
const registerPlugins = (_a) => __awaiter(void 0, [_a], void 0, function* ({ register, mongodbUrl, jwtSecret, functionsList, corsConfig, mongodbEncryptionConfig, encryptionSchemas }) {
|
|
34
35
|
try {
|
|
35
36
|
const registersConfig = yield getRegisterConfig({
|
|
36
37
|
mongodbUrl,
|
|
37
38
|
jwtSecret,
|
|
38
39
|
corsConfig,
|
|
39
|
-
functionsList
|
|
40
|
+
functionsList,
|
|
41
|
+
mongodbEncryptionConfig,
|
|
42
|
+
encryptionSchemas
|
|
40
43
|
});
|
|
41
44
|
registersConfig.forEach(({ plugin, options, pluginName }) => {
|
|
42
45
|
try {
|
|
@@ -61,11 +64,14 @@ exports.registerPlugins = registerPlugins;
|
|
|
61
64
|
* @param jwtSecret -> connection jwt
|
|
62
65
|
* @testable
|
|
63
66
|
*/
|
|
64
|
-
const getRegisterConfig = (_a) => __awaiter(void 0, [_a], void 0, function* ({ mongodbUrl, jwtSecret, corsConfig }) {
|
|
67
|
+
const getRegisterConfig = (_a) => __awaiter(void 0, [_a], void 0, function* ({ mongodbUrl, jwtSecret, corsConfig, encryptionSchemas, mongodbEncryptionConfig, }) {
|
|
65
68
|
const corsOptions = corsConfig !== null && corsConfig !== void 0 ? corsConfig : {
|
|
66
69
|
origin: '*',
|
|
67
70
|
methods: ['POST', 'GET']
|
|
68
71
|
};
|
|
72
|
+
const autoEncryption = mongodbEncryptionConfig
|
|
73
|
+
? yield (0, mongodbCSFLE_1.setupMongoDbCSFLE)(Object.assign({ mongodbUrl, schemas: encryptionSchemas }, mongodbEncryptionConfig))
|
|
74
|
+
: undefined;
|
|
69
75
|
const baseConfig = [
|
|
70
76
|
{
|
|
71
77
|
pluginName: 'cors',
|
|
@@ -76,8 +82,24 @@ const getRegisterConfig = (_a) => __awaiter(void 0, [_a], void 0, function* ({ m
|
|
|
76
82
|
pluginName: 'fastifyMongodb',
|
|
77
83
|
plugin: mongodb_1.default,
|
|
78
84
|
options: {
|
|
85
|
+
url: mongodbUrl,
|
|
79
86
|
forceClose: true,
|
|
80
|
-
|
|
87
|
+
autoEncryption
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
/**
|
|
91
|
+
* When auto-encryption is active, add another MongoDB client with bypass for change streams.
|
|
92
|
+
* The $changeStream operator does not support automatic encryption, only decryption.
|
|
93
|
+
* @see https://www.mongodb.com/docs/manual/core/csfle/reference/supported-operations
|
|
94
|
+
*/
|
|
95
|
+
autoEncryption && {
|
|
96
|
+
pluginName: 'fastifyMongodb',
|
|
97
|
+
plugin: mongodb_1.default,
|
|
98
|
+
options: {
|
|
99
|
+
name: "changestream",
|
|
100
|
+
url: mongodbUrl,
|
|
101
|
+
forceClose: true,
|
|
102
|
+
autoEncryption: Object.assign(Object.assign({}, autoEncryption), { bypassAutoEncryption: true })
|
|
81
103
|
}
|
|
82
104
|
},
|
|
83
105
|
{
|
|
@@ -133,5 +155,5 @@ const getRegisterConfig = (_a) => __awaiter(void 0, [_a], void 0, function* ({ m
|
|
|
133
155
|
options: { basePath: '/monit' }
|
|
134
156
|
});
|
|
135
157
|
}
|
|
136
|
-
return baseConfig;
|
|
158
|
+
return baseConfig.filter(Boolean);
|
|
137
159
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/roles/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/roles/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAkBrD,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,cAAc,CAAC,QAAQ,CAAC,EAChC,aAAa,oBAAoB,EACjC,OAAO,cAAc,CAAC,MAAM,CAAC,KAC5B,OAAO,CAAC,OAAO,CAoBjB,CAAA"}
|
|
@@ -30,13 +30,16 @@ const normalizeUserRole = (user) => {
|
|
|
30
30
|
const customRole = typeof candidate.custom_data === 'object' && candidate.custom_data !== null
|
|
31
31
|
? candidate.custom_data.role
|
|
32
32
|
: undefined;
|
|
33
|
-
return typeof customRole === 'string'
|
|
33
|
+
return typeof customRole === 'string'
|
|
34
|
+
? Object.assign(Object.assign({}, candidate), { role: customRole })
|
|
35
|
+
: user;
|
|
34
36
|
};
|
|
35
37
|
const evaluateExpression = (params, expression, user) => __awaiter(void 0, void 0, void 0, function* () {
|
|
38
|
+
var _a;
|
|
36
39
|
if (!expression || typeof expression === 'boolean')
|
|
37
40
|
return !!expression;
|
|
38
41
|
const normalizedUser = normalizeUserRole(user);
|
|
39
|
-
const value = Object.assign(Object.assign(Object.assign({}, params.expansions), params.cursor), { '%%user': normalizedUser, '%%true': true });
|
|
42
|
+
const value = Object.assign(Object.assign(Object.assign({}, params.expansions), params.cursor), { '%%root': params.cursor, '%%prevRoot': (_a = params.expansions) === null || _a === void 0 ? void 0 : _a['%%prevRoot'], '%%user': normalizedUser, '%%true': true, '%%false': false });
|
|
40
43
|
const conditions = (0, rules_1.expandQuery)(expression, value);
|
|
41
44
|
const complexCondition = Object.entries(conditions).find(([key]) => functionsConditions.includes(key));
|
|
42
45
|
return complexCondition
|
|
@@ -61,7 +64,7 @@ const evaluateComplexExpression = (condition, params, user) => __awaiter(void 0,
|
|
|
61
64
|
const response = yield (0, context_1.GenerateContext)({
|
|
62
65
|
args: expandedArguments,
|
|
63
66
|
app,
|
|
64
|
-
rules: state_1.StateManager.select(
|
|
67
|
+
rules: state_1.StateManager.select('rules'),
|
|
65
68
|
user: normalizedUser,
|
|
66
69
|
currentFunction,
|
|
67
70
|
functionName: name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldPermissions.d.ts","sourceRoot":"","sources":["../../../../src/utils/roles/machines/fieldPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,OAAO,EAGL,IAAI,EACL,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"fieldPermissions.d.ts","sourceRoot":"","sources":["../../../../src/utils/roles/machines/fieldPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,OAAO,EAGL,IAAI,EACL,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AA0C5C,eAAO,MAAM,0BAA0B,GAAI,OAAO,IAAI,YACN,CAAA;AAEhD,eAAO,MAAM,gCAAgC,GAC3C,SAAS,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,EACzD,MAAM,MAAM,GAAG,OAAO,EACtB,UAAU;IACR,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,KACA,OAAO,CAAC,QAAQ,CAoClB,CAAA"}
|
|
@@ -26,12 +26,9 @@ const getAdditionalFieldPermission = (additionalFields, fieldName) => {
|
|
|
26
26
|
return undefined;
|
|
27
27
|
};
|
|
28
28
|
const canReadField = (context, permission) => __awaiter(void 0, void 0, void 0, function* () {
|
|
29
|
-
if (!permission)
|
|
30
|
-
return
|
|
31
|
-
|
|
32
|
-
if (read)
|
|
33
|
-
return true;
|
|
34
|
-
return yield (0, helpers_1.evaluateExpression)(context.params, permission.write, context.user);
|
|
29
|
+
if (!permission || typeof permission.read === 'undefined')
|
|
30
|
+
return undefined;
|
|
31
|
+
return yield (0, helpers_1.evaluateExpression)(context.params, permission.read, context.user);
|
|
35
32
|
});
|
|
36
33
|
const canWriteField = (context, permission) => __awaiter(void 0, void 0, void 0, function* () {
|
|
37
34
|
if (!permission)
|
|
@@ -49,14 +46,26 @@ const filterDocumentByFieldPermissions = (context, mode, options) => __awaiter(v
|
|
|
49
46
|
const fields = (_b = context.role.fields) !== null && _b !== void 0 ? _b : {};
|
|
50
47
|
const additionalFields = context.role.additional_fields;
|
|
51
48
|
for (const [key, value] of Object.entries(source)) {
|
|
49
|
+
if (mode === 'read' && key === '_id') {
|
|
50
|
+
document[key] = value;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
52
53
|
const fieldPermission = fields[key];
|
|
53
54
|
const permission = fieldPermission !== null && fieldPermission !== void 0 ? fieldPermission : getAdditionalFieldPermission(additionalFields, key);
|
|
54
55
|
let allowed = (options === null || options === void 0 ? void 0 : options.defaultAllow) === true;
|
|
55
56
|
if (permission) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
if (mode === 'read') {
|
|
58
|
+
const readAllowed = yield canReadField(context, permission);
|
|
59
|
+
if (typeof readAllowed !== 'undefined') {
|
|
60
|
+
allowed = readAllowed;
|
|
61
|
+
}
|
|
62
|
+
else if (!allowed && typeof permission.write !== 'undefined') {
|
|
63
|
+
allowed = yield canWriteField(context, permission);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
allowed = yield canWriteField(context, permission);
|
|
68
|
+
}
|
|
60
69
|
}
|
|
61
70
|
if (allowed) {
|
|
62
71
|
document[key] = value;
|
|
@@ -311,6 +311,7 @@ export type Operators = {
|
|
|
311
311
|
* @returns
|
|
312
312
|
*/
|
|
313
313
|
$regex: OperatorsFunction;
|
|
314
|
+
'%exists': OperatorsFunction;
|
|
314
315
|
'%stringToOid': OperatorsFunction;
|
|
315
316
|
'%oidToString': OperatorsFunction;
|
|
316
317
|
};
|
|
@@ -331,6 +332,7 @@ export declare enum RulesOperators {
|
|
|
331
332
|
$all = "$all",
|
|
332
333
|
$size = "$size",
|
|
333
334
|
$regex = "$regex",
|
|
335
|
+
'%exists' = "%exists",
|
|
334
336
|
'%stringToOid' = "%stringToOid",
|
|
335
337
|
'%oidToString' = "%oidToString"
|
|
336
338
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/utils/rules-matcher/interface.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/utils/rules-matcher/interface.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,CAAA;AAE7C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,SAAS,CAAA;IACnB,KAAK,EAAE,GAAG,CAAA;IACV,GAAG,CAAC,EAAE,GAAG,CAAA;CACV,CAAA;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;;;;OAOG;IACH,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,OAAO,CAAA;IAC/B;;;;;;;;;OASG;IACH,IAAI,EAAE,CACJ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAC1B;QACH,KAAK,EAAE,OAAO,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD;;;;;;;;;OASG;IACH,MAAM,EAAE,CACN,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,EACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACzB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACxB;;;;;;OAMG;IACH,MAAM,EAAE,WAAW,CAAA;IACnB;;;;;;OAMG;IACH,SAAS,EAAE,WAAW,CAAA;IACtB;;;;;;OAMG;IACH,QAAQ,EAAE,WAAW,CAAA;IACrB;;;;;;OAMG;IACH,UAAU,EAAE,WAAW,CAAA;IACvB;;;;;;OAMG;IACH,QAAQ,EAAE,WAAW,CAAA;IACrB;;;;;;OAMG;IACH,qBAAqB,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,KAAK,iBAAiB,CAAA;IACrF;;;;;;OAMG;IACH,SAAS,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,GAAG,IAAI,CAAA;IACxC;;;;;;OAMG;IACH,cAAc,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,iBAAiB,CAAA;IACjD;;;;;;;OAOG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAA;IAChC;;;;;;OAMG;IACH,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAA;IACrC;;;;;;;;OAQG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAClD;;;;;;;OAOG;IACH,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,MAAM,CAAA;IACpC;;;;;;;;OAQG;IACH,SAAS,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EACrB,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAC1B,OAAO,CAAA;IACZ;;;;;;;OAOG;IACH,OAAO,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACrC,KAAK,CAAC,EAAE,CAAC,EACT,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAC1B,MAAM,EAAE,GAAG,IAAI,CAAA;CACrB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,OAAO,CAAA;AAElF,MAAM,MAAM,SAAS,GAAG;IACtB;;;;;;;;OAQG;IACH,OAAO,EAAE,iBAAiB,CAAA;IAC1B;;;;;;;OAOG;IACH,GAAG,EAAE,iBAAiB,CAAA;IACtB;;;;;;;OAOG;IACH,GAAG,EAAE,iBAAiB,CAAA;IACtB;;;;;;;OAOG;IACH,GAAG,EAAE,iBAAiB,CAAA;IACtB;;;;;;;OAOG;IACH,IAAI,EAAE,iBAAiB,CAAA;IACvB;;;;;;;OAOG;IACH,GAAG,EAAE,iBAAiB,CAAA;IACtB;;;;;;;OAOG;IACH,IAAI,EAAE,iBAAiB,CAAA;IACvB;;;;;;;OAOG;IACH,MAAM,EAAE,iBAAiB,CAAA;IACzB;;;;;;;OAOG;IACH,OAAO,EAAE,iBAAiB,CAAA;IAC1B;;;;;;;OAOG;IACH,MAAM,EAAE,iBAAiB,CAAA;IACzB;;;;;;;OAOG;IACH,OAAO,EAAE,iBAAiB,CAAA;IAE1B;;;;;;;;OAQG;IACH,GAAG,EAAE,iBAAiB,CAAA;IACtB;;;;;;;;OAQG;IACH,IAAI,EAAE,iBAAiB,CAAA;IACvB;;;;;;;;OAQG;IACH,IAAI,EAAE,iBAAiB,CAAA;IACvB;;;;;;;OAOG;IACH,KAAK,EAAE,iBAAiB,CAAA;IACxB;;;;;;;;;OASG;IACH,MAAM,EAAE,iBAAiB,CAAA;IACzB,SAAS,EAAE,iBAAiB,CAAA;IAC5B,cAAc,EAAE,iBAAiB,CAAA;IACjC,cAAc,EAAE,iBAAiB,CAAA;CAClC,CAAA;AAED,oBAAY,cAAc;IACxB,OAAO,YAAY;IACnB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,SAAS,YAAY;IACrB,cAAc,iBAAiB;IAC/B,cAAc,iBAAiB;CAChC;AAED,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,OAAO,CAAC;KAC5C,GAAG,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC;SACvB,CAAC,IAAI,MAAM,OAAO,cAAc,GAAG,CAAC,CAAC,GAAG,CAAC;KAC3C,CAAC;CACH,CAAC,CAAA;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,CAAC,CAAA;AAElE,oBAAY,UAAU;IACpB,IAAI,SAAS;IACb,GAAG,QAAQ;CACZ;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IACrB,eAAe,CAAC,CAAC,CAAC,GAClB;KACG,CAAC,IAAI,MAAM,OAAO,UAAU,GACzB,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,GAChD,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;CAC3C,GACD,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA"}
|
|
@@ -19,6 +19,7 @@ var RulesOperators;
|
|
|
19
19
|
RulesOperators["$all"] = "$all";
|
|
20
20
|
RulesOperators["$size"] = "$size";
|
|
21
21
|
RulesOperators["$regex"] = "$regex";
|
|
22
|
+
RulesOperators["%exists"] = "%exists";
|
|
22
23
|
RulesOperators["%stringToOid"] = "%stringToOid";
|
|
23
24
|
RulesOperators["%oidToString"] = "%oidToString";
|
|
24
25
|
})(RulesOperators || (exports.RulesOperators = RulesOperators = {}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/utils/rules-matcher/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAe,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/utils/rules-matcher/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAe,MAAM,aAAa,CAAA;AAmEvE;;GAEG;AACH,QAAA,MAAM,iBAAiB,EAAE,iBAoNxB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,SAyDvB,CAAA;AAID,eAAe,iBAAiB,CAAA"}
|
|
@@ -23,7 +23,8 @@ const toObjectIdHex = (value) => {
|
|
|
23
23
|
return null;
|
|
24
24
|
}
|
|
25
25
|
const maybeObjectId = value;
|
|
26
|
-
if (maybeObjectId._bsontype === 'ObjectId' &&
|
|
26
|
+
if (maybeObjectId._bsontype === 'ObjectId' &&
|
|
27
|
+
typeof maybeObjectId.toHexString === 'function') {
|
|
27
28
|
const hex = maybeObjectId.toHexString();
|
|
28
29
|
return HEX_24_REGEXP.test(hex) ? hex.toLowerCase() : null;
|
|
29
30
|
}
|
|
@@ -41,7 +42,16 @@ const includesWithSemanticEquality = (value, candidate) => rulesMatcherUtils
|
|
|
41
42
|
.forceArray(candidate)
|
|
42
43
|
.some((item) => rulesMatcherUtils
|
|
43
44
|
.forceArray(value)
|
|
44
|
-
.some((sourceItem) => rulesMatcherUtils
|
|
45
|
+
.some((sourceItem) => rulesMatcherUtils
|
|
46
|
+
.forceArray(item)
|
|
47
|
+
.some((candidateItem) => areSemanticallyEqual(sourceItem, candidateItem))));
|
|
48
|
+
const resolveRefPath = (data, refPath, prefix) => {
|
|
49
|
+
const exactMatch = (0, get_1.default)(data, refPath, undefined);
|
|
50
|
+
if (exactMatch !== undefined) {
|
|
51
|
+
return exactMatch;
|
|
52
|
+
}
|
|
53
|
+
return (0, get_1.default)(data, rulesMatcherUtils.getPath(refPath, prefix), undefined);
|
|
54
|
+
};
|
|
45
55
|
/**
|
|
46
56
|
* Defines a utility object named rulesMatcherUtils, which contains various helper functions used for processing rules and data in a rule-matching context.
|
|
47
57
|
*/
|
|
@@ -60,7 +70,7 @@ const rulesMatcherUtils = {
|
|
|
60
70
|
const { name } = (0, get_1.default)(valueBlock, [path], {}) || {};
|
|
61
71
|
const { op, value, opt } = rulesMatcherUtils.getDefaultRule(valueBlock[path]);
|
|
62
72
|
const valueRef = value && String(value).indexOf('$ref:') === 0
|
|
63
|
-
? (
|
|
73
|
+
? resolveRefPath(data, value.replace('$ref:', ''), prefix)
|
|
64
74
|
: value;
|
|
65
75
|
if (!exports.operators[op]) {
|
|
66
76
|
throw new Error(`Error missing operator:${op}`);
|
|
@@ -82,7 +92,9 @@ const rulesMatcherUtils = {
|
|
|
82
92
|
const res = rulesMatcherUtils.getPath(path, prefix);
|
|
83
93
|
const { value } = rulesMatcherUtils.getDefaultRule(valueBlock[path]);
|
|
84
94
|
if (value && String(value).indexOf('$ref:') === 0) {
|
|
85
|
-
|
|
95
|
+
const refPath = value.replace('$ref:', '');
|
|
96
|
+
keys[refPath] = true;
|
|
97
|
+
keys[rulesMatcherUtils.getPath(refPath, prefix)] = true;
|
|
86
98
|
}
|
|
87
99
|
return (keys[res] = true);
|
|
88
100
|
},
|
|
@@ -221,6 +233,7 @@ const rulesMatcherUtils = {
|
|
|
221
233
|
*/
|
|
222
234
|
exports.operators = {
|
|
223
235
|
$exists: (a, b) => !rulesMatcherUtils.isEmpty(a) === b,
|
|
236
|
+
'%exists': (a, b) => !rulesMatcherUtils.isEmpty(a) === b,
|
|
224
237
|
$eq: (a, b) => areSemanticallyEqual(a, b),
|
|
225
238
|
$ne: (a, b) => !areSemanticallyEqual(a, b),
|
|
226
239
|
$gt: (a, b) => rulesMatcherUtils.forceNumber(a) > parseFloat(b),
|
|
@@ -233,9 +246,13 @@ exports.operators = {
|
|
|
233
246
|
$strLte: (a, b) => String(a || '').length <= parseFloat(b),
|
|
234
247
|
$in: (a, b) => includesWithSemanticEquality(a, b),
|
|
235
248
|
$nin: (a, b) => !includesWithSemanticEquality(a, b),
|
|
236
|
-
$all: (a, b) => rulesMatcherUtils
|
|
249
|
+
$all: (a, b) => rulesMatcherUtils
|
|
250
|
+
.forceArray(b)
|
|
251
|
+
.every((candidate) => rulesMatcherUtils
|
|
237
252
|
.forceArray(a)
|
|
238
|
-
.some((value) => rulesMatcherUtils
|
|
253
|
+
.some((value) => rulesMatcherUtils
|
|
254
|
+
.forceArray(candidate)
|
|
255
|
+
.some((item) => areSemanticallyEqual(value, item)))),
|
|
239
256
|
$size: (a, b) => Array.isArray(a) && a.length === parseFloat(b),
|
|
240
257
|
$regex: (a, b, opt) => rulesMatcherUtils
|
|
241
258
|
.forceArray(b)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowerforce/flowerbase",
|
|
3
|
-
"version": "1.7.6-beta.
|
|
3
|
+
"version": "1.7.6-beta.10",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
"scripts": {
|
|
15
15
|
"test": "npx jest",
|
|
16
16
|
"build": "rm -rf dist/ && tsc",
|
|
17
|
-
"start": "node dist/src/index.ts"
|
|
17
|
+
"start": "node dist/src/index.ts",
|
|
18
|
+
"tsc:noemit": "tsc --noEmit"
|
|
18
19
|
},
|
|
19
20
|
"keywords": [],
|
|
20
21
|
"author": "",
|
|
@@ -30,6 +31,7 @@
|
|
|
30
31
|
"@fastify/swagger-ui": "^5.2.3",
|
|
31
32
|
"@fastify/websocket": "^11.2.0",
|
|
32
33
|
"bson": "^6.8.0",
|
|
34
|
+
"codemirror": "^5.65.16",
|
|
33
35
|
"dotenv": "^16.4.7",
|
|
34
36
|
"fastify": "^5.0.0",
|
|
35
37
|
"fastify-plugin": "^5.0.1",
|
|
@@ -32,10 +32,7 @@ export async function customFunctionController(app: FastifyInstance) {
|
|
|
32
32
|
app.post<LoginDto>(
|
|
33
33
|
AUTH_ENDPOINTS.LOGIN,
|
|
34
34
|
{
|
|
35
|
-
schema: LOGIN_SCHEMA
|
|
36
|
-
errorHandler: (_error, _request, reply) => {
|
|
37
|
-
reply.code(500).send({ message: 'Internal Server Error' })
|
|
38
|
-
}
|
|
35
|
+
schema: LOGIN_SCHEMA
|
|
39
36
|
},
|
|
40
37
|
async function (req, reply) {
|
|
41
38
|
const customFunctionProvider = AUTH_CONFIG.authProviders?.['custom-function']
|
|
@@ -82,6 +79,7 @@ export async function customFunctionController(app: FastifyInstance) {
|
|
|
82
79
|
}
|
|
83
80
|
}) as CustomFunctionAuthResult
|
|
84
81
|
|
|
82
|
+
|
|
85
83
|
if (!authResult.id) {
|
|
86
84
|
reply.code(401).send({ message: 'Unauthorized' })
|
|
87
85
|
return
|
|
@@ -130,25 +128,26 @@ export async function customFunctionController(app: FastifyInstance) {
|
|
|
130
128
|
...(user || {})
|
|
131
129
|
}
|
|
132
130
|
}
|
|
133
|
-
|
|
131
|
+
const now = new Date()
|
|
134
132
|
const refreshToken = this.createRefreshToken(currentUserData)
|
|
135
133
|
const refreshTokenHash = hashToken(refreshToken)
|
|
136
134
|
await authDb.collection(refreshTokensCollection).insertOne({
|
|
137
135
|
userId: authUser._id,
|
|
138
136
|
tokenHash: refreshTokenHash,
|
|
139
|
-
createdAt:
|
|
137
|
+
createdAt: now,
|
|
140
138
|
expiresAt: new Date(Date.now() + refreshTokenTtlMs),
|
|
141
139
|
revokedAt: null
|
|
142
140
|
})
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
141
|
+
await authDb.collection(authCollection!).updateOne(
|
|
142
|
+
{ _id: authUser._id },
|
|
143
|
+
{ $set: { lastLoginAt: now } }
|
|
144
|
+
)
|
|
145
|
+
return {
|
|
146
|
+
access_token: this.createAccessToken(currentUserData),
|
|
147
147
|
refresh_token: refreshToken,
|
|
148
148
|
device_id: '',
|
|
149
149
|
user_id: authUser._id.toString()
|
|
150
150
|
}
|
|
151
|
-
reply.code(200).send(responsePayload)
|
|
152
151
|
}
|
|
153
152
|
)
|
|
154
153
|
|