Merge pull request #2720 from evazion/fix-member-voting
Prevent anon/banned/member users from voting (fix #2719)
This commit is contained in:
@@ -133,9 +133,9 @@ protected
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
%w(member banned builder gold platinum janitor moderator admin).each do |level|
|
User::Roles.each do |role|
|
||||||
define_method("#{level}_only") do
|
define_method("#{role}_only") do
|
||||||
if !CurrentUser.user.is_banned_or_ip_banned? && CurrentUser.user.__send__("is_#{level}?")
|
if !CurrentUser.user.is_banned_or_ip_banned? && CurrentUser.user.__send__("is_#{role}?")
|
||||||
true
|
true
|
||||||
else
|
else
|
||||||
access_denied()
|
access_denied()
|
||||||
@@ -174,13 +174,4 @@ protected
|
|||||||
Rails.application.config.session_store :cookie_store, :key => '_danbooru_session', :secure => false
|
Rails.application.config.session_store :cookie_store, :key => '_danbooru_session', :secure => false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def post_approvers_only
|
|
||||||
if CurrentUser.can_approve_posts?
|
|
||||||
true
|
|
||||||
else
|
|
||||||
access_denied()
|
|
||||||
false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
module Moderator
|
module Moderator
|
||||||
module Post
|
module Post
|
||||||
class ApprovalsController < ApplicationController
|
class ApprovalsController < ApplicationController
|
||||||
before_filter :post_approvers_only
|
before_filter :approver_only
|
||||||
|
|
||||||
def create
|
def create
|
||||||
cookies.permanent[:moderated] = Time.now.to_i
|
cookies.permanent[:moderated] = Time.now.to_i
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
module Moderator
|
module Moderator
|
||||||
module Post
|
module Post
|
||||||
class DisapprovalsController < ApplicationController
|
class DisapprovalsController < ApplicationController
|
||||||
before_filter :post_approvers_only
|
before_filter :approver_only
|
||||||
|
|
||||||
def create
|
def create
|
||||||
cookies.permanent[:moderated] = Time.now.to_i
|
cookies.permanent[:moderated] = Time.now.to_i
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
module Moderator
|
module Moderator
|
||||||
module Post
|
module Post
|
||||||
class PostsController < ApplicationController
|
class PostsController < ApplicationController
|
||||||
before_filter :post_approvers_only, :only => [:delete, :undelete, :move_favorites, :ban, :unban, :confirm_delete, :confirm_move_favorites, :confirm_ban]
|
before_filter :approver_only, :only => [:delete, :undelete, :move_favorites, :ban, :unban, :confirm_delete, :confirm_move_favorites, :confirm_ban]
|
||||||
before_filter :admin_only, :only => [:expunge]
|
before_filter :admin_only, :only => [:expunge]
|
||||||
rescue_from ::PostFlag::Error, ::Post::ApprovalError, :with => :rescue_exception
|
rescue_from ::PostFlag::Error, ::Post::ApprovalError, :with => :rescue_exception
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ module Moderator
|
|||||||
module Post
|
module Post
|
||||||
class QueuesController < ApplicationController
|
class QueuesController < ApplicationController
|
||||||
respond_to :html, :json
|
respond_to :html, :json
|
||||||
before_filter :post_approvers_only
|
before_filter :approver_only
|
||||||
|
|
||||||
def show
|
def show
|
||||||
cookies.permanent[:moderated] = Time.now.to_i
|
cookies.permanent[:moderated] = Time.now.to_i
|
||||||
|
|||||||
@@ -14,10 +14,4 @@ class PostVotesController < ApplicationController
|
|||||||
rescue PostVote::Error => x
|
rescue PostVote::Error => x
|
||||||
@error = x
|
@error = x
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
def voter_only
|
|
||||||
CurrentUser.is_voter?
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class Ban < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def initialize_banner_id
|
def initialize_banner_id
|
||||||
self.banner_id = CurrentUser.id
|
self.banner_id = CurrentUser.id if self.banner_id.blank?
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_is_inferior
|
def user_is_inferior
|
||||||
|
|||||||
@@ -16,6 +16,16 @@ class User < ActiveRecord::Base
|
|||||||
ADMIN = 50
|
ADMIN = 50
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Used for `before_filter :<role>_only`. Must have a corresponding `is_<role>?` method.
|
||||||
|
Roles = Levels.constants.map(&:downcase) + [
|
||||||
|
:anonymous,
|
||||||
|
:banned,
|
||||||
|
:approver,
|
||||||
|
:voter,
|
||||||
|
:super_voter,
|
||||||
|
:verified,
|
||||||
|
]
|
||||||
|
|
||||||
BOOLEAN_ATTRIBUTES = %w(
|
BOOLEAN_ATTRIBUTES = %w(
|
||||||
is_banned
|
is_banned
|
||||||
has_mail
|
has_mail
|
||||||
@@ -384,6 +394,10 @@ class User < ActiveRecord::Base
|
|||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def is_blocked?
|
||||||
|
is_banned?
|
||||||
|
end
|
||||||
|
|
||||||
def is_builder?
|
def is_builder?
|
||||||
level >= Levels::BUILDER
|
level >= Levels::BUILDER
|
||||||
end
|
end
|
||||||
@@ -416,6 +430,10 @@ class User < ActiveRecord::Base
|
|||||||
is_gold? || is_super_voter?
|
is_gold? || is_super_voter?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def is_approver?
|
||||||
|
can_approve_posts?
|
||||||
|
end
|
||||||
|
|
||||||
def create_mod_action
|
def create_mod_action
|
||||||
if level_changed?
|
if level_changed?
|
||||||
ModAction.create(:description => %{"#{name}":/users/#{id} level changed #{level_string_was} -> #{level_string}})
|
ModAction.create(:description => %{"#{name}":/users/#{id} level changed #{level_string_was} -> #{level_string}})
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
FactoryGirl.define do
|
FactoryGirl.define do
|
||||||
factory(:ban) do |f|
|
factory(:ban) do |f|
|
||||||
|
banner :factory => :admin_user
|
||||||
reason {FFaker::Lorem.words.join(" ")}
|
reason {FFaker::Lorem.words.join(" ")}
|
||||||
duration 60
|
duration 60
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -13,7 +13,11 @@ FactoryGirl.define do
|
|||||||
|
|
||||||
factory(:banned_user) do
|
factory(:banned_user) do
|
||||||
is_banned true
|
is_banned true
|
||||||
ban {|x| x.association(:ban)}
|
after(:create) { |user| create(:ban, user: user) }
|
||||||
|
end
|
||||||
|
|
||||||
|
factory(:member_user) do
|
||||||
|
level 20
|
||||||
end
|
end
|
||||||
|
|
||||||
factory(:gold_user) do
|
factory(:gold_user) do
|
||||||
|
|||||||
@@ -15,6 +15,34 @@ class PostVotesControllerTest < ActionController::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
context "create action" do
|
context "create action" do
|
||||||
|
should "not allow anonymous users to vote" do
|
||||||
|
p1 = FactoryGirl.create(:post)
|
||||||
|
post :create, {:post_id => p1.id, :score => "up", :format => "js"}
|
||||||
|
|
||||||
|
assert_response 403
|
||||||
|
assert_equal(0, p1.reload.score)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "not allow banned users to vote" do
|
||||||
|
CurrentUser.scoped(FactoryGirl.create(:banned_user)) do
|
||||||
|
p1 = FactoryGirl.create(:post)
|
||||||
|
post :create, {:post_id => p1.id, :score => "up", :format => "js"}, {:user_id => CurrentUser.id}
|
||||||
|
|
||||||
|
assert_response 403
|
||||||
|
assert_equal(0, p1.reload.score)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
should "not allow members to vote" do
|
||||||
|
CurrentUser.scoped(FactoryGirl.create(:member_user)) do
|
||||||
|
p1 = FactoryGirl.create(:post)
|
||||||
|
post :create, {:post_id => p1.id, :score => "up", :format => "js"}, {:user_id => CurrentUser.id}
|
||||||
|
|
||||||
|
assert_response 403
|
||||||
|
assert_equal(0, p1.reload.score)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
should "increment a post's score if the score is positive" do
|
should "increment a post's score if the score is positive" do
|
||||||
post :create, {:post_id => @post.id, :score => "up", :format => "js"}, {:user_id => @user.id}
|
post :create, {:post_id => @post.id, :score => "up", :format => "js"}, {:user_id => @user.id}
|
||||||
assert_response :success
|
assert_response :success
|
||||||
|
|||||||
Reference in New Issue
Block a user