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,372 @@
1
+ require 'spec_helper'
2
+ require 'ronin/db/email_address'
3
+
4
+ describe Ronin::DB::EmailAddress do
5
+ it "must use the 'ronin_email_addresses' table" do
6
+ expect(described_class.table_name).to eq('ronin_email_addresses')
7
+ end
8
+
9
+ let(:user) { 'joe' }
10
+ let(:host) { 'example.com' }
11
+ let(:address) { "#{user}@#{host}" }
12
+
13
+ let(:user_name) { Ronin::DB::UserName.new(name: user) }
14
+ let(:host_name) { Ronin::DB::HostName.new(name: host) }
15
+
16
+ subject do
17
+ described_class.new(
18
+ user_name: user_name,
19
+ host_name: host_name
20
+ )
21
+ end
22
+
23
+ describe "validations" do
24
+ describe "address" do
25
+ it "must require an email address" do
26
+ email_address = described_class.new(
27
+ user_name: user_name,
28
+ host_name: host_name
29
+ )
30
+ expect(email_address).to_not be_valid
31
+ expect(email_address.errors[:address]).to include(
32
+ "can't be blank"
33
+ )
34
+
35
+ email_address = described_class.new(
36
+ address: address,
37
+ user_name: user_name,
38
+ host_name: host_name
39
+ )
40
+ expect(email_address).to be_valid
41
+ end
42
+
43
+ it "must require a valid email address" do
44
+ email_address = described_class.new(
45
+ address: "foo AT bar DOT com",
46
+ user_name: user_name,
47
+ host_name: host_name
48
+ )
49
+ expect(email_address).to_not be_valid
50
+ expect(email_address.errors[:address]).to eq(
51
+ ["Must be a valid email address"]
52
+ )
53
+
54
+ email_address = described_class.new(
55
+ address: address,
56
+ user_name: user_name,
57
+ host_name: host_name
58
+ )
59
+ expect(email_address).to be_valid
60
+ end
61
+
62
+ it "must not allow email addresses longer than 320 characters" do
63
+ email_address = described_class.new(
64
+ address: ('a' * 320) + "@example.com",
65
+ user_name: user_name,
66
+ host_name: host_name
67
+ )
68
+ expect(email_address).to_not be_valid
69
+ expect(email_address.errors[:address]).to eq(
70
+ ["is too long (maximum is 320 characters)"]
71
+ )
72
+
73
+ email_address = described_class.new(
74
+ address: address,
75
+ user_name: user_name,
76
+ host_name: host_name
77
+ )
78
+ expect(email_address).to be_valid
79
+ end
80
+
81
+ it "must require a unique email address" do
82
+ user_name.save
83
+ host_name.save
84
+
85
+ email_address = described_class.create(
86
+ address: address,
87
+ user_name: user_name,
88
+ host_name: host_name
89
+ )
90
+ expect(email_address).to be_valid
91
+
92
+ email_address = described_class.new(
93
+ address: address,
94
+ user_name: user_name,
95
+ host_name: host_name
96
+ )
97
+
98
+ expect(email_address).to_not be_valid
99
+ expect(email_address.errors[:address]).to eq(
100
+ ["has already been taken"]
101
+ )
102
+
103
+ described_class.destroy_all
104
+ user_name.destroy
105
+ host_name.destroy
106
+ end
107
+ end
108
+
109
+ describe "host_name" do
110
+ it "must require a host_name" do
111
+ email_address = described_class.new(
112
+ address: address,
113
+ user_name: user_name
114
+ )
115
+ expect(email_address).to_not be_valid
116
+ expect(email_address.errors[:host_name]).to include(
117
+ "must exist"
118
+ )
119
+
120
+ email_address = described_class.new(
121
+ address: address,
122
+ user_name: user_name,
123
+ host_name: host_name
124
+ )
125
+ expect(email_address).to be_valid
126
+ end
127
+ end
128
+
129
+ describe "user_name" do
130
+ it "must require a user_name" do
131
+ email_address = described_class.new(
132
+ address: address,
133
+ host_name: host_name
134
+ )
135
+ expect(email_address).to_not be_valid
136
+ expect(email_address.errors[:user_name]).to include(
137
+ "must exist"
138
+ )
139
+
140
+ email_address = described_class.new(
141
+ address: address,
142
+ user_name: user_name,
143
+ host_name: host_name
144
+ )
145
+ expect(email_address).to be_valid
146
+ end
147
+
148
+ it "must require a unique combination of host_name and user_name" do
149
+ user_name.save
150
+ host_name.save
151
+
152
+ email_address = described_class.create(
153
+ address: address,
154
+ user_name: user_name,
155
+ host_name: host_name
156
+ )
157
+ expect(email_address).to be_valid
158
+
159
+ email_address = described_class.new(
160
+ address: address,
161
+ user_name: user_name,
162
+ host_name: host_name
163
+ )
164
+ expect(email_address).to_not be_valid
165
+ expect(email_address.errors[:user_name]).to eq(
166
+ ["has already been taken"]
167
+ )
168
+
169
+ described_class.destroy_all
170
+ user_name.destroy
171
+ host_name.destroy
172
+ end
173
+ end
174
+ end
175
+
176
+ describe ".with_host_name" do
177
+ subject { described_class }
178
+
179
+ let(:user_name) { Ronin::DB::UserName.create(name: user) }
180
+ let(:host_name) { Ronin::DB::HostName.create(name: host) }
181
+
182
+ before do
183
+ email_address = described_class.create(
184
+ address: address,
185
+ user_name: user_name,
186
+ host_name: host_name
187
+ )
188
+ end
189
+
190
+ it "must find the #{described_class} with the associated host name" do
191
+ email_address = subject.with_host_name(host).first
192
+
193
+ expect(email_address).to be_kind_of(described_class)
194
+ expect(email_address.host_name.name).to eq(host)
195
+ end
196
+
197
+ after do
198
+ described_class.destroy_all
199
+ user_name.destroy
200
+ host_name.destroy
201
+ end
202
+ end
203
+
204
+ describe ".with_ip_address" do
205
+ subject { described_class }
206
+
207
+ let(:user_name) { Ronin::DB::UserName.create(name: user) }
208
+ let(:host_name) { Ronin::DB::HostName.create(name: host) }
209
+
210
+ let(:ip) { '93.184.216.34' }
211
+ let(:ip_address) { Ronin::DB::IPAddress.create(address: ip) }
212
+
213
+ before do
214
+ email_address = described_class.create(
215
+ address: address,
216
+ user_name: user_name,
217
+ host_name: host_name
218
+ )
219
+ email_address.host_name.ip_addresses << ip_address
220
+ end
221
+
222
+ it "must find the #{described_class} with the associated IP address" do
223
+ email_address = subject.with_ip_address(ip).first
224
+
225
+ expect(email_address).to be_kind_of(described_class)
226
+ expect(email_address.ip_addresses.first.address).to eq(ip)
227
+ end
228
+
229
+ after do
230
+ described_class.destroy_all
231
+ ip_address.destroy
232
+ user_name.destroy
233
+ host_name.destroy
234
+ end
235
+ end
236
+
237
+ describe ".with_user_name" do
238
+ subject { described_class }
239
+
240
+ let(:user_name) { Ronin::DB::UserName.create(name: user) }
241
+ let(:host_name) { Ronin::DB::HostName.create(name: host) }
242
+
243
+ before do
244
+ email_address = described_class.create(
245
+ address: address,
246
+ user_name: user_name,
247
+ host_name: host_name
248
+ )
249
+ end
250
+
251
+ it "must find the #{described_class} with the associated user name" do
252
+ email_address = subject.with_user_name(user).first
253
+
254
+ expect(email_address).to be_kind_of(described_class)
255
+ expect(email_address.user_name.name).to eq(user)
256
+ end
257
+
258
+ after do
259
+ described_class.destroy_all
260
+ user_name.destroy
261
+ host_name.destroy
262
+ end
263
+ end
264
+
265
+ describe ".lookup" do
266
+ let(:user_name) { Ronin::DB::UserName.create(name: user) }
267
+ let(:host_name) { Ronin::DB::HostName.create(name: host) }
268
+
269
+ before do
270
+ described_class.create(
271
+ address: 'other_user1@other_host1.com',
272
+ user_name: Ronin::DB::UserName.create(name: 'other_user1'),
273
+ host_name: Ronin::DB::HostName.create(name: 'other_host1')
274
+ )
275
+
276
+ described_class.create(
277
+ address: address,
278
+ user_name: user_name,
279
+ host_name: host_name
280
+ )
281
+
282
+ described_class.create(
283
+ address: 'other_user2@other_host2.com',
284
+ user_name: Ronin::DB::UserName.create(name: 'other_user2'),
285
+ host_name: Ronin::DB::HostName.create(name: 'other_host2')
286
+ )
287
+ end
288
+
289
+ it "must query the #{described_class} with the given address" do
290
+ email_address = described_class.lookup(address)
291
+
292
+ expect(email_address.address).to eq(address)
293
+ end
294
+
295
+ after do
296
+ described_class.destroy_all
297
+ user_name.destroy
298
+ host_name.destroy
299
+ end
300
+ end
301
+
302
+ describe ".import" do
303
+ context "when given a valid email address" do
304
+ subject { described_class.import(address) }
305
+
306
+ it "must parse and import the email address" do
307
+ expect(subject.user_name.name).to eq(user)
308
+ expect(subject.host_name.name).to eq(host)
309
+ end
310
+
311
+ after do
312
+ subject.destroy
313
+ subject.user_name.destroy
314
+ subject.host_name.destroy
315
+ end
316
+ end
317
+
318
+ context "when the email address does not have a user name" do
319
+ subject { described_class }
320
+
321
+ let(:address) { "@#{host}" }
322
+
323
+ it do
324
+ expect {
325
+ subject.import(address)
326
+ }.to raise_error(ArgumentError,"email address #{address.inspect} must have a user name")
327
+ end
328
+ end
329
+
330
+ context "when the email address does not have a host name" do
331
+ subject { described_class }
332
+
333
+ let(:address) { "#{user}@" }
334
+
335
+ it do
336
+ expect {
337
+ subject.import(address)
338
+ }.to raise_error(ArgumentError,"email address #{address.inspect} must have a host name")
339
+ end
340
+ end
341
+
342
+ context "when the email address contains spaces" do
343
+ subject { described_class }
344
+
345
+ let(:address) { "#{user} @ #{host}" }
346
+
347
+ it do
348
+ expect {
349
+ subject.import(address)
350
+ }.to raise_error(ArgumentError,"email address #{address.inspect} must not contain spaces")
351
+ end
352
+ end
353
+ end
354
+
355
+ describe "#user" do
356
+ it "must return the user-name" do
357
+ expect(subject.user).to eq(user)
358
+ end
359
+ end
360
+
361
+ describe "#host" do
362
+ it "must return the host-name" do
363
+ expect(subject.host).to eq(host)
364
+ end
365
+ end
366
+
367
+ describe "#to_s" do
368
+ it "should include the email address" do
369
+ expect(subject.to_s).to eq(address)
370
+ end
371
+ end
372
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+ require 'ronin/db/host_name_ip_address'
3
+
4
+ describe Ronin::DB::HostNameIPAddress do
5
+ it "must use the 'ronin_host_name_ip_addresses' table" do
6
+ expect(described_class.table_name).to eq('ronin_host_name_ip_addresses')
7
+ end
8
+ end
@@ -0,0 +1,207 @@
1
+ require 'spec_helper'
2
+ require 'ronin/db/host_name'
3
+
4
+ describe Ronin::DB::HostName do
5
+ it "must use the 'ronin_host_names' table" do
6
+ expect(described_class.table_name).to eq('ronin_host_names')
7
+ end
8
+
9
+ it "must include Ronin::DB::Model::LastScannedat" do
10
+ expect(described_class).to include(Ronin::DB::Model::LastScannedAt)
11
+ end
12
+
13
+ let(:name) { 'example.com' }
14
+ let(:address) { '93.184.216.34' }
15
+
16
+ describe "validations" do
17
+ describe "name" do
18
+ it "require an host name" do
19
+ host_name = described_class.new
20
+ expect(host_name).to_not be_valid
21
+
22
+ host_name = described_class.new(name: name)
23
+ expect(host_name).to be_valid
24
+ end
25
+
26
+ it "must require a unique name" do
27
+ described_class.create(name: name)
28
+
29
+ host_name = described_class.new(name: name)
30
+ expect(host_name).to_not be_valid
31
+
32
+ described_class.destroy_all
33
+ end
34
+ end
35
+ end
36
+
37
+ describe ".with_ip_address" do
38
+ subject { described_class }
39
+
40
+ let(:name) { 'example.com' }
41
+ let(:address) { '93.184.216.34' }
42
+
43
+ before do
44
+ host = subject.create(name: name)
45
+ host.ip_addresses.create(address: address)
46
+ end
47
+
48
+ it "must find the #{described_class} with the associated IP address" do
49
+ host = subject.with_ip_address([address]).first
50
+
51
+ expect(host).to be_kind_of(described_class)
52
+ expect(host.name).to eq(name)
53
+ expect(host.ip_addresses[0].address).to eq(address)
54
+ end
55
+
56
+ after do
57
+ Ronin::DB::HostNameIPAddress.destroy_all
58
+ Ronin::DB::IPAddress.destroy_all
59
+ Ronin::DB::HostName.destroy_all
60
+ end
61
+ end
62
+
63
+ describe ".with_port_number" do
64
+ subject { described_class }
65
+
66
+ let(:port1) { 80 }
67
+ let(:port2) { 443 }
68
+ let(:ports) { [port1, port2] }
69
+
70
+ before do
71
+ host = described_class.create(name: name)
72
+ ip_address = host.ip_addresses.create(address: address)
73
+
74
+ ip_address.ports.create(protocol: :tcp, number: port1)
75
+ ip_address.ports.create(protocol: :tcp, number: port2)
76
+ end
77
+
78
+ it "must find the #{described_class} with the associated port number" do
79
+ host = subject.with_port_number(port2).first
80
+
81
+ expect(host).to be_kind_of(described_class)
82
+ expect(host.name).to eq(name)
83
+ expect(host.ports.map(&:number)).to include(port2)
84
+ end
85
+
86
+ context "when given an Array of port numbers" do
87
+ it "must find the #{described_class} with the associated port numbers" do
88
+ host = subject.with_port_number(ports).first
89
+
90
+ expect(host).to be_kind_of(described_class)
91
+ expect(host.name).to eq(name)
92
+ expect(host.ports[0].number).to eq(port1)
93
+ expect(host.ports[1].number).to eq(port2)
94
+ end
95
+ end
96
+
97
+ after do
98
+ Ronin::DB::OpenPort.destroy_all
99
+ Ronin::DB::Port.destroy_all
100
+ Ronin::DB::HostNameIPAddress.destroy_all
101
+ Ronin::DB::IPAddress.destroy_all
102
+ Ronin::DB::HostName.destroy_all
103
+ end
104
+ end
105
+
106
+ describe ".with_tld" do
107
+ subject { described_class }
108
+
109
+ let(:tld) { 'co.uk' }
110
+ let(:domain) { "example.#{tld}" }
111
+
112
+ before do
113
+ subject.create(name: domain)
114
+ end
115
+
116
+ it "must find the #{described_class} with the given TLD" do
117
+ host_name = subject.with_tld(tld).first
118
+
119
+ expect(host_name).to be_kind_of(described_class)
120
+ expect(host_name.name).to eq(domain)
121
+ end
122
+
123
+ after do
124
+ described_class.destroy_all
125
+ end
126
+ end
127
+
128
+ describe ".with_domain" do
129
+ subject { described_class }
130
+
131
+ context "when the exact domain exists in the database" do
132
+ let(:domain) { 'example.com' }
133
+
134
+ before do
135
+ subject.create(name: domain)
136
+ end
137
+
138
+ it "must query the domain" do
139
+ host = subject.with_domain(domain).first
140
+
141
+ expect(host).to be_kind_of(described_class)
142
+ expect(host.name).to eq(domain)
143
+ end
144
+
145
+ after { subject.destroy_all }
146
+
147
+ context "when other sub-domain names exist in the database" do
148
+ let(:sub_domain1) { 'www.example.com' }
149
+ let(:sub_domain2) { 'mail.example.com' }
150
+
151
+ before do
152
+ subject.create(name: sub_domain1)
153
+ subject.create(name: sub_domain2)
154
+ end
155
+
156
+ it "must query the domain and sub-domain names" do
157
+ hosts = subject.with_domain(domain)
158
+
159
+ expect(hosts[0]).to be_kind_of(described_class)
160
+ expect(hosts[0].name).to eq(domain)
161
+
162
+ expect(hosts[1]).to be_kind_of(described_class)
163
+ expect(hosts[1].name).to eq(sub_domain1)
164
+
165
+ expect(hosts[2]).to be_kind_of(described_class)
166
+ expect(hosts[2].name).to eq(sub_domain2)
167
+ end
168
+
169
+ after { subject.destroy_all }
170
+ end
171
+ end
172
+ end
173
+
174
+ describe ".lookup" do
175
+ before do
176
+ described_class.create(name: 'other.host1.com')
177
+ described_class.create(name: name)
178
+ described_class.create(name: 'other.host2.com')
179
+ end
180
+
181
+ it "must query the #{described_class} with the matching name" do
182
+ host_name = described_class.lookup(name)
183
+
184
+ expect(host_name).to be_kind_of(described_class)
185
+ expect(host_name.name).to eq(name)
186
+ end
187
+
188
+ after { described_class.destroy_all }
189
+ end
190
+
191
+ describe ".import" do
192
+ let(:name) { 'example.com' }
193
+
194
+ subject { described_class.import(name) }
195
+
196
+ it "must import the host name and return a new #{described_class} record" do
197
+ expect(subject).to be_kind_of(described_class)
198
+ expect(subject.id).to_not be(nil)
199
+ expect(subject.name).to eq(name)
200
+ end
201
+
202
+ after { described_class.destroy_all }
203
+ end
204
+
205
+ describe "#recent_ip_address" do
206
+ end
207
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+ require 'ronin/db/http_header_name'
3
+
4
+ describe Ronin::DB::HTTPHeaderName do
5
+ it "must use the 'ronin_http_header_names' table" do
6
+ expect(described_class.table_name).to eq('ronin_http_header_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
+ http_header_name = described_class.new
15
+ expect(http_header_name).to_not be_valid
16
+ expect(http_header_name.errors[:name]).to eq(
17
+ ["can't be blank"]
18
+ )
19
+
20
+ http_header_name = described_class.new(name: name)
21
+ expect(http_header_name).to be_valid
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+ require 'ronin/db/http_query_param_name'
3
+
4
+ describe Ronin::DB::HTTPQueryParamName do
5
+ it "must use the 'ronin_http_query_param_names' table" do
6
+ expect(described_class.table_name).to eq('ronin_http_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
+ http_query_param_name = described_class.new
15
+ expect(http_query_param_name).to_not be_valid
16
+ expect(http_query_param_name.errors[:name]).to eq(
17
+ ["can't be blank"]
18
+ )
19
+
20
+ http_query_param_name = described_class.new(name: name)
21
+ expect(http_query_param_name).to be_valid
22
+ end
23
+ end
24
+ end
25
+ end