@saltcorn/server 1.1.1-rc.4 → 1.1.2-beta.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/CHANGELOG.md +5 -1
- package/app.js +10 -5
- package/auth/admin.js +7 -7
- package/auth/roleadmin.js +3 -3
- package/auth/routes.js +27 -27
- package/locales/pl.json +31 -1
- package/package.json +37 -37
- package/public/saltcorn-common.js +5 -1
- package/routes/actions.js +18 -94
- package/routes/admin.js +17 -12
- package/routes/api.js +11 -10
- package/routes/config.js +7 -3
- package/routes/crashlog.js +2 -2
- package/routes/eventlog.js +3 -3
- package/routes/fields.js +5 -5
- package/routes/files.js +32 -31
- package/routes/infoarch.js +4 -3
- package/routes/library.js +1 -1
- package/routes/menu.js +1 -1
- package/routes/models.js +4 -4
- package/routes/notifications.js +7 -4
- package/routes/packs.js +4 -4
- package/routes/page_group.js +3 -3
- package/routes/page_groupedit.js +5 -5
- package/routes/pageedit.js +10 -10
- package/routes/plugins.js +12 -9
- package/routes/registry.js +1 -1
- package/routes/search.js +1 -1
- package/routes/sync.js +4 -4
- package/routes/tables.js +21 -22
- package/routes/tag_entries.js +2 -2
- package/routes/tags.js +1 -1
- package/routes/tenant.js +4 -4
- package/routes/utils.js +3 -3
- package/routes/view.js +7 -7
- package/routes/viewedit.js +11 -11
- package/s3storage.js +1 -1
- package/tests/files.test.js +10 -0
- package/tests/plugins.test.js +2 -6
package/routes/files.js
CHANGED
|
@@ -221,11 +221,11 @@ router.get(
|
|
|
221
221
|
* @function
|
|
222
222
|
*/
|
|
223
223
|
router.get(
|
|
224
|
-
"/download/*",
|
|
224
|
+
"/download/*serve_path",
|
|
225
225
|
error_catcher(async (req, res) => {
|
|
226
226
|
const role = req.user && req.user.id ? req.user.role_id : 100;
|
|
227
227
|
const user_id = req.user && req.user.id;
|
|
228
|
-
const serve_path = req.params
|
|
228
|
+
const serve_path = path.join(...req.params.serve_path);
|
|
229
229
|
const file = await File.findOne(serve_path);
|
|
230
230
|
|
|
231
231
|
if (
|
|
@@ -234,7 +234,7 @@ router.get(
|
|
|
234
234
|
) {
|
|
235
235
|
res.type(file.mimetype);
|
|
236
236
|
if (file.s3_store) s3storage.serveObject(file, res, true);
|
|
237
|
-
else res.download(file.location, file.filename);
|
|
237
|
+
else res.download(file.location, file.filename, { dotfiles: "allow" });
|
|
238
238
|
} else {
|
|
239
239
|
res
|
|
240
240
|
.status(404)
|
|
@@ -250,8 +250,8 @@ router.post(
|
|
|
250
250
|
error_catcher(async (req, res) => {
|
|
251
251
|
const role = req.user && req.user.id ? req.user.role_id : 100;
|
|
252
252
|
const user_id = req.user && req.user.id;
|
|
253
|
-
const files = req.body.files;
|
|
254
|
-
const location = req.body.location;
|
|
253
|
+
const files = (req.body || {}).files;
|
|
254
|
+
const location = (req.body || {}).location;
|
|
255
255
|
const zip = new Zip();
|
|
256
256
|
|
|
257
257
|
for (const fileNm of files) {
|
|
@@ -280,11 +280,11 @@ router.post(
|
|
|
280
280
|
* @function
|
|
281
281
|
*/
|
|
282
282
|
router.get(
|
|
283
|
-
"/serve/*",
|
|
283
|
+
"/serve/*serve_path",
|
|
284
284
|
error_catcher(async (req, res) => {
|
|
285
285
|
const role = req.user && req.user.id ? req.user.role_id : 100;
|
|
286
286
|
const user_id = req.user && req.user.id;
|
|
287
|
-
const serve_path = req.params
|
|
287
|
+
const serve_path = path.join(...req.params.serve_path);
|
|
288
288
|
//let file;
|
|
289
289
|
//if (typeof strictParseInt(id) !== "undefined")
|
|
290
290
|
const file = await File.findOne(serve_path);
|
|
@@ -298,7 +298,7 @@ router.get(
|
|
|
298
298
|
const maxAge = getState().getConfig("files_cache_maxage", 86400);
|
|
299
299
|
res.set("Cache-Control", `${cacheability}, max-age=${maxAge}`);
|
|
300
300
|
if (file.s3_store) s3storage.serveObject(file, res, false);
|
|
301
|
-
else res.sendFile(file.location);
|
|
301
|
+
else res.sendFile(file.location, { dotfiles: "allow" });
|
|
302
302
|
} else {
|
|
303
303
|
getState().log(
|
|
304
304
|
5,
|
|
@@ -320,12 +320,12 @@ router.get(
|
|
|
320
320
|
* @function
|
|
321
321
|
*/
|
|
322
322
|
router.get(
|
|
323
|
-
"/resize/:width_str/:height_str/*",
|
|
323
|
+
"/resize/:width_str/:height_str/*serve_path",
|
|
324
324
|
error_catcher(async (req, res) => {
|
|
325
325
|
const role = req.user && req.user.id ? req.user.role_id : 100;
|
|
326
326
|
const user_id = req.user && req.user.id;
|
|
327
327
|
const { width_str, height_str } = req.params;
|
|
328
|
-
const serve_path = req.params
|
|
328
|
+
const serve_path = path.join(...req.params.serve_path);
|
|
329
329
|
|
|
330
330
|
const file = await File.findOne(serve_path);
|
|
331
331
|
|
|
@@ -343,7 +343,7 @@ router.get(
|
|
|
343
343
|
const height =
|
|
344
344
|
height_str && height_str !== "0" ? strictParseInt(height_str) : null;
|
|
345
345
|
if (!width) {
|
|
346
|
-
res.sendFile(file.location);
|
|
346
|
+
res.sendFile(file.location, { dotfiles: "allow" });
|
|
347
347
|
return;
|
|
348
348
|
}
|
|
349
349
|
const basenm = path.join(
|
|
@@ -359,7 +359,7 @@ router.get(
|
|
|
359
359
|
toFileName: fnm,
|
|
360
360
|
});
|
|
361
361
|
}
|
|
362
|
-
res.sendFile(fnm);
|
|
362
|
+
res.sendFile(fnm, { dotfiles: "allow" });
|
|
363
363
|
}
|
|
364
364
|
} else {
|
|
365
365
|
res
|
|
@@ -376,12 +376,12 @@ router.get(
|
|
|
376
376
|
* @function
|
|
377
377
|
*/
|
|
378
378
|
router.post(
|
|
379
|
-
"/setrole/*",
|
|
379
|
+
"/setrole/*serve_path",
|
|
380
380
|
isAdmin,
|
|
381
381
|
error_catcher(async (req, res) => {
|
|
382
|
-
const serve_path = req.params
|
|
382
|
+
const serve_path = path.join(...req.params.serve_path);
|
|
383
383
|
const file = await File.findOne(serve_path);
|
|
384
|
-
const role = req.body.role;
|
|
384
|
+
const role = (req.body || {}).role;
|
|
385
385
|
const roles = await User.get_roles();
|
|
386
386
|
const roleRow = roles.find((r) => r.id === +role);
|
|
387
387
|
|
|
@@ -396,12 +396,12 @@ router.post(
|
|
|
396
396
|
);
|
|
397
397
|
|
|
398
398
|
router.post(
|
|
399
|
-
"/move/*",
|
|
399
|
+
"/move/*serve_path",
|
|
400
400
|
isAdmin,
|
|
401
401
|
error_catcher(async (req, res) => {
|
|
402
|
-
const serve_path = req.params
|
|
402
|
+
const serve_path = path.join(...req.params.serve_path);
|
|
403
403
|
const file = await File.findOne(serve_path);
|
|
404
|
-
const new_path = req.body.new_path;
|
|
404
|
+
const new_path = (req.body || {}).new_path;
|
|
405
405
|
|
|
406
406
|
if (file) {
|
|
407
407
|
await file.move_to_dir(new_path);
|
|
@@ -423,11 +423,11 @@ router.post(
|
|
|
423
423
|
* @function
|
|
424
424
|
*/
|
|
425
425
|
router.post(
|
|
426
|
-
"/setname/*",
|
|
426
|
+
"/setname/*serve_path",
|
|
427
427
|
isAdmin,
|
|
428
428
|
error_catcher(async (req, res) => {
|
|
429
|
-
const serve_path = req.params
|
|
430
|
-
const filename = req.body.value;
|
|
429
|
+
const serve_path = path.join(...req.params.serve_path);
|
|
430
|
+
const filename = (req.body || {}).value;
|
|
431
431
|
|
|
432
432
|
const file = await File.findOne(serve_path);
|
|
433
433
|
await file.rename(filename);
|
|
@@ -443,11 +443,11 @@ router.post(
|
|
|
443
443
|
* @function
|
|
444
444
|
*/
|
|
445
445
|
router.post(
|
|
446
|
-
"/unzip/*",
|
|
446
|
+
"/unzip/*serve_path",
|
|
447
447
|
isAdmin,
|
|
448
448
|
error_catcher(async (req, res) => {
|
|
449
|
-
const serve_path = req.params
|
|
450
|
-
const filename = req.body.value;
|
|
449
|
+
const serve_path = path.join(...req.params.serve_path);
|
|
450
|
+
const filename = (req.body || {}).value;
|
|
451
451
|
|
|
452
452
|
const file = await File.findOne(serve_path);
|
|
453
453
|
const dir = path.dirname(file.location);
|
|
@@ -460,7 +460,7 @@ router.post(
|
|
|
460
460
|
"/new-folder",
|
|
461
461
|
isAdmin,
|
|
462
462
|
error_catcher(async (req, res) => {
|
|
463
|
-
const { name, folder } = req.body;
|
|
463
|
+
const { name, folder } = req.body || {};
|
|
464
464
|
await File.new_folder(name, folder);
|
|
465
465
|
|
|
466
466
|
res.json({ success: "ok" });
|
|
@@ -477,7 +477,7 @@ router.post(
|
|
|
477
477
|
"/upload",
|
|
478
478
|
setTenant,
|
|
479
479
|
error_catcher(async (req, res) => {
|
|
480
|
-
let { folder, sortBy, sortDesc } = req.body;
|
|
480
|
+
let { folder, sortBy, sortDesc } = req.body || {};
|
|
481
481
|
let jsonResp = {};
|
|
482
482
|
const min_role_upload = getState().getConfig("min_role_upload", 1);
|
|
483
483
|
const role = req.user && req.user.id ? req.user.role_id : 100;
|
|
@@ -489,7 +489,8 @@ router.post(
|
|
|
489
489
|
if (!req.xhr) req.flash("warning", req.__("No file found"));
|
|
490
490
|
else jsonResp = { error: "No file found" };
|
|
491
491
|
} else {
|
|
492
|
-
const min_role_read =
|
|
492
|
+
const min_role_read =
|
|
493
|
+
req.body || {} ? (req.body || {}).min_role_read || 1 : 1;
|
|
493
494
|
const f = await File.from_req_files(
|
|
494
495
|
req.files.file,
|
|
495
496
|
req.user.id,
|
|
@@ -533,10 +534,10 @@ router.post(
|
|
|
533
534
|
* @function
|
|
534
535
|
*/
|
|
535
536
|
router.post(
|
|
536
|
-
"/delete/*",
|
|
537
|
+
"/delete/*serve_path",
|
|
537
538
|
isAdmin,
|
|
538
539
|
error_catcher(async (req, res) => {
|
|
539
|
-
const serve_path = req.params
|
|
540
|
+
const serve_path = path.join(...req.params.serve_path);
|
|
540
541
|
const { redirect } = req.query;
|
|
541
542
|
const f = await File.findOne(serve_path);
|
|
542
543
|
if (!f) {
|
|
@@ -625,7 +626,7 @@ router.post(
|
|
|
625
626
|
isAdmin,
|
|
626
627
|
error_catcher(async (req, res) => {
|
|
627
628
|
const form = await storage_form(req);
|
|
628
|
-
form.validate(req.body);
|
|
629
|
+
form.validate(req.body || {});
|
|
629
630
|
if (form.hasErrors) {
|
|
630
631
|
send_files_page({
|
|
631
632
|
res,
|
|
@@ -702,7 +703,7 @@ router.post(
|
|
|
702
703
|
isAdmin,
|
|
703
704
|
error_catcher(async (req, res) => {
|
|
704
705
|
const form = await files_settings_form(req);
|
|
705
|
-
form.validate(req.body);
|
|
706
|
+
form.validate(req.body || {});
|
|
706
707
|
if (form.hasErrors) {
|
|
707
708
|
send_files_page({
|
|
708
709
|
res,
|
package/routes/infoarch.js
CHANGED
|
@@ -252,8 +252,9 @@ router.post(
|
|
|
252
252
|
return;
|
|
253
253
|
}
|
|
254
254
|
const cfgStrings = getState().getConfigCopy("localizer_strings");
|
|
255
|
-
if (cfgStrings[lang])
|
|
256
|
-
|
|
255
|
+
if (cfgStrings[lang])
|
|
256
|
+
cfgStrings[lang][defstring] = text((req.body || {}).value);
|
|
257
|
+
else cfgStrings[lang] = { [defstring]: text((req.body || {}).value) };
|
|
257
258
|
await getState().setConfig("localizer_strings", cfgStrings);
|
|
258
259
|
res.redirect(`/site-structure/localizer/edit/${lang}`);
|
|
259
260
|
})
|
|
@@ -270,7 +271,7 @@ router.post(
|
|
|
270
271
|
isAdmin,
|
|
271
272
|
error_catcher(async (req, res) => {
|
|
272
273
|
const form = languageForm(req);
|
|
273
|
-
form.validate(req.body);
|
|
274
|
+
form.validate(req.body || {});
|
|
274
275
|
if (form.hasErrors)
|
|
275
276
|
send_infoarch_page({
|
|
276
277
|
res,
|
package/routes/library.js
CHANGED
package/routes/menu.js
CHANGED
|
@@ -579,7 +579,7 @@ router.post(
|
|
|
579
579
|
"/",
|
|
580
580
|
isAdminOrHasConfigMinRole("min_role_edit_menu"),
|
|
581
581
|
error_catcher(async (req, res) => {
|
|
582
|
-
const new_menu = req.body;
|
|
582
|
+
const new_menu = req.body || {};
|
|
583
583
|
const menu_items = jQMEtoMenu(new_menu);
|
|
584
584
|
await save_menu_items(menu_items);
|
|
585
585
|
Trigger.emitEvent("AppChange", `Menu`, req.user, {});
|
package/routes/models.js
CHANGED
|
@@ -88,7 +88,7 @@ router.post(
|
|
|
88
88
|
const { table_id } = req.params;
|
|
89
89
|
const table = await Table.findOne({ id: table_id });
|
|
90
90
|
const form = newModelForm(table, req);
|
|
91
|
-
form.validate(req.body);
|
|
91
|
+
form.validate(req.body || {});
|
|
92
92
|
if (form.hasErrors) {
|
|
93
93
|
res.sendWrap(req.__(`New model`), renderForm(form, req.csrfToken()));
|
|
94
94
|
} else {
|
|
@@ -204,7 +204,7 @@ router.post(
|
|
|
204
204
|
return;
|
|
205
205
|
}
|
|
206
206
|
const workflow = get_model_workflow(model, req);
|
|
207
|
-
const wfres = await workflow.run(req.body, req);
|
|
207
|
+
const wfres = await workflow.run(req.body || {}, req);
|
|
208
208
|
respondWorkflow(model, table, workflow, wfres, req, res);
|
|
209
209
|
})
|
|
210
210
|
);
|
|
@@ -394,7 +394,7 @@ router.post(
|
|
|
394
394
|
const model = await Model.findOne({ id });
|
|
395
395
|
const table = Table.findOne({ id: model.table_id });
|
|
396
396
|
const form = model_train_form(model, table, req);
|
|
397
|
-
form.validate(req.body);
|
|
397
|
+
form.validate(req.body || {});
|
|
398
398
|
if (form.hasErrors) {
|
|
399
399
|
res.sendWrap(req.__(`Train model`), renderForm(form, req.csrfToken()));
|
|
400
400
|
} else {
|
|
@@ -435,7 +435,7 @@ router.post(
|
|
|
435
435
|
error_catcher(async (req, res) => {
|
|
436
436
|
const { id } = req.params;
|
|
437
437
|
const model_instance = await ModelInstance.findOne({ id });
|
|
438
|
-
await model_instance.make_default(!req.body.enabled);
|
|
438
|
+
await model_instance.make_default(!(req.body || {}).enabled);
|
|
439
439
|
res.redirect(`/models/show/${model_instance.model_id}`);
|
|
440
440
|
})
|
|
441
441
|
);
|
package/routes/notifications.js
CHANGED
|
@@ -170,7 +170,7 @@ router.post(
|
|
|
170
170
|
error_catcher(async (req, res) => {
|
|
171
171
|
const user = await User.findOne({ id: req.user.id });
|
|
172
172
|
const form = notificationSettingsForm();
|
|
173
|
-
form.validate(req.body);
|
|
173
|
+
form.validate(req.body || {});
|
|
174
174
|
const _attributes = { ...user._attributes, ...form.values };
|
|
175
175
|
await user.update({ _attributes });
|
|
176
176
|
res.json({ success: "ok" });
|
|
@@ -216,14 +216,17 @@ router.post(
|
|
|
216
216
|
} else res.json({ error: msg });
|
|
217
217
|
} else {
|
|
218
218
|
Trigger.emitEvent("ReceiveMobileShareData", null, req.user, {
|
|
219
|
-
row: req.body,
|
|
219
|
+
row: req.body || {},
|
|
220
220
|
});
|
|
221
221
|
if (!req.smr) {
|
|
222
222
|
req.flash(
|
|
223
223
|
"success",
|
|
224
224
|
req.__(
|
|
225
225
|
"Shared: %s",
|
|
226
|
-
req.body
|
|
226
|
+
(req.body || {}).title ||
|
|
227
|
+
(req.body || {}).text ||
|
|
228
|
+
(req.body || {}).url ||
|
|
229
|
+
""
|
|
227
230
|
)
|
|
228
231
|
);
|
|
229
232
|
res.status(303).redirect("/");
|
|
@@ -234,7 +237,7 @@ router.post(
|
|
|
234
237
|
);
|
|
235
238
|
|
|
236
239
|
router.get(
|
|
237
|
-
"/manifest.json:opt_cache_bust
|
|
240
|
+
"/manifest.json{:opt_cache_bust}",
|
|
238
241
|
error_catcher(async (req, res) => {
|
|
239
242
|
const { pretty } = req.query;
|
|
240
243
|
const state = getState();
|
package/routes/packs.js
CHANGED
|
@@ -223,7 +223,7 @@ router.post(
|
|
|
223
223
|
model_instances: [],
|
|
224
224
|
event_logs: [],
|
|
225
225
|
};
|
|
226
|
-
for (const k of Object.keys(req.body)) {
|
|
226
|
+
for (const k of Object.keys(req.body || {})) {
|
|
227
227
|
const [type, name, ...rest] = k.split(".");
|
|
228
228
|
switch (type) {
|
|
229
229
|
case "table":
|
|
@@ -392,11 +392,11 @@ router.post(
|
|
|
392
392
|
isAdmin,
|
|
393
393
|
error_catcher(async (req, res) => {
|
|
394
394
|
var pack, error;
|
|
395
|
-
const source = req.body.source || "from_text";
|
|
395
|
+
const source = (req.body || {}).source || "from_text";
|
|
396
396
|
try {
|
|
397
397
|
switch (source) {
|
|
398
398
|
case "from_text":
|
|
399
|
-
pack = JSON.parse(req.body.pack);
|
|
399
|
+
pack = JSON.parse((req.body || {}).pack);
|
|
400
400
|
break;
|
|
401
401
|
case "from_file":
|
|
402
402
|
if (req.files?.pack_file?.tempFilePath)
|
|
@@ -424,7 +424,7 @@ router.post(
|
|
|
424
424
|
}
|
|
425
425
|
if (error) {
|
|
426
426
|
const form = install_pack_form(req);
|
|
427
|
-
form.values = { pack: req.body.pack };
|
|
427
|
+
form.values = { pack: (req.body || {}).pack };
|
|
428
428
|
req.flash("error", error);
|
|
429
429
|
res.sendWrap(req.__(`Install Pack`), {
|
|
430
430
|
above: [
|
package/routes/page_group.js
CHANGED
|
@@ -234,7 +234,7 @@ router.post(
|
|
|
234
234
|
if (cfg[v]) return req.__("Device already exists");
|
|
235
235
|
};
|
|
236
236
|
const form = deviceForm(req, validator);
|
|
237
|
-
form.validate(req.body);
|
|
237
|
+
form.validate(req.body || {});
|
|
238
238
|
if (form.hasErrors) {
|
|
239
239
|
send_infoarch_page({
|
|
240
240
|
res,
|
|
@@ -316,7 +316,7 @@ router.post(
|
|
|
316
316
|
const form = deviceForm(req, validator, device);
|
|
317
317
|
const deviceCfg = cfg[device];
|
|
318
318
|
form.values = { device, ...deviceCfg };
|
|
319
|
-
form.validate(req.body);
|
|
319
|
+
form.validate(req.body || {});
|
|
320
320
|
if (form.hasErrors) {
|
|
321
321
|
send_infoarch_page({
|
|
322
322
|
res,
|
|
@@ -351,7 +351,7 @@ router.post(
|
|
|
351
351
|
isAdmin,
|
|
352
352
|
error_catcher(async (req, res) => {
|
|
353
353
|
const form = pageGroupSettingsForm(req);
|
|
354
|
-
form.validate(req.body);
|
|
354
|
+
form.validate(req.body || {});
|
|
355
355
|
if (form.hasErrors) {
|
|
356
356
|
send_infoarch_page({
|
|
357
357
|
res,
|
package/routes/page_groupedit.js
CHANGED
|
@@ -392,9 +392,9 @@ router.post(
|
|
|
392
392
|
"/edit-properties",
|
|
393
393
|
isAdmin,
|
|
394
394
|
error_catcher(async (req, res) => {
|
|
395
|
-
const form = await groupPropsForm(req, !req.body.id);
|
|
395
|
+
const form = await groupPropsForm(req, !(req.body || {}).id);
|
|
396
396
|
form.hidden("id");
|
|
397
|
-
form.validate(req.body);
|
|
397
|
+
form.validate(req.body || {});
|
|
398
398
|
if (form.hasErrors) {
|
|
399
399
|
if (!req.xhr) {
|
|
400
400
|
// from new
|
|
@@ -457,7 +457,7 @@ router.post(
|
|
|
457
457
|
res.redirect(`/page_groupedit/${page_groupname}`);
|
|
458
458
|
}
|
|
459
459
|
const form = await addMemberForm(group, req);
|
|
460
|
-
form.validate(req.body);
|
|
460
|
+
form.validate(req.body || {});
|
|
461
461
|
if (form.hasErrors) {
|
|
462
462
|
res.sendWrap(
|
|
463
463
|
req.__(`%s add-member`, group.name),
|
|
@@ -554,7 +554,7 @@ router.post(
|
|
|
554
554
|
const group = PageGroup.findOne({ id: member.page_group_id });
|
|
555
555
|
const form = await editMemberForm(member, req);
|
|
556
556
|
form.hidden("id");
|
|
557
|
-
form.validate(req.body);
|
|
557
|
+
form.validate(req.body || {});
|
|
558
558
|
if (form.hasErrors) {
|
|
559
559
|
res.sendWrap(
|
|
560
560
|
req.__(`%s edit-member`, member.name || member.id),
|
|
@@ -678,7 +678,7 @@ router.post(
|
|
|
678
678
|
req.flash(
|
|
679
679
|
"success",
|
|
680
680
|
req.__(
|
|
681
|
-
|
|
681
|
+
'Page %s added to menu. Adjust access permissions in <a href="/menu">Settings » Menu</a>',
|
|
682
682
|
group.name
|
|
683
683
|
)
|
|
684
684
|
);
|
package/routes/pageedit.js
CHANGED
|
@@ -477,9 +477,9 @@ router.post(
|
|
|
477
477
|
"/edit-properties",
|
|
478
478
|
isAdminOrHasConfigMinRole("min_role_edit_pages"),
|
|
479
479
|
error_catcher(async (req, res) => {
|
|
480
|
-
const form = await pagePropertiesForm(req, !req.body.id);
|
|
480
|
+
const form = await pagePropertiesForm(req, !(req.body || {}).id);
|
|
481
481
|
form.hidden("id");
|
|
482
|
-
form.validate(req.body);
|
|
482
|
+
form.validate(req.body || {});
|
|
483
483
|
if (form.hasErrors) {
|
|
484
484
|
res.sendWrap(
|
|
485
485
|
req.__(`Page attributes`),
|
|
@@ -688,9 +688,9 @@ router.post(
|
|
|
688
688
|
if (!page) {
|
|
689
689
|
req.flash("error", req.__(`Page %s not found`, pagename));
|
|
690
690
|
res.redirect(redirectTarget);
|
|
691
|
-
} else if (req.body.layout) {
|
|
691
|
+
} else if ((req.body || {}).layout) {
|
|
692
692
|
await Page.update(page.id, {
|
|
693
|
-
layout: decodeURIComponent(req.body.layout),
|
|
693
|
+
layout: decodeURIComponent((req.body || {}).layout),
|
|
694
694
|
});
|
|
695
695
|
Trigger.emitEvent("AppChange", `Page ${page.name}`, req.user, {
|
|
696
696
|
entity_type: "Page",
|
|
@@ -698,12 +698,12 @@ router.post(
|
|
|
698
698
|
});
|
|
699
699
|
req.flash("success", req.__(`Page %s saved`, pagename));
|
|
700
700
|
res.redirect(redirectTarget);
|
|
701
|
-
} else if (req.body.code) {
|
|
701
|
+
} else if ((req.body || {}).code) {
|
|
702
702
|
try {
|
|
703
703
|
if (!page.html_file) throw new Error(req.__("File not found"));
|
|
704
704
|
const file = await File.findOne(page.html_file);
|
|
705
705
|
if (!file) throw new Error(req.__("File not found"));
|
|
706
|
-
await fsp.writeFile(file.location, req.body.code);
|
|
706
|
+
await fsp.writeFile(file.location, (req.body || {}).code);
|
|
707
707
|
Trigger.emitEvent("AppChange", `Page ${page.name}`, req.user, {
|
|
708
708
|
entity_type: "Page",
|
|
709
709
|
entity_name: page.name,
|
|
@@ -722,7 +722,7 @@ router.post(
|
|
|
722
722
|
else res.json({ error: error.message });
|
|
723
723
|
}
|
|
724
724
|
} else {
|
|
725
|
-
getState().log(2, `POST /edit/${pagename}: '${req.body}'`);
|
|
725
|
+
getState().log(2, `POST /edit/${pagename}: '${req.body || {}}'`);
|
|
726
726
|
req.flash("error", req.__(`Error processing page`));
|
|
727
727
|
res.redirect(redirectTarget);
|
|
728
728
|
}
|
|
@@ -742,8 +742,8 @@ router.post(
|
|
|
742
742
|
error_catcher(async (req, res) => {
|
|
743
743
|
const { id } = req.params;
|
|
744
744
|
|
|
745
|
-
if (id && req.body.layout) {
|
|
746
|
-
await Page.update(+id, { layout: req.body.layout });
|
|
745
|
+
if (id && (req.body || {}).layout) {
|
|
746
|
+
await Page.update(+id, { layout: (req.body || {}).layout });
|
|
747
747
|
const page = await Page.findOne({ id });
|
|
748
748
|
Trigger.emitEvent("AppChange", `Page ${page.name}`, req.user, {
|
|
749
749
|
entity_type: "Page",
|
|
@@ -794,7 +794,7 @@ router.post(
|
|
|
794
794
|
const pageGroups = await PageGroup.find({}, { orderBy: "name" });
|
|
795
795
|
const roles = await User.get_roles();
|
|
796
796
|
const form = getRootPageForm(pages, pageGroups, roles, req);
|
|
797
|
-
const valres = form.validate(req.body);
|
|
797
|
+
const valres = form.validate(req.body || {});
|
|
798
798
|
if (valres.success) {
|
|
799
799
|
const home_page_by_role =
|
|
800
800
|
getState().getConfigCopy("home_page_by_role", {}) || {};
|
package/routes/plugins.js
CHANGED
|
@@ -839,7 +839,7 @@ router.post(
|
|
|
839
839
|
flow.action = `/plugins/configure/${encodeURIComponent(plugin.name)}`;
|
|
840
840
|
flow.autoSave = true;
|
|
841
841
|
flow.saveURL = `/plugins/saveconfig/${encodeURIComponent(plugin.name)}`;
|
|
842
|
-
const wfres = await flow.run(req.body);
|
|
842
|
+
const wfres = await flow.run(req.body || {});
|
|
843
843
|
if (wfres.renderForm) {
|
|
844
844
|
if (module.layout) {
|
|
845
845
|
wfres.renderForm.additionalButtons = [
|
|
@@ -893,7 +893,7 @@ router.post(
|
|
|
893
893
|
module = getState().plugins[getState().plugin_module_names[plugin.name]];
|
|
894
894
|
}
|
|
895
895
|
const flow = module.configuration_workflow();
|
|
896
|
-
const step = await flow.singleStepForm(req.body, req);
|
|
896
|
+
const step = await flow.singleStepForm(req.body || {}, req);
|
|
897
897
|
if (step?.renderForm) {
|
|
898
898
|
if (step.renderForm.hasErrors || step.savingErrors)
|
|
899
899
|
res.status(400).send(step.savingErrors || "Error");
|
|
@@ -1003,7 +1003,7 @@ router.post(
|
|
|
1003
1003
|
...(plugin.configuration || {}),
|
|
1004
1004
|
...(user._attributes?.layout?.config || {}),
|
|
1005
1005
|
});
|
|
1006
|
-
const valResult = form.validate(req.body);
|
|
1006
|
+
const valResult = form.validate(req.body || {});
|
|
1007
1007
|
if (form.hasErrors) {
|
|
1008
1008
|
req.flash("warning", req.__("An error occurred"));
|
|
1009
1009
|
return res.sendWrap(
|
|
@@ -1056,7 +1056,7 @@ router.post(
|
|
|
1056
1056
|
...(plugin.configuration || {}),
|
|
1057
1057
|
...(user._attributes?.layout?.config || {}),
|
|
1058
1058
|
});
|
|
1059
|
-
const valResult = form.validate(req.body);
|
|
1059
|
+
const valResult = form.validate(req.body || {});
|
|
1060
1060
|
if (form.hasErrors) {
|
|
1061
1061
|
return res.status(400).json({ error: req.__("An error occured") });
|
|
1062
1062
|
}
|
|
@@ -1154,10 +1154,10 @@ router.get(
|
|
|
1154
1154
|
* @function
|
|
1155
1155
|
*/
|
|
1156
1156
|
router.get(
|
|
1157
|
-
"/public/:plugin/*",
|
|
1157
|
+
"/public/:plugin/*filepath",
|
|
1158
1158
|
error_catcher(async (req, res) => {
|
|
1159
1159
|
const { plugin } = req.params;
|
|
1160
|
-
const filepath = req.params
|
|
1160
|
+
const filepath = path.join(...req.params.filepath);
|
|
1161
1161
|
const hasVersion = plugin.includes("@");
|
|
1162
1162
|
const location =
|
|
1163
1163
|
getState().plugin_locations[hasVersion ? plugin.split("@")[0] : plugin];
|
|
@@ -1167,7 +1167,10 @@ router.get(
|
|
|
1167
1167
|
.replace(/^(\.\.(\/|\\|$))+/, "");
|
|
1168
1168
|
const fullpath = path.join(location, "public", safeFile);
|
|
1169
1169
|
if (fs.existsSync(fullpath))
|
|
1170
|
-
res.sendFile(fullpath, {
|
|
1170
|
+
res.sendFile(fullpath, {
|
|
1171
|
+
maxAge: hasVersion ? "100d" : "1d",
|
|
1172
|
+
dotfiles: "allow",
|
|
1173
|
+
});
|
|
1171
1174
|
else {
|
|
1172
1175
|
getState().log(6, `Plugin serve public: file not found ${fullpath}`);
|
|
1173
1176
|
res.status(404).send(req.__("Not found"));
|
|
@@ -1428,7 +1431,7 @@ router.post(
|
|
|
1428
1431
|
"/",
|
|
1429
1432
|
isAdmin,
|
|
1430
1433
|
error_catcher(async (req, res) => {
|
|
1431
|
-
const plugin = new Plugin(req.body);
|
|
1434
|
+
const plugin = new Plugin(req.body || {});
|
|
1432
1435
|
const schema = db.getTenantSchema();
|
|
1433
1436
|
const tenants_install_git = getRootState().getConfig(
|
|
1434
1437
|
"tenants_install_git",
|
|
@@ -1505,7 +1508,7 @@ router.post(
|
|
|
1505
1508
|
isAdmin,
|
|
1506
1509
|
error_catcher(async (req, res) => {
|
|
1507
1510
|
const { name } = req.params;
|
|
1508
|
-
const { version } = req.body;
|
|
1511
|
+
const { version } = req.body || {};
|
|
1509
1512
|
const tenants_unsafe_plugins = getRootState().getConfig(
|
|
1510
1513
|
"tenants_unsafe_plugins",
|
|
1511
1514
|
false
|
package/routes/registry.js
CHANGED
|
@@ -340,7 +340,7 @@ router.post(
|
|
|
340
340
|
const { etype, ename, q } = req.query;
|
|
341
341
|
const qlink = q ? `&q=${encodeURIComponent(q)}` : "";
|
|
342
342
|
|
|
343
|
-
const entVal = JSON.parse(req.body.regval);
|
|
343
|
+
const entVal = JSON.parse((req.body || {}).regval);
|
|
344
344
|
let pack = {
|
|
345
345
|
plugins: [],
|
|
346
346
|
tables: [],
|
package/routes/search.js
CHANGED
|
@@ -136,7 +136,7 @@ router.post(
|
|
|
136
136
|
const views = await View.find({}, { orderBy: "name" });
|
|
137
137
|
const tables = await Table.find();
|
|
138
138
|
const form = searchConfigForm(tables, views, req);
|
|
139
|
-
const result = form.validate(req.body);
|
|
139
|
+
const result = form.validate(req.body || {});
|
|
140
140
|
|
|
141
141
|
if (result.success) {
|
|
142
142
|
const dbversion = await db.getVersion(true);
|
package/routes/sync.js
CHANGED
|
@@ -118,7 +118,7 @@ router.post(
|
|
|
118
118
|
"/load_changes",
|
|
119
119
|
error_catcher(async (req, res) => {
|
|
120
120
|
const result = {};
|
|
121
|
-
const { syncInfos, loadUntil } = req.body;
|
|
121
|
+
const { syncInfos, loadUntil } = req.body || {};
|
|
122
122
|
if (!loadUntil) {
|
|
123
123
|
getState().log(2, `POST /load_changes: loadUntil is missing`);
|
|
124
124
|
return res.status(400).json({ error: "loadUntil is missing" });
|
|
@@ -202,7 +202,7 @@ const getDelRows = async (tblName, syncFrom, syncUntil, client) => {
|
|
|
202
202
|
router.post(
|
|
203
203
|
"/deletes",
|
|
204
204
|
error_catcher(async (req, res) => {
|
|
205
|
-
const { syncInfos, syncTimestamp } = req.body;
|
|
205
|
+
const { syncInfos, syncTimestamp } = req.body || {};
|
|
206
206
|
const client = await db.getClient();
|
|
207
207
|
try {
|
|
208
208
|
await client.query(`BEGIN`);
|
|
@@ -238,7 +238,7 @@ router.post(
|
|
|
238
238
|
router.post(
|
|
239
239
|
"/offline_changes",
|
|
240
240
|
error_catcher(async (req, res) => {
|
|
241
|
-
const { changes, syncTimestamp } = req.body;
|
|
241
|
+
const { changes, syncTimestamp } = req.body || {};
|
|
242
242
|
const rootFolder = await File.rootFolder();
|
|
243
243
|
try {
|
|
244
244
|
const syncDirName = `${syncTimestamp}_${req.user?.email || "public"}`;
|
|
@@ -334,7 +334,7 @@ router.get(
|
|
|
334
334
|
router.post(
|
|
335
335
|
"/clean_sync_dir",
|
|
336
336
|
error_catcher(async (req, res) => {
|
|
337
|
-
const { dir_name } = req.body;
|
|
337
|
+
const { dir_name } = req.body || {};
|
|
338
338
|
try {
|
|
339
339
|
const rootFolder = await File.rootFolder();
|
|
340
340
|
const syncDir = File.normalise_in_base(
|