censu 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +13 -0
  3. data/.document +3 -0
  4. data/.gitignore +8 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +166 -0
  7. data/.travis.yml +12 -0
  8. data/.yardopts +1 -0
  9. data/ChangeLog.md +4 -0
  10. data/Gemfile +3 -0
  11. data/LICENSE.txt +7 -0
  12. data/README.md +76 -0
  13. data/Rakefile +21 -0
  14. data/censys.gemspec +28 -0
  15. data/lib/censys.rb +2 -0
  16. data/lib/censys/api.rb +254 -0
  17. data/lib/censys/autonomous_system.rb +43 -0
  18. data/lib/censys/certificate.rb +31 -0
  19. data/lib/censys/document.rb +48 -0
  20. data/lib/censys/document/has_asn.rb +16 -0
  21. data/lib/censys/document/has_location.rb +16 -0
  22. data/lib/censys/document/has_services.rb +21 -0
  23. data/lib/censys/exceptions.rb +16 -0
  24. data/lib/censys/ipv4.rb +26 -0
  25. data/lib/censys/location.rb +54 -0
  26. data/lib/censys/report.rb +1 -0
  27. data/lib/censys/report/metadata.rb +41 -0
  28. data/lib/censys/report/response.rb +54 -0
  29. data/lib/censys/search.rb +1 -0
  30. data/lib/censys/search/certificate.rb +19 -0
  31. data/lib/censys/search/ipv4.rb +18 -0
  32. data/lib/censys/search/metadata.rb +33 -0
  33. data/lib/censys/search/response.rb +124 -0
  34. data/lib/censys/search/result.rb +49 -0
  35. data/lib/censys/search/website.rb +18 -0
  36. data/lib/censys/version.rb +4 -0
  37. data/lib/censys/website.rb +30 -0
  38. data/spec/censys_spec.rb +8 -0
  39. data/spec/fixtures/vcr_cassettes/Censys_API/_report/certificates/should_return_certificate_response.yml +49 -0
  40. data/spec/fixtures/vcr_cassettes/Censys_API/_report/ipv4/should_return_ipv4_response.yml +52 -0
  41. data/spec/fixtures/vcr_cassettes/Censys_API/_report/websites/should_return_website_response.yml +49 -0
  42. data/spec/fixtures/vcr_cassettes/Censys_API/_search/certificates/should_return_Certificate_response.yml +397 -0
  43. data/spec/fixtures/vcr_cassettes/Censys_API/_search/ipv4/should_return_IPv4_response.yml +606 -0
  44. data/spec/fixtures/vcr_cassettes/Censys_API/_search/websites/should_return_Website_response.yml +112 -0
  45. data/spec/fixtures/vcr_cassettes/Censys_API/_view/certificates/should_return_Certificate_response.yml +143 -0
  46. data/spec/fixtures/vcr_cassettes/Censys_API/_view/ipv4/should_return_IPv4_response.yml +176 -0
  47. data/spec/fixtures/vcr_cassettes/Censys_API/_view/websites/should_return_Website_response.yml +1020 -0
  48. data/spec/report_spec.rb +60 -0
  49. data/spec/search_spec.rb +49 -0
  50. data/spec/spec_helper.rb +19 -0
  51. data/spec/view_spec.rb +48 -0
  52. metadata +219 -0
@@ -0,0 +1,43 @@
1
+ module Censys
2
+ class AutonomousSystem
3
+ # @return [String]
4
+ attr_reader :name
5
+
6
+ # @return [String]
7
+ attr_reader :rir
8
+
9
+ # @return [String]
10
+ attr_reader :routed_prefix
11
+
12
+ # @return [String]
13
+ attr_reader :country_code
14
+
15
+ # @return [Array<Integer>]
16
+ attr_reader :path
17
+
18
+ # @return [String]
19
+ attr_reader :organization
20
+
21
+ # @return [Integer]
22
+ attr_reader :asn
23
+
24
+ # @return [String]
25
+ attr_reader :description
26
+
27
+ #
28
+ # Initializes the Autonomous System (AS) information.
29
+ #
30
+ # @param [Hash{String => Object}] attributes
31
+ #
32
+ def initialize(attributes)
33
+ @name = attributes['name']
34
+ @rir = attributes['rir']
35
+ @routed_prefix = attributes['routed_prefix']
36
+ @country_code = attributes['country_code']
37
+ @path = attributes['path']
38
+ @organization = attributes['organization']
39
+ @asn = attributes['asn']
40
+ @description = attributes['description']
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,31 @@
1
+ require 'time'
2
+
3
+ module Censys
4
+ class Certificate < Document
5
+ #
6
+ # @return [String]
7
+ #
8
+ def raw
9
+ @attributes['raw']
10
+ end
11
+
12
+ #
13
+ # @return [Hash]
14
+ #
15
+ def parsed
16
+ @attributes['parsed']
17
+ end
18
+
19
+ #
20
+ # @return [Boolean]
21
+ #
22
+ def valid_nss
23
+ @attributes['validation']['nss']['valid']
24
+ end
25
+
26
+ # @return [Time]
27
+ def validation_timestamp
28
+ @validation_timestamp ||= Time.parse(@attributes['validation_timestamp'])
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,48 @@
1
+ module Censys
2
+ class Document
3
+ #
4
+ # Initializes the document.
5
+ #
6
+ # @param [Hash{String => Object}] attributes
7
+ #
8
+ def initialize(attributes)
9
+ @attributes = attributes
10
+ end
11
+
12
+ #
13
+ # Dig attributes
14
+ #
15
+ # @return [Object]
16
+ #
17
+ def dig(*keys)
18
+ @attributes.dig(*keys)
19
+ end
20
+
21
+ #
22
+ # Tags.
23
+ #
24
+ # @return [Array<String>]
25
+ #
26
+ def tags
27
+ @attributes['tags']
28
+ end
29
+
30
+ #
31
+ # Time last updated at.
32
+ #
33
+ # @return [Time]
34
+ #
35
+ def updated_at
36
+ @updated_at ||= Time.parse(@attributes['updated_at'])
37
+ end
38
+
39
+ #
40
+ # Additional document metadata.
41
+ #
42
+ # @return [Hash{String => Object}]
43
+ #
44
+ def metadata
45
+ @attributes['metadata']
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,16 @@
1
+ require 'censys/autonomous_system'
2
+
3
+ module Censys
4
+ class Document
5
+ module HasASN
6
+ #
7
+ # Autonomous System (AS) information.
8
+ #
9
+ # @return [AutonomousSystem]
10
+ #
11
+ def autonomous_system
12
+ @autonomous_system ||= AutonomousSystem.new(@attributes['autonomous_system'])
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require 'censys/location'
2
+
3
+ module Censys
4
+ class Document
5
+ module HasLocation
6
+ #
7
+ # Location information.
8
+ #
9
+ # @return [Location]
10
+ #
11
+ def location
12
+ @location ||= Location.new(@attributes['location'])
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ module Censys
2
+ class Document
3
+ module HasServices
4
+ #
5
+ # Open ports.
6
+ #
7
+ # @return [Hash{String => Hash}]
8
+ #
9
+ def ports
10
+ @ports ||= Hash[@attributes.select { |key, _| key =~ /\A\d+\z/ }]
11
+ end
12
+
13
+ #
14
+ # @return [Array<String>]
15
+ #
16
+ def protocols
17
+ @attributes['protocols']
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module Censys
2
+ class ResponseError < RuntimeError
3
+ end
4
+
5
+ class AuthenticationError < ResponseError
6
+ end
7
+
8
+ class NotFound < ResponseError
9
+ end
10
+
11
+ class RateLimited < ResponseError
12
+ end
13
+
14
+ class InternalServerError < ResponseError
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ require 'censys/document'
2
+ require 'censys/document/has_services'
3
+ require 'censys/document/has_location'
4
+ require 'censys/document/has_asn'
5
+
6
+ require 'time'
7
+
8
+ module Censys
9
+ class IPv4 < Document
10
+ include HasServices
11
+ include HasLocation
12
+ include HasASN
13
+
14
+ def ip
15
+ @attributes['ip']
16
+ end
17
+
18
+ def protocols
19
+ @protocols ||= Array(@attributes['protocols'])
20
+ end
21
+
22
+ def to_s
23
+ ip
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,54 @@
1
+ module Censys
2
+ class Location
3
+ # @return [String]
4
+ attr_reader :postal_code
5
+
6
+ # @return [String]
7
+ attr_reader :city
8
+
9
+ # @return [String]
10
+ attr_reader :province
11
+
12
+ # @return [String]
13
+ attr_reader :country
14
+
15
+ # @return [String]
16
+ attr_reader :continent
17
+
18
+ # @return [String]
19
+ attr_reader :registered_country
20
+
21
+ # @return [String]
22
+ attr_reader :registered_country_code
23
+
24
+ # @return [String]
25
+ attr_reader :timezone
26
+
27
+ # @return [Float]
28
+ attr_reader :latitude
29
+
30
+ # @return [Float]
31
+ attr_reader :longitude
32
+
33
+ #
34
+ # Initializes the location information.
35
+ #
36
+ # @param [Hash{String => Object}] attributes
37
+ #
38
+ def initialize(attributes)
39
+ @postal_code = attributes['postal_code']
40
+ @city = attributes['city']
41
+ @province = attributes['province']
42
+ @country = attributes['country']
43
+ @continent = attributes['continent']
44
+
45
+ @registered_country = attributes['registered_country']
46
+ @registered_country_code = attributes['registered_country_code']
47
+
48
+ @timezone = attributes['timezone']
49
+
50
+ @latitude = attributes['latitude']
51
+ @longitude = attributes['longitude']
52
+ end
53
+ end
54
+ end
@@ -0,0 +1 @@
1
+ require 'censys/report/response'
@@ -0,0 +1,41 @@
1
+ module Censys
2
+ module Report
3
+ class Metadata
4
+ # @return [Fixnum]
5
+ attr_reader :count
6
+
7
+ # @return [Fixnum]
8
+ attr_reader :backend_time
9
+
10
+ # @return [Fixnum]
11
+ attr_reader :non_null_count
12
+
13
+ # @return [Fixnum]
14
+ attr_reader :other_result_count
15
+
16
+ # @return [Fixnum]
17
+ attr_reader :buckets
18
+
19
+ # @return [Fixnum]
20
+ attr_reader :error_bound
21
+
22
+ # @return [String]
23
+ attr_reader :query
24
+
25
+ #
26
+ # Initializes the report metadata.
27
+ #
28
+ # @param [Hash{String => Object}] attributes
29
+ #
30
+ def initialize(attributes)
31
+ @count = attributes['count']
32
+ @backend_time = attributes['backend_time']
33
+ @non_null_count = attributes['nonnull_count']
34
+ @other_result_count = attributes['other_result_count']
35
+ @buckets = attributes['buckets']
36
+ @error_bound = attributes['error_bound']
37
+ @query = attributes['query']
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,54 @@
1
+ require 'censys/report/metadata'
2
+
3
+ module Censys
4
+ module Report
5
+ class Response
6
+ include Enumerable
7
+
8
+ # Response status.
9
+ #
10
+ # @return [String]
11
+ attr_reader :status
12
+
13
+ # Response results.
14
+ #
15
+ # @return [Hash{String => Fixnum}]
16
+ attr_reader :results
17
+
18
+ # Response metadata.
19
+ #
20
+ # @return [Metadata]
21
+ attr_reader :metadata
22
+
23
+ def initialize(response)
24
+ @status = response['status']
25
+ @results = Hash[response['results'].map { |result|
26
+ [result['key'], result['doc_count']]
27
+ }]
28
+ @metadata = Metadata.new(response['metadata'])
29
+ end
30
+
31
+ #
32
+ # Determines if the response was OK.
33
+ #
34
+ # @return [Boolean]
35
+ #
36
+ def ok?
37
+ @status == 'ok'
38
+ end
39
+
40
+ #
41
+ # Enumerate through all response results.
42
+ #
43
+ # @yield [key, doc_count]
44
+ #
45
+ # @yieldparam [String] key
46
+ #
47
+ # @yieldparam [Fixnum] doc_count
48
+ #
49
+ def each(&block)
50
+ @results.each(&block)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1 @@
1
+ require 'censys/search/response'
@@ -0,0 +1,19 @@
1
+ require 'censys/search/result'
2
+
3
+ module Censys
4
+ module Search
5
+ class Certificate < Result
6
+ def fingerprint_sha256
7
+ @attributes['parsed.fingerprint_sha256']
8
+ end
9
+
10
+ def subject_dn
11
+ @attributes['parsed.subject_dn']
12
+ end
13
+
14
+ def issuer_dn
15
+ @attributes['parsed.issuer_dn']
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ require 'censys/search/result'
2
+
3
+ module Censys
4
+ module Search
5
+ class IPv4 < Result
6
+ def ip
7
+ @attributes['ip']
8
+ end
9
+
10
+ def protocols
11
+ @attributes['protocols']
12
+ end
13
+
14
+ alias to_s ip
15
+ alias to_str ip
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,33 @@
1
+ module Censys
2
+ module Search
3
+ class Metadata
4
+ # @return [Integer]
5
+ attr_reader :count
6
+
7
+ # @return [String]
8
+ attr_reader :query
9
+
10
+ # @return [Integer]
11
+ attr_reader :backend_time
12
+
13
+ # @return [Integer]
14
+ attr_reader :page
15
+
16
+ # @return [Integer]
17
+ attr_reader :pages
18
+
19
+ #
20
+ # Initializes the search metadata.
21
+ #
22
+ # @param [Hash{String => Object}] metadata
23
+ #
24
+ def initialize(metadata)
25
+ @count = metadata['count']
26
+ @query = metadata['query']
27
+ @backend_time = metadata['backend_time']
28
+ @page = metadata['page']
29
+ @pages = metadata['pages']
30
+ end
31
+ end
32
+ end
33
+ end