abide_dev_utils 0.12.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d6f05434761a55369ffb231c1573ba627aa5c9ebef29d198ccfa16c422d05c48
4
- data.tar.gz: 534968456e7eefca691fa6a3cdc46a170dc3ee12060261225fc35adadbc27d18
3
+ metadata.gz: 863b7f1da9e228c425708434e5adb149a04462c6f9e7a0189799761d9420b6e1
4
+ data.tar.gz: c221c833c4f6b89d80328b3e3bf2de527bb400fe8df5946af2c46d5be45d1b60
5
5
  SHA512:
6
- metadata.gz: b9907ee602b3367d4692b5c2102f0c769614f33d22980d5b8c0a14ea7dd15ac19947800eed399e6d68215ea2c21ab670b233209bf62e79399795fc5cc0ca68c2
7
- data.tar.gz: edbeac0d044795300b42ac1ddd70623abc9c9e7d322ecf1e5d6356c8b4f875a31e31e02c96397b0bc9ee1a6a815fa342401916d9f87696f0ad68f0bd9d887b75
6
+ metadata.gz: 715413f107df1c3f52269658b124db9bad5b4113042ca9e18eb11cabd73cb3b83a57e3f2adf13591fc168dc841be1fb93d3e972ce74aafe6888b95802b644316
7
+ data.tar.gz: 10eed44e5eb6969974f3426cc65c6c7a00cc988fc5a8ef733df50fafd1c395df44d7afec4b18f51c0ae42d5a36204174a88c42679a6eb3616080deccfb38a86f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- abide_dev_utils (0.12.1)
4
+ abide_dev_utils (0.13.0)
5
5
  amatch (~> 0.4)
6
6
  cmdparse (~> 3.0)
7
7
  facterdb (>= 1.18)
@@ -17,7 +17,7 @@ GEM
17
17
  remote: https://rubygems.org/
18
18
  specs:
19
19
  CFPropertyList (2.3.6)
20
- activesupport (7.0.3)
20
+ activesupport (7.0.4.1)
21
21
  concurrent-ruby (~> 1.0, >= 1.0.2)
22
22
  i18n (>= 1.6, < 2)
23
23
  minitest (>= 5.1)
@@ -60,10 +60,10 @@ GEM
60
60
  diff-lcs (1.5.0)
61
61
  digest-crc (0.6.4)
62
62
  rake (>= 12.0.0, < 14.0.0)
63
- facter (4.2.11)
63
+ facter (4.2.14)
64
64
  hocon (~> 1.3)
65
65
  thor (>= 1.0.1, < 2.0)
66
- facterdb (1.19.0)
66
+ facterdb (1.21.0)
67
67
  facter (< 5.0.0)
68
68
  jgrep
69
69
  faraday (2.3.0)
@@ -84,7 +84,7 @@ GEM
84
84
  octokit (~> 4.6)
85
85
  rainbow (>= 2.2.1)
86
86
  rake (>= 10.0)
87
- google-apis-core (0.7.0)
87
+ google-apis-core (0.10.0)
88
88
  addressable (~> 2.5, >= 2.5.1)
89
89
  googleauth (>= 0.16.2, < 2.a)
90
90
  httpclient (>= 2.8.1, < 3.a)
@@ -93,25 +93,25 @@ GEM
93
93
  retriable (>= 2.0, < 4.a)
94
94
  rexml
95
95
  webrick
96
- google-apis-iamcredentials_v1 (0.13.0)
97
- google-apis-core (>= 0.7, < 2.a)
98
- google-apis-storage_v1 (0.17.0)
99
- google-apis-core (>= 0.7, < 2.a)
96
+ google-apis-iamcredentials_v1 (0.16.0)
97
+ google-apis-core (>= 0.9.1, < 2.a)
98
+ google-apis-storage_v1 (0.19.0)
99
+ google-apis-core (>= 0.9.0, < 2.a)
100
100
  google-cloud-core (1.6.0)
101
101
  google-cloud-env (~> 1.0)
102
102
  google-cloud-errors (~> 1.0)
103
103
  google-cloud-env (1.6.0)
104
104
  faraday (>= 0.17.3, < 3.0)
105
- google-cloud-errors (1.2.0)
106
- google-cloud-storage (1.38.0)
105
+ google-cloud-errors (1.3.0)
106
+ google-cloud-storage (1.44.0)
107
107
  addressable (~> 2.8)
108
108
  digest-crc (~> 0.4)
109
109
  google-apis-iamcredentials_v1 (~> 0.1)
110
- google-apis-storage_v1 (~> 0.17.0)
110
+ google-apis-storage_v1 (~> 0.19.0)
111
111
  google-cloud-core (~> 1.6)
112
112
  googleauth (>= 0.16.2, < 2.a)
113
113
  mini_mime (~> 1.0)
114
- googleauth (1.2.0)
114
+ googleauth (1.3.0)
115
115
  faraday (>= 0.17.3, < 3.a)
116
116
  jwt (>= 1.4, < 3.0)
117
117
  memoist (~> 0.16)
@@ -119,31 +119,36 @@ GEM
119
119
  os (>= 0.9, < 2.0)
120
120
  signet (>= 0.16, < 2.a)
121
121
  hashdiff (1.0.1)
122
- hiera (3.10.0)
122
+ hashie (5.0.0)
123
+ hiera (3.11.0)
123
124
  hocon (1.3.1)
124
125
  httpclient (2.8.3)
125
- i18n (1.10.0)
126
+ i18n (1.12.0)
126
127
  concurrent-ruby (~> 1.0)
127
128
  jgrep (1.5.4)
128
- jira-ruby (2.2.0)
129
+ jira-ruby (2.3.0)
129
130
  activesupport
130
131
  atlassian-jwt
131
132
  multipart-post
132
133
  oauth (~> 0.5, >= 0.5.0)
133
- jwt (2.4.1)
134
+ jwt (2.7.0)
134
135
  locale (2.1.3)
135
136
  memoist (0.16.2)
136
137
  method_source (1.0.0)
137
138
  mini_mime (1.1.2)
138
- minitest (5.15.0)
139
- mize (0.4.0)
139
+ minitest (5.17.0)
140
+ mize (0.4.1)
140
141
  protocol (~> 2.0)
141
142
  multi_json (1.15.0)
142
- multipart-post (2.2.3)
143
+ multipart-post (2.3.0)
143
144
  nio4r (2.5.8)
144
- nokogiri (1.13.8-x86_64-darwin)
145
+ nokogiri (1.14.1-x86_64-darwin)
145
146
  racc (~> 1.4)
146
- oauth (0.5.10)
147
+ nokogiri (1.14.1-x86_64-linux)
148
+ racc (~> 1.4)
149
+ oauth (0.6.2)
150
+ snaky_hash (~> 2.0)
151
+ version_gem (~> 1.1)
147
152
  octokit (4.25.0)
148
153
  faraday (>= 1, < 3)
149
154
  sawyer (~> 0.9)
@@ -164,9 +169,20 @@ GEM
164
169
  coderay (~> 1.1)
165
170
  method_source (~> 1.0)
166
171
  public_suffix (4.0.7)
167
- puppet (7.18.0-universal-darwin)
172
+ puppet (7.22.0)
173
+ concurrent-ruby (~> 1.0, < 1.2.0)
174
+ deep_merge (~> 1.0)
175
+ facter (> 2.0.1, < 5)
176
+ fast_gettext (>= 1.1, < 3)
177
+ hiera (>= 3.2.1, < 4)
178
+ locale (~> 2.1)
179
+ multi_json (~> 1.10)
180
+ puppet-resource_api (~> 1.5)
181
+ scanf (~> 1.0)
182
+ semantic_puppet (~> 1.0)
183
+ puppet (7.22.0-universal-darwin)
168
184
  CFPropertyList (~> 2.2)
169
- concurrent-ruby (~> 1.0)
185
+ concurrent-ruby (~> 1.0, < 1.2.0)
170
186
  deep_merge (~> 1.0)
171
187
  facter (> 2.0.1, < 5)
172
188
  fast_gettext (>= 1.1, < 3)
@@ -178,7 +194,7 @@ GEM
178
194
  semantic_puppet (~> 1.0)
179
195
  puppet-resource_api (1.8.14)
180
196
  hocon (>= 1.0)
181
- racc (1.6.0)
197
+ racc (1.6.2)
182
198
  rainbow (3.1.1)
183
199
  rake (13.0.6)
184
200
  regexp_parser (2.5.0)
@@ -221,7 +237,7 @@ GEM
221
237
  rubocop (~> 1.19)
222
238
  ruby-progressbar (1.11.0)
223
239
  ruby2_keywords (0.0.5)
224
- ruby_parser (3.19.1)
240
+ ruby_parser (3.19.2)
225
241
  sexp_processor (~> 4.16)
226
242
  rubyzip (2.3.2)
227
243
  sawyer (0.9.2)
@@ -239,18 +255,22 @@ GEM
239
255
  faraday (>= 0.17.5, < 3.a)
240
256
  jwt (>= 1.5, < 3.0)
241
257
  multi_json (~> 1.10)
258
+ snaky_hash (2.0.1)
259
+ hashie
260
+ version_gem (~> 1.1, >= 1.1.1)
242
261
  sync (0.5.0)
243
262
  thor (1.2.1)
244
263
  timers (4.3.3)
245
- tins (1.31.1)
264
+ tins (1.32.1)
246
265
  sync
247
266
  traces (0.4.1)
248
267
  trailblazer-option (0.1.2)
249
- tzinfo (2.0.4)
268
+ tzinfo (2.0.5)
250
269
  concurrent-ruby (~> 1.0)
251
270
  uber (0.1.0)
252
271
  unicode-display_width (2.1.0)
253
- webrick (1.7.0)
272
+ version_gem (1.1.1)
273
+ webrick (1.8.1)
254
274
 
255
275
  PLATFORMS
256
276
  x86_64-darwin-19
@@ -120,7 +120,11 @@ module AbideDevUtils
120
120
  private
121
121
 
122
122
  def heading_builder
123
- @md.add_h2("#{@control.number} - #{@control.title}")
123
+ if @framework == 'stig'
124
+ @md.add_h2(@control.id)
125
+ else
126
+ @md.add_h2("#{@control.number} - #{@control.title}")
127
+ end
124
128
  end
125
129
 
126
130
  def control_has_valid_params?
@@ -216,12 +220,13 @@ module AbideDevUtils
216
220
  end
217
221
  return if out_str.empty?
218
222
 
219
- out_str.unshift(" #{@control.title.dump}:")
223
+ @control.title.nil? ? out_str.unshift(" #{@control.id.dump}:") : out_str.unshift(" #{@control.title.dump}:")
220
224
  out_str.unshift(' control_configs:')
221
225
  out_str.unshift("#{@module_name}::config:")
222
226
  @md.add_ul('Hiera Configuration Example:')
223
227
  @md.add_code_block(out_str.join("\n"), language: 'yaml')
224
228
  rescue StandardError => e
229
+ require 'pry'; binding.pry
225
230
  err_msg = [
226
231
  "Failed to generate config example for control #{@control.id}",
227
232
  "Error: #{e.message}",
@@ -6,13 +6,13 @@ require 'abide_dev_utils/cem/hiera_data/mapping_data/mixins'
6
6
  module AbideDevUtils
7
7
  module CEM
8
8
  module Mapping
9
- ALL_TYPES = %w[hiera_title_num number hiera_title vulnid title].freeze
9
+ ALL_TYPES = %w[hiera_title_num number hiera_title title vulnid ruleid].freeze
10
10
  FRAMEWORK_TYPES = {
11
11
  'cis' => %w[hiera_title_num number hiera_title title],
12
- 'stig' => %w[hiera_title_num number hiera_title vulnid title],
12
+ 'stig' => %w[vulnid ruleid],
13
13
  }.freeze
14
14
  CIS_TYPES = %w[hiera_title_num number hiera_title title].freeze
15
- STIG_TYPES = %w[hiera_title_num number hiera_title vulnid title].freeze
15
+ STIG_TYPES = %w[vulnid ruleid].freeze
16
16
 
17
17
  # Represents a single map data file
18
18
  class MapData
@@ -168,6 +168,8 @@ module AbideDevUtils
168
168
  'hiera_title'
169
169
  when %r{^V-[0-9]{6}$}
170
170
  'vulnid'
171
+ when %r{^SV-[0-9]+r[0-9]+_rule$}
172
+ 'ruleid'
171
173
  else
172
174
  'title'
173
175
  end
@@ -22,6 +22,7 @@ module Abide
22
22
  add_command(JiraGetIssueCommand.new)
23
23
  add_command(JiraNewIssueCommand.new)
24
24
  add_command(JiraFromCoverageCommand.new)
25
+ add_command(JiraFromXccdfCommand.new)
25
26
  end
26
27
  end
27
28
 
@@ -113,5 +114,27 @@ module Abide
113
114
  end
114
115
  end
115
116
  end
117
+
118
+ class JiraFromXccdfCommand < CmdParse::Command
119
+ CMD_NAME = 'from_xccdf'
120
+ CMD_SHORT = 'Creates a parent issue with subtasks from a xccdf file'
121
+ CMD_LONG = 'Creates a parent issue with subtasks for a benchmark and any uncovered controls'
122
+ def initialize
123
+ super(CMD_NAME, takes_commands: false)
124
+ short_desc(CMD_SHORT)
125
+ long_desc(CMD_LONG)
126
+ argument_desc(PATH: 'An XCCDF file', PROJECT: 'A Jira project')
127
+ options.on('-d', '--dry-run', 'Print to console instead of saving objects') { |_| @data[:dry_run] = true }
128
+ options.on('-e [EPIC]', '--epic [EPIC]', 'If given, tasks will be created and assigned to this epic. Takes form <PROJECT>-<NUM>') { |e| @data[:epic] = e }
129
+ end
130
+
131
+ def execute(path, project)
132
+ Abide::CLI::VALIDATE.file(path)
133
+ @data[:dry_run] = false if @data[:dry_run].nil?
134
+ client = JIRA.client(options: {})
135
+ proj = JIRA.project(client, project)
136
+ JIRA.new_issues_from_xccdf(client, proj, path, epic: @data[:epic], dry_run: @data[:dry_run])
137
+ end
138
+ end
116
139
  end
117
140
  end
@@ -9,6 +9,10 @@ module AbideDevUtils
9
9
  @default = 'Failed to create Jira issue:'
10
10
  end
11
11
 
12
+ class CreateEpicError < GenericError
13
+ @default = 'Failed to create Jira epic:'
14
+ end
15
+
12
16
  class CreateSubtaskError < GenericError
13
17
  @default = 'Failed to create Jira subtask for issue:'
14
18
  end
@@ -11,6 +11,7 @@ module AbideDevUtils
11
11
  ERRORS = AbideDevUtils::Errors::Jira
12
12
  COV_PARENT_SUMMARY_PREFIX = '::BENCHMARK:: '
13
13
  COV_CHILD_SUMMARY_PREFIX = '::CONTROL:: '
14
+ PROGRESS_BAR_FORMAT = '%a %e %P% Created: %c of %C'
14
15
 
15
16
  def self.project(client, project)
16
17
  client.Project.find(project)
@@ -18,6 +19,11 @@ module AbideDevUtils
18
19
 
19
20
  def self.issue(client, issue)
20
21
  client.Issue.find(issue)
22
+ rescue URI::InvalidURIError
23
+ iss = client.Issue.all.find { |i| i.summary == issue }
24
+ raise ERRORS::FindIssueError, issue unless iss
25
+
26
+ iss
21
27
  end
22
28
 
23
29
  def self.myself(client)
@@ -25,11 +31,19 @@ module AbideDevUtils
25
31
  end
26
32
 
27
33
  def self.issuetype(client, id)
28
- client.Issuetype.find(id)
34
+ if id.match?(%r{^\d+$})
35
+ client.Issuetype.find(id)
36
+ else
37
+ client.Issuetype.all.find { |i| i.name == id }
38
+ end
29
39
  end
30
40
 
31
41
  def self.priority(client, id)
32
- client.Priority.find(id)
42
+ if id.match?(%r{^\d+$})
43
+ client.Priority.find(id)
44
+ else
45
+ client.Priority.all.find { |i| i.name == id }
46
+ end
33
47
  end
34
48
 
35
49
  def self.all_project_issues_attrs(project)
@@ -37,21 +51,50 @@ module AbideDevUtils
37
51
  raw_issues.collect(&:attrs)
38
52
  end
39
53
 
40
- def self.new_issue(client, project, summary, dry_run: false)
54
+ def self.add_issue_label(iss, label, dry_run: false)
55
+ return if dry_run || iss.labels.include?(label)
56
+
57
+ iss.labels << profile_summary
58
+ iss.save
59
+ end
60
+
61
+ def self.new_issue(client, project, summary, labels: ['abide_dev_utils'], epic: nil, dry_run: false)
41
62
  if dry_run
42
63
  sleep(0.2)
43
- return Dummy.new
64
+ return Dummy.new(summary)
44
65
  end
45
66
  fields = {}
46
67
  fields['summary'] = summary
47
68
  fields['project'] = project(client, project)
48
69
  fields['reporter'] = myself(client)
49
- fields['issuetype'] = issuetype(client, '3')
70
+ fields['issuetype'] = issuetype(client, 'Task')
50
71
  fields['priority'] = priority(client, '6')
51
- issue = client.Issue.build
52
- raise ERRORS::CreateIssueError, issue.attrs unless issue.save({ 'fields' => fields })
72
+ fields['labels'] = labels
73
+ epic = issue(client, epic) if epic && !epic.is_a?(JIRA::Resource::Issue)
74
+ fields['customfield_10006'] = epic.key if epic # Epic_Link
75
+ iss = client.Issue.build
76
+ raise ERRORS::CreateIssueError, iss.attrs unless iss.save({ 'fields' => fields })
53
77
 
54
- issue
78
+ iss
79
+ end
80
+
81
+ def self.new_epic(client, project, summary, dry_run: false)
82
+ AbideDevUtils::Output.simple("#{dr_prefix(dry_run)}Creating epic '#{summary}'")
83
+ if dry_run
84
+ sleep(0.2)
85
+ return Dummy.new(summary)
86
+ end
87
+ fields = {
88
+ 'summary' => summary,
89
+ 'project' => project(client, project),
90
+ 'reporter' => myself(client),
91
+ 'issuetype' => issuetype(client, 'Epic'),
92
+ 'customfield_10007' => summary, # Epic Name
93
+ }
94
+ iss = client.Issue.build
95
+ raise ERRORS::CreateEpicError, iss.attrs unless iss.save({ 'fields' => fields })
96
+
97
+ iss
55
98
  end
56
99
 
57
100
  # This should probably be threaded in the future
@@ -135,15 +178,54 @@ module AbideDevUtils
135
178
  end
136
179
  end
137
180
 
138
- # def self.new_issues_from_comply_report(client, project, report, dry_run: false)
139
- # dr_prefix = dry_run ? 'DRY RUN: ' : ''
140
- # i_attrs = all_project_issues_attrs(project)
141
- # rep_sums = summaries_from_coverage_report(report)
142
- # rep_sums.each do |k, v|
143
- # next if summary_exist?(k, i_attrs)
181
+ def self.new_issues_from_xccdf(client, project, xccdf_path, epic: nil, dry_run: false)
182
+ i_attrs = all_project_issues_attrs(project)
183
+ xccdf = AbideDevUtils::XCCDF::Benchmark.new(xccdf_path)
184
+ # We need to get the actual epic Issue object, or create it if it doesn't exist
185
+ epic = if epic.nil?
186
+ new_epic_summary = "#{COV_PARENT_SUMMARY_PREFIX}#{xccdf.title}"
187
+ if summary_exist?(new_epic_summary, i_attrs)
188
+ issue(client, new_epic_summary)
189
+ else
190
+ unless AbideDevUtils::Prompt.yes_no("#{dr_prefix(dry_run)}Create new epic '#{new_epic_summary}'?")
191
+ AbideDevUtils::Output.simple("#{dr_prefix(dry_run)}Aborting")
192
+ exit(0)
193
+ end
194
+ new_epic(client, project.key, new_epic_summary, dry_run: dry_run)
195
+ end
196
+ else
197
+ issue(client, epic)
198
+ end
199
+ # Now we need to find out which issues we need to create for the benchmark
200
+ # The profiles that the control belongs to will be added as an issue label
201
+ to_create = {}
202
+ summaries_from_xccdf(xccdf).each do |profile_summary, control_summaries|
203
+ control_summaries.reject { |s| summary_exist?(s, i_attrs) }.each do |control_summary|
204
+ if to_create.key?(control_summary)
205
+ to_create[control_summary] << profile_summary.split.join('_').downcase
206
+ else
207
+ to_create[control_summary] = [profile_summary.split.join('_').downcase]
208
+ end
209
+ end
210
+ end
211
+
212
+ unless AbideDevUtils::Prompt.yes_no("#{dr_prefix(dry_run)}Create #{to_create.keys.count} new Jira issues?")
213
+ AbideDevUtils::Output.simple("#{dr_prefix(dry_run)}Aborting")
214
+ exit(0)
215
+ end
144
216
 
145
- # progress = AbideDevUtils::Output.progress(title: "#{dr_prefix}Creating Tasks", total: nil)
146
- # v.each do |s|
217
+ progress = AbideDevUtils::Output.progress(title: "#{dr_prefix(dry_run)}Creating issues",
218
+ total: to_create.keys.count,
219
+ format: PROGRESS_BAR_FORMAT)
220
+ to_create.each do |control_summary, labels|
221
+ abrev = control_summary.length > 40 ? control_summary[0..60] : control_summary
222
+ progress.log("#{dr_prefix(dry_run)}Creating #{abrev}...")
223
+ new_issue(client, project.key, control_summary, labels: labels, epic: epic, dry_run: dry_run)
224
+ progress.increment
225
+ end
226
+ progress.finish
227
+ AbideDevUtils::Output.simple("#{dr_prefix(dry_run)}Done creating tasks in Epic '#{epic.summary}'")
228
+ end
147
229
 
148
230
  def self.merge_options(options)
149
231
  config.merge(options)
@@ -177,12 +259,32 @@ module AbideDevUtils
177
259
  summaries.transform_keys { |k| "#{COV_PARENT_SUMMARY_PREFIX}#{benchmark}-#{k}"}
178
260
  end
179
261
 
180
- # def self.summaries_from_comply_report(report)
181
- # summaries = {}
182
- # report.each do |_, v|
183
- # end
262
+ def self.summaries_from_xccdf(xccdf)
263
+ summaries = {}
264
+ xccdf.profiles.each do |profile|
265
+ sum_key = "#{profile.level}_#{profile.title}".split.join('_').downcase
266
+ summaries[sum_key] = profile.controls.collect do |control|
267
+ control_id = control.respond_to?(:vulnid) ? control.vulnid : control.number
268
+ summary = "#{control_id} - #{control.title}"
269
+ summary = "#{summary[0..251]}..." if summary.length > 255
270
+ summary
271
+ end
272
+ end
273
+ summaries
274
+ end
275
+
276
+ def self.dr_prefix(dry_run)
277
+ dry_run ? 'DRY RUN: ' : ''
278
+ end
184
279
 
185
280
  class Dummy
281
+ attr_reader :summary, :key
282
+
283
+ def initialize(summary = 'dummy summary')
284
+ @summary = summary
285
+ @key = 'DUM-111'
286
+ end
287
+
186
288
  def attrs
187
289
  { 'fields' => {
188
290
  'project' => 'dummy',
@@ -41,8 +41,8 @@ module AbideDevUtils
41
41
  FWRITER.write_yml(yml_out, file: file) unless file.nil?
42
42
  end
43
43
 
44
- def self.progress(title: 'Progress', start: 0, total: 100)
45
- ProgressBar.create(title: title, starting_at: start, total: total)
44
+ def self.progress(title: 'Progress', start: 0, total: 100, format: nil)
45
+ ProgressBar.create(title: title, starting_at: start, total: total, format: format)
46
46
  end
47
47
  end
48
48
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AbideDevUtils
4
- VERSION = "0.12.1"
4
+ VERSION = "0.13.0"
5
5
  end
@@ -157,7 +157,8 @@ module AbideDevUtils
157
157
  raise AbideDevUtils::Errors::ControlPartsError, control
158
158
  end
159
159
  rule_id = group.xpath('Rule/@id').first.value
160
- return [vuln_id, rule_id]
160
+ title = group.xpath('Rule/title').text
161
+ return [vuln_id, rule_id, title]
161
162
  else
162
163
  raise AbideDevUtils::Errors::ControlPartsError, control
163
164
  end
@@ -658,8 +659,8 @@ module AbideDevUtils
658
659
  class StigControl < XccdfElement
659
660
  def initialize(control, benchmark)
660
661
  super(control, benchmark)
661
- @vulnid, @ruleid = control_parts(control_profile_text(control))
662
- properties :vulnid, :ruleid
662
+ @vulnid, @ruleid, @title = control_parts(control_profile_text(control))
663
+ properties :vulnid, :ruleid, :title
663
664
  end
664
665
  end
665
666
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abide_dev_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - abide-team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-22 00:00:00.000000000 Z
11
+ date: 2023-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri