jxp 2.16.0 → 4.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.
- package/.env.sample +31 -6
- package/README.md +27 -13
- package/dist/bin/init_db.d.ts +3 -0
- package/dist/bin/init_db.d.ts.map +1 -0
- package/dist/bin/init_db.js +48 -0
- package/dist/bin/init_db.js.map +1 -0
- package/dist/bin/server.d.ts +4 -0
- package/dist/bin/server.d.ts.map +1 -0
- package/dist/bin/server.js +132 -0
- package/dist/bin/server.js.map +1 -0
- package/dist/bin/setup.d.ts +3 -0
- package/dist/bin/setup.d.ts.map +1 -0
- package/dist/bin/setup.js +185 -0
- package/dist/bin/setup.js.map +1 -0
- package/dist/globals.d.ts +14 -0
- package/dist/globals.d.ts.map +1 -0
- package/dist/globals.js +3 -0
- package/dist/globals.js.map +1 -0
- package/dist/libs/aggregate_guard.d.ts +5 -0
- package/dist/libs/aggregate_guard.d.ts.map +1 -0
- package/dist/libs/aggregate_guard.js +58 -0
- package/dist/libs/aggregate_guard.js.map +1 -0
- package/dist/libs/bulkwrite_guard.d.ts +5 -0
- package/dist/libs/bulkwrite_guard.d.ts.map +1 -0
- package/dist/libs/bulkwrite_guard.js +44 -0
- package/dist/libs/bulkwrite_guard.js.map +1 -0
- package/dist/libs/cache.d.ts +2 -0
- package/dist/libs/cache.d.ts.map +1 -0
- package/dist/libs/cache.js +94 -0
- package/dist/libs/cache.js.map +1 -0
- package/dist/libs/call_guard.d.ts +3 -0
- package/dist/libs/call_guard.d.ts.map +1 -0
- package/dist/libs/call_guard.js +17 -0
- package/dist/libs/call_guard.js.map +1 -0
- package/dist/libs/connection_string.d.ts +3 -0
- package/dist/libs/connection_string.d.ts.map +1 -0
- package/dist/libs/connection_string.js +4 -0
- package/dist/libs/connection_string.js.map +1 -0
- package/dist/libs/datamunging.d.ts +2 -0
- package/dist/libs/datamunging.d.ts.map +1 -0
- package/dist/libs/datamunging.js +320 -0
- package/dist/libs/datamunging.js.map +1 -0
- package/dist/libs/docs.d.ts +2 -0
- package/dist/libs/docs.d.ts.map +1 -0
- package/dist/libs/docs.js +307 -0
- package/dist/libs/docs.js.map +1 -0
- package/dist/libs/groups.d.ts +2 -0
- package/dist/libs/groups.d.ts.map +1 -0
- package/dist/libs/groups.js +136 -0
- package/dist/libs/groups.js.map +1 -0
- package/dist/libs/jxp.d.ts +4 -0
- package/dist/libs/jxp.d.ts.map +1 -0
- package/dist/libs/jxp.js +1157 -0
- package/dist/libs/jxp.js.map +1 -0
- package/dist/libs/link_index.d.ts +14 -0
- package/dist/libs/link_index.d.ts.map +1 -0
- package/dist/libs/link_index.js +37 -0
- package/dist/libs/link_index.js.map +1 -0
- package/dist/libs/load-config.d.ts +16 -0
- package/dist/libs/load-config.d.ts.map +1 -0
- package/dist/libs/load-config.js +155 -0
- package/dist/libs/load-config.js.map +1 -0
- package/dist/libs/login.d.ts +2 -0
- package/dist/libs/login.d.ts.map +1 -0
- package/dist/libs/login.js +244 -0
- package/dist/libs/login.js.map +1 -0
- package/dist/libs/modeldir.d.ts +5 -0
- package/dist/libs/modeldir.d.ts.map +1 -0
- package/dist/libs/modeldir.js +15 -0
- package/dist/libs/modeldir.js.map +1 -0
- package/dist/libs/query_limits.d.ts +2 -0
- package/dist/libs/query_limits.d.ts.map +1 -0
- package/dist/libs/query_limits.js +84 -0
- package/dist/libs/query_limits.js.map +1 -0
- package/dist/libs/query_manipulation.d.ts +3 -0
- package/dist/libs/query_manipulation.d.ts.map +1 -0
- package/{libs → dist/libs}/query_manipulation.js +22 -21
- package/dist/libs/query_manipulation.js.map +1 -0
- package/dist/libs/query_sanitize.d.ts +5 -0
- package/dist/libs/query_sanitize.d.ts.map +1 -0
- package/dist/libs/query_sanitize.js +109 -0
- package/dist/libs/query_sanitize.js.map +1 -0
- package/dist/libs/response_sanitize.d.ts +7 -0
- package/dist/libs/response_sanitize.d.ts.map +1 -0
- package/dist/libs/response_sanitize.js +57 -0
- package/dist/libs/response_sanitize.js.map +1 -0
- package/dist/libs/safe_error.d.ts +3 -0
- package/dist/libs/safe_error.d.ts.map +1 -0
- package/dist/libs/safe_error.js +14 -0
- package/dist/libs/safe_error.js.map +1 -0
- package/dist/libs/schema.d.ts +14 -0
- package/dist/libs/schema.d.ts.map +1 -0
- package/dist/libs/schema.js +98 -0
- package/dist/libs/schema.js.map +1 -0
- package/dist/libs/schema_description.d.ts +3 -0
- package/dist/libs/schema_description.d.ts.map +1 -0
- package/{libs → dist/libs}/schema_description.js +12 -21
- package/dist/libs/schema_description.js.map +1 -0
- package/dist/libs/security.d.ts +2 -0
- package/dist/libs/security.d.ts.map +1 -0
- package/dist/libs/security.js +428 -0
- package/dist/libs/security.js.map +1 -0
- package/dist/libs/setup.d.ts +2 -0
- package/dist/libs/setup.d.ts.map +1 -0
- package/dist/libs/setup.js +87 -0
- package/dist/libs/setup.js.map +1 -0
- package/dist/libs/startup-deprecations.d.ts +2 -0
- package/dist/libs/startup-deprecations.d.ts.map +1 -0
- package/dist/libs/startup-deprecations.js +21 -0
- package/dist/libs/startup-deprecations.js.map +1 -0
- package/dist/libs/startup.d.ts +16 -0
- package/dist/libs/startup.d.ts.map +1 -0
- package/dist/libs/startup.js +63 -0
- package/dist/libs/startup.js.map +1 -0
- package/dist/libs/ws.d.ts +2 -0
- package/dist/libs/ws.d.ts.map +1 -0
- package/{libs → dist/libs}/ws.js +114 -73
- package/dist/libs/ws.js.map +1 -0
- package/dist/models/apikey_model.d.ts +10 -0
- package/dist/models/apikey_model.d.ts.map +1 -0
- package/dist/models/apikey_model.js +14 -0
- package/dist/models/apikey_model.js.map +1 -0
- package/dist/models/link_model.d.ts +9 -0
- package/dist/models/link_model.d.ts.map +1 -0
- package/dist/models/link_model.js +20 -0
- package/dist/models/link_model.js.map +1 -0
- package/dist/models/refreshtoken_model.d.ts +11 -0
- package/dist/models/refreshtoken_model.d.ts.map +1 -0
- package/dist/models/refreshtoken_model.js +22 -0
- package/dist/models/refreshtoken_model.js.map +1 -0
- package/dist/models/test_model.d.ts +24 -0
- package/dist/models/test_model.d.ts.map +1 -0
- package/dist/models/test_model.js +44 -0
- package/dist/models/test_model.js.map +1 -0
- package/dist/models/token_model.d.ts +14 -0
- package/dist/models/token_model.d.ts.map +1 -0
- package/dist/models/token_model.js +25 -0
- package/dist/models/token_model.js.map +1 -0
- package/dist/models/user_model.d.ts +15 -0
- package/dist/models/user_model.d.ts.map +1 -0
- package/dist/models/user_model.js +38 -0
- package/dist/models/user_model.js.map +1 -0
- package/dist/models/usergroups_model.d.ts +9 -0
- package/dist/models/usergroups_model.d.ts.map +1 -0
- package/dist/models/usergroups_model.js +18 -0
- package/dist/models/usergroups_model.js.map +1 -0
- package/dist/types/jxp-config.d.ts +134 -0
- package/dist/types/jxp-config.d.ts.map +1 -0
- package/dist/types/jxp-config.js +3 -0
- package/dist/types/jxp-config.js.map +1 -0
- package/dist/types/schema-fields.d.ts +43 -0
- package/dist/types/schema-fields.d.ts.map +1 -0
- package/dist/types/schema-fields.js +3 -0
- package/dist/types/schema-fields.js.map +1 -0
- package/docs/aggregations.md +40 -21
- package/docs/api.md +55 -15
- package/docs/authentication.md +60 -37
- package/docs/bulk_writes.md +11 -8
- package/docs/caching.md +28 -11
- package/docs/changelog.md +237 -31
- package/docs/configuration.md +99 -118
- package/docs/hooks.md +12 -8
- package/docs/index.md +17 -17
- package/docs/installation.md +23 -18
- package/docs/permissions.md +33 -19
- package/docs/queries.md +9 -5
- package/docs/schemas.md +21 -10
- package/docs/special.md +4 -4
- package/docs/typescript.md +86 -0
- package/docs/websocket.md +99 -1
- package/mkdocs.yml +1 -0
- package/package.json +121 -69
- package/templates/api.pug +32 -0
- package/templates/app-server.js +43 -0
- package/templates/app.env.sample +8 -0
- package/templates/assets/api-console.js +133 -0
- package/templates/assets/docs.css +227 -0
- package/templates/index.pug +62 -2
- package/templates/layout.pug +17 -11
- package/templates/md.pug +1 -1
- package/templates/model.pug +117 -68
- package/templates/navbar.pug +14 -21
- package/templates/sidebar.pug +30 -0
- package/.env +0 -9
- package/.eslintrc.json +0 -20
- package/.jshintrc +0 -4
- package/.vscode/launch.json +0 -29
- package/.vscode/settings.json +0 -3
- package/Dockerfile +0 -7
- package/bin/init_db.js +0 -54
- package/bin/server.js +0 -84
- package/bin/setup.js +0 -190
- package/config_sample.json +0 -10
- package/docker-compose.yml +0 -32
- package/libs/cache.js +0 -92
- package/libs/connection_string.js +0 -24
- package/libs/datamunging.js +0 -335
- package/libs/docs.js +0 -162
- package/libs/groups.js +0 -133
- package/libs/jxp.js +0 -1208
- package/libs/login.js +0 -218
- package/libs/modeldir.js +0 -14
- package/libs/schema.js +0 -99
- package/libs/security.js +0 -410
- package/libs/setup.js +0 -90
- package/models/apikey_model.js +0 -10
- package/models/link_model.js +0 -17
- package/models/refreshtoken_model.js +0 -20
- package/models/test_model.js +0 -50
- package/models/token_model.js +0 -23
- package/models/user_model.js +0 -38
- package/models/usergroups_model.js +0 -15
- package/setup.sh +0 -3
- package/test/.eslintrc.json +0 -13
- package/test/init.js +0 -92
- package/test/setup.test.js +0 -62
- package/test/test.js +0 -1527
- package/test/wstest.js.old +0 -124
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
const fs = require("fs");
|
|
2
3
|
const path = require("path");
|
|
3
4
|
const mongoose = require("mongoose");
|
|
4
|
-
|
|
5
5
|
const getModelFileContents = (model_dir) => {
|
|
6
6
|
return new Promise((resolve, reject) => {
|
|
7
7
|
try {
|
|
@@ -9,22 +9,16 @@ const getModelFileContents = (model_dir) => {
|
|
|
9
9
|
if (err) {
|
|
10
10
|
return reject(err);
|
|
11
11
|
}
|
|
12
|
-
|
|
13
12
|
// Filter for only model files first
|
|
14
|
-
const modelFiles = files.filter(file =>
|
|
15
|
-
|
|
16
|
-
fs.statSync(path.join(model_dir, file)).isFile()
|
|
17
|
-
);
|
|
18
|
-
|
|
13
|
+
const modelFiles = files.filter(file => file.endsWith('_model.js') &&
|
|
14
|
+
fs.statSync(path.join(model_dir, file)).isFile());
|
|
19
15
|
// Limit number of files processed at once
|
|
20
16
|
const MAX_FILES = 1000;
|
|
21
17
|
if (modelFiles.length > MAX_FILES) {
|
|
22
18
|
return reject(new Error(`Too many model files (${modelFiles.length}). Maximum allowed is ${MAX_FILES}`));
|
|
23
19
|
}
|
|
24
|
-
|
|
25
20
|
let models = [];
|
|
26
21
|
let errors = [];
|
|
27
|
-
|
|
28
22
|
for (const file of modelFiles) {
|
|
29
23
|
const modelname = path.basename(file, ".js").replace("_model", "");
|
|
30
24
|
try {
|
|
@@ -34,20 +28,19 @@ const getModelFileContents = (model_dir) => {
|
|
|
34
28
|
// Convert modelname to proper case for mongoose (first letter uppercase)
|
|
35
29
|
const modelKey = modelname.charAt(0).toUpperCase() + modelname.slice(1);
|
|
36
30
|
modelobj = mongoose.models[modelKey];
|
|
37
|
-
|
|
38
31
|
// If model doesn't exist in mongoose, try to load it from file
|
|
39
32
|
if (!modelobj) {
|
|
40
33
|
const filePath = path.join(model_dir, file);
|
|
41
34
|
delete require.cache[require.resolve(filePath)];
|
|
42
35
|
modelobj = require(filePath);
|
|
43
36
|
}
|
|
44
|
-
}
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
45
39
|
// If getting from mongoose fails, try loading from file
|
|
46
40
|
const filePath = path.join(model_dir, file);
|
|
47
41
|
delete require.cache[require.resolve(filePath)];
|
|
48
42
|
modelobj = require(filePath);
|
|
49
43
|
}
|
|
50
|
-
|
|
51
44
|
// Check if we have a valid model with schema and permissions
|
|
52
45
|
if (modelobj && modelobj.schema) {
|
|
53
46
|
const perms = modelobj.schema.get("_perms");
|
|
@@ -60,11 +53,10 @@ const getModelFileContents = (model_dir) => {
|
|
|
60
53
|
continue; // Skip error handling if successful
|
|
61
54
|
}
|
|
62
55
|
}
|
|
63
|
-
|
|
64
56
|
// If we get here, the model was loaded but didn't have proper schema/perms
|
|
65
57
|
errors.push(`Invalid model structure for ${modelname}`);
|
|
66
|
-
|
|
67
|
-
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
68
60
|
// Only add to errors if it's not an OverwriteModelError
|
|
69
61
|
if (!error.message.includes('Cannot overwrite')) {
|
|
70
62
|
errors.push(`Error with model ${modelname}: ${error.message}`);
|
|
@@ -72,19 +64,18 @@ const getModelFileContents = (model_dir) => {
|
|
|
72
64
|
}
|
|
73
65
|
}
|
|
74
66
|
}
|
|
75
|
-
|
|
76
67
|
// If we have errors but also some valid models, just log the errors
|
|
77
68
|
if (errors.length > 0 && models.length > 0) {
|
|
78
69
|
console.warn('Some models failed to load:', errors);
|
|
79
70
|
}
|
|
80
|
-
|
|
81
71
|
// Return empty array if no models found, but don't treat it as an error
|
|
82
72
|
return resolve(models);
|
|
83
73
|
});
|
|
84
|
-
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
85
76
|
return reject(err);
|
|
86
77
|
}
|
|
87
78
|
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
79
|
+
};
|
|
80
|
+
module.exports = getModelFileContents;
|
|
81
|
+
//# sourceMappingURL=schema_description.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema_description.js","sourceRoot":"","sources":["../../src/libs/schema_description.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/libs/security.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const bcrypt = require("bcryptjs");
|
|
4
|
+
const randToken = require("rand-token");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const errors = require("restify-errors");
|
|
7
|
+
var APIKey = null;
|
|
8
|
+
var Token = null;
|
|
9
|
+
var Groups = null;
|
|
10
|
+
var User = null;
|
|
11
|
+
var RefreshToken = null;
|
|
12
|
+
var provider = "";
|
|
13
|
+
const loadModel = (modelDir, file) => {
|
|
14
|
+
const mod = require(path.join(modelDir, file));
|
|
15
|
+
return mod.default || mod;
|
|
16
|
+
};
|
|
17
|
+
const init = function (config) {
|
|
18
|
+
APIKey = loadModel(config.model_dir, "apikey_model");
|
|
19
|
+
Groups = loadModel(config.model_dir, "usergroups_model.js");
|
|
20
|
+
User = loadModel(config.model_dir, "user_model");
|
|
21
|
+
Token = loadModel(config.model_dir, "token_model");
|
|
22
|
+
RefreshToken = loadModel(config.model_dir, "refreshtoken_model");
|
|
23
|
+
if (config.url)
|
|
24
|
+
provider = config.url;
|
|
25
|
+
};
|
|
26
|
+
const basicAuthData = function (req) {
|
|
27
|
+
if (!req.headers.authorization) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const authorization = req.headers.authorization.split(" ")[1];
|
|
32
|
+
const decoded = Buffer.from(authorization, "base64").toString();
|
|
33
|
+
return decoded.split(":");
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const basicAuth = async (ba) => {
|
|
40
|
+
try {
|
|
41
|
+
if (!Array.isArray(ba) || ba.length !== 2) {
|
|
42
|
+
throw ("Basic Auth incorrectly formatted");
|
|
43
|
+
}
|
|
44
|
+
var email = ba[0];
|
|
45
|
+
var password = ba[1];
|
|
46
|
+
const user = await User.findOne({ email }).exec();
|
|
47
|
+
if (!user) {
|
|
48
|
+
throw (new Date(), `Incorrect username or password for ${email}`);
|
|
49
|
+
}
|
|
50
|
+
if (!await bcrypt.compare(password, user.password)) {
|
|
51
|
+
throw (`Incorrect username or password for ${email}`);
|
|
52
|
+
}
|
|
53
|
+
return user;
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
console.error(new Date(), err);
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const bearerAuthData = req => {
|
|
61
|
+
if (!req.headers.authorization) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const token = req.headers.authorization.split(" ")[1];
|
|
66
|
+
return token;
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const bearerAuth = async (t) => {
|
|
73
|
+
try {
|
|
74
|
+
if (!t)
|
|
75
|
+
throw ("Token invalid");
|
|
76
|
+
const token = await Token.findOne({ access_token: t, provider }).exec();
|
|
77
|
+
if (!token) {
|
|
78
|
+
throw (`Token ${t} not found`);
|
|
79
|
+
}
|
|
80
|
+
if (!tokenIsValid(token)) {
|
|
81
|
+
throw (`Token is no loger valid`);
|
|
82
|
+
}
|
|
83
|
+
const user = await User.findOne({ _id: token.user_id }).exec();
|
|
84
|
+
if (!user) {
|
|
85
|
+
throw (`Could not find user`);
|
|
86
|
+
}
|
|
87
|
+
return user;
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
console.error(err);
|
|
91
|
+
throw err;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const apiKeyAuth = async (apikey) => {
|
|
95
|
+
try {
|
|
96
|
+
if (!apikey)
|
|
97
|
+
throw ("Missing apikey");
|
|
98
|
+
const result = await APIKey.findOne({ apikey });
|
|
99
|
+
if (!result)
|
|
100
|
+
throw ("Could not find apikey");
|
|
101
|
+
const user = await User.findOne({ _id: result.user_id }).exec();
|
|
102
|
+
if (!user)
|
|
103
|
+
throw ("Could not find user associated to apikey");
|
|
104
|
+
return user;
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
console.error(new Date(), err);
|
|
108
|
+
throw err;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const getGroups = async (user_id) => {
|
|
112
|
+
try {
|
|
113
|
+
const userGroup = await Groups.findOne({ user_id });
|
|
114
|
+
var groups = userGroup && userGroup.groups ? userGroup.groups : [];
|
|
115
|
+
return groups;
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
console.error(new Date(), err);
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const encPassword = password => {
|
|
123
|
+
return bcrypt.hashSync(password, 4);
|
|
124
|
+
};
|
|
125
|
+
const generateApiKey = async (user_id) => {
|
|
126
|
+
try {
|
|
127
|
+
let existing = await APIKey.findOne({ user_id }).sort({ last_accessed: -1 }).exec();
|
|
128
|
+
if (existing) {
|
|
129
|
+
await existing.updateOne({ last_accessed: new Date() });
|
|
130
|
+
return existing;
|
|
131
|
+
}
|
|
132
|
+
var apikey = new APIKey();
|
|
133
|
+
apikey.user_id = user_id;
|
|
134
|
+
apikey.apikey = randToken.generate(16);
|
|
135
|
+
await apikey.save();
|
|
136
|
+
return apikey;
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
console.error(new Date(), err);
|
|
140
|
+
throw err;
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
const tokenIsValid = token => {
|
|
144
|
+
if (!token)
|
|
145
|
+
return false;
|
|
146
|
+
const now = +new Date();
|
|
147
|
+
const expires_at = +new Date(token.createdAt) + (token.expires_in * 1000);
|
|
148
|
+
return (expires_at > now);
|
|
149
|
+
};
|
|
150
|
+
const tokenExpires = (token) => {
|
|
151
|
+
return new Date(new Date(token.createdAt).getTime() + token.expires_in * 1000);
|
|
152
|
+
};
|
|
153
|
+
const generateToken = async (user_id) => {
|
|
154
|
+
try {
|
|
155
|
+
var token = new Token();
|
|
156
|
+
token.user_id = user_id;
|
|
157
|
+
token.access_token = randToken.generate(16);
|
|
158
|
+
token.provider = provider;
|
|
159
|
+
await token.save();
|
|
160
|
+
return token;
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
console.error(new Date(), err);
|
|
164
|
+
throw err;
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
const ensureToken = async (user_id) => {
|
|
168
|
+
try {
|
|
169
|
+
const token = await Token.findOne({ user_id, provider }).sort({ createdAt: -1 }).exec();
|
|
170
|
+
if (tokenIsValid(token)) {
|
|
171
|
+
return token;
|
|
172
|
+
}
|
|
173
|
+
return await generateToken(user_id);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
console.error(new Date(), err);
|
|
177
|
+
throw err;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
const refreshToken = async (user_id) => {
|
|
181
|
+
await revokeToken(user_id);
|
|
182
|
+
return await ensureToken(user_id);
|
|
183
|
+
};
|
|
184
|
+
const revokeToken = async (user_id) => {
|
|
185
|
+
await Token.deleteOne({ user_id, provider });
|
|
186
|
+
return;
|
|
187
|
+
};
|
|
188
|
+
const generateRefreshToken = async (user_id) => {
|
|
189
|
+
try {
|
|
190
|
+
var refreshtoken = new RefreshToken();
|
|
191
|
+
refreshtoken.user_id = user_id;
|
|
192
|
+
refreshtoken.refresh_token = randToken.generate(16);
|
|
193
|
+
await refreshtoken.save();
|
|
194
|
+
return refreshtoken;
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
console.error(new Date(), err);
|
|
198
|
+
throw err;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
const ensureRefreshToken = async (user_id) => {
|
|
202
|
+
const refreshtoken = await RefreshToken.findOne({ user_id }).sort({ createdAt: -1 }).exec();
|
|
203
|
+
if (tokenIsValid(refreshtoken)) {
|
|
204
|
+
return refreshtoken;
|
|
205
|
+
}
|
|
206
|
+
return await generateRefreshToken(user_id);
|
|
207
|
+
};
|
|
208
|
+
const revokeRefreshToken = async (user_id) => {
|
|
209
|
+
await RefreshToken.deleteMany({ user_id });
|
|
210
|
+
return;
|
|
211
|
+
};
|
|
212
|
+
const refresh = async (req, res) => {
|
|
213
|
+
try {
|
|
214
|
+
if (req.headers.authorization && req.headers.authorization.trim().toLowerCase().indexOf("bearer") === 0) {
|
|
215
|
+
const refresh_token = await RefreshToken.findOne({ refresh_token: bearerAuthData(req) }).exec();
|
|
216
|
+
if (!refresh_token)
|
|
217
|
+
throw ("Refresh token not found");
|
|
218
|
+
if (!tokenIsValid(refresh_token))
|
|
219
|
+
throw ("Refresh token has expired");
|
|
220
|
+
const user_id = refresh_token.user_id;
|
|
221
|
+
const token = await refreshToken(user_id);
|
|
222
|
+
await revokeRefreshToken(user_id);
|
|
223
|
+
const new_refresh_token = await generateRefreshToken(user_id);
|
|
224
|
+
res.send({
|
|
225
|
+
user_id: user_id,
|
|
226
|
+
token: token.access_token,
|
|
227
|
+
token_expires: tokenExpires(token),
|
|
228
|
+
refresh_token: new_refresh_token.refresh_token,
|
|
229
|
+
refresh_token_expires: tokenExpires(new_refresh_token)
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
throw ("Missing refresh token");
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
console.error(err);
|
|
238
|
+
if (err.code)
|
|
239
|
+
throw err;
|
|
240
|
+
throw new errors.ForbiddenError(err.toString());
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
const login = async (req, res) => {
|
|
244
|
+
try {
|
|
245
|
+
const authenticate_result = await authenticate(req);
|
|
246
|
+
if (!authenticate_result) {
|
|
247
|
+
res.user = null;
|
|
248
|
+
res.groups = [];
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
res = Object.assign(res, authenticate_result);
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
console.error(err);
|
|
255
|
+
if (err.code)
|
|
256
|
+
throw err;
|
|
257
|
+
throw new errors.ForbiddenError(err.toString());
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
const authenticate = async (req) => {
|
|
261
|
+
let user = null;
|
|
262
|
+
if (!req.query.apikey && !req.headers.authorization && !(req.headers["X-API-Key"] || req.headers["x-api-key"])) {
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
if (req.headers.authorization && req.headers.authorization.trim().toLowerCase().indexOf("basic") === 0) {
|
|
266
|
+
// Basic Auth
|
|
267
|
+
user = await basicAuth(basicAuthData(req));
|
|
268
|
+
}
|
|
269
|
+
else if (req.headers.authorization && req.headers.authorization.trim().toLowerCase().indexOf("bearer") === 0) {
|
|
270
|
+
// Token Auth
|
|
271
|
+
user = await bearerAuth(bearerAuthData(req));
|
|
272
|
+
}
|
|
273
|
+
else if (req.query.apikey) {
|
|
274
|
+
user = await apiKeyAuth(req.query.apikey);
|
|
275
|
+
}
|
|
276
|
+
else if (req.headers["X-API-Key"] || req.headers["x-api-key"]) {
|
|
277
|
+
// API Key
|
|
278
|
+
user = await apiKeyAuth(req.headers["X-API-Key"] || req.headers["x-api-key"]);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
throw ("Could not find any way to authenticate");
|
|
282
|
+
}
|
|
283
|
+
if (!user) {
|
|
284
|
+
throw ("Could not find user");
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
token: await ensureToken(user._id),
|
|
288
|
+
refresh_token: await ensureRefreshToken(user._id),
|
|
289
|
+
groups: await getGroups(user._id),
|
|
290
|
+
username: user.email,
|
|
291
|
+
user
|
|
292
|
+
};
|
|
293
|
+
};
|
|
294
|
+
const auth = async (req, res) => {
|
|
295
|
+
// Check against model as to whether we're allowed to edit this model
|
|
296
|
+
if (!req.Model) {
|
|
297
|
+
// console.error("Model missing");
|
|
298
|
+
throw new errors.BadRequestError("Model missing");
|
|
299
|
+
}
|
|
300
|
+
try {
|
|
301
|
+
var method = null;
|
|
302
|
+
// console.log("req.route.name", req.route.name);
|
|
303
|
+
if (req.method == "GET" || req.route.name === "postquerymodelname" || req.route.name === "postaggregatemodelname") {
|
|
304
|
+
method = "r";
|
|
305
|
+
}
|
|
306
|
+
else if (req.method == "POST") {
|
|
307
|
+
method = "c";
|
|
308
|
+
}
|
|
309
|
+
else if (req.method == "PUT") {
|
|
310
|
+
method = "u";
|
|
311
|
+
}
|
|
312
|
+
else if (req.method == "DELETE") {
|
|
313
|
+
method = "d";
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
// console.error("Unsupported operation", req.method);
|
|
317
|
+
throw new errors.InternalServerError(`Unsupported operation: ${req.method}`);
|
|
318
|
+
}
|
|
319
|
+
return await check_perms(res.user, res.groups, req.Model, method, req.params.item_id);
|
|
320
|
+
}
|
|
321
|
+
catch (err) {
|
|
322
|
+
console.error(err);
|
|
323
|
+
if (err.code)
|
|
324
|
+
throw err;
|
|
325
|
+
throw new errors.ForbiddenError(err.toString());
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
// Bulk auth requires all CRUD permissions
|
|
329
|
+
const bulkAuth = async (req, res) => {
|
|
330
|
+
try {
|
|
331
|
+
await check_perms(res.user, res.groups, req.Model, "c");
|
|
332
|
+
await check_perms(res.user, res.groups, req.Model, "r");
|
|
333
|
+
await check_perms(res.user, res.groups, req.Model, "u");
|
|
334
|
+
await check_perms(res.user, res.groups, req.Model, "d");
|
|
335
|
+
}
|
|
336
|
+
catch (err) {
|
|
337
|
+
console.error(err);
|
|
338
|
+
if (err.code)
|
|
339
|
+
throw err;
|
|
340
|
+
throw new errors.ForbiddenError(err.toString());
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
const check_perms = async (user, groups, model, method, item_id) => {
|
|
344
|
+
try {
|
|
345
|
+
const perms = model.schema.get("_perms");
|
|
346
|
+
//If no perms are set, then this isn't an available model
|
|
347
|
+
if (!perms.admin) {
|
|
348
|
+
console.error("Model permissions not set correctly - add an admin section");
|
|
349
|
+
throw new errors.InternalServerError("Model permissions not set correctly - add an admin section");
|
|
350
|
+
}
|
|
351
|
+
//First check if "all" is able to do this. If so, let's get on with it.
|
|
352
|
+
if (perms.all && perms.all.length) {
|
|
353
|
+
if (perms.all.indexOf(method) !== -1) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
//This isn't an 'all' situation, so let's bail if the user isn't logged in
|
|
358
|
+
if (!user) {
|
|
359
|
+
throw new errors.ForbiddenError("User not logged in");
|
|
360
|
+
}
|
|
361
|
+
//Let's check perms in this order - admin, user, group, owner
|
|
362
|
+
//Admin check
|
|
363
|
+
if (user.admin && perms.admin && perms.admin.includes(method)) {
|
|
364
|
+
// console.log("Matched permission 'admin':" + method);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
//User check
|
|
368
|
+
if (perms.user && perms.user.includes(method)) {
|
|
369
|
+
// console.log("Matched permission 'user':" + method);
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
//Group check
|
|
373
|
+
for (let group of groups) {
|
|
374
|
+
if (perms[group] && perms[group].includes(method)) {
|
|
375
|
+
// console.log("Matched permission '" + group + "':" + method);
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
//Owner check
|
|
380
|
+
if (!item_id)
|
|
381
|
+
throw (`Authorization failed - ${method}`);
|
|
382
|
+
const item = await model.findById(item_id);
|
|
383
|
+
if (item && item._owner_id && item._owner_id.toString() == user._id.toString() && (perms.owner && perms.owner.includes(method)))
|
|
384
|
+
return;
|
|
385
|
+
throw ("Authorization failed");
|
|
386
|
+
}
|
|
387
|
+
catch (err) {
|
|
388
|
+
if (err.code)
|
|
389
|
+
throw err;
|
|
390
|
+
throw new errors.ForbiddenError(err.toString());
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
const admin_only = (req, res, next) => {
|
|
394
|
+
if (!res.user) {
|
|
395
|
+
return next(new errors.ForbiddenError("User not logged in"));
|
|
396
|
+
}
|
|
397
|
+
if (!res.user.admin) {
|
|
398
|
+
return next(new errors.ForbiddenError("User not admin"));
|
|
399
|
+
}
|
|
400
|
+
next();
|
|
401
|
+
};
|
|
402
|
+
const Security = {
|
|
403
|
+
init,
|
|
404
|
+
basicAuthData,
|
|
405
|
+
basicAuth,
|
|
406
|
+
encPassword,
|
|
407
|
+
generateApiKey,
|
|
408
|
+
generateToken,
|
|
409
|
+
ensureToken,
|
|
410
|
+
refreshToken,
|
|
411
|
+
revokeToken,
|
|
412
|
+
tokenExpires,
|
|
413
|
+
generateRefreshToken,
|
|
414
|
+
ensureRefreshToken,
|
|
415
|
+
revokeRefreshToken,
|
|
416
|
+
login,
|
|
417
|
+
refresh,
|
|
418
|
+
authenticate,
|
|
419
|
+
auth,
|
|
420
|
+
admin_only,
|
|
421
|
+
check_perms,
|
|
422
|
+
getGroups,
|
|
423
|
+
apiKeyAuth,
|
|
424
|
+
bearerAuth,
|
|
425
|
+
bulkAuth
|
|
426
|
+
};
|
|
427
|
+
module.exports = Security;
|
|
428
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/libs/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/libs/setup.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const rand_token = require("rand-token");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const errors = require("restify-errors");
|
|
6
|
+
const security = require("./security");
|
|
7
|
+
const ObjectID = require('mongodb').ObjectID;
|
|
8
|
+
var User = null;
|
|
9
|
+
const connection_string = require("./connection_string");
|
|
10
|
+
const init = config => {
|
|
11
|
+
const mod = require(path.join(config.model_dir, "user_model"));
|
|
12
|
+
User = mod.default || mod;
|
|
13
|
+
};
|
|
14
|
+
const checkUserDoesNotExist = async () => {
|
|
15
|
+
try {
|
|
16
|
+
const count = await User.countDocuments();
|
|
17
|
+
if (count) {
|
|
18
|
+
throw new errors.ConflictError("Cannot setup if user exists");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
console.error(err);
|
|
23
|
+
if (err.code)
|
|
24
|
+
throw err;
|
|
25
|
+
throw new errors.InternalServerError(err.toString());
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const setup = async (req, res) => {
|
|
29
|
+
try {
|
|
30
|
+
const password = (req.body && req.body.password) ? req.body.password : rand_token.generate(12);
|
|
31
|
+
const user = new User({
|
|
32
|
+
password: security.encPassword(password),
|
|
33
|
+
email: req.body.email || "admin@example.com",
|
|
34
|
+
name: req.body.name || "admin",
|
|
35
|
+
admin: true
|
|
36
|
+
});
|
|
37
|
+
await user.save();
|
|
38
|
+
console.log("Created admin user", user.name, "<" + user.email + ">", ":", password);
|
|
39
|
+
res.send({
|
|
40
|
+
status: "success",
|
|
41
|
+
name: user.name,
|
|
42
|
+
email: user.email,
|
|
43
|
+
password
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
console.error(err);
|
|
48
|
+
throw new errors.InternalServerError(err.toString());
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
// Unlike setup, which just automates user creation, you can upload any data you want
|
|
52
|
+
const data_setup = async (req, res) => {
|
|
53
|
+
try {
|
|
54
|
+
const { MongoClient } = require("mongodb");
|
|
55
|
+
const client = await MongoClient.connect(connection_string);
|
|
56
|
+
const db = client.db(client.databaseName);
|
|
57
|
+
const data = req.body;
|
|
58
|
+
const results = {};
|
|
59
|
+
const _id_reg = new RegExp("_id$");
|
|
60
|
+
for (let collection in data) {
|
|
61
|
+
for (let row of data[collection]) {
|
|
62
|
+
row.createdAt = new Date();
|
|
63
|
+
row._deleted = false;
|
|
64
|
+
// Ensure all _id's are of type id
|
|
65
|
+
for (let field in row) {
|
|
66
|
+
if (_id_reg.test(field)) {
|
|
67
|
+
row[field] = ObjectID(row[field]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const result = await db.collection(collection).insertMany(data[collection]);
|
|
72
|
+
results[collection] = result;
|
|
73
|
+
}
|
|
74
|
+
res.send({ status: "success", results });
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
console.error(err);
|
|
78
|
+
throw new errors.InternalServerError(err.toString());
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
module.exports = {
|
|
82
|
+
init,
|
|
83
|
+
checkUserDoesNotExist,
|
|
84
|
+
setup,
|
|
85
|
+
data_setup
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/libs/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup-deprecations.d.ts","sourceRoot":"","sources":["../../src/libs/startup-deprecations.ts"],"names":[],"mappings":""}
|