Skip to content

Commit

Permalink
Ошибка 404 вынесена в отдельный лог. При загрузке файлов проверяется …
Browse files Browse the repository at this point in the history
…content-length для превентивного отклонения запроса с превышенным размером
  • Loading branch information
klimashkin committed Sep 17, 2013
1 parent 74b4f4c commit af147c4
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 16 deletions.
10 changes: 8 additions & 2 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ var pkg = JSON.parse(fs.readFileSync(__dirname + '/package.json', 'utf8')),
console.log('\n');
mkdirp.sync(logPath);
log4js.configure('./log4js.json', {cwd: logPath});
var logger = log4js.getLogger("app.js");
var logger = log4js.getLogger("app.js"),
logger404 = require('log4js').getLogger("404.js");

logger.info('Starting Node[' + process.versions.node + '] with v8[' + process.versions.v8 + '] on process pid:' + process.pid);
logger.info('Platform: ' + process.platform + ', architecture: ' + process.arch + ' with ' + os.cpus().length + ' cpu cores');
Expand Down Expand Up @@ -137,7 +138,9 @@ async.waterfall([
app.hash = land === 'dev' ? app.version : buildJson.appHash;
logger.info('Application Hash: ' + app.hash);


function static404(req, res) {
logger404.error(JSON.stringify({url: req.url, method: req.method, ua: req.headers && req.headers['user-agent']}));
res.send(404);
}

Expand Down Expand Up @@ -173,6 +176,9 @@ async.waterfall([
}
if (!noServePublic) {
app.use(express.static(__dirname + pub, {maxAge: ms('2d')}));
app.get('/img/*', static404);
app.get('/js/*', static404);
app.get('/style/*', static404);
}
if (!noServeStore) {
app.use('/_a/', express.static(storePath + 'public/avatars/', {maxAge: ms('2d')}));
Expand Down Expand Up @@ -236,7 +242,7 @@ async.waterfall([
require('./controllers/registerRoutes.js').loadController(app);
require('./controllers/systemjs.js').loadController(app, db);
require('./controllers/errors.js').registerErrorHandling(app);
require('./basepatch/v0.9.3.js').loadController(app, db);
//require('./basepatch/v0.9.3.js').loadController(app, db);

callback(null);
}
Expand Down
3 changes: 2 additions & 1 deletion controllers/errors.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict';

var logger = require('log4js').getLogger("error.js"),
logger404 = require('log4js').getLogger("404.js"),
neoError = {
e404: function e404(msgs) {
this.message = msgs;
Expand All @@ -17,7 +18,7 @@ neoError.e404.prototype = Object.create(Error.prototype);
neoError.e500.prototype = Object.create(Error.prototype);

function send404(req, res, err) {
logger.error('404 for:\n\t' + JSON.stringify({url: req.url, method: req.method, ua: req.headers && req.headers['user-agent']}));
logger404.error(JSON.stringify({url: req.url, method: req.method, ua: req.headers && req.headers['user-agent']}));
if (req.xhr) {
res.send(404, {error: 'Not found'});
} else {
Expand Down
14 changes: 11 additions & 3 deletions log4js.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,23 @@
"type": "file",
"filename": "common.log",
"maxLogSize": 524288,
"backups": 2,
"backups": 1,
"pollInterval": 15,
"category": ["console", "app.js", "index.js", "profile.js", "mail.js", "auth.js", "tpl.js", "photo.js", "photoCluster.js", "systemjs.js"]
},
{
"type": "file",
"filename": "status.log",
"filename": "404.log",
"maxLogSize": 524288,
"backups": 2,
"backups": 1,
"pollInterval": 10,
"category": ["404.js"]
},
{
"type": "file",
"filename": "error.log",
"maxLogSize": 524288,
"backups": 1,
"pollInterval": 10,
"category": ["error.js"]
},
Expand Down
29 changes: 20 additions & 9 deletions uploader.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,15 +90,22 @@ var Utils = require('./commons/Utils.js'),
},
postHandler = function (req, res, isAvatar, cb) {
var form = new formidable.IncomingForm(),
maxPostSize = isAvatar ? options.maxPhotoPostSize : options.maxAvaPostSize,
maxPostSize = isAvatar ? options.maxAvaPostSize : options.maxPhotoPostSize,
targetDir = isAvatar ? options.targetDirAva : options.targetDir,
validateFunc = isAvatar ? validateAvatar : validatePhoto,

contentLength = req.headers && req.headers['content-length'] && Number(req.headers['content-length']),

tmpFiles = [],
files = [],
map = {},
counter = 1;

//Современные браузеры сразу присылают размер запроса в байтах, можно сразу отклонить при превышении максимального размера
if (contentLength && contentLength > maxPostSize) {
tooBigPostDestroy(req, isAvatar, 0, contentLength);
}

form.uploadDir = options.incomeDir;
form
.on('fileBegin', function (name, file) {
Expand All @@ -120,12 +127,11 @@ var Utils = require('./commons/Utils.js'),
});
})
.on('error', function (e) {
console.dir(e);
logger.warn(e && e.message || e);
})
.on('progress', function (bytesReceived/*, bytesExpected*/) {
.on('progress', function (bytesReceived, bytesExpected) {
if (bytesReceived > maxPostSize) {
console.log('~~~~', 'Too big, dropping');
req.connection.destroy();
tooBigPostDestroy(req, isAvatar, bytesReceived, bytesExpected);
}
})
.on('end', function () {
Expand Down Expand Up @@ -170,7 +176,7 @@ var Utils = require('./commons/Utils.js'),
postHandler(req, res, req.url === '/uploadava', postHandlerResponse);
break;
default:
console.log(405);
logger.warn(405);
res.statusCode = 405;
res.end();
}
Expand Down Expand Up @@ -202,6 +208,11 @@ FileInfo.prototype.createFileName = function (targetDir, nameLen, dirDepth) {
}
};

function tooBigPostDestroy(req, isAvatar, bytesReceived, bytesExpected) {
logger.warn('~~~~', 'Too big ' + (isAvatar ? 'avatar' : 'photo') + ', dropping', bytesReceived, bytesExpected);
req.connection.destroy();
}

function validatePhoto(fileInfo, cb) {
if (!options.acceptFileTypes.test(fileInfo.name)) {
fileInfo.error = 'ftype';
Expand All @@ -216,7 +227,7 @@ function validatePhoto(fileInfo, cb) {

gm(options.incomeDir + fileInfo.file).size(function (err, size) {
if (err) {
console.log('~~~~', 'GM size error');
logger.error('~~~~', 'GM size error');
fileInfo.error = 'fpx';
return cb();
}
Expand Down Expand Up @@ -245,7 +256,7 @@ function validateAvatar(fileInfo, cb) {

gm(options.incomeDir + fileInfo.file).size(function (err, size) {
if (err) {
console.log('~~~~', 'GM size error');
logger.error('~~~~', 'GM size error');
fileInfo.error = 'fpx';
return cb();
}
Expand All @@ -269,7 +280,7 @@ function validateAvatar(fileInfo, cb) {
.resize(100, 100)
.write(options.incomeDir + fileInfo.file, function (err) {
if (err) {
console.log('~~~~', 'GM avatar resize error');
logger.warn('~~~~', 'GM avatar resize error');
fileInfo.error = 'fpx';
}
cb();
Expand Down
2 changes: 1 addition & 1 deletion views/module/user/settings.jade
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
input.thr(type="radio", name="subscr_throttle_radios", data-bind="attr: {id: 'subscr_throttle_radios_' + $index(), value: ''+$data}, checked: $parent.u.settings.subscr_throttle")
|  
span(data-bind="text: ($data/60000 > 59 ? $data/3600000 + 'ч' : $data/60000 + 'мин')")
i.icon-info-sign.helpico(title="Минимальный количество времени, которое должно пройти между отправками писем с уведомлением")
i.icon-info-sign.helpico(title="Минимальное время, которое должно пройти между отправками писем с уведомлением")

.accordion-group
.accordion-heading
Expand Down

0 comments on commit af147c4

Please sign in to comment.