@saltcorn/server 0.8.1-rc.2 → 0.8.1-rc.3

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
@@ -336,6 +336,7 @@ const http_settings_form = async (req) =>
336
336
  "cookie_duration",
337
337
  "cookie_duration_remember",
338
338
  "cookie_sessions",
339
+ "public_cache_maxage",
339
340
  "custom_http_headers",
340
341
  ],
341
342
  action: "/useradmin/http",
package/auth/routes.js CHANGED
@@ -1061,6 +1061,7 @@ router.post(
1061
1061
  else req.session.cookie.expires = false;
1062
1062
  }
1063
1063
  Trigger.emitEvent("Login", null, req.user);
1064
+ res?.cookie?.("loggedin", "true");
1064
1065
  req.flash("success", req.__("Welcome, %s!", req.user.email));
1065
1066
  if (req.smr) {
1066
1067
  const dbUser = await User.findOne({ id: req.user.id });
package/auth/testhelp.js CHANGED
@@ -88,6 +88,9 @@ const toNotInclude =
88
88
  }
89
89
  };
90
90
 
91
+ const resToLoginCookie = (res) =>
92
+ res.headers["set-cookie"].find((c) => c.includes("connect.sid"));
93
+
91
94
  /**
92
95
  *
93
96
  * @returns {Promise<void>}
@@ -99,7 +102,7 @@ const getStaffLoginCookie = async () => {
99
102
  .send("email=staff@foo.com")
100
103
  .send("password=ghrarhr54hg");
101
104
  if (res.statusCode !== 302) console.log(res.text);
102
- return res.headers["set-cookie"][0];
105
+ return resToLoginCookie(res);
103
106
  };
104
107
 
105
108
  /**
@@ -113,8 +116,7 @@ const getAdminLoginCookie = async () => {
113
116
  .send("email=admin@foo.com")
114
117
  .send("password=AhGGr6rhu45");
115
118
  if (res.statusCode !== 302) console.log(res.text);
116
-
117
- return res.headers["set-cookie"][0];
119
+ return resToLoginCookie(res);
118
120
  };
119
121
 
120
122
  /**
package/locales/da.json CHANGED
@@ -555,5 +555,8 @@
555
555
  "Create database view": "Create database view",
556
556
  "Create an SQL view in the database with the fields in this list": "Create an SQL view in the database with the fields in this list",
557
557
  "Rows per page": "Rows per page",
558
- "List options": "List options"
558
+ "List options": "List options",
559
+ "Modules": "Modules",
560
+ "File not found": "File not found",
561
+ "Welcome, %s!": "Welcome, %s!"
559
562
  }
package/locales/en.json CHANGED
@@ -1077,5 +1077,8 @@
1077
1077
  "Saved 2FA policy for role": "Saved 2FA policy for role",
1078
1078
  "HTTP settings updated": "HTTP settings updated",
1079
1079
  "%s configuration": "%s configuration",
1080
- "Save indicator": "Save indicator"
1080
+ "Save indicator": "Save indicator",
1081
+ "Public cache TTL (minutes)": "Public cache TTL (minutes)",
1082
+ "Cache-control max-age for public views and pages. 0 to disable": "Cache-control max-age for public views and pages. 0 to disable",
1083
+ "Files accept filter": "Files accept filter"
1081
1084
  }
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@saltcorn/server",
3
- "version": "0.8.1-rc.2",
3
+ "version": "0.8.1-rc.3",
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.1-rc.2",
10
- "@saltcorn/builder": "0.8.1-rc.2",
11
- "@saltcorn/data": "0.8.1-rc.2",
12
- "@saltcorn/admin-models": "0.8.1-rc.2",
13
- "@saltcorn/filemanager": "0.8.1-rc.2",
14
- "@saltcorn/markup": "0.8.1-rc.2",
15
- "@saltcorn/sbadmin2": "0.8.1-rc.2",
9
+ "@saltcorn/base-plugin": "0.8.1-rc.3",
10
+ "@saltcorn/builder": "0.8.1-rc.3",
11
+ "@saltcorn/data": "0.8.1-rc.3",
12
+ "@saltcorn/admin-models": "0.8.1-rc.3",
13
+ "@saltcorn/filemanager": "0.8.1-rc.3",
14
+ "@saltcorn/markup": "0.8.1-rc.3",
15
+ "@saltcorn/sbadmin2": "0.8.1-rc.3",
16
16
  "@socket.io/cluster-adapter": "^0.1.0",
17
17
  "@socket.io/sticky": "^1.0.1",
18
18
  "aws-sdk": "^2.1037.0",
package/routes/admin.js CHANGED
@@ -97,6 +97,7 @@ const View = require("@saltcorn/data/models/view");
97
97
  const { getConfigFile } = require("@saltcorn/data/db/connect");
98
98
  const os = require("os");
99
99
  const Page = require("@saltcorn/data/models/page");
100
+ const { getSafeSaltcornCmd } = require("@saltcorn/data/utils");
100
101
 
101
102
  const router = new Router();
102
103
  module.exports = router;
@@ -1659,7 +1660,7 @@ router.post(
1659
1660
  // end http call, return the out directory name
1660
1661
  // the gui polls for results
1661
1662
  res.json({ build_dir_name: outDirName });
1662
- const child = spawn("saltcorn", spawnParams, {
1663
+ const child = spawn(getSafeSaltcornCmd(), spawnParams, {
1663
1664
  stdio: ["ignore", "pipe", "pipe"],
1664
1665
  cwd: ".",
1665
1666
  });
package/routes/fields.js CHANGED
@@ -996,7 +996,8 @@ router.post(
996
996
  formStyle: "vert",
997
997
  fields: formFields,
998
998
  });
999
- if (_columndef) form.values = JSON.parse(_columndef);
999
+ if (_columndef && _columndef !== "undefined")
1000
+ form.values = JSON.parse(_columndef);
1000
1001
  res.send(mkFormContentNoLayout(form));
1001
1002
  })
1002
1003
  );
package/routes/files.js CHANGED
@@ -393,6 +393,13 @@ router.post(
393
393
  f.s3_store ? s3storage.unlinkObject : undefined
394
394
  );
395
395
  if (result && result.error) {
396
+ if (req.xhr) {
397
+ const root = path.join(db.connectObj.file_store, db.getTenantSchema());
398
+ res.json({
399
+ error: result.error.replaceAll(root, ""),
400
+ });
401
+ return;
402
+ }
396
403
  req.flash("error", result.error);
397
404
  }
398
405
  res.redirect(`/files?dir=${encodeURIComponent(f.current_folder)}`);
package/routes/utils.js CHANGED
@@ -76,7 +76,7 @@ const setLanguage = (req, res, state) => {
76
76
  } else if (req.cookies?.lang) {
77
77
  req.setLocale(req.cookies?.lang);
78
78
  }
79
- set_custom_http_headers(res, state);
79
+ set_custom_http_headers(res, req, state);
80
80
  };
81
81
 
82
82
  /**
@@ -85,8 +85,17 @@ const setLanguage = (req, res, state) => {
85
85
  * @param {string} state
86
86
  * @returns {void}
87
87
  */
88
- const set_custom_http_headers = (res, state) => {
89
- const hdrs = (state || getState()).getConfig("custom_http_headers");
88
+ const set_custom_http_headers = (res, req, state) => {
89
+ const state1 = state || getState();
90
+ const hdrs = state1.getConfig("custom_http_headers");
91
+ if (!req.user) {
92
+ const public_cache_maxage = +state1.getConfig("public_cache_maxage", 0);
93
+ if (public_cache_maxage)
94
+ res.header(
95
+ "Cache-Control",
96
+ `public, max-age=${public_cache_maxage * 60}`
97
+ );
98
+ }
90
99
  if (!hdrs) return;
91
100
  for (const ln of hdrs.split("\n")) {
92
101
  const [k, v] = ln.split(":");
@@ -464,7 +464,7 @@ const respondWorkflow = (view, wf, wfres, req, res) => {
464
464
  type: "breadcrumbs",
465
465
  crumbs: [
466
466
  { text: req.__("Views"), href: "/viewedit" },
467
- { href: `/viewedit/edit/${view.name}`, text: view.name },
467
+ { href: `/view/${view.name}`, text: view.name },
468
468
  { workflow: wf, step: wfres },
469
469
  ],
470
470
  },
package/serve.js CHANGED
@@ -377,7 +377,7 @@ const setupSocket = (...servers) => {
377
377
  const view = View.findOne({ name: viewname });
378
378
  if (view.viewtemplateObj.authorize_join) {
379
379
  view.viewtemplateObj
380
- .authorize_join(view.configuration, room_id, socket.request.user)
380
+ .authorize_join(view, room_id, socket.request.user)
381
381
  .then((authorized) => {
382
382
  if (authorized) socket.join(`${ten}_${viewname}_${room_id}`);
383
383
  });