Код сам по себе — почти чепуха, его можно переписывать. Даже если ничего не меняется, он все равно по какой-то причине портится. (Кен Томпсон, стр.401)
Этой цитате надо просто памятник поставить, она будет жить вечно :)
В таких ситуациях программисты делятся на 2 типа: те, кто по памяти пишут заново и всё намного круче получается, чем было, ну и конечно же тех, кто забивает на это дело :)
Не удалось выполнить доставку следующим получателям или группам:
zeronights@gaz-is.ru
Возникла проблема в работе почтового ящика получателя. Попытайтесь повторно отправить это сообщение. Если проблема будет возникать снова, обратитесь в службу технической поддержки.
Система падает со стабильностью раз в 10 минут) И кстати нагрузку по любому создают при бруте, лично я меньше 16 потоков не ставлю, а если нас 10-20 человек, а кто-то может и 50 поставить… интересное бессмысленное отборочное задание, чтобы попасть на пентест в саму систему.
Может я что-то не понимаю, но вы в не курсе наверное, что время на изменения очень ограниченное. Я бы тоже не успел придумать другой комментарий, если мысль уже была одна. Зачем писать спонтанный бред, ради того, чтобы просто случайно не повторяться?
у вас все функции созданы с 2 параметрами и везде обязательно понатыканы return; которые на самом деле не нужны будут если придерживаться рекомендациям разработки в express (connect), а именно использования параметров с возвратом ошибок и единой обработкой их, тогда ваши функции станут выглядеть вот так:
и по ссылке посмотрите примеры обработчиков, который добавите в конец после всех роутов, тогда они будут перехватываться в случаи ошибки и будет единый обработчик, который можно стилизировать под json или html или и то и то прописав логику. А если пойти дальше, то можно унаследовать свои функции от Error и сделать разновидности ошибок, я использую например так:
// Error handling
app.use(function(err, req, res, next){
console.log(err);
if (err instanceof NotFound) {
res.render('errors/404', {
title : 'Not Found',
layout: 'login/layout',
status: 404
});
} else if (err instanceof AccessDenied) {
res.render('errors/403', {
title : 'Not Found',
layout: 'login/layout',
status: 403
});
} else if (err instanceof Unavailable) {
res.render('errors/503', {
title : 'Not Found',
layout: 'login/layout',
status: 503
});
} else if (err instanceof Offline) {
res.render('errors/offline', {
title : 'Offline',
layout: 'login/layout'
});
} else {
res.render('errors/500', {
title : 'The Server Encountered an Error',
layout: 'login/layout',
error: err,
status: 500
});
}
});
function AccessDenied(msg) {
this.name = 'AccessDenied';
Error.call(this, msg);
Error.captureStackTrace(this, arguments.callee);
}
function NotFound(msg) {
this.name = 'NotFound';
Error.call(this, msg);
Error.captureStackTrace(this, arguments.callee);
}
function Unavailable(msg) {
this.name = 'Unavailable';
Error.call(this, msg);
Error.captureStackTrace(this, arguments.callee);
}
function Offline(msg) {
this.name = 'Offline';
Error.call(this, msg);
Error.captureStackTrace(this, arguments.callee);
}
Вы сами ответили на свой вопрос: «тем, что параметры записаны не в url, а в теле запроса». Обработка происходит не только заголовков как в GET, но и тела запроса
Полностью согласен про прототипы и очень удивлён, что об этом практически ничего не написали в комментариях. Вся эта история высосана из пальца и предоставляет 2 крайности совершенно не опытных программистов, которые могут легко исправить положения одним тим лидом, если их проект-менеджер занят книжками «я познаю мир» :)
Вообще в большинстве случаев при разработке любого проекта, аналогов которого нет, то есть реально новый функционал, которые необходим заказчику, а тот в свою очередь если не программист никак не может продумать всей архитектуры, а особенно объяснить все детали проект-менеджеру. В таких случаях всегда разрабатывается прототип и подгоняется его работа под требования без всяких свистелок и прочей мешуры, должно просто выполнять основные задачи для работы данного проекта. И только потом на основе этого прототипа создаётся архитектура и всё это обвешивается классами и рефакторится 10 раз. Все выводы из собственного опыта автоматизации разного рода бизнеса, когда понять задачу было просто очень сложно понять изначально всех мелочей каждого бизнес-процесса, всё это только в процессе предварительного тестирования и запуска прототипа возможно выявить.
Этой цитате надо просто памятник поставить, она будет жить вечно :)
zeronights@gaz-is.ru
Возникла проблема в работе почтового ящика получателя. Попытайтесь повторно отправить это сообщение. Если проблема будет возникать снова, обратитесь в службу технической поддержки.
Диагностические сведения для администраторов:
Формирующий сервер: gaz-is.ru
zeronights@gaz-is.ru
#554 5.2.0 STOREDRV.Deliver.Exception:AccessDeniedException.MapiExceptionNotAuthorized; Failed to process message due to a permanent exception with message Cannot complete delivery-time processing. 16.55847:AB340000, 17.43559:00000000A6020000000000000F00000000000000, 255.23226:00000000, 255.27962:0A000000, 255.27962:0E000000, 255.27962:0A000000, 255.27962:9E000000, 255.17082:D6040000, 0.18273:00000000, 4.21921:D6040000, 255.27962:FA000000, 255.1494:43000000, 255.1238:4F000000, 4.13800:0F010480, 4.9448:0F010480, 0.25720:B0840110, 4.7716:0F010480, 2.22787:00000000, 4.13800:0F010480, 4.9448:0F010480, 0.25720:0300DD3F, 4.7716:0F010480, 0.17692:0F010480, 6.5587:0F01048002014D0E0F010480, 4.33375:0F010480, 2.17597:00000000, 2.22787:00000000, 4.13032:0F010480, 2.22787:00000000, 4.13032:0F010480, 0.26000:0F010480, 4.4580:05000780, 0.26640:0F010480, 4.4408:05000780, 4.7637:D8040000, 0.49797:0F010480, 4.5093:D6040000, 4.5318:D6040000, 4.10104:D6040000, 0.57449:0F010480, 4.6025:05000780, 4.5257:05000780, 4.4606:D6040000, 255.1750:0F010480, 0.26849:0F010480, 255.21817:D6040000 ##
Исходные заголовки сообщения:
Received: from post1.gaz-is.ru (192.168.1.14) by SRVEXCH01.gis.lan
(192.168.1.16) with Microsoft SMTP Server id 14.2.318.4; Fri, 2 Nov 2012
14:34:46 +0400
X-AuditID: c0a8010e-b7f1b6d000000f37-49-5093a1a6d050
Authentication-Results: symauth.service.identifier; spf=pass; dkim=pass header.d=gmail.com header.s=20120113 header.v=1 header.a=rsa-sha256
Received: from mail-lb0-f179.google.com (mail-lb0-f179.google.com
[209.85.217.179]) by post1.gaz-is.ru () with SMTP id A8.5A.03895.6A1A3905;
Fri, 2 Nov 2012 14:34:15 +0400 (MSK)
Received: by mail-lb0-f179.google.com with SMTP id c1so2321778lbg.38
for <zeronights@gaz-is.ru>; Fri, 02 Nov 2012 03:34:27 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20120113;
h=message-id:date:from:user-agent:mime-version:to:subject
:x-enigmail-version:content-type;
bh=Gn1x6LPl49yEiOP20T+b3OM0Tty+JkZsCG29k0ohkp4=;
b=a3gDB3ZPua9hV1qhzjH5XYbbr6B7Ehi0isSdOccgcECvWrx/uXUrI40pCLnQJEdlAi
qjzFsGlSGUgHLBWtRDHkgMvApN05C0f6XbZYn3xFvpJ+99eMqUw/RVTGvJXFxzCJOM/W
4yl+P6xhBtGOle6VyHLMNytwR8SKfIyBB6MggDEXXkWAxzIlCjii85H6GjtTeDtTdjvX
rXCOgRAuPhExibU8zAL8g/OLaOqEvhOOJ+SxtrSSZdcO8BdY5aPbXguRgCJC9Tfw24tw
oXuRC4IxSyia+VQss981odNkN+BrxAy9oXqq89g6BLW7aTvfkXC1F/9MGbw/FEbxvO3I
Fm9Q==
Received: by 10.152.105.68 with SMTP id gk4mr1152631lab.48.1351852466871;
Fri, 02 Nov 2012 03:34:26 -0700 (PDT)
Return-Path: <ru31337@gmail.com>
Received: from [192.168.0.100] (xx-xx-xx-xx
[xx.xx.xx.xx]) by mx.google.com with ESMTPS id
i7sm3080875lbg.13.2012.11.02.03.34.24 (version=SSLv3 cipher=OTHER);
Fri, 02 Nov 2012 03:34:25 -0700 (PDT)
Message-ID: <5093A1AB.6080803@gmail.com>
Date: Fri, 2 Nov 2012 14:34:19 +0400
From: =?UTF-8?B?0JjQstCw0L0g0JbRg9GA0LDQstC70ZHQsg==?= <ru31337@gmail.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2
MIME-Version: 1.0
To: <zeronights@gaz-is.ru>
Subject: =?UTF-8?B?0KPRj9C30LLQuNC80L7RgdGC0YwgZ2F6LWlzLnJ1?=
X-Enigmail-Version: 1.4.5
Content-Type: multipart/signed; micalg=pgp-sha1;
protocol=«application/pgp-signature»;
boundary="------------enig96F5928AA2611097CBDD9D52"
X-Brightmail-Tracker: H4sIAAAAAAAAA01Tf2xTVRTe6evaS+kdd6+0XOpItJnRoQxIiI4ohH8wM5hYEyURQ/Ate6yF
t6689zq36R/dUMw2dPLDIZ3sh0ScsGwTJwxQlOIkEH4NQmEaJZtG3ZI5AzpMZsR733td+8/J
ud93zznf+e57SBCvIT+Sa3RZjUhKwOGyD7808vmST7r2BJeNnBdLvp0edq6B0n9m/s0NwgbX
0+WyEq6W1aWrX3WFjrc+E73xQs3NgX4hDvXPN8EcRMkKmmrYDk3gQkCagTbeb3OahI9e/anP
wQmRDAAd2H/DZh5agB4cHBL4LTtpy6W3rm/huUhq6KWpBJj5g3TH4Sm7WXAPaNtHHzo4gcmj
9IM337eKH6ZnGn41cgd5jia799l57iXrac+XSZt5P5+e3/+Lgc8nlI7v3GnI85BVdN9oi82U
upBOTk0IfJhA3gV6dvuM8z0QE1n1iWwuAYgdHqF97cYdgTxE9zaPOs18Fe3tnbKbeTGdnHnH
ylfSvsE7zk5wHoZ50SpNX15cIdUtCWvFauwosGf4phvyBmH3YEkSCIKAG//eszso5krVWm1l
EtYhW8CL17XvCYp5ZVXltSFJC21SY4qsBebjpk4G41m4LKZsDfix1MFQzywakV/TFFln756E
QqZnrP/IVfDbI1URmbU4182G4XKptk5Wq8zGSXgA2QMLcFHerqBIKiRd3irLUVlNszbkTMKL
CAUonuYC8lW5Qq7ZHFb09B1W3LyDMSSbMdQtwkVrGOHLJrIF2tAcHlxJKEVuJk/o4htqUalS
C1dYzT34U76hO40ajRfiOu6RmAYzTS9APaD6Pw6MAkp1tLN4spPHH1q7WPzrNo/3eBQNS/wL
8BW+FOGNQrHI7E5+H/7qEvNqXhbBJ/sLcHWcFXiz8Mzw9H92DRb5PRhycnJEN7OyMqxby1j8
95BnzbeAMchHfzpFh8umxki5+VwTsJZ9IB58lwt0hyN6xhMRH+OezLVAwxJqYvkWlhE1wcy1
MXMLS3Zxc3VJzzb3RNww10Itc0/GDXMtMNPKH4fVLeGhz4oTY2c3N77sUVc8dufH+kOnCo5d
HJFSR/c+ddfbdfribweW+VLRjU9+UfBds1tpPZhq9PSG3yq93Hj867cPnXj9iS3RlXH3Uu/j
kz3THzecuh9b+7OilBWt3zYcGmrV5p4eF7yl4//9ff1KW/SWxxfv1xc/O/xKx+0z594oJFQN
2LWQtHyxoGrS/0xfPjvlBAAA
Reporting-MTA: dns;gaz-is.ru
Received-From-MTA: dns;post1.gaz-is.ru
Arrival-Date: Fri, 2 Nov 2012 10:34:46 +0000
Final-Recipient: rfc822;zeronights@gaz-is.ru
Action: failed
Status: 5.2.0
Diagnostic-Code: smtp;554 5.2.0 STOREDRV.Deliver.Exception:AccessDeniedException.MapiExceptionNotAuthorized; Failed to process message due to a permanent exception with message Cannot complete delivery-time processing. 16.55847:AB340000, 17.43559:00000000A6020000000000000F00000000000000, 255.23226:00000000, 255.27962:0A000000, 255.27962:0E000000, 255.27962:0A000000, 255.27962:9E000000, 255.17082:D6040000, 0.18273:00000000, 4.21921:D6040000, 255.27962:FA000000, 255.1494:43000000, 255.1238:4F000000, 4.13800:0F010480, 4.9448:0F010480, 0.25720:B0840110, 4.7716:0F010480, 2.22787:00000000, 4.13800:0F010480, 4.9448:0F010480, 0.25720:0300DD3F, 4.7716:0F010480, 0.17692:0F010480, 6.5587:0F01048002014D0E0F010480, 4.33375:0F010480, 2.17597:00000000, 2.22787:00000000, 4.13032:0F010480, 2.22787:00000000, 4.13032:0F010480, 0.26000:0F010480, 4.4580:05000780, 0.26640:0F010480, 4.4408:05000780, 4.7637:D8040000, 0.49797:0F010480, 4.5093:D6040000, 4.5318:D6040000, 4.10104:D6040000, 0.57449:0F010480, 4.6
025:05000780, 4.5257:05000780, 4.4606:D6040000, 255.1750:0F010480, 0.26849:0F010480, 255.21817:D6040000
Очевидно были реализованы смс-подписки. Так что сделайте нотифи своим пользователям, если у кого деньги с телефона начали списывать.
у вас все функции созданы с 2 параметрами и везде обязательно понатыканы return; которые на самом деле не нужны будут если придерживаться рекомендациям разработки в express (connect), а именно использования параметров с возвратом ошибок и единой обработкой их, тогда ваши функции станут выглядеть вот так:
и по ссылке посмотрите примеры обработчиков, который добавите в конец после всех роутов, тогда они будут перехватываться в случаи ошибки и будет единый обработчик, который можно стилизировать под json или html или и то и то прописав логику. А если пойти дальше, то можно унаследовать свои функции от Error и сделать разновидности ошибок, я использую например так:
Вообще в большинстве случаев при разработке любого проекта, аналогов которого нет, то есть реально новый функционал, которые необходим заказчику, а тот в свою очередь если не программист никак не может продумать всей архитектуры, а особенно объяснить все детали проект-менеджеру. В таких случаях всегда разрабатывается прототип и подгоняется его работа под требования без всяких свистелок и прочей мешуры, должно просто выполнять основные задачи для работы данного проекта. И только потом на основе этого прототипа создаётся архитектура и всё это обвешивается классами и рефакторится 10 раз. Все выводы из собственного опыта автоматизации разного рода бизнеса, когда понять задачу было просто очень сложно понять изначально всех мелочей каждого бизнес-процесса, всё это только в процессе предварительного тестирования и запуска прототипа возможно выявить.