Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Import export issue states #50

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@ Gemfile.lock

# Gem artifacts
/pkg/

.DS_Store
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## Dradis Framework 3.17 (XXX, 2020) ##

* Extend project upload/import to handle issue states.

## Dradis Framework 3.16 (February, 2020) ##

* No changes
Expand Down
1 change: 1 addition & 0 deletions lib/dradis/plugins/projects/export/v1/template.rb
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ def build_issues(builder)
issues_builder.issue do |issue_builder|
issue_builder.id(issue.id)
issue_builder.author(issue.author)
issue_builder.state(issue.state)
issue_builder.text do
issue_builder.cdata!(issue.text)
end
Expand Down
2 changes: 1 addition & 1 deletion lib/dradis/plugins/projects/gem_version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def self.gem_version

module VERSION
MAJOR = 3
MINOR = 16
MINOR = 17
TINY = 0
PRE = nil

Expand Down
14 changes: 14 additions & 0 deletions lib/dradis/plugins/projects/upload/v1/template.rb
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,20 @@ def create_issue(issue, xml_issue)
issue.node = project.issue_library
issue.category = Category.issue

if xml_issue.at_xpath('state')
state = xml_issue.at_xpath('state').text
issue.state =
if Issue.states.keys.include?(state)
state
else
logger.info { "Invalid issue state detected. Using default issue state: #{default_issue_state} instead." }
default_issue_state
end
else
issue.state = default_issue_state
logger.info { "No issue state detected in template. Using default issue state: #{default_issue_state} instead." }
end

return false unless validate_and_save(issue)

return false unless create_activities(issue, xml_issue)
Expand Down
59 changes: 59 additions & 0 deletions spec/fixtures/files/with_invalid_states.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?><dradis-template version="3"><nodes><node><id>3</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><issues><issue><id>10</id><author>admin@securityroots.com</author><state>invalidstate</state><text><![CDATA[#[Title]#
Issue state 1

#[CVSSv3.BaseScore]#
3.0

#[CVSSv3Vector]#
test

#[Type]#
Internal

#[Description]#
Multiple

#[Solution]#
Hello World

#[References]#
]]></text><activities><activity><action>create</action><user_email>admin@securityroots.com</user_email><created_at>1587458407</created_at></activity></activities><comments></comments></issue><issue><id>11</id><author>admin@securityroots.com</author><state>invalidstate</state><text><![CDATA[#[Title]#
Issue State 2

#[CVSSv3.BaseScore]#
3.0

#[CVSSv3Vector]#
test

#[Type]#
Internal

#[Description]#
Multiple

#[Solution]#
Hello World

#[References]#
]]></text><activities><activity><action>create</action><user_email>admin@securityroots.com</user_email><created_at>1587458419</created_at></activity></activities><comments></comments></issue><issue><id>12</id><author>admin@securityroots.com</author><state>invalidstate</state><text><![CDATA[#[Title]#
Issue State 0

#[CVSSv3.BaseScore]#
3.0

#[CVSSv3Vector]#
test

#[Type]#
Internal

#[Description]#
Multiple

#[Solution]#
Hello World

#[References]#
]]></text><activities><activity><action>create</action><user_email>admin@securityroots.com</user_email><created_at>1587458430</created_at></activity></activities><comments></comments></issue></issues><methodologies></methodologies><categories><category><id>1</id><name>Issue description</name></category></categories><tags></tags></dradis-template>
59 changes: 59 additions & 0 deletions spec/fixtures/files/with_states.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?><dradis-template version="3"><nodes><node><id>3</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><issues><issue><id>10</id><author>admin@securityroots.com</author><state>review</state><text><![CDATA[#[Title]#
Issue state 1

#[CVSSv3.BaseScore]#
3.0

#[CVSSv3Vector]#
test

#[Type]#
Internal

#[Description]#
Multiple

#[Solution]#
Hello World

#[References]#
]]></text><activities><activity><action>create</action><user_email>admin@securityroots.com</user_email><created_at>1587458407</created_at></activity></activities><comments></comments></issue><issue><id>11</id><author>admin@securityroots.com</author><state>draft</state><text><![CDATA[#[Title]#
Issue State 2

#[CVSSv3.BaseScore]#
3.0

#[CVSSv3Vector]#
test

#[Type]#
Internal

#[Description]#
Multiple

#[Solution]#
Hello World

#[References]#
]]></text><activities><activity><action>create</action><user_email>admin@securityroots.com</user_email><created_at>1587458419</created_at></activity></activities><comments></comments></issue><issue><id>12</id><author>admin@securityroots.com</author><state>published</state><text><![CDATA[#[Title]#
Issue State 0

#[CVSSv3.BaseScore]#
3.0

#[CVSSv3Vector]#
test

#[Type]#
Internal

#[Description]#
Multiple

#[Solution]#
Hello World

#[References]#
]]></text><activities><activity><action>create</action><user_email>admin@securityroots.com</user_email><created_at>1587458430</created_at></activity></activities><comments></comments></issue></issues><methodologies></methodologies><categories><category><id>1</id><name>Issue description</name></category></categories><tags></tags></dradis-template>
59 changes: 59 additions & 0 deletions spec/fixtures/files/without_states.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?><dradis-template version="3"><nodes><node><id>3</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><issues><issue><id>10</id><author>admin@securityroots.com</author><text><![CDATA[#[Title]#
Issue state 1

#[CVSSv3.BaseScore]#
3.0

#[CVSSv3Vector]#
test

#[Type]#
Internal

#[Description]#
Multiple

#[Solution]#
Hello World

#[References]#
]]></text><activities><activity><action>create</action><user_email>admin@securityroots.com</user_email><created_at>1587458407</created_at></activity></activities><comments></comments></issue><issue><id>11</id><author>admin@securityroots.com</author><text><![CDATA[#[Title]#
Issue State 2

#[CVSSv3.BaseScore]#
3.0

#[CVSSv3Vector]#
test

#[Type]#
Internal

#[Description]#
Multiple

#[Solution]#
Hello World

#[References]#
]]></text><activities><activity><action>create</action><user_email>admin@securityroots.com</user_email><created_at>1587458419</created_at></activity></activities><comments></comments></issue><issue><id>12</id><author>admin@securityroots.com</author><text><![CDATA[#[Title]#
Issue State 0

#[CVSSv3.BaseScore]#
3.0

#[CVSSv3Vector]#
test

#[Type]#
Internal

#[Description]#
Multiple

#[Solution]#
Hello World

#[References]#
]]></text><activities><activity><action>create</action><user_email>admin@securityroots.com</user_email><created_at>1587458430</created_at></activity></activities><comments></comments></issue></issues><methodologies></methodologies><categories><category><id>1</id><name>Issue description</name></category></categories><tags></tags></dradis-template>
27 changes: 27 additions & 0 deletions spec/lib/dradis/plugins/projects/export/v1/template_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
require 'rails_helper'

# To run, execute from Dradis main app folder:
# bin/rspec [dradis-projects path]/<file_path>

describe Dradis::Plugins::Projects::Export::V2::Template do
let(:project) { create(:project) }
let(:user) { create(:user) }
let(:export) do
described_class.new(
default_user_id: user.id,
plugin: Dradis::Plugins::Projects,
project_id: project.id
).export
end

context 'exporting a project' do
before do
node = create(:node, project: project)
@issue = create(:issue, text: 'Issue 1', node: project.issue_library, state: 'review')
end

it 'exports the states of the issues' do
expect(export).to include("<state>#{@issue.state}</state>")
end
end
end
63 changes: 54 additions & 9 deletions spec/lib/dradis/plugins/projects/upload/v1/template_spec.rb
Original file line number Diff line number Diff line change
@@ -1,22 +1,28 @@
require 'rails_helper'

# To run, execute from Dradis main app folder:
# bin/rspec [dradis-projects path]/<file_path>

describe Dradis::Plugins::Projects::Upload::V1::Template::Importer do

let(:project) { create(:project) }
let(:user) { create(:user) }
let(:importer_class) { Dradis::Plugins::Projects::Upload::Template }
let(:file_path) {
File.join(File.dirname(__FILE__), '../../../../../../', 'fixtures', 'files', 'attachments_url.xml')
}
let(:importer) do
importer_class::Importer.new(
state: :published,
default_user_id: user.id,
plugin: importer_class,
project_id: project.id
)
end

context 'uploading a template with attachments url' do
it 'converts the urls' do
importer = importer_class::Importer.new(
default_user_id: user.id,
plugin: importer_class,
project_id: project.id
)
let(:file_path) {
File.join(File.dirname(__FILE__), '../../../../../../', 'fixtures', 'files', 'attachments_url.xml')
}

it 'converts the urls' do
importer.import(file: file_path)

p_id = project.id
Expand All @@ -30,4 +36,43 @@
)
end
end

describe 'issue states' do

context 'template without states' do
let(:file_path) {
File.join(File.dirname(__FILE__), '../../../../../../', 'fixtures', 'files', 'without_states.xml')
}

it 'uploads the issues with the published state' do
importer.import(file: file_path)

expect(project.issues.pluck(:state)).to match_array(['published', 'published', 'published'])
end
end

context 'template with states' do
let(:file_path) {
File.join(File.dirname(__FILE__), '../../../../../../', 'fixtures', 'files', 'with_states.xml')
}

it 'uploads the issues with the states' do
importer.import(file: file_path)

expect(project.issues.pluck(:state)).to match_array(['draft', 'review', 'published'])
end
end

context 'template with invalid states' do
let(:file_path) {
File.join(File.dirname(__FILE__), '../../../../../../', 'fixtures', 'files', 'with_invalid_states.xml')
}

it 'uploads the issues with the states' do
importer.import(file: file_path)

expect(project.issues.pluck(:state)).to match_array(['published', 'published', 'published'])
end
end
end
end