Skip to content

Commit ddb9351

Browse files
committed
GHSA-59g8-h59f-8hjp and additional clean up related to GHSA-9jr9-8ff3-m894
1 parent ddd93fe commit ddb9351

File tree

10 files changed

+33
-219
lines changed

10 files changed

+33
-219
lines changed

nodemon.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@
88
"_sites",
99
"_sites/*/**",
1010
"_sites/*/pages/**",
11-
"_sites/*/site.json"]
11+
"_sites/*/site.json"
12+
]
1213
}

src/app.js

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,35 @@ const server = require('http').Server(app);
1515
// HAXcms core settings
1616
process.env.haxcms_middleware = "node-express";
1717
const { HAXCMS, systemStructureContext } = require('./lib/HAXCMS.js');
18+
// default helmet policies for CSP
19+
const helmetPolicies = {
20+
contentSecurityPolicy: {
21+
directives: {
22+
scriptSrc: ["'self'", "'unsafe-inline'", "'unsafe-eval'", "'wasm-unsafe-eval'", "www.youtube.com"],
23+
styleSrc: ["'self'", "'unsafe-inline'", "data:", "https:"],
24+
mediaSrc: ["'self'", "data:", "https:"],
25+
imgSrc: ["'self'", "data:", "https:"],
26+
connectSrc: ["'self'", "https:", "ws:"],
27+
defaultSrc: ["'self'", "data:", "https:"],
28+
objectSrc: ["'none'"],
29+
fontSrc: ["'self'", "data:", "fonts.gstatic.com"],
30+
},
31+
},
32+
// crossOriginResourcePolicy: false,
33+
// crossOriginEmbedderPolicy: 'require-corp',
34+
// crossOriginOpenerPolicy: 'same-origin',
35+
referrerPolicy: {
36+
policy: ["origin", "unsafe-url"],
37+
},
38+
};
39+
1840
// flag in local development that disables security
1941
// this way you launch from local and don't need a U/P relationship
2042
if (process.env.HAXCMS_DISABLE_JWT_CHECKS || argv._.includes('HAXCMS_DISABLE_JWT_CHECKS')) {
2143
HAXCMS.HAXCMS_DISABLE_JWT_CHECKS = true;
44+
// disable security policies that would otherwise block local development
45+
// also enables webcontainer environments which is what our playground runs
46+
helmetPolicies.contentSecurityPolicy = false;
2247
}
2348
// routes with all requires
2449
const { RoutesMap, OpenRoutes } = require('./lib/RoutesMap.js');
@@ -48,15 +73,7 @@ if (process.env.NODE_ENV === "development") {
4873
);
4974
}
5075
app.use(express.urlencoded({limit: '50mb', extended: false, parameterLimit: 50000 }));
51-
app.use(helmet({
52-
contentSecurityPolicy: false,
53-
// crossOriginResourcePolicy: false,
54-
// crossOriginEmbedderPolicy: 'require-corp',
55-
// crossOriginOpenerPolicy: 'same-origin',
56-
referrerPolicy: {
57-
policy: ["origin", "unsafe-url"],
58-
},
59-
}));
76+
app.use(helmet(helmetPolicies));
6077
app.use(cookieParser());
6178
//pre-flight requests
6279
app.options('*', function(req, res, next) {

src/lib/HAXCMS.js

Lines changed: 2 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,7 +1911,8 @@ class HAXCMSClass {
19111911
}
19121912
cleanTitle = cleanTitle.replace(/ /g, '-').toLowerCase();
19131913
cleanTitle = cleanTitle.replace('/[^\w\-\/\s]+/u', '-');
1914-
cleanTitle = cleanTitle.replace('/--+/u', '-');
1914+
cleanTitle = cleanTitle.replace('/--+/u',
1915+
'-');
19151916
// ensure we don't return an empty title or it could break downstream things
19161917
if (cleanTitle == '') {
19171918
cleanTitle = 'blank';
@@ -2339,90 +2340,6 @@ class HAXCMSClass {
23392340
}
23402341
this.saveUserDataFile();
23412342
}
2342-
/**
2343-
* Set and validate config
2344-
*/
2345-
async setConfig(values)
2346-
{
2347-
if ((values.apis)) {
2348-
for (var key in values.apis) {
2349-
let val = values.apis[key];
2350-
this.config.appStore.apiKeys[key] = val;
2351-
}
2352-
}
2353-
if (!(this.config.site)) {
2354-
this.config.site = {};
2355-
}
2356-
if (!(this.config.site.git)) {
2357-
this.config.site.git = {};
2358-
}
2359-
if (values.publishing) {
2360-
for (var key in values.publishing) {
2361-
let val = values.publishing[key];
2362-
this.config.site.git[key] = val;
2363-
}
2364-
}
2365-
// test for a password in order to do the git hook up this one time
2366-
if (
2367-
(this.config.site.git.email) &&
2368-
(this.config.site.git.pass)
2369-
) {
2370-
email = this.config.site.git.email;
2371-
pass = this.config.site.git.pass;
2372-
// ensure we never save the password, this is just a 1 time pass through
2373-
delete this.config.site.git.pass;
2374-
}
2375-
// save config to the file
2376-
this.saveConfigFile();
2377-
// see if we need to set a github key for publishing
2378-
// this is a one time thing that helps with the workflow
2379-
if (
2380-
(email) &&
2381-
(pass) &&
2382-
!(this.config.site.git.keySet) &&
2383-
(this.config.site.git.vendor) &&
2384-
this.config.site.git.vendor == 'github'
2385-
) {
2386-
let json = {};
2387-
json.title = 'HAXCMS Publishing key';
2388-
json.key = this.getSSHKey();
2389-
let response = fetch('https://api.github.com/user/keys',
2390-
{
2391-
method: "POST",
2392-
body: {
2393-
'auth': [email, pass],
2394-
'body': JSON.stringify(json)
2395-
},
2396-
}
2397-
);
2398-
// we did it, now store that it worked so we can skip all this setup in the future
2399-
if (response.getStatusCode() == 201) {
2400-
this.config.site.git.keySet = true;
2401-
this.saveConfigFile();
2402-
try {
2403-
// set global config for username / email if we can
2404-
const gitRepo = new GitPlus({
2405-
dir: this.siteDirectory,
2406-
cliVersion: await this.gitTest()
2407-
});
2408-
gitRepo.gitExec(
2409-
'config --global user.name "' +
2410-
this.config.site.git.user +
2411-
'"'
2412-
);
2413-
gitRepo.gitExec(
2414-
'config --global user.email "' +
2415-
this.config.site.git.email +
2416-
'"'
2417-
);
2418-
}
2419-
catch(e){}
2420-
}
2421-
2422-
return response.getStatusCode();
2423-
}
2424-
return 'saved';
2425-
}
24262343
/**
24272344
* Write configuration to the config file
24282345
*/

src/lib/RoutesMap.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ const RoutesMap = {
2121
saveNode: require('../routes/saveNode.js'),
2222
deleteNode: require('../routes/deleteNode.js'),
2323
saveFile: require('../routes/saveFile.js'),
24-
25-
getConfig: require('../routes/getConfig.js'),
26-
setConfig: require('../routes/setConfig.js'),
27-
getNodeFields: require('../routes/getNodeFields.js'),
2824
},
2925
get: {
3026
logout: require('../routes/logout.js'),

src/routes/connectionSettings.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,6 @@ async function connectionSettings(req, res) {
4747
saveNodePath: `${baseAPIPath}saveNode`,
4848
saveManifestPath: `${baseAPIPath}saveManifest`,
4949
saveOutlinePath: `${baseAPIPath}saveOutline`,
50-
setConfigPath:`${baseAPIPath}setConfig`,
51-
getConfigPath: `${baseAPIPath}getConfig`,
52-
getNodeFieldsPath: `${baseAPIPath}getNodeFields`,
5350
getSiteFieldsPath: `${baseAPIPath}formLoad?haxcms_form_id=siteSettings`,
5451
createNodePath: `${baseAPIPath}createNode`,
5552
getUserDataPath: `${baseAPIPath}getUserData`,

src/routes/createSite.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const HAXCMSFile = require('../lib/HAXCMSFile.js');
5252
* )
5353
*/
5454
async function createSite(req, res) {
55-
if (HAXCMS.validateRequestToken()) {
55+
if (HAXCMS.validateRequestToken(req.body.token)) {
5656
let domain = null;
5757
// woohoo we can edit this thing!
5858
if (req.body['site']['domain'] && req.body['site']['domain'] != null && req.body['site']['domain'] != '') {
@@ -216,7 +216,7 @@ async function createSite(req, res) {
216216
});
217217
}
218218
else {
219-
res.send(403);
219+
res.sendStatus(403);
220220
}
221221
}
222222
module.exports = createSite;

src/routes/formLoad.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const { HAXCMS } = require('../lib/HAXCMS.js');
1818
* )
1919
*/
2020
async function formLoad(req, res) {
21-
if (HAXCMS.validateRequestToken(null, 'form')) {
21+
if (HAXCMS.validateRequestToken(req.body.token, 'form')) {
2222
let context = {
2323
'site':[],
2424
'node': [],

src/routes/getConfig.js

Lines changed: 0 additions & 32 deletions
This file was deleted.

src/routes/getNodeFields.js

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/routes/setConfig.js

Lines changed: 0 additions & 51 deletions
This file was deleted.

0 commit comments

Comments
 (0)