From 506de13896843890e0fa889c54909ac04a41fac9 Mon Sep 17 00:00:00 2001 From: Maja Komel Date: Tue, 18 Jun 2019 08:25:29 +0200 Subject: [PATCH 001/250] FIX: remove temporary hack for fixed iOS bug (#7773) A bug where input focus is displaced on modals was fixed in iOS 11.3 update. This hack was causing problems on topic page since hiding main-outlet results in lost read position after opening and closing a modal. --- .../discourse/lib/show-modal.js.es6 | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/show-modal.js.es6 b/app/assets/javascripts/discourse/lib/show-modal.js.es6 index 3fa2b31fc1..f422a6273b 100644 --- a/app/assets/javascripts/discourse/lib/show-modal.js.es6 +++ b/app/assets/javascripts/discourse/lib/show-modal.js.es6 @@ -4,33 +4,6 @@ export default function(name, opts) { opts = opts || {}; const container = Discourse.__container__; - // iOS 11 -> 11.1 have broken INPUTs on position fixed - // if for any reason there is a body higher than 100% behind them. - // What happens is that when INPUTs gets focus they shift the body - // which ends up moving the cursor to an invisible spot - // this makes the login experience on iOS painful, user thinks it is broken. - // - // Also, very little value in showing main outlet and header on iOS - // anyway, so just hide it. - if (isAppleDevice()) { - let pos = $(window).scrollTop(); - $(window) - .off("show.bs.modal.ios-hacks") - .on("show.bs.modal.ios-hacks", () => { - $("#main-outlet, header").hide(); - }); - - $(window) - .off("hide.bs.modal.ios-hacks") - .on("hide.bs.modal.ios-hacks", () => { - $("#main-outlet, header").show(); - $(window).scrollTop(pos); - - $(window).off("hide.bs.modal.ios-hacks"); - $(window).off("show.bs.modal.ios-hacks"); - }); - } - // We use the container here because modals are like singletons // in Discourse. Only one can be shown with a particular state. const route = container.lookup("route:application"); From 03ba1d49fbdceaeec76301b0811daba5dca6cb94 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Tue, 18 Jun 2019 17:12:55 +1000 Subject: [PATCH 002/250] DEV: lint file We no longer need that isAppleDevice require --- app/assets/javascripts/discourse/lib/show-modal.js.es6 | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/show-modal.js.es6 b/app/assets/javascripts/discourse/lib/show-modal.js.es6 index f422a6273b..8cf5a2b0be 100644 --- a/app/assets/javascripts/discourse/lib/show-modal.js.es6 +++ b/app/assets/javascripts/discourse/lib/show-modal.js.es6 @@ -1,5 +1,3 @@ -import { isAppleDevice } from "discourse/lib/utilities"; - export default function(name, opts) { opts = opts || {}; const container = Discourse.__container__; From 6d30be1f94538218fd3f2857b11a6db766bea4fb Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Tue, 18 Jun 2019 15:52:34 +0530 Subject: [PATCH 003/250] Improve XenForo import script. - ensure only active, unbanned users are imported. - ensure only visible threads/posts are imported. --- script/import_scripts/xenforo.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/script/import_scripts/xenforo.rb b/script/import_scripts/xenforo.rb index 1b3cbcf665..7f9c06c858 100755 --- a/script/import_scripts/xenforo.rb +++ b/script/import_scripts/xenforo.rb @@ -35,13 +35,14 @@ class ImportScripts::XenForo < ImportScripts::Base def import_users puts '', "creating users" - total_count = mysql_query("SELECT count(*) count FROM #{TABLE_PREFIX}user;").first['count'] + total_count = mysql_query("SELECT count(*) count FROM #{TABLE_PREFIX}user WHERE user_state = 'valid' AND is_banned = 0;").first['count'] batches(BATCH_SIZE) do |offset| results = mysql_query( "SELECT user_id id, username, email, custom_title title, register_date created_at, last_activity last_visit_time, user_group_id, is_moderator, is_admin, is_staff FROM #{TABLE_PREFIX}user + WHERE user_state = 'valid' AND is_banned = 0 LIMIT #{BATCH_SIZE} OFFSET #{offset};") @@ -165,6 +166,8 @@ class ImportScripts::XenForo < ImportScripts::Base FROM #{TABLE_PREFIX}post p, #{TABLE_PREFIX}thread t WHERE p.thread_id = t.thread_id + AND p.message_state = 'visible' + AND t.discussion_state = 'visible' ORDER BY p.post_date LIMIT #{BATCH_SIZE}" # needs OFFSET From 6fec4982d903cbb088f95b5dcae7b67f52a90e99 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 18 Jun 2019 12:28:18 -0400 Subject: [PATCH 004/250] FIX: Couldn't modify a widget that wasn't in the registry --- app/assets/javascripts/discourse/lib/plugin-api.js.es6 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/lib/plugin-api.js.es6 b/app/assets/javascripts/discourse/lib/plugin-api.js.es6 index 1fa2f449d0..19c2c5fc0d 100644 --- a/app/assets/javascripts/discourse/lib/plugin-api.js.es6 +++ b/app/assets/javascripts/discourse/lib/plugin-api.js.es6 @@ -42,6 +42,7 @@ import { registerCustomPostMessageCallback as registerCustomPostMessageCallback1 import Sharing from "discourse/lib/sharing"; import { addComposerUploadHandler } from "discourse/components/composer-editor"; import { addCategorySortCriteria } from "discourse/components/edit-category-settings"; +import { queryRegistry } from "discourse/widgets/widget"; // If you add any methods to the API ensure you bump up this number const PLUGIN_API_VERSION = "0.8.31"; @@ -325,7 +326,9 @@ class PluginApi { * ``` **/ attachWidgetAction(widget, actionName, fn) { - const widgetClass = this.container.factoryFor(`widget:${widget}`).class; + const widgetClass = + queryRegistry(widget) || + this.container.factoryFor(`widget:${widget}`).class; widgetClass.prototype[actionName] = fn; } From e8b9f38374749993c70c702a2a70ecb4e801e310 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 18 Jun 2019 14:22:38 -0400 Subject: [PATCH 005/250] FIX: Don't allow users to edit topic information when the OP is locked see: https://meta.discourse.org/t/user-able-to-edit-title-of-locked-post/104826 --- lib/guardian/topic_guardian.rb | 4 +++- spec/components/guardian_spec.rb | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/guardian/topic_guardian.rb b/lib/guardian/topic_guardian.rb index 242cfbdb4d..e7cc4f28a9 100644 --- a/lib/guardian/topic_guardian.rb +++ b/lib/guardian/topic_guardian.rb @@ -97,7 +97,9 @@ module TopicGuardian ) return false if topic.archived - is_my_own?(topic) && !topic.edit_time_limit_expired? + is_my_own?(topic) && + !topic.edit_time_limit_expired? && + !Post.where(topic_id: topic.id, post_number: 1).where.not(locked_by_id: nil).exists? end # Recovery Method diff --git a/spec/components/guardian_spec.rb b/spec/components/guardian_spec.rb index ae6b742e30..c5c9b2bbf4 100644 --- a/spec/components/guardian_spec.rb +++ b/spec/components/guardian_spec.rb @@ -1419,6 +1419,16 @@ describe Guardian do expect(Guardian.new(coding_horror).can_edit?(topic)).to be_falsey end + context "locked" do + let(:post) { Fabricate(:post, locked_by_id: admin.id) } + let(:topic) { post.topic } + + it "doesn't allow users to edit locked topics" do + expect(Guardian.new(topic.user).can_edit?(topic)).to eq(false) + expect(Guardian.new(admin).can_edit?(topic)).to eq(true) + end + end + context 'not archived' do it 'returns true as a moderator' do expect(Guardian.new(moderator).can_edit?(topic)).to eq(true) From 73a45048a015890a4bce6ec7c203430900adfa02 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 19 Jun 2019 09:10:50 +0800 Subject: [PATCH 006/250] FIX: `Upload#short_url` generates incorrect URL when extension is `nil`. --- app/models/post.rb | 2 +- app/models/upload.rb | 2 +- spec/models/post_spec.rb | 5 ++++- spec/models/upload_spec.rb | 3 +++ 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/models/post.rb b/app/models/post.rb index fc2aaf3599..84f2af6470 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -890,7 +890,7 @@ class Post < ActiveRecord::Base /\/uploads\/#{RailsMultisite::ConnectionManagement.current_db}\//, /\/original\//, /\/optimized\//, - /\/uploads\/short-url\/[a-zA-Z0-9]+\..*/ + /\/uploads\/short-url\/[a-zA-Z0-9]+(\.[a-z0-9]+)?/ ] fragments ||= Nokogiri::HTML::fragment(self.cooked) diff --git a/app/models/upload.rb b/app/models/upload.rb index c25011a53f..bd1f0796af 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -361,7 +361,7 @@ class Upload < ActiveRecord::Base private def short_url_basename - "#{Upload.base62_sha1(sha1)}.#{extension}" + "#{Upload.base62_sha1(sha1)}#{extension.present? ? ".#{extension}" : ""}" end end diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb index acc1ea3d6a..529306015c 100644 --- a/spec/models/post_spec.rb +++ b/spec/models/post_spec.rb @@ -1234,6 +1234,7 @@ describe Post do fab!(:audio_upload) { Fabricate(:upload, extension: "ogg") } fab!(:attachment_upload) { Fabricate(:upload, extension: "csv") } fab!(:attachment_upload_2) { Fabricate(:upload) } + fab!(:attachment_upload_3) { Fabricate(:upload, extension: nil) } let(:base_url) { "#{Discourse.base_url_no_prefix}#{Discourse.base_uri}" } let(:video_url) { "#{base_url}#{video_upload.url}" } @@ -1243,6 +1244,7 @@ describe Post do <<~RAW Link [test|attachment](#{attachment_upload_2.short_url}) + [test3|attachment](#{attachment_upload_3.short_url})