dradis-plugins 5.3.0 → 5.4.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 +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/dradis/plugins/content_service/evidence.rb +21 -4
- data/lib/dradis/plugins/gem_version.rb +1 -1
- metadata +2 -30
- data/.github/pull_request_template.md +0 -45
- data/.gitignore +0 -11
- data/.rspec +0 -2
- data/.rubocop.yml +0 -129
- data/CHANGELOG.template +0 -12
- data/CONTRIBUTING.md +0 -3
- data/Gemfile +0 -6
- data/dradis-plugins.gemspec +0 -26
- data/spec/engine_spec.rb +0 -39
- data/spec/internal/log/test.log +0 -0
- data/spec/lib/dradis/plugins/content_service/boards_spec.rb +0 -45
- data/spec/lib/dradis/plugins/content_service/content_blocks_spec.rb +0 -29
- data/spec/lib/dradis/plugins/content_service/issues_spec.rb +0 -56
- data/spec/lib/dradis/plugins/mapping_service_spec.rb +0 -54
- data/spec/lib/dradis/plugins/settings/adapters/encrypted_configuration_spec.rb +0 -112
- data/spec/settings_spec.rb +0 -85
- data/spec/spec_helper.rb +0 -2
- data/spec/support/spec_macros.rb +0 -26
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9196b027f8ec18eba847d75a36b13e7bd4ddf9eb56dfffa311a180246bd1ce87
|
|
4
|
+
data.tar.gz: 73af5ab0eff64ed64556063f788ba31152b107ee21cce8309e88a9b001b13d0d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 06c271b66c5b2a02e9529db1c173355dd8592a03915e4e2501f5485278f4d0e836dba4fef4c49c240d1d169e1bfaa7301c488e14be4e5c0472fe079322185603
|
|
7
|
+
data.tar.gz: b8a81d714fe395ccf553ad7bb4146fe2a806c16f07195419ee3aaa320ddae9c41cf98afe93b1689f311e021f0cae14f123e1e1c1557965685c017590cbeee47a
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
v5.4.0 (September 2026)
|
|
2
|
+
- Add `all_evidence` to the Evidence content service, scoping evidence by the export's published/all scope
|
|
3
|
+
- Cascade chosen state on upload to Evidence records
|
|
4
|
+
|
|
1
5
|
v5.3.0 (August 2026)
|
|
2
6
|
- Add shared report template source resolution for mappings across ticketing integrations (Jira, DevOps, ServiceNow)
|
|
3
7
|
|
|
@@ -2,16 +2,33 @@ module Dradis::Plugins::ContentService
|
|
|
2
2
|
module Evidence
|
|
3
3
|
extend ActiveSupport::Concern
|
|
4
4
|
|
|
5
|
+
def all_evidence
|
|
6
|
+
case scope
|
|
7
|
+
when :all
|
|
8
|
+
project.evidence
|
|
9
|
+
when :published
|
|
10
|
+
project.evidence.published
|
|
11
|
+
else
|
|
12
|
+
raise 'Unsupported scope!'
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
5
16
|
def create_evidence(args = {})
|
|
6
17
|
content = args.fetch(:content, default_evidence_content)
|
|
7
|
-
|
|
8
|
-
|
|
18
|
+
issue = args[:issue] || default_evidence_issue
|
|
19
|
+
node = args.fetch(:node, default_node_parent)
|
|
20
|
+
state = args.fetch(:state, @state)
|
|
9
21
|
|
|
10
22
|
# Using node.evidence.new would result in some evidence being saved later on.
|
|
11
|
-
evidence = ::Evidence.new(issue_id: issue.id, content: content, node_id: node.id)
|
|
23
|
+
evidence = ::Evidence.new(issue_id: issue.id, content: content, node_id: node.id, state: state)
|
|
12
24
|
|
|
13
25
|
if evidence.valid?
|
|
14
|
-
evidence
|
|
26
|
+
# find_or_create_by is used here to avoid creating duplicate evidence for the same issue/node/content combination.
|
|
27
|
+
# Don't include state in the query because we dont' want to create duplicate evidence with different states.
|
|
28
|
+
# If a new evidence is created, set the state otherwise leave it as-is
|
|
29
|
+
evidence = ::Evidence.find_or_create_by(issue_id: issue.id, node_id: node.id, content: content) do |e|
|
|
30
|
+
e.state = state
|
|
31
|
+
end
|
|
15
32
|
else
|
|
16
33
|
try_rescue_from_length_validation(
|
|
17
34
|
model: evidence,
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dradis-plugins
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.
|
|
4
|
+
version: 5.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Daniel Martin
|
|
@@ -70,14 +70,7 @@ executables: []
|
|
|
70
70
|
extensions: []
|
|
71
71
|
extra_rdoc_files: []
|
|
72
72
|
files:
|
|
73
|
-
- ".github/pull_request_template.md"
|
|
74
|
-
- ".gitignore"
|
|
75
|
-
- ".rspec"
|
|
76
|
-
- ".rubocop.yml"
|
|
77
73
|
- CHANGELOG.md
|
|
78
|
-
- CHANGELOG.template
|
|
79
|
-
- CONTRIBUTING.md
|
|
80
|
-
- Gemfile
|
|
81
74
|
- LICENSE
|
|
82
75
|
- README.md
|
|
83
76
|
- Rakefile
|
|
@@ -85,7 +78,6 @@ files:
|
|
|
85
78
|
- app/controllers/concerns/dradis/plugins/mappings/ticketing/fields_and_sources.rb
|
|
86
79
|
- app/controllers/concerns/dradis/plugins/persistent_permissions.rb
|
|
87
80
|
- app/controllers/dradis/plugins/export/base_controller.rb
|
|
88
|
-
- dradis-plugins.gemspec
|
|
89
81
|
- lib/dradis-plugins.rb
|
|
90
82
|
- lib/dradis/plugins.rb
|
|
91
83
|
- lib/dradis/plugins/base.rb
|
|
@@ -124,16 +116,6 @@ files:
|
|
|
124
116
|
- lib/dradis/plugins/upload/field_processor.rb
|
|
125
117
|
- lib/dradis/plugins/upload/importer.rb
|
|
126
118
|
- lib/dradis/plugins/version.rb
|
|
127
|
-
- spec/engine_spec.rb
|
|
128
|
-
- spec/internal/log/test.log
|
|
129
|
-
- spec/lib/dradis/plugins/content_service/boards_spec.rb
|
|
130
|
-
- spec/lib/dradis/plugins/content_service/content_blocks_spec.rb
|
|
131
|
-
- spec/lib/dradis/plugins/content_service/issues_spec.rb
|
|
132
|
-
- spec/lib/dradis/plugins/mapping_service_spec.rb
|
|
133
|
-
- spec/lib/dradis/plugins/settings/adapters/encrypted_configuration_spec.rb
|
|
134
|
-
- spec/settings_spec.rb
|
|
135
|
-
- spec/spec_helper.rb
|
|
136
|
-
- spec/support/spec_macros.rb
|
|
137
119
|
homepage: http://dradis.com/ce/
|
|
138
120
|
licenses:
|
|
139
121
|
- GPL-2
|
|
@@ -155,14 +137,4 @@ requirements: []
|
|
|
155
137
|
rubygems_version: 3.6.9
|
|
156
138
|
specification_version: 4
|
|
157
139
|
summary: Plugin manager for the Dradis Framework project.
|
|
158
|
-
test_files:
|
|
159
|
-
- spec/engine_spec.rb
|
|
160
|
-
- spec/internal/log/test.log
|
|
161
|
-
- spec/lib/dradis/plugins/content_service/boards_spec.rb
|
|
162
|
-
- spec/lib/dradis/plugins/content_service/content_blocks_spec.rb
|
|
163
|
-
- spec/lib/dradis/plugins/content_service/issues_spec.rb
|
|
164
|
-
- spec/lib/dradis/plugins/mapping_service_spec.rb
|
|
165
|
-
- spec/lib/dradis/plugins/settings/adapters/encrypted_configuration_spec.rb
|
|
166
|
-
- spec/settings_spec.rb
|
|
167
|
-
- spec/spec_helper.rb
|
|
168
|
-
- spec/support/spec_macros.rb
|
|
140
|
+
test_files: []
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
Please review [CONTRIBUTING.md](https://github.com/dradis/dradis-ce/blob/develop/CONTRIBUTING.md) and remove this line.
|
|
2
|
-
|
|
3
|
-
### Summary
|
|
4
|
-
|
|
5
|
-
Provide a general description of the code changes in your pull
|
|
6
|
-
request... were there any bugs you had fixed? If so, mention them. If
|
|
7
|
-
these bugs have open GitHub issues, be sure to tag them here as well,
|
|
8
|
-
to keep the conversation linked together.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
### Testing Steps
|
|
12
|
-
|
|
13
|
-
Provide steps to test functionality, described in detail for someone not familiar with this part of the application / code base
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
### Other Information
|
|
17
|
-
|
|
18
|
-
If there's anything else that's important and relevant to your pull
|
|
19
|
-
request, mention that information here. This could include
|
|
20
|
-
benchmarks, or other information.
|
|
21
|
-
|
|
22
|
-
Thanks for contributing to Dradis!
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
### Copyright assignment
|
|
26
|
-
|
|
27
|
-
Collaboration is difficult with commercial closed source but we want
|
|
28
|
-
to keep as much of the OSS ethos as possible available to users
|
|
29
|
-
who want to fix it themselves.
|
|
30
|
-
|
|
31
|
-
In order to unambiguously own and sell Dradis Framework commercial
|
|
32
|
-
products, we must have the copyright associated with the entire
|
|
33
|
-
codebase. Any code you create which is merged must be owned by us.
|
|
34
|
-
That's not us trying to be a jerks, that's just the way it works.
|
|
35
|
-
|
|
36
|
-
You can delete this section, but the following sentence needs to
|
|
37
|
-
remain in the PR's description:
|
|
38
|
-
|
|
39
|
-
> I assign all rights, including copyright, to any future Dradis
|
|
40
|
-
> work by myself to Security Roots.
|
|
41
|
-
|
|
42
|
-
### Check List
|
|
43
|
-
|
|
44
|
-
- [ ] Added a CHANGELOG entry
|
|
45
|
-
- [ ] Added specs
|
data/.gitignore
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
|
2
|
-
#
|
|
3
|
-
# If you find yourself ignoring temporary files generated by your text editor
|
|
4
|
-
# or operating system, you probably want to add a global ignore instead:
|
|
5
|
-
# git config --global core.excludesfile ~/.gitignore_global
|
|
6
|
-
|
|
7
|
-
# Ignore bundler config
|
|
8
|
-
/.bundle
|
|
9
|
-
/Gemfile.lock
|
|
10
|
-
/pkg/
|
|
11
|
-
/vendor/bundle/
|
data/.rspec
DELETED
data/.rubocop.yml
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
AllCops:
|
|
2
|
-
# RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
|
|
3
|
-
# to ignore them, so only the ones explicitly set in this file are enabled.
|
|
4
|
-
DisabledByDefault: true
|
|
5
|
-
SuggestExtensions: false
|
|
6
|
-
Exclude:
|
|
7
|
-
- '**/templates/**/*'
|
|
8
|
-
|
|
9
|
-
# Prefer &&/|| over and/or.
|
|
10
|
-
Style/AndOr:
|
|
11
|
-
Enabled: true
|
|
12
|
-
|
|
13
|
-
# Do not use braces for hash literals when they are the last argument of a
|
|
14
|
-
# method call.
|
|
15
|
-
Style/HashAsLastArrayItem:
|
|
16
|
-
Enabled: true
|
|
17
|
-
|
|
18
|
-
# Align `when` with `case`.
|
|
19
|
-
Layout/CaseIndentation:
|
|
20
|
-
Enabled: true
|
|
21
|
-
|
|
22
|
-
# Align comments with method definitions.
|
|
23
|
-
Layout/CommentIndentation:
|
|
24
|
-
Enabled: true
|
|
25
|
-
|
|
26
|
-
Layout/EmptyLineAfterMagicComment:
|
|
27
|
-
Enabled: true
|
|
28
|
-
|
|
29
|
-
# No extra empty lines.
|
|
30
|
-
Layout/EmptyLines:
|
|
31
|
-
Enabled: true
|
|
32
|
-
|
|
33
|
-
# In a regular class definition, no empty lines around the body.
|
|
34
|
-
Layout/EmptyLinesAroundClassBody:
|
|
35
|
-
Enabled: true
|
|
36
|
-
|
|
37
|
-
# In a regular method definition, no empty lines around the body.
|
|
38
|
-
Layout/EmptyLinesAroundMethodBody:
|
|
39
|
-
Enabled: true
|
|
40
|
-
|
|
41
|
-
# In a regular module definition, no empty lines around the body.
|
|
42
|
-
Layout/EmptyLinesAroundModuleBody:
|
|
43
|
-
Enabled: true
|
|
44
|
-
|
|
45
|
-
Layout/FirstArgumentIndentation:
|
|
46
|
-
Enabled: true
|
|
47
|
-
|
|
48
|
-
# Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
|
|
49
|
-
Style/HashSyntax:
|
|
50
|
-
Enabled: true
|
|
51
|
-
EnforcedShorthandSyntax: never
|
|
52
|
-
|
|
53
|
-
# Method definitions after `private` or `protected` isolated calls need one
|
|
54
|
-
# extra level of indentation.
|
|
55
|
-
Layout/IndentationConsistency:
|
|
56
|
-
Enabled: true
|
|
57
|
-
EnforcedStyle: normal
|
|
58
|
-
|
|
59
|
-
# Two spaces, no tabs (for indentation).
|
|
60
|
-
Layout/IndentationWidth:
|
|
61
|
-
Enabled: true
|
|
62
|
-
|
|
63
|
-
Layout/SpaceAfterColon:
|
|
64
|
-
Enabled: true
|
|
65
|
-
|
|
66
|
-
Layout/SpaceAfterComma:
|
|
67
|
-
Enabled: true
|
|
68
|
-
|
|
69
|
-
Layout/SpaceAroundEqualsInParameterDefault:
|
|
70
|
-
Enabled: true
|
|
71
|
-
|
|
72
|
-
Layout/SpaceAroundKeyword:
|
|
73
|
-
Enabled: true
|
|
74
|
-
|
|
75
|
-
Layout/SpaceAroundOperators:
|
|
76
|
-
Enabled: true
|
|
77
|
-
|
|
78
|
-
Layout/SpaceBeforeFirstArg:
|
|
79
|
-
Enabled: true
|
|
80
|
-
|
|
81
|
-
# Defining a method with parameters needs parentheses.
|
|
82
|
-
Style/MethodDefParentheses:
|
|
83
|
-
Enabled: true
|
|
84
|
-
|
|
85
|
-
# Use `foo {}` not `foo{}`.
|
|
86
|
-
Layout/SpaceBeforeBlockBraces:
|
|
87
|
-
Enabled: true
|
|
88
|
-
|
|
89
|
-
# Use `foo { bar }` not `foo {bar}`.
|
|
90
|
-
Layout/SpaceInsideBlockBraces:
|
|
91
|
-
Enabled: true
|
|
92
|
-
|
|
93
|
-
# Use `{ a: 1 }` not `{a:1}`.
|
|
94
|
-
Layout/SpaceInsideHashLiteralBraces:
|
|
95
|
-
Enabled: true
|
|
96
|
-
|
|
97
|
-
Layout/SpaceInsideParens:
|
|
98
|
-
Enabled: true
|
|
99
|
-
|
|
100
|
-
# Check quotes usage according to lint rule below.
|
|
101
|
-
Style/StringLiterals:
|
|
102
|
-
Enabled: true
|
|
103
|
-
EnforcedStyle: single_quotes
|
|
104
|
-
|
|
105
|
-
# Detect hard tabs, no hard tabs.
|
|
106
|
-
Layout/IndentationStyle:
|
|
107
|
-
Enabled: true
|
|
108
|
-
|
|
109
|
-
# Blank lines should not have any spaces.
|
|
110
|
-
Layout/TrailingEmptyLines:
|
|
111
|
-
Enabled: true
|
|
112
|
-
|
|
113
|
-
# No trailing whitespace.
|
|
114
|
-
Layout/TrailingWhitespace:
|
|
115
|
-
Enabled: true
|
|
116
|
-
|
|
117
|
-
# Use quotes for string literals when they are enough.
|
|
118
|
-
Style/RedundantPercentQ:
|
|
119
|
-
Enabled: true
|
|
120
|
-
|
|
121
|
-
# Align `end` with the matching keyword or starting expression except for
|
|
122
|
-
# assignments, where it should be aligned with the LHS.
|
|
123
|
-
Layout/EndAlignment:
|
|
124
|
-
Enabled: true
|
|
125
|
-
EnforcedStyleAlignWith: variable
|
|
126
|
-
|
|
127
|
-
# Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
|
|
128
|
-
Lint/RequireParentheses:
|
|
129
|
-
Enabled: true
|
data/CHANGELOG.template
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
[v#.#.#] ([month] [YYYY])
|
|
2
|
-
- [future tense verb] [feature]
|
|
3
|
-
- Upgraded gems:
|
|
4
|
-
- [gem]
|
|
5
|
-
- Bugs fixes:
|
|
6
|
-
- [future tense verb] [bug fix]
|
|
7
|
-
- Bug tracker items:
|
|
8
|
-
- [item]
|
|
9
|
-
- Security Fixes:
|
|
10
|
-
- High: (Authenticated|Unauthenticated) (admin|author|contributor) [vulnerability description]
|
|
11
|
-
- Medium: (Authenticated|Unauthenticated) (admin|author|contributor) [vulnerability description]
|
|
12
|
-
- Low: (Authenticated|Unauthenticated) (admin|author|contributor) [vulnerability description]
|
data/CONTRIBUTING.md
DELETED
data/Gemfile
DELETED
data/dradis-plugins.gemspec
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
$:.push File.expand_path('../lib', __FILE__)
|
|
2
|
-
|
|
3
|
-
require 'dradis/plugins/version'
|
|
4
|
-
|
|
5
|
-
# Describe your gem and declare its dependencies:
|
|
6
|
-
Gem::Specification.new do |spec|
|
|
7
|
-
spec.platform = Gem::Platform::RUBY
|
|
8
|
-
spec.name = 'dradis-plugins'
|
|
9
|
-
spec.version = Dradis::Plugins::VERSION::STRING
|
|
10
|
-
spec.summary = 'Plugin manager for the Dradis Framework project.'
|
|
11
|
-
spec.description = 'Required dependency for Dradis Framework.'
|
|
12
|
-
|
|
13
|
-
spec.license = 'GPL-2'
|
|
14
|
-
|
|
15
|
-
spec.authors = ['Daniel Martin']
|
|
16
|
-
spec.homepage = 'http://dradis.com/ce/'
|
|
17
|
-
|
|
18
|
-
spec.files = `git ls-files`.split($\)
|
|
19
|
-
spec.executables = spec.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
|
20
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
21
|
-
|
|
22
|
-
spec.add_development_dependency 'bundler', '~> 2.0'
|
|
23
|
-
spec.add_development_dependency 'rake'
|
|
24
|
-
spec.add_development_dependency 'rspec-rails'
|
|
25
|
-
spec.add_development_dependency 'rubocop', '1.79.0'
|
|
26
|
-
end
|
data/spec/engine_spec.rb
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
require 'rails_helper'
|
|
2
|
-
|
|
3
|
-
class TestEngine < ::Rails::Engine
|
|
4
|
-
include ::Dradis::Plugins::Base
|
|
5
|
-
addon_settings :test_engine do
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
describe Dradis::Plugins::Base do
|
|
10
|
-
before(:each) do
|
|
11
|
-
TestEngine::settings.reset_defaults!
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
describe '#enabled?' do
|
|
15
|
-
it 'returns default value' do
|
|
16
|
-
expect(TestEngine.enabled?).to eq(true)
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
describe '#enable!' do
|
|
20
|
-
it 'sets enabled to true' do
|
|
21
|
-
TestEngine.settings.enabled = false
|
|
22
|
-
TestEngine.settings.save
|
|
23
|
-
|
|
24
|
-
expect { TestEngine.enable! }.to change {
|
|
25
|
-
TestEngine.enabled?
|
|
26
|
-
}.from(false).to(true)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
describe '#disable!' do
|
|
30
|
-
it 'sets enabled to false' do
|
|
31
|
-
TestEngine.settings.enabled = true
|
|
32
|
-
TestEngine.settings.save
|
|
33
|
-
|
|
34
|
-
expect { TestEngine.disable! }.to change {
|
|
35
|
-
TestEngine.enabled?
|
|
36
|
-
}.from(true).to(false)
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
data/spec/internal/log/test.log
DELETED
|
File without changes
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
require 'rails_helper'
|
|
2
|
-
|
|
3
|
-
# To run, execute from Dradis main app folder:
|
|
4
|
-
# bin/rspec [dradis-plugins path]/spec/lib/dradis/plugins/content_service/boards_spec.rb
|
|
5
|
-
describe Dradis::Plugins::ContentService::Boards do
|
|
6
|
-
let(:plugin) { Dradis::Plugins::Nessus }
|
|
7
|
-
let(:project) { create(:project) }
|
|
8
|
-
let(:service) do
|
|
9
|
-
Dradis::Plugins::ContentService::Base.new(
|
|
10
|
-
plugin: plugin,
|
|
11
|
-
logger: Rails.logger,
|
|
12
|
-
project: project
|
|
13
|
-
)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
describe 'Boards' do
|
|
17
|
-
describe '#all_boards' do
|
|
18
|
-
it 'returns all the project-level boards' do
|
|
19
|
-
board = create(:board, project: project)
|
|
20
|
-
node = create(:node, project: project)
|
|
21
|
-
node_board = create(:board, node: node, project: project)
|
|
22
|
-
|
|
23
|
-
boards = service.project_boards
|
|
24
|
-
|
|
25
|
-
expect(boards).to include(board)
|
|
26
|
-
expect(boards).to_not include(node_board)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
describe '#create_board' do
|
|
31
|
-
it 'creates a board without a node' do
|
|
32
|
-
service.create_board(name: 'NodelessBoard')
|
|
33
|
-
|
|
34
|
-
expect(project.reload.boards.where(name: 'NodelessBoard')).to_not be_nil
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it 'creates a board with a node' do
|
|
38
|
-
node = create(:node, project: project)
|
|
39
|
-
service.create_board(name: 'NodeBoard', node_id: node.id)
|
|
40
|
-
|
|
41
|
-
expect(project.reload.boards.where(name: 'NodeBoard')).to_not be_nil
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
require 'rails_helper'
|
|
2
|
-
|
|
3
|
-
# To run, execute from Dradis Pro main app folder:
|
|
4
|
-
# bin/rspec [dradis-plugins path]/spec/lib/dradis/plugins/content_service/content_blocks_spec.rb
|
|
5
|
-
|
|
6
|
-
describe 'Content Block content service' do
|
|
7
|
-
let(:plugin) { Dradis::Plugins::Nessus }
|
|
8
|
-
let(:plugin_id) { '111' }
|
|
9
|
-
let(:project) { create(:project) }
|
|
10
|
-
let(:service) do
|
|
11
|
-
Dradis::Plugins::ContentService::Base.new(
|
|
12
|
-
plugin: plugin,
|
|
13
|
-
logger: Rails.logger,
|
|
14
|
-
project: project
|
|
15
|
-
)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
describe '#all_content_blocks' do
|
|
19
|
-
before do
|
|
20
|
-
@draft_content = create_list(:content_block, 10, project: project, state: :draft)
|
|
21
|
-
@review_content = create_list(:content_block, 10, project: project, state: :ready_for_review)
|
|
22
|
-
@published_content = create_list(:content_block, 10, project: project, state: :published)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it 'returns only the published content blocks' do
|
|
26
|
-
expect(service.all_content_blocks.to_a).to match_array(@published_content)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
require 'rails_helper'
|
|
2
|
-
|
|
3
|
-
# To run, execute from Dradis main app folder:
|
|
4
|
-
# bin/rspec [dradis-plugins path]/spec/lib/dradis/plugins/content_service/issues_spec.rb
|
|
5
|
-
|
|
6
|
-
describe 'Issues content service' do
|
|
7
|
-
let(:plugin) { Dradis::Plugins::Nessus }
|
|
8
|
-
let(:plugin_id) { '111' }
|
|
9
|
-
let(:project) { create(:project) }
|
|
10
|
-
let(:service) do
|
|
11
|
-
Dradis::Plugins::ContentService::Base.new(
|
|
12
|
-
plugin: plugin,
|
|
13
|
-
logger: Rails.logger,
|
|
14
|
-
project: project
|
|
15
|
-
)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
describe 'Issues' do
|
|
19
|
-
let(:create_issue) do
|
|
20
|
-
service.create_issue(text: "#[Title]#\nTest Issue\n", id: plugin_id, state: :ready_for_review)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe 'when the issue already exists in the cache' do
|
|
24
|
-
before do
|
|
25
|
-
issue = create(:issue, text: "#[Title]#\nTest Issue\n", id: plugin_id)
|
|
26
|
-
service.issue_cache.store("nessus-#{plugin_id}", issue)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it 'does not create a new issue' do
|
|
30
|
-
expect { create_issue }.not_to change { Issue.count }
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
describe "when the issue doesn't already exist in the cache" do
|
|
35
|
-
it "creates a new Issue containing 'plugin' and 'plugin_id'" do
|
|
36
|
-
new_issue = nil
|
|
37
|
-
plugin_name = "#{plugin}::Engine".constantize.plugin_name
|
|
38
|
-
expect { new_issue = create_issue }.to change { Issue.count }.by(1)
|
|
39
|
-
expect(new_issue.text).to match(/#\[plugin\]#\n*#{plugin_name}/)
|
|
40
|
-
expect(new_issue.text).to match(/#\[plugin_id\]#\n*#{plugin_id}/)
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
describe '#all_issues' do
|
|
45
|
-
before do
|
|
46
|
-
@draft_issues = create_list(:issue, 10, project: project, state: :draft)
|
|
47
|
-
@review_issues = create_list(:issue, 10, project: project, state: :ready_for_review)
|
|
48
|
-
@published_issues = create_list(:issue, 10, project: project, state: :published)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it 'returns only the published issues' do
|
|
52
|
-
expect(service.all_issues.to_a).to match_array(@published_issues)
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
require 'rails_helper'
|
|
2
|
-
|
|
3
|
-
# To run, execute from Dradis main app folder:
|
|
4
|
-
# bin/rspec [dradis-plugins path]/spec/lib/dradis/plugins/mapping_service_spec.rb
|
|
5
|
-
describe Dradis::Plugins::MappingService do
|
|
6
|
-
describe '#apply_mapping' do
|
|
7
|
-
let(:data) { double }
|
|
8
|
-
let(:liquid_mapping_field) {
|
|
9
|
-
create(:mapping_field, content: "{% if issue.evidence %}\n{% endif %} }}")
|
|
10
|
-
}
|
|
11
|
-
let(:integration) { Dradis::Plugins::Qualys }
|
|
12
|
-
let(:project) { create(:project, :with_report_template_properties) }
|
|
13
|
-
let(:qualys_mapping_field) {
|
|
14
|
-
create(:mapping_field, destination_field: 'Test Field', content: 'test content')
|
|
15
|
-
}
|
|
16
|
-
let(:mapping_service) do
|
|
17
|
-
Dradis::Plugins::MappingService.new(
|
|
18
|
-
integration: integration,
|
|
19
|
-
destination: "rtp_#{project.report_template_properties_id}"
|
|
20
|
-
)
|
|
21
|
-
end
|
|
22
|
-
let(:mapping_processed) do
|
|
23
|
-
mapping_service.apply_mapping(source: 'was_issue', data: data)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
before do
|
|
27
|
-
allow(data).to receive(:name).and_return('VULNERABILITY')
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
context 'with default mappings' do
|
|
31
|
-
it 'applies default mappings when no mapping exists' do
|
|
32
|
-
expect(mapping_processed).to include("#[Title]#\n")
|
|
33
|
-
expect(mapping_processed).not_to include("#[Test Field]#\n")
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
context 'with custom mappings' do
|
|
38
|
-
it 'applies mappings when a mapping matching the uploader & source exists' do
|
|
39
|
-
allow(mapping_service).to receive(:get_mapping_fields).and_return([qualys_mapping_field])
|
|
40
|
-
|
|
41
|
-
expect(mapping_processed).to include("#[Test Field]#\ntest content")
|
|
42
|
-
expect(mapping_processed).not_to include("#[Title]#\n")
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
context 'with liquid content' do
|
|
46
|
-
it 'does not parse the liquid data as fields' do
|
|
47
|
-
allow(mapping_service).to receive(:get_mapping_fields).and_return([liquid_mapping_field])
|
|
48
|
-
|
|
49
|
-
expect(mapping_processed).to include("{% if issue.evidence %}\n{% endif %} }}")
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# This spec must be run from Dradis root dir.
|
|
3
|
-
#
|
|
4
|
-
# Configuration init from:
|
|
5
|
-
# https://github.com/rails/rails/blob/main/activesupport/test/encrypted_configuration_test.rb
|
|
6
|
-
#
|
|
7
|
-
require 'rails_helper'
|
|
8
|
-
|
|
9
|
-
describe Dradis::Plugins::Settings::Adapters::EncryptedConfiguration do
|
|
10
|
-
|
|
11
|
-
subject do
|
|
12
|
-
ec = Dradis::Plugins::Settings::Adapters::EncryptedConfiguration.new(:rspec)
|
|
13
|
-
ec.config_path = @credentials_config_path
|
|
14
|
-
ec.key_path = @credentials_key_path
|
|
15
|
-
ec
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
context 'With an empty config file' do
|
|
19
|
-
before(:all) do
|
|
20
|
-
@tmpdir = Dir.mktmpdir('config-')
|
|
21
|
-
@credentials_config_path = File.join(@tmpdir, 'empty.yml.enc')
|
|
22
|
-
@credentials_key_path = File.join(@tmpdir, 'empty.key')
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
describe '#delete' do
|
|
26
|
-
it 'becomes a no-op' do
|
|
27
|
-
expect { subject.delete(:key) }.to_not raise_error
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
describe '#exists' do
|
|
32
|
-
it 'is always false' do
|
|
33
|
-
expect(subject.exists?(:key)).to be(false)
|
|
34
|
-
expect(subject.exists?(:key2)).to be(false)
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
describe '#read' do
|
|
39
|
-
it 'always returns nil' do
|
|
40
|
-
expect(subject.read(:key)).to eq(nil)
|
|
41
|
-
expect(subject.read(:key2)).to eq(nil)
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
describe '#write' do
|
|
46
|
-
it 'inits the namespace and stores the setting' do
|
|
47
|
-
expect { subject.write(:key, :value) }.to_not raise_error
|
|
48
|
-
expect(File.size(@credentials_config_path)).to_not be(0)
|
|
49
|
-
|
|
50
|
-
File.unlink @credentials_config_path
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
context 'With a working config file' do
|
|
56
|
-
DEFAULT_CONFIG = { rspec: { key: :lorem_ipsum, key2: :dolor_sit } }.to_yaml.freeze
|
|
57
|
-
|
|
58
|
-
before(:all) do
|
|
59
|
-
@tmpdir = Dir.mktmpdir('config-')
|
|
60
|
-
@credentials_config_path = File.join(@tmpdir, 'credentials.yml.enc')
|
|
61
|
-
@credentials_key_path = File.join(@tmpdir, 'master.key')
|
|
62
|
-
|
|
63
|
-
File.write(@credentials_key_path, ActiveSupport::EncryptedConfiguration.generate_key)
|
|
64
|
-
|
|
65
|
-
@credentials = ActiveSupport::EncryptedConfiguration.new(
|
|
66
|
-
config_path: @credentials_config_path, key_path: @credentials_key_path,
|
|
67
|
-
env_key: 'RAILS_MASTER_KEY', raise_if_missing_key: true
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
@credentials.write(DEFAULT_CONFIG)
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
after(:all) do
|
|
74
|
-
FileUtils.rm_rf @tmpdir
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
describe '#delete' do
|
|
78
|
-
it 'removes a value from disk' do
|
|
79
|
-
subject.delete(:key2)
|
|
80
|
-
|
|
81
|
-
@credentials.instance_variable_set('@config', nil)
|
|
82
|
-
expect(@credentials.config[:rspec].key?(:key)).to be(true)
|
|
83
|
-
expect(@credentials.config[:rspec].key?(:key2)).to be(false)
|
|
84
|
-
@credentials.write(DEFAULT_CONFIG)
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
describe '#exists' do
|
|
89
|
-
it 'finds an existing value' do
|
|
90
|
-
expect(subject.exists?(:key)).to be(true)
|
|
91
|
-
end
|
|
92
|
-
it 'detects an inexisting value' do
|
|
93
|
-
expect(subject.exists?(:key3)).to be(false)
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
describe '#read' do
|
|
98
|
-
it 'loads an already existing value' do
|
|
99
|
-
expect(subject.read(:key)).to eq(:lorem_ipsum)
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
describe '#write' do
|
|
104
|
-
it 'stores a value on disk' do
|
|
105
|
-
subject.write(:new_key, :new_value)
|
|
106
|
-
@credentials.instance_variable_set('@config', nil)
|
|
107
|
-
expect(@credentials.config[:rspec][:new_key]).to eq(:new_value)
|
|
108
|
-
@credentials.write(DEFAULT_CONFIG)
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
end
|
data/spec/settings_spec.rb
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# This spec must be ran from Dradis root dir
|
|
3
|
-
#
|
|
4
|
-
require 'rails_helper'
|
|
5
|
-
|
|
6
|
-
class TestEngine < ::Rails::Engine
|
|
7
|
-
include ::Dradis::Plugins::Base
|
|
8
|
-
addon_settings :test_engine do
|
|
9
|
-
settings.default_host = 'localhost'
|
|
10
|
-
settings.default_port = 80
|
|
11
|
-
settings.default_protocol = 'http'
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
describe Dradis::Plugins::Settings do
|
|
16
|
-
|
|
17
|
-
before(:each) do
|
|
18
|
-
TestEngine::settings.reset_defaults!
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it 'sets and return default values' do
|
|
22
|
-
expect(TestEngine::settings.host).to eq('localhost')
|
|
23
|
-
expect(TestEngine::settings.port).to eq(80)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it 'sets and returns user defined values' do
|
|
27
|
-
expect(TestEngine::settings.host).to eq('localhost')
|
|
28
|
-
TestEngine::settings.host = '127.0.0.1'
|
|
29
|
-
expect(TestEngine::settings.host).to eq('127.0.0.1')
|
|
30
|
-
expect(TestEngine::settings.port).to eq(80)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it 'sets and returns new value even if it equals default value' do
|
|
34
|
-
expect(TestEngine::settings.host).to eq('localhost')
|
|
35
|
-
TestEngine::settings.host = '127.0.0.1'
|
|
36
|
-
expect(TestEngine::settings.host).to eq('127.0.0.1')
|
|
37
|
-
TestEngine::settings.host = 'localhost'
|
|
38
|
-
expect(TestEngine::settings.host).to eq('localhost')
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
it 'saves to db and returns persisted values' do
|
|
42
|
-
expect(TestEngine::settings.host).to eq('localhost')
|
|
43
|
-
TestEngine::settings.host = '127.0.0.1'
|
|
44
|
-
expect(TestEngine::settings.save).to eq({ host: '127.0.0.1' })
|
|
45
|
-
expect(TestEngine::settings.host).to eq('127.0.0.1')
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it 'reads from db after saving' do
|
|
49
|
-
expect(TestEngine::settings.host).to eq('localhost')
|
|
50
|
-
TestEngine::settings.host = '127.0.0.1'
|
|
51
|
-
expect(TestEngine::settings.save).to eq({ host: '127.0.0.1' })
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
describe Dradis::Plugins::Settings, '#is_default?' do
|
|
57
|
-
it 'knows if a string value equals its default integer value' do
|
|
58
|
-
TestEngine::settings.is_default?(:port, '80')
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
describe Dradis::Plugins::Settings, '#all' do
|
|
63
|
-
it 'returns values from db, dirty state or default as needed and tells which one is default' do
|
|
64
|
-
TestEngine::settings.host = '127.0.0.1'
|
|
65
|
-
TestEngine::settings.save
|
|
66
|
-
TestEngine::settings.protocol = 'https'
|
|
67
|
-
expect(TestEngine::settings.all).to eq([
|
|
68
|
-
{
|
|
69
|
-
name: :host,
|
|
70
|
-
value: '127.0.0.1',
|
|
71
|
-
default: false
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
name: :port,
|
|
75
|
-
value: 80,
|
|
76
|
-
default: true
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
name: :protocol,
|
|
80
|
-
value: 'https',
|
|
81
|
-
default: false
|
|
82
|
-
},
|
|
83
|
-
])
|
|
84
|
-
end
|
|
85
|
-
end
|
data/spec/spec_helper.rb
DELETED
data/spec/support/spec_macros.rb
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
module Dradis::Plugins::SpecMacros
|
|
2
|
-
extend ActiveSupport::Concern
|
|
3
|
-
|
|
4
|
-
def stub_content_service
|
|
5
|
-
@content_service = Dradis::Plugins::ContentService::Base.new(
|
|
6
|
-
logger: Logger.new(STDOUT),
|
|
7
|
-
plugin: Dradis::Plugins::Nexpose
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
# Stub content_service methods
|
|
11
|
-
# They return their argument hashes as objects mimicking
|
|
12
|
-
# nodes, issues, etc
|
|
13
|
-
allow(@content_service).to receive(:create_node) do |args|
|
|
14
|
-
OpenStruct.new(args)
|
|
15
|
-
end
|
|
16
|
-
allow(@content_service).to receive(:create_note) do |args|
|
|
17
|
-
OpenStruct.new(args)
|
|
18
|
-
end
|
|
19
|
-
allow(@content_service).to receive(:create_issue) do |args|
|
|
20
|
-
OpenStruct.new(args)
|
|
21
|
-
end
|
|
22
|
-
allow(@content_service).to receive(:create_evidence) do |args|
|
|
23
|
-
OpenStruct.new(args)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|