jira_scan 0.0.3 → 0.0.4

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.
Files changed (4) hide show
  1. checksums.yaml +8 -8
  2. data/bin/jira-scan +17 -8
  3. data/lib/jira_scan.rb +36 -24
  4. metadata +31 -3
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- N2U3MTgzNjZlMDY0N2Q5MzJiMTJhYjFlZjA3ODg4Njg3YmNmYzVlOA==
4
+ YjNmYTk1OWYwM2VjNzJlZjVmZGFlZGIyNzdlYmUyOGE3Mzg0NTIxNg==
5
5
  data.tar.gz: !binary |-
6
- ZTBmYmNhMmQ0MDQ0MTdmY2Q4MWRiYzQ1MzUxMWNmOWJmNmQwZjljOQ==
6
+ NDA1MWUyMjE2ODIwODBhMThjYjU2ZWNlY2VhMjcxY2E0YWIyODYyZQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZTg1NzllMDk0MWNlNWRjZDEwNTcyMTc0YWJlMmMzYjUzYjk3ZjUzMjkyYWIw
10
- M2U2YmI5MjllMTEzNTc0NGE4YWVkMzE0Y2I2MzVkOWY3NDAyYjc1MTVkZjQ2
11
- YTJjMGZiYTcyYWFjMjRmZmI2YzdkMDAwMTVkMTVjYzRlODVmNDE=
9
+ MjliM2EyYWE0MzFjNDllMWMyOTljMDYyOGRkYTU3ZDc2NTk2MDc0ZTg0ODJi
10
+ Zjg3MTAwOGU5MjkzNmEzNmZkNGZkYWY4YTNhMDE3Mzg0YzEzNjVkOGUzMjMy
11
+ YTI1MGQ0NDg1NzA4Y2YzNjE3ODM0MWQ2NTJiOTk1NDUzZDI1ZmU=
12
12
  data.tar.gz: !binary |-
13
- NDc1ODc0MjIzMGY1YzlkMGYzMGY4Y2Q1ZmI3MDkwNjczNzI4ZDE5NDdhYmQ1
14
- NzgwMTZiOGU3N2Y3MGVkYTQxMGE1ODMxMTVkNTBjNTIwOTQxMjI2OTJkZTg0
15
- YmExYzZlOWFkNGUyODZkYTA0M2QwYWJhZTI1YmQwZGM5N2UxNmQ=
13
+ NDM2MTdiY2ViMzVlYmEwZTg5MTY4NGI0NWY0M2IwZmFjMGFjYmM5MzRhZmFi
14
+ NmYxYTkzYWE4ODAzNDYwNzNjZTNmNGE1OGM1OGJjMzAyZDYwYWRkMzg0NWRl
15
+ NzVmNTQ2NmY3NTNhZWQ3ODA0MWZhNDVjN2M0YzQ2OTQ5Y2M1MDg=
data/bin/jira-scan CHANGED
@@ -17,7 +17,7 @@ def banner
17
17
  _ | | | '__/ _` |\\___ \\ / __/ _` | '_ \\
18
18
  | |__| | | | | (_| |____) | (_| (_| | | | |
19
19
  \\____/|_|_| \\__,_|_____/ \\___\\__,_|_| |_|
20
- version 0.0.3"
20
+ version 0.0.4"
21
21
  puts
22
22
  puts '-' * 60
23
23
  end
@@ -55,16 +55,20 @@ end
55
55
 
56
56
  opts.parse!
57
57
 
58
- $VERBOSE = true unless options[:verbose].nil?
59
- @check = true unless options[:skip]
60
- @insecure = false unless options[:insecure]
61
-
62
58
  if options[:url].nil?
63
59
  puts opts
64
60
  exit(1)
65
61
  end
66
62
 
67
- def scan(url)
63
+ def scan(url, check: true, insecure: false, verbose: false)
64
+ JiraScan.logger = ::Logger.new($stdout).tap do |log|
65
+ log.progname = 'jira-scan'
66
+ log.level = verbose ? ::Logger::INFO : ::Logger::WARN
67
+ log.datetime_format = '%Y-%m-%d %H:%M:%S '
68
+ end
69
+
70
+ JiraScan.insecure = insecure
71
+
68
72
  puts "Scan started at #{Time.now.getutc}"
69
73
  puts "URL: #{url}"
70
74
 
@@ -89,7 +93,7 @@ def scan(url)
89
93
  puts '-' * 60
90
94
 
91
95
  # Check if the URL is Jira
92
- if @check
96
+ if check
93
97
  is_jira = JiraScan::detectJiraDashboard(url)
94
98
  is_jira = JiraScan::detectJiraLogin(url) unless is_jira
95
99
  unless is_jira
@@ -177,4 +181,9 @@ def scan(url)
177
181
  puts '-' * 60
178
182
  end
179
183
 
180
- scan(options[:url])
184
+ scan(
185
+ options[:url],
186
+ insecure: options[:insecure],
187
+ check: !options[:skip],
188
+ verbose: options[:verbose]
189
+ )
data/lib/jira_scan.rb CHANGED
@@ -6,11 +6,28 @@
6
6
  require 'uri'
7
7
  require 'cgi'
8
8
  require 'json'
9
+ require 'logger'
9
10
  require 'net/http'
10
11
  require 'openssl'
11
12
 
12
13
  class JiraScan
13
- VERSION = '0.0.3'.freeze
14
+ VERSION = '0.0.4'.freeze
15
+
16
+ def self.logger
17
+ @logger
18
+ end
19
+
20
+ def self.logger=(logger)
21
+ @logger = logger
22
+ end
23
+
24
+ def self.insecure
25
+ @insecure ||= false
26
+ end
27
+
28
+ def self.insecure=(insecure)
29
+ @insecure = insecure
30
+ end
14
31
 
15
32
  #
16
33
  # Check if URL is running Jira using Login page
@@ -64,12 +81,9 @@ class JiraScan
64
81
  build = res.body.to_s.scan(%r{<meta name="ajs-build-number" content="(\d+)">}).flatten.first
65
82
 
66
83
  unless version && build
67
- if res.body.to_s =~ /Version: ([\d\.]+)-#(\d+)/
68
- version = $1
69
- build = $2
70
- else
71
- return
72
- end
84
+ return unless res.body.to_s =~ /Version: ([\d\.]+)-#(\d+)/
85
+ version = Regexp.last_match(1)
86
+ build = Regexp.last_match(2)
73
87
  end
74
88
 
75
89
  "#{version}-##{build}"
@@ -93,12 +107,9 @@ class JiraScan
93
107
  build = res.body.to_s.scan(%r{<meta name="ajs-build-number" content="(\d+)">}).flatten.first
94
108
 
95
109
  unless version && build
96
- if res.body.to_s =~ /Version: ([\d\.]+)-#(\d+)/
97
- version = $1
98
- build = $2
99
- else
100
- return
101
- end
110
+ return unless res.body.to_s =~ /Version: ([\d\.]+)-#(\d+)/
111
+ version = Regexp.last_match(1)
112
+ build = Regexp.last_match(2)
102
113
  end
103
114
 
104
115
  "#{version}-##{build}"
@@ -292,7 +303,7 @@ class JiraScan
292
303
  return [] unless res.code.to_i == 200
293
304
  return [] unless res.body.to_s.start_with?('{"startAt"')
294
305
 
295
- JSON.parse(res.body.to_s, symbolize_names: true)[:dashboards].map {|d| [d[:id], d[:name]] }
306
+ JSON.parse(res.body.to_s, symbolize_names: true)[:dashboards].map { |d| [d[:id], d[:name]] }
296
307
  rescue
297
308
  []
298
309
  end
@@ -312,7 +323,7 @@ class JiraScan
312
323
  return [] unless res.code.to_i == 200
313
324
  return [] unless res.body.to_s.start_with?('{"searchers"')
314
325
 
315
- searchers = JSON.parse(res.body.to_s)["searchers"]
326
+ searchers = JSON.parse(res.body.to_s)['searchers']
316
327
  return [] if searchers.empty?
317
328
 
318
329
  groups = searchers['groups']
@@ -325,7 +336,7 @@ class JiraScan
325
336
  end
326
337
  end
327
338
 
328
- JSON.parse(field_names.to_json, symbolize_names: true).map {|f| [f[:name], f[:id], f[:key], f[:isShown].to_s, f[:lastViewed]] }
339
+ JSON.parse(field_names.to_json, symbolize_names: true).map { |f| [f[:name], f[:id], f[:key], f[:isShown].to_s, f[:lastViewed]] }
329
340
  rescue
330
341
  []
331
342
  end
@@ -345,7 +356,7 @@ class JiraScan
345
356
  return [] unless res.code.to_i == 200
346
357
  return [] unless res.body.to_s.start_with?('{"searchers"')
347
358
 
348
- searchers = JSON.parse(res.body.to_s)["searchers"]
359
+ searchers = JSON.parse(res.body.to_s)['searchers']
349
360
  return [] if searchers.empty?
350
361
 
351
362
  groups = searchers['groups']
@@ -358,13 +369,11 @@ class JiraScan
358
369
  end
359
370
  end
360
371
 
361
- JSON.parse(field_names.to_json, symbolize_names: true).map {|f| [f[:name], f[:id], f[:key], f[:isShown].to_s, f[:lastViewed]] }
372
+ JSON.parse(field_names.to_json, symbolize_names: true).map { |f| [f[:name], f[:id], f[:key], f[:isShown].to_s, f[:lastViewed]] }
362
373
  rescue
363
374
  []
364
375
  end
365
376
 
366
- private
367
-
368
377
  #
369
378
  # Fetch URL
370
379
  #
@@ -374,7 +383,8 @@ class JiraScan
374
383
  #
375
384
  def self.sendHttpRequest(url)
376
385
  target = URI.parse(url)
377
- puts "* Fetching #{target}" if $VERBOSE
386
+ @logger.info("Fetching #{target}")
387
+
378
388
  http = Net::HTTP.new(target.host, target.port)
379
389
  if target.scheme.to_s.eql?('https')
380
390
  http.use_ssl = true
@@ -394,11 +404,13 @@ class JiraScan
394
404
  res.body = gz.read
395
405
  end
396
406
  rescue Timeout::Error, Errno::ETIMEDOUT
397
- puts "- Error: Timeout retrieving #{target}" if $VERBOSE
407
+ @logger.error("Could not retrieve URL #{target}: Timeout")
408
+ return nil
398
409
  rescue => e
399
- puts "- Error: Could not retrieve URL #{target}\n#{e}" if $VERBOSE
410
+ @logger.error("Could not retrieve URL #{target}: #{e}")
411
+ return nil
400
412
  end
401
- puts "+ Received reply (#{res.body.length} bytes)" if $VERBOSE
413
+ @logger.info("Received reply (#{res.body.length} bytes)")
402
414
  res
403
415
  end
404
416
  end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jira_scan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brendan Coles
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-11 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-07-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: terminal-table
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: logger
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
13
41
  description: A simple remote scanner for Atlassian Jira
14
42
  email: bcoles@gmail.com
15
43
  executables: