@saltcorn/server 0.8.3-alpha.2 → 0.8.3-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/auth/admin.js +1 -1
- package/auth/routes.js +29 -25
- package/auth/testhelp.js +1 -0
- package/locales/da.json +5 -1
- package/package.json +11 -11
- package/routes/actions.js +8 -2
- package/routes/admin.js +16 -13
- package/routes/delete.js +5 -2
- package/routes/edit.js +5 -2
- package/routes/pageedit.js +10 -4
- package/routes/utils.js +6 -0
- package/tests/auth.test.js +4 -2
package/auth/admin.js
CHANGED
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
}
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
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
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-
|
|
3
|
+
"version": "0.8.3-beta.0",
|
|
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-
|
|
10
|
-
"@saltcorn/builder": "0.8.3-
|
|
11
|
-
"@saltcorn/data": "0.8.3-
|
|
12
|
-
"@saltcorn/admin-models": "0.8.3-
|
|
13
|
-
"@saltcorn/filemanager": "0.8.3-
|
|
14
|
-
"@saltcorn/markup": "0.8.3-
|
|
15
|
-
"@saltcorn/sbadmin2": "0.8.3-
|
|
9
|
+
"@saltcorn/base-plugin": "0.8.3-beta.0",
|
|
10
|
+
"@saltcorn/builder": "0.8.3-beta.0",
|
|
11
|
+
"@saltcorn/data": "0.8.3-beta.0",
|
|
12
|
+
"@saltcorn/admin-models": "0.8.3-beta.0",
|
|
13
|
+
"@saltcorn/filemanager": "0.8.3-beta.0",
|
|
14
|
+
"@saltcorn/markup": "0.8.3-beta.0",
|
|
15
|
+
"@saltcorn/sbadmin2": "0.8.3-beta.0",
|
|
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.
|
|
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.
|
|
51
|
+
"qrcode": "1.5.1",
|
|
52
52
|
"resize-with-sharp-or-jimp": "0.1.6",
|
|
53
|
-
"socket.io": "4.
|
|
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 {
|
|
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
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
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
|
|
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
|
|
49
|
+
else
|
|
50
|
+
res.redirect(
|
|
51
|
+
(is_relative_url(redirect) && redirect) || `/list/${table.name}`
|
|
52
|
+
);
|
|
50
53
|
})
|
|
51
54
|
);
|
package/routes/pageedit.js
CHANGED
|
@@ -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 {
|
|
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 =
|
|
426
|
-
|
|
427
|
-
|
|
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
|
@@ -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
|
};
|
package/tests/auth.test.js
CHANGED
|
@@ -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",
|
|
111
|
+
.set("Cookie", newCookie)
|
|
110
112
|
.expect(toInclude("Cambia password"));
|
|
111
113
|
});
|
|
112
114
|
});
|