2024-02-25 12:15:55 -05:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2019-02-07 00:08:03 -05:00
|
|
|
class UploadWhitelist < ApplicationRecord
|
|
|
|
before_save :clean_pattern
|
|
|
|
after_save :clear_cache
|
|
|
|
|
2019-09-05 08:59:51 -04:00
|
|
|
validates :pattern, presence: true
|
|
|
|
validates :pattern, uniqueness: true
|
2023-12-17 14:16:58 -05:00
|
|
|
validates :pattern, format: { with: %r{\A[a-zA-Z0-9.%:_\-*\/?&]+\z} }
|
2019-02-07 00:08:03 -05:00
|
|
|
after_create do |rec|
|
2019-04-17 22:13:26 -04:00
|
|
|
ModAction.log(:upload_whitelist_create, {pattern: rec.pattern, note: rec.note, hidden: rec.hidden})
|
2019-02-07 00:08:03 -05:00
|
|
|
end
|
|
|
|
after_save do |rec|
|
2019-07-22 19:57:26 -04:00
|
|
|
ModAction.log(:upload_whitelist_update, {pattern: rec.pattern, note: rec.note, old_pattern: rec.pattern_before_last_save, hidden: rec.hidden})
|
2019-02-07 00:08:03 -05:00
|
|
|
end
|
|
|
|
after_destroy do |rec|
|
2019-04-17 22:13:26 -04:00
|
|
|
ModAction.log(:upload_whitelist_delete, {pattern: rec.pattern, note: rec.note, hidden: rec.hidden})
|
2019-02-07 00:08:03 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def clean_pattern
|
|
|
|
self.pattern = self.pattern.downcase.tr('%', '*')
|
|
|
|
end
|
|
|
|
|
|
|
|
def clear_cache
|
|
|
|
Cache.delete('upload_whitelist')
|
|
|
|
end
|
|
|
|
|
2022-04-21 13:19:25 -04:00
|
|
|
module SearchMethods
|
|
|
|
def default_order
|
|
|
|
order("upload_whitelists.note")
|
2019-02-07 00:08:03 -05:00
|
|
|
end
|
|
|
|
|
2022-04-21 13:19:25 -04:00
|
|
|
def search(params)
|
|
|
|
q = super
|
2019-02-07 00:08:03 -05:00
|
|
|
|
2022-04-21 13:19:25 -04:00
|
|
|
if params[:pattern].present?
|
|
|
|
q = q.where("pattern ILIKE ?", params[:pattern].to_escaped_for_sql_like)
|
|
|
|
end
|
|
|
|
|
|
|
|
if params[:note].present?
|
|
|
|
q = q.where("note ILIKE ?", params[:note].to_escaped_for_sql_like)
|
|
|
|
end
|
|
|
|
|
|
|
|
case params[:order]
|
|
|
|
when "pattern"
|
|
|
|
q = q.order("upload_whitelists.pattern")
|
|
|
|
when "updated_at"
|
|
|
|
q = q.order("upload_whitelists.updated_at desc")
|
|
|
|
when "created_at"
|
|
|
|
q = q.order("id desc")
|
|
|
|
else
|
2023-07-07 08:32:57 -04:00
|
|
|
q = q.apply_basic_order(params)
|
2022-04-21 13:19:25 -04:00
|
|
|
end
|
2019-02-07 13:05:50 -05:00
|
|
|
|
2022-04-21 13:19:25 -04:00
|
|
|
q
|
|
|
|
end
|
2019-02-07 00:08:03 -05:00
|
|
|
end
|
|
|
|
|
2022-11-29 13:14:09 -05:00
|
|
|
def self.is_whitelisted?(url)
|
2023-05-19 16:53:20 -04:00
|
|
|
entries = Cache.fetch("upload_whitelist", expires_in: 6.hours) do
|
2019-02-07 00:08:03 -05:00
|
|
|
all
|
|
|
|
end
|
|
|
|
|
|
|
|
if Danbooru.config.bypass_upload_whitelist?(CurrentUser)
|
|
|
|
return [true, 'bypassed']
|
|
|
|
end
|
|
|
|
|
|
|
|
entries.each do |x|
|
2024-06-27 18:27:08 -04:00
|
|
|
if File.fnmatch?(x.pattern, url, File::FNM_CASEFOLD)
|
2019-02-07 00:08:03 -05:00
|
|
|
return [x.allowed, x.reason]
|
|
|
|
end
|
|
|
|
end
|
2024-04-27 17:01:10 -04:00
|
|
|
[false, "#{url.host} not in whitelist"]
|
2019-02-07 00:08:03 -05:00
|
|
|
end
|
2022-04-21 13:19:25 -04:00
|
|
|
|
|
|
|
extend SearchMethods
|
2019-02-07 00:08:03 -05:00
|
|
|
end
|