The issue concerns the Emoji Picker not using CDN URLs for custom emojis, unlike admin emoji paths which are properly converted. lava identifies that standard emoji paths in the emojis_controller.rb lack CDN conversion, while admin paths use EmojiSerializer for this purpose. lava confirms that custom emojis in the post composer display S3 URLs directly instead of CDN URLs, as seen in the rendered output. sam notes the issue is specific to the emoji picker and not the UI, which already uses CDN URLs. j.jaffeux addresses the problem with a PR to enable CDN usage, but lava raises concerns about backend security, as the emojis.json endpoint exposes raw S3 URLs, which could lead to abuse and excessive billing. lava suggests returning CDN URLs directly, similar to non-custom emojis. j.jaffeux acknowledges the concern and plans to address it later. sam closes the issue, noting the risk is low due to the public and small nature of the assets, and suggests opening a new feature request for further improvements.
Thank you for your PR that enables CDN usage for custom emojis.
While your frontend fix correctly requests emoji CDN addresses, I’m concerned about backend security.
The https://meta.discourse.org/emojis.json endpoint still exposes S3 source URLs like //cdck-file-uploads-global.s3.dualstack.us-west-2.amazonaws.com/meta/original/3X/6/1/61e481320406f0f82ed780db3f04056128191613.png, which could potentially lead to malicious abuse and excessive S3 billing.
For better security, I suggest returning CDN addresses directly, similar to how non-custom emojis are handled.
Here’s my attempt at fixing the code:
class EmojisController < ApplicationController
def index
emojis = Emoji.allowed.group_by(&:group)
emojis.each do |_, emoji_list|
emoji_list.each do |emoji|
emoji.url = Discourse.store.cdn_url(emoji.url) if emoji.url.present?
end
end
render json: MultiJson.dump(emojis)
end
def search_aliases
render json: MultiJson.dump(Emoji.search_aliases)
end
end
Yes I know we do it directly for non custom emoji in emoji.rb which I would prefer than the controller. I want to ensure this is not toing to cause issues though, so I made the simplest fix for now, but will dig this in the future.