diff --git a/app/controllers/admin/emojis_controller.rb b/app/controllers/admin/emojis_controller.rb index 3a7c358b239..7d51acba4f9 100644 --- a/app/controllers/admin/emojis_controller.rb +++ b/app/controllers/admin/emojis_controller.rb @@ -28,9 +28,12 @@ class Admin::EmojisController < Admin::AdminController data = if upload.persisted? - custom_emoji = CustomEmoji.new(name: name, upload: upload, group: group) + custom_emoji = + CustomEmoji.new(name: name, upload: upload, group: group, user: current_user) if custom_emoji.save + StaffActionLogger.new(current_user).log_custom_emoji_create(name, group: group) + Emoji.clear_cache { name: custom_emoji.name, url: custom_emoji.upload.url, group: group } else @@ -50,7 +53,12 @@ class Admin::EmojisController < Admin::AdminController name = params.require(:id) # NOTE: the upload will automatically be removed by the 'clean_up_uploads' job - CustomEmoji.find_by(name: name)&.destroy! + emoji = CustomEmoji.find_by(name: name) + + if emoji.present? + StaffActionLogger.new(current_user).log_custom_emoji_destroy(name) + emoji.destroy! + end Emoji.clear_cache diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb index 61a0334aeb9..95297bb9daf 100644 --- a/app/models/custom_emoji.rb +++ b/app/models/custom_emoji.rb @@ -2,17 +2,27 @@ class CustomEmoji < ActiveRecord::Base belongs_to :upload + belongs_to :user has_many :upload_references, as: :target, dependent: :destroy validates :name, presence: true, uniqueness: true validates :upload_id, presence: true + validates :user_id, presence: true + + before_validation :set_default_user_id, on: :create after_save do if saved_change_to_upload_id? UploadReference.ensure_exist!(upload_ids: [self.upload_id], target: self) end end + + private + + def set_default_user_id + self.user_id ||= Discourse.system_user.id + end end # == Schema Information @@ -25,6 +35,7 @@ end # created_at :datetime not null # updated_at :datetime not null # group :string(20) +# user_id :integer default(-1), not null # # Indexes # diff --git a/app/models/user_history.rb b/app/models/user_history.rb index 873fa573176..85a2ef601b9 100644 --- a/app/models/user_history.rb +++ b/app/models/user_history.rb @@ -148,6 +148,8 @@ class UserHistory < ActiveRecord::Base filled_in_required_fields: 109, topic_slow_mode_set: 110, topic_slow_mode_removed: 111, + custom_emoji_create: 112, + custom_emoji_destroy: 113, ) end @@ -258,6 +260,8 @@ class UserHistory < ActiveRecord::Base delete_watched_word_group topic_slow_mode_set topic_slow_mode_removed + custom_emoji_create + custom_emoji_destroy ] end diff --git a/app/services/staff_action_logger.rb b/app/services/staff_action_logger.rb index 010573c813b..cb222672cc3 100644 --- a/app/services/staff_action_logger.rb +++ b/app/services/staff_action_logger.rb @@ -1030,6 +1030,20 @@ class StaffActionLogger ) end + def log_custom_emoji_create(name, opts = {}) + opts[:details] = "Group: #{opts[:group]}" if opts[:group].present? + + UserHistory.create!( + params(opts).merge(action: UserHistory.actions[:custom_emoji_create], new_value: name), + ) + end + + def log_custom_emoji_destroy(name, opts = {}) + UserHistory.create!( + params(opts).merge(action: UserHistory.actions[:custom_emoji_destroy], previous_value: name), + ) + end + private def json_params(previous_value, new_value) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index aa8cf0d9ddc..70f1a9332ce 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -6226,6 +6226,8 @@ en: delete_flag: "delete flag" topic_slow_mode_set: "set topic slow mode" topic_slow_mode_removed: "remove topic slow mode" + custom_emoji_create: "create custom emoji" + custom_emoji_destroy: "delete custom emoji" screened_emails: title: "Screened Emails" description: "When someone tries to create a new account, the following email addresses will be checked and the registration will be blocked, or some other action performed." diff --git a/db/migrate/20240722025822_add_user_id_to_custom_emojis.rb b/db/migrate/20240722025822_add_user_id_to_custom_emojis.rb new file mode 100644 index 00000000000..770da458b33 --- /dev/null +++ b/db/migrate/20240722025822_add_user_id_to_custom_emojis.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +class AddUserIdToCustomEmojis < ActiveRecord::Migration[7.1] + def change + add_column :custom_emojis, :user_id, :integer, null: false, default: -1 + end +end diff --git a/spec/requests/admin/emojis_controller_spec.rb b/spec/requests/admin/emojis_controller_spec.rb index 7491dd37975..ec19f0d08e1 100644 --- a/spec/requests/admin/emojis_controller_spec.rb +++ b/spec/requests/admin/emojis_controller_spec.rb @@ -101,6 +101,23 @@ RSpec.describe Admin::EmojisController do expect(data["name"]).to eq(custom_emoji.name) expect(data["url"]).to eq(upload.url) expect(custom_emoji.group).to eq(nil) + expect(custom_emoji.user_id).to eq(admin.id) + end + + it "should log the action" do + Emoji.expects(:clear_cache) + + post "/admin/customize/emojis.json", + params: { + name: "test", + file: fixture_file_upload("#{Rails.root}/spec/fixtures/images/logo.png"), + } + + last_log = UserHistory.last + + expect(last_log.action).to eq(UserHistory.actions[:custom_emoji_create]) + expect(last_log.acting_user_id).to eq(admin.id) + expect(last_log.new_value).to eq("test") end it "should allow an admin to add a custom emoji with a custom group" do @@ -196,6 +213,19 @@ RSpec.describe Admin::EmojisController do delete "/admin/customize/emojis/#{custom_emoji.name}.json", params: { name: "test" } end.to change { CustomEmoji.count }.by(-1) end + + it "should log the action" do + custom_emoji = CustomEmoji.create!(name: "test", upload: upload) + Emoji.clear_cache + + delete "/admin/customize/emojis/#{custom_emoji.name}.json", params: { name: "test" } + + last_log = UserHistory.last + + expect(last_log.action).to eq(UserHistory.actions[:custom_emoji_destroy]) + expect(last_log.acting_user_id).to eq(admin.id) + expect(last_log.previous_value).to eq("test") + end end shared_examples "custom emoji deletion not allowed" do