dradis-projects 3.9.0 → 3.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/dradis-projects.gemspec +1 -1
- data/lib/dradis/plugins/projects/engine.rb +2 -2
- data/lib/dradis/plugins/projects/export/package.rb +1 -1
- data/lib/dradis/plugins/projects/export/template.rb +1 -0
- data/lib/dradis/plugins/projects/export/v1/template.rb +4 -4
- data/lib/dradis/plugins/projects/export/v2/template.rb +40 -0
- data/lib/dradis/plugins/projects/gem_version.rb +1 -1
- data/lib/dradis/plugins/projects/upload/template.rb +1 -0
- data/lib/dradis/plugins/projects/upload/v1/template.rb +34 -25
- data/lib/dradis/plugins/projects/upload/v2/template.rb +37 -0
- data/lib/tasks/thorfile.rb +2 -2
- data/spec/fixtures/files/attachments_url.xml +15 -0
- data/spec/lib/dradis/plugins/projects/upload/v1/template_spec.rb +33 -0
- metadata +12 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0256537152511bdd57bd8bda059eecd5adfaf3d4
|
4
|
+
data.tar.gz: a456a38a9168d70a77266162a18844308314c479
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 603efc920654a2a403a74094f036f742a0b02250e4fc030f10a4d25acdcce08b138b510fca6bfc30a82071a87f308990969e7cdf3a659cd0ed66bd1a09848432
|
7
|
+
data.tar.gz: 460caa7831aa233b2ada3e90333c1f2e4e9bdcaf7ee61b6ba323bf8b226722b1a4daf44062cdc5a5b6d0a477cebd9ffe156151cff381cdad0a28d79395a3324b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## Dradis Framework 3.10 (August, 2018) ##
|
2
|
+
|
3
|
+
* Use project scopes
|
4
|
+
|
5
|
+
* Check project existence for default user id
|
6
|
+
|
7
|
+
* Comments export import
|
8
|
+
|
9
|
+
* Replace Node methods that are now Project methods
|
10
|
+
|
1
11
|
## Dradis Framework 3.9 (January, 2018) ##
|
2
12
|
|
3
13
|
* Fix nodes upload
|
data/dradis-projects.gemspec
CHANGED
@@ -18,8 +18,8 @@ module Dradis
|
|
18
18
|
|
19
19
|
initializer "dradis-projects.set_configs" do |app|
|
20
20
|
options = app.config.dradis.projects
|
21
|
-
options.template_exporter ||= Dradis::Plugins::Projects::Export::
|
22
|
-
options.template_uploader ||= Dradis::Plugins::Projects::Upload::
|
21
|
+
options.template_exporter ||= Dradis::Plugins::Projects::Export::V2::Template
|
22
|
+
options.template_uploader ||= Dradis::Plugins::Projects::Upload::V2::Template::Importer
|
23
23
|
end
|
24
24
|
|
25
25
|
|
@@ -15,7 +15,7 @@ module Dradis::Plugins::Projects::Export
|
|
15
15
|
logger.debug{ "Creating a new Zip file in #{filename}..." }
|
16
16
|
|
17
17
|
Zip::File.open(filename, Zip::File::CREATE) do |zipfile|
|
18
|
-
|
18
|
+
@project.nodes.each do |node|
|
19
19
|
node_path = Attachment.pwd.join(node.id.to_s)
|
20
20
|
|
21
21
|
Dir["#{node_path}/**/**"].each do |file|
|
@@ -50,7 +50,7 @@ module Dradis::Plugins::Projects::Export::V1
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def build_issues(builder)
|
53
|
-
@issues = Issue.where(node_id:
|
53
|
+
@issues = Issue.where(node_id: project.issue_library).includes(:activities)
|
54
54
|
|
55
55
|
builder.issues do |issues_builder|
|
56
56
|
@issues.each do |issue|
|
@@ -67,7 +67,7 @@ module Dradis::Plugins::Projects::Export::V1
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def build_methodologies(builder)
|
70
|
-
methodologies =
|
70
|
+
methodologies = project.methodology_library.notes
|
71
71
|
builder.methodologies do |methodologies_builder|
|
72
72
|
methodologies.each do |methodology|
|
73
73
|
methodologies_builder.methodology(version: VERSION) do |methodology_builder|
|
@@ -80,7 +80,7 @@ module Dradis::Plugins::Projects::Export::V1
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def build_nodes(builder)
|
83
|
-
@nodes =
|
83
|
+
@nodes = project.nodes.includes(:activities, :evidence, :notes, evidence: [:activities], notes: [:activities, :category]).all.reject do |node|
|
84
84
|
[Node::Types::METHODOLOGY,
|
85
85
|
Node::Types::ISSUELIB].include?(node.type_id)
|
86
86
|
end
|
@@ -125,7 +125,7 @@ module Dradis::Plugins::Projects::Export::V1
|
|
125
125
|
def build_report_content(builder); end
|
126
126
|
|
127
127
|
def build_tags(builder)
|
128
|
-
tags =
|
128
|
+
tags = project.tags
|
129
129
|
builder.tags do |tags_builder|
|
130
130
|
tags.each do |tag|
|
131
131
|
tags_builder.tag do |tag_builder|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Dradis::Plugins::Projects::Export::V2
|
2
|
+
class Template < Dradis::Plugins::Projects::Export::V1::Template
|
3
|
+
VERSION = 2
|
4
|
+
|
5
|
+
protected
|
6
|
+
|
7
|
+
def build_comments_for(builder, commentable)
|
8
|
+
builder.comments do |comments_builder|
|
9
|
+
commentable.comments.each do |comment|
|
10
|
+
comments_builder.comment do |comment_builder|
|
11
|
+
comment_builder.content do
|
12
|
+
comment_builder.cdata!(comment.content)
|
13
|
+
end
|
14
|
+
comment_builder.author(comment.user.email)
|
15
|
+
comment_builder.created_at(comment.created_at.to_i)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def build_issues(builder)
|
22
|
+
@issues = Issue.where(node_id: project.issue_library).includes(:activities)
|
23
|
+
|
24
|
+
builder.issues do |issues_builder|
|
25
|
+
@issues.each do |issue|
|
26
|
+
issues_builder.issue do |issue_builder|
|
27
|
+
issue_builder.id(issue.id)
|
28
|
+
issue_builder.author(issue.author)
|
29
|
+
issue_builder.text do
|
30
|
+
issue_builder.cdata!(issue.text)
|
31
|
+
end
|
32
|
+
build_activities_for(issue_builder, issue)
|
33
|
+
build_comments_for(issue_builder, issue)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -5,6 +5,8 @@ module Dradis::Plugins::Projects::Upload::V1
|
|
5
5
|
|
6
6
|
attr_accessor :attachment_notes, :logger, :pending_changes
|
7
7
|
|
8
|
+
ATTACHMENT_URL = %r{^!(/[a-z]+)?/(?:projects/\d+/)?nodes/(\d+)/attachments/(.+)!$}
|
9
|
+
|
8
10
|
def post_initialize(args={})
|
9
11
|
@lookup_table = {
|
10
12
|
categories: {},
|
@@ -50,11 +52,28 @@ module Dradis::Plugins::Projects::Upload::V1
|
|
50
52
|
created_at: Time.at(xml_activity.at_xpath("created_at").text.to_i)
|
51
53
|
)
|
52
54
|
|
55
|
+
activity.project_id = project.id if activity.respond_to?(:project)
|
56
|
+
|
53
57
|
set_activity_user(activity, xml_activity.at_xpath("user_email").text)
|
54
58
|
|
55
59
|
validate_and_save(activity)
|
56
60
|
end
|
57
61
|
|
62
|
+
def create_issue(issue, xml_issue)
|
63
|
+
# TODO: Need to find some way of checking for dups
|
64
|
+
# May be combination of text, category_id and created_at
|
65
|
+
issue.author = xml_issue.at_xpath('author').text.strip
|
66
|
+
issue.text = xml_issue.at_xpath('text').text
|
67
|
+
issue.node = project.issue_library
|
68
|
+
issue.category = Category.issue
|
69
|
+
|
70
|
+
return false unless validate_and_save(issue)
|
71
|
+
|
72
|
+
return false unless create_activities(issue, xml_issue)
|
73
|
+
|
74
|
+
true
|
75
|
+
end
|
76
|
+
|
58
77
|
def finalize(template)
|
59
78
|
logger.info { 'Wrapping up...' }
|
60
79
|
|
@@ -72,10 +91,9 @@ module Dradis::Plugins::Projects::Upload::V1
|
|
72
91
|
|
73
92
|
logger.info { "Adjusting screenshot URLs: #{item.class.name} ##{item.id}" }
|
74
93
|
|
75
|
-
new_text = item.send(text_attr).gsub(
|
76
|
-
"!%s/nodes/%d/attachments/%s!" % [$1, lookup_table[:nodes][$2], $3]
|
94
|
+
new_text = item.send(text_attr).gsub(ATTACHMENT_URL) do |_|
|
95
|
+
"!%s/projects/%d/nodes/%d/attachments/%s!" % [$1, project.id, lookup_table[:nodes][$2], $3]
|
77
96
|
end
|
78
|
-
|
79
97
|
item.send(text_attr.to_s + "=", new_text)
|
80
98
|
|
81
99
|
raise "Couldn't save note attachment URL for #{item.class.name} ##{item.id}" unless validate_and_save(item)
|
@@ -89,8 +107,8 @@ module Dradis::Plugins::Projects::Upload::V1
|
|
89
107
|
logger.info { "Setting issue_id for evidence" }
|
90
108
|
evidence.issue_id = lookup_table[:issues][evidence.issue_id.to_s]
|
91
109
|
|
92
|
-
new_content
|
93
|
-
"!%s/nodes/%d/attachments/%s!" % [$1, lookup_table[:nodes][$2], $3]
|
110
|
+
new_content = evidence.content.gsub(ATTACHMENT_URL) do |_|
|
111
|
+
"!%s/projects/%d/nodes/%d/attachments/%s!" % [$1, project.id, lookup_table[:nodes][$2], $3]
|
94
112
|
end
|
95
113
|
evidence.content = new_content
|
96
114
|
|
@@ -137,30 +155,19 @@ module Dradis::Plugins::Projects::Upload::V1
|
|
137
155
|
# Will need to adjust node ID after generating node structure
|
138
156
|
def parse_issues(template)
|
139
157
|
issue = nil
|
140
|
-
issue_category = Category.issue
|
141
|
-
issue_library = Node.issue_library
|
142
158
|
|
143
159
|
logger.info { 'Processing Issues...' }
|
144
160
|
|
145
161
|
template.xpath('dradis-template/issues/issue').each do |xml_issue|
|
146
|
-
old_id = xml_issue.at_xpath('id').text.strip
|
147
|
-
|
148
|
-
# TODO: Need to find some way of checking for dups
|
149
|
-
# May be combination of text, category_id and created_at
|
150
162
|
issue = Issue.new
|
151
|
-
issue.author = xml_issue.at_xpath('author').text.strip
|
152
|
-
issue.text = xml_issue.at_xpath('text').text
|
153
|
-
issue.node = issue_library
|
154
|
-
issue.category = issue_category
|
155
|
-
|
156
|
-
return false unless validate_and_save(issue)
|
157
163
|
|
158
|
-
return false unless
|
164
|
+
return false unless create_issue(issue, xml_issue)
|
159
165
|
|
160
166
|
if issue.text =~ %r{^!(.*)/nodes/(\d+)/attachments/(.+)!$}
|
161
167
|
pending_changes[:attachment_notes] << issue
|
162
168
|
end
|
163
169
|
|
170
|
+
old_id = xml_issue.at_xpath('id').text.strip
|
164
171
|
lookup_table[:issues][old_id] = issue.id
|
165
172
|
logger.info{ "New issue detected: #{issue.title}" }
|
166
173
|
end
|
@@ -171,7 +178,7 @@ module Dradis::Plugins::Projects::Upload::V1
|
|
171
178
|
|
172
179
|
def parse_methodologies(template)
|
173
180
|
methodology_category = Category.default
|
174
|
-
methodology_library =
|
181
|
+
methodology_library = project.methodology_library
|
175
182
|
|
176
183
|
logger.info { 'Processing Methodologies...' }
|
177
184
|
|
@@ -220,10 +227,10 @@ module Dradis::Plugins::Projects::Upload::V1
|
|
220
227
|
# - the Configuration.uploadsNode node (detected by its label)
|
221
228
|
# - any nodes with type different from DEFAULT or HOST
|
222
229
|
if label == Configuration.plugin_uploads_node
|
223
|
-
node =
|
230
|
+
node = project.nodes.create_with(type_id: type_id, parent_id: parent_id)
|
224
231
|
.find_or_create_by!(label: label)
|
225
232
|
elsif Node::Types::USER_TYPES.exclude?(type_id.to_i)
|
226
|
-
node =
|
233
|
+
node = project.nodes.create_with(label: label)
|
227
234
|
.find_or_create_by!(type_id: type_id)
|
228
235
|
else
|
229
236
|
# We don't want to validate child nodes here yet since they always
|
@@ -231,14 +238,14 @@ module Dradis::Plugins::Projects::Upload::V1
|
|
231
238
|
# finalize_nodes method.
|
232
239
|
has_nil_parent = !parent_id
|
233
240
|
node =
|
234
|
-
|
241
|
+
project.nodes.new(
|
235
242
|
type_id: type_id,
|
236
243
|
label: label,
|
237
244
|
parent_id: parent_id,
|
238
245
|
position: position
|
239
246
|
)
|
240
247
|
node.save!(validate: has_nil_parent)
|
241
|
-
pending_changes[:orphan_nodes]
|
248
|
+
pending_changes[:orphan_nodes] << node if parent_id
|
242
249
|
end
|
243
250
|
|
244
251
|
if properties
|
@@ -291,7 +298,7 @@ module Dradis::Plugins::Projects::Upload::V1
|
|
291
298
|
evidence.update_attribute(:updated_at, updated_at.text.strip) if updated_at
|
292
299
|
|
293
300
|
pending_changes[:evidence] << evidence
|
294
|
-
pending_changes[:evidence_activity] << xml_evidence.xpath(
|
301
|
+
pending_changes[:evidence_activity] << xml_evidence.xpath('activities/activity')
|
295
302
|
|
296
303
|
logger.info { "\tNew evidence added." }
|
297
304
|
end
|
@@ -339,7 +346,9 @@ module Dradis::Plugins::Projects::Upload::V1
|
|
339
346
|
|
340
347
|
template.xpath('dradis-template/tags/tag').each do |xml_tag|
|
341
348
|
name = xml_tag.at_xpath('name').text()
|
342
|
-
|
349
|
+
tag_params = { name: name }
|
350
|
+
tag_params[:project_id] = project.id if Tag.has_attribute?(:project_id)
|
351
|
+
tag = Tag.where(tag_params).first_or_create
|
343
352
|
logger.info { "New tag detected: #{name}" }
|
344
353
|
|
345
354
|
xml_tag.xpath('./taggings/tagging').each do |xml_tagging|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Dradis::Plugins::Projects::Upload::V2
|
2
|
+
module Template
|
3
|
+
class Importer < Dradis::Plugins::Projects::Upload::V1::Template::Importer
|
4
|
+
private
|
5
|
+
|
6
|
+
def create_comments(commentable, xml_comments)
|
7
|
+
return true if xml_comments.empty?
|
8
|
+
|
9
|
+
xml_comments.each do |xml_comment|
|
10
|
+
author_email = xml_comment.at_xpath('author').text
|
11
|
+
comment = Comment.new(
|
12
|
+
commentable_id: commentable.id,
|
13
|
+
commentable_type: commentable.class.to_s,
|
14
|
+
content: xml_comment.at_xpath('content').text,
|
15
|
+
created_at: Time.at(xml_comment.at_xpath('created_at').text.to_i),
|
16
|
+
user_id: user_id_for_email(author_email)
|
17
|
+
)
|
18
|
+
|
19
|
+
if comment.user.email != author_email
|
20
|
+
comment.content = comment.content +
|
21
|
+
"\n\nOriginal author not available in this Dradis instance: "\
|
22
|
+
"#{author_email}."
|
23
|
+
end
|
24
|
+
|
25
|
+
return false unless validate_and_save(comment)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_issue(issue, xml_issue)
|
30
|
+
return false unless super
|
31
|
+
return false unless create_comments(issue, xml_issue.xpath('comments/comment'))
|
32
|
+
|
33
|
+
true
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/tasks/thorfile.rb
CHANGED
@@ -79,7 +79,7 @@ class UploadTasks < Thor
|
|
79
79
|
|
80
80
|
detect_and_set_project_scope
|
81
81
|
|
82
|
-
default_user_id = @project.owners.first.id
|
82
|
+
default_user_id = @project ? @project.owners.first.id : User.first.id
|
83
83
|
|
84
84
|
task_options.merge!({
|
85
85
|
plugin: Dradis::Plugins::Projects::Upload::Template,
|
@@ -105,7 +105,7 @@ class UploadTasks < Thor
|
|
105
105
|
|
106
106
|
detect_and_set_project_scope
|
107
107
|
|
108
|
-
default_user_id = @project.owners.first.id
|
108
|
+
default_user_id = @project ? @project.owners.first.id : User.first.id
|
109
109
|
|
110
110
|
task_options.merge!({
|
111
111
|
plugin: Dradis::Plugins::Projects::Upload::Package,
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><dradis-template version="2"><nodes><node><id>5</id><label>Uploaded files</label><parent-id/><position>0</position><properties><![CDATA[{
|
2
|
+
}]]></properties><type-id>0</type-id><notes></notes><evidence></evidence><activities></activities></node></nodes><issues><issue><id>2</id><author>admin@securityroots.com</author><text><![CDATA[#[Title]#
|
3
|
+
Test Issue
|
4
|
+
|
5
|
+
#[Description]#
|
6
|
+
!/pro/projects/222/nodes/5/attachments/hello.jpg!
|
7
|
+
|
8
|
+
!/projects/222/nodes/5/attachments/hello.jpg!
|
9
|
+
|
10
|
+
!/pro/nodes/5/attachments/hello.jpg!
|
11
|
+
|
12
|
+
!/nodes/5/attachments/hello.jpg!
|
13
|
+
|
14
|
+
]]></text><activities></activities><comments></comments></issue></issues><methodologies></methodologies><categories>
|
15
|
+
<category><id>2</id><name>Issue description</name></category></categories><tags><tag><id>1</id><name>!9467bd_critical</name><taggings></taggings></tag><tag><id>2</id><name>!d62728_high</name><taggings></taggings></tag><tag><id>3</id><name>!ff7f0e_medium</name><taggings></taggings></tag><tag><id>4</id><name>!6baed6_low</name><taggings></taggings></tag><tag><id>5</id><name>!2ca02c_info</name><taggings></taggings></tag></tags></dradis-template>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
describe Dradis::Plugins::Projects::Upload::V1::Template::Importer do
|
4
|
+
|
5
|
+
let(:project) { create(:project) }
|
6
|
+
let(:user) { create(:user) }
|
7
|
+
let(:importer_class) { Dradis::Plugins::Projects::Upload::Template }
|
8
|
+
let(:file_path) {
|
9
|
+
File.join(File.dirname(__FILE__), '../../../../../../', 'fixtures', 'files', 'attachments_url.xml')
|
10
|
+
}
|
11
|
+
|
12
|
+
context 'uploading a template with attachments url' do
|
13
|
+
it 'converts the urls' do
|
14
|
+
importer = importer_class::Importer.new(
|
15
|
+
default_user_id: user.id,
|
16
|
+
plugin: importer_class,
|
17
|
+
project_id: project.id
|
18
|
+
)
|
19
|
+
|
20
|
+
importer.import(file: file_path)
|
21
|
+
|
22
|
+
p_id = project.id
|
23
|
+
n_id = project.plugin_uploads_node.id
|
24
|
+
|
25
|
+
expect(project.issues.first.text).to include(
|
26
|
+
"!/pro/projects/#{p_id}/nodes/#{n_id}/attachments/hello.jpg!\n\n" +
|
27
|
+
"!/projects/#{p_id}/nodes/#{n_id}/attachments/hello.jpg!\n\n" +
|
28
|
+
"!/pro/projects/#{p_id}/nodes/#{n_id}/attachments/hello.jpg!\n\n" +
|
29
|
+
"!/projects/#{p_id}/nodes/#{n_id}/attachments/hello.jpg!"
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dradis-projects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Martin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 1.2.
|
89
|
+
version: 1.2.2
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 1.2.
|
96
|
+
version: 1.2.2
|
97
97
|
description: This plugin allows you to dump the contents of the repo into a zip archive
|
98
98
|
and restore the state from one of them.
|
99
99
|
email:
|
@@ -120,12 +120,16 @@ files:
|
|
120
120
|
- lib/dradis/plugins/projects/export/package.rb
|
121
121
|
- lib/dradis/plugins/projects/export/template.rb
|
122
122
|
- lib/dradis/plugins/projects/export/v1/template.rb
|
123
|
+
- lib/dradis/plugins/projects/export/v2/template.rb
|
123
124
|
- lib/dradis/plugins/projects/gem_version.rb
|
124
125
|
- lib/dradis/plugins/projects/upload/package.rb
|
125
126
|
- lib/dradis/plugins/projects/upload/template.rb
|
126
127
|
- lib/dradis/plugins/projects/upload/v1/template.rb
|
128
|
+
- lib/dradis/plugins/projects/upload/v2/template.rb
|
127
129
|
- lib/dradis/plugins/projects/version.rb
|
128
130
|
- lib/tasks/thorfile.rb
|
131
|
+
- spec/fixtures/files/attachments_url.xml
|
132
|
+
- spec/lib/dradis/plugins/projects/upload/v1/template_spec.rb
|
129
133
|
homepage: http://dradisframework.org
|
130
134
|
licenses:
|
131
135
|
- GPL-2
|
@@ -146,8 +150,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
150
|
version: '0'
|
147
151
|
requirements: []
|
148
152
|
rubyforge_project:
|
149
|
-
rubygems_version: 2.
|
153
|
+
rubygems_version: 2.6.8
|
150
154
|
signing_key:
|
151
155
|
specification_version: 4
|
152
156
|
summary: Project export/upload for the Dradis Framework.
|
153
|
-
test_files:
|
157
|
+
test_files:
|
158
|
+
- spec/fixtures/files/attachments_url.xml
|
159
|
+
- spec/lib/dradis/plugins/projects/upload/v1/template_spec.rb
|