avatars.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. var logging = require("../logging");
  2. var helpers = require("../helpers");
  3. var config = require("../config");
  4. var skins = require("../skins");
  5. var cache = require("../cache");
  6. var path = require("path");
  7. function handle_default(img_status, userId, size, def, err, callback) {
  8. if (def && def !== "steve" && def !== "alex") {
  9. callback({
  10. status: img_status,
  11. redirect: def,
  12. err: err
  13. });
  14. } else {
  15. def = def || skins.default_skin(userId);
  16. skins.resize_img(path.join(__dirname, "..", "public", "images", def + ".png"), size, function(resize_err, image) {
  17. callback({
  18. status: img_status,
  19. body: image,
  20. type: "image/png",
  21. hash: def,
  22. err: resize_err || err
  23. });
  24. });
  25. }
  26. }
  27. // GET avatar request
  28. module.exports = function(req, callback) {
  29. var userId = (req.url.path_list[1] || "").split(".")[0];
  30. var size = parseInt(req.url.query.size) || config.default_size;
  31. var def = req.url.query.default;
  32. var helm = req.url.query.hasOwnProperty("helm");
  33. // Prevent app from crashing/freezing
  34. if (size < config.min_size || size > config.max_size) {
  35. // "Unprocessable Entity", valid request, but semantically erroneous:
  36. // https://tools.ietf.org/html/rfc4918#page-78
  37. callback({
  38. status: -2,
  39. body: "Invalid Size"
  40. });
  41. return;
  42. } else if (!helpers.id_valid(userId)) {
  43. callback({
  44. status: -2,
  45. body: "Invalid userid"
  46. });
  47. return;
  48. }
  49. // strip dashes
  50. userId = userId.replace(/-/g, "");
  51. try {
  52. helpers.get_avatar(req.id, userId, helm, size, function(err, status, image, hash) {
  53. if (err) {
  54. logging.error(req.id, err);
  55. if (err.code === "ENOENT") {
  56. // no such file
  57. cache.remove_hash(req.id, userId);
  58. }
  59. }
  60. if (image) {
  61. callback({
  62. status: status,
  63. body: image,
  64. type: "image/png",
  65. err: err,
  66. hash: hash
  67. });
  68. } else {
  69. handle_default(status, userId, size, def, err, callback);
  70. }
  71. });
  72. } catch(e) {
  73. logging.error(req.id, "error:", e.stack);
  74. handle_default(-1, userId, size, def, e, callback);
  75. }
  76. };