@saltcorn/server 0.8.3-alpha.2 → 0.8.3-beta.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/auth/admin.js CHANGED
@@ -1102,7 +1102,7 @@ router.post(
1102
1102
  const { id } = req.params;
1103
1103
  const u = await User.findOne({ id });
1104
1104
  if (u) {
1105
- u.relogin(req);
1105
+ await u.relogin(req);
1106
1106
  req.flash(
1107
1107
  "success",
1108
1108
  req.__(
package/auth/routes.js CHANGED
@@ -17,6 +17,7 @@ const {
17
17
  loggedIn,
18
18
  csrfField,
19
19
  setTenant,
20
+ is_relative_url,
20
21
  } = require("../routes/utils.js");
21
22
  const { getState } = require("@saltcorn/data/db/state");
22
23
  const { send_reset_email } = require("./resetpw");
@@ -323,18 +324,21 @@ router.get("/logout", async (req, res, next) => {
323
324
  await user.updateLastMobileLogin(null);
324
325
  res.json({ success: true });
325
326
  } else if (req.logout) {
326
- req.logout();
327
- if (req.session.destroy)
328
- req.session.destroy((err) => {
329
- if (err) return next(err);
330
- req.logout();
331
- res.redirect("/auth/login");
332
- });
333
- else {
334
- req.logout();
335
- req.session = null;
336
- res.redirect("/auth/login");
337
- }
327
+ req.logout(function (err) {
328
+ if (req.session.destroy)
329
+ req.session.destroy((err) => {
330
+ if (err) return next(err);
331
+ req.logout(() => {
332
+ res.redirect("/auth/login");
333
+ });
334
+ });
335
+ else {
336
+ req.logout(function (err) {
337
+ req.session = null;
338
+ res.redirect("/auth/login");
339
+ });
340
+ }
341
+ });
338
342
  }
339
343
  });
340
344
 
@@ -392,7 +396,7 @@ router.get(
392
396
  else if (result) {
393
397
  req.flash("success", req.__("Email verified"));
394
398
  const u = await User.findForSession({ email });
395
- if (u) u.relogin(req);
399
+ if (u) await u.relogin(req);
396
400
  }
397
401
  res.redirect("/");
398
402
  })
@@ -1075,7 +1079,7 @@ router.post(
1075
1079
  }
1076
1080
  if (getState().get2FApolicy(req.user) === "Mandatory") {
1077
1081
  res.redirect("/auth/twofa/setup/totp");
1078
- } else if (req.body.dest) {
1082
+ } else if (req.body.dest && is_relative_url(req.body.dest)) {
1079
1083
  res.redirect(decodeURIComponent(req.body.dest));
1080
1084
  } else res.redirect("/");
1081
1085
  })
@@ -1445,15 +1449,15 @@ router.get(
1445
1449
  error_catcher(async (req, res) => {
1446
1450
  const user = await User.findOne({ id: req.user.id });
1447
1451
  if (!user) {
1448
- req.logout();
1449
- req.flash("danger", req.__("Must be logged in first"));
1450
- res.redirect("/auth/login");
1451
- return;
1452
- }
1453
- res.sendWrap(
1454
- req.__("User settings") || "User settings",
1455
- await userSettings({ req, res, pwform: changPwForm(req), user })
1456
- );
1452
+ req.logout(() => {
1453
+ req.flash("danger", req.__("Must be logged in first"));
1454
+ res.redirect("/auth/login");
1455
+ });
1456
+ } else
1457
+ res.sendWrap(
1458
+ req.__("User settings") || "User settings",
1459
+ await userSettings({ req, res, pwform: changPwForm(req), user })
1460
+ );
1457
1461
  })
1458
1462
  );
1459
1463
 
@@ -1615,7 +1619,7 @@ router.all(
1615
1619
  const user = await User.findForSession({ id: req.user.id });
1616
1620
  await user.set_to_verified();
1617
1621
  req.flash("success", req.__("User verified"));
1618
- user.relogin(req);
1622
+ await user.relogin(req);
1619
1623
  }
1620
1624
  if (wfres.verified === false) {
1621
1625
  req.flash("danger", req.__("User verification failed"));
@@ -1842,7 +1846,7 @@ router.post(
1842
1846
  }),
1843
1847
  error_catcher(async (req, res) => {
1844
1848
  const user = await User.findForSession({ id: req.user.pending_user.id });
1845
- user.relogin(req);
1849
+ await user.relogin(req);
1846
1850
  Trigger.emitEvent("Login", null, user);
1847
1851
  res.redirect("/");
1848
1852
  })
package/auth/testhelp.js CHANGED
@@ -233,4 +233,5 @@ module.exports = {
233
233
  notAuthorized,
234
234
  respondJsonWith,
235
235
  toSucceedWithImage,
236
+ resToLoginCookie,
236
237
  };
package/locales/da.json CHANGED
@@ -679,5 +679,9 @@
679
679
  "Trigger": "Trigger",
680
680
  "All entities": "All entities",
681
681
  "no tags": "no tags",
682
- "Add tag": "Add tag"
682
+ "Add tag": "Add tag",
683
+ "Pages are the web pages of your application built with a drag-and-drop builder. They have static content, and by embedding views, dynamic content.": "Pages are the web pages of your application built with a drag-and-drop builder. They have static content, and by embedding views, dynamic content.",
684
+ "Triggers run actions in response to events.": "Triggers run actions in response to events.",
685
+ "No triggers": "No triggers",
686
+ "Code": "Code"
683
687
  }
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@saltcorn/server",
3
- "version": "0.8.3-alpha.2",
3
+ "version": "0.8.3-beta.1",
4
4
  "description": "Server app for Saltcorn, open-source no-code platform",
5
5
  "homepage": "https://saltcorn.com",
6
6
  "main": "index.js",
7
7
  "license": "MIT",
8
8
  "dependencies": {
9
- "@saltcorn/base-plugin": "0.8.3-alpha.2",
10
- "@saltcorn/builder": "0.8.3-alpha.2",
11
- "@saltcorn/data": "0.8.3-alpha.2",
12
- "@saltcorn/admin-models": "0.8.3-alpha.2",
13
- "@saltcorn/filemanager": "0.8.3-alpha.2",
14
- "@saltcorn/markup": "0.8.3-alpha.2",
15
- "@saltcorn/sbadmin2": "0.8.3-alpha.2",
9
+ "@saltcorn/base-plugin": "0.8.3-beta.1",
10
+ "@saltcorn/builder": "0.8.3-beta.1",
11
+ "@saltcorn/data": "0.8.3-beta.1",
12
+ "@saltcorn/admin-models": "0.8.3-beta.1",
13
+ "@saltcorn/filemanager": "0.8.3-beta.1",
14
+ "@saltcorn/markup": "0.8.3-beta.1",
15
+ "@saltcorn/sbadmin2": "0.8.3-beta.1",
16
16
  "@socket.io/cluster-adapter": "^0.1.0",
17
17
  "@socket.io/sticky": "^1.0.1",
18
18
  "aws-sdk": "^2.1037.0",
@@ -41,16 +41,16 @@
41
41
  "node-fetch": "2.6.9",
42
42
  "node-watch": "^0.7.2",
43
43
  "notp": "2.0.3",
44
- "passport": "^0.4.1",
44
+ "passport": "^0.6.0",
45
45
  "passport-custom": "^1.1.1",
46
46
  "passport-http-bearer": "^1.0.1",
47
47
  "passport-jwt": "4.0.1",
48
48
  "passport-totp": "0.0.2",
49
49
  "pg": "^8.2.1",
50
50
  "pluralize": "^8.0.0",
51
- "qrcode": "1.5.0",
51
+ "qrcode": "1.5.1",
52
52
  "resize-with-sharp-or-jimp": "0.1.6",
53
- "socket.io": "4.2.0",
53
+ "socket.io": "4.6.0",
54
54
  "thirty-two": "1.0.2",
55
55
  "tmp-promise": "^3.0.2",
56
56
  "uuid": "^8.2.0",
package/routes/actions.js CHANGED
@@ -5,7 +5,12 @@
5
5
  * @subcategory routes
6
6
  */
7
7
  const Router = require("express-promise-router");
8
- const { isAdmin, error_catcher, addOnDoneRedirect } = require("./utils.js");
8
+ const {
9
+ isAdmin,
10
+ error_catcher,
11
+ addOnDoneRedirect,
12
+ is_relative_url,
13
+ } = require("./utils.js");
9
14
  const { getState } = require("@saltcorn/data/db/state");
10
15
  const Trigger = require("@saltcorn/data/models/trigger");
11
16
  const { getTriggerList } = require("./common_lists");
@@ -524,7 +529,8 @@ router.post(
524
529
  }
525
530
  req.flash("success", "Action configuration saved");
526
531
  res.redirect(
527
- req.query.on_done_redirect
532
+ req.query.on_done_redirect &&
533
+ is_relative_url(req.query.on_done_redirect)
528
534
  ? `/${req.query.on_done_redirect}`
529
535
  : "/actions/"
530
536
  );
package/routes/admin.js CHANGED
@@ -603,7 +603,7 @@ router.post(
603
603
  snap.created
604
604
  ).fromNow()}`
605
605
  );
606
- res.redirect(`/${type}edit`);
606
+ res.redirect(/^[a-z]+$/g.test(type) ? `/${type}edit` : "/");
607
607
  })
608
608
  );
609
609
  router.get(
@@ -1820,18 +1820,21 @@ router.post(
1820
1820
  await db.deleteWhere("users");
1821
1821
  await db.deleteWhere("_sc_roles", { not: { id: { in: [1, 4, 8, 10] } } });
1822
1822
  if (db.reset_sequence) await db.reset_sequence("users");
1823
- req.logout();
1824
- if (req.session.destroy)
1825
- req.session.destroy((err) => {
1826
- req.logout();
1827
- });
1828
- else {
1829
- req.logout();
1830
- req.session = null;
1831
- }
1832
- // todo make configurable - redirect to create first user
1833
- // redirect to create first user
1834
- res.redirect(`/auth/create_first_user`);
1823
+ req.logout(function (err) {
1824
+ if (req.session.destroy)
1825
+ req.session.destroy((err) => {
1826
+ req.logout(() => {
1827
+ res.redirect(`/auth/create_first_user`);
1828
+ });
1829
+ });
1830
+ else {
1831
+ req.logout(() => {
1832
+ req.session = null; // todo make configurable - redirect to create first user
1833
+ // redirect to create first user
1834
+ res.redirect(`/auth/create_first_user`);
1835
+ });
1836
+ }
1837
+ });
1835
1838
  } else {
1836
1839
  req.flash(
1837
1840
  "success",
package/routes/delete.js CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  const Router = require("express-promise-router");
8
8
 
9
- const { error_catcher } = require("./utils.js");
9
+ const { error_catcher, is_relative_url } = require("./utils.js");
10
10
  const Table = require("@saltcorn/data/models/table");
11
11
 
12
12
  /**
@@ -52,6 +52,9 @@ router.post(
52
52
  req.flash("error", e.message);
53
53
  }
54
54
  if (req.xhr) res.send("OK");
55
- else res.redirect(redirect || `/list/${table.name}`);
55
+ else
56
+ res.redirect(
57
+ (is_relative_url(redirect) && redirect) || `/list/${table.name}`
58
+ );
56
59
  })
57
60
  );
package/routes/edit.js CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  const Router = require("express-promise-router");
8
8
 
9
- const { error_catcher } = require("./utils.js");
9
+ const { error_catcher, is_relative_url } = require("./utils.js");
10
10
  const Table = require("@saltcorn/data/models/table");
11
11
 
12
12
  /**
@@ -46,6 +46,9 @@ router.post(
46
46
 
47
47
  if (req.xhr) res.send("OK");
48
48
  else if (req.get("referer")) res.redirect(req.get("referer"));
49
- else res.redirect(redirect || `/list/${table.name}`);
49
+ else
50
+ res.redirect(
51
+ (is_relative_url(redirect) && redirect) || `/list/${table.name}`
52
+ );
50
53
  })
51
54
  );
@@ -21,7 +21,12 @@ const { add_to_menu } = require("@saltcorn/admin-models/models/pack");
21
21
  const db = require("@saltcorn/data/db");
22
22
  const { getPageList } = require("./common_lists");
23
23
 
24
- const { isAdmin, error_catcher, addOnDoneRedirect } = require("./utils.js");
24
+ const {
25
+ isAdmin,
26
+ error_catcher,
27
+ addOnDoneRedirect,
28
+ is_relative_url,
29
+ } = require("./utils.js");
25
30
  const {
26
31
  mkTable,
27
32
  renderForm,
@@ -422,9 +427,10 @@ router.post(
422
427
  error_catcher(async (req, res) => {
423
428
  const { pagename } = req.params;
424
429
 
425
- let redirectTarget = req.query.on_done_redirect
426
- ? `/${req.query.on_done_redirect}`
427
- : "/pageedit";
430
+ let redirectTarget =
431
+ req.query.on_done_redirect && is_relative_url(req.query.on_done_redirect)
432
+ ? `/${req.query.on_done_redirect}`
433
+ : "/pageedit";
428
434
  const page = await Page.findOne({ name: pagename });
429
435
  if (!page) {
430
436
  req.flash("error", req.__(`Page %s not found`, pagename));
package/routes/utils.js CHANGED
@@ -250,13 +250,13 @@ const getGitRevision = () => db.connectObj.git_commit;
250
250
  * @returns {session|cookieSession}
251
251
  */
252
252
  const getSessionStore = () => {
253
- if (getState().getConfig("cookie_sessions", false)) {
253
+ /*if (getState().getConfig("cookie_sessions", false)) {
254
254
  return cookieSession({
255
255
  keys: [db.connectObj.session_secret || is.str.generate()],
256
256
  maxAge: 30 * 24 * 60 * 60 * 1000,
257
257
  sameSite: "strict",
258
258
  });
259
- } else if (db.isSQLite) {
259
+ } else*/ if (db.isSQLite) {
260
260
  var SQLiteStore = require("connect-sqlite3")(session);
261
261
  return session({
262
262
  store: new SQLiteStore({ db: "sessions.sqlite" }),
@@ -295,6 +295,11 @@ const addOnDoneRedirect = (oldPath, req) => {
295
295
  return oldPath;
296
296
  };
297
297
 
298
+ //https://stackoverflow.com/a/38979205/19839414
299
+ const is_relative_url = (url) => {
300
+ return typeof url === "string" && !url.includes(":/") && !url.includes("//");
301
+ };
302
+
298
303
  module.exports = {
299
304
  sqlsanitize,
300
305
  csrfField,
@@ -308,4 +313,5 @@ module.exports = {
308
313
  setTenant,
309
314
  get_tenant_from_req,
310
315
  addOnDoneRedirect,
316
+ is_relative_url,
311
317
  };
@@ -12,6 +12,7 @@ const {
12
12
  toSucceed,
13
13
  resetToFixtures,
14
14
  toNotInclude,
15
+ resToLoginCookie,
15
16
  } = require("../auth/testhelp");
16
17
  const db = require("@saltcorn/data/db");
17
18
  const { getState } = require("@saltcorn/data/db/state");
@@ -99,14 +100,15 @@ describe("user settings", () => {
99
100
  it("should change language", async () => {
100
101
  const app = await getApp({ disableCsrf: true });
101
102
  const loginCookie = await getAdminLoginCookie();
102
- await request(app)
103
+ const res = await request(app)
103
104
  .post("/auth/setlanguage")
104
105
  .set("Cookie", loginCookie)
105
106
  .send("locale=it")
106
107
  .expect(toRedirect("/auth/settings"));
108
+ const newCookie = resToLoginCookie(res);
107
109
  await request(app)
108
110
  .get("/auth/settings")
109
- .set("Cookie", loginCookie)
111
+ .set("Cookie", newCookie)
110
112
  .expect(toInclude("Cambia password"));
111
113
  });
112
114
  });