avatars.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. var helpers = require("../helpers");
  2. var config = require("../../config");
  3. var skins = require("../skins");
  4. var cache = require("../cache");
  5. var path = require("path");
  6. var url = require("url");
  7. function handle_default(img_status, userId, size, def, req, err, callback) {
  8. def = def || skins.default_skin(userId);
  9. var defname = def.toLowerCase();
  10. if (defname !== "steve" && defname !== "mhf_steve" && defname !== "alex" && defname !== "mhf_alex") {
  11. if (helpers.id_valid(def)) {
  12. // clean up the old URL to match new image
  13. var parsed = req.url;
  14. delete parsed.query.default;
  15. delete parsed.search;
  16. parsed.path_list[1] = def;
  17. parsed.pathname = "/" + parsed.path_list.join("/");
  18. var newUrl = url.format(parsed);
  19. callback({
  20. status: img_status,
  21. redirect: newUrl,
  22. err: err
  23. });
  24. } else {
  25. callback({
  26. status: img_status,
  27. redirect: def,
  28. err: err
  29. });
  30. }
  31. } else {
  32. // handle steve and alex
  33. def = defname;
  34. if (def.substr(0, 4) !== "mhf_") {
  35. def = "mhf_" + def;
  36. }
  37. skins.resize_img(path.join(__dirname, "..", "public", "images", def + ".png"), size, function(resize_err, image) {
  38. callback({
  39. status: img_status,
  40. body: image,
  41. type: "image/png",
  42. hash: def,
  43. err: resize_err || err
  44. });
  45. });
  46. }
  47. }
  48. // GET avatar request
  49. module.exports = function(req, callback) {
  50. var userId = (req.url.path_list[1] || "").split(".")[0];
  51. var size = parseInt(req.url.query.size) || config.avatars.default_size;
  52. var def = req.url.query.default;
  53. var overlay = req.url.query.hasOwnProperty("overlay") || req.url.query.hasOwnProperty("helm");
  54. // check for extra paths
  55. if (req.url.path_list.length > 2) {
  56. callback({
  57. status: -2,
  58. body: "Invalid Path",
  59. code: 404
  60. });
  61. return;
  62. }
  63. // Prevent app from crashing/freezing
  64. if (size < config.avatars.min_size || size > config.avatars.max_size) {
  65. // "Unprocessable Entity", valid request, but semantically erroneous:
  66. // https://tools.ietf.org/html/rfc4918#page-78
  67. callback({
  68. status: -2,
  69. body: "Invalid Size"
  70. });
  71. return;
  72. } else if (!helpers.id_valid(userId)) {
  73. callback({
  74. status: -2,
  75. body: "Invalid UserID"
  76. });
  77. return;
  78. }
  79. // strip dashes
  80. userId = userId.replace(/-/g, "");
  81. try {
  82. helpers.get_avatar(req.id, userId, overlay, size, function(err, status, image, hash) {
  83. if (err) {
  84. if (err.code === "ENOENT") {
  85. // no such file
  86. cache.remove_hash(req.id, userId);
  87. }
  88. }
  89. if (image) {
  90. callback({
  91. status: status,
  92. body: image,
  93. type: "image/png",
  94. err: err,
  95. hash: hash
  96. });
  97. } else {
  98. handle_default(status, userId, size, def, req, err, callback);
  99. }
  100. });
  101. } catch (e) {
  102. handle_default(-1, userId, size, def, req, e, callback);
  103. }
  104. };