dradis-html_export 3.3.2
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 +7 -0
- data/.gitignore +18 -0
- data/.rspec +1 -0
- data/.travis.yml +11 -0
- data/CONTRIBUTING.md +3 -0
- data/Gemfile +6 -0
- data/README.md +23 -0
- data/Rakefile +1 -0
- data/app/controllers/dradis/plugins/html_export/base_controller.rb +27 -0
- data/config/routes.rb +3 -0
- data/dradis-html_export.gemspec +35 -0
- data/lib/dradis-html_export.rb +9 -0
- data/lib/dradis/plugins/html_export.rb +10 -0
- data/lib/dradis/plugins/html_export/engine.rb +43 -0
- data/lib/dradis/plugins/html_export/exporter.rb +72 -0
- data/lib/dradis/plugins/html_export/gem_version.rb +19 -0
- data/lib/dradis/plugins/html_export/version.rb +13 -0
- data/lib/tasks/thorfile.rb +51 -0
- data/spec/requests/html_export_spec.rb +7 -0
- data/spec/spec_helper.rb +39 -0
- data/templates/basic.html.erb +46 -0
- data/templates/default_dradis_template_v3.0.html.erb +146 -0
- metadata +109 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0a4b132909f61079e38b9bf5ce83fe9ed6aa8ed7
|
4
|
+
data.tar.gz: 01f9645ed98a79fcf73319cae03e173fed9afe02
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 91422579d5c34033623fb6354e2601d68e9a714ca717892d18a9f24a058bce767787dde8aba9538ea0ddef610ea98c7b1a889ded758922bd888ff92951784599
|
7
|
+
data.tar.gz: be3c3ac282cfff1459bedb06fd6e0b6ad610da695528f9e8d44f916cd0c20bddcc06906070ef543646502cea002847dabeb4cca64c211c34fbdcf406bda9e7d8
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
ADDED
data/CONTRIBUTING.md
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# HTML export plugin for the Dradis Framework
|
2
|
+
|
3
|
+
[](http://travis-ci.org/dradis/dradis-html_export)
|
4
|
+
|
5
|
+
|
6
|
+
This plugin generates an HTML report for the notes in your [Dradis Framework](https://github.com/dradis/dradisframework) repository.
|
7
|
+
|
8
|
+
The plugin requires Dradis 3.0 or higher.
|
9
|
+
|
10
|
+
|
11
|
+
## More information
|
12
|
+
|
13
|
+
See the Dradis Framework's [README.md](https://github.com/dradis/dradisframework/blob/master/README.md)
|
14
|
+
|
15
|
+
|
16
|
+
## Contributing
|
17
|
+
|
18
|
+
See the Dradis Framework's [CONTRIBUTING.md](https://github.com/dradis/dradisframework/blob/master/CONTRIBUTING.md)
|
19
|
+
|
20
|
+
|
21
|
+
## License
|
22
|
+
|
23
|
+
Dradis Framework and all its components are released under [GNU General Public License version 2.0](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html) as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Dradis
|
2
|
+
module Plugins
|
3
|
+
module HtmlExport
|
4
|
+
class BaseController < Dradis::Plugins::Export::BaseController
|
5
|
+
# This method cycles throw the notes in the reporting category and creates
|
6
|
+
# a simple HTML report with them.
|
7
|
+
#
|
8
|
+
# It uses the template at: ./vendor/plugins/html_export/template.html.erb
|
9
|
+
def index
|
10
|
+
|
11
|
+
# these come from Export#create
|
12
|
+
export_manager_hash = session[:export_manager].with_indifferent_access
|
13
|
+
content_service_class = export_manager_hash[:content_service].constantize
|
14
|
+
|
15
|
+
exporter = Dradis::Plugins::HtmlExport::Exporter.new(
|
16
|
+
content_service: content_service_class.new(plugin: Dradis::Plugins::HtmlExport)
|
17
|
+
)
|
18
|
+
|
19
|
+
doc = exporter.export(export_manager_hash)
|
20
|
+
|
21
|
+
render type: 'text/html', text: doc
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/dradis/plugins/html_export/version', __FILE__)
|
3
|
+
version = Dradis::Plugins::HtmlExport::version
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.platform = Gem::Platform::RUBY
|
7
|
+
spec.name = "dradis-html_export"
|
8
|
+
spec.version = version
|
9
|
+
spec.required_ruby_version = '>= 1.9.3'
|
10
|
+
spec.license = 'GPL-2'
|
11
|
+
|
12
|
+
spec.authors = ['Daniel Martin']
|
13
|
+
spec.email = ["<etd@nomejortu.com>"]
|
14
|
+
spec.description = %q{Export to HTML plugin for the Dradis Framework}
|
15
|
+
spec.summary = %q{Dradis HTML export plugin}
|
16
|
+
spec.homepage = 'http://dradisframework.org'
|
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
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
# gem.add_dependency 'dradis_core', version
|
24
|
+
spec.add_dependency 'dradis-plugins', '~> 3.3'
|
25
|
+
|
26
|
+
# Note markup
|
27
|
+
spec.add_dependency 'rails_autolink', '~> 1.1'
|
28
|
+
spec.add_dependency 'RedCloth', '4.2.9'
|
29
|
+
|
30
|
+
# gem.add_development_dependency 'capybara', '~> 1.1.3'
|
31
|
+
# gem.add_development_dependency 'database_cleaner'
|
32
|
+
# gem.add_development_dependency 'factory_girl_rails'
|
33
|
+
# gem.add_development_dependency 'rspec-rails', '~> 2.11.0'
|
34
|
+
# gem.add_development_dependency 'sqlite3'
|
35
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Dradis
|
2
|
+
module Plugins
|
3
|
+
module HtmlExport
|
4
|
+
class Engine < ::Rails::Engine
|
5
|
+
|
6
|
+
# Standard Rails Engine stuff
|
7
|
+
isolate_namespace Dradis::Plugins::HtmlExport
|
8
|
+
engine_name 'dradis_html_export'
|
9
|
+
|
10
|
+
# use rspec for tests
|
11
|
+
config.generators do |g|
|
12
|
+
g.test_framework :rspec
|
13
|
+
end
|
14
|
+
|
15
|
+
# Connect to the Framework
|
16
|
+
include Dradis::Plugins::Base
|
17
|
+
|
18
|
+
# plugin_name 'HTML export'
|
19
|
+
provides :export
|
20
|
+
description 'Generate advanced HTML reports'
|
21
|
+
|
22
|
+
|
23
|
+
initializer 'dradis-html_export.mount_engine' do
|
24
|
+
Rails.application.routes.append do
|
25
|
+
mount Dradis::Plugins::HtmlExport::Engine => '/export/html'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# # TODO: could we use this instead?
|
30
|
+
# # https://github.com/spree/spree_analytics/blob/079949fd0e6d9ec87eefd8e3b9c70b5aa3bf25d3/lib/spree_analytics/engine.rb
|
31
|
+
# # Configuration
|
32
|
+
# # mattr_accessor :app_id, :site_id, :token, :api_url, :data_url
|
33
|
+
# # self.template = ''
|
34
|
+
# class Configuration < Dradis::Core::Configurator
|
35
|
+
# configure :namespace => 'htmlexport'
|
36
|
+
# setting :category, :default => 'HtmlExport ready'
|
37
|
+
# # setting :template, :default => Rails.root.join( 'vendor', 'plugins', 'html_export', 'template.html.erb' )
|
38
|
+
# setting :template, :default => '/Users/etd/dradis/git/dradis-html_export/template.html.erb'
|
39
|
+
# end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Dradis
|
2
|
+
module Plugins
|
3
|
+
module HtmlExport
|
4
|
+
|
5
|
+
class Exporter < Dradis::Plugins::Export::Base
|
6
|
+
# Add auto_link support to the ERB processor (see rails_autolink)
|
7
|
+
include ::ActionView::Helpers::TextHelper
|
8
|
+
# For auto_link feature (requires #mail_to)
|
9
|
+
include ::ActionView::Helpers::UrlHelper
|
10
|
+
|
11
|
+
def export(args = {})
|
12
|
+
template_path = args.fetch(:template)
|
13
|
+
template_properties = ::ReportTemplateProperties.find_by_template_file(File.basename(template_path)) rescue nil
|
14
|
+
project = args.key?(:project_id) ? Project.find_by_id(args[:project_id]) : nil
|
15
|
+
|
16
|
+
# Build title
|
17
|
+
title = if Dradis.constants.include?(:Pro)
|
18
|
+
"Dradis Professional Edition v#{Dradis::Pro.version}"
|
19
|
+
else
|
20
|
+
"Dradis Community Edition v#{Dradis::CE.version}"
|
21
|
+
end
|
22
|
+
logger.debug{ "Report title: #{title}"}
|
23
|
+
|
24
|
+
# Prepare notes
|
25
|
+
notes = content_service.all_notes
|
26
|
+
logger.debug{ "Found #{notes.count} notes assigned to the reporting category."}
|
27
|
+
|
28
|
+
# Prepare issues
|
29
|
+
issues = content_service.all_issues
|
30
|
+
if issues
|
31
|
+
# Sort our issues based on the ReportTemplateProperties rules.
|
32
|
+
if template_properties && template_properties.sort_field
|
33
|
+
sort_by = template_properties.sort_field
|
34
|
+
|
35
|
+
logger.debug{ "Template properties define a sort field: #{sort_by}. Sorting..." }
|
36
|
+
|
37
|
+
# FIXME: Assume the Field :type is :number, so cast .to_f and sort
|
38
|
+
issues.sort! do |a, b|
|
39
|
+
b.fields.fetch(sort_by, '0').to_f <=> a.fields.fetch(sort_by, '0').to_f
|
40
|
+
end
|
41
|
+
|
42
|
+
logger.debug{ "Done." }
|
43
|
+
end
|
44
|
+
|
45
|
+
# FIXME: This is an ugly piece of code
|
46
|
+
nodes = issues.map(&:evidence).map(&:node).uniq rescue []
|
47
|
+
|
48
|
+
logger.debug{ "Found #{issues.count} issues affecting #{nodes.count} nodes" }
|
49
|
+
else
|
50
|
+
logger.warning { "No issue library node found in this project" }
|
51
|
+
end
|
52
|
+
|
53
|
+
# Render template
|
54
|
+
erb = ERB.new( File.read(template_path) )
|
55
|
+
erb.result( binding )
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def markup(text)
|
60
|
+
return unless text.present?
|
61
|
+
|
62
|
+
output = text.dup
|
63
|
+
Hash[ *text.scan(/#\[(.+?)\]#[\r|\n](.*?)(?=#\[|\z)/m).flatten.collect{ |str| str.strip } ].keys.each do |field|
|
64
|
+
output.gsub!(/#\[#{Regexp.escape(field)}\]#[\r|\n]/, "h4. #{field}\n\n")
|
65
|
+
end
|
66
|
+
|
67
|
+
auto_link(RedCloth.new(output, [:filter_html, :no_span_caps]).to_html, sanitize: false ).html_safe
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Dradis
|
2
|
+
module Plugins
|
3
|
+
module HtmlExport
|
4
|
+
# Returns the version of the currently loaded Frontend as a <tt>Gem::Version</tt>
|
5
|
+
def self.gem_version
|
6
|
+
Gem::Version.new VERSION::STRING
|
7
|
+
end
|
8
|
+
|
9
|
+
module VERSION
|
10
|
+
MAJOR = 3
|
11
|
+
MINOR = 3
|
12
|
+
TINY = 2
|
13
|
+
PRE = nil
|
14
|
+
|
15
|
+
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class HtmlExportTasks < Thor
|
2
|
+
include Dradis::Plugins::thor_helper_module.to_s.constantize
|
3
|
+
|
4
|
+
namespace "dradis:plugins:html"
|
5
|
+
|
6
|
+
desc 'export', 'export the current repository structure as an HTML document'
|
7
|
+
method_option :output, required: false, type: :string, desc: "the report file to create (if ends in .html), or directory to create it in"
|
8
|
+
method_option :template, required: true, type: :string, desc: "the template file to use. If not provided the value of the 'advanced_word_export:docx' setting will be used."
|
9
|
+
|
10
|
+
def export
|
11
|
+
require 'config/environment'
|
12
|
+
|
13
|
+
# The options we'll end up passing to the Processor class
|
14
|
+
opts = {}
|
15
|
+
|
16
|
+
STDOUT.sync = true
|
17
|
+
logger = Logger.new(STDOUT)
|
18
|
+
logger.level = Logger::DEBUG
|
19
|
+
opts[:logger] = logger
|
20
|
+
content_service = nil
|
21
|
+
|
22
|
+
report_path = options.output || Rails.root
|
23
|
+
unless report_path.to_s =~ /\.html\z/
|
24
|
+
date = DateTime.now.strftime("%Y-%m-%d")
|
25
|
+
sequence = Dir.glob(File.join(report_path, "dradis-report_#{date}_*.html")).collect { |a| a.match(/_([0-9]+)\.html\z/)[1].to_i }.max || 0
|
26
|
+
report_path = File.join(report_path, "dradis-report_#{date}_#{sequence + 1}.html")
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
if template = options.template
|
31
|
+
shell.error("Template file doesn't exist") && exit(1) unless File.exists?(template)
|
32
|
+
opts[:template] = template
|
33
|
+
end
|
34
|
+
|
35
|
+
detect_and_set_project_scope
|
36
|
+
exporter = Dradis::Plugins::HtmlExport::Exporter.new(
|
37
|
+
content_service: Dradis::Plugins::ContentService.new(plugin: Dradis::Plugins::HtmlExport)
|
38
|
+
)
|
39
|
+
|
40
|
+
doc = exporter.export(opts)
|
41
|
+
|
42
|
+
File.open(report_path, 'w') do |f|
|
43
|
+
f << doc
|
44
|
+
end
|
45
|
+
|
46
|
+
logger.info{ "Report file created at:\n\t#{report_path}" }
|
47
|
+
logger.close
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Configure Rails Envinronment
|
2
|
+
ENV["RAILS_ENV"] ||= 'test'
|
3
|
+
require File.expand_path("../dummy/config/environment", __FILE__)
|
4
|
+
|
5
|
+
require 'rspec/rails'
|
6
|
+
|
7
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
8
|
+
# in spec/support/ and its subdirectories.
|
9
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
10
|
+
|
11
|
+
require 'database_cleaner'
|
12
|
+
require 'factory_girl_rails'
|
13
|
+
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
|
17
|
+
# Capybara javascript drivers require transactional fixtures set to false,
|
18
|
+
# and we just use DatabaseCleaner to cleanup after each test instead.
|
19
|
+
# Without transactional fixtures set to false none of the records created to
|
20
|
+
# setup a test will be available to the browser, which runs under a seperate
|
21
|
+
# server instance.
|
22
|
+
config.use_transactional_fixtures = false
|
23
|
+
|
24
|
+
config.before(:each) do
|
25
|
+
if example.metadata[:js]
|
26
|
+
DatabaseCleaner.strategy = :truncation
|
27
|
+
else
|
28
|
+
DatabaseCleaner.strategy = :transaction
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
config.before(:each) do
|
33
|
+
DatabaseCleaner.start
|
34
|
+
end
|
35
|
+
|
36
|
+
config.after(:each) do
|
37
|
+
DatabaseCleaner.clean
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<title><%= title %></title>
|
6
|
+
<style type="text/css">
|
7
|
+
html{color:#000;background:#FFF}
|
8
|
+
body,div,ul,ol,li,h1,h2,h3{margin:0;padding:0}
|
9
|
+
li{list-style:none;}
|
10
|
+
h1,h2,h3{font-size:100%;font-weight:bold;}
|
11
|
+
|
12
|
+
body{padding:10px; font-family: "trebuchet ms", helvetica, sans-serif;}
|
13
|
+
h1{border-bottom: 1px solid #CCC; margin:2ex 0; font-size: 120%; font-weight: bold; }
|
14
|
+
h2{text-align:center;}
|
15
|
+
li{margin-left: 40px;}
|
16
|
+
ul{list-style-type: square;}
|
17
|
+
ol{list-style-type: decimal;}
|
18
|
+
ul, ol{margin-bottom: 2ex;}
|
19
|
+
.note{border-bottom: 1px solid #ddd; margin-bottom: 10px; padding-bottom: 10px;}
|
20
|
+
#footer{border-top: 1px solid #ccc;text-align: right;padding-right: 69px;min-height: 64px;height: auto !important;height: 64px;background: url('../images/logo_tiny.png') 100% 50% no-repeat;}
|
21
|
+
</style>
|
22
|
+
</head>
|
23
|
+
<body>
|
24
|
+
<h1><%= title %></h1>
|
25
|
+
|
26
|
+
<section>
|
27
|
+
<h2>Issues</h2>
|
28
|
+
<% issues.each do |issue| %>
|
29
|
+
<div class="note"><%= markup(issue.text) %></div>
|
30
|
+
<% end %>
|
31
|
+
</section>
|
32
|
+
|
33
|
+
<section>
|
34
|
+
<h2>Notes assigned to the <%= reporting_cat.name %> category</h2>
|
35
|
+
<% notes.each do |note| %>
|
36
|
+
<div class="note"><%= markup(note.text) %></div>
|
37
|
+
<% end %>
|
38
|
+
</section>
|
39
|
+
|
40
|
+
<div id="footer">
|
41
|
+
<br/>
|
42
|
+
effective collaboration<br/>
|
43
|
+
<a href="http://dradisframework.org">http://dradisframework.org</a>
|
44
|
+
</div>
|
45
|
+
</body>
|
46
|
+
</html>
|
@@ -0,0 +1,146 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
7
|
+
|
8
|
+
<title><%= title %></title>
|
9
|
+
<style type="text/css">
|
10
|
+
/* Sticky footer styles
|
11
|
+
/* See:
|
12
|
+
/* http://getbootstrap.com/examples/sticky-footer/
|
13
|
+
-------------------------------------------------- */
|
14
|
+
html {
|
15
|
+
position: relative;
|
16
|
+
min-height: 100%;
|
17
|
+
}
|
18
|
+
body {
|
19
|
+
/* Margin bottom by footer height */
|
20
|
+
margin-bottom: 60px;
|
21
|
+
padding-bottom: 60px;
|
22
|
+
}
|
23
|
+
#footer {
|
24
|
+
position: absolute;
|
25
|
+
bottom: 0;
|
26
|
+
width: 100%;
|
27
|
+
/* Set the fixed height of the footer here */
|
28
|
+
height: 60px;
|
29
|
+
background-color: #f5f5f5;
|
30
|
+
}
|
31
|
+
|
32
|
+
|
33
|
+
/* Custom page CSS
|
34
|
+
-------------------------------------------------- */
|
35
|
+
/* Not required for template or sticky footer method. */
|
36
|
+
|
37
|
+
.container {
|
38
|
+
padding: 0 15px;
|
39
|
+
}
|
40
|
+
.container .text-muted {
|
41
|
+
margin: 20px 0;
|
42
|
+
}
|
43
|
+
#footer2{border-top: 1px solid #ccc;text-align: right;padding-right: 69px;min-height: 64px;height: auto !important;height: 64px;background: url('/assets/logopro_tiny.png') 100% 50% no-repeat;}
|
44
|
+
</style>
|
45
|
+
|
46
|
+
<!-- Latest compiled and minified CSS -->
|
47
|
+
<!-- <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"> -->
|
48
|
+
<link rel="stylesheet" href="/assets//bootstrap.css">
|
49
|
+
|
50
|
+
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
51
|
+
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
52
|
+
<!--[if lt IE 9]>
|
53
|
+
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
54
|
+
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
|
55
|
+
<![endif]-->
|
56
|
+
</head>
|
57
|
+
<body>
|
58
|
+
<noscript>
|
59
|
+
<div class="alert alert-danger">
|
60
|
+
<p><strong>Warning</strong>: this report template loads jQuery and Bootstrap JS files from their CDNs, but JavaScript seems to be disabled.</p>
|
61
|
+
</div>
|
62
|
+
</noscript>
|
63
|
+
|
64
|
+
<div class="container">
|
65
|
+
|
66
|
+
<h1><%= title %></h1>
|
67
|
+
|
68
|
+
<h2>Project notes</h2>
|
69
|
+
<p class="lead">In this section you'll find any notes assigned to the <strong>Report category</strong>.</p>
|
70
|
+
<% notes.each do |note| %>
|
71
|
+
<div class="panel panel-default">
|
72
|
+
<div class="panel-body">
|
73
|
+
<%= markup(note.text) %>
|
74
|
+
</div>
|
75
|
+
</div>
|
76
|
+
<% end %>
|
77
|
+
|
78
|
+
|
79
|
+
<h2>Project issues</h2>
|
80
|
+
<p class="lead">In this section you'll find your project's Issues.</p>
|
81
|
+
<% issues.each do |issue| %>
|
82
|
+
<div class="panel panel-default">
|
83
|
+
<div class="panel-body">
|
84
|
+
<%= markup(issue.text) %>
|
85
|
+
|
86
|
+
<h3>Assets affected by this issue</h3>
|
87
|
+
<% if issue.affected.empty? %>
|
88
|
+
<p class="well">None so far.</p>
|
89
|
+
<% else %>
|
90
|
+
<div class="row">
|
91
|
+
<div class="col-md-3 evidence-sidebar">
|
92
|
+
<ul class="nav nav-list evidence-sidenav">
|
93
|
+
<% issue.evidence_by_node.each do |node, instances| %>
|
94
|
+
<li><a href="#evidence_for_<%= node.id %>"><i class="glyphicon glyphicon-<%= ['folder-close','hdd'][node.type_id] %>"></i> <%= node.label %> (<%= pluralize instances.count, 'instance' %>)</a></li>
|
95
|
+
<% end %>
|
96
|
+
</ul>
|
97
|
+
</div>
|
98
|
+
|
99
|
+
<div class="col-md-9">
|
100
|
+
<% issue.evidence_by_node.each do |node, instances| %>
|
101
|
+
<section id="evidence_for_#{node.id}">
|
102
|
+
<% if instances.count == 1 %>
|
103
|
+
<div class="content-textile" id="node_<%= node.id %>_instance_0">
|
104
|
+
<%= markup(instances.first.content) %>
|
105
|
+
</div>
|
106
|
+
<% else %>
|
107
|
+
<ul class="nav nav-tabs">
|
108
|
+
<% instances.each_with_index do |evidence, i| %>
|
109
|
+
<li class="<%= 'active' if i==0 %>"><a href="#node_<%= node.id %>_instance_<%= i %>" data-toggle="tab">Instance <%= i %></a></li>
|
110
|
+
<% end %>
|
111
|
+
</ul>
|
112
|
+
|
113
|
+
<div class="tab-content">
|
114
|
+
<% instances.each_with_index do |evidence, i| %>
|
115
|
+
<div class="content-textile tab-pane<%= ' active' if i==0 %>" id="node_<%= node.id %>_instance_<%= i %>">
|
116
|
+
<%= markup(evidence.content) %>
|
117
|
+
</div>
|
118
|
+
<% end %>
|
119
|
+
</div>
|
120
|
+
<% end %>
|
121
|
+
|
122
|
+
</section>
|
123
|
+
<% end %>
|
124
|
+
</div>
|
125
|
+
</div>
|
126
|
+
<% end %>
|
127
|
+
</div>
|
128
|
+
</div>
|
129
|
+
<% end %>
|
130
|
+
|
131
|
+
</div>
|
132
|
+
|
133
|
+
<div id="footer">
|
134
|
+
<div class="container">
|
135
|
+
<p class="text-muted text-center"><%= title%> - <a href="http://dradisframework.org">http://dradisframework.org</a></p>
|
136
|
+
</div>
|
137
|
+
</div>
|
138
|
+
|
139
|
+
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
|
140
|
+
<!-- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> -->
|
141
|
+
<script src="/assets/jquery.js"></script>
|
142
|
+
<!-- Include all compiled plugins (below), or include individual files as needed -->
|
143
|
+
<!-- <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script> -->
|
144
|
+
<script src="/assets/bootstrap.js"></script>
|
145
|
+
</body>
|
146
|
+
</html>
|
metadata
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dradis-html_export
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.3.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Daniel Martin
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-06-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dradis-plugins
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rails_autolink
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: RedCloth
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 4.2.9
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 4.2.9
|
55
|
+
description: Export to HTML plugin for the Dradis Framework
|
56
|
+
email:
|
57
|
+
- "<etd@nomejortu.com>"
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- ".travis.yml"
|
65
|
+
- CONTRIBUTING.md
|
66
|
+
- Gemfile
|
67
|
+
- README.md
|
68
|
+
- Rakefile
|
69
|
+
- app/controllers/dradis/plugins/html_export/base_controller.rb
|
70
|
+
- config/routes.rb
|
71
|
+
- dradis-html_export.gemspec
|
72
|
+
- lib/dradis-html_export.rb
|
73
|
+
- lib/dradis/plugins/html_export.rb
|
74
|
+
- lib/dradis/plugins/html_export/engine.rb
|
75
|
+
- lib/dradis/plugins/html_export/exporter.rb
|
76
|
+
- lib/dradis/plugins/html_export/gem_version.rb
|
77
|
+
- lib/dradis/plugins/html_export/version.rb
|
78
|
+
- lib/tasks/thorfile.rb
|
79
|
+
- spec/requests/html_export_spec.rb
|
80
|
+
- spec/spec_helper.rb
|
81
|
+
- templates/basic.html.erb
|
82
|
+
- templates/default_dradis_template_v3.0.html.erb
|
83
|
+
homepage: http://dradisframework.org
|
84
|
+
licenses:
|
85
|
+
- GPL-2
|
86
|
+
metadata: {}
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 1.9.3
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 2.2.3
|
104
|
+
signing_key:
|
105
|
+
specification_version: 4
|
106
|
+
summary: Dradis HTML export plugin
|
107
|
+
test_files:
|
108
|
+
- spec/requests/html_export_spec.rb
|
109
|
+
- spec/spec_helper.rb
|