openscap 0.4.9 → 0.5.1

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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -18
  3. data/Rakefile +2 -2
  4. data/lib/openscap/all.rb +1 -1
  5. data/lib/openscap/ds/arf.rb +3 -3
  6. data/lib/openscap/ds/sds.rb +8 -2
  7. data/lib/openscap/openscap.rb +9 -0
  8. data/lib/openscap/source.rb +10 -4
  9. data/lib/openscap/text.rb +34 -5
  10. data/lib/openscap/version.rb +1 -1
  11. data/lib/openscap/xccdf/benchmark.rb +67 -15
  12. data/lib/openscap/xccdf/fix.rb +7 -14
  13. data/lib/openscap/xccdf/fixtext.rb +19 -0
  14. data/lib/openscap/xccdf/group.rb +27 -1
  15. data/lib/openscap/xccdf/ident.rb +4 -10
  16. data/lib/openscap/xccdf/item.rb +37 -65
  17. data/lib/openscap/xccdf/item_common.rb +40 -0
  18. data/lib/openscap/xccdf/policy.rb +12 -3
  19. data/lib/openscap/xccdf/policy_model.rb +16 -15
  20. data/lib/openscap/xccdf/profile.rb +10 -10
  21. data/lib/openscap/xccdf/reference.rb +5 -21
  22. data/lib/openscap/xccdf/rule.rb +40 -20
  23. data/lib/openscap/xccdf/ruleresult.rb +5 -7
  24. data/lib/openscap/xccdf/session.rb +28 -30
  25. data/lib/openscap/xccdf/status.rb +34 -0
  26. data/lib/openscap/xccdf/tailoring.rb +7 -16
  27. data/lib/openscap/xccdf/testresult.rb +18 -28
  28. data/lib/openscap/xccdf/value.rb +1 -2
  29. data/lib/openscap/xccdf.rb +1 -1
  30. metadata +15 -48
  31. data/test/common/testcase.rb +0 -38
  32. data/test/data/arf.xml +0 -275156
  33. data/test/data/invalid.xml +0 -20
  34. data/test/data/sds-complex.xml +0 -132
  35. data/test/data/tailoring.xml +0 -31
  36. data/test/data/testresult.xml +0 -225
  37. data/test/data/xccdf.xml +0 -3046
  38. data/test/ds/arf_test.rb +0 -96
  39. data/test/ds/sds_test.rb +0 -71
  40. data/test/integration/arf_waiver_test.rb +0 -91
  41. data/test/openscap_test.rb +0 -21
  42. data/test/source_test.rb +0 -78
  43. data/test/text_test.rb +0 -19
  44. data/test/xccdf/arf_test.rb +0 -44
  45. data/test/xccdf/benchmark_test.rb +0 -115
  46. data/test/xccdf/policy_test.rb +0 -20
  47. data/test/xccdf/profile_test.rb +0 -20
  48. data/test/xccdf/session_ds_test.rb +0 -116
  49. data/test/xccdf/session_test.rb +0 -33
  50. data/test/xccdf/tailoring_test.rb +0 -30
  51. data/test/xccdf/testresult_test.rb +0 -99
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c9d56737a95b91a18225def06b0f8a1d23a749e565b5dc302cc50e61f75ef87b
4
- data.tar.gz: bd13f950489c98534bfbc4bc174196c449c1eece3c870dfb5dae4d88e2a11c0d
3
+ metadata.gz: 9c8eddf3fa5a4c04f1655827ba4f4b8422f32f314a20f888b36c5ef85e2e04cf
4
+ data.tar.gz: 3e9d497efc4543111a4fee03d8db323c85b96360e31e23cd9ebc4387ec354d17
5
5
  SHA512:
6
- metadata.gz: a8315dd1675d6589d21a7324e9b125136c2a39dae45e1be4a30a47f5ea031d06e266aef58d4dee67e58515319173f547fb7bdfab2d7a68527fde27d952069e01
7
- data.tar.gz: df5b605d6d6bb2e995bc7f7e0358134c57ef9c32b9fb154ddcbcb26875f376644c3f132ccac0cb13a73d5e21a1d63197d812b017eb87b9ac596307e1035e591f
6
+ metadata.gz: 601b6ee58372cd9f943918611c5f10df28cf1245d1149547d2889531e4b623b3787fb70cc06c1b4a17d4fca7e4202dd27dcacc7a69eba5c99d156fcc7e2529f3
7
+ data.tar.gz: 3a47312203579d8735b19032cfe427f76ede2467bbfb63b806dbd47edd79a8442ebd40fc61062fb4ece7b51742c38350e73c69d8677aafed5a5d8aef0d473db2
data/README.md CHANGED
@@ -1,13 +1,13 @@
1
- ![ruby-openscap icon](http://isimluk.fedorapeople.org/ruby-OpenSCAP-small.png) ruby-OpenSCAP
1
+ ruby-OpenSCAP <img alt="icon" src="http://isimluk.fedorapeople.org/ruby-OpenSCAP-small.png" width="100">
2
2
  =============
3
3
 
4
4
  Description
5
5
  -------------
6
- A FFI wrapper around the OpenSCAP library.
6
+ An FFI wrapper around the OpenSCAP library.
7
7
 
8
8
  Features/problems
9
9
  -------------
10
- Current version supports minimal set of functions needed to build own scanner. This module
10
+ Current version supports minimal set of functions needed to build own scanner. This gem
11
11
  is self documented by its test suite.
12
12
 
13
13
  Sample Scanner Implementation
@@ -23,28 +23,17 @@ Sample Scanner Implementation
23
23
 
24
24
  Development Requirements
25
25
  -------------
26
- On Fedora, command is
26
+ On Fedora, commands are
27
27
 
28
- dnf install ruby-devel rubygem-rake rubygem-ffi rubygem-bundler openscap
29
-
30
- On RHEL you can install requirements by issuing
31
-
32
- yum install ruby-devel rubygem-rake rubygem-bundler openscap
33
- gem install ffi # or install rubygem-ffi RPM package from EPEL
28
+ dnf install openscap
29
+ bundle install
34
30
 
35
31
 
36
32
  Test Requirements
37
33
  -------------
38
34
  On Fedora, more packages are necessary, but rubocop can be of the latest version
39
35
 
40
- dnf install rubygem-minitest rubygem-test-unit rubygems-devel bzip2
41
- gem install rubocop
42
-
43
- For tests on RHEL7, you need minitest package and specific older version of rubocop.
44
- Newer versions of rubocop requires Ruby >= 2.1.0
45
-
46
- yum install rubygem-minitest bzip2
47
- gem install rubocop -v 0.50.0
36
+ dnf install bzip2
48
37
 
49
38
  Tests are then performed using script
50
39
 
data/Rakefile CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  require 'bundler'
4
4
 
5
- Bundler::GemHelper.install_tasks :name => 'openscap'
5
+ Bundler::GemHelper.install_tasks name: 'openscap'
6
6
 
7
7
  task :test do
8
8
  $LOAD_PATH.unshift('lib')
9
9
  $LOAD_PATH.unshift('test')
10
- Dir.glob('./test/**/*_test.rb') { |f| require f }
10
+ Dir.glob('./test/**/*_test.rb').each { |f| require f }
11
11
  end
data/lib/openscap/all.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- Dir.glob(File.join(File.dirname(__FILE__), '{xccdf,ds,}', '*.rb'), &method(:require))
3
+ # Dir.glob(File.join(File.dirname(__FILE__), '{xccdf,ds,}', '*.rb')).each(&method(:require))
@@ -58,8 +58,8 @@ module OpenSCAP
58
58
 
59
59
  attach_function :ds_rds_session_new_from_source, [:pointer], :pointer
60
60
  attach_function :ds_rds_session_free, [:pointer], :void
61
- attach_function :ds_rds_session_select_report, [:pointer, :string], :pointer
62
- attach_function :ds_rds_session_replace_report_with_source, [:pointer, :pointer], :int
63
- attach_function :ds_rds_session_select_report_request, [:pointer, :string], :pointer
61
+ attach_function :ds_rds_session_select_report, %i[pointer string], :pointer
62
+ attach_function :ds_rds_session_replace_report_with_source, %i[pointer pointer], :int
63
+ attach_function :ds_rds_session_select_report_request, %i[pointer string], :pointer
64
64
  attach_function :ds_rds_session_get_html_report, [:pointer], :pointer
65
65
  end
@@ -15,6 +15,12 @@ module OpenSCAP
15
15
  OpenSCAP.ds_sds_session_new_from_source param[:source].raw
16
16
  end
17
17
  OpenSCAP.raise! if @raw.null?
18
+
19
+ begin
20
+ yield self
21
+ ensure
22
+ destroy
23
+ end if block_given?
18
24
  end
19
25
 
20
26
  def select_checklist(p = {})
@@ -43,6 +49,6 @@ module OpenSCAP
43
49
 
44
50
  attach_function :ds_sds_session_new_from_source, [:pointer], :pointer
45
51
  attach_function :ds_sds_session_free, [:pointer], :void
46
- attach_function :ds_sds_session_select_checklist, [:pointer, :string, :string, :string], :pointer
47
- attach_function :ds_sds_session_get_html_guide, [:pointer, :string], :string
52
+ attach_function :ds_sds_session_select_checklist, %i[pointer string string string], :pointer
53
+ attach_function :ds_sds_session_get_html_guide, %i[pointer string], :string
48
54
  end
@@ -25,6 +25,15 @@ module OpenSCAP
25
25
  raise OpenSCAPError, err
26
26
  end
27
27
 
28
+ def self._iterate(over:, as:, &)
29
+ has_more_method = "#{as}_iterator_has_more"
30
+ next_method = "#{as}_iterator_next"
31
+ free_method = "#{as}_iterator_free"
32
+
33
+ yield send(next_method, over) while send(has_more_method, over)
34
+ send(free_method, over)
35
+ end
36
+
28
37
  attach_function :oscap_init, [], :void
29
38
  attach_function :oscap_cleanup, [], :void
30
39
  attach_function :oscap_get_version, [], :string
@@ -20,6 +20,12 @@ module OpenSCAP
20
20
  raise OpenSCAP::OpenSCAPError, "Cannot initialize #{self.class.name} with '#{param}'"
21
21
  end
22
22
  OpenSCAP.raise! if @raw.null?
23
+
24
+ begin
25
+ yield self
26
+ ensure
27
+ destroy
28
+ end if block_given?
23
29
  end
24
30
 
25
31
  def type
@@ -51,13 +57,13 @@ module OpenSCAP
51
57
  end
52
58
 
53
59
  attach_function :oscap_source_new_from_file, [:string], :pointer
54
- attach_function :oscap_source_new_from_memory, [:pointer, :int, :string], :pointer
60
+ attach_function :oscap_source_new_from_memory, %i[pointer int string], :pointer
55
61
  attach_function :oscap_source_get_scap_type, [:pointer], :int
56
62
  attach_function :oscap_source_free, [:pointer], :void
57
- attach_function :oscap_source_save_as, [:pointer, :string], :int
63
+ attach_function :oscap_source_save_as, %i[pointer string], :int
58
64
 
59
- callback :xml_reporter, [:string, :int, :string, :pointer], :int
60
- attach_function :oscap_source_validate, [:pointer, :xml_reporter, :pointer], :int
65
+ callback :xml_reporter, %i[string int string pointer], :int
66
+ attach_function :oscap_source_validate, %i[pointer xml_reporter pointer], :int
61
67
  XmlReporterCallback = proc do |filename, line_number, error_message, e|
62
68
  offset = e.get_string(0).length
63
69
  msg = "#{filename}:#{line_number}: #{error_message}"
data/lib/openscap/text.rb CHANGED
@@ -4,8 +4,13 @@ module OpenSCAP
4
4
  class Text
5
5
  attr_reader :raw
6
6
 
7
- def initialize
8
- @raw = OpenSCAP.oscap_text_new
7
+ def initialize(t = nil)
8
+ @raw = case t
9
+ when FFI::Pointer
10
+ t
11
+ when nil
12
+ OpenSCAP.oscap_text_new
13
+ end
9
14
  end
10
15
 
11
16
  def text=(str)
@@ -13,7 +18,7 @@ module OpenSCAP
13
18
  end
14
19
 
15
20
  def text
16
- OpenSCAP.oscap_text_get_text(raw)
21
+ OpenSCAP.oscap_text_get_text(@raw).force_encoding Encoding::UTF_8
17
22
  end
18
23
 
19
24
  def destroy
@@ -25,22 +30,46 @@ module OpenSCAP
25
30
  class TextList
26
31
  def initialize(oscap_text_iterator)
27
32
  @raw = oscap_text_iterator
33
+
34
+ begin
35
+ yield self
36
+ ensure
37
+ destroy
38
+ end if block_given?
28
39
  end
29
40
 
30
41
  def plaintext(lang = nil)
31
42
  OpenSCAP.oscap_textlist_get_preferred_plaintext @raw, lang
32
43
  end
33
44
 
45
+ def markup(lang:)
46
+ text_pointer = OpenSCAP.oscap_textlist_get_preferred_text @raw, lang
47
+ return nil if text_pointer.null?
48
+
49
+ Text.new(text_pointer).text
50
+ end
51
+
34
52
  def destroy
35
53
  OpenSCAP.oscap_text_iterator_free @raw
36
54
  end
55
+
56
+ def self.extract(pointer, lang:, markup:)
57
+ new(pointer) do |list|
58
+ if markup
59
+ return list.markup(lang:)
60
+ else
61
+ return list.plaintext(lang)
62
+ end
63
+ end
64
+ end
37
65
  end
38
66
 
39
67
  attach_function :oscap_text_new, [], :pointer
40
- attach_function :oscap_text_set_text, [:pointer, :string], :bool
68
+ attach_function :oscap_text_set_text, %i[pointer string], :bool
41
69
  attach_function :oscap_text_get_text, [:pointer], :string
42
70
  attach_function :oscap_text_free, [:pointer], :void
43
71
 
44
- attach_function :oscap_textlist_get_preferred_plaintext, [:pointer, :string], :string
72
+ attach_function :oscap_textlist_get_preferred_plaintext, %i[pointer string], :string
73
+ attach_function :oscap_textlist_get_preferred_text, %i[pointer string], :pointer
45
74
  attach_function :oscap_text_iterator_free, [:pointer], :void
46
75
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OpenSCAP
4
- VERSION = '0.4.9'
4
+ VERSION = '0.5.1'
5
5
  end
@@ -1,15 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'openscap/source'
4
- require 'openscap/xccdf/profile'
5
- require 'openscap/xccdf/item'
4
+ require_relative 'profile'
5
+ require_relative 'item'
6
+ require_relative 'item_common'
7
+ require_relative 'value'
8
+ require_relative 'status'
6
9
 
7
10
  module OpenSCAP
8
11
  module Xccdf
9
12
  class Benchmark
13
+ include ItemCommon
10
14
  attr_reader :raw
11
15
 
12
- def initialize(p)
16
+ def initialize p
13
17
  case p
14
18
  when OpenSCAP::Source
15
19
  @raw = OpenSCAP.xccdf_benchmark_import_source p.raw
@@ -18,6 +22,20 @@ module OpenSCAP
18
22
  "Cannot initialize OpenSCAP::Xccdf::Benchmark with '#{p}'"
19
23
  end
20
24
  OpenSCAP.raise! if @raw.null?
25
+
26
+ begin
27
+ yield self
28
+ ensure
29
+ destroy
30
+ end if block_given?
31
+ end
32
+
33
+ def resolved?
34
+ OpenSCAP.xccdf_benchmark_get_resolved @raw
35
+ end
36
+
37
+ def status_current
38
+ Status.new OpenSCAP.xccdf_benchmark_get_status_current(@raw)
21
39
  end
22
40
 
23
41
  def profiles
@@ -28,8 +46,40 @@ module OpenSCAP
28
46
  @items ||= items_init
29
47
  end
30
48
 
49
+ def each_item(&)
50
+ OpenSCAP._iterate over: OpenSCAP.xccdf_item_get_content(@raw), as: 'xccdf_item' do |pointer|
51
+ yield OpenSCAP::Xccdf::Item.build(pointer)
52
+ end
53
+ end
54
+
55
+ def each_profile(&)
56
+ OpenSCAP._iterate over: OpenSCAP.xccdf_benchmark_get_profiles(@raw), as: 'xccdf_profile' do |pointer|
57
+ yield OpenSCAP::Xccdf::Profile.new pointer
58
+ end
59
+ end
60
+
61
+ def each_value(&)
62
+ OpenSCAP._iterate over: OpenSCAP.xccdf_benchmark_get_values(@raw), as: 'xccdf_value' do |pointer|
63
+ yield OpenSCAP::Xccdf::Value.new pointer
64
+ end
65
+ end
66
+
67
+ def policy_model
68
+ @policy_model ||= PolicyModel.new self
69
+ end
70
+
71
+ def schema_version
72
+ pointer = OpenSCAP.xccdf_benchmark_get_schema_version @raw
73
+ OpenSCAP.xccdf_version_info_get_version pointer
74
+ end
75
+
31
76
  def destroy
32
- OpenSCAP.xccdf_benchmark_free @raw
77
+ # Policy Model takes ownership of Xccdf::Benchmark. It is one of these lovely quirks of libopenscap
78
+ if @policy_model
79
+ @policy_model.destroy
80
+ else
81
+ OpenSCAP.xccdf_benchmark_free @raw
82
+ end
33
83
  @raw = nil
34
84
  end
35
85
 
@@ -37,27 +87,18 @@ module OpenSCAP
37
87
 
38
88
  def profiles_init
39
89
  profiles = {}
40
- profit = OpenSCAP.xccdf_benchmark_get_profiles raw
41
- while OpenSCAP.xccdf_profile_iterator_has_more profit
42
- profile_p = OpenSCAP.xccdf_profile_iterator_next profit
43
- profile = OpenSCAP::Xccdf::Profile.new profile_p
90
+ each_profile do |profile|
44
91
  profiles[profile.id] = profile
45
92
  end
46
- OpenSCAP.xccdf_profile_iterator_free profit
47
93
  profiles
48
94
  end
49
95
 
50
96
  def items_init
51
97
  items = {}
52
- items_it = OpenSCAP.xccdf_item_get_content raw
53
- while OpenSCAP.xccdf_item_iterator_has_more items_it
54
- item_p = OpenSCAP.xccdf_item_iterator_next items_it
55
- item = OpenSCAP::Xccdf::Item.build item_p
98
+ each_item do |item|
56
99
  items.merge! item.sub_items
57
100
  items[item.id] = item
58
- # TODO: iterate through childs
59
101
  end
60
- OpenSCAP.xccdf_item_iterator_free items_it
61
102
  items
62
103
  end
63
104
  end
@@ -66,8 +107,19 @@ module OpenSCAP
66
107
  attach_function :xccdf_benchmark_import_source, [:pointer], :pointer
67
108
  attach_function :xccdf_benchmark_free, [:pointer], :void
68
109
 
110
+ attach_function :xccdf_benchmark_get_status_current, [:pointer], :pointer
111
+ attach_function :xccdf_benchmark_get_resolved, [:pointer], :pointer
69
112
  attach_function :xccdf_benchmark_get_profiles, [:pointer], :pointer
70
113
  attach_function :xccdf_profile_iterator_has_more, [:pointer], :bool
71
114
  attach_function :xccdf_profile_iterator_next, [:pointer], :pointer
72
115
  attach_function :xccdf_profile_iterator_free, [:pointer], :void
116
+ attach_function :xccdf_benchmark_get_values, [:pointer], :pointer
117
+ attach_function :xccdf_value_iterator_has_more, [:pointer], :bool
118
+ attach_function :xccdf_value_iterator_next, [:pointer], :pointer
119
+ attach_function :xccdf_value_iterator_free, [:pointer], :void
120
+
121
+ attach_function :xccdf_benchmark_get_schema_version, [:pointer], :pointer
122
+ attach_function :xccdf_version_info_get_version, [:pointer], :string
73
123
  end
124
+
125
+ require_relative 'policy_model'
@@ -3,37 +3,30 @@
3
3
  module OpenSCAP
4
4
  module Xccdf
5
5
  class Fix
6
- def initialize(raw)
7
- raise OpenSCAP::OpenSCAPError, "Cannot initialize #{self.class.name} with '#{raw}'" \
8
- unless raw.is_a?(FFI::Pointer)
6
+ def initialize raw
7
+ raise OpenSCAP::OpenSCAPError, "Cannot initialize #{self.class.name} with '#{raw}'" unless raw.is_a? FFI::Pointer
9
8
 
10
9
  @raw = raw
11
10
  end
12
11
 
13
12
  def id
14
- OpenSCAP.xccdf_fix_get_id(@raw)
13
+ OpenSCAP.xccdf_fix_get_id @raw
15
14
  end
16
15
 
17
16
  def platform
18
- OpenSCAP.xccdf_fix_get_platform(@raw)
17
+ OpenSCAP.xccdf_fix_get_platform @raw
19
18
  end
20
19
 
21
- # system is a reserved word in Rails, so didn't use it
22
20
  def fix_system
23
- OpenSCAP.xccdf_fix_get_system(@raw)
21
+ OpenSCAP.xccdf_fix_get_system @raw
24
22
  end
25
23
 
26
24
  def content
27
- OpenSCAP.xccdf_fix_get_content(@raw)
25
+ OpenSCAP.xccdf_fix_get_content @raw
28
26
  end
29
27
 
30
28
  def to_hash
31
- {
32
- :id => id,
33
- :platform => platform,
34
- :system => fix_system,
35
- :content => content
36
- }
29
+ { id:, platform:, system: fix_system, content: }
37
30
  end
38
31
  end
39
32
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenSCAP
4
+ module Xccdf
5
+ class Fixtext
6
+ def initialize(raw)
7
+ raise OpenSCAP::OpenSCAPError, "Cannot initialize #{self.class.name} with '#{raw}'" unless raw.is_a?(FFI::Pointer)
8
+
9
+ @raw = raw
10
+ end
11
+
12
+ def text
13
+ Text.new(OpenSCAP.xccdf_fixtext_get_text(@raw)).text
14
+ end
15
+ end
16
+ end
17
+
18
+ attach_function :xccdf_fixtext_get_text, [:pointer], :pointer
19
+ end
@@ -2,11 +2,37 @@
2
2
 
3
3
  require 'openscap/exceptions'
4
4
  require 'openscap/xccdf'
5
- require 'openscap/xccdf/item'
5
+ require_relative 'item'
6
6
 
7
7
  module OpenSCAP
8
8
  module Xccdf
9
9
  class Group < Item
10
+ def each_child(&)
11
+ OpenSCAP._iterate over: OpenSCAP.xccdf_item_get_content(@raw), as: 'xccdf_item' do |pointer|
12
+ yield OpenSCAP::Xccdf::Item.build pointer
13
+ end
14
+ end
15
+
16
+ def each_value(&)
17
+ OpenSCAP._iterate over: OpenSCAP.xccdf_group_get_values(@raw), as: 'xccdf_value' do |pointer|
18
+ yield OpenSCAP::Xccdf::Value.new pointer
19
+ end
20
+ end
21
+
22
+ def sub_items
23
+ @sub_items ||= {}.tap do |sub_items|
24
+ each_child do |item|
25
+ sub_items.merge! item.sub_items
26
+ sub_items[item.id] = item
27
+ end
28
+ end
29
+ end
10
30
  end
11
31
  end
32
+
33
+ attach_function :xccdf_item_get_content, [:pointer], :pointer
34
+ attach_function :xccdf_item_iterator_has_more, [:pointer], :bool
35
+ attach_function :xccdf_item_iterator_next, [:pointer], :pointer
36
+ attach_function :xccdf_item_iterator_free, [:pointer], :void
37
+ attach_function :xccdf_group_get_values, [:pointer], :pointer
12
38
  end
@@ -3,20 +3,14 @@
3
3
  module OpenSCAP
4
4
  module Xccdf
5
5
  class Ident
6
- def initialize(raw)
7
- raise OpenSCAP::OpenSCAPError, "Cannot initialize #{self.class.name} with '#{raw}'" \
8
- unless raw.is_a?(FFI::Pointer)
6
+ def initialize raw
7
+ raise OpenSCAP::OpenSCAPError, "Cannot initialize #{self.class.name} with '#{raw}'" unless raw.is_a?(FFI::Pointer)
9
8
 
10
9
  @raw = raw
11
10
  end
12
11
 
13
- def system
14
- OpenSCAP.xccdf_ident_get_system(@raw)
15
- end
16
-
17
- def id
18
- OpenSCAP.xccdf_ident_get_id(@raw)
19
- end
12
+ def system = OpenSCAP.xccdf_ident_get_system @raw
13
+ def id = OpenSCAP.xccdf_ident_get_id @raw
20
14
  end
21
15
  end
22
16
  attach_function :xccdf_ident_get_system, [:pointer], :string
@@ -2,14 +2,16 @@
2
2
 
3
3
  require 'openscap/exceptions'
4
4
  require 'openscap/text'
5
- require 'openscap/xccdf/group'
6
- require 'openscap/xccdf/rule'
7
- require 'openscap/xccdf/reference'
5
+ require_relative 'item_common'
6
+ require_relative 'group'
7
+ require_relative 'rule'
8
8
 
9
9
  module OpenSCAP
10
10
  module Xccdf
11
11
  class Item
12
- def self.build(t)
12
+ include ItemCommon # reflects OpenSCAP's struct xccdf_item (thus operates with Benchmark, Profile, Group, Rule, and Value)
13
+
14
+ def self.build t
13
15
  raise OpenSCAP::OpenSCAPError, "Cannot initialize #{self.class.name} with #{t}" \
14
16
  unless t.is_a?(FFI::Pointer)
15
17
 
@@ -24,81 +26,37 @@ module OpenSCAP
24
26
  end
25
27
  end
26
28
 
27
- def initialize(t)
28
- if self.class == OpenSCAP::Xccdf::Item
29
- raise OpenSCAP::OpenSCAPError, "Cannot initialize #{self.class.name} abstract base class."
30
- end
29
+ def initialize t
30
+ raise OpenSCAP::OpenSCAPError, "Cannot initialize #{self.class.name} abstract base class." if instance_of?(OpenSCAP::Xccdf::Item)
31
31
 
32
32
  @raw = t
33
33
  end
34
34
 
35
- def id
36
- OpenSCAP.xccdf_item_get_id @raw
37
- end
38
-
39
- def title(prefered_lang = nil)
40
- textlist = OpenSCAP::TextList.new(OpenSCAP.xccdf_item_get_title(@raw))
41
- title = textlist.plaintext(prefered_lang)
42
- textlist.destroy
43
- title
35
+ def rationale prefered_lang = nil, markup: false
36
+ TextList.extract(OpenSCAP.xccdf_item_get_rationale(@raw), lang: prefered_lang, markup:)
44
37
  end
45
38
 
46
- def description(prefered_lang = nil)
47
- textlist = OpenSCAP::TextList.new(OpenSCAP.xccdf_item_get_description(@raw))
48
- description = textlist.plaintext(prefered_lang)
49
- textlist.destroy
50
- description
51
- end
52
-
53
- def rationale(prefered_lang = nil)
54
- textlist = OpenSCAP::TextList.new(OpenSCAP.xccdf_item_get_rationale(@raw))
55
- rationale = textlist.plaintext(prefered_lang)
56
- textlist.destroy
57
- rationale
58
- end
59
-
60
- def references
61
- refs = []
62
- refs_it = OpenSCAP.xccdf_item_get_references(@raw)
63
- while OpenSCAP.oscap_reference_iterator_has_more refs_it
64
- ref = OpenSCAP::Xccdf::Reference.new(OpenSCAP.oscap_reference_iterator_next(refs_it))
65
- refs << ref
39
+ def warnings
40
+ @warnings ||= [].tap do |warns|
41
+ OpenSCAP._iterate over: OpenSCAP.xccdf_item_get_warnings(@raw), as: 'xccdf_warning' do |pointer|
42
+ warns << {
43
+ category: OpenSCAP.xccdf_warning_get_category(pointer),
44
+ text: Text.new(OpenSCAP.xccdf_warning_get_text(pointer))
45
+ }
46
+ end
66
47
  end
67
- OpenSCAP.oscap_reference_iterator_free refs_it
68
- refs
69
48
  end
70
49
 
71
- def sub_items
72
- @sub_items ||= sub_items_init
73
- end
50
+ def sub_items = {}
74
51
 
75
52
  def destroy
76
53
  OpenSCAP.xccdf_item_free @raw
77
54
  @raw = nil
78
55
  end
79
-
80
- private
81
-
82
- def sub_items_init
83
- collect = {}
84
- items_it = OpenSCAP.xccdf_item_get_content @raw
85
- while OpenSCAP.xccdf_item_iterator_has_more items_it
86
- item_p = OpenSCAP.xccdf_item_iterator_next items_it
87
- item = OpenSCAP::Xccdf::Item.build item_p
88
- collect.merge! item.sub_items
89
- collect[item.id] = item
90
- end
91
- OpenSCAP.xccdf_item_iterator_free items_it
92
- collect
93
- end
94
56
  end
95
57
  end
96
58
 
97
- attach_function :xccdf_item_get_id, [:pointer], :string
98
- attach_function :xccdf_item_get_content, [:pointer], :pointer
99
59
  attach_function :xccdf_item_free, [:pointer], :void
100
- attach_function :xccdf_item_get_title, [:pointer], :pointer
101
- attach_function :xccdf_item_get_description, [:pointer], :pointer
102
60
  attach_function :xccdf_item_get_rationale, [:pointer], :pointer
103
61
 
104
62
  XccdfItemType = enum(:benchmark, 0x0100,
@@ -109,11 +67,25 @@ module OpenSCAP
109
67
  :value, 0x4000)
110
68
  attach_function :xccdf_item_get_type, [:pointer], XccdfItemType
111
69
 
112
- attach_function :xccdf_item_iterator_has_more, [:pointer], :bool
113
- attach_function :xccdf_item_iterator_next, [:pointer], :pointer
114
- attach_function :xccdf_item_iterator_free, [:pointer], :void
70
+ enum :xccdf_warning_category_t, [
71
+ :not_specified, # empty value
72
+ :general, # General-purpose warning
73
+ :functionality, # Warning about possible impacts to functionality
74
+ :performance, # Warning about changes to target system performance
75
+ :hardware, # Warning about hardware restrictions or possible impacts to hardware
76
+ :legal, # Warning about legal implications
77
+ :regulatory, # Warning about regulatory obligations
78
+ :management, # Warning about impacts to the mgmt or administration of the target system
79
+ :audit, # Warning about impacts to audit or logging
80
+ :dependency # Warning about dependencies between this Rule and other parts of the target system
81
+ ]
82
+ attach_function :xccdf_item_get_warnings, [:pointer], :pointer
83
+ attach_function :xccdf_warning_iterator_has_more, [:pointer], :bool
84
+ attach_function :xccdf_warning_iterator_next, [:pointer], :pointer
85
+ attach_function :xccdf_warning_iterator_free, [:pointer], :void
86
+ attach_function :xccdf_warning_get_category, [:pointer], :xccdf_warning_category_t
87
+ attach_function :xccdf_warning_get_text, [:pointer], :pointer
115
88
 
116
- attach_function :xccdf_item_get_references, [:pointer], :pointer
117
89
  attach_function :oscap_reference_iterator_has_more, [:pointer], :bool
118
90
  attach_function :oscap_reference_iterator_next, [:pointer], :pointer
119
91
  attach_function :oscap_reference_iterator_free, [:pointer], :void