FEATURE: Remove deprecated uploads url site settings.

The site settings have been replaced with direct image upload since
Discourse 2.3.
This commit is contained in:
Guo Xiang Tan 2020-06-17 16:50:50 +08:00
parent 516a03be09
commit 3370ef188e
No known key found for this signature in database
GPG Key ID: FBD110179AAC1F20
11 changed files with 0 additions and 388 deletions

View File

@ -1,92 +0,0 @@
# frozen_string_literal: true
module Jobs
class MigrateUrlSiteSettings < ::Jobs::Onceoff
SETTINGS = [
['logo_url', 'logo'],
['logo_small_url', 'logo_small'],
['digest_logo_url', 'digest_logo'],
['mobile_logo_url', 'mobile_logo'],
['large_icon_url', 'large_icon'],
['favicon_url', 'favicon'],
['apple_touch_icon_url', 'apple_touch_icon'],
['default_opengraph_image_url', 'opengraph_image'],
['twitter_summary_large_image_url', 'twitter_summary_large_image'],
['push_notifications_icon_url', 'push_notifications_icon'],
]
def execute_onceoff(args)
SETTINGS.each do |old_setting, new_setting|
upload = SiteSetting.get(new_setting)
next if upload && upload.id >= Upload::SEEDED_ID_THRESHOLD
old_url = DB.query_single(
"SELECT value FROM site_settings WHERE name = '#{old_setting}'"
).first
next if old_url.blank?
count = 0
file = nil
sleep_interval = 5
loop do
url = UrlHelper.absolute_without_cdn(old_url)
begin
file = FileHelper.download(
url,
max_file_size: [
SiteSetting.max_image_size_kb.kilobytes,
20.megabytes
].max,
tmp_file_name: 'tmp_site_setting_logo',
skip_rate_limit: true,
follow_redirect: true
)
rescue OpenURI::HTTPError,
OpenSSL::SSL::SSLError,
Net::OpenTimeout,
Net::ReadTimeout,
Errno::ECONNREFUSED,
EOFError,
SocketError,
Discourse::InvalidParameters => e
logger.warn(
"Error encountered when trying to download file " +
"for #{new_setting}.\n#{e.class}: #{e.message}\n#{e.backtrace.join("\n")}"
)
end
count += 1
break if file || (file.blank? && count >= 3)
logger.info(
"Failed to download upload from #{url} for #{new_setting}. Retrying..."
)
sleep(count * sleep_interval)
end
next if file.blank?
upload = UploadCreator.new(
file,
"#{new_setting}",
origin: UrlHelper.absolute(old_url),
for_site_setting: true
).create_for(Discourse.system_user.id)
SiteSetting.set(new_setting, upload)
end
end
private
def logger
Rails.logger
end
end
end

View File

@ -1,16 +0,0 @@
# frozen_string_literal: true
module Jobs
class CleanUpDeprecatedUrlSiteSettings < ::Jobs::Scheduled
every 1.day
def execute(args)
::Jobs::MigrateUrlSiteSettings::SETTINGS.each do |old_setting, new_setting|
if SiteSetting.where("name = ? AND value IS NOT NULL", new_setting).exists?
SiteSetting.set(old_setting, nil, warn: false)
SiteSetting.find_by(name: old_setting).destroy!
end
end
end
end
end

View File

@ -27,15 +27,6 @@ module Jobs
# Any URLs in site settings are fair game # Any URLs in site settings are fair game
ignore_urls = [ ignore_urls = [
SiteSetting.logo_url(warn: false),
SiteSetting.logo_small_url(warn: false),
SiteSetting.digest_logo_url(warn: false),
SiteSetting.mobile_logo_url(warn: false),
SiteSetting.large_icon_url(warn: false),
SiteSetting.favicon_url(warn: false),
SiteSetting.default_opengraph_image_url(warn: false),
SiteSetting.twitter_summary_large_image_url(warn: false),
SiteSetting.apple_touch_icon_url(warn: false),
*SiteSetting.selectable_avatars.split("\n"), *SiteSetting.selectable_avatars.split("\n"),
].flatten.map do |url| ].flatten.map do |url|
if url.present? if url.present?

View File

@ -62,30 +62,18 @@ branding:
default: -5 default: -5
client: true client: true
type: upload type: upload
logo_url:
hidden: true
default: "/images/d-logo-sketch.png"
logo_small: logo_small:
default: -6 default: -6
client: true client: true
type: upload type: upload
logo_small_url:
hidden: true
default: "/images/d-logo-sketch-small.png"
digest_logo: digest_logo:
default: "" default: ""
client: true client: true
type: upload type: upload
digest_logo_url:
hidden: true
default: ""
mobile_logo: mobile_logo:
default: "" default: ""
client: true client: true
type: upload type: upload
mobile_logo_url:
hidden: true
default: ""
large_icon: large_icon:
default: "" default: ""
client: true client: true
@ -93,35 +81,20 @@ branding:
manifest_icon: manifest_icon:
default: "" default: ""
type: upload type: upload
large_icon_url:
hidden: true
default: ""
favicon: favicon:
default: "" default: ""
client: true client: true
type: upload type: upload
favicon_url:
hidden: true
default: "/images/default-favicon.ico"
apple_touch_icon: apple_touch_icon:
default: "" default: ""
client: true client: true
type: upload type: upload
apple_touch_icon_url:
hidden: true
default: "/images/default-apple-touch-icon.png"
opengraph_image: opengraph_image:
default: "" default: ""
type: upload type: upload
default_opengraph_image_url:
hidden: true
default: ""
twitter_summary_large_image: twitter_summary_large_image:
default: "" default: ""
type: upload type: upload
twitter_summary_large_image_url:
hidden: true
default: ""
basic: basic:
display_local_time_in_user_card: display_local_time_in_user_card:
@ -300,9 +273,6 @@ basic:
push_notifications_icon: push_notifications_icon:
default: "" default: ""
type: upload type: upload
push_notifications_icon_url:
hidden: true
default: ""
short_title: short_title:
default: "" default: ""
max: 12 max: 12

View File

@ -1,42 +0,0 @@
# frozen_string_literal: true
class MigrateBlankOverrideForUploadSiteSettings < ActiveRecord::Migration[5.2]
def up
{
'logo_url' => 'logo',
'logo_small_url' => 'logo_small',
'digest_logo_url' => 'digest_logo',
'mobile_logo_url' => 'mobile_logo',
'large_icon_url' => 'large_icon',
'favicon_url' => 'favicon',
'apple_touch_icon_url' => 'apple_touch_icon',
'default_opengraph_image_url' => 'opengraph_image',
'twitter_summary_large_image_url' => 'twitter_summary_large_image',
'push_notifications_icon_url' => 'push_notifications_icon'
}.each do |old_name, new_name|
if DB.query_single("SELECT 1 FROM site_settings WHERE name = '#{old_name}' AND value = ''").present? &&
DB.query_single("SELECT 1 FROM site_settings WHERE name = '#{new_name}'").empty?
ActiveRecord::Base.connection.execute <<~SQL
INSERT INTO site_settings (
name,
data_type,
value,
created_at,
updated_at
) VALUES (
'#{new_name}',
18,
'',
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
)
SQL
end
end
end
def down
raise ActiveRecord::IrreversibleMigration
end
end

View File

@ -1,42 +0,0 @@
# frozen_string_literal: true
class MigrateNullOverrideForUploadSiteSettings < ActiveRecord::Migration[5.2]
def up
{
'logo_url' => 'logo',
'logo_small_url' => 'logo_small',
'digest_logo_url' => 'digest_logo',
'mobile_logo_url' => 'mobile_logo',
'large_icon_url' => 'large_icon',
'favicon_url' => 'favicon',
'apple_touch_icon_url' => 'apple_touch_icon',
'default_opengraph_image_url' => 'opengraph_image',
'twitter_summary_large_image_url' => 'twitter_summary_large_image',
'push_notifications_icon_url' => 'push_notifications_icon'
}.each do |old_name, new_name|
if DB.query_single("SELECT 1 FROM site_settings WHERE name = '#{old_name}' AND value IS NULL").present? &&
DB.query_single("SELECT 1 FROM site_settings WHERE name = '#{new_name}'").empty?
ActiveRecord::Base.connection.execute <<~SQL
INSERT INTO site_settings (
name,
data_type,
value,
created_at,
updated_at
) VALUES (
'#{new_name}',
18,
'',
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
)
SQL
end
end
end
def down
raise ActiveRecord::IrreversibleMigration
end
end

View File

@ -4,16 +4,6 @@ module SiteSettings; end
module SiteSettings::DeprecatedSettings module SiteSettings::DeprecatedSettings
SETTINGS = [ SETTINGS = [
['logo_url', 'logo', false, '2.3'],
['logo_small_url', 'logo_small', false, '2.3'],
['digest_logo_url', 'digest_logo', false, '2.3'],
['mobile_logo_url', 'mobile_logo', false, '2.3'],
['large_icon_url', 'large_icon', false, '2.3'],
['favicon_url', 'favicon', false, '2.3'],
['apple_touch_icon_url', 'apple_touch_icon', false, '2.3'],
['default_opengraph_image_url', 'opengraph_image', false, '2.3'],
['twitter_summary_large_image_url', 'twitter_summary_large_image', false, '2.3'],
['push_notifications_icon_url', 'push_notifications_icon', false, '2.3'],
['show_email_on_profile', 'moderators_view_emails', true, '2.4'], ['show_email_on_profile', 'moderators_view_emails', true, '2.4'],
['allow_moderators_to_create_categories', 'moderators_create_categories', true, '2.4'], ['allow_moderators_to_create_categories', 'moderators_create_categories', true, '2.4'],
['disable_edit_notifications', 'disable_system_edit_notifications', true, '2.4'] ['disable_edit_notifications', 'disable_system_edit_notifications', true, '2.4']

View File

@ -17,7 +17,6 @@ RSpec.describe DiscourseNarrativeBot::CertificateGenerator do
describe 'when SiteSetting.site_logo_small_url is blank' do describe 'when SiteSetting.site_logo_small_url is blank' do
before do before do
SiteSetting.logo_small = '' SiteSetting.logo_small = ''
SiteSetting.logo_small_url = ''
end end
it 'should not try to fetch a image' do it 'should not try to fetch a image' do

View File

@ -1,30 +0,0 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe Jobs::CleanUpDeprecatedUrlSiteSettings do
before do
@original_provider = SiteSetting.provider
SiteSetting.provider = SiteSettings::DbProvider.new(SiteSetting)
end
after do
SiteSetting.delete_all
SiteSetting.provider = @original_provider
end
it 'should clean up the old deprecated site settings correctly' do
logo_upload = Fabricate(:upload)
SiteSetting.logo = logo_upload
SiteSetting.set("logo_url", '/test/some/url', warn: false)
SiteSetting.set("logo_small_url", '/test/another/url', warn: false)
expect do
described_class.new.execute({})
end.to change { SiteSetting.logo_url }.from("/test/some/url").to("")
expect(SiteSetting.exists?(name: "logo_url")).to eq(false)
expect(SiteSetting.logo).to eq(logo_upload)
expect(SiteSetting.logo_small_url).to eq('/test/another/url')
end
end

View File

@ -127,60 +127,18 @@ describe Jobs::CleanUpUploads do
end end
it "does not clean up uploads with URLs used in site settings" do it "does not clean up uploads with URLs used in site settings" do
logo_upload = fabricate_upload
logo_small_upload = fabricate_upload
digest_logo_upload = fabricate_upload
mobile_logo_upload = fabricate_upload
large_icon_upload = fabricate_upload
default_opengraph_image_upload = fabricate_upload
twitter_summary_large_image_upload = fabricate_upload
favicon_upload = fabricate_upload
apple_touch_icon_upload = fabricate_upload
avatar1_upload = fabricate_upload avatar1_upload = fabricate_upload
avatar2_upload = fabricate_upload avatar2_upload = fabricate_upload
SiteSetting.logo_url = logo_upload.url
SiteSetting.logo_small_url = logo_small_upload.url
SiteSetting.digest_logo_url = digest_logo_upload.url
SiteSetting.mobile_logo_url = mobile_logo_upload.url
SiteSetting.large_icon_url = large_icon_upload.url
SiteSetting.default_opengraph_image_url = default_opengraph_image_upload.url
SiteSetting.twitter_summary_large_image_url =
twitter_summary_large_image_upload.url
SiteSetting.favicon_url = favicon_upload.url
SiteSetting.apple_touch_icon_url = apple_touch_icon_upload.url
SiteSetting.selectable_avatars = [avatar1_upload.url, avatar2_upload.url].join("\n") SiteSetting.selectable_avatars = [avatar1_upload.url, avatar2_upload.url].join("\n")
Jobs::CleanUpUploads.new.execute(nil) Jobs::CleanUpUploads.new.execute(nil)
expect(Upload.exists?(id: expired_upload.id)).to eq(false) expect(Upload.exists?(id: expired_upload.id)).to eq(false)
expect(Upload.exists?(id: logo_upload.id)).to eq(true)
expect(Upload.exists?(id: logo_small_upload.id)).to eq(true)
expect(Upload.exists?(id: digest_logo_upload.id)).to eq(true)
expect(Upload.exists?(id: mobile_logo_upload.id)).to eq(true)
expect(Upload.exists?(id: large_icon_upload.id)).to eq(true)
expect(Upload.exists?(id: default_opengraph_image_upload.id)).to eq(true)
expect(Upload.exists?(id: twitter_summary_large_image_upload.id)).to eq(true)
expect(Upload.exists?(id: favicon_upload.id)).to eq(true)
expect(Upload.exists?(id: apple_touch_icon_upload.id)).to eq(true)
expect(Upload.exists?(id: avatar1_upload.id)).to eq(true) expect(Upload.exists?(id: avatar1_upload.id)).to eq(true)
expect(Upload.exists?(id: avatar2_upload.id)).to eq(true) expect(Upload.exists?(id: avatar2_upload.id)).to eq(true)
end end
it "does not clean up uploads in site settings when they use the CDN" do
Discourse.stubs(:asset_host).returns("//my.awesome.cdn")
logo_small_upload = fabricate_upload
SiteSetting.logo_small_url = "#{Discourse.asset_host}#{logo_small_upload.url}"
Jobs::CleanUpUploads.new.execute(nil)
expect(Upload.exists?(id: expired_upload.id)).to eq(false)
expect(Upload.exists?(id: logo_small_upload.id)).to eq(true)
end
it "does not delete profile background uploads" do it "does not delete profile background uploads" do
profile_background_upload = fabricate_upload profile_background_upload = fabricate_upload
UserProfile.last.upload_profile_background(profile_background_upload) UserProfile.last.upload_profile_background(profile_background_upload)

View File

@ -1,74 +0,0 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe Jobs::MigrateUrlSiteSettings do
before do
SiteSetting.authorized_extensions = ''
end
it 'should migrate to the new upload site settings correctly' do
[
%w{logo_url /test.png},
%w{logo_small_url https://test.discourse.awesome/test.png},
%w{favicon_url http://test.discourse.awesome/some.ico},
%w{digest_logo_url /test.png},
%w{mobile_logo_url /test.png},
%w{large_icon_url /test.png},
%w{apple_touch_icon_url /test.png},
%w{default_opengraph_image_url /test.png},
%w{twitter_summary_large_image_url //omg.aws.somestack/test.png},
%w{push_notifications_icon_url //omg.aws.somestack/test.png}
].each do |name, value|
SiteSetting.create!(
name: name,
value: value,
data_type: SiteSettings::TypeSupervisor.types[:string]
)
end
%w{
http://test.localhost/test.png
https://omg.aws.somestack/test.png
}.each do |url|
stub_request(:get, url).to_return(
status: 200, body: file_from_fixtures("smallest.png").read
)
end
stub_request(:get, "https://test.discourse.awesome/test.png")
.to_return(status: 200, body: file_from_fixtures("downsized.png").read)
stub_request(:get, "http://test.discourse.awesome/some.ico")
.to_return(status: 200, body: file_from_fixtures("smallest.ico").read)
expect do
described_class.new.execute_onceoff({})
end.to change { Upload.count }.by(3)
upload = Upload.find_by(original_filename: "logo.png")
upload2 = Upload.find_by(original_filename: "logo_small.png")
upload3 = Upload.find_by(original_filename: "favicon.ico")
expect(SiteSetting.logo_small).to eq(upload2)
expect(SiteSetting.logo_small.is_a?(Upload)).to eq(true)
expect(SiteSetting.favicon).to eq(upload3)
expect(SiteSetting.favicon.is_a?(Upload)).to eq(true)
%i{
logo
digest_logo
mobile_logo
large_icon
apple_touch_icon
opengraph_image
twitter_summary_large_image
push_notifications_icon
}.each do |setting|
expect(SiteSetting.get(setting)).to eq(upload)
expect(SiteSetting.get(setting).is_a?(Upload)).to eq(true)
end
end
end