cloudflare: fix purging of cached urls.

* Switch CloudflareService from HttpartyCache to Danbooru::Http.

* Purge cached urls from Cloudflare when a post is replaced and the md5
  doesn't change. This happens when a corrupted image is replaced or
  thumbnails are regenerated. Before we purged urls when a post was
  expunged, which was unneeded because those urls can expire naturally.
  It was also wrong because the subdomains were hardcoded, the urls used
  http:// instead of https://, and we didn't account for tagged urls.
This commit is contained in:
evazion
2019-12-15 14:03:15 -06:00
parent 15d737d68b
commit 518de2fdec
4 changed files with 37 additions and 39 deletions

View File

@@ -1,48 +1,32 @@
# donmai.us specific
class CloudflareService
attr_reader :api_token, :zone
def initialize(api_token: Danbooru.config.cloudflare_api_token, zone: Danbooru.config.cloudflare_zone)
@api_token, @zone = api_token, zone
end
def enabled?
api_token.present? && zone.present?
end
def api_token
Danbooru.config.cloudflare_api_token
end
def zone
Danbooru.config.cloudflare_zone
end
def options
Danbooru.config.httparty_options.deep_merge(headers: {
"Authorization" => "Bearer #{api_token}",
"Content-Type" => "application/json",
"User-Agent" => "#{Danbooru.config.canonical_app_name}/#{Rails.application.config.x.git_hash}"
})
end
def ips(expiry: 24.hours)
text, code = HttpartyCache.get("https://api.cloudflare.com/client/v4/ips", expiry: expiry)
return [] if code != 200
response = Danbooru::Http.cache(expiry).get("https://api.cloudflare.com/client/v4/ips")
return [] if response.code != 200
json = JSON.parse(text, symbolize_names: true)
ips = json[:result][:ipv4_cidrs] + json[:result][:ipv6_cidrs]
result = response.parse["result"]
ips = result["ipv4_cidrs"] + result["ipv6_cidrs"]
ips.map { |ip| IPAddr.new(ip) }
end
def delete(md5, ext)
def purge_cache(urls)
return unless enabled?
url = "https://api.cloudflare.com/client/v4/zones/#{zone}/purge_cache"
files = ["#{md5}.#{ext}", "preview/#{md5}.jpg", "sample/sample-#{md5}.jpg"].map do |name|
["danbooru", "safebooru", "raikou1", "raikou2", "raikou3", "raikou4"].map do |subdomain|
"http://#{subdomain}.donmai.us/data/#{name}"
end
end.flatten
body = {
"files" => files
}.to_json
cloudflare = Danbooru::Http.headers(
"Authorization" => "Bearer #{api_token}",
"Content-Type" => "application/json"
)
HTTParty.delete(url, options.merge(body: body)) #, body: body)
url = "https://api.cloudflare.com/client/v4/zones/#{zone}/purge_cache"
cloudflare.delete(url, json: { files: urls })
end
end