78 lines
2.1 KiB
Ruby
78 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Jobs
|
|
class OldKeysReminder < ::Jobs::Scheduled
|
|
every 1.month
|
|
|
|
OLD_CREDENTIALS_PERIOD = 2.years
|
|
|
|
def execute(_args)
|
|
return if SiteSetting.send_old_credential_reminder_days.to_i == 0
|
|
return if message_exists?
|
|
return if old_site_settings_keys.blank? && old_api_keys.blank?
|
|
|
|
PostCreator.create!(
|
|
Discourse.system_user,
|
|
title: title,
|
|
raw: body,
|
|
archetype: Archetype.private_message,
|
|
target_usernames: admins.map(&:username),
|
|
validate: false,
|
|
)
|
|
end
|
|
|
|
private
|
|
|
|
def old_site_settings_keys
|
|
@old_site_settings_keys ||=
|
|
SiteSetting
|
|
.secret_settings
|
|
.each_with_object([]) do |secret_name, old_keys|
|
|
site_setting = SiteSetting.find_by(name: secret_name)
|
|
next if site_setting&.value.blank?
|
|
next if site_setting.updated_at + OLD_CREDENTIALS_PERIOD > Time.zone.now
|
|
old_keys << site_setting
|
|
end
|
|
.sort_by { |key| key.updated_at }
|
|
end
|
|
|
|
def old_api_keys
|
|
@old_api_keys ||=
|
|
ApiKey
|
|
.all
|
|
.order(created_at: :asc)
|
|
.each_with_object([]) do |api_key, old_keys|
|
|
next if api_key.created_at + OLD_CREDENTIALS_PERIOD > Time.zone.now
|
|
old_keys << api_key
|
|
end
|
|
end
|
|
|
|
def admins
|
|
User.real.admins
|
|
end
|
|
|
|
def message_exists?
|
|
message = Topic.private_messages.with_deleted.find_by(title: title)
|
|
message &&
|
|
message.created_at + SiteSetting.send_old_credential_reminder_days.to_i.days > Time.zone.now
|
|
end
|
|
|
|
def title
|
|
I18n.t("old_keys_reminder.title")
|
|
end
|
|
|
|
def body
|
|
I18n.t("old_keys_reminder.body", keys: keys_list)
|
|
end
|
|
|
|
def keys_list
|
|
messages =
|
|
old_site_settings_keys.map { |key| "#{key.name} - #{key.updated_at.to_date.to_fs(:db)}" }
|
|
old_api_keys.each_with_object(messages) do |key, array|
|
|
array << "#{[key.description, key.user&.username, key.created_at.to_date.to_fs(:db)].compact.join(" - ")}"
|
|
end
|
|
messages.join("\n")
|
|
end
|
|
end
|
|
end
|