post.js 3.7 KB

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