ronin-db-activerecord 0.1.0.beta1

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 (135) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.github/workflows/ruby.yml +31 -0
  4. data/.gitignore +13 -0
  5. data/.rspec +1 -0
  6. data/.ruby-version +1 -0
  7. data/.yardopts +1 -0
  8. data/COPYING.txt +165 -0
  9. data/ChangeLog.md +39 -0
  10. data/Gemfile +27 -0
  11. data/README.md +143 -0
  12. data/Rakefile +72 -0
  13. data/db/migrate/0001_create_ronin_ip_address_mac_addresses_table.rb +43 -0
  14. data/db/migrate/0002_create_ronin_vulnerabilities_table.rb +61 -0
  15. data/db/migrate/0003_create_ronin_url_schemes_table.rb +32 -0
  16. data/db/migrate/0004_create_ronin_url_query_param_names_table.rb +32 -0
  17. data/db/migrate/0005_create_ronin_user_names_table.rb +33 -0
  18. data/db/migrate/0006_create_ronin_software_vendors_table.rb +32 -0
  19. data/db/migrate/0007_create_ronin_advisories_table.rb +42 -0
  20. data/db/migrate/0008_create_ronin_host_name_ip_addresses_table.rb +43 -0
  21. data/db/migrate/0009_create_ronin_host_names_table.rb +34 -0
  22. data/db/migrate/0010_create_ronin_arches_table.rb +37 -0
  23. data/db/migrate/0011_create_ronin_email_addresses_table.rb +44 -0
  24. data/db/migrate/0012_create_ronin_oses_table.rb +36 -0
  25. data/db/migrate/0013_create_ronin_organizations_table.rb +31 -0
  26. data/db/migrate/0014_create_ronin_ip_addresses_table.rb +35 -0
  27. data/db/migrate/0015_create_ronin_os_guesses_table.rb +40 -0
  28. data/db/migrate/0016_create_ronin_url_query_params_table.rb +42 -0
  29. data/db/migrate/0017_create_ronin_passwords_table.rb +32 -0
  30. data/db/migrate/0018_create_ronin_open_ports_table.rb +46 -0
  31. data/db/migrate/0019_create_ronin_urls_table.rb +50 -0
  32. data/db/migrate/0020_create_ronin_softwares_table.rb +39 -0
  33. data/db/migrate/0021_create_ronin_mac_addresses_table.rb +33 -0
  34. data/db/migrate/0022_create_ronin_countries_table.rb +34 -0
  35. data/db/migrate/0023_create_ronin_services_table.rb +32 -0
  36. data/db/migrate/0024_create_ronin_credentials_table.rb +44 -0
  37. data/db/migrate/0025_create_ronin_ports_table.rb +33 -0
  38. data/db/migrate/0026_create_ronin_asns_table.rb +44 -0
  39. data/db/migrate/0027_create_ronin_http_query_param_names_table.rb +32 -0
  40. data/db/migrate/0028_create_ronin_http_query_params_table.rb +42 -0
  41. data/db/migrate/0029_create_ronin_http_header_names_table.rb +31 -0
  42. data/db/migrate/0030_create_ronin_http_request_headers_table.rb +41 -0
  43. data/db/migrate/0031_create_ronin_http_response_headers_table.rb +41 -0
  44. data/db/migrate/0032_create_ronin_http_requests_table.rb +41 -0
  45. data/db/migrate/0033_create_ronin_http_responses_table.rb +36 -0
  46. data/db/migrate/0034_create_ronin_service_credentials_table.rb +41 -0
  47. data/db/migrate/0035_create_ronin_web_credentials_table.rb +41 -0
  48. data/gemspec.yml +28 -0
  49. data/lib/ronin/db/address.rb +105 -0
  50. data/lib/ronin/db/advisory.rb +169 -0
  51. data/lib/ronin/db/arch.rb +160 -0
  52. data/lib/ronin/db/asn.rb +212 -0
  53. data/lib/ronin/db/credential.rb +248 -0
  54. data/lib/ronin/db/email_address.rb +225 -0
  55. data/lib/ronin/db/host_name.rb +224 -0
  56. data/lib/ronin/db/host_name_ip_address.rb +65 -0
  57. data/lib/ronin/db/http_header_name.rb +75 -0
  58. data/lib/ronin/db/http_query_param.rb +79 -0
  59. data/lib/ronin/db/http_query_param_name.rb +76 -0
  60. data/lib/ronin/db/http_request.rb +120 -0
  61. data/lib/ronin/db/http_request_header.rb +78 -0
  62. data/lib/ronin/db/http_response.rb +91 -0
  63. data/lib/ronin/db/http_response_header.rb +78 -0
  64. data/lib/ronin/db/ip_address.rb +351 -0
  65. data/lib/ronin/db/ip_address_mac_address.rb +62 -0
  66. data/lib/ronin/db/mac_address.rb +91 -0
  67. data/lib/ronin/db/migrations.rb +137 -0
  68. data/lib/ronin/db/model/has_name.rb +102 -0
  69. data/lib/ronin/db/model/has_unique_name.rb +82 -0
  70. data/lib/ronin/db/model/importable.rb +85 -0
  71. data/lib/ronin/db/model/last_scanned_at.rb +48 -0
  72. data/lib/ronin/db/model.rb +37 -0
  73. data/lib/ronin/db/models.rb +108 -0
  74. data/lib/ronin/db/open_port.rb +148 -0
  75. data/lib/ronin/db/organization.rb +50 -0
  76. data/lib/ronin/db/os.rb +183 -0
  77. data/lib/ronin/db/os_guess.rb +67 -0
  78. data/lib/ronin/db/password.rb +167 -0
  79. data/lib/ronin/db/port.rb +123 -0
  80. data/lib/ronin/db/root.rb +28 -0
  81. data/lib/ronin/db/schema_migration.rb +34 -0
  82. data/lib/ronin/db/service.rb +48 -0
  83. data/lib/ronin/db/service_credential.rb +66 -0
  84. data/lib/ronin/db/software.rb +85 -0
  85. data/lib/ronin/db/software_vendor.rb +42 -0
  86. data/lib/ronin/db/url.rb +497 -0
  87. data/lib/ronin/db/url_query_param.rb +79 -0
  88. data/lib/ronin/db/url_query_param_name.rb +76 -0
  89. data/lib/ronin/db/url_scheme.rb +80 -0
  90. data/lib/ronin/db/user_name.rb +96 -0
  91. data/lib/ronin/db/vulnerability.rb +81 -0
  92. data/lib/ronin/db/web_credential.rb +69 -0
  93. data/ronin-db-activerecord.gemspec +61 -0
  94. data/spec/advisory_spec.rb +277 -0
  95. data/spec/arch_spec.rb +228 -0
  96. data/spec/asn_spec.rb +504 -0
  97. data/spec/credential_spec.rb +362 -0
  98. data/spec/email_address_spec.rb +372 -0
  99. data/spec/host_name_ip_address_spec.rb +8 -0
  100. data/spec/host_name_spec.rb +207 -0
  101. data/spec/http_header_name_spec.rb +25 -0
  102. data/spec/http_query_param_name_spec.rb +25 -0
  103. data/spec/http_query_param_spec.rb +104 -0
  104. data/spec/http_request_header_spec.rb +72 -0
  105. data/spec/http_request_spec.rb +168 -0
  106. data/spec/http_response_header_spec.rb +74 -0
  107. data/spec/http_response_spec.rb +103 -0
  108. data/spec/ip_address_mac_addresses_spec.rb +8 -0
  109. data/spec/ip_address_spec.rb +386 -0
  110. data/spec/mac_address_spec.rb +67 -0
  111. data/spec/migrations_spec.rb +122 -0
  112. data/spec/model/has_name_spec.rb +65 -0
  113. data/spec/model/has_unique_name_spec.rb +61 -0
  114. data/spec/model/importable_spec.rb +105 -0
  115. data/spec/models_spec.rb +60 -0
  116. data/spec/open_port_spec.rb +87 -0
  117. data/spec/organization_spec.rb +10 -0
  118. data/spec/os_guess_spec.rb +43 -0
  119. data/spec/os_spec.rb +114 -0
  120. data/spec/password_spec.rb +81 -0
  121. data/spec/port_spec.rb +102 -0
  122. data/spec/schema_migration_spec.rb +8 -0
  123. data/spec/service_credential_spec.rb +43 -0
  124. data/spec/service_spec.rb +39 -0
  125. data/spec/software_spec.rb +76 -0
  126. data/spec/software_vendor_spec.rb +33 -0
  127. data/spec/spec_helper.rb +13 -0
  128. data/spec/url_query_param_name_spec.rb +25 -0
  129. data/spec/url_query_param_spec.rb +110 -0
  130. data/spec/url_scheme_spec.rb +39 -0
  131. data/spec/url_spec.rb +951 -0
  132. data/spec/user_name_spec.rb +54 -0
  133. data/spec/vulnerability_spec.rb +8 -0
  134. data/spec/web_credential_spec.rb +72 -0
  135. metadata +266 -0
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+ require 'ronin/db/software'
3
+
4
+ describe Ronin::DB::Software do
5
+ it "must use the 'ronin_softwares' table" do
6
+ expect(described_class.table_name).to eq('ronin_softwares')
7
+ end
8
+
9
+ let(:name) { 'Test' }
10
+ let(:version) { '0.1.0' }
11
+ let(:vendor) { 'TestCo' }
12
+
13
+ describe "validations" do
14
+ describe "nmae" do
15
+ it "must require name attribute" do
16
+ software = described_class.new(version: version)
17
+ expect(software).to_not be_valid
18
+ expect(software.errors[:name]).to eq(
19
+ ["can't be blank"]
20
+ )
21
+
22
+ software = described_class.new(name: name, version: version)
23
+ expect(software).to be_valid
24
+ end
25
+ end
26
+
27
+ describe "version" do
28
+ it "should require version attribute" do
29
+ software = described_class.new(name: name)
30
+ expect(software).to_not be_valid
31
+ expect(software.errors[:version]).to eq(
32
+ ["can't be blank"]
33
+ )
34
+
35
+ software = described_class.new(name: name, version: version)
36
+ expect(software).to be_valid
37
+ end
38
+ end
39
+
40
+ it "the name and version attributes must be unique" do
41
+ described_class.create(name: name, version: version)
42
+
43
+ software = described_class.new(name: name, version: version)
44
+ expect(software).to_not be_valid
45
+ expect(software.errors[:version]).to eq(
46
+ ['has already been taken']
47
+ )
48
+
49
+ described_class.destroy_all
50
+ end
51
+ end
52
+
53
+ subject do
54
+ described_class.new(
55
+ name: name,
56
+ version: version,
57
+ vendor: Ronin::DB::SoftwareVendor.new(name: vendor)
58
+ )
59
+ end
60
+
61
+ describe "#to_s" do
62
+ it "should be convertable to a String" do
63
+ expect(subject.to_s).to eq("#{vendor} #{name} #{version}")
64
+ end
65
+
66
+ context "without a vendor" do
67
+ subject do
68
+ described_class.new(name: name, version: version)
69
+ end
70
+
71
+ it "should ignore the missing vendor information" do
72
+ expect(subject.to_s).to eq("#{name} #{version}")
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require 'ronin/db/software_vendor'
3
+
4
+ describe Ronin::DB::SoftwareVendor do
5
+ it "must use the 'ronin_software_vendors' table" do
6
+ expect(described_class.table_name).to eq('ronin_software_vendors')
7
+ end
8
+
9
+ let(:name) { 'TestCo' }
10
+
11
+ describe "validations" do
12
+ describe "name" do
13
+ it "should require name attribute" do
14
+ software_vendor = described_class.new
15
+ expect(software_vendor).to_not be_valid
16
+ expect(software_vendor.errors[:name]).to eq(
17
+ ["can't be blank"]
18
+ )
19
+
20
+ software_vendor = described_class.new(name: name)
21
+ expect(software_vendor).to be_valid
22
+ end
23
+ end
24
+ end
25
+
26
+ subject { described_class.new(name: name) }
27
+
28
+ describe "#to_s" do
29
+ it "should include the vendor name" do
30
+ expect(subject.to_s).to eq(name)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,13 @@
1
+ require 'rspec'
2
+
3
+ require 'active_record'
4
+ ActiveRecord::Base.establish_connection(
5
+ adapter: 'sqlite3',
6
+ database: ':memory:'
7
+ )
8
+
9
+ require 'ronin/db/migrations'
10
+ Ronin::DB::Migrations.migrate
11
+
12
+ require 'simplecov'
13
+ SimpleCov.start
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+ require 'ronin/db/url_query_param_name'
3
+
4
+ describe Ronin::DB::URLQueryParamName do
5
+ it "must use the 'ronin_url_query_param_names' table" do
6
+ expect(described_class.table_name).to eq('ronin_url_query_param_names')
7
+ end
8
+
9
+ let(:name) { 'foo' }
10
+
11
+ describe "validations" do
12
+ describe "name" do
13
+ it "should require name attribute" do
14
+ url_query_param_name = described_class.new
15
+ expect(url_query_param_name).to_not be_valid
16
+ expect(url_query_param_name.errors[:name]).to eq(
17
+ ["can't be blank"]
18
+ )
19
+
20
+ url_query_param_name = described_class.new(name: name)
21
+ expect(url_query_param_name).to be_valid
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+ require 'ronin/db/url_query_param'
3
+
4
+ describe Ronin::DB::URLQueryParam do
5
+ it "must use the 'ronin_url_query_params' table" do
6
+ expect(described_class.table_name).to eq('ronin_url_query_params')
7
+ end
8
+
9
+ let(:scheme) { 'https' }
10
+ let(:host_name) { 'www.example.com' }
11
+ let(:port) { 8080 }
12
+ let(:path) { '/path' }
13
+ let(:query_params) { {'q' => '1'} }
14
+ let(:query_string) { 'q=1' }
15
+ let(:fragment) { 'frag' }
16
+
17
+ let(:url_scheme) do
18
+ Ronin::DB::URLScheme.find_or_initialize_by(name: scheme)
19
+ end
20
+ let(:url_host_name) do
21
+ Ronin::DB::HostName.find_or_initialize_by(name: host_name)
22
+ end
23
+ let(:url_port) do
24
+ Ronin::DB::Port.find_or_initialize_by(protocol: :tcp, number: port)
25
+ end
26
+ let(:url_query_param_name) do
27
+ Ronin::DB::URLQueryParamName.find_or_initialize_by(name: name)
28
+ end
29
+
30
+ let(:url) do
31
+ Ronin::DB::URL.new(
32
+ scheme: url_scheme,
33
+ host_name: url_host_name,
34
+ port: url_port,
35
+ path: path,
36
+ fragment: fragment
37
+ )
38
+ end
39
+
40
+ let(:name) { 'foo' }
41
+ let(:value) { 'bar' }
42
+
43
+ describe "validations" do
44
+ describe "name" do
45
+ it "must require a name association" do
46
+ url_query_param = described_class.new(value: value)
47
+ expect(url_query_param).to_not be_valid
48
+ expect(url_query_param.errors[:name]).to eq(
49
+ ["must exist"]
50
+ )
51
+
52
+ url_query_param = described_class.new(
53
+ name: url_query_param_name,
54
+ value: value,
55
+ url: url
56
+ )
57
+ expect(url_query_param).to be_valid
58
+ end
59
+ end
60
+
61
+ describe "url" do
62
+ end
63
+ end
64
+
65
+ subject do
66
+ described_class.new(
67
+ name: Ronin::DB::URLQueryParamName.new(name: name),
68
+ value: value,
69
+ url: url
70
+ )
71
+ end
72
+
73
+ describe "#to_s" do
74
+ it "should dump a name and a value into a String" do
75
+ expect(subject.to_s).to eq("#{name}=#{value}")
76
+ end
77
+
78
+ context "when an empty value" do
79
+ let(:value) { '' }
80
+
81
+ it "should ignore empty or nil values" do
82
+ expect(subject.to_s).to eq("#{name}=")
83
+ end
84
+ end
85
+
86
+ context "when a nil value" do
87
+ let(:value) { nil }
88
+
89
+ it "should ignore empty or nil values" do
90
+ expect(subject.to_s).to eq("#{name}=")
91
+ end
92
+ end
93
+
94
+ context "with special characters" do
95
+ let(:value) { 'bar baz' }
96
+ let(:encoded_value) { URI::DEFAULT_PARSER.escape(value) }
97
+
98
+ subject do
99
+ described_class.new(
100
+ name: Ronin::DB::URLQueryParamName.new(name: name),
101
+ value: value
102
+ )
103
+ end
104
+
105
+ it "should escape special characters" do
106
+ expect(subject.to_s).to eq("#{name}=#{encoded_value}")
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+ require 'ronin/db/url_scheme'
3
+
4
+ describe Ronin::DB::URLScheme do
5
+ it "must use the 'ronin_url_schemes' table" do
6
+ expect(described_class.table_name).to eq('ronin_url_schemes')
7
+ end
8
+
9
+ let(:name) { 'http' }
10
+
11
+ describe "validations" do
12
+ describe "name" do
13
+ subject { described_class.new(name: 'http') }
14
+
15
+ it "must require a name attribute" do
16
+ url_scheme = described_class.new
17
+ expect(url_scheme).to_not be_valid
18
+ expect(url_scheme.errors[:name]).to eq(
19
+ ["can't be blank"]
20
+ )
21
+
22
+ url_scheme = described_class.new(name: name)
23
+ expect(url_scheme).to be_valid
24
+ end
25
+
26
+ it "msst require a unique name" do
27
+ described_class.create(name: name)
28
+
29
+ url_scheme = described_class.new(name: name)
30
+ expect(url_scheme).to_not be_valid
31
+ expect(url_scheme.errors[:name]).to eq(
32
+ ["has already been taken"]
33
+ )
34
+
35
+ described_class.destroy_all
36
+ end
37
+ end
38
+ end
39
+ end