post.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. var url = require('url');
  2. var fs = require('fs');
  3. var logger = require('../tools/logger');
  4. var danmaku = require('../models/danmaku');
  5. var redis = require('../tools/redis');
  6. function htmlEncode(str) {
  7. return str.replace(/&/g, "&")
  8. .replace(/</g, "&lt;")
  9. .replace(/>/g, "&gt;")
  10. .replace(/"/g, "&quot;")
  11. .replace(/'/g, "&#x27;")
  12. .replace(/\//g, "&#x2f;");
  13. }
  14. var postIP = [];
  15. module.exports = function (req, res) {
  16. var body = '';
  17. var jsonStr;
  18. var ip = req.headers['x-forwarded-for'] ||
  19. req.connection.remoteAddress ||
  20. req.socket.remoteAddress ||
  21. req.connection.socket.remoteAddress;
  22. // check black ip
  23. var blanklist = fs.readFileSync('blacklist').toString().split('\n');
  24. if (blanklist.indexOf(ip.split(',')[0]) !== -1) {
  25. logger.info(`Reject POST form ${ip} for black ip.`);
  26. res.send(`{"code": -1, "msg": "Rejected for black ip."}`);
  27. return;
  28. }
  29. // frequency limitation
  30. if (postIP.indexOf(ip) !== -1) {
  31. logger.info(`Reject POST form ${ip} for frequent operation.`);
  32. res.send(`{"code": -2, "msg": "Rejected for frequent operation."}`);
  33. return;
  34. }
  35. else {
  36. postIP.push(ip);
  37. setTimeout(function () {
  38. postIP.splice(0, 1);
  39. }, 1000);
  40. }
  41. req.on('data', dataListener);
  42. req.on('end', endListener);
  43. function dataListener (chunk) {
  44. body += chunk;
  45. }
  46. function endListener () {
  47. cleanListener();
  48. try {
  49. jsonStr = JSON.parse(body);
  50. } catch (err) {
  51. jsonStr = null;
  52. }
  53. // check data
  54. if (jsonStr.player === undefined
  55. || jsonStr.author === undefined
  56. || jsonStr.time === undefined
  57. || jsonStr.text === undefined
  58. || jsonStr.color === undefined
  59. || jsonStr.type === undefined
  60. || jsonStr.text.length >= 30) {
  61. logger.info(`Reject POST form ${ip} for illegal data: ${JSON.stringify(jsonStr)}`);
  62. res.send(`{"code": -3, "msg": "Rejected for illegal data"}`);
  63. return;
  64. }
  65. // check token: set it yourself
  66. function checkToken (token) {
  67. return true;
  68. }
  69. if (!checkToken(jsonStr.token)) {
  70. logger.info(`Rejected POST form ${ip} for illegal token: ${jsonStr.token}`);
  71. res.send(`{"code": -4, "msg": "Rejected for illegal token: ${jsonStr.token}"}`);
  72. return;
  73. }
  74. // check black username
  75. if (blanklist.indexOf(jsonStr.author) !== -1) {
  76. logger.info(`Reject POST form ${jsonStr.author} for black user.`);
  77. res.send(`{"code": -5, "msg": "Rejected for black user."}`);
  78. return;
  79. }
  80. logger.info(`POST form ${ip}, data: ${JSON.stringify(jsonStr)}`);
  81. var dan = new danmaku({
  82. player: htmlEncode(jsonStr.player),
  83. author: htmlEncode(jsonStr.author),
  84. time: jsonStr.time,
  85. text: htmlEncode(jsonStr.text),
  86. color: htmlEncode(jsonStr.color),
  87. type: htmlEncode(jsonStr.type)
  88. });
  89. dan.save(function (err, d) {
  90. if (err) {
  91. logger.error(err);
  92. res.send(`{"code": 0, "msg": "Error happens, please contact system administrator."}`);
  93. }
  94. else {
  95. res.send(`{"code": 1, "data": ${JSON.stringify(d)}}`);
  96. redis.client.del(`dplayer${htmlEncode(jsonStr.player)}`);
  97. }
  98. });
  99. }
  100. function cleanListener () {
  101. req.removeListener('data', dataListener);
  102. req.removeListener('end', endListener);
  103. }
  104. };