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,102 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db-activerecord - ActiveRecord backend for the Ronin Database.
4
+ #
5
+ # Copyright (c) 2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db-activerecord is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db-activerecord is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db-activerecord. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/db/model'
22
+
23
+ module Ronin
24
+ module DB
25
+ module Model
26
+ #
27
+ # Adds a `name` property to a model.
28
+ #
29
+ module HasName
30
+ #
31
+ # @!attribute [rw] name
32
+ # The name attribute of the model.
33
+ #
34
+ # @return [String]
35
+ #
36
+
37
+ #
38
+ # Adds the `name` property and {ClassMethods} to the model.
39
+ #
40
+ # @param [Class] base
41
+ # The model.
42
+ #
43
+ # @api private
44
+ #
45
+ def self.included(base)
46
+ base.send :include, Model, InstanceMethods
47
+ base.send :extend, ClassMethods
48
+
49
+ base.module_eval do
50
+ # The name attribute of the model
51
+ attribute :name, :string
52
+ validates :name, presence: true
53
+ end
54
+ end
55
+
56
+ #
57
+ # Class methods that are added when {HasName} is included into a
58
+ # model.
59
+ #
60
+ module ClassMethods
61
+ #
62
+ # Finds models with names containing a given fragment of text.
63
+ #
64
+ # @param [String] fragment
65
+ # The fragment of text to search for within the names of models.
66
+ #
67
+ # @return [Array<Model>]
68
+ # The found models.
69
+ #
70
+ # @example
71
+ # Exploit.named 'ProFTP'
72
+ #
73
+ # @api public
74
+ #
75
+ def named(fragment)
76
+ name_column = self.arel_table[:name]
77
+
78
+ where(name_column.matches("%#{sanitize_sql_like(fragment)}%"))
79
+ end
80
+ end
81
+
82
+ #
83
+ # Instance methods that are added when {HasName} is included into a
84
+ # model.
85
+ #
86
+ module InstanceMethods
87
+ #
88
+ # Converts the named resource into a String.
89
+ #
90
+ # @return [String]
91
+ # The name of the resource.
92
+ #
93
+ # @api public
94
+ #
95
+ def to_s
96
+ self.name.to_s
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db-activerecord - ActiveRecord backend for the Ronin Database.
4
+ #
5
+ # Copyright (c) 2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db-activerecord is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db-activerecord is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db-activerecord. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/db/model/has_name'
22
+
23
+ module Ronin
24
+ module DB
25
+ module Model
26
+ #
27
+ # Adds a unique `name` property to a model.
28
+ #
29
+ module HasUniqueName
30
+ #
31
+ # @!attribute [rw] name
32
+ # The unqiue name of the model.
33
+ #
34
+ # @return [String]
35
+ #
36
+
37
+ #
38
+ # Adds the unique `name` property and {HasName::ClassMethods} to the
39
+ # model.
40
+ #
41
+ # @param [Class] base
42
+ # The model.
43
+ #
44
+ # @api semipublic
45
+ #
46
+ def self.included(base)
47
+ base.send :include, Model,
48
+ HasName::InstanceMethods
49
+
50
+ base.send :extend, HasName::ClassMethods,
51
+ HasUniqueName::ClassMethods
52
+
53
+ base.module_eval do
54
+ # The name of the model
55
+ attribute :name, :string
56
+ validates :name, presence: true, uniqueness: true
57
+ end
58
+ end
59
+
60
+ #
61
+ # Class methods that will be added when {HasUniqueName} is included.
62
+ #
63
+ module ClassMethods
64
+ #
65
+ # Parses a unique name.
66
+ #
67
+ # @param [String] name
68
+ # The name to parse.
69
+ #
70
+ # @return [Model]
71
+ # A new or previously saved resource.
72
+ #
73
+ # @api public
74
+ #
75
+ def parse(name)
76
+ find_or_initialize_by(name: name.strip)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db-activerecord - ActiveRecord backend for the Ronin Database.
4
+ #
5
+ # Copyright (c) 2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db-activerecord is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db-activerecord is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db-activerecord. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ module Ronin
22
+ module DB
23
+ module Model
24
+ #
25
+ # Allows a model to import records from raw values.
26
+ #
27
+ module Importable
28
+ #
29
+ # Adds {ClassMethods} to the model including {Importable}.
30
+ #
31
+ # @param [Class] model
32
+ # The model including {Importable}.
33
+ #
34
+ # @api private
35
+ #
36
+ def self.included(model)
37
+ model.extend ClassMethods
38
+ end
39
+
40
+ module ClassMethods
41
+ #
42
+ # Looks up a record with the given value.
43
+ #
44
+ # @param [Object] value
45
+ # The raw value to use for the query.
46
+ #
47
+ # @return [ActiveRecord::Base, nil]
48
+ # The found record.
49
+ #
50
+ def lookup(value)
51
+ raise(NotImplementedError,"#{self} did not define a self.lookup method")
52
+ end
53
+
54
+ #
55
+ # Imports a record from the given value.
56
+ #
57
+ # @param [Object] value
58
+ # The raw value that represents the record.
59
+ #
60
+ # @return [ActiveRecord::Base]
61
+ # The imported record.
62
+ #
63
+ # @abstract
64
+ #
65
+ def import(value)
66
+ raise(NotImplementedError,"#{self} did not define a self.import method")
67
+ end
68
+
69
+ #
70
+ # Finds or imports a new record.
71
+ #
72
+ # @param [Object] value
73
+ # The raw value that represents the record.
74
+ #
75
+ # @return [ActiveRecord::Base]
76
+ # The found or created record.
77
+ #
78
+ def find_or_import(value)
79
+ lookup(value) || import(value)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db-activerecord - ActiveRecord backend for the Ronin Database.
4
+ #
5
+ # Copyright (c) 2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db-activerecord is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db-activerecord is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db-activerecord. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ module Ronin
22
+ module DB
23
+ module Model
24
+ module LastScannedAt
25
+ #
26
+ # @!attribute [rw] last_scanned_at
27
+ # Whenever the model was last scanned.
28
+ #
29
+ # @return [Time, nil]
30
+ #
31
+
32
+ #
33
+ # Adds the `last_scanned_at` attribute to the model.
34
+ #
35
+ # @param [Class<ActiveRecord::Base>] model
36
+ # The ActiveRecord model which is including {LastScannedAt}.
37
+ #
38
+ # @api private
39
+ #
40
+ def self.included(model)
41
+ model.class_eval do
42
+ attribute :last_scanned_at, :time
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db-activerecord - ActiveRecord backend for the Ronin Database.
4
+ #
5
+ # Copyright (c) 2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db-activerecord is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db-activerecord is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db-activerecord. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ module Ronin
22
+ module DB
23
+ module Model
24
+ #
25
+ # Sets the models `table_name_prefix` to `ronin_`.
26
+ #
27
+ # @param [Class<ActiveRecord::Base>] model
28
+ # The ActiveRecord model class which is including {Model}.
29
+ #
30
+ # @api private
31
+ #
32
+ def self.included(model)
33
+ model.table_name_prefix = 'ronin_'
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db-activerecord - ActiveRecord backend for the Ronin Database.
4
+ #
5
+ # Copyright (c) 2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db-activerecord is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db-activerecord is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db-activerecord. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/db/address'
22
+ require 'ronin/db/arch'
23
+ require 'ronin/db/credential'
24
+ require 'ronin/db/email_address'
25
+ require 'ronin/db/host_name'
26
+ require 'ronin/db/host_name_ip_address'
27
+ require 'ronin/db/ip_address'
28
+ require 'ronin/db/ip_address_mac_address'
29
+ require 'ronin/db/mac_address'
30
+ require 'ronin/db/open_port'
31
+ require 'ronin/db/organization'
32
+ require 'ronin/db/os'
33
+ require 'ronin/db/os_guess'
34
+ require 'ronin/db/password'
35
+ require 'ronin/db/port'
36
+ require 'ronin/db/service'
37
+ require 'ronin/db/service_credential'
38
+ require 'ronin/db/software'
39
+ require 'ronin/db/url_query_param_name'
40
+ require 'ronin/db/url_query_param'
41
+ require 'ronin/db/url_scheme'
42
+ require 'ronin/db/url'
43
+ require 'ronin/db/user_name'
44
+ require 'ronin/db/software_vendor'
45
+ require 'ronin/db/web_credential'
46
+ require 'ronin/db/asn'
47
+ require 'ronin/db/http_query_param_name'
48
+ require 'ronin/db/http_query_param'
49
+ require 'ronin/db/http_header_name'
50
+ require 'ronin/db/http_request_header'
51
+ require 'ronin/db/http_response_header'
52
+ require 'ronin/db/http_request'
53
+ require 'ronin/db/http_response'
54
+ require 'ronin/db/advisory'
55
+ require 'ronin/db/vulnerability'
56
+
57
+ module Ronin
58
+ module DB
59
+ module Models
60
+ ALL = [
61
+ Address,
62
+ Arch,
63
+ Credential,
64
+ EmailAddress,
65
+ HostName,
66
+ HostNameIPAddress,
67
+ IPAddress,
68
+ IPAddressMACAddress,
69
+ MACAddress,
70
+ OS,
71
+ OSGuess,
72
+ OpenPort,
73
+ Organization,
74
+ Password,
75
+ Port,
76
+ Service,
77
+ ServiceCredential,
78
+ Software,
79
+ URLQueryParamName,
80
+ URLQueryParam,
81
+ URLScheme,
82
+ URL,
83
+ UserName,
84
+ SoftwareVendor,
85
+ WebCredential,
86
+ ASN,
87
+ HTTPQueryParamName,
88
+ HTTPQueryParam,
89
+ HTTPHeaderName,
90
+ HTTPRequestHeader,
91
+ HTTPResponseHeader,
92
+ HTTPRequest,
93
+ HTTPResponse,
94
+ Advisory,
95
+ Vulnerability
96
+ ]
97
+
98
+ #
99
+ # Calls `.connect` on all {Ronin::DB} models.
100
+ #
101
+ # @api semipublic
102
+ #
103
+ def self.connect
104
+ ALL.each(&:connection)
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db-activerecord - ActiveRecord backend for the Ronin Database.
4
+ #
5
+ # Copyright (c) 2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db-activerecord is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db-activerecord is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db-activerecord. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/db/model'
22
+ require 'ronin/db/model/last_scanned_at'
23
+
24
+ require 'active_record'
25
+
26
+ module Ronin
27
+ module DB
28
+ #
29
+ # Represents a open port at a specified IP address.
30
+ #
31
+ class OpenPort < ActiveRecord::Base
32
+
33
+ include Model
34
+ include Model::LastScannedAt
35
+
36
+ # @!attribute [rw] id
37
+ # The primary key of the open port.
38
+ #
39
+ # @return [Integer]
40
+ attribute :id, :integer
41
+
42
+ # @!attribute [rw] ip_address
43
+ # The IP Address that was scanned.
44
+ #
45
+ # @return [IPAddress]
46
+ belongs_to :ip_address, required: true,
47
+ class_name: 'IPAddress'
48
+
49
+ # @!attribute [rw] port
50
+ # The port.
51
+ #
52
+ # @return [Port]
53
+ belongs_to :port, required: true
54
+
55
+ # @!attribute [rw] service
56
+ # The service detected on the port
57
+ #
58
+ # @return [Service, nil]
59
+ belongs_to :service, optional: true
60
+
61
+ # @!attribute [rw] software
62
+ # The software running on the open port
63
+ #
64
+ # @return [Software]
65
+ belongs_to :software, optional: true
66
+
67
+ # @!attribute [rw] ssl
68
+ # Specifies whether the service requires SSL.
69
+ #
70
+ # @return [Boolean]
71
+ attribute :ssl, :boolean
72
+
73
+ # @!attribute [r] created_at
74
+ # Define the created_at timestamp
75
+ #
76
+ # @return [Time]
77
+ attribute :created_at, :time
78
+
79
+ # @!attribute [rw] service_credentials
80
+ # Credentials used by the service running on the port
81
+ #
82
+ # @return [Array<ServiceCredential>]
83
+ has_many :service_credentials, dependent: :destroy
84
+
85
+ # @!attribute [rw] credentials
86
+ # The credentials that will work with this open port.
87
+ #
88
+ # @return [Array<Credential>]
89
+ has_many :credentials, through: :service_credentials
90
+
91
+ #
92
+ # The IP Address of the open port.
93
+ #
94
+ # @return [String]
95
+ # The IP Address.
96
+ #
97
+ # @api public
98
+ #
99
+ def address
100
+ self.ip_address.address
101
+ end
102
+
103
+ #
104
+ # The port number.
105
+ #
106
+ # @return [Integer]
107
+ # The port number.
108
+ #
109
+ # @api public
110
+ #
111
+ def number
112
+ self.port.number
113
+ end
114
+
115
+ #
116
+ # Converts the open port to an integer.
117
+ #
118
+ # @return [Integer]
119
+ # The port number.
120
+ #
121
+ # @api public
122
+ #
123
+ def to_i
124
+ self.port.to_i
125
+ end
126
+
127
+ #
128
+ # Converts the open port to a string.
129
+ #
130
+ # @return [String]
131
+ # The information of the open port.
132
+ #
133
+ # @api public
134
+ #
135
+ def to_s
136
+ if self.service then "#{self.port} (#{self.service})"
137
+ else "#{self.port}"
138
+ end
139
+ end
140
+
141
+ end
142
+ end
143
+ end
144
+
145
+ require 'ronin/db/ip_address'
146
+ require 'ronin/db/port'
147
+ require 'ronin/db/service'
148
+ require 'ronin/db/service_credential'
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db-activerecord - ActiveRecord backend for the Ronin Database.
4
+ #
5
+ # Copyright (c) 2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db-activerecord is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db-activerecord is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db-activerecord. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/db/model'
22
+ require 'ronin/db/model/has_unique_name'
23
+
24
+ require 'active_record'
25
+
26
+ module Ronin
27
+ module DB
28
+ #
29
+ # Represents an Company.
30
+ #
31
+ class Organization < ActiveRecord::Base
32
+
33
+ include Model
34
+ include Model::HasUniqueName
35
+
36
+ # @!attribute [rw] id
37
+ # Primary key of the organization
38
+ #
39
+ # @return [Integer]
40
+ attribute :id, :integer
41
+
42
+ # @!attribute [r] created_at
43
+ # Tracks when the organization was first created
44
+ #
45
+ # @return [Time]
46
+ attribute :created_at, :time
47
+
48
+ end
49
+ end
50
+ end