dradis-projects 3.22.0 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: '0059854c4be15ee7482f2c8971b2d116448fdac3'
4
- data.tar.gz: 274c11a56a4da9dd7aced8ce40d5733cebcd0fc2
2
+ SHA256:
3
+ metadata.gz: a948d2f65162d64285169d7f6107ee635f18a16b2d3b7d48b7cc27cd3f1bbf0a
4
+ data.tar.gz: 9bbffaebfc9dc1e2d7eddd85ec2182ee2fe621185ce03b67783c6113a078be43
5
5
  SHA512:
6
- metadata.gz: e7f624ad8cedc09de23de97544715f95c44d696b83b685e25d2dede9f9222de99edba495964db7c554f7199b0d6bb2274d13239f9c40cd346703e24be0547721
7
- data.tar.gz: 37e188178fad6f45c8e540e6e731c1422f49b4f0b58769f5005ac8be1c8d09ced41e4af9e0c4015e92c1bc74e091efe35924ab9d62dc97fa69d80c0c0b69ab31
6
+ metadata.gz: 0a1557060a75f871e08733097f109712ca2f0998180dd89c8a93b3f94dba4e054991d3b71ba8f6be616a17717070df2ffef363a78e5cb5d8c5faee4b26abb42a
7
+ data.tar.gz: f4368d8b867ad79c931977866278e48db0833d50490030da00c67740732afa68ffaac0d24dd7f3439c66649680e40706a41cd7606a8a576ecc38cf71b6a072ca
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.4.1
1
+ 2.7.2
data/CHANGELOG.md CHANGED
@@ -1,89 +1,81 @@
1
- ## Dradis Framework 3.22 (April, 2021) ##
1
+ v4.2.0 (February 2022)
2
+ - Bugs fixes:
3
+ - Fix missing nodes for attachments during template and package imports
4
+ - Fix missing parent nodes during template and package imports
2
5
 
3
- * No changes
6
+ v4.1.2.1 (December 2021)
7
+ - Security Fixes:
8
+ - High: Authenticated author path traversal
4
9
 
5
- ## Dradis Framework 3.21 (February, 2021) ##
10
+ v4.1.1 (November 2021)
11
+ - Loosen dradis-plugins version requirement
6
12
 
7
- * No changes
13
+ v4.1.0 (November 2021)
14
+ - No changes
8
15
 
9
- ## Dradis Framework 3.20 (Jan, 2020) ##
16
+ v4.0.0 (July 2021)
17
+ - No changes
10
18
 
11
- * Add views for the export view.
12
- * Fix exporting projects with comments by deleted users.
19
+ v3.22.0 (April 2021)
20
+ - No changes
13
21
 
14
- ## Dradis Framework 3.19 (September, 2020) ##
22
+ v3.21.0 (February 2021)
23
+ - No changes
15
24
 
16
- * No changes
25
+ v3.20.0 (January 2020)
26
+ - Add views for the export view
27
+ - Fix exporting projects with comments by deleted users
17
28
 
18
- ## Dradis Framework 3.18 (July, 2020) ##
29
+ v3.19.0 (September 2020)
30
+ - No changes
19
31
 
20
- * No changes
32
+ v3.18.0 (July 2020)
33
+ - No changes
21
34
 
22
- ## Dradis Framework 3.17 (May, 2020) ##
35
+ v3.17.0 (May 2020)
36
+ - No changes
23
37
 
24
- * No changes
38
+ v3.16.0 (February 2020)
39
+ - No changes
25
40
 
26
- ## Dradis Framework 3.16 (February, 2020) ##
41
+ v3.15.0 (November 2019)
42
+ - Being able to export/upload boards (v3)
43
+ - Fix upload with attachments
27
44
 
28
- * No changes
45
+ v3.14.1 (October 2019)
46
+ - Fix directory traversal vulnerability
29
47
 
30
- ## Dradis Framework 3.15 (November, 2019) ##
48
+ v3.14.0 (August 2019)
49
+ - No changes
31
50
 
32
- * Fix upload with attachments
33
- * Being able to export/upload boards (v3)
51
+ v3.13.0 (June 2019)
52
+ - No changes
34
53
 
35
- ## Dradis Framework 3.14.1 (October, 2019) ##
54
+ v3.12.0 (March 2019)
55
+ - No changes
36
56
 
37
- * Fix directory traversal vulnerability
57
+ v3.11.0 (November 2018)
58
+ - Note and evidence comments in export/import
38
59
 
39
- ## Dradis Framework 3.14 (August, 2019) ##
60
+ v3.10.0 (August 2018)
61
+ - Check project existence for default user id
62
+ - Issue comments in export/import
63
+ - Replace Node methods that are now Project methods
64
+ - Use project scopes
40
65
 
41
- * No changes
66
+ v3.9.0 (January 2018)
67
+ - Add default user id as fallback for activity user when importing
68
+ - Fix nodes upload
42
69
 
43
- ## Dradis Framework 3.13 (June, 2019) ##
70
+ v3.8.0 (September 2017)
71
+ - Add parse_report_content placeholders to import/export
72
+ - Add version attribute to exported methodologies
44
73
 
45
- * No changes
74
+ v3.7.0 (July 2017)
75
+ - Skip closing the logger in thorfile
46
76
 
47
- ## Dradis Framework 3.12 (March, 2019) ##
48
-
49
- * No changes
50
-
51
- ## Dradis Framework 3.11 (November, 2018) ##
52
-
53
- * Note and evidence comments in export/import
54
-
55
- ## Dradis Framework 3.10 (August, 2018) ##
56
-
57
- * Use project scopes
58
-
59
- * Check project existence for default user id
60
-
61
- * Issue comments in export/import
62
-
63
- * Replace Node methods that are now Project methods
64
-
65
- ## Dradis Framework 3.9 (January, 2018) ##
66
-
67
- * Fix nodes upload
68
-
69
- * Add default user id as fallback for activity user when importing
70
-
71
- ## Dradis Framework 3.8 (September, 2017) ##
72
-
73
- * Add version attribute to exported methodologies
74
-
75
- * Add parse_report_content placeholders to import/export.
76
-
77
- ## Dradis Framework 3.7 (July, 2017) ##
78
-
79
- * Skip closing the logger in thorfile
80
-
81
- ## Dradis Framework 3.6 (March, 2017) ##
82
-
83
- * Include file version in project template export.
84
-
85
- * Stop using homegrown configuration and use `Rails.application.config`.
86
-
87
- * Make the project template exporter / uploader configurable.
88
-
89
- * Break down the #export and #parse methods into smaller tasks.
77
+ v3.6.0 (March 2017)
78
+ - Break down the #export and #parse methods into smaller tasks
79
+ - Include file version in project template export
80
+ - Make the project template exporter / uploader configurable
81
+ - Stop using homegrown configuration and use `Rails.application.config`
@@ -0,0 +1,12 @@
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]
@@ -20,11 +20,11 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
21
21
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
22
 
23
- spec.add_development_dependency 'bundler', '~> 1.6'
23
+ spec.add_development_dependency 'bundler', '~> 2.2'
24
24
  spec.add_development_dependency 'combustion'
25
25
  spec.add_development_dependency 'rake', '~> 10.0'
26
26
  spec.add_development_dependency 'rspec'
27
27
 
28
- spec.add_dependency 'dradis-plugins', '~> 3.7'
28
+ spec.add_dependency 'dradis-plugins', '~> 4.0'
29
29
  spec.add_dependency 'rubyzip'
30
30
  end
@@ -7,8 +7,8 @@ module Dradis
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 3
11
- MINOR = 22
10
+ MAJOR = 4
11
+ MINOR = 2
12
12
  TINY = 0
13
13
  PRE = nil
14
14
 
@@ -47,13 +47,18 @@ module Dradis::Plugins::Projects::Upload
47
47
 
48
48
 
49
49
  logger.info { 'Moving attachments to their final destinations...' }
50
- lookup_table[:nodes].each do |oldid,newid|
51
- if File.directory? Rails.root.join('tmp', 'zip', oldid)
52
- FileUtils.mkdir_p Attachment.pwd.join(newid.to_s)
50
+ lookup_table[:nodes].each do |oldid, newid|
51
+ tmp_dir = Rails.root.join('tmp', 'zip')
52
+ old_attachments_dir = File.expand_path(tmp_dir.join(oldid.to_s))
53
53
 
54
- Dir.glob(Rails.root.join('tmp', 'zip', oldid, '*')).each do |attachment|
55
- FileUtils.mv(attachment, Attachment.pwd.join(newid.to_s))
56
- end
54
+ # Ensure once the path is expanded it's still within the expected
55
+ # tmp directory to prevent unauthorized access to other dirs
56
+ next unless old_attachments_dir.starts_with?(tmp_dir.to_s) && File.directory?(old_attachments_dir)
57
+
58
+ FileUtils.mkdir_p Attachment.pwd.join(newid.to_s)
59
+
60
+ Dir.glob(Pathname.new(old_attachments_dir).join('*')).each do |attachment|
61
+ FileUtils.mv(attachment, Attachment.pwd.join(newid.to_s))
57
62
  end
58
63
  end
59
64
  logger.info { 'Done.' }
@@ -104,9 +104,7 @@ module Dradis::Plugins::Projects::Upload::V1
104
104
 
105
105
  logger.info { "Adjusting screenshot URLs: #{item.class.name} ##{item.id}" }
106
106
 
107
- new_text = item.send(text_attr).gsub(ATTACHMENT_URL) do |_|
108
- "!%s/projects/%d/nodes/%d/attachments/%s!" % [$1, project.id, lookup_table[:nodes][$2], $3]
109
- end
107
+ new_text = update_attachment_references(item.send(text_attr))
110
108
  item.send(text_attr.to_s + "=", new_text)
111
109
 
112
110
  raise "Couldn't save note attachment URL for #{item.class.name} ##{item.id}" unless validate_and_save(item)
@@ -118,12 +116,9 @@ module Dradis::Plugins::Projects::Upload::V1
118
116
  def finalize_evidence
119
117
  pending_changes[:evidence].each_with_index do |evidence, i|
120
118
  logger.info { "Setting issue_id for evidence" }
121
- evidence.issue_id = lookup_table[:issues][evidence.issue_id.to_s]
119
+ evidence.issue_id = lookup_table[:issues][evidence.issue_id]
122
120
 
123
- new_content = evidence.content.gsub(ATTACHMENT_URL) do |_|
124
- "!%s/projects/%d/nodes/%d/attachments/%s!" % [$1, project.id, lookup_table[:nodes][$2], $3]
125
- end
126
- evidence.content = new_content
121
+ evidence.content = update_attachment_references(evidence.content)
127
122
 
128
123
  raise "Couldn't save Evidence :issue_id / attachment URL Evidence ##{evidence.id}" unless validate_and_save(evidence)
129
124
 
@@ -141,7 +136,7 @@ module Dradis::Plugins::Projects::Upload::V1
141
136
  def finalize_nodes
142
137
  pending_changes[:orphan_nodes].each do |node|
143
138
  logger.info { "Finding parent for orphaned node: #{node.label}. Former parent was #{node.parent_id}" }
144
- node.parent_id = lookup_table[:nodes][node.parent_id.to_s]
139
+ node.parent_id = lookup_table[:nodes][node.parent_id]
145
140
  raise "Couldn't save node parent for Node ##{node.id}" unless validate_and_save(node)
146
141
  end
147
142
  end
@@ -153,7 +148,7 @@ module Dradis::Plugins::Projects::Upload::V1
153
148
  logger.info { 'Processing Categories...' }
154
149
 
155
150
  template.xpath('dradis-template/categories/category').each do |xml_category|
156
- old_id = xml_category.at_xpath('id').text.strip
151
+ old_id = Integer(xml_category.at_xpath('id').text.strip)
157
152
  name = xml_category.at_xpath('name').text.strip
158
153
  category = nil
159
154
 
@@ -183,7 +178,7 @@ module Dradis::Plugins::Projects::Upload::V1
183
178
  pending_changes[:attachment_notes] << issue
184
179
  end
185
180
 
186
- old_id = xml_issue.at_xpath('id').text.strip
181
+ old_id = Integer(xml_issue.at_xpath('id').text.strip)
187
182
  lookup_table[:issues][old_id] = issue.id
188
183
  logger.info{ "New issue detected: #{issue.title}" }
189
184
  end
@@ -289,7 +284,12 @@ module Dradis::Plugins::Projects::Upload::V1
289
284
  node = parse_node(xml_node)
290
285
 
291
286
  # keep track of reassigned ids
292
- lookup_table[:nodes][xml_node.at_xpath('id').text.strip] = node.id
287
+ # Convert the id to an integer as it has no place being a string, or
288
+ # directory path. We later use this ID to build a directory structure
289
+ # to place attachments and without validation opens the potential for
290
+ # path traversal.
291
+ node_original_id = Integer(xml_node.at_xpath('id').text.strip)
292
+ lookup_table[:nodes][node_original_id] = node.id
293
293
  end
294
294
 
295
295
  logger.info { 'Done.' }
@@ -326,7 +326,7 @@ module Dradis::Plugins::Projects::Upload::V1
326
326
  xml_node.xpath('notes/note').each do |xml_note|
327
327
 
328
328
  if xml_note.at_xpath('author') != nil
329
- old_id = xml_note.at_xpath('category-id').text.strip
329
+ old_id = Integer(xml_note.at_xpath('category-id').text.strip)
330
330
  new_id = lookup_table[:categories][old_id]
331
331
 
332
332
  created_at = xml_note.at_xpath('created-at')
@@ -370,7 +370,7 @@ module Dradis::Plugins::Projects::Upload::V1
370
370
  logger.info { "New tag detected: #{name}" }
371
371
 
372
372
  xml_tag.xpath('./taggings/tagging').each do |xml_tagging|
373
- old_taggable_id = xml_tagging.at_xpath('taggable-id').text()
373
+ old_taggable_id = Integer(xml_tagging.at_xpath('taggable-id').text())
374
374
  taggable_type = xml_tagging.at_xpath('taggable-type').text()
375
375
 
376
376
  new_taggable_id = case taggable_type
@@ -394,6 +394,18 @@ module Dradis::Plugins::Projects::Upload::V1
394
394
  end
395
395
  end
396
396
 
397
+ def update_attachment_references(string)
398
+ string.gsub(ATTACHMENT_URL) do |attachment|
399
+ node_id = lookup_table[:nodes][$2.to_i]
400
+ if node_id
401
+ "!%s/projects/%d/nodes/%d/attachments/%s!" % [$1, project.id, node_id, $3]
402
+ else
403
+ logger.error { "The attachment wasn't included in the package: #{attachment}" }
404
+ attachment
405
+ end
406
+ end
407
+ end
408
+
397
409
  def user_id_for_email(email)
398
410
  users[email] || @default_user_id
399
411
  end
@@ -94,7 +94,7 @@ module Dradis::Plugins::Projects::Upload::V3
94
94
  card = list.cards.create name: xml_card.at_xpath('name').text,
95
95
  description: xml_card.at_xpath('description').text,
96
96
  due_date: due_date,
97
- previous_id: xml_card.at_xpath('previous_id').text
97
+ previous_id: xml_card.at_xpath('previous_id').text&.to_i
98
98
 
99
99
  xml_card.xpath('activities/activity').each do |xml_activity|
100
100
  raise "Couldn't create activity for Card ##{card.id}" unless create_activity(card, xml_activity)
@@ -106,7 +106,8 @@ module Dradis::Plugins::Projects::Upload::V3
106
106
 
107
107
  raise "Couldn't create comments for Card ##{card.id}" unless create_comments(card, xml_card.xpath('comments/comment'))
108
108
 
109
- lookup_table[:cards][xml_card.at_xpath('id').text.to_i] = card.id
109
+ xml_id = Integer(xml_card.at_xpath('id').text)
110
+ lookup_table[:cards][xml_id] = card.id
110
111
  pending_changes[:cards] << card
111
112
  end
112
113
 
@@ -131,7 +132,7 @@ module Dradis::Plugins::Projects::Upload::V3
131
132
  xml_node_id = xml_board.at_xpath('node_id').try(:text)
132
133
  node_id =
133
134
  if xml_node_id.present?
134
- lookup_table[:nodes][xml_node_id]
135
+ lookup_table[:nodes][xml_node_id.to_i]
135
136
  else
136
137
  project.methodology_library.id
137
138
  end
@@ -143,9 +144,10 @@ module Dradis::Plugins::Projects::Upload::V3
143
144
 
144
145
  xml_board.xpath('./list').each do |xml_list|
145
146
  list = board.lists.create name: xml_list.at_xpath('name').text,
146
- previous_id: xml_list.at_xpath('previous_id').text
147
+ previous_id: xml_list.at_xpath('previous_id').text&.to_i
148
+ xml_id = Integer(xml_list.at_xpath('id').text)
147
149
 
148
- lookup_table[:lists][xml_list.at_xpath('id').text.to_i] = list.id
150
+ lookup_table[:lists][xml_id] = list.id
149
151
  pending_changes[:lists] << list
150
152
 
151
153
  xml_list.xpath('./card').each do |xml_card|
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <dradis-template version="1">
3
+ <nodes>
4
+ <node>
5
+ <id>../../../../../../tmp</id>
6
+ <label>Node 1</label>
7
+ <parent-id/>
8
+ <position>0</position>
9
+ <properties><![CDATA[{
10
+ }]]></properties>
11
+ <type-id>1</type-id>
12
+ </node>
13
+ </nodes>
14
+ </dradis-template>
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <dradis-template version="2">
3
+ <nodes><node><id>5</id><label>Uploaded files</label><parent-id/><position>0</position><properties><![CDATA[{}]]></properties><type-id>0</type-id><notes></notes><evidence></evidence><activities></activities></node></nodes>
4
+ <issues><issue><id>2</id><author>admin@securityroots.com</author><text><![CDATA[#[Title]#
5
+ Test Issue
6
+
7
+ #[Description]#
8
+ !/pro/projects/222/nodes/12345/attachments/hello.jpg!
9
+
10
+ ]]></text><activities></activities><comments></comments></issue></issues>
11
+ </dradis-template>
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails_helper'
2
4
 
3
5
  describe Dradis::Plugins::Projects::Upload::V1::Template::Importer do
4
-
5
6
  let(:project) { create(:project) }
6
7
  let(:user) { create(:user) }
7
8
  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
9
 
12
10
  context 'uploading a template with attachments url' do
11
+ let(:file_path) do
12
+ File.join(File.dirname(__FILE__), '../../../../../../', 'fixtures', 'files', 'attachments_url.xml')
13
+ end
14
+
13
15
  it 'converts the urls' do
14
16
  importer = importer_class::Importer.new(
15
17
  default_user_id: user.id,
@@ -30,4 +32,45 @@ describe Dradis::Plugins::Projects::Upload::V1::Template::Importer do
30
32
  )
31
33
  end
32
34
  end
35
+
36
+ context 'uploading a template malformed paths as ids' do
37
+ let(:file_path) do
38
+ File.join(File.dirname(__FILE__), '../../../../../../', 'fixtures', 'files', 'malformed_ids.xml')
39
+ end
40
+
41
+ it 'returns false' do
42
+ importer = importer_class::Importer.new(
43
+ default_user_id: user.id,
44
+ plugin: importer_class,
45
+ project_id: project.id
46
+ )
47
+
48
+ expect(importer.import(file: file_path)).to be false
49
+ end
50
+ end
51
+
52
+ context 'uploading a template with attachment but missing node' do
53
+ let(:file_path) do
54
+ File.join(File.dirname(__FILE__), '../../../../../../', 'fixtures', 'files', 'missing_node.xml')
55
+ end
56
+
57
+ it 'does not modify the attachment' do
58
+ logger = double('logger')
59
+ allow(logger).to receive_messages(debug: nil, error: nil, fatal: nil, info: nil)
60
+ expect(logger).to receive(:error).once
61
+
62
+ importer = importer_class::Importer.new(
63
+ default_user_id: user.id,
64
+ logger: logger,
65
+ plugin: importer_class,
66
+ project_id: project.id
67
+ )
68
+
69
+ importer.import(file: file_path)
70
+
71
+ expect(project.issues.first.text).to include(
72
+ "!/pro/projects/222/nodes/12345/attachments/hello.jpg!"
73
+ )
74
+ end
75
+ end
33
76
  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.22.0
4
+ version: 4.2.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: 2021-04-02 00:00:00.000000000 Z
11
+ date: 2022-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.6'
19
+ version: '2.2'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.6'
26
+ version: '2.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: combustion
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.7'
75
+ version: '4.0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '3.7'
82
+ version: '4.0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rubyzip
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -105,6 +105,7 @@ files:
105
105
  - ".gitignore"
106
106
  - ".ruby-version"
107
107
  - CHANGELOG.md
108
+ - CHANGELOG.template
108
109
  - CONTRIBUTING.md
109
110
  - Gemfile
110
111
  - LICENSE
@@ -133,6 +134,8 @@ files:
133
134
  - lib/dradis/plugins/projects/version.rb
134
135
  - lib/tasks/thorfile.rb
135
136
  - spec/fixtures/files/attachments_url.xml
137
+ - spec/fixtures/files/malformed_ids.xml
138
+ - spec/fixtures/files/missing_node.xml
136
139
  - spec/fixtures/files/with_comments.xml
137
140
  - spec/lib/dradis/plugins/projects/export/v2/template_spec.rb
138
141
  - spec/lib/dradis/plugins/projects/upload/v1/template_spec.rb
@@ -156,13 +159,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
159
  - !ruby/object:Gem::Version
157
160
  version: '0'
158
161
  requirements: []
159
- rubyforge_project:
160
- rubygems_version: 2.6.11
162
+ rubygems_version: 3.1.4
161
163
  signing_key:
162
164
  specification_version: 4
163
165
  summary: Project export/upload for the Dradis Framework.
164
166
  test_files:
165
167
  - spec/fixtures/files/attachments_url.xml
168
+ - spec/fixtures/files/malformed_ids.xml
169
+ - spec/fixtures/files/missing_node.xml
166
170
  - spec/fixtures/files/with_comments.xml
167
171
  - spec/lib/dradis/plugins/projects/export/v2/template_spec.rb
168
172
  - spec/lib/dradis/plugins/projects/upload/v1/template_spec.rb