├── app ├── helpers │ └── contrast_helper.rb ├── views │ ├── contrast │ │ └── vote.html.erb │ └── settings │ │ └── _contrast_settings.html.erb └── controllers │ └── contrast_controller.rb ├── test ├── test_helper.rb └── functional │ └── contrast_controller_test.rb ├── config ├── routes.rb └── locales │ ├── ja.yml │ └── en.yml ├── LICENSE ├── init.rb ├── lib ├── journals_controller_patch.rb ├── journals_helper_patch.rb ├── settings_controller_patch.rb ├── contrast_payload_parser.rb ├── issues_controller_patch.rb ├── contrast_util.rb └── issue_hooks.rb ├── README.md └── db └── migrate └── 001_plugin_settings.rb /app/helpers/contrast_helper.rb: -------------------------------------------------------------------------------- 1 | module ContrastHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/views/contrast/vote.html.erb: -------------------------------------------------------------------------------- 1 |
| <%= l(:teamserver_url) %> | 6 |<%= text_field_tag('settings[teamserver_url]', @settings['teamserver_url'], {size:"65", placeholder:"https://teamserver-host/Contrast"})%> | 7 |
|---|---|
| <%= l(:org_id) %> | 10 |<%= text_field_tag('settings[org_id]', @settings['org_id'], {size:"65"})%> | 11 |
| <%= l(:api_key) %> | 14 |<%= text_field_tag('settings[api_key]', @settings['api_key'], {size:"65"})%> | 15 |
| <%= l(:username) %> | 18 |<%= text_field_tag('settings[username]', @settings['username'], {size:"65", placeholder:"Login ID(mail address)"})%> | 19 |
| 22 | | <%= l(:username_hint) %> | 23 |
| <%= l(:service_key) %> | 26 |<%= text_field_tag('settings[service_key]', @settings['service_key'], {size:"65"})%> | 27 |
| <%= l(:proxy_host) %> | 36 |<%= text_field_tag('settings[proxy_host]', @settings['proxy_host'], {size:"30"})%> | 37 |<%= l(:proxy_port) %> | 38 |<%= text_field_tag('settings[proxy_port]', @settings['proxy_port'], {size:"10"})%> | 39 |
|---|
| <%= l(:vul_issues) %> | 61 |<%= check_box_tag 'settings[vul_issues]', true, @settings['vul_issues'] %> | 62 |
|---|---|
| <%= l(:lib_issues) %> | 65 |<%= check_box_tag 'settings[lib_issues]', true, @settings['lib_issues'] %> | 66 |
| <%= l(:teamserver_side) %> | 75 |<%= l(:redmine_side) %> | 76 |77 | |
|---|---|---|
| <%= l(:sts_reported) %> | 82 |<%= text_field_tag('settings[sts_reported]', @settings['sts_reported'], {size:"25"})%> | 83 |<%= l(:sts_reported_ph) %> | 84 |
| <%= l(:sts_suspicious) %> | 87 |<%= text_field_tag('settings[sts_suspicious]', @settings['sts_suspicious'], {size:"25"})%> | 88 |<%= l(:sts_suspicious_ph) %> | 89 |
| <%= l(:sts_confirmed) %> | 92 |<%= text_field_tag('settings[sts_confirmed]', @settings['sts_confirmed'], {size:"25"})%> | 93 |<%= l(:sts_confirmed_ph) %> | 94 |
| <%= l(:sts_notaproblem) %> | 97 |<%= text_field_tag('settings[sts_notaproblem]', @settings['sts_notaproblem'], {size:"25"})%> | 98 |<%= l(:sts_notaproblem_ph) %> | 99 |
| <%= l(:sts_remediated) %> | 102 |<%= text_field_tag('settings[sts_remediated]', @settings['sts_remediated'], {size:"25"})%> | 103 |<%= l(:sts_remediated_ph) %> | 104 |
| <%= l(:sts_fixed) %> | 107 |<%= text_field_tag('settings[sts_fixed]', @settings['sts_fixed'], {size:"25"})%> | 108 |<%= l(:sts_fixed_ph) %> | 109 |
| <%= l(:teamserver_side) %> | 117 |<%= l(:redmine_side) %> | 118 |119 | |
|---|---|---|
| <%= l(:pri_critical) %> | 124 |<%= text_field_tag('settings[pri_critical]', @settings['pri_critical'], {size:"25"})%> | 125 |126 | |
| <%= l(:pri_high) %> | 129 |<%= text_field_tag('settings[pri_high]', @settings['pri_high'], {size:"25"})%> | 130 |131 | |
| <%= l(:pri_medium) %> | 134 |<%= text_field_tag('settings[pri_medium]', @settings['pri_medium'], {size:"25"})%> | 135 |136 | |
| <%= l(:pri_low) %> | 139 |<%= text_field_tag('settings[pri_low]', @settings['pri_low'], {size:"25"})%> | 140 |141 | |
| <%= l(:pri_note) %> | 144 |<%= text_field_tag('settings[pri_note]', @settings['pri_note'], {size:"25"})%> | 145 |146 | |
| <%= l(:pri_cvelib) %> | 149 |<%= text_field_tag('settings[pri_cvelib]', @settings['pri_cvelib'], {size:"25"})%> | 150 |<%= l(:pri_for_cvelib_ph) %> | 151 |
| <%= l(:vul_seen_datetime_format) %> | 160 |<%= text_field_tag('settings[vul_seen_dt_format]', @settings['vul_seen_dt_format'], {size:"30", placeholder:"%Y/%m/%d %H:%M"})%> | 161 |
|---|
').gsub(%r{{{/[A-Za-z]+Block}}}, '')
447 | # Header
448 | new_str = new_str.gsub(/{{#header}}/, 'h3. ').gsub(%r{{{/header}}}, "\n")
449 | # List
450 | new_str = new_str.gsub(/[ \t]*{{#listElement}}/, '* ').gsub(%r{{{/listElement}}}, '')
451 | # Table
452 | while true do
453 | tbl_bgn_idx = new_str.index('{{#table}}')
454 | tbl_end_idx = new_str.index('{{/table}}')
455 | if tbl_bgn_idx.nil? || tbl_end_idx.nil?
456 | break
457 | else
458 | # logger.info(sprintf('%s - %s', tbl_bgn_idx, tbl_end_idx))
459 | tbl_str = new_str.slice(tbl_bgn_idx, tbl_end_idx - tbl_bgn_idx + 10) # 10は{{/table}}の文字数
460 | tbl_str = tbl_str.gsub(/[ \t]*{{#tableRow}}[\s]*{{#tableHeaderRow}}/, '|').gsub(%r{{{/tableHeaderRow}}[\s]*}, '|')
461 | tbl_str = tbl_str.gsub(/[ \t]*{{#tableRow}}[\s]*{{#tableCell}}/, '|').gsub(%r{{{/tableCell}}[\s]*}, '|')
462 | tbl_str = tbl_str.gsub(/[ \t]*{{#badTableRow}}[\s]*{{#tableCell}}/, "\n|").gsub(%r{{{/tableCell}}[\s]*}, '|')
463 | tbl_str = tbl_str.gsub(/{{{nl}}}/, '