@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/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[0];
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[0];
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[0];
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[0];
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[0];
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[0];
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[0];
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 = req.body ? req.body.min_role_read || 1 : 1;
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[0];
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,
@@ -252,8 +252,9 @@ router.post(
252
252
  return;
253
253
  }
254
254
  const cfgStrings = getState().getConfigCopy("localizer_strings");
255
- if (cfgStrings[lang]) cfgStrings[lang][defstring] = text(req.body.value);
256
- else cfgStrings[lang] = { [defstring]: text(req.body.value) };
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
@@ -31,7 +31,7 @@ router.post(
31
31
  "/savefrombuilder",
32
32
  isAdmin,
33
33
  error_catcher(async (req, res) => {
34
- await Library.create(req.body);
34
+ await Library.create(req.body || {});
35
35
  res.json({ success: "ok" });
36
36
  })
37
37
  );
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
  );
@@ -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.title || req.body.text || req.body.url || ""
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: [
@@ -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,
@@ -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
- "Page %s added to menu. Adjust access permissions in <a href=\"/menu\">Settings &raquo; Menu</a>",
681
+ 'Page %s added to menu. Adjust access permissions in <a href="/menu">Settings &raquo; Menu</a>',
682
682
  group.name
683
683
  )
684
684
  );
@@ -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[0];
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, { maxAge: hasVersion ? "100d" : "1d" });
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
@@ -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(