dradis-html_export 3.3.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://secure.travis-ci.org/dradis/dradis-html_export.png?branch=master)](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
|