-
Notifications
You must be signed in to change notification settings - Fork 328
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix permissions for admin groups without analytics permissions.
If a limited admin without superuser privileges belonged to only admin groups without any analytics permissions, then it was possible they could inadvertently be granted access to all analytics data (outside of just the admin groups they did belong to without analytics permissions). This was caused when the LogSearchPolicy scope was applied, since if there were no analytics scopes, then no conditions were being applied (rather than returning no results). This fixes the policy scope and adds missing permission tests to all the analytics endpoints to test for this scenario.
- Loading branch information
Showing
10 changed files
with
271 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
require_relative "../../../test_helper" | ||
|
||
class Test::Apis::Admin::Stats::TestLogsAdminPermissions < Minitest::Test | ||
include ApiUmbrellaTestHelpers::AdminAuth | ||
include ApiUmbrellaTestHelpers::AdminPermissions | ||
include ApiUmbrellaTestHelpers::Setup | ||
|
||
def setup | ||
super | ||
setup_server | ||
ElasticsearchHelper.clean_es_indices(["2015-01"]) | ||
end | ||
|
||
def test_default_permissions | ||
factory = :google_log_item | ||
assert_default_admin_permissions(factory, :required_permissions => ["analytics"]) | ||
end | ||
|
||
private | ||
|
||
def make_request(factory, admin) | ||
ElasticsearchHelper.clean_es_indices(["2015-01"]) | ||
FactoryGirl.create(factory, :request_at => Time.parse("2015-01-15T00:00:00Z").utc) | ||
LogItem.gateway.refresh_index! | ||
|
||
Typhoeus.get("https://127.0.0.1:9081/admin/stats/logs.json", http_options.deep_merge(admin_session(admin)).deep_merge({ | ||
:params => { | ||
"start_at" => "2015-01-13", | ||
"end_at" => "2015-01-18", | ||
"interval" => "day", | ||
"start" => "0", | ||
"length" => "10", | ||
}, | ||
})) | ||
end | ||
|
||
def assert_admin_permitted(factory, admin) | ||
response = make_request(factory, admin) | ||
assert_response_code(200, response) | ||
data = MultiJson.load(response.body) | ||
assert_equal(1, data["recordsTotal"]) | ||
assert_equal(1, data["recordsFiltered"]) | ||
assert_equal(1, data["data"].length) | ||
end | ||
|
||
def assert_admin_forbidden(factory, admin) | ||
response = make_request(factory, admin) | ||
assert_response_code(200, response) | ||
data = MultiJson.load(response.body) | ||
assert_equal(0, data["recordsTotal"]) | ||
assert_equal(0, data["recordsFiltered"]) | ||
assert_equal(0, data["data"].length) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
require_relative "../../../test_helper" | ||
|
||
class Test::Apis::Admin::Stats::TestMapAdminPermissions < Minitest::Test | ||
include ApiUmbrellaTestHelpers::AdminAuth | ||
include ApiUmbrellaTestHelpers::AdminPermissions | ||
include ApiUmbrellaTestHelpers::Setup | ||
|
||
def setup | ||
super | ||
setup_server | ||
ElasticsearchHelper.clean_es_indices(["2014-11", "2015-01", "2015-03"]) | ||
end | ||
|
||
def test_default_permissions | ||
factory = :google_log_item | ||
assert_default_admin_permissions(factory, :required_permissions => ["analytics"]) | ||
end | ||
|
||
private | ||
|
||
def make_request(factory, admin) | ||
FactoryGirl.create(factory, :request_at => Time.parse("2015-01-15T00:00:00Z").utc) | ||
LogItem.gateway.refresh_index! | ||
|
||
Typhoeus.get("https://127.0.0.1:9081/admin/stats/map.json", http_options.deep_merge(admin_session(admin)).deep_merge({ | ||
:params => { | ||
"start_at" => "2015-01-13", | ||
"end_at" => "2015-01-18", | ||
"region" => "world", | ||
}, | ||
})) | ||
end | ||
|
||
def assert_admin_permitted(factory, admin) | ||
response = make_request(factory, admin) | ||
assert_response_code(200, response) | ||
data = MultiJson.load(response.body) | ||
assert_equal(1, data["map_regions"].length) | ||
assert_equal(1, data["regions"].length) | ||
end | ||
|
||
def assert_admin_forbidden(factory, admin) | ||
response = make_request(factory, admin) | ||
assert_response_code(200, response) | ||
data = MultiJson.load(response.body) | ||
assert_equal(0, data["map_regions"].length) | ||
assert_equal(0, data["regions"].length) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
require_relative "../../../test_helper" | ||
|
||
class Test::Apis::Admin::Stats::TestSearchAdminPermissions < Minitest::Test | ||
include ApiUmbrellaTestHelpers::AdminAuth | ||
include ApiUmbrellaTestHelpers::AdminPermissions | ||
include ApiUmbrellaTestHelpers::Setup | ||
|
||
def setup | ||
super | ||
setup_server | ||
ElasticsearchHelper.clean_es_indices(["2015-01"]) | ||
end | ||
|
||
def test_default_permissions | ||
factory = :google_log_item | ||
assert_default_admin_permissions(factory, :required_permissions => ["analytics"]) | ||
end | ||
|
||
private | ||
|
||
def make_request(factory, admin) | ||
ElasticsearchHelper.clean_es_indices(["2015-01"]) | ||
FactoryGirl.create(factory, :request_at => Time.parse("2015-01-15T00:00:00Z").utc) | ||
LogItem.gateway.refresh_index! | ||
|
||
Typhoeus.get("https://127.0.0.1:9081/admin/stats/search.json", http_options.deep_merge(admin_session(admin)).deep_merge({ | ||
:params => { | ||
:search => "", | ||
:start_at => "2015-01-13", | ||
:end_at => "2015-01-18", | ||
:interval => "day", | ||
}, | ||
})) | ||
end | ||
|
||
def assert_admin_permitted(factory, admin) | ||
response = make_request(factory, admin) | ||
assert_response_code(200, response) | ||
data = MultiJson.load(response.body) | ||
assert_equal(1, data["stats"]["total_hits"]) | ||
assert_equal(1, data["stats"]["total_users"]) | ||
assert_equal(1, data["stats"]["total_ips"]) | ||
assert_equal(1, data["aggregations"]["users"].length) | ||
assert_equal(1, data["aggregations"]["ips"].length) | ||
assert_equal(6, data["hits_over_time"].length) | ||
hits_over_time_total = data["hits_over_time"].map { |hit| hit["c"][1]["v"] }.sum | ||
assert_equal(1, hits_over_time_total) | ||
end | ||
|
||
def assert_admin_forbidden(factory, admin) | ||
response = make_request(factory, admin) | ||
assert_response_code(200, response) | ||
data = MultiJson.load(response.body) | ||
assert_equal(0, data["stats"]["total_hits"]) | ||
assert_nil(data["stats"]["average_response_time"]) | ||
if(data["hits_over_time"].present?) | ||
assert_equal(0, data["stats"]["total_users"]) | ||
assert_equal(0, data["stats"]["total_ips"]) | ||
assert_equal(6, data["hits_over_time"].length) | ||
else | ||
assert_nil(data["stats"]["total_users"]) | ||
assert_nil(data["stats"]["total_ips"]) | ||
assert_equal(0, data["hits_over_time"].length) | ||
end | ||
hits_over_time_total = data["hits_over_time"].map { |hit| hit["c"][1]["v"] }.sum | ||
assert_equal(0, hits_over_time_total) | ||
end | ||
end |
59 changes: 59 additions & 0 deletions
59
test/apis/v1/analytics/test_drilldown_admin_permissions.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
require_relative "../../../test_helper" | ||
|
||
class Test::Apis::V1::Analytics::TestDrilldownAdminPermissions < Minitest::Test | ||
include ApiUmbrellaTestHelpers::AdminAuth | ||
include ApiUmbrellaTestHelpers::AdminPermissions | ||
include ApiUmbrellaTestHelpers::Setup | ||
|
||
def setup | ||
super | ||
setup_server | ||
ElasticsearchHelper.clean_es_indices(["2015-01"]) | ||
end | ||
|
||
def test_default_permissions | ||
factory = :google_log_item | ||
assert_default_admin_permissions(factory, :required_permissions => ["analytics"]) | ||
end | ||
|
||
private | ||
|
||
def make_request(factory, admin) | ||
ElasticsearchHelper.clean_es_indices(["2015-01"]) | ||
FactoryGirl.create(factory, :request_at => Time.parse("2015-01-15T00:00:00Z").utc) | ||
LogItem.gateway.refresh_index! | ||
|
||
Typhoeus.get("https://127.0.0.1:9081/api-umbrella/v1/analytics/drilldown.json", http_options.deep_merge(admin_token(admin)).deep_merge({ | ||
:params => { | ||
:search => "", | ||
:start_at => "2015-01-13", | ||
:end_at => "2015-01-18", | ||
:interval => "day", | ||
:prefix => "0/", | ||
}, | ||
})) | ||
end | ||
|
||
def assert_admin_permitted(factory, admin) | ||
response = make_request(factory, admin) | ||
assert_response_code(200, response) | ||
data = MultiJson.load(response.body) | ||
assert_equal(1, data["results"].length) | ||
assert_equal(1, data["results"][0]["hits"]) | ||
assert_equal(6, data["hits_over_time"]["rows"].length) | ||
hits_over_time_total = data["hits_over_time"]["rows"].map { |hit| hit["c"][1]["v"] }.sum | ||
assert_equal(1, hits_over_time_total) | ||
end | ||
|
||
def assert_admin_forbidden(factory, admin) | ||
response = make_request(factory, admin) | ||
assert_response_code(200, response) | ||
data = MultiJson.load(response.body) | ||
assert_equal(0, data["results"].length) | ||
if(data["hits_over_time"]["rows"].any?) | ||
assert_equal(6, data["hits_over_time"]["rows"].length) | ||
end | ||
hits_over_time_total = data["hits_over_time"]["rows"].map { |hit| if(hit["c"][1]) then hit["c"][1]["v"] else 0 end }.sum | ||
assert_equal(0, hits_over_time_total) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters