2014-01-09 17:25:14 -06: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 22:06:43 +01:00
require_dependency 'guardian/post_revision_guardian'
2015-01-08 15:35:52 -08: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 17:46:45 -02: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 17:25:14 -06:00
include EnsureMagic
include CategoryGuardian
2014-05-12 16:30:10 +02:00
include PostGuardian
2014-01-09 17:25:14 -06:00
include TopicGuardian
2014-02-13 11:42:35 -05:00
include UserGuardian
2014-10-27 22:06:43 +01:00
include PostRevisionGuardian
2015-01-08 15:35:52 -08:00
include GroupGuardian
2016-06-06 14:18:15 -04:00
include TagGuardian
2014-02-04 20:05:50 +01:00
2013-05-19 23:04:53 -07:00
class AnonymousUser
def blank? ; true ; end
def admin? ; false ; end
def staff? ; false ; end
2014-02-07 14:24:19 +11:00
def moderator? ; false ; end
2013-05-19 23:04:53 -07:00
def approved? ; false ; end
2016-02-24 11:30:17 +01:00
def staged? ; false ; end
2016-06-20 15:41:17 +08:00
def blocked? ; false ; end
2013-05-19 23:04:53 -07:00
def secure_category_ids ; [ ] ; end
2013-07-14 11:24:16 +10:00
def topic_create_allowed_category_ids ; [ ] ; end
2013-05-19 23:04:53 -07:00
def has_trust_level? ( level ) ; false ; end
2013-09-05 10:27:34 +10:00
def email ; nil ; end
2013-05-19 23:04:53 -07:00
end
2014-05-12 16:30:10 +02:00
2014-11-03 12:46:08 +01:00
attr_accessor :can_see_emails
2013-02-05 14:16:51 -05:00
def initialize ( user = nil )
2013-05-19 23:04:53 -07: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-19 23:04:53 -07:00
def authenticated?
@user . present?
2013-02-05 14:16:51 -05:00
end
def is_admin?
2013-05-19 23:04:53 -07:00
@user . admin?
2013-04-29 16:33:24 +10:00
end
2013-05-02 17:22:27 +10:00
def is_staff?
2013-05-19 23:04:53 -07:00
@user . staff?
2013-02-05 14:16:51 -05:00
end
2014-02-07 14:24:19 +11:00
def is_moderator?
@user . moderator?
end
2016-06-20 15:41:17 +08:00
def is_blocked?
@user . blocked?
end
2013-09-05 10:27:34 +10:00
def is_developer?
@user &&
is_admin? &&
2013-09-06 14:07:23 +10:00
( Rails . env . development? ||
(
Rails . configuration . respond_to? ( :developer_emails ) &&
Rails . configuration . developer_emails . include? ( @user . email )
)
)
2013-09-05 10:27:34 +10:00
end
2013-02-05 14:16:51 -05:00
# Can the user see the object?
def can_see? ( obj )
2013-05-19 23:04:53 -07: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
2014-03-17 14:50:28 -04:00
def can_create? ( klass , parent = nil )
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 14:24:29 +02: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 14:24:29 +02:00
can_do? ( :delete , obj )
2013-02-05 14:16:51 -05:00
end
def can_moderate? ( obj )
2016-06-20 15:41:17 +08: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 19:42:20 +03:00
alias :can_move_posts? :can_moderate?
2013-02-05 14:16:51 -05:00
alias :can_see_flags? :can_moderate?
2013-05-07 21:58:34 -04:00
alias :can_send_activation_email? :can_moderate?
2015-03-27 15:31:04 -07:00
alias :can_close? :can_moderate?
2014-09-02 13:12:27 -07: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?
return true if is_admin? || group . visible?
return false if user . blank?
group . group_users . where ( user_id : user . id ) . exists?
2014-04-22 16:43:46 -04:00
end
2014-01-16 11:59:26 -05:00
2013-02-05 14:16:51 -05:00
# Can we impersonate this user?
def can_impersonate? ( target )
2013-05-19 23:04:53 -07:00
target &&
2013-02-05 14:16:51 -05:00
# You must be an admin to impersonate
2013-05-19 23:04:53 -07:00
is_admin? &&
2013-02-05 14:16:51 -05:00
2013-09-05 10:27:34 +10: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-19 23:04:53 -07: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
# Can we approve it?
def can_approve? ( target )
2013-05-19 23:04:53 -07: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 09:13:31 -07: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-19 23:04:53 -07:00
can_administer_user? ( admin ) && admin . admin?
2013-02-05 14:16:51 -05:00
end
def can_grant_admin? ( user )
2013-05-19 23:04:53 -07:00
can_administer_user? ( user ) && not ( user . admin? )
2013-02-05 14:16:51 -05:00
end
2013-02-12 22:58:08 +00:00
def can_revoke_moderation? ( moderator )
2013-05-19 23:04:53 -07:00
can_administer? ( moderator ) && moderator . moderator?
2013-02-12 22:58:08 +00:00
end
def can_grant_moderation? ( user )
2013-05-19 23:04:53 -07:00
can_administer? ( user ) && not ( user . moderator? )
2013-02-12 22:58:08 +00: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 10:27:40 +02:00
def can_change_trust_level? ( user )
2013-07-23 09:13:48 +10:00
user && is_staff?
2013-07-03 10:27:40 +02: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 17:22:27 +10:00
return false unless @user
2013-04-03 12:23:28 -04:00
2013-05-02 17:22:27 +10: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 17:22:27 +10: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-19 23:04:53 -07:00
is_me? ( user )
2013-02-05 14:16:51 -05:00
end
2014-05-09 18:22:15 +10:00
def can_invite_to_forum? ( groups = nil )
2013-06-21 16:35:13 +10:00
authenticated? &&
2015-06-05 10:22:41 +05:30
( SiteSetting . max_invites_per_day . to_i > 0 || is_staff? ) &&
2014-04-22 09:17:37 +10:00
! SiteSetting . enable_sso &&
2014-06-18 16:46:04 -04:00
SiteSetting . enable_local_logins &&
2013-06-21 16:35:13 +10:00
(
2014-09-05 15:20:39 +10:00
( ! SiteSetting . must_approve_users? && @user . has_trust_level? ( TrustLevel [ 2 ] ) ) ||
2013-06-21 16:35:13 +10:00
is_staff?
2014-05-09 18:22:15 +10:00
) &&
( groups . blank? || is_admin? )
2013-02-05 14:16:51 -05:00
end
2014-05-09 11:45:18 +10:00
def can_invite_to? ( object , group_ids = nil )
2015-03-02 11:25:25 -08:00
return false if ! authenticated?
2015-10-30 11:28:05 +05:30
return false unless ( ! SiteSetting . must_approve_users? || is_staff? )
2015-03-02 11:25:25 -08:00
return true if is_admin?
2015-06-05 10:22:41 +05:30
return false if ( SiteSetting . max_invites_per_day . to_i == 0 && ! is_staff? )
2015-03-02 11:25:25 -08:00
return false if ! can_see? ( object )
return false if group_ids . present?
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
2014-05-28 01:44:37 +05:30
def can_bulk_invite_to_forum? ( user )
user . admin?
end
2014-07-14 21:26:26 +05:30
def can_create_disposable_invite? ( user )
user . admin?
end
2014-07-29 23:27:08 +05:30
def can_send_multiple_invites? ( user )
user . staff?
2016-06-07 10:57:08 +05:30
end
def can_resend_all_invites? ( user )
user . staff?
2014-07-29 23:27:08 +05:30
end
2013-02-05 14:16:51 -05:00
def can_see_private_messages? ( user_id )
2014-02-07 14:24:19 +11:00
is_admin? || ( authenticated? && @user . id == user_id )
2013-02-05 14:16:51 -05:00
end
2013-05-02 15:15:17 +10:00
def can_send_private_message? ( target )
2014-03-26 12:20:41 -07:00
( target . is_a? ( Group ) || target . is_a? ( User ) ) &&
2014-02-12 20:08:46 -08:00
# User is authenticated
2013-05-19 23:04:53 -07:00
authenticated? &&
2013-02-25 19:42:20 +03:00
# Can't send message to yourself
2013-05-19 23:04:53 -07:00
is_not_me? ( target ) &&
2013-02-05 14:16:51 -05:00
# Have to be a basic level at least
2015-10-12 11:15:38 +11:00
@user . has_trust_level? ( SiteSetting . min_trust_to_send_messages ) &&
2014-02-12 20:08:46 -08:00
# PMs are enabled
2014-04-25 14:52:57 -04:00
( SiteSetting . enable_private_messages ||
@user . username == SiteSetting . site_contact_username ||
2014-05-06 15:01:19 -04:00
@user == Discourse . system_user ) &&
# 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 15:41:17 +08:00
( ! is_blocked? || target . staff? )
2013-02-05 14:16:51 -05:00
end
2014-11-03 12:46:08 +01:00
def can_see_emails?
@can_see_emails
end
2014-12-30 18:07:05 +05:30
def can_export_entity? ( entity_type )
2016-05-05 19:12:37 +05:30
return false unless @user
2014-12-30 18:07:05 +05:30
return true if is_staff?
return false if entity_type == " admin "
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 21:47:04 +05:30
end
2016-04-25 15:55:15 -04:00
2013-05-19 23:04:53 -07:00
private
def is_my_own? ( obj )
2013-10-04 13:28:49 +10:00
unless anonymous?
2013-10-04 17:00:23 +10:00
return obj . user_id == @user . id if obj . respond_to? ( :user_id ) && obj . user_id && @user . id
2013-10-04 13:28:49 +10:00
return obj . user == @user if obj . respond_to? ( :user )
end
false
2013-05-19 23:04:53 -07:00
end
def is_me? ( other )
2014-03-26 12:20:41 -07:00
other && authenticated? && other . is_a? ( User ) && @user == other
2013-04-29 16:33:24 +10:00
end
2013-05-19 23:04:53 -07:00
def is_not_me? ( other )
@user . blank? || ! is_me? ( other )
end
def can_administer? ( obj )
is_admin? && obj . present?
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 14:24:29 +02: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 14:24:29 +02:00
end
end
2013-02-05 14:16:51 -05:00
end