197 lines
6.8 KiB
Ruby
197 lines
6.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
describe '/api/v2/auth functionality test' do
|
|
include_context 'geoip mock'
|
|
|
|
let(:uri) { '/api/v2/identity/sessions' }
|
|
let!(:create_permissions) do
|
|
create :permission, role: 'member', action: 'ACCEPT', verb: 'all', path: 'tasty_endpoint'
|
|
Rails.cache.delete('permissions')
|
|
end
|
|
let!(:user) { create(:user) }
|
|
let(:params) do
|
|
{
|
|
email: user.email,
|
|
password: user.password
|
|
}
|
|
end
|
|
let(:do_create_session_request) { post uri, params: params }
|
|
let(:auth_request) { '/api/v2/auth/tasty_endpoint' }
|
|
let(:auth_session_create_request) { '/api/v2/auth/api/v2/barong/identity/sessions' }
|
|
|
|
|
|
describe 'test blocklogin restriction' do
|
|
before do
|
|
allow(Rails.cache).to receive(:delete_matched).and_return(nil)
|
|
Rails.cache.delete('restrictions')
|
|
end
|
|
|
|
context 'block session creation' do
|
|
let!(:restriction) { create(:restriction, value: 'EUROPE', scope: 'continent', category: 'blocklogin', code: 425) }
|
|
before do
|
|
allow_any_instance_of(Barong::Authorize).to receive(:validate_session!).and_return(true)
|
|
allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return(london_ip)
|
|
end
|
|
|
|
it do
|
|
post auth_session_create_request, params: params
|
|
expect(response.status).to eq(restriction.code)
|
|
end
|
|
|
|
it do
|
|
do_create_session_request # This request will be successful because path doesn't include 'api/v2/auth'
|
|
get auth_request
|
|
expect(response.status).to eq(200)
|
|
end
|
|
end
|
|
end
|
|
describe 'test blacklist restrictions' do
|
|
before do
|
|
allow_any_instance_of(Barong::Authorize).to receive(:validate_session!).and_return(true)
|
|
Rails.cache.delete('restrictions')
|
|
do_create_session_request
|
|
end
|
|
|
|
context 'restrict by ip' do
|
|
let!(:restriction) { create(:restriction, value: '192.168.0.1', scope: 'ip', category: 'blacklist') }
|
|
let!(:disabled) { create(:restriction, value: '192.168.0.3', scope: 'ip', state: 'disabled', category: 'blacklist') }
|
|
|
|
it 'request with restricted ip' do
|
|
allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return('192.168.0.1')
|
|
get auth_request
|
|
|
|
expect(response.status).to eq(401)
|
|
expect(response.headers['Authorization']).to be_nil
|
|
end
|
|
|
|
it 'request with non-restricted ip' do
|
|
allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return('192.168.0.2')
|
|
get auth_request
|
|
expect(response.status).to eq(200)
|
|
end
|
|
|
|
it 'request with disabled restriction' do
|
|
allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return('192.168.0.3')
|
|
get auth_request
|
|
expect(response.status).to eq(200)
|
|
end
|
|
end
|
|
|
|
context 'restricts with ip subnet' do
|
|
let!(:restriction) { create(:restriction, value: '192.168.32.0/24', scope: 'ip_subnet', category: 'blacklist') }
|
|
|
|
it 'request with restricted ip' do
|
|
allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return('192.168.32.42')
|
|
get auth_request
|
|
|
|
expect(response.status).to eq(403)
|
|
expect(response.headers['Authorization']).to be_nil
|
|
expect(response.body).to eq("{\"errors\":[\"authz.restrict.blacklist\"]}")
|
|
end
|
|
|
|
it 'request with non-restricted ip' do
|
|
allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return('192.168.33.3')
|
|
get auth_request
|
|
|
|
expect(response.status).to eq(200)
|
|
end
|
|
end
|
|
|
|
context 'geoip' do
|
|
context 'restricts with country' do
|
|
let!(:restriction) { create(:restriction, value: 'japan', scope: 'country', category: 'blacklist') }
|
|
|
|
it 'with restricted ip' do
|
|
allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return(tokyo_ip)
|
|
get auth_request
|
|
expect(response.status).to eq(423)
|
|
expect(response.headers['Authorization']).to be_nil
|
|
expect(response.body).to eq("{\"errors\":[\"authz.restrict.blacklist\"]}")
|
|
end
|
|
|
|
it 'with non-restricted ip' do
|
|
allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return(london_ip)
|
|
get auth_request
|
|
expect(response.status).to eq(200)
|
|
end
|
|
end
|
|
|
|
context 'restricts with continent' do
|
|
let!(:restriction) { create(:restriction, value: 'EUROPE', scope: 'continent', category: 'blacklist') }
|
|
|
|
it 'with restricted ip' do
|
|
allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return(london_ip)
|
|
get auth_request
|
|
expect(response.status).to eq(423)
|
|
expect(response.headers['Authorization']).to be_nil
|
|
expect(response.body).to eq("{\"errors\":[\"authz.restrict.blacklist\"]}")
|
|
end
|
|
|
|
it 'with non-restricted ip' do
|
|
allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return(tokyo_ip)
|
|
get auth_request
|
|
expect(response.status).to eq(200)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'test restriction ierarchy' do
|
|
before do
|
|
allow_any_instance_of(Barong::Authorize).to receive(:validate_session!).and_return(true)
|
|
Rails.cache.delete('restrictions')
|
|
do_create_session_request
|
|
allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return('192.168.0.1')
|
|
end
|
|
|
|
context 'whitelist -> maintenance' do
|
|
let!(:maintenance_restriction) { create(:restriction, value: '192.168.0.1', scope: 'ip', category: 'maintenance') }
|
|
let!(:whitelist_restriction) { create(:restriction, value: '192.168.0.1', scope: 'ip', category: 'whitelist') }
|
|
|
|
it '200' do
|
|
get auth_request
|
|
|
|
expect(response.status).to eq(200)
|
|
end
|
|
end
|
|
|
|
|
|
context 'maintenance -> blacklist' do
|
|
let!(:blacklist_restriction) { create(:restriction, value: '192.168.0.1', scope: 'ip', category: 'blacklist') }
|
|
let!(:maintenance_restriction) { create(:restriction, value: '192.168.0.1', scope: 'ip', category: 'maintenance') }
|
|
|
|
context 'standard code error' do
|
|
it '471' do
|
|
get auth_request
|
|
|
|
expect(response.status).to eq(471)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'blacklist' do
|
|
context 'standard code error' do
|
|
let!(:blacklist_restriction) { create(:restriction, value: '192.168.0.1', scope: 'ip', category: 'blacklist') }
|
|
|
|
it '401' do
|
|
get auth_request
|
|
|
|
expect(response.status).to eq(401)
|
|
end
|
|
end
|
|
|
|
context 'custom code error' do
|
|
let!(:blacklist_restriction) { create(:restriction, value: '192.168.0.1', scope: 'ip', category: 'blacklist', code: 403) }
|
|
|
|
it '403' do
|
|
get auth_request
|
|
|
|
expect(response.status).to eq(403)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|