2019-05-02 18:17:27 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2014-01-09 18:25:14 -05:00
|
|
|
#mixin for all guardian methods dealing with topic permisions
|
|
|
|
module TopicGuardian
|
|
|
|
|
2017-10-10 04:26:56 -04:00
|
|
|
def can_remove_allowed_users?(topic, target_user = nil)
|
|
|
|
is_staff? ||
|
2020-06-19 05:04:05 -04:00
|
|
|
(topic.user == @user && @user.has_trust_level?(TrustLevel[2])) ||
|
2017-10-10 04:26:56 -04:00
|
|
|
(
|
|
|
|
topic.allowed_users.count > 1 &&
|
|
|
|
topic.user != target_user &&
|
|
|
|
!!(target_user && user == target_user)
|
|
|
|
)
|
2014-01-09 18:25:14 -05:00
|
|
|
end
|
|
|
|
|
2019-05-03 14:26:37 -04:00
|
|
|
def can_review_topic?(topic)
|
|
|
|
return false if anonymous? || topic.nil?
|
|
|
|
return true if is_staff?
|
|
|
|
|
2021-04-27 12:24:27 -04:00
|
|
|
can_perform_action_available_to_group_moderators?(topic)
|
2019-05-03 14:26:37 -04:00
|
|
|
end
|
2020-11-05 12:18:26 -05:00
|
|
|
alias :can_moderate_topic? :can_review_topic?
|
2019-05-03 14:26:37 -04:00
|
|
|
|
2018-03-13 15:59:12 -04:00
|
|
|
def can_create_shared_draft?
|
2021-02-01 09:16:34 -05:00
|
|
|
SiteSetting.shared_drafts_enabled? && can_see_shared_draft?
|
|
|
|
end
|
2020-12-03 09:07:57 -05:00
|
|
|
|
2021-02-01 09:16:34 -05:00
|
|
|
def can_see_shared_draft?
|
2020-12-03 09:07:57 -05:00
|
|
|
return is_admin? if SiteSetting.shared_drafts_min_trust_level.to_s == 'admin'
|
|
|
|
return is_staff? if SiteSetting.shared_drafts_min_trust_level.to_s == 'staff'
|
|
|
|
|
|
|
|
@user.has_trust_level?(SiteSetting.shared_drafts_min_trust_level.to_i)
|
2018-03-13 15:59:12 -04:00
|
|
|
end
|
|
|
|
|
2019-05-07 13:34:15 -04:00
|
|
|
def can_create_whisper?
|
|
|
|
is_staff? && SiteSetting.enable_whispers?
|
|
|
|
end
|
|
|
|
|
2020-07-13 21:42:09 -04:00
|
|
|
def can_see_whispers?(_topic)
|
|
|
|
is_staff?
|
|
|
|
end
|
|
|
|
|
2018-03-13 15:59:12 -04:00
|
|
|
def can_publish_topic?(topic, category)
|
2021-02-01 09:16:34 -05:00
|
|
|
can_see_shared_draft? && can_see?(topic) && can_create_topic_on_category?(category)
|
2018-03-13 15:59:12 -04:00
|
|
|
end
|
|
|
|
|
2014-01-09 18:25:14 -05:00
|
|
|
# Creating Methods
|
|
|
|
def can_create_topic?(parent)
|
2014-06-09 15:21:01 -04:00
|
|
|
is_staff? ||
|
2014-06-09 11:03:10 -04:00
|
|
|
(user &&
|
|
|
|
user.trust_level >= SiteSetting.min_trust_to_create_topic.to_i &&
|
2019-06-26 07:02:53 -04:00
|
|
|
can_create_post?(parent) &&
|
|
|
|
Category.topic_create_allowed(self).limit(1).count == 1)
|
2014-01-09 18:25:14 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def can_create_topic_on_category?(category)
|
2018-03-01 20:13:04 -05:00
|
|
|
# allow for category to be a number as well
|
2018-03-12 22:20:47 -04:00
|
|
|
category_id = Category === category ? category.id : category
|
2018-03-01 20:13:04 -05:00
|
|
|
|
2014-01-21 09:21:38 -05:00
|
|
|
can_create_topic?(nil) &&
|
2018-03-01 20:13:04 -05:00
|
|
|
(!category || Category.topic_create_allowed(self).where(id: category_id).count == 1)
|
2014-01-09 18:25:14 -05:00
|
|
|
end
|
|
|
|
|
2018-07-12 22:51:08 -04:00
|
|
|
def can_move_topic_to_category?(category)
|
|
|
|
category = Category === category ? category : Category.find(category || SiteSetting.uncategorized_category_id)
|
|
|
|
|
|
|
|
is_staff? || (can_create_topic_on_category?(category) && !category.require_topic_approval?)
|
|
|
|
end
|
|
|
|
|
2014-01-09 18:25:14 -05:00
|
|
|
def can_create_post_on_topic?(topic)
|
|
|
|
# No users can create posts on deleted topics
|
2016-09-09 12:15:56 -04:00
|
|
|
return false if topic.blank?
|
2014-01-09 18:25:14 -05:00
|
|
|
return false if topic.trashed?
|
2016-04-13 01:59:38 -04:00
|
|
|
return true if is_admin?
|
2014-01-09 18:25:14 -05:00
|
|
|
|
2020-08-10 15:21:01 -04:00
|
|
|
trusted = (authenticated? && user.has_trust_level?(TrustLevel[4])) || is_moderator? || can_perform_action_available_to_group_moderators?(topic)
|
2016-04-13 01:59:38 -04:00
|
|
|
|
|
|
|
(!(topic.closed? || topic.archived?) || trusted) && can_create_post?(topic)
|
2014-01-09 18:25:14 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
# Editing Method
|
|
|
|
def can_edit_topic?(topic)
|
2014-07-29 10:40:02 -04:00
|
|
|
return false if Discourse.static_doc_topic_ids.include?(topic.id) && !is_admin?
|
2015-02-26 00:08:52 -05:00
|
|
|
return false unless can_see?(topic)
|
2020-09-23 12:13:18 -04:00
|
|
|
return false if topic.first_post&.locked? && !is_staff?
|
2016-04-13 01:59:38 -04:00
|
|
|
|
|
|
|
return true if is_admin?
|
|
|
|
return true if is_moderator? && can_create_post?(topic)
|
2020-12-02 17:21:59 -05:00
|
|
|
return true if is_category_group_moderator?(topic.category)
|
2016-04-13 01:59:38 -04:00
|
|
|
|
2016-06-01 15:41:56 -04:00
|
|
|
# can't edit topics in secured categories where you don't have permission to create topics
|
2019-06-26 03:53:29 -04:00
|
|
|
# except for a tiny edge case where the topic is uncategorized and you are trying
|
|
|
|
# to fix it but uncategorized is disabled
|
|
|
|
if (
|
|
|
|
SiteSetting.allow_uncategorized_topics ||
|
|
|
|
topic.category_id != SiteSetting.uncategorized_category_id
|
|
|
|
)
|
|
|
|
return false if !can_create_topic_on_category?(topic.category)
|
|
|
|
end
|
2016-06-01 15:41:56 -04:00
|
|
|
|
2020-12-03 09:07:57 -05:00
|
|
|
# Editing a shared draft.
|
|
|
|
return true if (
|
|
|
|
!topic.archived &&
|
|
|
|
!topic.private_message? &&
|
|
|
|
topic.category_id == SiteSetting.shared_drafts_category.to_i &&
|
|
|
|
can_see_category?(topic.category) &&
|
2021-02-01 09:16:34 -05:00
|
|
|
can_see_shared_draft? &&
|
2020-12-03 09:07:57 -05:00
|
|
|
can_create_post?(topic)
|
|
|
|
)
|
|
|
|
|
2016-01-28 14:05:56 -05:00
|
|
|
# TL4 users can edit archived topics, but can not edit private messages
|
2018-02-22 20:39:24 -05:00
|
|
|
return true if (
|
|
|
|
SiteSetting.trusted_users_can_edit_others? &&
|
|
|
|
topic.archived &&
|
|
|
|
!topic.private_message? &&
|
|
|
|
user.has_trust_level?(TrustLevel[4]) &&
|
|
|
|
can_create_post?(topic)
|
|
|
|
)
|
2016-04-13 01:59:38 -04:00
|
|
|
|
2016-01-28 14:05:56 -05:00
|
|
|
# TL3 users can not edit archived topics and private messages
|
2018-02-22 20:39:24 -05:00
|
|
|
return true if (
|
|
|
|
SiteSetting.trusted_users_can_edit_others? &&
|
|
|
|
!topic.archived &&
|
|
|
|
!topic.private_message? &&
|
|
|
|
user.has_trust_level?(TrustLevel[3]) &&
|
|
|
|
can_create_post?(topic)
|
|
|
|
)
|
2015-04-30 17:03:51 -04:00
|
|
|
|
2014-08-15 12:44:58 -04:00
|
|
|
return false if topic.archived
|
2019-06-18 14:22:38 -04:00
|
|
|
is_my_own?(topic) &&
|
2019-09-06 07:44:12 -04:00
|
|
|
!topic.edit_time_limit_expired?(user) &&
|
2019-06-18 14:22:38 -04:00
|
|
|
!Post.where(topic_id: topic.id, post_number: 1).where.not(locked_by_id: nil).exists?
|
2014-01-09 18:25:14 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def can_recover_topic?(topic)
|
2020-11-05 12:18:26 -05:00
|
|
|
if is_staff? || (topic&.category && is_category_group_moderator?(topic.category))
|
2020-02-06 03:19:04 -05:00
|
|
|
!!(topic && topic.deleted_at)
|
2019-03-29 12:10:05 -04:00
|
|
|
else
|
|
|
|
topic && can_recover_post?(topic.ordered_posts.first)
|
|
|
|
end
|
2014-01-09 18:25:14 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def can_delete_topic?(topic)
|
|
|
|
!topic.trashed? &&
|
2020-11-05 12:18:26 -05:00
|
|
|
(is_staff? || (is_my_own?(topic) && topic.posts_count <= 1 && topic.created_at && topic.created_at > 24.hours.ago) || is_category_group_moderator?(topic.category)) &&
|
2019-03-29 12:10:05 -04:00
|
|
|
!topic.is_category_topic? &&
|
2014-08-13 17:02:44 -04:00
|
|
|
!Discourse.static_doc_topic_ids.include?(topic.id)
|
2014-01-09 18:25:14 -05:00
|
|
|
end
|
|
|
|
|
2020-12-14 11:01:22 -05:00
|
|
|
def can_toggle_topic_visibility?(topic)
|
|
|
|
can_moderate?(topic) || can_perform_action_available_to_group_moderators?(topic)
|
|
|
|
end
|
|
|
|
|
2016-05-01 07:48:43 -04:00
|
|
|
def can_convert_topic?(topic)
|
2018-03-02 20:28:39 -05:00
|
|
|
return false unless SiteSetting.enable_personal_messages?
|
2017-10-02 04:04:58 -04:00
|
|
|
return false if topic.blank?
|
2018-05-24 04:41:51 -04:00
|
|
|
return false if topic.trashed?
|
|
|
|
return false if topic.is_category_topic?
|
2016-05-04 12:29:56 -04:00
|
|
|
return true if is_admin?
|
|
|
|
is_moderator? && can_create_post?(topic)
|
2016-05-01 07:48:43 -04:00
|
|
|
end
|
|
|
|
|
2014-01-09 18:25:14 -05:00
|
|
|
def can_reply_as_new_topic?(topic)
|
2016-11-29 12:59:42 -05:00
|
|
|
authenticated? && topic && @user.has_trust_level?(TrustLevel[1])
|
2014-01-09 18:25:14 -05:00
|
|
|
end
|
|
|
|
|
2020-11-05 12:18:26 -05:00
|
|
|
def can_see_deleted_topics?(category)
|
|
|
|
is_staff? || is_category_group_moderator?(category)
|
2014-07-15 17:02:43 -04:00
|
|
|
end
|
|
|
|
|
2016-06-27 08:36:57 -04:00
|
|
|
def can_see_topic?(topic, hide_deleted = true)
|
2014-05-12 10:30:10 -04:00
|
|
|
return false unless topic
|
2014-05-12 15:26:36 -04:00
|
|
|
return true if is_admin?
|
2020-11-05 12:18:26 -05:00
|
|
|
return false if hide_deleted && topic.deleted_at && !can_see_deleted_topics?(topic.category)
|
2014-01-09 18:25:14 -05:00
|
|
|
|
2014-08-05 00:37:28 -04:00
|
|
|
if topic.private_message?
|
2016-06-27 08:36:57 -04:00
|
|
|
return authenticated? && topic.all_allowed_users.where(id: @user.id).exists?
|
2014-08-05 00:37:28 -04:00
|
|
|
end
|
|
|
|
|
2021-02-01 09:16:34 -05:00
|
|
|
return false if topic.shared_draft && !can_see_shared_draft?
|
2020-12-14 14:08:20 -05:00
|
|
|
|
2020-01-16 13:17:16 -05:00
|
|
|
category = topic.category
|
|
|
|
can_see_category?(category) &&
|
2020-01-22 14:33:25 -05:00
|
|
|
(!category.read_restricted || !is_staged? || secure_category_ids.include?(category.id) || topic.user == user)
|
2015-02-12 11:52:59 -05:00
|
|
|
end
|
2014-01-09 18:25:14 -05:00
|
|
|
|
2019-07-04 04:12:39 -04:00
|
|
|
def can_get_access_to_topic?(topic)
|
|
|
|
topic&.access_topic_via_group.present? && authenticated?
|
|
|
|
end
|
|
|
|
|
2015-02-12 11:52:59 -05:00
|
|
|
def filter_allowed_categories(records)
|
|
|
|
unless is_admin?
|
2021-04-27 12:24:27 -04:00
|
|
|
records = allowed_category_ids.size == 0 ?
|
|
|
|
records.where('topics.category_id IS NULL') :
|
|
|
|
records.where('topics.category_id IS NULL or topics.category_id IN (?)', allowed_category_ids)
|
2015-02-12 11:52:59 -05:00
|
|
|
records = records.references(:categories)
|
|
|
|
end
|
|
|
|
records
|
2014-01-09 18:25:14 -05:00
|
|
|
end
|
2015-02-12 11:52:59 -05:00
|
|
|
|
2016-12-05 07:31:43 -05:00
|
|
|
def can_edit_featured_link?(category_id)
|
2016-12-15 17:46:43 -05:00
|
|
|
return false unless SiteSetting.topic_featured_link_enabled
|
2016-12-20 15:55:30 -05:00
|
|
|
Category.where(id: category_id || SiteSetting.uncategorized_category_id, topic_featured_link_allowed: true).exists?
|
2016-12-05 07:31:43 -05:00
|
|
|
end
|
2018-08-09 20:51:03 -04:00
|
|
|
|
|
|
|
def can_update_bumped_at?
|
2019-01-02 10:57:05 -05:00
|
|
|
is_staff? || @user.has_trust_level?(TrustLevel[4])
|
2018-08-09 20:51:03 -04:00
|
|
|
end
|
2019-04-02 03:08:15 -04:00
|
|
|
|
|
|
|
def can_banner_topic?(topic)
|
2019-06-25 06:49:29 -04:00
|
|
|
topic && authenticated? && !topic.private_message? && is_staff?
|
2019-04-02 03:08:15 -04:00
|
|
|
end
|
2019-10-23 14:05:38 -04:00
|
|
|
|
|
|
|
def can_edit_tags?(topic)
|
|
|
|
return false unless can_tag_topics?
|
|
|
|
return false if topic.private_message? && !can_tag_pms?
|
|
|
|
return true if can_edit_topic?(topic)
|
|
|
|
|
|
|
|
if topic&.first_post&.wiki && (@user.trust_level >= SiteSetting.min_trust_to_edit_wiki_post.to_i)
|
|
|
|
return can_create_post?(topic)
|
|
|
|
end
|
|
|
|
|
|
|
|
false
|
|
|
|
end
|
2020-07-14 12:36:19 -04:00
|
|
|
|
|
|
|
def can_perform_action_available_to_group_moderators?(topic)
|
|
|
|
return false if anonymous? || topic.nil?
|
|
|
|
return true if is_staff?
|
|
|
|
return true if @user.has_trust_level?(TrustLevel[4])
|
|
|
|
|
2020-07-28 17:15:04 -04:00
|
|
|
is_category_group_moderator?(topic.category)
|
2020-07-14 12:36:19 -04:00
|
|
|
end
|
|
|
|
alias :can_archive_topic? :can_perform_action_available_to_group_moderators?
|
|
|
|
alias :can_close_topic? :can_perform_action_available_to_group_moderators?
|
2021-01-12 17:49:29 -05:00
|
|
|
alias :can_open_topic? :can_perform_action_available_to_group_moderators?
|
2020-08-05 10:33:25 -04:00
|
|
|
alias :can_split_merge_topic? :can_perform_action_available_to_group_moderators?
|
2020-07-20 15:53:47 -04:00
|
|
|
alias :can_edit_staff_notes? :can_perform_action_available_to_group_moderators?
|
2021-03-09 16:05:11 -05:00
|
|
|
alias :can_pin_unpin_topic? :can_perform_action_available_to_group_moderators?
|
2020-07-14 12:36:19 -04:00
|
|
|
|
2020-08-05 10:33:25 -04:00
|
|
|
def can_move_posts?(topic)
|
|
|
|
return false if is_silenced?
|
|
|
|
can_perform_action_available_to_group_moderators?(topic)
|
|
|
|
end
|
|
|
|
|
2020-10-28 15:47:50 -04:00
|
|
|
def affected_by_slow_mode?(topic)
|
|
|
|
topic&.slow_mode_seconds.to_i > 0 && @user.human? && !is_staff?
|
|
|
|
end
|
|
|
|
|
2014-01-21 09:21:38 -05:00
|
|
|
end
|