2014-01-09 18:25:14 -05:00
|
|
|
require_dependency 'guardian/category_guardian'
|
|
|
|
require_dependency 'guardian/ensure_magic'
|
|
|
|
require_dependency 'guardian/post_guardian'
|
|
|
|
require_dependency 'guardian/topic_guardian'
|
2014-02-13 11:42:35 -05:00
|
|
|
require_dependency 'guardian/user_guardian'
|
2014-10-27 17:06:43 -04:00
|
|
|
require_dependency 'guardian/post_revision_guardian'
|
2015-01-08 18:35:52 -05:00
|
|
|
require_dependency 'guardian/group_guardian'
|
2016-06-06 14:18:15 -04:00
|
|
|
require_dependency 'guardian/tag_guardian'
|
2014-02-13 11:42:35 -05:00
|
|
|
|
2013-02-06 14:46:45 -05:00
|
|
|
# The guardian is responsible for confirming access to various site resources and operations
|
2013-02-05 14:16:51 -05:00
|
|
|
class Guardian
|
2014-01-09 18:25:14 -05:00
|
|
|
include EnsureMagic
|
|
|
|
include CategoryGuardian
|
2014-05-12 10:30:10 -04:00
|
|
|
include PostGuardian
|
2014-01-09 18:25:14 -05:00
|
|
|
include TopicGuardian
|
2014-02-13 11:42:35 -05:00
|
|
|
include UserGuardian
|
2014-10-27 17:06:43 -04:00
|
|
|
include PostRevisionGuardian
|
2015-01-08 18:35:52 -05:00
|
|
|
include GroupGuardian
|
2016-06-06 14:18:15 -04:00
|
|
|
include TagGuardian
|
2014-02-04 14:05:50 -05:00
|
|
|
|
2013-05-20 02:04:53 -04:00
|
|
|
class AnonymousUser
|
|
|
|
def blank?; true; end
|
|
|
|
def admin?; false; end
|
|
|
|
def staff?; false; end
|
2014-02-06 22:24:19 -05:00
|
|
|
def moderator?; false; end
|
2013-05-20 02:04:53 -04:00
|
|
|
def approved?; false; end
|
2016-02-24 05:30:17 -05:00
|
|
|
def staged?; false; end
|
2016-06-20 03:41:17 -04:00
|
|
|
def blocked?; false; end
|
2013-05-20 02:04:53 -04:00
|
|
|
def secure_category_ids; []; end
|
2013-07-13 21:24:16 -04:00
|
|
|
def topic_create_allowed_category_ids; []; end
|
2013-05-20 02:04:53 -04:00
|
|
|
def has_trust_level?(level); false; end
|
2013-09-04 20:27:34 -04:00
|
|
|
def email; nil; end
|
2013-05-20 02:04:53 -04:00
|
|
|
end
|
2014-05-12 10:30:10 -04:00
|
|
|
|
2014-11-03 06:46:08 -05:00
|
|
|
attr_accessor :can_see_emails
|
|
|
|
|
2017-07-27 21:20:09 -04:00
|
|
|
def initialize(user = nil)
|
2013-05-20 02:04:53 -04:00
|
|
|
@user = user.presence || AnonymousUser.new
|
|
|
|
end
|
|
|
|
|
|
|
|
def user
|
|
|
|
@user.presence
|
|
|
|
end
|
|
|
|
alias :current_user :user
|
|
|
|
|
|
|
|
def anonymous?
|
|
|
|
!authenticated?
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2013-05-20 02:04:53 -04:00
|
|
|
def authenticated?
|
|
|
|
@user.present?
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def is_admin?
|
2013-05-20 02:04:53 -04:00
|
|
|
@user.admin?
|
2013-04-29 02:33:24 -04:00
|
|
|
end
|
|
|
|
|
2013-05-02 03:22:27 -04:00
|
|
|
def is_staff?
|
2013-05-20 02:04:53 -04:00
|
|
|
@user.staff?
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2014-02-06 22:24:19 -05:00
|
|
|
def is_moderator?
|
|
|
|
@user.moderator?
|
|
|
|
end
|
|
|
|
|
2016-06-20 03:41:17 -04:00
|
|
|
def is_blocked?
|
|
|
|
@user.blocked?
|
|
|
|
end
|
|
|
|
|
2013-09-04 20:27:34 -04:00
|
|
|
def is_developer?
|
|
|
|
@user &&
|
|
|
|
is_admin? &&
|
2013-09-06 00:07:23 -04:00
|
|
|
(Rails.env.development? ||
|
|
|
|
(
|
|
|
|
Rails.configuration.respond_to?(:developer_emails) &&
|
|
|
|
Rails.configuration.developer_emails.include?(@user.email)
|
2016-07-27 20:14:06 -04:00
|
|
|
) ||
|
|
|
|
Developer.user_ids.include?(@user.id)
|
2013-09-06 00:07:23 -04:00
|
|
|
)
|
2013-09-04 20:27:34 -04:00
|
|
|
end
|
|
|
|
|
2016-06-26 13:25:45 -04:00
|
|
|
def is_staged?
|
|
|
|
@user.staged?
|
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
# Can the user see the object?
|
|
|
|
def can_see?(obj)
|
2013-05-20 02:04:53 -04:00
|
|
|
if obj
|
|
|
|
see_method = method_name_for :see, obj
|
|
|
|
return (see_method ? send(see_method, obj) : true)
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2017-07-27 21:20:09 -04:00
|
|
|
def can_create?(klass, parent = nil)
|
2014-03-17 14:50:28 -04:00
|
|
|
return false unless authenticated? && klass
|
|
|
|
|
|
|
|
# If no parent is provided, we look for a can_create_klass?
|
|
|
|
# custom method.
|
|
|
|
#
|
|
|
|
# If a parent is provided, we look for a method called
|
|
|
|
# can_create_klass_on_parent?
|
|
|
|
target = klass.name.underscore
|
|
|
|
if parent.present?
|
|
|
|
return false unless can_see?(parent)
|
|
|
|
target << "_on_#{parent.class.name.underscore}"
|
|
|
|
end
|
|
|
|
create_method = :"can_create_#{target}?"
|
|
|
|
|
|
|
|
return send(create_method, parent) if respond_to?(create_method)
|
|
|
|
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
# Can the user edit the obj
|
|
|
|
def can_edit?(obj)
|
2013-08-16 08:24:29 -04:00
|
|
|
can_do?(:edit, obj)
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
# Can we delete the object
|
|
|
|
def can_delete?(obj)
|
2013-08-16 08:24:29 -04:00
|
|
|
can_do?(:delete, obj)
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def can_moderate?(obj)
|
2016-06-20 03:41:17 -04:00
|
|
|
obj && authenticated? && !is_blocked? && (is_staff? || (obj.is_a?(Topic) && @user.has_trust_level?(TrustLevel[4])))
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
2013-02-25 11:42:20 -05:00
|
|
|
alias :can_move_posts? :can_moderate?
|
2013-02-05 14:16:51 -05:00
|
|
|
alias :can_see_flags? :can_moderate?
|
2015-03-27 18:31:04 -04:00
|
|
|
alias :can_close? :can_moderate?
|
2014-09-02 16:12:27 -04:00
|
|
|
|
2017-07-04 04:29:05 -04:00
|
|
|
def can_send_activation_email?(user)
|
|
|
|
user && is_staff? && !SiteSetting.must_approve_users?
|
|
|
|
end
|
|
|
|
|
2014-09-02 16:12:27 -04:00
|
|
|
def can_grant_badges?(_user)
|
|
|
|
SiteSetting.enable_badges && is_staff?
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2014-04-22 16:43:46 -04:00
|
|
|
def can_see_group?(group)
|
2016-04-26 14:17:53 -04:00
|
|
|
return false if group.blank?
|
2017-07-03 15:26:46 -04:00
|
|
|
return true if group.visibility_level == Group.visibility_levels[:public]
|
|
|
|
return true if is_admin?
|
|
|
|
return true if is_staff? && group.visibility_level == Group.visibility_levels[:staff]
|
2016-04-26 14:17:53 -04:00
|
|
|
return false if user.blank?
|
|
|
|
|
2017-07-03 15:26:46 -04:00
|
|
|
membership = GroupUser.find_by(group_id: group.id, user_id: user.id)
|
|
|
|
|
|
|
|
return false unless membership
|
|
|
|
|
|
|
|
if !membership.owner
|
|
|
|
return false if group.visibility_level == Group.visibility_levels[:owners]
|
|
|
|
return false if group.visibility_level == Group.visibility_levels[:staff]
|
|
|
|
end
|
|
|
|
|
|
|
|
true
|
2014-04-22 16:43:46 -04:00
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
# Can we impersonate this user?
|
|
|
|
def can_impersonate?(target)
|
2013-05-20 02:04:53 -04:00
|
|
|
target &&
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
|
|
# You must be an admin to impersonate
|
2013-05-20 02:04:53 -04:00
|
|
|
is_admin? &&
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2013-09-04 20:27:34 -04:00
|
|
|
# You may not impersonate other admins unless you are a dev
|
|
|
|
(!target.admin? || is_developer?)
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2013-05-20 02:04:53 -04:00
|
|
|
# Additionally, you may not impersonate yourself;
|
|
|
|
# but the two tests for different admin statuses
|
|
|
|
# make it impossible to be the same user.
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2017-02-21 07:45:30 -05:00
|
|
|
def can_view_action_logs?(target)
|
2017-04-20 12:15:52 -04:00
|
|
|
target.present? && is_staff?
|
2017-02-21 07:45:30 -05:00
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
# Can we approve it?
|
|
|
|
def can_approve?(target)
|
2013-05-20 02:04:53 -04:00
|
|
|
is_staff? && target && not(target.approved?)
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
2014-04-28 13:46:28 -04:00
|
|
|
|
|
|
|
def can_activate?(target)
|
|
|
|
is_staff? && target && not(target.active?)
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2013-11-07 13:53:32 -05:00
|
|
|
def can_suspend?(user)
|
2013-05-24 12:13:31 -04:00
|
|
|
user && is_staff? && user.regular?
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
2013-11-07 13:53:32 -05:00
|
|
|
alias :can_deactivate? :can_suspend?
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
|
|
def can_revoke_admin?(admin)
|
2013-05-20 02:04:53 -04:00
|
|
|
can_administer_user?(admin) && admin.admin?
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def can_grant_admin?(user)
|
2016-12-28 22:11:33 -05:00
|
|
|
can_administer_user?(user) && !user.admin?
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2013-02-12 17:58:08 -05:00
|
|
|
def can_revoke_moderation?(moderator)
|
2013-05-20 02:04:53 -04:00
|
|
|
can_administer?(moderator) && moderator.moderator?
|
2013-02-12 17:58:08 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def can_grant_moderation?(user)
|
2016-12-28 22:11:33 -05:00
|
|
|
can_administer?(user) && !user.moderator?
|
2013-02-12 17:58:08 -05:00
|
|
|
end
|
|
|
|
|
2013-06-25 18:39:20 -04:00
|
|
|
def can_grant_title?(user)
|
|
|
|
user && is_staff?
|
|
|
|
end
|
|
|
|
|
2014-02-10 16:59:36 -05:00
|
|
|
def can_change_primary_group?(user)
|
|
|
|
user && is_staff?
|
|
|
|
end
|
|
|
|
|
2013-07-03 04:27:40 -04:00
|
|
|
def can_change_trust_level?(user)
|
2013-07-22 19:13:48 -04:00
|
|
|
user && is_staff?
|
2013-07-03 04:27:40 -04:00
|
|
|
end
|
|
|
|
|
2013-04-03 12:23:28 -04:00
|
|
|
# Support sites that have to approve users
|
|
|
|
def can_access_forum?
|
|
|
|
return true unless SiteSetting.must_approve_users?
|
2013-05-02 03:22:27 -04:00
|
|
|
return false unless @user
|
2013-04-03 12:23:28 -04:00
|
|
|
|
2013-05-02 03:22:27 -04:00
|
|
|
# Staff can't lock themselves out of a site
|
|
|
|
return true if is_staff?
|
2013-04-03 12:23:28 -04:00
|
|
|
|
2013-05-02 03:22:27 -04:00
|
|
|
@user.approved?
|
2013-04-03 12:23:28 -04:00
|
|
|
end
|
|
|
|
|
2014-03-21 14:13:04 -04:00
|
|
|
def can_see_invite_details?(user)
|
2013-05-20 02:04:53 -04:00
|
|
|
is_me?(user)
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2017-07-27 21:20:09 -04:00
|
|
|
def can_invite_to_forum?(groups = nil)
|
2013-06-21 02:35:13 -04:00
|
|
|
authenticated? &&
|
2015-06-05 00:52:41 -04:00
|
|
|
(SiteSetting.max_invites_per_day.to_i > 0 || is_staff?) &&
|
2014-04-21 19:17:37 -04:00
|
|
|
!SiteSetting.enable_sso &&
|
2014-06-18 16:46:04 -04:00
|
|
|
SiteSetting.enable_local_logins &&
|
2013-06-21 02:35:13 -04:00
|
|
|
(
|
2014-09-05 01:20:39 -04:00
|
|
|
(!SiteSetting.must_approve_users? && @user.has_trust_level?(TrustLevel[2])) ||
|
2013-06-21 02:35:13 -04:00
|
|
|
is_staff?
|
2014-05-09 04:22:15 -04:00
|
|
|
) &&
|
2017-07-21 02:12:24 -04:00
|
|
|
(groups.blank? || is_admin? || groups.all? { |g| can_edit_group?(g) })
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2017-07-27 21:20:09 -04:00
|
|
|
def can_invite_to?(object, groups = nil)
|
2017-05-19 12:55:26 -04:00
|
|
|
return false unless authenticated?
|
2015-03-02 14:25:25 -05:00
|
|
|
return true if is_admin?
|
2017-05-19 12:55:26 -04:00
|
|
|
return false unless SiteSetting.enable_private_messages?
|
2015-06-05 00:52:41 -04:00
|
|
|
return false if (SiteSetting.max_invites_per_day.to_i == 0 && !is_staff?)
|
2017-05-19 12:55:26 -04:00
|
|
|
return false unless can_see?(object)
|
2017-07-21 02:12:24 -04:00
|
|
|
return false if groups.present?
|
2015-03-02 14:25:25 -05:00
|
|
|
|
|
|
|
if object.is_a?(Topic) && object.category
|
|
|
|
if object.category.groups.any?
|
|
|
|
return true if object.category.groups.all? { |g| can_edit_group?(g) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
user.has_trust_level?(TrustLevel[2])
|
2013-11-06 12:56:26 -05:00
|
|
|
end
|
|
|
|
|
2017-02-02 12:38:25 -05:00
|
|
|
def can_invite_via_email?(object)
|
|
|
|
return false unless can_invite_to?(object)
|
|
|
|
!SiteSetting.enable_sso && SiteSetting.enable_local_logins && (!SiteSetting.must_approve_users? || is_staff?)
|
|
|
|
end
|
|
|
|
|
2014-05-27 16:14:37 -04:00
|
|
|
def can_bulk_invite_to_forum?(user)
|
|
|
|
user.admin?
|
|
|
|
end
|
|
|
|
|
2014-07-29 13:57:08 -04:00
|
|
|
def can_send_multiple_invites?(user)
|
|
|
|
user.staff?
|
2016-06-07 01:27:08 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def can_resend_all_invites?(user)
|
|
|
|
user.staff?
|
2014-07-29 13:57:08 -04:00
|
|
|
end
|
|
|
|
|
2017-06-29 10:32:07 -04:00
|
|
|
def can_rescind_all_invites?(user)
|
|
|
|
user.staff?
|
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
def can_see_private_messages?(user_id)
|
2014-02-06 22:24:19 -05:00
|
|
|
is_admin? || (authenticated? && @user.id == user_id)
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2013-05-02 01:15:17 -04:00
|
|
|
def can_send_private_message?(target)
|
2014-03-26 15:20:41 -04:00
|
|
|
(target.is_a?(Group) || target.is_a?(User)) &&
|
2014-02-12 23:08:46 -05:00
|
|
|
# User is authenticated
|
2013-05-20 02:04:53 -04:00
|
|
|
authenticated? &&
|
2013-02-05 14:16:51 -05:00
|
|
|
# Have to be a basic level at least
|
2015-10-11 20:15:38 -04:00
|
|
|
@user.has_trust_level?(SiteSetting.min_trust_to_send_messages) &&
|
2014-02-12 23:08:46 -05:00
|
|
|
# PMs are enabled
|
2017-02-22 01:02:09 -05:00
|
|
|
(is_staff? || SiteSetting.enable_private_messages) &&
|
2014-05-06 15:01:19 -04:00
|
|
|
# Can't send PMs to suspended users
|
2016-01-22 12:54:18 -05:00
|
|
|
(is_staff? || target.is_a?(Group) || !target.suspended?) &&
|
|
|
|
# Blocked users can only send PM to staff
|
2016-06-20 03:41:17 -04:00
|
|
|
(!is_blocked? || target.staff?)
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2014-11-03 06:46:08 -05:00
|
|
|
def can_see_emails?
|
|
|
|
@can_see_emails
|
|
|
|
end
|
|
|
|
|
2017-05-19 15:59:37 -04:00
|
|
|
def can_export_entity?(entity)
|
2016-05-05 09:42:37 -04:00
|
|
|
return false unless @user
|
2014-12-30 07:37:05 -05:00
|
|
|
return true if is_staff?
|
2017-05-19 15:59:37 -04:00
|
|
|
|
|
|
|
# Regular users can only export their archives
|
|
|
|
return false unless entity == "user_archive"
|
2014-12-30 07:37:05 -05:00
|
|
|
UserExport.where(user_id: @user.id, created_at: (Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)).count == 0
|
2014-12-22 11:17:04 -05:00
|
|
|
end
|
|
|
|
|
2017-04-14 13:35:12 -04:00
|
|
|
def allow_theme?(theme_key)
|
|
|
|
if is_staff?
|
|
|
|
Theme.theme_keys.include?(theme_key)
|
|
|
|
else
|
2017-04-14 20:21:53 -04:00
|
|
|
Theme.user_theme_keys.include?(theme_key)
|
2017-04-14 13:35:12 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-05-20 02:04:53 -04:00
|
|
|
private
|
|
|
|
|
|
|
|
def is_my_own?(obj)
|
2013-10-03 23:28:49 -04:00
|
|
|
|
|
|
|
unless anonymous?
|
2013-10-04 03:00:23 -04:00
|
|
|
return obj.user_id == @user.id if obj.respond_to?(:user_id) && obj.user_id && @user.id
|
2013-10-03 23:28:49 -04:00
|
|
|
return obj.user == @user if obj.respond_to?(:user)
|
|
|
|
end
|
|
|
|
|
|
|
|
false
|
2013-05-20 02:04:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def is_me?(other)
|
2014-03-26 15:20:41 -04:00
|
|
|
other && authenticated? && other.is_a?(User) && @user == other
|
2013-04-29 02:33:24 -04:00
|
|
|
end
|
2013-05-20 02:04:53 -04:00
|
|
|
|
|
|
|
def is_not_me?(other)
|
|
|
|
@user.blank? || !is_me?(other)
|
|
|
|
end
|
|
|
|
|
|
|
|
def can_administer?(obj)
|
2016-12-28 22:11:33 -05:00
|
|
|
is_admin? && obj.present? && obj.id&.positive?
|
2013-05-20 02:04:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def can_administer_user?(other_user)
|
|
|
|
can_administer?(other_user) && is_not_me?(other_user)
|
|
|
|
end
|
|
|
|
|
|
|
|
def method_name_for(action, obj)
|
|
|
|
method_name = :"can_#{action}_#{obj.class.name.underscore}?"
|
|
|
|
return method_name if respond_to?(method_name)
|
|
|
|
end
|
|
|
|
|
2013-08-16 08:24:29 -04:00
|
|
|
def can_do?(action, obj)
|
|
|
|
if obj && authenticated?
|
|
|
|
action_method = method_name_for action, obj
|
|
|
|
return (action_method ? send(action_method, obj) : true)
|
2014-01-16 11:59:26 -05:00
|
|
|
else
|
|
|
|
false
|
2013-08-16 08:24:29 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|