avatars.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. logging.debug(req.id, "userid:", userId);
  52. try {
  53. helpers.get_avatar(req.id, userId, helm, size, function(err, status, image, hash) {
  54. if (err) {
  55. logging.error(req.id, err);
  56. if (err.code === "ENOENT") {
  57. // no such file
  58. cache.remove_hash(req.id, userId);
  59. }
  60. }
  61. if (image) {
  62. callback({
  63. status: status,
  64. body: image,
  65. type: "image/png",
  66. err: err,
  67. hash: hash
  68. });
  69. } else {
  70. handle_default(status, userId, size, def, err, callback);
  71. }
  72. });
  73. } catch(e) {
  74. logging.error(req.id, "error:", e.stack);
  75. handle_default(-1, userId, size, def, e, callback);
  76. }
  77. };