pwn 0.5.391 → 0.5.392

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fbd0402cd8475fd231d37a5face9831c7f6e12151e76422201968eebf6f39180
4
- data.tar.gz: 50f372071410a7a0e741b3e938ef7f8e498f5e609b8074ec35d0d2fc8f5d03d9
3
+ metadata.gz: f5187c42fe3f9cc6cafcd3663179230111276cc2305f0c24ed1f7070be21c319
4
+ data.tar.gz: cf9d12113a23120d0e39ccc840cd23c77330829a7d51af3f2601504499b20468
5
5
  SHA512:
6
- metadata.gz: 033d363e5ff734f1f0c404a73d4f777acc529b3631e082be3fe5f6e33b76429199b2deef835d4c5ddc1b24b60a8477ebbdbe66278898ad33db8110ae94c9fc54
7
- data.tar.gz: b0d3d7c16af3a0d39441c639de42b9c09eeb492962a6289a967f7f8ce489a3bf519dc97e109ba0bb756655a7d88ff539998cc7f0d6dd5b6ce47603efac5bcda0
6
+ metadata.gz: 6605150902b9eb40072585b38674868a4ec507c1b938a4a9a8f63799e5bb4f959238dbeb66dbb4a1a1c2860e4a5ad1396edf59ac0ab130fb3d17eb11f0c115b3
7
+ data.tar.gz: 91e3fefae884f51df19571dac3f1bd0e3a767ecd6f335d39de9823554583f715bb2b05679e3fef45c70d62166c8aa56aab95cbe6a9f75d48b491f92f9b8e568b
data/Gemfile CHANGED
@@ -82,7 +82,7 @@ gem 'rmagick', '6.1.4'
82
82
  gem 'rqrcode', '3.1.0'
83
83
  gem 'rspec', '3.13.1'
84
84
  gem 'rtesseract', '3.1.4'
85
- gem 'rubocop', '1.80.1'
85
+ gem 'rubocop', '1.80.2'
86
86
  gem 'rubocop-rake', '0.7.1'
87
87
  gem 'rubocop-rspec', '3.7.0'
88
88
  gem 'ruby-audio', '1.6.1'
data/README.md CHANGED
@@ -37,7 +37,7 @@ $ cd /opt/pwn
37
37
  $ ./install.sh
38
38
  $ ./install.sh ruby-gem
39
39
  $ pwn
40
- pwn[v0.5.391]:001 >>> PWN.help
40
+ pwn[v0.5.392]:001 >>> PWN.help
41
41
  ```
42
42
 
43
43
  [![Installing the pwn Security Automation Framework](https://raw.githubusercontent.com/0dayInc/pwn/master/documentation/pwn_install.png)](https://youtu.be/G7iLUY4FzsI)
@@ -52,7 +52,7 @@ $ rvm use ruby-3.4.4@pwn
52
52
  $ gem uninstall --all --executables pwn
53
53
  $ gem install --verbose pwn
54
54
  $ pwn
55
- pwn[v0.5.391]:001 >>> PWN.help
55
+ pwn[v0.5.392]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
  If you're using a multi-user install of RVM do:
@@ -62,7 +62,7 @@ $ rvm use ruby-3.4.4@pwn
62
62
  $ rvmsudo gem uninstall --all --executables pwn
63
63
  $ rvmsudo gem install --verbose pwn
64
64
  $ pwn
65
- pwn[v0.5.391]:001 >>> PWN.help
65
+ pwn[v0.5.392]:001 >>> PWN.help
66
66
  ```
67
67
 
68
68
  PWN periodically upgrades to the latest version of Ruby which is reflected in `/opt/pwn/.ruby-version`. The easiest way to upgrade to the latest version of Ruby from a previous PWN installation is to run the following script:
@@ -0,0 +1,164 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cgi'
4
+ require 'json'
5
+ require 'tty-spinner'
6
+
7
+ module PWN
8
+ module Reports
9
+ # This plugin generates the HTML header and includes external JS/CSS libraries for PWN reports.
10
+ module HTMLFooter
11
+ # Supported Method Parameters::
12
+ # PWN::Reports::HTMLFooter.generate(
13
+ # column_names: 'required - array of column names to use in the report table',
14
+ # driver_src_uri: 'required - pwn driver source code uri',
15
+ # )
16
+
17
+ public_class_method def self.generate
18
+ %(
19
+ // Select All and Deselect All
20
+ function select_deselect_all() {
21
+ var visible_multi_line_trs = $('#pwn_results tbody tr:visible .multi_line_select tr');
22
+ var highlighted_in_visible = visible_multi_line_trs.filter('.highlighted');
23
+ if (highlighted_in_visible.length === visible_multi_line_trs.length) {
24
+ highlighted_in_visible.removeClass('highlighted');
25
+ } else {
26
+ visible_multi_line_trs.filter(':not(.highlighted)').addClass('highlighted');
27
+ }
28
+ }
29
+
30
+ function getExportData(table) {
31
+ return new Promise((resolve) => {
32
+ $.getJSON(table.ajax.url(), function(original_json) {
33
+ let new_data;
34
+ if ($('.multi_line_select tr.highlighted').length === 0) {
35
+ new_data = original_json.data;
36
+ } else {
37
+ var selected_results = {};
38
+
39
+ $('.multi_line_select tr.highlighted').each(function() {
40
+ var inner_tr = $(this);
41
+ var main_tr = inner_tr.closest('td').parent();
42
+ var row = table.row(main_tr);
43
+ var row_index = row.index();
44
+ var line_index = inner_tr.index();
45
+
46
+ if (selected_results[row_index] === undefined) {
47
+ selected_results[row_index] = {
48
+ row: row,
49
+ lines: []
50
+ };
51
+ }
52
+
53
+ selected_results[row_index].lines.push(line_index);
54
+ });
55
+
56
+ new_data = [];
57
+
58
+ Object.keys(selected_results).forEach(function(ri) {
59
+ var sel = selected_results[ri];
60
+ var orig_row_data = sel.row.data();
61
+ var new_row_data = JSON.parse(JSON.stringify(orig_row_data));
62
+
63
+ sel.lines.sort((a, b) => a - b);
64
+ new_row_data.line_no_and_contents = sel.lines.map(function(li) {
65
+ return orig_row_data.line_no_and_contents[li];
66
+ });
67
+
68
+ new_row_data.raw_content = new_row_data.line_no_and_contents.map(l => l.contents).join('\\n');
69
+
70
+ new_data.push(new_row_data);
71
+ });
72
+ }
73
+ resolve({data: new_data, report_name: original_json.report_name});
74
+ });
75
+ });
76
+ }
77
+
78
+ function export_json(table) {
79
+ if ($('.multi_line_select tr.highlighted').length === 0 && !confirm('No lines selected. Export all records?')) {
80
+ return;
81
+ }
82
+
83
+ getExportData(table).then(({data, report_name}) => {
84
+ var original_json = {report_name: report_name, data: data};
85
+
86
+ var json_str = JSON.stringify(original_json, null, 2);
87
+ var blob = new Blob([json_str], { type: 'application/json' });
88
+ var url = URL.createObjectURL(blob);
89
+ var a = document.createElement('a');
90
+ a.href = url;
91
+ a.download = report_name + '.json';
92
+ document.body.appendChild(a);
93
+ a.click();
94
+ document.body.removeChild(a);
95
+ URL.revokeObjectURL(url);
96
+ });
97
+ }
98
+
99
+ // Custom advanced search handling
100
+ $('#dt-search-0').unbind();
101
+ $('#dt-search-0').on('input', function() {
102
+ var table = $('#pwn_results').DataTable();
103
+ var searchTerm = this.value;
104
+ var isRegex = false;
105
+ var isSmart = true;
106
+ table.search(searchTerm, isRegex, isSmart).draw();
107
+ });
108
+
109
+ // Toggle Columns
110
+ $('a.toggle-vis').on('click', function (e) {
111
+ var table = $('#pwn_results').DataTable();
112
+ e.preventDefault();
113
+
114
+ // Get the column API object
115
+ var column = table.column( $(this).attr('data-column') );
116
+
117
+ // Toggle the visibility
118
+ column.visible( ! column.visible() );
119
+ });
120
+
121
+ // Row highlighting for multi-line selection
122
+ $('#pwn_results').on('click', '.multi_line_select tr', function () {
123
+ $(this).toggleClass('highlighted');
124
+ });
125
+
126
+ // Detect window size changes and recalculate/update scrollY
127
+ $(window).resize(function() {
128
+ var table = $('#pwn_results').DataTable();
129
+ var newWindowHeight = $(window).height();
130
+ var newScrollYHeight = Math.max(min_scroll_height, newWindowHeight - offset); // Your offset
131
+ $('.dt-scroll-body').css('max-height', newScrollYHeight + 'px')
132
+ table.columns.adjust().draw(false); // Adjust columns first, then redraw without data reload
133
+ console.log('Window resized. New scrollY height: ' + newScrollYHeight + 'px');
134
+ });
135
+ </script>
136
+ </body>
137
+ </html>
138
+ )
139
+ rescue StandardError => e
140
+ raise e
141
+ end
142
+
143
+ # Author(s):: 0day Inc. <support@0dayinc.com>
144
+
145
+ public_class_method def self.authors
146
+ "AUTHOR(S):
147
+ 0day Inc. <support@0dayinc.com>
148
+ "
149
+ end
150
+
151
+ # Display Usage for this Module
152
+
153
+ public_class_method def self.help
154
+ puts "USAGE:
155
+ #{self}.generate(
156
+ column_names: 'Array of Column Names to use in the report table',
157
+ driver_src_uri: 're
158
+
159
+ #{self}.authors
160
+ "
161
+ end
162
+ end
163
+ end
164
+ end
@@ -73,13 +73,6 @@ module PWN
73
73
  <!-- favicon.ico from https://0dayinc.com -->
74
74
  <link rel="icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABIXAAASFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAACJAgAAiSYAAIlbAACJcAAAiX0AAIlmAACJLQAAiQQAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAACJAAAAiS0AAIluAACJdwAAiXgAAIl+AACJeAAAiXQAAIk5AACJAQAAiQAAAAAAAAAAAAAAAAAAAAAAAACJAAAAiRgAAIlvAACJbQAAiXcAAIl7AACJcwAAiXEAAIl1AACJZwAAiR4AAIkAAACJAAAAAAAAAAAAAACJAAAAiQAAAIlEAACJfAAAiXIAAIlyAACJewAAiX4AAIl5AACJdQAAiXcAAIlIAACJAAAAiQAAAAAAAAAAAAAAiQAAAIkJAACJWQAAiXUAAIl9AACJdAAAiYYAAImLAACJdAAAiXkAAImNAACJfQAAiQwAAIkAAAAAAAAAAAAAAIkAAACJFQAAiWsAAIl2AACJfAAAiYIAAImCAACJfwAAiXYAAIl5AACJiQAAiYYAAIkWAACJAAAAAAAAAAAAAACJAAAAiSAAAIl2AACJeQAAiXkAAIl1AACJfwAAiYEAAIl8AACJbwAAiXoAAImBAACJFgAAiQAAAAAAAAAAAAAAiQAAAIkpAACJeAAAiXMAAIl3AACJeQAAiXUAAImAAACJfwAAiWYAAIl4AACJfwAAiR4AAIkAAAAAAAAAAAAAAIkAAACJKAAAiXkAAIlyAACJdQAAiXQAAIluAACJfAAAiXwAAIl3AACJewAAiXwAAIkvAACJAAAAAAAAAAAAAACJAAAAiSMAAIl4AACJdgAAiXsAAIl1AACJcQAAiXcAAIl6AACJeQAAiXoAAIl0AACJKQAAiQAAAAAAAAAAAAAAiQAAAIkXAACJaAAAiXgAAIl3AACJfAAAiXkAAIl3AACJZwAAiXcAAIl0AACJagAAiSgAAIkAAAAAAAAAAAAAAIkAAACJDgAAiV4AAIl5AACJbwAAiW4AAIl9AACJewAAiXcAAIl6AACJfQAAiW8AAIkWAACJAAAAAAAAAAAAAACJAAAAiQ0AAIllAACJewAAiXYAAIl4AACJdQAAiXUAAIl4AACJbQAAiXkAAIlNAACJAwAAiQAAAAAAAAAAAAAAiQAAAIkCAACJPQAAiXMAAIl2AACJeAAAiWgAAIlsAACJfQAAiXsAAIlwAACJGQAAiQAAAIkAAAAAAAAAAAAAAAAAAACJAAAAiQcAAIk4AACJXAAAiXoAAIl7AACJfAAAiYAAAIlsAACJJwAAiQMAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAACJAQAAiSsAAIluAACJewAAiXwAAIluAACJKgAAiQAAAIkAAAAAAAAAAAAAAAAA8A8AAPAHAADgBwAA4AcAAMADAADAAwAAwAMAAMADAADAAwAAwAMAAMADAADAAwAAwAMAAMAHAADgBwAA8B8AAA==" type="image/x-icon" />
75
75
  <style>
76
- body {
77
- font-family: Verdana, Geneva, sans-serif;
78
- font-size: 11px;
79
- background-color: #FFFFFF;
80
- color: #084B8A !important;
81
- }
82
-
83
76
  a:link {
84
77
  color: #0174DF;
85
78
  text-decoration: none;
@@ -100,15 +93,27 @@ module PWN
100
93
  text-decoration: underline;
101
94
  }
102
95
 
96
+ body {
97
+ font-family: Verdana, Geneva, sans-serif;
98
+ font-size: 11px;
99
+ background-color: #FFFFFF;
100
+ color: #084B8A !important;
101
+ margin: 3px 3px 3px 3px !important;
102
+ padding: 0px 0px 0px 0px !important;
103
+ overflow-y: hidden;
104
+ min-height: 100vh !important;
105
+ height: 100% !important;
106
+ }
107
+
103
108
  div.toggle_col_and_button_group {
104
109
  display: flex; /* Makes the container a flex container */
105
110
  justify-content: none; /* Aligns items along the main axis */
106
111
  align-items: flex-start; /* Aligns items to the start of the cross-axis */
107
112
  width: 1275px !important;
108
- }}
113
+ }
109
114
 
110
115
  div.cols_to_toggle {
111
- width: 300px !important;
116
+ width: 855px !important;
112
117
  text-align: left !important;
113
118
  vertical-align: middle !important;
114
119
  }
@@ -119,6 +124,8 @@ module PWN
119
124
  }
120
125
 
121
126
  div.dt-container {
127
+ min-height: 100vh !important;
128
+ height: 100% !important;
122
129
  width: 1275px !important;
123
130
  }
124
131
 
@@ -129,6 +136,7 @@ module PWN
129
136
  span.highlight {
130
137
  background-color: cyan !important;
131
138
  }
139
+
132
140
  table {
133
141
  width: 100%;
134
142
  border-spacing:0px;
@@ -226,6 +234,16 @@ module PWN
226
234
  <!-- DataTables <tbody> -->
227
235
  </table>
228
236
  </div>
237
+ <script>
238
+ var htmlEntityEncode = $.fn.dataTable.render.text().display;
239
+ var line_entry_uri = "";
240
+ var oldStart = 0;
241
+ var windowHeight = $(window).height();
242
+
243
+ // Calculate scrollY: Subtract an offset for non-table elements
244
+ var offset = 325;
245
+ var min_scroll_height = 50;
246
+ var scrollYHeight = Math.max(min_scroll_height, windowHeight - offset); // Ensure minimum of 600px
229
247
  )
230
248
  rescue StandardError => e
231
249
  raise e
@@ -139,18 +139,7 @@ module PWN
139
139
  driver_src_uri = 'https://github.com/0dayinc/pwn/blob/master/bin/pwn_sast'
140
140
 
141
141
  html_report = %(#{PWN::Reports::HTMLHeader.generate(column_names: column_names, driver_src_uri: driver_src_uri)}
142
- <script>
143
- var htmlEntityEncode = $.fn.dataTable.render.text().display;
144
-
145
- var line_entry_uri = "";
146
142
  $(document).ready(function() {
147
- var oldStart = 0;
148
- var windowHeight = $(window).height();
149
-
150
- // Calculate scrollY: Subtract an offset for non-table elements
151
- var offset = 400;
152
- var min_scroll_height = 100;
153
- var scrollYHeight = Math.max(min_scroll_height, windowHeight - offset); // Ensure minimum of 600px
154
143
  var table = $('#pwn_results').DataTable( {
155
144
  "order": [[2, 'asc']],
156
145
  "scrollY": scrollYHeight + "px",
@@ -310,7 +299,7 @@ module PWN
310
299
  {
311
300
  text: 'Export to JSON',
312
301
  action: function () {
313
- export_json();
302
+ export_json(table);
314
303
  }
315
304
  },
316
305
  {
@@ -332,151 +321,12 @@ module PWN
332
321
  }
333
322
  });
334
323
 
335
- $('#pwn_results tbody').on('click', '.multi_line_select tr', function () {
336
- $(this).toggleClass('highlighted');
337
- });
338
-
339
- // Dynamically create the smart toggle label and input
340
- var smartLabel = $('<label for="smart-toggle">Smart Search (e.g., "security !password")</label>');
341
- var smartInput = $('<input type="radio" id="smart-toggle" name="searchMode" value="" checked>');
342
- smartLabel.prepend(smartInput); // Prepend input inside label for proper association
343
-
344
- // Dynamically create the regex toggle label and input
345
- var regexLabel = $('<label for="regex-toggle">Regex Search (e.g., "^important.*$")</label>');
346
- var regexInput = $('<input type="radio" id="regex-toggle" name="searchMode" value="">');
347
- regexLabel.prepend(regexInput); // Prepend input inside label
348
-
349
- // Now relocate them as before (insert before the search input)
350
- smartLabel.insertBefore('#dt-search-0');
351
- regexLabel.insertBefore('#dt-search-0');
352
-
353
- // Style for inline display and spacing
354
- smartLabel.css({ display: 'inline-block', marginRight: '10px' });
355
- regexLabel.css({ display: 'inline-block', marginRight: '10px' });
356
-
357
- // Optional: Hide the default "Search:" label if not needed
358
- $('.dt-search label:first-of-type').hide();
359
-
360
- // Custom advanced search handling
361
- $('#dt-search-0').unbind();
362
- $('#dt-search-0').on('input', function() {
363
- var table = $('#pwn_results').DataTable();
364
- var searchTerm = this.value;
365
- var isRegex = $('#regex-toggle').prop('checked');
366
- var isSmart = $('#smart-toggle').prop('checked');
367
- table.search(searchTerm, isRegex, isSmart).draw();
368
- });
369
-
370
- // Additionally, reapply search on toggle changes (assuming radios exist in HTML)
371
- $('#regex-toggle, #smart-toggle').on('input', function() {
372
- var table = $('#pwn_results').DataTable();
373
- var searchTerm = this.value;
374
- var isRegex = $('#regex-toggle').prop('checked');
375
- var isSmart = $('#smart-toggle').prop('checked');
376
- table.search(searchTerm, isRegex, isSmart).draw();
377
- });
378
-
379
- // Toggle Columns
380
- $('a.toggle-vis').on('click', function (e) {
381
- e.preventDefault();
382
-
383
- // Get the column API object
384
- var column = table.column( $(this).attr('data-column') );
385
-
386
- // Toggle the visibility
387
- column.visible( ! column.visible() );
388
- });
389
-
390
- $('#debug_rows_selected').click( function () {
391
- alert($('.multi_line_select tr.highlighted').length +' row(s) highlighted');
392
- });
393
-
394
- // Select All and Deselect All
395
- function select_deselect_all() {
396
- var visible_multi_line_trs = $('#pwn_results tbody tr:visible .multi_line_select tr');
397
- var highlighted_in_visible = visible_multi_line_trs.filter('.highlighted');
398
- if (highlighted_in_visible.length === visible_multi_line_trs.length) {
399
- highlighted_in_visible.removeClass('highlighted');
400
- } else {
401
- visible_multi_line_trs.filter(':not(.highlighted)').addClass('highlighted');
402
- }
403
- }
404
-
405
- function getExportData() {
406
- return new Promise((resolve) => {
407
- $.getJSON(table.ajax.url(), function(original_json) {
408
- let new_data;
409
- if ($('.multi_line_select tr.highlighted').length === 0) {
410
- new_data = original_json.data;
411
- } else {
412
- var selected_results = {};
413
-
414
- $('.multi_line_select tr.highlighted').each(function() {
415
- var inner_tr = $(this);
416
- var main_tr = inner_tr.closest('td').parent();
417
- var row = table.row(main_tr);
418
- var row_index = row.index();
419
- var line_index = inner_tr.index();
420
-
421
- if (selected_results[row_index] === undefined) {
422
- selected_results[row_index] = {
423
- row: row,
424
- lines: []
425
- };
426
- }
427
-
428
- selected_results[row_index].lines.push(line_index);
429
- });
430
-
431
- new_data = [];
432
-
433
- Object.keys(selected_results).forEach(function(ri) {
434
- var sel = selected_results[ri];
435
- var orig_row_data = sel.row.data();
436
- var new_row_data = JSON.parse(JSON.stringify(orig_row_data));
437
-
438
- sel.lines.sort((a, b) => a - b);
439
- new_row_data.line_no_and_contents = sel.lines.map(function(li) {
440
- return orig_row_data.line_no_and_contents[li];
441
- });
442
-
443
- new_row_data.raw_content = new_row_data.line_no_and_contents.map(l => l.contents).join('\\n');
444
-
445
- new_data.push(new_row_data);
446
- });
447
- }
448
- resolve({data: new_data, report_name: original_json.report_name});
449
- });
450
- });
451
- }
452
-
453
- function export_json() {
454
- if ($('.multi_line_select tr.highlighted').length === 0 && !confirm('No lines selected. Export all records?')) {
455
- return;
456
- }
457
-
458
- getExportData().then(({data, report_name}) => {
459
- var original_json = {report_name: report_name, data: data};
460
-
461
- var json_str = JSON.stringify(original_json, null, 2);
462
- var blob = new Blob([json_str], { type: 'application/json' });
463
- var url = URL.createObjectURL(blob);
464
- var a = document.createElement('a');
465
- a.href = url;
466
- a.download = report_name + '.json';
467
- document.body.appendChild(a);
468
- a.click();
469
- document.body.removeChild(a);
470
- URL.revokeObjectURL(url);
471
- });
472
- }
473
-
474
324
  function export_xlsx_or_pdf(type) {
475
325
  if ($('.multi_line_select tr.highlighted').length === 0 && !confirm('No lines selected. Export all records?')) {
476
326
  return;
477
327
  }
478
328
 
479
- getExportData().then(({data, report_name}) => {
329
+ getExportData(table).then(({data, report_name}) => {
480
330
  // Flatten data for export
481
331
  var flatData = [];
482
332
  data.forEach(function(row) {
@@ -642,17 +492,8 @@ module PWN
642
492
  }
643
493
  });
644
494
  }
645
- // Detect window size changes and recalculate/update scrollY
646
- $(window).resize(function() {
647
- var newWindowHeight = $(window).height();
648
- var newScrollYHeight = Math.max(min_scroll_height, newWindowHeight - offset); // Your offset
649
- $('.dt-scroll-body').css('max-height', newScrollYHeight + 'px')
650
- table.columns.adjust().draw(false); // Adjust columns first, then redraw without data reload
651
- });
652
495
  });
653
- </script>
654
- </body>
655
- </html>
496
+ #{PWN::Reports::HTMLFooter.generate}
656
497
  )
657
498
 
658
499
  File.open("#{dir_path}/#{report_name}.html", 'w') do |f|
data/lib/pwn/reports.rb CHANGED
@@ -9,6 +9,7 @@ module PWN
9
9
  # autoload :JSON, 'pwn/reports/json'
10
10
  # autoload :PDF, 'pwn/reports/pdf'
11
11
  autoload :Fuzz, 'pwn/reports/fuzz'
12
+ autoload :HTMLFooter, 'pwn/reports/html_footer'
12
13
  autoload :HTMLHeader, 'pwn/reports/html_header'
13
14
  autoload :Phone, 'pwn/reports/phone'
14
15
  autoload :SAST, 'pwn/reports/sast'
data/lib/pwn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PWN
4
- VERSION = '0.5.391'
4
+ VERSION = '0.5.392'
5
5
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::Reports::HTMLFooter do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::Reports::HTMLFooter
8
+ expect(authors_response).to respond_to :authors
9
+ end
10
+
11
+ it 'should display information for existing help method' do
12
+ help_response = PWN::Reports::HTMLFooter
13
+ expect(help_response).to respond_to :help
14
+ end
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.391
4
+ version: 0.5.392
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
@@ -939,14 +939,14 @@ dependencies:
939
939
  requirements:
940
940
  - - '='
941
941
  - !ruby/object:Gem::Version
942
- version: 1.80.1
942
+ version: 1.80.2
943
943
  type: :runtime
944
944
  prerelease: false
945
945
  version_requirements: !ruby/object:Gem::Requirement
946
946
  requirements:
947
947
  - - '='
948
948
  - !ruby/object:Gem::Version
949
- version: 1.80.1
949
+ version: 1.80.2
950
950
  - !ruby/object:Gem::Dependency
951
951
  name: rubocop-rake
952
952
  requirement: !ruby/object:Gem::Requirement
@@ -1902,6 +1902,7 @@ files:
1902
1902
  - lib/pwn/plugins/xxd.rb
1903
1903
  - lib/pwn/reports.rb
1904
1904
  - lib/pwn/reports/fuzz.rb
1905
+ - lib/pwn/reports/html_footer.rb
1905
1906
  - lib/pwn/reports/html_header.rb
1906
1907
  - lib/pwn/reports/phone.rb
1907
1908
  - lib/pwn/reports/sast.rb
@@ -2245,6 +2246,7 @@ files:
2245
2246
  - spec/lib/pwn/plugins/xxd_spec.rb
2246
2247
  - spec/lib/pwn/plugins_spec.rb
2247
2248
  - spec/lib/pwn/reports/fuzz_spec.rb
2249
+ - spec/lib/pwn/reports/html_footer_spec.rb
2248
2250
  - spec/lib/pwn/reports/html_header_spec.rb
2249
2251
  - spec/lib/pwn/reports/phone_spec.rb
2250
2252
  - spec/lib/pwn/reports/sast_spec.rb