veracode-api 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/Gemfile +12 -0
- data/LICENSE +13 -0
- data/README.md +36 -0
- data/Rakefile +9 -0
- data/lib/veracode-api.rb +14 -0
- data/lib/veracode/admin.rb +6 -0
- data/lib/veracode/api/builds.rb +95 -0
- data/lib/veracode/api/call_stack.rb +59 -0
- data/lib/veracode/api/detailed.rb +169 -0
- data/lib/veracode/api/flaws.rb +154 -0
- data/lib/veracode/api/summary.rb +93 -0
- data/lib/veracode/api/types.rb +205 -0
- data/lib/veracode/api/upload.rb +155 -0
- data/lib/veracode/base.rb +37 -0
- data/lib/veracode/config.rb +22 -0
- data/lib/veracode/parser/parser.rb +77 -0
- data/lib/veracode/results.rb +71 -0
- data/lib/veracode/upload.rb +76 -0
- data/lib/veracode/version.rb +5 -0
- data/spec/fixtures/veracode_cassettes/base.yml +7319 -0
- data/spec/lib/veracode/base_spec.rb +37 -0
- data/spec/lib/veracode/builds_spec.rb +35 -0
- data/spec/lib/veracode/call_stack_spec.rb +24 -0
- data/spec/lib/veracode/detailed_spec.rb +65 -0
- data/spec/lib/veracode/summary_spec.rb +65 -0
- data/spec/lib/veracode/upload_spec.rb +74 -0
- data/spec/spec_helper.rb +25 -0
- data/veracode-api.gemspec +28 -0
- metadata +169 -0
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'veracode/api/types'
|
2
|
+
require 'veracode/api/flaws'
|
3
|
+
|
4
|
+
module Veracode
|
5
|
+
module Result
|
6
|
+
|
7
|
+
class SummaryCategory < Veracode::Common::Base
|
8
|
+
api_field :categoryname, :tag => :categoryname
|
9
|
+
api_field :severity, :tag => :severity
|
10
|
+
api_field :count, :tag => :count
|
11
|
+
end
|
12
|
+
|
13
|
+
class SummarySeverity < Veracode::Common::Base
|
14
|
+
api_field :level, :tag => :level
|
15
|
+
|
16
|
+
def categories
|
17
|
+
@categories ||= []
|
18
|
+
begin
|
19
|
+
if @categories.empty?
|
20
|
+
if @xml_hash.category.class == Array
|
21
|
+
@categories = @xml_hash.category.map do |sev|
|
22
|
+
SummaryCategory.new(sev)
|
23
|
+
end
|
24
|
+
else
|
25
|
+
@categories << SummaryCategory.new(@xml_hash.category)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
rescue NoMethodError
|
29
|
+
end
|
30
|
+
|
31
|
+
return @categories
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class SummaryReport < Veracode::Common::Base
|
36
|
+
api_field :report_format_version, :tag => :report_format_version
|
37
|
+
api_field :app_name, :tag => :app_name
|
38
|
+
api_field :app_id, :tag => :app_id
|
39
|
+
api_field :first_build_submitted_date, :tag => :first_build_submitted_date
|
40
|
+
api_field :version, :tag => :version
|
41
|
+
api_field :build_id, :tag => :build_id
|
42
|
+
api_field :vendor, :tag => :vendor
|
43
|
+
api_field :submitter, :tag => :submitter
|
44
|
+
api_field :platform, :tag => :platform
|
45
|
+
api_field :assurance_level, :tag => :assurance_level
|
46
|
+
api_field :business_criticality, :tag => :business_criticality
|
47
|
+
api_field :generation_date, :tag => :generation_date
|
48
|
+
api_field :veracode_level, :tag => :veracode_level
|
49
|
+
api_field :total_flaws, :tag => :total_flaws
|
50
|
+
api_field :flaws_not_mitigated, :tag => :flaws_not_mitigated
|
51
|
+
api_field :teams, :tag => :teams
|
52
|
+
api_field :life_cycle_stage, :tag => :life_cycle_stage
|
53
|
+
api_field :planned_deployment_date, :tag => :planned_deployment_date
|
54
|
+
api_field :last_update_time, :tag => :last_update_time
|
55
|
+
api_field :policy_name, :tag => :policy_name
|
56
|
+
api_field :policy_version, :tag => :policy_version
|
57
|
+
api_field :policy_compliance_status, :tag => :policy_compliance_status
|
58
|
+
api_field :policy_rules_status, :tag => :policy_rules_status
|
59
|
+
api_field :scan_overdue, :tag => :scan_overdue
|
60
|
+
api_field :any_type_scan_due, :tag => :any_type_scan_due
|
61
|
+
api_field :business_owner, :tag => :business_owner
|
62
|
+
api_field :business_unit, :tag => :business_unit
|
63
|
+
api_field :tags, :tag => :tags
|
64
|
+
|
65
|
+
api_type_field :static_analysis, :tag => :static_analysis, :as => Analysis
|
66
|
+
api_type_field :dynamic_analysis, :tag => :dynamic_analysis, :as => Analysis
|
67
|
+
api_type_field :manual_analysis, :tag => :manual_analysis, :as => ManualAnalysis
|
68
|
+
api_type_field :flaw_status, :tag => :flaw_status, :as => FlawStatus
|
69
|
+
|
70
|
+
def is_latest_build?
|
71
|
+
@is_latest_build ||= @xml_hash.is_latest_build.to_bool
|
72
|
+
end
|
73
|
+
|
74
|
+
def grace_period_expired?
|
75
|
+
@grace_period_expired ||= @xml_hash.grace_period_expired.to_bool
|
76
|
+
end
|
77
|
+
|
78
|
+
def severity
|
79
|
+
@severity ||= []
|
80
|
+
if @severity.empty?
|
81
|
+
if @xml_hash.severity.class == Array
|
82
|
+
@severity = @xml_hash.severity.map do |sev|
|
83
|
+
SummarySeverity.new(sev)
|
84
|
+
end
|
85
|
+
else
|
86
|
+
@severity << SummarySeverity.new(@xml_hash.severity)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
return @severity
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,205 @@
|
|
1
|
+
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
# Veracode API General Types used by Summary and Detailed results as well as Application Build API
|
5
|
+
#
|
6
|
+
module Veracode
|
7
|
+
module Common
|
8
|
+
# Base Class for result
|
9
|
+
class Base
|
10
|
+
|
11
|
+
def self.api_field(name, args)
|
12
|
+
send(:define_method, name) do
|
13
|
+
begin
|
14
|
+
return @xml_hash.send(args[:tag].to_sym)
|
15
|
+
rescue NoMethodError
|
16
|
+
return nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.api_type_field(name, args)
|
22
|
+
send(:define_method, name) do
|
23
|
+
begin
|
24
|
+
tmp = eval("@" + name.to_s)
|
25
|
+
tmp ||= args[:as].new(@xml_hash.send(args[:tag].to_sym))
|
26
|
+
instance_variable_set("@#{name}", tmp)
|
27
|
+
return tmp
|
28
|
+
rescue NoMethodError
|
29
|
+
return nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
# Takes Hash of XML stores, hash is has addition to allow dot access to components
|
34
|
+
def initialize(xml_hash)
|
35
|
+
@xml_hash = xml_hash
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
module Result
|
41
|
+
class Screenshot < Veracode::Common::Base
|
42
|
+
api_field :format, :tag => :format
|
43
|
+
|
44
|
+
def data
|
45
|
+
@scr_data ||= Base64.decode64(@xml_hash.data)
|
46
|
+
|
47
|
+
return @scr_data
|
48
|
+
end
|
49
|
+
#xml_reader(:data) {|b64data| Base64.decode64(b64data) }
|
50
|
+
end
|
51
|
+
|
52
|
+
class BulletType < Veracode::Common::Base
|
53
|
+
api_field :text, :tag => :text
|
54
|
+
end
|
55
|
+
|
56
|
+
class ParaType < Veracode::Common::Base
|
57
|
+
#xml_reader :bulletitem, :as => [BulletType]
|
58
|
+
api_field :text, :tag => :text
|
59
|
+
|
60
|
+
def bulletitem
|
61
|
+
@bulletitems ||= []
|
62
|
+
begin
|
63
|
+
if @bulletitems.empty?
|
64
|
+
if @xml_hash.bulletitem.class == Array
|
65
|
+
@bulletitems = @xml_hash.bulletitem.map do |item|
|
66
|
+
BulletType.new(item)
|
67
|
+
end
|
68
|
+
else
|
69
|
+
@bulletitems << BulletType.new(@xml_hash.bulletitem)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
rescue NoMethodError
|
73
|
+
end
|
74
|
+
return @bulletitems
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class TextType < Veracode::Common::Base
|
79
|
+
#xml_reader :text, :from => "text/@text"
|
80
|
+
end
|
81
|
+
|
82
|
+
class Para < Veracode::Common::Base
|
83
|
+
#xml_reader :para, :as => [ParaType]
|
84
|
+
def para
|
85
|
+
@paras ||= []
|
86
|
+
if @paras.empty?
|
87
|
+
if @xml_hash.para.class == Array
|
88
|
+
@paras = @xml_hash.para.map do |para|
|
89
|
+
ParaType.new(para)
|
90
|
+
end
|
91
|
+
else
|
92
|
+
@paras << ParaType.new(@xml_hash.para)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
return @paras
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class AppendixType < Veracode::Common::Base
|
100
|
+
api_field :description, :tag => :description
|
101
|
+
#xml_reader :screenshot, :as => [Screenshot]
|
102
|
+
def screenshot
|
103
|
+
@screenshots ||= []
|
104
|
+
begin
|
105
|
+
if @screenshots.empty?
|
106
|
+
if @xml_hash.screenshot.class == Array
|
107
|
+
@screenshots = @xml_hash.screenshot.map do |screenshot|
|
108
|
+
Screenshot.new(screenshot)
|
109
|
+
end
|
110
|
+
else
|
111
|
+
@screenshots << Screenshot.new(@xml_hash.screenshot)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
rescue NoMethodError
|
115
|
+
end
|
116
|
+
return @screenshots
|
117
|
+
end
|
118
|
+
api_field :code, :tag => :code
|
119
|
+
end
|
120
|
+
|
121
|
+
class Module < Veracode::Common::Base
|
122
|
+
api_field :name, :tag => :name
|
123
|
+
api_field :compiler, :tag => :compiler
|
124
|
+
api_field :os, :tag => :os
|
125
|
+
api_field :architecture, :tag => :architecture
|
126
|
+
api_field :score, :tag => :score
|
127
|
+
api_field :numflawssev0, :tag => :numflawssev0
|
128
|
+
api_field :numflawssev1, :tag => :numflawssev1
|
129
|
+
api_field :numflawssev2, :tag => :numflawssev2
|
130
|
+
api_field :numflawssev3, :tag => :numflawssev3
|
131
|
+
api_field :numflawssev4, :tag => :numflawssev4
|
132
|
+
api_field :numflawssev5, :tag => :numflawssev5
|
133
|
+
end
|
134
|
+
|
135
|
+
class Analysis < Veracode::Common::Base
|
136
|
+
|
137
|
+
api_field :analysis_size_bytes, :tag => :analysis_size_bytes
|
138
|
+
api_field :rating, :tag => :rating
|
139
|
+
api_field :score, :tag => :score
|
140
|
+
api_field :mitigated_rating, :tag => :mitigated_rating
|
141
|
+
api_field :mitigated_score, :tag => :mitigated_score
|
142
|
+
api_field :submitted_date, :tag => :submitted_date
|
143
|
+
api_field :published_date, :tag => :published_date
|
144
|
+
api_field :next_scan_due, :tag => :next_scan_due
|
145
|
+
|
146
|
+
def modules
|
147
|
+
@modules ||= []
|
148
|
+
if @modules.empty?
|
149
|
+
if @xml_hash.modules.class == Array
|
150
|
+
@modules = @xml_hash.modules.map do |modules|
|
151
|
+
Module.new(modules.module)
|
152
|
+
end
|
153
|
+
else
|
154
|
+
@modules << Module.new(@xml_hash.modules.module)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
return @modules
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
class ManualAnalysis < Veracode::Common::Base
|
162
|
+
api_field :rating, :tag => :rating
|
163
|
+
api_field :score, :tag => :score
|
164
|
+
api_field :mitigated_rating, :tag => :mitigated_rating
|
165
|
+
api_field :mitigated_score, :tag => :mitigated_score
|
166
|
+
api_field :submitted_date, :tag => :submitted_date
|
167
|
+
api_field :published_date, :tag => :published_date
|
168
|
+
api_field :next_scan_due, :tag => :next_scan_due
|
169
|
+
api_field :cia_adjustment, :tag => :cia_adjustment
|
170
|
+
api_field :delivery_consultant, :tag => :delivery_consultant
|
171
|
+
|
172
|
+
def modules
|
173
|
+
@modules ||= []
|
174
|
+
if @modules.empty?
|
175
|
+
if @xml_hash.modules.class == Array
|
176
|
+
@modules = @xml_hash.modules.map do |modules|
|
177
|
+
Module.new(modules.module)
|
178
|
+
end
|
179
|
+
else
|
180
|
+
@modules << Module.new(@xml_hash.modules.module)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
return @modules
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
class FlawStatus < Veracode::Common::Base
|
188
|
+
api_field :new_flaws, :tag => :new
|
189
|
+
api_field :reopen_flaws, :tag => :reopen
|
190
|
+
#api_field :open_flaws, :tag => :open
|
191
|
+
api_field :fixed_flaws, :tag => :fixed
|
192
|
+
api_field :total_flaws, :tag => :total
|
193
|
+
api_field :not_mitigated, :tag => :not_mitigated
|
194
|
+
api_field :sev_1_change, :tag => :sev_1_change
|
195
|
+
api_field :sev_2_change, :tag => :sev_2_change
|
196
|
+
api_field :sev_3_change, :tag => :sev_3_change
|
197
|
+
api_field :sev_4_change, :tag => :sev_4_change
|
198
|
+
api_field :sev_5_change, :tag => :sev_5_change
|
199
|
+
|
200
|
+
def open_flaws
|
201
|
+
return @xml_hash['open']
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'veracode/api/types'
|
2
|
+
|
3
|
+
module Veracode
|
4
|
+
module Upload
|
5
|
+
class AnalysisUnit < Veracode::Common::Base
|
6
|
+
api_field :analysis_type, :tag => :analysis_type
|
7
|
+
api_field :status, :tag => :status
|
8
|
+
api_field :published_date, :tag => :published_date
|
9
|
+
end
|
10
|
+
|
11
|
+
class Build < Veracode::Common::Base
|
12
|
+
api_field :version, :tag => :version
|
13
|
+
api_field :build_id, :tag => :build_id
|
14
|
+
api_field :submitter, :tag => :submitter
|
15
|
+
api_field :platform, :tag => :platform
|
16
|
+
api_field :lifecycle_stage, :tag => :lifecycle_stage
|
17
|
+
api_field :policy_name, :tag => :policy_name
|
18
|
+
api_field :policy_version, :tag => :policy_version
|
19
|
+
api_field :policy_compliance_status, :tag => :policy_compliance_status
|
20
|
+
api_field :rules_status, :tag => :rules_status
|
21
|
+
|
22
|
+
def grace_period_expired?
|
23
|
+
@grace_period_expired ||= @xml_hash.grace_period_expired.to_bool
|
24
|
+
end
|
25
|
+
|
26
|
+
def scan_overdue?
|
27
|
+
@scan_overdue ||= @xml_hash.scan_overdue.to_bool
|
28
|
+
end
|
29
|
+
|
30
|
+
def results_ready?
|
31
|
+
@results_ready ||= @xml_hash.results_ready.to_bool
|
32
|
+
end
|
33
|
+
|
34
|
+
def analysis_units
|
35
|
+
@analysis_units ||= []
|
36
|
+
if @analysis_units.empty?
|
37
|
+
if @xml_hash.analysis_unit.class == Array
|
38
|
+
@analysis_units = @xml_hash.analysis_unit.map do |analysis_unit|
|
39
|
+
AnalysisUnit.new(analysis_unit)
|
40
|
+
end
|
41
|
+
else
|
42
|
+
@analysis_units << AnalysisUnit.new(@xml_hash.analysis_unit)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
return @analysis_units
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class BuildInfo < Veracode::Common::Base
|
50
|
+
api_field :build_id, :tag => :build_id
|
51
|
+
api_field :app_id, :tag => :app_id
|
52
|
+
api_field :account_id, :tag => :account_id
|
53
|
+
|
54
|
+
api_type_field :build, :tag => :build, :as => Build
|
55
|
+
end
|
56
|
+
|
57
|
+
class BuildList < Veracode::Common::Base
|
58
|
+
api_field :app_id, :tag => :app_id
|
59
|
+
api_field :account_id, :tag => :account_id
|
60
|
+
api_field :app_name, :tag => :app_name
|
61
|
+
|
62
|
+
def build
|
63
|
+
@builds ||= []
|
64
|
+
begin
|
65
|
+
if @builds.empty?
|
66
|
+
if @xml_hash.build.class == Array
|
67
|
+
@builds = @xml_hash.build.map do |item|
|
68
|
+
Build.new(item)
|
69
|
+
end
|
70
|
+
else
|
71
|
+
@builds << Build.new(@xml_hash.build)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
rescue NoMethodError
|
75
|
+
end
|
76
|
+
return @builds
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class Application < Veracode::Common::Base
|
81
|
+
api_field :app_id, :tag => :app_id
|
82
|
+
api_field :app_name, :tag => :app_name
|
83
|
+
api_field :vendor, :tag => :vendor
|
84
|
+
api_field :description, :tag => :description
|
85
|
+
api_field :business_criticality, :tag => :business_criticality
|
86
|
+
api_field :policy, :tag => :policy
|
87
|
+
api_field :teams, :tag => :teams
|
88
|
+
api_field :origin, :tag => :origin
|
89
|
+
api_field :industry_vertical, :tag => :industry_vertical
|
90
|
+
api_field :app_type, :tag => :app_type
|
91
|
+
api_field :deployment_method, :tag => :deployment_method
|
92
|
+
api_field :archer_app_name, :tag => :archer_app_name
|
93
|
+
api_field :modified_date, :tag => :modified_date
|
94
|
+
api_field :vendor_id, :tag => :vendor_id
|
95
|
+
api_field :business_unit, :tag => :business_unit
|
96
|
+
api_field :business_owner, :tag => :business_owner
|
97
|
+
api_field :business_owner_email, :tag => :business_owner_email
|
98
|
+
api_field :tags, :tag => :tags
|
99
|
+
|
100
|
+
def is_web_application?
|
101
|
+
@is_web_application ||= @xml_hash.is_web_application.to_bool
|
102
|
+
end
|
103
|
+
|
104
|
+
def cots?
|
105
|
+
@cots ||= @xml_hash.cots.to_bool
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
class ApplicationInfo < Veracode::Common::Base
|
110
|
+
def application
|
111
|
+
@applications ||= []
|
112
|
+
begin
|
113
|
+
if @applications.empty?
|
114
|
+
if @xml_hash.application.class == Array
|
115
|
+
@applications = @xml_hash.application.map do |item|
|
116
|
+
Application.new(item)
|
117
|
+
end
|
118
|
+
else
|
119
|
+
@applications << Application.new(@xml_hash.application)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
rescue NoMethodError
|
123
|
+
end
|
124
|
+
return @applications
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
class App < Veracode::Common::Base
|
129
|
+
api_field :app_id, :tag => :app_id
|
130
|
+
api_field :app_name, :tag => :app_name
|
131
|
+
api_field :vendor_name, :tag => :vendor_name
|
132
|
+
end
|
133
|
+
|
134
|
+
class AppList < Veracode::Common::Base
|
135
|
+
api_field :account_id, :tag => :account_id
|
136
|
+
|
137
|
+
def app
|
138
|
+
@applications ||= []
|
139
|
+
begin
|
140
|
+
if @applications.empty?
|
141
|
+
if @xml_hash.app.class == Array
|
142
|
+
@applications = @xml_hash.app.map do |item|
|
143
|
+
App.new(item)
|
144
|
+
end
|
145
|
+
else
|
146
|
+
@applications << App.new(@xml_hash.app)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
rescue NoMethodError
|
150
|
+
end
|
151
|
+
return @applications
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|