@saltcorn/server 0.6.1-beta.0 → 0.6.1
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/app.js +7 -0
- package/auth/admin.js +120 -5
- package/auth/index.js +7 -0
- package/auth/resetpw.js +22 -0
- package/auth/roleadmin.js +52 -0
- package/auth/routes.js +211 -2
- package/auth/testhelp.js +69 -0
- package/errors.js +14 -1
- package/fixture_persons.js +14 -0
- package/index.js +6 -0
- package/load_plugins.js +4 -3
- package/locales/en.json +7 -1
- package/markup/admin.js +97 -1
- package/markup/blockly.js +15 -0
- package/markup/expression_blurb.js +45 -0
- package/markup/forms.js +24 -0
- package/markup/index.js +7 -0
- package/markup/plugin-store.js +36 -0
- package/package.json +6 -6
- package/public/saltcorn-builder.css +1 -0
- package/public/saltcorn.js +5 -1
- package/routes/actions.js +53 -1
- package/routes/admin.js +97 -1
- package/routes/api.js +45 -10
- package/routes/config.js +18 -0
- package/routes/crashlog.js +31 -0
- package/routes/delete.js +19 -0
- package/routes/edit.js +19 -0
- package/routes/eventlog.js +65 -1
- package/routes/events.js +19 -0
- package/routes/fields.js +88 -0
- package/routes/files.js +62 -0
- package/routes/homepage.js +175 -80
- package/routes/index.js +7 -1
- package/routes/infoarch.js +56 -0
- package/routes/library.js +32 -0
- package/routes/list.js +28 -1
- package/routes/menu.js +45 -0
- package/routes/packs.js +53 -0
- package/routes/page.js +26 -0
- package/routes/pageedit.js +129 -3
- package/routes/plugins.js +156 -5
- package/routes/scapi.js +79 -23
- package/routes/search.js +51 -0
- package/routes/settings.js +27 -0
- package/routes/tables.js +148 -19
- package/routes/tenant.js +123 -31
- package/routes/utils.js +60 -1
- package/routes/view.js +37 -0
- package/routes/viewedit.js +114 -1
- package/serve.js +138 -88
- package/systemd.js +18 -1
- package/wrapper.js +4 -0
package/app.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Saltcorn App
|
|
3
|
+
* @category server
|
|
4
|
+
* @module app
|
|
3
5
|
*/
|
|
4
6
|
|
|
5
7
|
const express = require("express");
|
|
@@ -43,6 +45,11 @@ const i18n = new I18n({
|
|
|
43
45
|
directory: path.join(__dirname, "locales"),
|
|
44
46
|
});
|
|
45
47
|
// todo console.log app instance info when app starts - avoid to show secrets (password, etc)
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @param {object} [opts = {}]
|
|
51
|
+
* @returns {Promise<Express>}
|
|
52
|
+
*/
|
|
46
53
|
const getApp = async (opts = {}) => {
|
|
47
54
|
const app = express();
|
|
48
55
|
let sql_log = await getConfig("log_sql");
|
package/auth/admin.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Auth / Admin
|
|
3
|
-
* @
|
|
3
|
+
* @category server
|
|
4
|
+
* @module auth/admin
|
|
5
|
+
* @subcategory auth
|
|
4
6
|
*/
|
|
5
7
|
// todo refactor to few modules + rename to be in sync with router url
|
|
8
|
+
/**
|
|
9
|
+
* @type {module:express-promise-router}
|
|
10
|
+
*/
|
|
6
11
|
const Router = require("express-promise-router");
|
|
7
12
|
const { contract, is } = require("contractis");
|
|
8
13
|
|
|
@@ -33,9 +38,22 @@ const {
|
|
|
33
38
|
is_hsts_tld,
|
|
34
39
|
} = require("../markup/admin");
|
|
35
40
|
const { send_verification_email } = require("@saltcorn/data/models/email");
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @type {object}
|
|
44
|
+
* @const
|
|
45
|
+
* @namespace auth/adminRouter
|
|
46
|
+
* @category server
|
|
47
|
+
* @subcategory auth
|
|
48
|
+
*/
|
|
36
49
|
const router = new Router();
|
|
37
50
|
module.exports = router;
|
|
38
51
|
|
|
52
|
+
/**
|
|
53
|
+
*
|
|
54
|
+
* @param {object} req
|
|
55
|
+
* @returns {Promise<object>}
|
|
56
|
+
*/
|
|
39
57
|
const getUserFields = async (req) => {
|
|
40
58
|
const userTable = await Table.findOne({ name: "users" });
|
|
41
59
|
const userFields = (await userTable.getFields()).filter(
|
|
@@ -69,9 +87,13 @@ const getUserFields = async (req) => {
|
|
|
69
87
|
}
|
|
70
88
|
return userFields;
|
|
71
89
|
};
|
|
90
|
+
|
|
72
91
|
/**
|
|
73
92
|
* User Form
|
|
74
|
-
* @
|
|
93
|
+
* @function
|
|
94
|
+
* @param {object} req
|
|
95
|
+
* @param {User} user
|
|
96
|
+
* @returns {Promise<Form>}
|
|
75
97
|
*/
|
|
76
98
|
const userForm = contract(
|
|
77
99
|
is.fun(
|
|
@@ -132,11 +154,12 @@ const userForm = contract(
|
|
|
132
154
|
return form;
|
|
133
155
|
}
|
|
134
156
|
);
|
|
157
|
+
|
|
135
158
|
/**
|
|
136
159
|
* Dropdown for User Info in left menu
|
|
137
|
-
* @param user
|
|
138
|
-
* @param req
|
|
139
|
-
* @param can_reset
|
|
160
|
+
* @param {object} user
|
|
161
|
+
* @param {object} req
|
|
162
|
+
* @param {boolean} can_reset
|
|
140
163
|
* @returns {string}
|
|
141
164
|
*/
|
|
142
165
|
const user_dropdown = (user, req, can_reset) =>
|
|
@@ -191,6 +214,11 @@ const user_dropdown = (user, req, can_reset) =>
|
|
|
191
214
|
),
|
|
192
215
|
]);
|
|
193
216
|
|
|
217
|
+
/**
|
|
218
|
+
* @name get
|
|
219
|
+
* @function
|
|
220
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
221
|
+
*/
|
|
194
222
|
router.get(
|
|
195
223
|
"/",
|
|
196
224
|
setTenant,
|
|
@@ -249,8 +277,12 @@ router.get(
|
|
|
249
277
|
});
|
|
250
278
|
})
|
|
251
279
|
);
|
|
280
|
+
|
|
252
281
|
/**
|
|
253
282
|
* Send User Form for create new User
|
|
283
|
+
* @name get/new
|
|
284
|
+
* @function
|
|
285
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
254
286
|
*/
|
|
255
287
|
router.get(
|
|
256
288
|
"/new",
|
|
@@ -272,6 +304,11 @@ router.get(
|
|
|
272
304
|
})
|
|
273
305
|
);
|
|
274
306
|
|
|
307
|
+
/**
|
|
308
|
+
*
|
|
309
|
+
* @param {object} req
|
|
310
|
+
* @returns {Form}
|
|
311
|
+
*/
|
|
275
312
|
const user_settings_form = (req) =>
|
|
276
313
|
config_fields_form({
|
|
277
314
|
req,
|
|
@@ -296,6 +333,12 @@ const user_settings_form = (req) =>
|
|
|
296
333
|
action: "/useradmin/settings",
|
|
297
334
|
submitLabel: req.__("Save"),
|
|
298
335
|
});
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* @name get/settings
|
|
339
|
+
* @function
|
|
340
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
341
|
+
*/
|
|
299
342
|
router.get(
|
|
300
343
|
"/settings",
|
|
301
344
|
setTenant,
|
|
@@ -314,6 +357,12 @@ router.get(
|
|
|
314
357
|
});
|
|
315
358
|
})
|
|
316
359
|
);
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* @name post/settings
|
|
363
|
+
* @function
|
|
364
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
365
|
+
*/
|
|
317
366
|
router.post(
|
|
318
367
|
"/settings",
|
|
319
368
|
setTenant,
|
|
@@ -340,6 +389,11 @@ router.post(
|
|
|
340
389
|
})
|
|
341
390
|
);
|
|
342
391
|
|
|
392
|
+
/**
|
|
393
|
+
* @name get/ssl
|
|
394
|
+
* @function
|
|
395
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
396
|
+
*/
|
|
343
397
|
router.get(
|
|
344
398
|
"/ssl",
|
|
345
399
|
setTenant,
|
|
@@ -456,12 +510,22 @@ router.get(
|
|
|
456
510
|
})
|
|
457
511
|
);
|
|
458
512
|
|
|
513
|
+
/**
|
|
514
|
+
* @param {object} req
|
|
515
|
+
* @returns {Form}
|
|
516
|
+
*/
|
|
459
517
|
const ssl_form = (req) =>
|
|
460
518
|
config_fields_form({
|
|
461
519
|
req,
|
|
462
520
|
field_names: ["custom_ssl_certificate", "custom_ssl_private_key"],
|
|
463
521
|
action: "/useradmin/ssl/custom",
|
|
464
522
|
});
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* @name get/ssl/custom
|
|
526
|
+
* @function
|
|
527
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
528
|
+
*/
|
|
465
529
|
router.get(
|
|
466
530
|
"/ssl/custom",
|
|
467
531
|
setTenant,
|
|
@@ -481,6 +545,12 @@ router.get(
|
|
|
481
545
|
});
|
|
482
546
|
})
|
|
483
547
|
);
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* @name post/ssl/custom
|
|
551
|
+
* @function
|
|
552
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
553
|
+
*/
|
|
484
554
|
router.post(
|
|
485
555
|
"/ssl/custom",
|
|
486
556
|
setTenant,
|
|
@@ -512,6 +582,12 @@ router.post(
|
|
|
512
582
|
}
|
|
513
583
|
})
|
|
514
584
|
);
|
|
585
|
+
|
|
586
|
+
/**
|
|
587
|
+
* @name get/:id
|
|
588
|
+
* @function
|
|
589
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
590
|
+
*/
|
|
515
591
|
router.get(
|
|
516
592
|
"/:id",
|
|
517
593
|
setTenant,
|
|
@@ -574,8 +650,12 @@ router.get(
|
|
|
574
650
|
});
|
|
575
651
|
})
|
|
576
652
|
);
|
|
653
|
+
|
|
577
654
|
/**
|
|
578
655
|
* Save user data
|
|
656
|
+
* @name post/save
|
|
657
|
+
* @function
|
|
658
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
579
659
|
*/
|
|
580
660
|
router.post(
|
|
581
661
|
"/save",
|
|
@@ -649,8 +729,12 @@ router.post(
|
|
|
649
729
|
res.redirect(`/useradmin`);
|
|
650
730
|
})
|
|
651
731
|
);
|
|
732
|
+
|
|
652
733
|
/**
|
|
653
734
|
* Reset password for yser
|
|
735
|
+
* @name post/reset-password/:id
|
|
736
|
+
* @function
|
|
737
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
654
738
|
*/
|
|
655
739
|
router.post(
|
|
656
740
|
"/reset-password/:id",
|
|
@@ -665,8 +749,12 @@ router.post(
|
|
|
665
749
|
res.redirect(`/useradmin`);
|
|
666
750
|
})
|
|
667
751
|
);
|
|
752
|
+
|
|
668
753
|
/**
|
|
669
754
|
* Send verification email for user
|
|
755
|
+
* @name post/send-verification/:id
|
|
756
|
+
* @function
|
|
757
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
670
758
|
*/
|
|
671
759
|
router.post(
|
|
672
760
|
"/send-verification/:id",
|
|
@@ -686,8 +774,12 @@ router.post(
|
|
|
686
774
|
res.redirect(`/useradmin`);
|
|
687
775
|
})
|
|
688
776
|
);
|
|
777
|
+
|
|
689
778
|
/**
|
|
690
779
|
* Get new api token
|
|
780
|
+
* @name post/gen-api-token/:id
|
|
781
|
+
* @function
|
|
782
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
691
783
|
*/
|
|
692
784
|
router.post(
|
|
693
785
|
"/gen-api-token/:id",
|
|
@@ -702,8 +794,12 @@ router.post(
|
|
|
702
794
|
res.redirect(`/useradmin/${u.id}`);
|
|
703
795
|
})
|
|
704
796
|
);
|
|
797
|
+
|
|
705
798
|
/**
|
|
706
799
|
* Remove api token
|
|
800
|
+
* @name post/remove-api-token/:id
|
|
801
|
+
* @function
|
|
802
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
707
803
|
*/
|
|
708
804
|
router.post(
|
|
709
805
|
"/remove-api-token/:id",
|
|
@@ -718,8 +814,12 @@ router.post(
|
|
|
718
814
|
res.redirect(`/useradmin/${u.id}`);
|
|
719
815
|
})
|
|
720
816
|
);
|
|
817
|
+
|
|
721
818
|
/**
|
|
722
819
|
* Set random password
|
|
820
|
+
* @name post/set-random-password/:id
|
|
821
|
+
* @function
|
|
822
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
723
823
|
*/
|
|
724
824
|
router.post(
|
|
725
825
|
"/set-random-password/:id",
|
|
@@ -740,6 +840,11 @@ router.post(
|
|
|
740
840
|
})
|
|
741
841
|
);
|
|
742
842
|
|
|
843
|
+
/**
|
|
844
|
+
* @name post/disable/:id
|
|
845
|
+
* @function
|
|
846
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
847
|
+
*/
|
|
743
848
|
router.post(
|
|
744
849
|
"/disable/:id",
|
|
745
850
|
setTenant,
|
|
@@ -754,6 +859,11 @@ router.post(
|
|
|
754
859
|
})
|
|
755
860
|
);
|
|
756
861
|
|
|
862
|
+
/**
|
|
863
|
+
* @name post/enable/:id
|
|
864
|
+
* @function
|
|
865
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
866
|
+
*/
|
|
757
867
|
router.post(
|
|
758
868
|
"/enable/:id",
|
|
759
869
|
setTenant,
|
|
@@ -767,6 +877,11 @@ router.post(
|
|
|
767
877
|
})
|
|
768
878
|
);
|
|
769
879
|
|
|
880
|
+
/**
|
|
881
|
+
* @name post/delete/:id
|
|
882
|
+
* @function
|
|
883
|
+
* @memberof module:auth/admin~auth/adminRouter
|
|
884
|
+
*/
|
|
770
885
|
router.post(
|
|
771
886
|
"/delete/:id",
|
|
772
887
|
setTenant,
|
package/auth/index.js
ADDED
package/auth/resetpw.js
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @category server
|
|
3
|
+
* @module auth/resetpw
|
|
4
|
+
* @subcategory auth
|
|
5
|
+
*/
|
|
1
6
|
const { getState } = require("@saltcorn/data/db/state");
|
|
2
7
|
const { getMailTransport } = require("@saltcorn/data/models/email");
|
|
3
8
|
const { get_base_url } = require("../routes/utils");
|
|
4
9
|
|
|
10
|
+
/**
|
|
11
|
+
* @param {string} link
|
|
12
|
+
* @param {object} user
|
|
13
|
+
* @param {object} req
|
|
14
|
+
* @returns {void}
|
|
15
|
+
*/
|
|
5
16
|
const generate_email = (link, user, req) => ({
|
|
6
17
|
from: getState().getConfig("email_from"),
|
|
7
18
|
to: user.email,
|
|
@@ -35,12 +46,23 @@ ${req.__(
|
|
|
35
46
|
)}<br />
|
|
36
47
|
`,
|
|
37
48
|
});
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param {object} user
|
|
52
|
+
* @param {object} req
|
|
53
|
+
* @returns {Promise<void>}
|
|
54
|
+
*/
|
|
38
55
|
const send_reset_email = async (user, req) => {
|
|
39
56
|
const link = await get_reset_link(user, req);
|
|
40
57
|
const transporter = getMailTransport();
|
|
41
58
|
await transporter.sendMail(generate_email(link, user, req));
|
|
42
59
|
};
|
|
43
60
|
|
|
61
|
+
/**
|
|
62
|
+
* @param {object} user
|
|
63
|
+
* @param {object} req
|
|
64
|
+
* @returns {Promise<string>}
|
|
65
|
+
*/
|
|
44
66
|
const get_reset_link = async (user, req) => {
|
|
45
67
|
const token = await user.getNewResetToken();
|
|
46
68
|
const base = get_base_url(req);
|
package/auth/roleadmin.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @category server
|
|
3
|
+
* @module auth/roleadmin
|
|
4
|
+
* @subcategory auth
|
|
5
|
+
*/
|
|
1
6
|
const Router = require("express-promise-router");
|
|
2
7
|
const { contract, is } = require("contractis");
|
|
3
8
|
|
|
@@ -44,8 +49,24 @@ const {
|
|
|
44
49
|
config_fields_form,
|
|
45
50
|
save_config_from_form,
|
|
46
51
|
} = require("../markup/admin");
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @type {object}
|
|
55
|
+
* @const
|
|
56
|
+
* @namespace roleadminRouter
|
|
57
|
+
* @category server
|
|
58
|
+
* @subcategory auth
|
|
59
|
+
*/
|
|
47
60
|
const router = new Router();
|
|
48
61
|
module.exports = router;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @param {Role} role
|
|
65
|
+
* @param {Layout[]} layouts
|
|
66
|
+
* @param {*} layout_by_role
|
|
67
|
+
* @param {object} req
|
|
68
|
+
* @returns {Form}
|
|
69
|
+
*/
|
|
49
70
|
const editRoleLayoutForm = (role, layouts, layout_by_role, req) =>
|
|
50
71
|
form(
|
|
51
72
|
{
|
|
@@ -69,6 +90,10 @@ const editRoleLayoutForm = (role, layouts, layout_by_role, req) =>
|
|
|
69
90
|
)
|
|
70
91
|
);
|
|
71
92
|
|
|
93
|
+
/**
|
|
94
|
+
* @param {object} req
|
|
95
|
+
* @returns {Form}
|
|
96
|
+
*/
|
|
72
97
|
const roleForm = (req) =>
|
|
73
98
|
new Form({
|
|
74
99
|
action: "/roleadmin/edit",
|
|
@@ -87,6 +112,11 @@ const roleForm = (req) =>
|
|
|
87
112
|
],
|
|
88
113
|
});
|
|
89
114
|
|
|
115
|
+
/**
|
|
116
|
+
* @name get
|
|
117
|
+
* @function
|
|
118
|
+
* @memberof module:auth/roleadmin~roleadminRouter
|
|
119
|
+
*/
|
|
90
120
|
router.get(
|
|
91
121
|
"/",
|
|
92
122
|
setTenant,
|
|
@@ -135,6 +165,11 @@ router.get(
|
|
|
135
165
|
})
|
|
136
166
|
);
|
|
137
167
|
|
|
168
|
+
/**
|
|
169
|
+
* @name get/new
|
|
170
|
+
* @function
|
|
171
|
+
* @memberof module:auth/roleadmin~roleadminRouter
|
|
172
|
+
*/
|
|
138
173
|
router.get(
|
|
139
174
|
"/new",
|
|
140
175
|
setTenant,
|
|
@@ -155,6 +190,12 @@ router.get(
|
|
|
155
190
|
});
|
|
156
191
|
})
|
|
157
192
|
);
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* @name post/edit
|
|
196
|
+
* @function
|
|
197
|
+
* @memberof module:auth/roleadmin~roleadminRouter
|
|
198
|
+
*/
|
|
158
199
|
router.post(
|
|
159
200
|
"/edit",
|
|
160
201
|
setTenant,
|
|
@@ -188,6 +229,11 @@ router.post(
|
|
|
188
229
|
})
|
|
189
230
|
);
|
|
190
231
|
|
|
232
|
+
/**
|
|
233
|
+
* @name post/setrolelayout/:id
|
|
234
|
+
* @function
|
|
235
|
+
* @memberof module:auth/roleadmin~roleadminRouter
|
|
236
|
+
*/
|
|
191
237
|
router.post(
|
|
192
238
|
"/setrolelayout/:id",
|
|
193
239
|
setTenant,
|
|
@@ -202,7 +248,13 @@ router.post(
|
|
|
202
248
|
res.redirect(`/roleadmin`);
|
|
203
249
|
})
|
|
204
250
|
);
|
|
251
|
+
|
|
205
252
|
const unDeletableRoles = [1, 8, 10];
|
|
253
|
+
/**
|
|
254
|
+
* @name post/delete/:id
|
|
255
|
+
* @function
|
|
256
|
+
* @memberof module:auth/roleadmin~roleadminRouter
|
|
257
|
+
*/
|
|
206
258
|
router.post(
|
|
207
259
|
"/delete/:id",
|
|
208
260
|
setTenant,
|