wss_agent 18.10.2 → 18.10.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +15 -15
- data/.rspec +2 -2
- data/.travis.yml +6 -6
- data/Gemfile +4 -4
- data/LICENSE.txt +201 -201
- data/README.md +88 -88
- data/Rakefile +8 -8
- data/bin/wss_agent +13 -13
- data/lib/config/custom_default.yml +5 -5
- data/lib/config/default.yml +14 -14
- data/lib/data/ca-certificates.crt +4049 -4049
- data/lib/wss_agent.rb +50 -50
- data/lib/wss_agent/cli.rb +56 -56
- data/lib/wss_agent/client.rb +108 -108
- data/lib/wss_agent/configure.rb +115 -115
- data/lib/wss_agent/gem_sha1.rb +73 -73
- data/lib/wss_agent/project.rb +39 -39
- data/lib/wss_agent/response.rb +57 -57
- data/lib/wss_agent/response_inventory.rb +28 -28
- data/lib/wss_agent/response_policies.rb +77 -77
- data/lib/wss_agent/specifications.rb +202 -202
- data/lib/wss_agent/version.rb +4 -4
- data/spec/fixtures/vcr_cassettes/WssAgent_CLI/update/when_not_found_token/should_display_error_message.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/server_error/response_should_be_success.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/server_error/should_response_json_data.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/server_error/should_return_message_response.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/server_error/should_return_status_of_response.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/server_timeout/response_should_be_success.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/server_timeout/should_response_json_data.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/server_timeout/should_return_message_response.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/server_timeout/should_return_status_of_response.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/success/response_should_be_success.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/success/should_response_json_data.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/success/should_return_message_response.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Client/_update/success/should_return_status_of_response.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Specifications/_check_policies/should_check_policies.yml +50 -50
- data/spec/fixtures/vcr_cassettes/WssAgent_Specifications/_update/should_update_list_gems_on_server.yml +50 -50
- data/spec/fixtures/vcr_cassettes/WssAgent_Specifications/_update/when_check_policies_is_true/and_check_policies_return_a_violation/should_not_update_inventory.yml +2984 -2984
- data/spec/fixtures/vcr_cassettes/WssAgent_Specifications/_update/when_check_policies_is_true/and_check_policies_returns_without_a_violation/should_update_inventory.yml +2984 -2984
- data/spec/spec_helper.rb +36 -36
- data/spec/support/exit_code_matches.rb +37 -37
- data/spec/wss_agent/cli_spec.rb +58 -58
- data/spec/wss_agent/client_spec.rb +151 -151
- data/spec/wss_agent/configure_spec.rb +180 -180
- data/spec/wss_agent/specifications_spec.rb +162 -162
- data/wss_agent.gemspec +38 -38
- metadata +3 -3
data/lib/wss_agent/gem_sha1.rb
CHANGED
@@ -1,73 +1,73 @@
|
|
1
|
-
require 'digest'
|
2
|
-
|
3
|
-
module WssAgent
|
4
|
-
class GemSha1
|
5
|
-
attr_reader :spec
|
6
|
-
|
7
|
-
def initialize(spec)
|
8
|
-
@spec = spec
|
9
|
-
check_version! unless @spec.version > Gem::Version.new('0')
|
10
|
-
end
|
11
|
-
|
12
|
-
# check version
|
13
|
-
# if version isn't found get latest version
|
14
|
-
#
|
15
|
-
def check_version!
|
16
|
-
conn = Faraday.new(url: 'https://rubygems.org') do |h|
|
17
|
-
h.headers[:content_type] = 'application/x-www-form-urlencoded'
|
18
|
-
h.request :url_encoded
|
19
|
-
h.adapter :excon
|
20
|
-
end
|
21
|
-
response = conn.get("/api/v1/versions/#{spec.name}.json")
|
22
|
-
versions = MultiJson.load(response.body)
|
23
|
-
unless versions.detect { |j| j['number'] == spec.version }
|
24
|
-
spec.version = versions.first['number']
|
25
|
-
end
|
26
|
-
rescue
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
def sha1
|
31
|
-
case
|
32
|
-
when spec.source.is_a?(Bundler::Source::Rubygems)
|
33
|
-
path = spec.source.send(:cached_gem, spec).to_s
|
34
|
-
Digest::SHA1.hexdigest(File.binread(path))
|
35
|
-
when spec.source.is_a?(Bundler::Source::Git)
|
36
|
-
# ???
|
37
|
-
when spec.source.is_a?(Bundler::Source::Path)
|
38
|
-
# ????
|
39
|
-
when spec.source.nil?
|
40
|
-
remote_file
|
41
|
-
end
|
42
|
-
|
43
|
-
rescue => ex
|
44
|
-
WssAgent.logger.debug "#{ex.message}"
|
45
|
-
WssAgent.logger.debug "#{spec}"
|
46
|
-
remote_file
|
47
|
-
end
|
48
|
-
|
49
|
-
def remote_file_url
|
50
|
-
URI("http://rubygems.org/gems/#{spec.file_name}")
|
51
|
-
end
|
52
|
-
|
53
|
-
# download gem from rubygems
|
54
|
-
#
|
55
|
-
def remote_file(retry_request = false)
|
56
|
-
response = Net::HTTP.get_response(remote_file_url)
|
57
|
-
|
58
|
-
case response.code
|
59
|
-
when '200' # ok
|
60
|
-
Digest::SHA1.hexdigest(response.body)
|
61
|
-
|
62
|
-
when '302' # redirect
|
63
|
-
response = Net::HTTP.get_response(URI(response['location']))
|
64
|
-
return Digest::SHA1.hexdigest(response.body) if response.code == '200'
|
65
|
-
else # gem isn't found
|
66
|
-
''
|
67
|
-
end
|
68
|
-
|
69
|
-
rescue Timeout::Error
|
70
|
-
retry_request ? nil : remote_file(true)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
1
|
+
require 'digest'
|
2
|
+
|
3
|
+
module WssAgent
|
4
|
+
class GemSha1
|
5
|
+
attr_reader :spec
|
6
|
+
|
7
|
+
def initialize(spec)
|
8
|
+
@spec = spec
|
9
|
+
check_version! unless @spec.version > Gem::Version.new('0')
|
10
|
+
end
|
11
|
+
|
12
|
+
# check version
|
13
|
+
# if version isn't found get latest version
|
14
|
+
#
|
15
|
+
def check_version!
|
16
|
+
conn = Faraday.new(url: 'https://rubygems.org') do |h|
|
17
|
+
h.headers[:content_type] = 'application/x-www-form-urlencoded'
|
18
|
+
h.request :url_encoded
|
19
|
+
h.adapter :excon
|
20
|
+
end
|
21
|
+
response = conn.get("/api/v1/versions/#{spec.name}.json")
|
22
|
+
versions = MultiJson.load(response.body)
|
23
|
+
unless versions.detect { |j| j['number'] == spec.version }
|
24
|
+
spec.version = versions.first['number']
|
25
|
+
end
|
26
|
+
rescue
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def sha1
|
31
|
+
case
|
32
|
+
when spec.source.is_a?(Bundler::Source::Rubygems)
|
33
|
+
path = spec.source.send(:cached_gem, spec).to_s
|
34
|
+
Digest::SHA1.hexdigest(File.binread(path))
|
35
|
+
when spec.source.is_a?(Bundler::Source::Git)
|
36
|
+
# ???
|
37
|
+
when spec.source.is_a?(Bundler::Source::Path)
|
38
|
+
# ????
|
39
|
+
when spec.source.nil?
|
40
|
+
remote_file
|
41
|
+
end
|
42
|
+
|
43
|
+
rescue => ex
|
44
|
+
WssAgent.logger.debug "#{ex.message}"
|
45
|
+
WssAgent.logger.debug "#{spec}"
|
46
|
+
remote_file
|
47
|
+
end
|
48
|
+
|
49
|
+
def remote_file_url
|
50
|
+
URI("http://rubygems.org/gems/#{spec.file_name}")
|
51
|
+
end
|
52
|
+
|
53
|
+
# download gem from rubygems
|
54
|
+
#
|
55
|
+
def remote_file(retry_request = false)
|
56
|
+
response = Net::HTTP.get_response(remote_file_url)
|
57
|
+
|
58
|
+
case response.code
|
59
|
+
when '200' # ok
|
60
|
+
Digest::SHA1.hexdigest(response.body)
|
61
|
+
|
62
|
+
when '302' # redirect
|
63
|
+
response = Net::HTTP.get_response(URI(response['location']))
|
64
|
+
return Digest::SHA1.hexdigest(response.body) if response.code == '200'
|
65
|
+
else # gem isn't found
|
66
|
+
''
|
67
|
+
end
|
68
|
+
|
69
|
+
rescue Timeout::Error
|
70
|
+
retry_request ? nil : remote_file(true)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/wss_agent/project.rb
CHANGED
@@ -1,39 +1,39 @@
|
|
1
|
-
module WssAgent
|
2
|
-
class Project
|
3
|
-
def project_name
|
4
|
-
return gem.name if gem?
|
5
|
-
return rails_app_name if rails?
|
6
|
-
folder_name
|
7
|
-
end
|
8
|
-
|
9
|
-
def project_version
|
10
|
-
gem? ? gem.version.to_s : ''
|
11
|
-
end
|
12
|
-
|
13
|
-
def folder_name
|
14
|
-
Bundler.root.split.last.to_s
|
15
|
-
end
|
16
|
-
|
17
|
-
def gem?
|
18
|
-
!Dir.glob(Bundler.root.join('*.gemspec')).last.nil?
|
19
|
-
end
|
20
|
-
|
21
|
-
def gem
|
22
|
-
@gem ||= Gem::Specification.load(
|
23
|
-
Dir.glob(Bundler.root.join('*.gemspec')).last
|
24
|
-
)
|
25
|
-
end
|
26
|
-
|
27
|
-
def rails?
|
28
|
-
File.exist?(rails_app_path)
|
29
|
-
end
|
30
|
-
|
31
|
-
def rails_app_name
|
32
|
-
File.read(rails_app_path).match(/module (\w*)/)[1]
|
33
|
-
end
|
34
|
-
|
35
|
-
def rails_app_path
|
36
|
-
Bundler.root.join('config', 'application.rb')
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
1
|
+
module WssAgent
|
2
|
+
class Project
|
3
|
+
def project_name
|
4
|
+
return gem.name if gem?
|
5
|
+
return rails_app_name if rails?
|
6
|
+
folder_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def project_version
|
10
|
+
gem? ? gem.version.to_s : ''
|
11
|
+
end
|
12
|
+
|
13
|
+
def folder_name
|
14
|
+
Bundler.root.split.last.to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def gem?
|
18
|
+
!Dir.glob(Bundler.root.join('*.gemspec')).last.nil?
|
19
|
+
end
|
20
|
+
|
21
|
+
def gem
|
22
|
+
@gem ||= Gem::Specification.load(
|
23
|
+
Dir.glob(Bundler.root.join('*.gemspec')).last
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
def rails?
|
28
|
+
File.exist?(rails_app_path)
|
29
|
+
end
|
30
|
+
|
31
|
+
def rails_app_name
|
32
|
+
File.read(rails_app_path).match(/module (\w*)/)[1]
|
33
|
+
end
|
34
|
+
|
35
|
+
def rails_app_path
|
36
|
+
Bundler.root.join('config', 'application.rb')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/wss_agent/response.rb
CHANGED
@@ -1,57 +1,57 @@
|
|
1
|
-
module WssAgent
|
2
|
-
class Response
|
3
|
-
SUCCESS_STATUS = 1
|
4
|
-
BAD_REQUEST_STATUS = 2
|
5
|
-
SERVER_ERROR_STATUS = 3
|
6
|
-
|
7
|
-
attr_reader :response, :status, :message, :response_data, :data
|
8
|
-
|
9
|
-
def initialize(response)
|
10
|
-
@response = response
|
11
|
-
if response.is_a?(Faraday::Error::ClientError)
|
12
|
-
parse_error
|
13
|
-
else
|
14
|
-
parse_response
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def parse_error
|
19
|
-
@status = SERVER_ERROR_STATUS
|
20
|
-
@message = response.message
|
21
|
-
end
|
22
|
-
|
23
|
-
def parse_response
|
24
|
-
if response.success?
|
25
|
-
begin
|
26
|
-
@response_data = MultiJson.load(response.body)
|
27
|
-
@status = @response_data['status'].to_i
|
28
|
-
@message = @response_data['message']
|
29
|
-
rescue
|
30
|
-
@status = SERVER_ERROR_STATUS
|
31
|
-
@message = response.body
|
32
|
-
end
|
33
|
-
else
|
34
|
-
@status = SERVER_ERROR_STATUS
|
35
|
-
@message = response.body
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def response_success?
|
40
|
-
if response.is_a?(Faraday::Error::ClientError)
|
41
|
-
false
|
42
|
-
else
|
43
|
-
response.success?
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def success?
|
48
|
-
response_success? && status == SUCCESS_STATUS
|
49
|
-
end
|
50
|
-
|
51
|
-
def data
|
52
|
-
@data ||= MultiJson.load(response_data['data'])
|
53
|
-
rescue
|
54
|
-
response_data && response_data.key?('data') ? response_data['data'] : nil
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
1
|
+
module WssAgent
|
2
|
+
class Response
|
3
|
+
SUCCESS_STATUS = 1
|
4
|
+
BAD_REQUEST_STATUS = 2
|
5
|
+
SERVER_ERROR_STATUS = 3
|
6
|
+
|
7
|
+
attr_reader :response, :status, :message, :response_data, :data
|
8
|
+
|
9
|
+
def initialize(response)
|
10
|
+
@response = response
|
11
|
+
if response.is_a?(Faraday::Error::ClientError)
|
12
|
+
parse_error
|
13
|
+
else
|
14
|
+
parse_response
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def parse_error
|
19
|
+
@status = SERVER_ERROR_STATUS
|
20
|
+
@message = response.message
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse_response
|
24
|
+
if response.success?
|
25
|
+
begin
|
26
|
+
@response_data = MultiJson.load(response.body)
|
27
|
+
@status = @response_data['status'].to_i
|
28
|
+
@message = @response_data['message']
|
29
|
+
rescue
|
30
|
+
@status = SERVER_ERROR_STATUS
|
31
|
+
@message = response.body
|
32
|
+
end
|
33
|
+
else
|
34
|
+
@status = SERVER_ERROR_STATUS
|
35
|
+
@message = response.body
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def response_success?
|
40
|
+
if response.is_a?(Faraday::Error::ClientError)
|
41
|
+
false
|
42
|
+
else
|
43
|
+
response.success?
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def success?
|
48
|
+
response_success? && status == SUCCESS_STATUS
|
49
|
+
end
|
50
|
+
|
51
|
+
def data
|
52
|
+
@data ||= MultiJson.load(response_data['data'])
|
53
|
+
rescue
|
54
|
+
response_data && response_data.key?('data') ? response_data['data'] : nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -1,28 +1,28 @@
|
|
1
|
-
module WssAgent
|
2
|
-
class ResponseInventory < Response
|
3
|
-
def message
|
4
|
-
if success?
|
5
|
-
@message = "White Source update results: \n"
|
6
|
-
@message << " White Source organization: #{data['organization']} \n"
|
7
|
-
|
8
|
-
if data['createdProjects'].empty?
|
9
|
-
@message << " No new projects found \n"
|
10
|
-
else
|
11
|
-
@message << " #{data['createdProjects'].size} newly created projects: "
|
12
|
-
@message << data['createdProjects'].join(' ')
|
13
|
-
end
|
14
|
-
|
15
|
-
if data['updatedProjects'].empty?
|
16
|
-
@message << "\n No projects were updated \n"
|
17
|
-
else
|
18
|
-
@message << " #{data['updatedProjects'].size} existing projects were updated: "
|
19
|
-
@message << data['updatedProjects'].join(' ')
|
20
|
-
end
|
21
|
-
|
22
|
-
@message
|
23
|
-
else
|
24
|
-
super
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
1
|
+
module WssAgent
|
2
|
+
class ResponseInventory < Response
|
3
|
+
def message
|
4
|
+
if success?
|
5
|
+
@message = "White Source update results: \n"
|
6
|
+
@message << " White Source organization: #{data['organization']} \n"
|
7
|
+
|
8
|
+
if data['createdProjects'].empty?
|
9
|
+
@message << " No new projects found \n"
|
10
|
+
else
|
11
|
+
@message << " #{data['createdProjects'].size} newly created projects: "
|
12
|
+
@message << data['createdProjects'].join(' ')
|
13
|
+
end
|
14
|
+
|
15
|
+
if data['updatedProjects'].empty?
|
16
|
+
@message << "\n No projects were updated \n"
|
17
|
+
else
|
18
|
+
@message << " #{data['updatedProjects'].size} existing projects were updated: "
|
19
|
+
@message << data['updatedProjects'].join(' ')
|
20
|
+
end
|
21
|
+
|
22
|
+
@message
|
23
|
+
else
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,77 +1,77 @@
|
|
1
|
-
module WssAgent
|
2
|
-
class ResponsePolicies < Response
|
3
|
-
REJECT_ACTION = 'Reject'.freeze
|
4
|
-
|
5
|
-
def parse_response
|
6
|
-
if response.success?
|
7
|
-
begin
|
8
|
-
@response_data = MultiJson.load(response.body)
|
9
|
-
@status = @response_data['status'].to_i
|
10
|
-
@message = @response_data['message']
|
11
|
-
check_new_projects
|
12
|
-
check_existing_projects
|
13
|
-
rescue
|
14
|
-
@status = SERVER_ERROR_STATUS
|
15
|
-
@message = response.body
|
16
|
-
end
|
17
|
-
else
|
18
|
-
@status = SERVER_ERROR_STATUS
|
19
|
-
@message = response.body
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def message
|
24
|
-
if success?
|
25
|
-
if policy_violations?
|
26
|
-
@message = [
|
27
|
-
'Some dependencies do not conform with open source policies',
|
28
|
-
'List of violations:'
|
29
|
-
]
|
30
|
-
@message << policy_violations.each_with_index.map { |j, i|
|
31
|
-
"#{i + 1}. Package: #{j['resource']['displayName']} - #{j['policy']['displayName']}"
|
32
|
-
}.join("\n")
|
33
|
-
@message.join("\n")
|
34
|
-
else
|
35
|
-
'All dependencies conform with open source policies'
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def policy_violations
|
41
|
-
@policy_violations || []
|
42
|
-
end
|
43
|
-
|
44
|
-
def policy_violations?
|
45
|
-
!policy_violations.nil? &&
|
46
|
-
!policy_violations.empty? &&
|
47
|
-
policy_violations.size > 0
|
48
|
-
end
|
49
|
-
|
50
|
-
def check_existing_projects
|
51
|
-
data['existingProjects'].each { |_proj_name, resource| check(resource) }
|
52
|
-
end
|
53
|
-
|
54
|
-
def check_new_projects
|
55
|
-
data['newProjects'].each { |_proj_name, resource| check(resource) }
|
56
|
-
end
|
57
|
-
|
58
|
-
def add_resource(resource)
|
59
|
-
@policy_violations ||= []
|
60
|
-
@policy_violations << resource
|
61
|
-
end
|
62
|
-
|
63
|
-
def check(resource)
|
64
|
-
if resource.key?('resource') && resource.key?('policy') &&
|
65
|
-
(resource['policy']['actionType'] == REJECT_ACTION)
|
66
|
-
add_resource(
|
67
|
-
'resource' => resource['resource'],
|
68
|
-
'policy' => resource['policy']
|
69
|
-
)
|
70
|
-
end
|
71
|
-
|
72
|
-
if resource.key?('children') && resource['children'].is_a?(Array)
|
73
|
-
resource['children'].each { |j| check(j) }
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
1
|
+
module WssAgent
|
2
|
+
class ResponsePolicies < Response
|
3
|
+
REJECT_ACTION = 'Reject'.freeze
|
4
|
+
|
5
|
+
def parse_response
|
6
|
+
if response.success?
|
7
|
+
begin
|
8
|
+
@response_data = MultiJson.load(response.body)
|
9
|
+
@status = @response_data['status'].to_i
|
10
|
+
@message = @response_data['message']
|
11
|
+
check_new_projects
|
12
|
+
check_existing_projects
|
13
|
+
rescue
|
14
|
+
@status = SERVER_ERROR_STATUS
|
15
|
+
@message = response.body
|
16
|
+
end
|
17
|
+
else
|
18
|
+
@status = SERVER_ERROR_STATUS
|
19
|
+
@message = response.body
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def message
|
24
|
+
if success?
|
25
|
+
if policy_violations?
|
26
|
+
@message = [
|
27
|
+
'Some dependencies do not conform with open source policies',
|
28
|
+
'List of violations:'
|
29
|
+
]
|
30
|
+
@message << policy_violations.each_with_index.map { |j, i|
|
31
|
+
"#{i + 1}. Package: #{j['resource']['displayName']} - #{j['policy']['displayName']}"
|
32
|
+
}.join("\n")
|
33
|
+
@message.join("\n")
|
34
|
+
else
|
35
|
+
'All dependencies conform with open source policies'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def policy_violations
|
41
|
+
@policy_violations || []
|
42
|
+
end
|
43
|
+
|
44
|
+
def policy_violations?
|
45
|
+
!policy_violations.nil? &&
|
46
|
+
!policy_violations.empty? &&
|
47
|
+
policy_violations.size > 0
|
48
|
+
end
|
49
|
+
|
50
|
+
def check_existing_projects
|
51
|
+
data['existingProjects'].each { |_proj_name, resource| check(resource) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def check_new_projects
|
55
|
+
data['newProjects'].each { |_proj_name, resource| check(resource) }
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_resource(resource)
|
59
|
+
@policy_violations ||= []
|
60
|
+
@policy_violations << resource
|
61
|
+
end
|
62
|
+
|
63
|
+
def check(resource)
|
64
|
+
if resource.key?('resource') && resource.key?('policy') &&
|
65
|
+
(resource['policy']['actionType'] == REJECT_ACTION)
|
66
|
+
add_resource(
|
67
|
+
'resource' => resource['resource'],
|
68
|
+
'policy' => resource['policy']
|
69
|
+
)
|
70
|
+
end
|
71
|
+
|
72
|
+
if resource.key?('children') && resource['children'].is_a?(Array)
|
73
|
+
resource['children'].each { |j| check(j) }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|