Skip to content

Commit 14b33ef

Browse files
author
Martii
committed
Trim up the local brute DB a little
* Normalize on username standards and do a precheck so we don't track some obvious bad requests. This should lower the MongoLab traffic a little. * Remove a stray comma * Fixed a bug in lib detection... technically this was refactored out. * Removed last commit unused var **NOTES** Consider `keyScript` as a preop to make sure we're "trying the right kind of key in the lock first" which just happens to be our `installName` :) Applies to OpenUserJS#944 and a little to OpenUserJS#37 *(silence is golden)*
1 parent a7de9ae commit 14b33ef

File tree

2 files changed

+56
-38
lines changed

2 files changed

+56
-38
lines changed

controllers/scriptStorage.js

+53-31
Original file line numberDiff line numberDiff line change
@@ -203,58 +203,81 @@ exports.getSource = function (aReq, aCallback) {
203203
});
204204
};
205205

206-
exports.sendScript = function (aReq, aRes, aNext) {
207-
if (aReq.params.type === 'libs') {
208-
aReq.params.isLib = true;
209-
}
206+
exports.keyScript = function (aReq, aRes, aNext) {
207+
let pathname = aReq._parsedUrl.pathname;
208+
let isLib = /^\/src\/libs\//.test(pathname);
209+
210+
let installName = pathname.replace(/^\/(?:install|src\/(?:scripts|libs))\//, '');
210211

211-
let accept = aReq.headers.accept;
212+
let rUserJS = /\.user\.js$/;
213+
let rMetaJS = /\.meta\.js$/;
214+
let rJS = /\.js$/;
215+
216+
let accept = aReq.headers.accept || '*/*';
212217
let accepts = null;
218+
213219
let hasAcceptUserScriptMeta = false;
214220
let hasAcceptNotAcceptable = false;
215-
let url = URL.parse(aReq.url);
216221

217-
let isLib = aReq.params.isLib || /^\/libs\//.test(url.pathname);
218-
let rUserJS = /\.user\.js$/;
219-
let rMetaJS = /\.meta\.js$/;
222+
let parts = installName.split('/');
223+
let userName = parts[0].toLowerCase();
224+
let scriptName = parts[1];
220225

221226
if (!isLib) {
222-
if (accept) {
223-
accepts = accept.split(',');
227+
accepts = accept.split(',');
228+
229+
if (rUserJS.test(scriptName)) {
224230
accepts.forEach(function (aElement, aIndex, aArray) {
225231
let acceptItem = aElement.trim();
226232

227-
if (/^text\/x\-userscript\-meta/.test(acceptItem)) { // TODO: toggle `\-meta` in re
228-
hasAcceptUserScriptMeta = true;
229-
}
230-
231-
// Find 406 (not acceptables)
233+
// Find not acceptables
232234
if (/^image\//.test(acceptItem)) {
233235
hasAcceptNotAcceptable = true;
234236
}
235237

238+
// Find acceptables
239+
if (/^text\/x\-userscript\-meta/.test(acceptItem)) {
240+
hasAcceptUserScriptMeta = true;
241+
}
236242
});
237-
}
238243

239-
// Test for 406 (not acceptables)
240-
if (hasAcceptNotAcceptable && rUserJS.test(url.pathname)) {
241-
aRes.status(406).send();
242-
return;
243-
}
244+
// Test acceptables
245+
if (hasAcceptNotAcceptable) {
246+
aRes.status(406).send();
247+
return;
248+
}
244249

245-
if (hasAcceptUserScriptMeta && rUserJS.test(url.pathname) ||
246-
rMetaJS.test(url.pathname)) {
247-
//
248-
exports.sendMeta(aReq, aRes, aNext);
250+
if (hasAcceptUserScriptMeta) {
251+
exports.sendMeta(aReq, aRes, aNext);
252+
return;
253+
}
254+
255+
aNext(userName + '/' + scriptName.replace(/(\.min)?\.user\.js/, '.user.js'));
249256
return;
257+
258+
} else if (rMetaJS.test(scriptName)) {
259+
if (!/\.min\.meta\.js$/.test(scriptName)) {
260+
exports.sendMeta(aReq, aRes, aNext);
261+
return;
262+
}
250263
}
251-
} else {
252-
if (rMetaJS.test(url.pathname)) {
253-
aNext();
264+
} else if (rJS.test(scriptName)) {
265+
aNext(userName + '/' + scriptName.replace(/(\.min)?\.js/, '.js'));
254266
return;
255-
}
256267
}
257268

269+
// No matches so return a bad request
270+
aRes.status(400).send();
271+
}
272+
273+
exports.sendScript = function (aReq, aRes, aNext) {
274+
if (aReq.params.type === 'libs') {
275+
aReq.params.isLib = true;
276+
}
277+
278+
let pathname = aReq._parsedUrl.pathname;
279+
let isLib = aReq.params.isLib || /^\/src\/libs\//.test(pathname);
280+
258281
exports.getSource(aReq, function (aScript, aStream) {
259282
let chunks = [];
260283
let updateURL = null;
@@ -581,7 +604,6 @@ exports.storeScript = function (aUser, aMeta, aBuf, aCallback, aUpdate) {
581604
var name = null;
582605
var thisName = null;
583606
var scriptName = null;
584-
var updateURL = null;
585607
var author = null;
586608
var collaborators = null;
587609
var installName = aUser.name + '/';

routes.js

+3-7
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,6 @@ var sourcesBruteforce = new ExpressBrute(store, {
5858
failCallback: tooManyRequests
5959
});
6060

61-
var fnKeySources = function (aReq, aRes, aNext) {
62-
// Prevent too many attempts from the same source `pathname`
63-
aNext(aReq._parsedUrl.pathname);
64-
};
6561

6662
module.exports = function (aApp) {
6763
//--- Middleware
@@ -105,7 +101,7 @@ module.exports = function (aApp) {
105101
aRes.redirect('/users/' + aReq.params.username + '/scripts'); // NOTE: Watchpoint
106102
});
107103

108-
aApp.route('/install/:username/:scriptname').get(sourcesBruteforce.getMiddleware({key : fnKeySources}), scriptStorage.sendScript);
104+
aApp.route('/install/:username/:scriptname').get(sourcesBruteforce.getMiddleware({key : scriptStorage.keyScript}), scriptStorage.sendScript);
109105
aApp.route('/meta/:username/:scriptname').get(scriptStorage.sendMeta);
110106

111107
// Github hook routes
@@ -119,7 +115,7 @@ module.exports = function (aApp) {
119115
aApp.route('/libs/:username/:scriptname/source').get(script.lib(user.editScript));
120116

121117
// Raw source
122-
aApp.route('/src/:type(scripts|libs)/:username/:scriptname').get(sourcesBruteforce.getMiddleware({key : fnKeySources}), scriptStorage.sendScript);
118+
aApp.route('/src/:type(scripts|libs)/:username/:scriptname').get(sourcesBruteforce.getMiddleware({key : scriptStorage.keyScript}), scriptStorage.sendScript);
123119

124120
// Issues routes
125121
aApp.route('/:type(scripts|libs)/:username/:scriptname/issues/:open(open|closed|all)?').get(issue.list);
@@ -185,7 +181,7 @@ module.exports = function (aApp) {
185181
aApp.use(function (aReq, aRes, aNext) {
186182
statusCodePage(aReq, aRes, aNext, {
187183
statusCode: 404,
188-
statusMessage: 'This is not the page you\'re are looking for.',
184+
statusMessage: 'This is not the page you\'re are looking for.'
189185
});
190186
});
191187
};

0 commit comments

Comments
 (0)