ip bans: forbid all non-GET actions for ip banned users.
Previously only actions that were marked member_only or above were subject to IP ban restrictions. This meant that certain actions that weren't marked member_only, like creating new accounts, could still be done by IP banned users. Now IP banned users can't do any non-GET actions, which means they're not allowed to even login to their accounts.
This commit is contained in:
@@ -8,6 +8,7 @@ class ApplicationController < ActionController::Base
|
|||||||
before_action :set_current_user
|
before_action :set_current_user
|
||||||
before_action :normalize_search
|
before_action :normalize_search
|
||||||
before_action :api_check
|
before_action :api_check
|
||||||
|
before_action :ip_ban_check
|
||||||
before_action :set_variant
|
before_action :set_variant
|
||||||
before_action :enable_cors
|
before_action :enable_cors
|
||||||
before_action :cause_error
|
before_action :cause_error
|
||||||
@@ -154,10 +155,13 @@ class ApplicationController < ActionController::Base
|
|||||||
render_error_page(status, error)
|
render_error_page(status, error)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ip_ban_check
|
||||||
|
raise User::PrivilegeError if !request.get? && IpBan.is_banned?(CurrentUser.ip_addr)
|
||||||
|
end
|
||||||
|
|
||||||
def role_only!(role)
|
def role_only!(role)
|
||||||
raise User::PrivilegeError if !CurrentUser.send("is_#{role}?")
|
raise User::PrivilegeError if !CurrentUser.send("is_#{role}?")
|
||||||
raise User::PrivilegeError if !request.get? && CurrentUser.user.is_banned?
|
raise User::PrivilegeError if !request.get? && CurrentUser.user.is_banned?
|
||||||
raise User::PrivilegeError if !request.get? && IpBan.is_banned?(CurrentUser.ip_addr)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
User::Roles.each do |role|
|
User::Roles.each do |role|
|
||||||
|
|||||||
@@ -16,10 +16,18 @@ class SessionsControllerTest < ActionDispatch::IntegrationTest
|
|||||||
context "create action" do
|
context "create action" do
|
||||||
should "create a new session" do
|
should "create a new session" do
|
||||||
post session_path, params: {:name => @user.name, :password => "password"}
|
post session_path, params: {:name => @user.name, :password => "password"}
|
||||||
|
|
||||||
assert_redirected_to posts_path
|
assert_redirected_to posts_path
|
||||||
@user.reload
|
|
||||||
assert_equal(@user.id, session[:user_id])
|
assert_equal(@user.id, session[:user_id])
|
||||||
assert_not_nil(@user.last_ip_addr)
|
assert_not_nil(@user.reload.last_ip_addr)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "not allow IP banned users to create a new session" do
|
||||||
|
create(:ip_ban, ip_addr: "1.2.3.4")
|
||||||
|
post session_path, params: { name: @user.name, password: "password" }, headers: { REMOTE_ADDR: "1.2.3.4" }
|
||||||
|
|
||||||
|
assert_response 403
|
||||||
|
assert_not_equal(@user.id, session[:user_id])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user