metasploit_data_models 0.24.4 → 0.24.5
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.
- checksums.yaml +4 -4
- data/.rspec +3 -3
- data/.travis.yml +3 -6
- data/CONTRIBUTING.md +52 -10
- data/Gemfile +8 -1
- data/Rakefile +0 -23
- data/app/models/mdm/api_key.rb +1 -41
- data/app/models/mdm/client.rb +1 -41
- data/app/models/mdm/cred.rb +19 -107
- data/app/models/mdm/event.rb +1 -48
- data/app/models/mdm/exploit_attempt.rb +16 -65
- data/app/models/mdm/exploited_host.rb +1 -28
- data/app/models/mdm/host_detail.rb +1 -45
- data/app/models/mdm/host_tag.rb +8 -6
- data/app/models/mdm/listener.rb +1 -53
- data/app/models/mdm/macro.rb +0 -42
- data/app/models/mdm/mod_ref.rb +0 -21
- data/app/models/mdm/module/action.rb +0 -15
- data/app/models/mdm/module/arch.rb +0 -10
- data/app/models/mdm/module/author.rb +0 -16
- data/app/models/mdm/module/mixin.rb +0 -13
- data/app/models/mdm/module/platform.rb +0 -11
- data/app/models/mdm/module/target.rb +0 -18
- data/app/models/mdm/nexpose_console.rb +4 -82
- data/app/models/mdm/profile.rb +0 -36
- data/app/models/mdm/route.rb +5 -17
- data/app/models/mdm/session_event.rb +1 -33
- data/app/models/mdm/tag.rb +10 -49
- data/app/models/mdm/task.rb +45 -94
- data/app/models/mdm/task_cred.rb +0 -29
- data/app/models/mdm/task_host.rb +0 -25
- data/app/models/mdm/task_service.rb +0 -25
- data/app/models/mdm/task_session.rb +0 -25
- data/app/models/mdm/user.rb +6 -188
- data/app/models/mdm/vuln_attempt.rb +12 -37
- data/app/models/mdm/vuln_detail.rb +5 -139
- data/app/models/mdm/vuln_ref.rb +1 -4
- data/app/models/mdm/web_form.rb +1 -35
- data/app/models/mdm/web_page.rb +1 -70
- data/app/models/mdm/web_site.rb +1 -51
- data/app/models/mdm/wmap_request.rb +0 -85
- data/app/models/mdm/wmap_target.rb +0 -40
- data/app/models/mdm/workspace.rb +14 -152
- data/app/models/metasploit_data_models/automatic_exploitation.rb +16 -0
- data/app/models/metasploit_data_models/automatic_exploitation/match.rb +24 -19
- data/app/models/metasploit_data_models/automatic_exploitation/match_result.rb +5 -33
- data/app/models/metasploit_data_models/automatic_exploitation/match_set.rb +4 -22
- data/app/models/metasploit_data_models/automatic_exploitation/run.rb +3 -13
- data/app/models/metasploit_data_models/ip_address/v4/segmented.rb +1 -1
- data/app/models/metasploit_data_models/module_run.rb +1 -1
- data/app/models/metasploit_data_models/search/visitor/where.rb +1 -1
- data/app/validators/ip_format_validator.rb +0 -4
- data/app/validators/parameters_validator.rb +0 -12
- data/app/validators/password_is_strong_validator.rb +1 -10
- data/lib/mdm/host/operating_system_normalization.rb +10 -7
- data/lib/metasploit_data_models.rb +0 -4
- data/lib/metasploit_data_models/engine.rb +0 -2
- data/lib/metasploit_data_models/serialized_prefs.rb +0 -6
- data/lib/metasploit_data_models/version.rb +10 -24
- data/lib/tasks/yard.rake +33 -0
- data/metasploit_data_models.gemspec +2 -9
- data/spec/app/models/mdm/api_key_spec.rb +3 -1
- data/spec/app/models/mdm/client_spec.rb +11 -9
- data/spec/app/models/mdm/cred_spec.rb +54 -42
- data/spec/app/models/mdm/event_spec.rb +23 -21
- data/spec/app/models/mdm/exploit_attempt_spec.rb +21 -19
- data/spec/app/models/mdm/exploited_host_spec.rb +13 -11
- data/spec/app/models/mdm/host_detail_spec.rb +17 -15
- data/spec/app/models/mdm/host_spec.rb +260 -261
- data/spec/app/models/mdm/host_tag_spec.rb +8 -6
- data/spec/app/models/mdm/listener_spec.rb +32 -30
- data/spec/app/models/mdm/loot_spec.rb +23 -21
- data/spec/app/models/mdm/macro_spec.rb +3 -1
- data/spec/app/models/mdm/mod_ref_spec.rb +3 -1
- data/spec/app/models/mdm/module/action_spec.rb +12 -10
- data/spec/app/models/mdm/module/arch_spec.rb +12 -10
- data/spec/app/models/mdm/module/author_spec.rb +17 -22
- data/spec/app/models/mdm/module/detail_spec.rb +75 -184
- data/spec/app/models/mdm/module/mixin_spec.rb +12 -10
- data/spec/app/models/mdm/module/platform_spec.rb +12 -10
- data/spec/app/models/mdm/module/ref_spec.rb +12 -10
- data/spec/app/models/mdm/module/target_spec.rb +15 -13
- data/spec/app/models/mdm/nexpose_console_spec.rb +37 -35
- data/spec/app/models/mdm/note_spec.rb +25 -23
- data/spec/app/models/mdm/profile_spec.rb +3 -1
- data/spec/app/models/mdm/ref_spec.rb +12 -10
- data/spec/app/models/mdm/route_spec.rb +8 -6
- data/spec/app/models/mdm/service_spec.rb +40 -38
- data/spec/app/models/mdm/session_event_spec.rb +12 -10
- data/spec/app/models/mdm/session_spec.rb +15 -13
- data/spec/app/models/mdm/tag_spec.rb +29 -29
- data/spec/app/models/mdm/task_cred_spec.rb +11 -9
- data/spec/app/models/mdm/task_host_spec.rb +11 -9
- data/spec/app/models/mdm/task_service_spec.rb +11 -9
- data/spec/app/models/mdm/task_session_spec.rb +9 -7
- data/spec/app/models/mdm/task_spec.rb +29 -27
- data/spec/app/models/mdm/user_spec.rb +19 -17
- data/spec/app/models/mdm/vuln_attempt_spec.rb +16 -14
- data/spec/app/models/mdm/vuln_detail_spec.rb +28 -26
- data/spec/app/models/mdm/vuln_ref_spec.rb +10 -8
- data/spec/app/models/mdm/vuln_spec.rb +26 -24
- data/spec/app/models/mdm/web_form_spec.rb +13 -11
- data/spec/app/models/mdm/web_page_spec.rb +21 -19
- data/spec/app/models/mdm/web_site_spec.rb +23 -21
- data/spec/app/models/mdm/web_vuln_spec.rb +65 -63
- data/spec/app/models/mdm/wmap_request_spec.rb +3 -1
- data/spec/app/models/mdm/wmap_target_spec.rb +3 -1
- data/spec/app/models/mdm/workspace_spec.rb +100 -97
- data/spec/app/models/metasploit_data_models/automatic_exploitation/match_result_spec.rb +5 -3
- data/spec/app/models/metasploit_data_models/automatic_exploitation/match_set_spec.rb +15 -13
- data/spec/app/models/metasploit_data_models/automatic_exploitation/match_spec.rb +3 -1
- data/spec/app/models/metasploit_data_models/automatic_exploitation/run_spec.rb +3 -1
- data/spec/app/models/metasploit_data_models/ip_address/v4/cidr_spec.rb +12 -10
- data/spec/app/models/metasploit_data_models/ip_address/v4/nmap_spec.rb +6 -4
- data/spec/app/models/metasploit_data_models/ip_address/v4/range_spec.rb +23 -21
- data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/list_spec.rb +11 -9
- data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/range_spec.rb +23 -21
- data/spec/app/models/metasploit_data_models/ip_address/v4/segment/segmented_spec.rb +6 -4
- data/spec/app/models/metasploit_data_models/ip_address/v4/segment/single_spec.rb +15 -22
- data/spec/app/models/metasploit_data_models/ip_address/v4/single_spec.rb +6 -4
- data/spec/app/models/metasploit_data_models/module_run_spec.rb +3 -1
- data/spec/app/models/metasploit_data_models/search/operation/ip_address_spec.rb +20 -18
- data/spec/app/models/metasploit_data_models/search/operation/port/number_spec.rb +8 -6
- data/spec/app/models/metasploit_data_models/search/operation/port/range_spec.rb +10 -8
- data/spec/app/models/metasploit_data_models/search/operation/range_spec.rb +10 -8
- data/spec/app/models/metasploit_data_models/search/operator/ip_address_spec.rb +4 -2
- data/spec/app/models/metasploit_data_models/search/operator/multitext_spec.rb +10 -8
- data/spec/app/models/metasploit_data_models/search/operator/port/list_spec.rb +8 -6
- data/spec/app/models/metasploit_data_models/search/visitor/attribute_spec.rb +11 -9
- data/spec/app/models/metasploit_data_models/search/visitor/includes_spec.rb +7 -5
- data/spec/app/models/metasploit_data_models/search/visitor/joins_spec.rb +19 -17
- data/spec/app/models/metasploit_data_models/search/visitor/method_spec.rb +7 -5
- data/spec/app/models/metasploit_data_models/search/visitor/relation_spec.rb +23 -61
- data/spec/app/models/metasploit_data_models/search/visitor/where_spec.rb +10 -8
- data/spec/app/validators/parameters_validator_spec.rb +29 -29
- data/spec/app/validators/password_is_strong_validator_spec.rb +46 -54
- data/spec/dummy/db/structure.sql +3403 -0
- data/spec/factories/mdm/module/details.rb +1 -1
- data/spec/lib/base64_serializer_spec.rb +19 -19
- data/spec/lib/metasploit_data_models/ip_address/cidr_spec.rb +12 -18
- data/spec/lib/metasploit_data_models/ip_address/range_spec.rb +6 -4
- data/spec/lib/metasploit_data_models/match/child_spec.rb +4 -2
- data/spec/lib/metasploit_data_models/match/parent_spec.rb +6 -4
- data/spec/lib/metasploit_data_models/version_spec.rb +141 -3
- data/spec/spec_helper.rb +12 -86
- data/spec/support/shared/examples/mdm/module/detail/does_not_support_stance_with_mtype.rb +2 -2
- data/spec/support/shared/examples/mdm/module/detail/supports_stance_with_mtype.rb +4 -4
- data/spec/support/shared/examples/metasploit_data_models/search/operation/ipaddress/match.rb +2 -2
- data/spec/support/shared/examples/metasploit_data_models/search/visitor/includes/visit/with_children.rb +5 -5
- data/spec/support/shared/examples/metasploit_data_models/search/visitor/includes/visit/with_metasploit_model_search_operation_base.rb +5 -5
- data/spec/support/shared/examples/metasploit_data_models/search/visitor/where/visit/with_equality.rb +3 -3
- data/spec/support/shared/examples/metasploit_data_models/search/visitor/where/visit/with_metasploit_model_search_group_base.rb +6 -7
- metadata +9 -67
- data/CHANGELOG.md +0 -6
- data/RELEASING.md +0 -88
- data/UPGRADING.md +0 -1
- data/lib/metasploit_data_models/automatic_exploitation.rb +0 -25
- data/spec/lib/metasploit_data_models_spec.rb +0 -4
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe MetasploitDataModels::Search::Visitor::Where do
|
|
2
4
|
subject(:visitor) do
|
|
3
5
|
described_class.new
|
|
4
6
|
end
|
|
@@ -10,7 +12,7 @@ RSpec.describe MetasploitDataModels::Search::Visitor::Where, type: :model do
|
|
|
10
12
|
visitor.attribute_visitor
|
|
11
13
|
end
|
|
12
14
|
|
|
13
|
-
it {
|
|
15
|
+
it { should be_a MetasploitDataModels::Search::Visitor::Attribute }
|
|
14
16
|
end
|
|
15
17
|
|
|
16
18
|
context '#method_visitor' do
|
|
@@ -18,7 +20,7 @@ RSpec.describe MetasploitDataModels::Search::Visitor::Where, type: :model do
|
|
|
18
20
|
visitor.method_visitor
|
|
19
21
|
end
|
|
20
22
|
|
|
21
|
-
it {
|
|
23
|
+
it { should be_a MetasploitDataModels::Search::Visitor::Method }
|
|
22
24
|
end
|
|
23
25
|
|
|
24
26
|
context '#visit' do
|
|
@@ -82,16 +84,16 @@ RSpec.describe MetasploitDataModels::Search::Visitor::Where, type: :model do
|
|
|
82
84
|
end
|
|
83
85
|
|
|
84
86
|
it 'should visit operation.operator with attribute_visitor' do
|
|
85
|
-
|
|
87
|
+
visitor.attribute_visitor.should_receive(:visit).with(operator).and_call_original
|
|
86
88
|
|
|
87
89
|
visit
|
|
88
90
|
end
|
|
89
91
|
|
|
90
92
|
it 'should call matches on Arel::Attributes::Attribute from attribute_visitor' do
|
|
91
93
|
attribute = double('Visited Operator')
|
|
92
|
-
|
|
94
|
+
visitor.attribute_visitor.stub(:visit).with(operator).and_return(attribute)
|
|
93
95
|
|
|
94
|
-
|
|
96
|
+
attribute.should_receive(:matches).with("%#{value}%")
|
|
95
97
|
|
|
96
98
|
visit
|
|
97
99
|
end
|
|
@@ -163,7 +165,7 @@ RSpec.describe MetasploitDataModels::Search::Visitor::Where, type: :model do
|
|
|
163
165
|
end
|
|
164
166
|
|
|
165
167
|
it 'should match module_instances.name with ILIKE' do
|
|
166
|
-
|
|
168
|
+
visit.to_sql.should == "\"hosts\".\"name\" ILIKE '%#{name}%'"
|
|
167
169
|
end
|
|
168
170
|
end
|
|
169
171
|
|
|
@@ -177,7 +179,7 @@ RSpec.describe MetasploitDataModels::Search::Visitor::Where, type: :model do
|
|
|
177
179
|
end
|
|
178
180
|
|
|
179
181
|
it 'should match module_actions.name with ILIKE' do
|
|
180
|
-
|
|
182
|
+
visit.to_sql.should == "\"services\".\"name\" ILIKE '%#{name}%'"
|
|
181
183
|
end
|
|
182
184
|
end
|
|
183
185
|
end
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ParametersValidator do
|
|
2
4
|
subject(:parameters_validator) do
|
|
3
5
|
described_class.new(
|
|
4
6
|
:attributes => attributes
|
|
@@ -27,7 +29,7 @@ RSpec.describe ParametersValidator do
|
|
|
27
29
|
|
|
28
30
|
context 'CONSTANTS' do
|
|
29
31
|
it 'should define TYPE_SIGNATURE_SENTENCE' do
|
|
30
|
-
|
|
32
|
+
described_class::TYPE_SIGNATURE_SENTENCE.should == type_signature_sentence
|
|
31
33
|
end
|
|
32
34
|
end
|
|
33
35
|
|
|
@@ -46,7 +48,7 @@ RSpec.describe ParametersValidator do
|
|
|
46
48
|
end
|
|
47
49
|
|
|
48
50
|
it 'should include prefix' do
|
|
49
|
-
|
|
51
|
+
error_at.should include(prefix)
|
|
50
52
|
end
|
|
51
53
|
|
|
52
54
|
it 'should include location_clause in same sentence as prefix' do
|
|
@@ -56,11 +58,11 @@ RSpec.describe ParametersValidator do
|
|
|
56
58
|
:index => index
|
|
57
59
|
)
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
error_at.should include("#{prefix} #{location_clause}.")
|
|
60
62
|
end
|
|
61
63
|
|
|
62
64
|
it 'should include TYPE_SIGNATURE_SENTENCE' do
|
|
63
|
-
|
|
65
|
+
error_at.should include(type_signature_sentence)
|
|
64
66
|
end
|
|
65
67
|
end
|
|
66
68
|
|
|
@@ -79,9 +81,9 @@ RSpec.describe ParametersValidator do
|
|
|
79
81
|
end
|
|
80
82
|
|
|
81
83
|
it 'should include extreme in prefix' do
|
|
82
|
-
|
|
84
|
+
parameters_validator.should_receive(:error_at) do |*args|
|
|
83
85
|
options = args.first
|
|
84
|
-
|
|
86
|
+
options[:prefix].should include(extreme.to_s)
|
|
85
87
|
end
|
|
86
88
|
|
|
87
89
|
length_error_at
|
|
@@ -98,11 +100,11 @@ RSpec.describe ParametersValidator do
|
|
|
98
100
|
end
|
|
99
101
|
|
|
100
102
|
it 'should include numerical index' do
|
|
101
|
-
|
|
103
|
+
location_clause.should include("at index #{index}")
|
|
102
104
|
end
|
|
103
105
|
|
|
104
106
|
it 'should include inspect of element' do
|
|
105
|
-
|
|
107
|
+
location_clause.should include(element.inspect)
|
|
106
108
|
end
|
|
107
109
|
end
|
|
108
110
|
|
|
@@ -142,7 +144,7 @@ RSpec.describe ParametersValidator do
|
|
|
142
144
|
end
|
|
143
145
|
|
|
144
146
|
it 'should call #length_error_at with :extreme => :few' do
|
|
145
|
-
|
|
147
|
+
parameters_validator.should_receive(:length_error_at).with(
|
|
146
148
|
hash_including(
|
|
147
149
|
:extreme => :few
|
|
148
150
|
)
|
|
@@ -154,7 +156,7 @@ RSpec.describe ParametersValidator do
|
|
|
154
156
|
it 'should record error' do
|
|
155
157
|
validate_each
|
|
156
158
|
|
|
157
|
-
|
|
159
|
+
errors.should_not be_empty
|
|
158
160
|
end
|
|
159
161
|
end
|
|
160
162
|
|
|
@@ -164,7 +166,7 @@ RSpec.describe ParametersValidator do
|
|
|
164
166
|
end
|
|
165
167
|
|
|
166
168
|
it 'should call #length_error_at with :extreme => :many' do
|
|
167
|
-
|
|
169
|
+
parameters_validator.should_receive(:length_error_at).with(
|
|
168
170
|
hash_including(
|
|
169
171
|
:extreme => :many
|
|
170
172
|
)
|
|
@@ -176,7 +178,7 @@ RSpec.describe ParametersValidator do
|
|
|
176
178
|
it 'should record error' do
|
|
177
179
|
validate_each
|
|
178
180
|
|
|
179
|
-
|
|
181
|
+
errors.should_not be_empty
|
|
180
182
|
end
|
|
181
183
|
end
|
|
182
184
|
|
|
@@ -201,7 +203,7 @@ RSpec.describe ParametersValidator do
|
|
|
201
203
|
end
|
|
202
204
|
|
|
203
205
|
it 'should call error_at with blank parameter name prefix' do
|
|
204
|
-
|
|
206
|
+
parameters_validator.should_receive(:error_at).with(
|
|
205
207
|
hash_including(
|
|
206
208
|
:prefix => 'has blank parameter name'
|
|
207
209
|
)
|
|
@@ -213,7 +215,7 @@ RSpec.describe ParametersValidator do
|
|
|
213
215
|
it 'should record error' do
|
|
214
216
|
validate_each
|
|
215
217
|
|
|
216
|
-
|
|
218
|
+
errors.should_not be_empty
|
|
217
219
|
end
|
|
218
220
|
end
|
|
219
221
|
|
|
@@ -225,7 +227,7 @@ RSpec.describe ParametersValidator do
|
|
|
225
227
|
it 'should not record error' do
|
|
226
228
|
validate_each
|
|
227
229
|
|
|
228
|
-
|
|
230
|
+
errors.should be_blank
|
|
229
231
|
end
|
|
230
232
|
end
|
|
231
233
|
end
|
|
@@ -236,7 +238,7 @@ RSpec.describe ParametersValidator do
|
|
|
236
238
|
end
|
|
237
239
|
|
|
238
240
|
it 'should call error_at with non-String prefix' do
|
|
239
|
-
|
|
241
|
+
parameters_validator.should_receive(:error_at).with(
|
|
240
242
|
hash_including(
|
|
241
243
|
:prefix => "has non-String parameter name (#{parameter_name.inspect})"
|
|
242
244
|
)
|
|
@@ -248,7 +250,7 @@ RSpec.describe ParametersValidator do
|
|
|
248
250
|
it 'should record error' do
|
|
249
251
|
validate_each
|
|
250
252
|
|
|
251
|
-
|
|
253
|
+
errors.should_not be_empty
|
|
252
254
|
end
|
|
253
255
|
end
|
|
254
256
|
end
|
|
@@ -262,7 +264,7 @@ RSpec.describe ParametersValidator do
|
|
|
262
264
|
it 'should not record error' do
|
|
263
265
|
validate_each
|
|
264
266
|
|
|
265
|
-
|
|
267
|
+
errors.should be_blank
|
|
266
268
|
end
|
|
267
269
|
end
|
|
268
270
|
|
|
@@ -272,7 +274,7 @@ RSpec.describe ParametersValidator do
|
|
|
272
274
|
end
|
|
273
275
|
|
|
274
276
|
it 'should call error_at with non-String prefix' do
|
|
275
|
-
|
|
277
|
+
parameters_validator.should_receive(:error_at).with(
|
|
276
278
|
hash_including(
|
|
277
279
|
:prefix => "has non-String parameter value (#{parameter_value.inspect})"
|
|
278
280
|
)
|
|
@@ -284,7 +286,7 @@ RSpec.describe ParametersValidator do
|
|
|
284
286
|
it 'should record error' do
|
|
285
287
|
validate_each
|
|
286
288
|
|
|
287
|
-
|
|
289
|
+
errors.should_not be_empty
|
|
288
290
|
end
|
|
289
291
|
end
|
|
290
292
|
end
|
|
@@ -297,7 +299,7 @@ RSpec.describe ParametersValidator do
|
|
|
297
299
|
end
|
|
298
300
|
|
|
299
301
|
it 'should use #error_at with has non-Array for prefix' do
|
|
300
|
-
|
|
302
|
+
parameters_validator.should_receive(:error_at).with(
|
|
301
303
|
hash_including(
|
|
302
304
|
:prefix => 'has non-Array'
|
|
303
305
|
)
|
|
@@ -309,7 +311,7 @@ RSpec.describe ParametersValidator do
|
|
|
309
311
|
it 'should record error' do
|
|
310
312
|
validate_each
|
|
311
313
|
|
|
312
|
-
|
|
314
|
+
errors.should_not be_empty
|
|
313
315
|
end
|
|
314
316
|
end
|
|
315
317
|
end
|
|
@@ -325,16 +327,14 @@ RSpec.describe ParametersValidator do
|
|
|
325
327
|
end
|
|
326
328
|
|
|
327
329
|
it 'should error that attribute is not an array' do
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
}
|
|
332
|
-
).to eq(true)
|
|
330
|
+
errors.any? { |error|
|
|
331
|
+
error.include? 'is not an Array.'
|
|
332
|
+
}.should be_true
|
|
333
333
|
end
|
|
334
334
|
|
|
335
335
|
it 'should include TYPE_SIGNATURE_SENTENCE' do
|
|
336
336
|
errors.each do |error|
|
|
337
|
-
|
|
337
|
+
error.should include(type_signature_sentence)
|
|
338
338
|
end
|
|
339
339
|
end
|
|
340
340
|
end
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe PasswordIsStrongValidator do
|
|
2
4
|
|
|
3
5
|
subject(:password_validator) do
|
|
4
6
|
described_class.new(
|
|
@@ -18,23 +20,23 @@ RSpec.describe PasswordIsStrongValidator do
|
|
|
18
20
|
context '#contains_repetition?' do
|
|
19
21
|
|
|
20
22
|
it 'should return true for aaaa' do
|
|
21
|
-
|
|
23
|
+
password_validator.send(:contains_repetition?, 'aaaa').should be_true
|
|
22
24
|
end
|
|
23
25
|
|
|
24
26
|
it 'should return true for ababab' do
|
|
25
|
-
|
|
27
|
+
password_validator.send(:contains_repetition?, 'ababab').should be_true
|
|
26
28
|
end
|
|
27
29
|
|
|
28
30
|
it 'should return true for abcabcabc' do
|
|
29
|
-
|
|
31
|
+
password_validator.send(:contains_repetition?, 'abcabcabc').should be_true
|
|
30
32
|
end
|
|
31
33
|
|
|
32
34
|
it 'should return true for abcdabcd' do
|
|
33
|
-
|
|
35
|
+
password_validator.send(:contains_repetition?, 'abcdabcd').should be_true
|
|
34
36
|
end
|
|
35
37
|
|
|
36
38
|
it 'should return false for abcd1234abcd' do
|
|
37
|
-
|
|
39
|
+
password_validator.send(:contains_repetition?, 'abcd1234abcd').should be_false
|
|
38
40
|
end
|
|
39
41
|
|
|
40
42
|
end
|
|
@@ -110,7 +112,7 @@ RSpec.describe PasswordIsStrongValidator do
|
|
|
110
112
|
]
|
|
111
113
|
|
|
112
114
|
it 'should return all the expected mutations of a password' do
|
|
113
|
-
|
|
115
|
+
password_validator.send(:mutate_pass, 'metasploit').should == variants
|
|
114
116
|
end
|
|
115
117
|
|
|
116
118
|
end
|
|
@@ -121,81 +123,81 @@ RSpec.describe PasswordIsStrongValidator do
|
|
|
121
123
|
PasswordIsStrongValidator::COMMON_PASSWORDS.each do |password|
|
|
122
124
|
|
|
123
125
|
it "should return true for #{password}" do
|
|
124
|
-
|
|
126
|
+
password_validator.send(:is_common_password?, password).should be_true
|
|
125
127
|
end
|
|
126
128
|
|
|
127
129
|
it "should return true for #{password}!" do
|
|
128
|
-
|
|
130
|
+
password_validator.send(:is_common_password?, "#{password}!").should be_true
|
|
129
131
|
end
|
|
130
132
|
|
|
131
133
|
it "should return true for #{password}1" do
|
|
132
|
-
|
|
134
|
+
password_validator.send(:is_common_password?, "#{password}1").should be_true
|
|
133
135
|
end
|
|
134
136
|
|
|
135
137
|
it "should return true for #{password}9" do
|
|
136
|
-
|
|
138
|
+
password_validator.send(:is_common_password?, "#{password}1").should be_true
|
|
137
139
|
end
|
|
138
140
|
|
|
139
141
|
it "should return true for #{password}99" do
|
|
140
|
-
|
|
142
|
+
password_validator.send(:is_common_password?, "#{password}12").should be_true
|
|
141
143
|
end
|
|
142
144
|
|
|
143
145
|
it "should return true for #{password}123" do
|
|
144
|
-
|
|
146
|
+
password_validator.send(:is_common_password?, "#{password}123").should be_true
|
|
145
147
|
end
|
|
146
148
|
|
|
147
149
|
it "should return true for #{password}123!" do
|
|
148
|
-
|
|
150
|
+
password_validator.send(:is_common_password?, "#{password}123!").should be_true
|
|
149
151
|
end
|
|
150
152
|
|
|
151
153
|
end
|
|
152
154
|
|
|
153
155
|
it "should return true for r00t" do
|
|
154
|
-
|
|
156
|
+
password_validator.send(:is_common_password?, "r00t").should be_true
|
|
155
157
|
end
|
|
156
158
|
|
|
157
159
|
it "should return true for m3t@spl0it" do
|
|
158
|
-
|
|
160
|
+
password_validator.send(:is_common_password?, "m3t@spl0it").should be_true
|
|
159
161
|
end
|
|
160
162
|
|
|
161
163
|
it "should return true for m3t@spl0it123!" do
|
|
162
|
-
|
|
164
|
+
password_validator.send(:is_common_password?, "m3t@spl0it123!").should be_true
|
|
163
165
|
end
|
|
164
166
|
end
|
|
165
167
|
|
|
166
168
|
context '#contains_username' do
|
|
167
169
|
|
|
168
170
|
it 'should return true if username and password are the same' do
|
|
169
|
-
|
|
171
|
+
password_validator.send(:contains_username?, 'admin', 'admin').should be_true
|
|
170
172
|
end
|
|
171
173
|
|
|
172
174
|
it 'should return true if the password contains the username as part of it' do
|
|
173
|
-
|
|
175
|
+
password_validator.send(:contains_username?, 'admin', '123admin123').should be_true
|
|
174
176
|
end
|
|
175
177
|
|
|
176
178
|
it 'should return false otherwise' do
|
|
177
|
-
|
|
179
|
+
password_validator.send(:contains_username?, 'admin', 'foobar').should be_false
|
|
178
180
|
end
|
|
179
181
|
end
|
|
180
182
|
|
|
181
183
|
context '#is_simple?' do
|
|
182
184
|
|
|
183
185
|
it "should return true if no number" do
|
|
184
|
-
|
|
186
|
+
password_validator.send(:is_simple?, "b@carat").should be_true
|
|
185
187
|
end
|
|
186
188
|
|
|
187
189
|
it "should return true if no special char" do
|
|
188
|
-
|
|
190
|
+
password_validator.send(:is_simple?, "bacarat4").should be_true
|
|
189
191
|
end
|
|
190
192
|
|
|
191
193
|
it "should return true if no letters" do
|
|
192
|
-
|
|
194
|
+
password_validator.send(:is_simple?, "1337").should be_true
|
|
193
195
|
end
|
|
194
196
|
|
|
195
197
|
PasswordIsStrongValidator::SPECIAL_CHARS.each_char do |char|
|
|
196
198
|
|
|
197
199
|
it "should return false with a #{char}" do
|
|
198
|
-
|
|
200
|
+
password_validator.send(:is_simple?, "bacarat4#{char}").should be_false
|
|
199
201
|
end
|
|
200
202
|
end
|
|
201
203
|
end
|
|
@@ -210,23 +212,13 @@ RSpec.describe PasswordIsStrongValidator do
|
|
|
210
212
|
password_validator.validate_each(record, attribute, value)
|
|
211
213
|
end
|
|
212
214
|
|
|
213
|
-
let(:record)
|
|
214
|
-
|
|
215
|
-
|
|
215
|
+
let(:record) do
|
|
216
|
+
Object.new.tap { |object|
|
|
217
|
+
object.extend ActiveModel::Validations
|
|
218
|
+
object.class.module_eval { attr_accessor :username }
|
|
219
|
+
object.username = 'admin'
|
|
216
220
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
let(:record_class) {
|
|
220
|
-
Class.new do
|
|
221
|
-
include ActiveModel::Validations
|
|
222
|
-
|
|
223
|
-
#
|
|
224
|
-
# Attributes
|
|
225
|
-
#
|
|
226
|
-
|
|
227
|
-
attr_accessor :username
|
|
228
|
-
end
|
|
229
|
-
}
|
|
221
|
+
end
|
|
230
222
|
|
|
231
223
|
|
|
232
224
|
context 'with a password with no special char' do
|
|
@@ -234,12 +226,12 @@ RSpec.describe PasswordIsStrongValidator do
|
|
|
234
226
|
|
|
235
227
|
it 'should record an error' do
|
|
236
228
|
validate_each
|
|
237
|
-
|
|
229
|
+
errors.should_not be_empty
|
|
238
230
|
end
|
|
239
231
|
|
|
240
232
|
it 'should have an error of "must contain letters, numbers, and at least one special character"' do
|
|
241
233
|
validate_each
|
|
242
|
-
|
|
234
|
+
errors.include?("must contain letters, numbers, and at least one special character").should be_true
|
|
243
235
|
end
|
|
244
236
|
end
|
|
245
237
|
|
|
@@ -248,12 +240,12 @@ RSpec.describe PasswordIsStrongValidator do
|
|
|
248
240
|
|
|
249
241
|
it 'should record an error' do
|
|
250
242
|
validate_each
|
|
251
|
-
|
|
243
|
+
errors.should_not be_empty
|
|
252
244
|
end
|
|
253
245
|
|
|
254
246
|
it 'should have an error of "must contain letters, numbers, and at least one special character"' do
|
|
255
247
|
validate_each
|
|
256
|
-
|
|
248
|
+
errors.include?("must contain letters, numbers, and at least one special character").should be_true
|
|
257
249
|
end
|
|
258
250
|
end
|
|
259
251
|
|
|
@@ -262,12 +254,12 @@ RSpec.describe PasswordIsStrongValidator do
|
|
|
262
254
|
|
|
263
255
|
it 'should record an error' do
|
|
264
256
|
validate_each
|
|
265
|
-
|
|
257
|
+
errors.should_not be_empty
|
|
266
258
|
end
|
|
267
259
|
|
|
268
260
|
it 'should have an error of "must contain letters, numbers, and at least one special character"' do
|
|
269
261
|
validate_each
|
|
270
|
-
|
|
262
|
+
errors.include?("must contain letters, numbers, and at least one special character").should be_true
|
|
271
263
|
end
|
|
272
264
|
end
|
|
273
265
|
|
|
@@ -276,12 +268,12 @@ RSpec.describe PasswordIsStrongValidator do
|
|
|
276
268
|
|
|
277
269
|
it 'should record an error' do
|
|
278
270
|
validate_each
|
|
279
|
-
|
|
271
|
+
errors.should_not be_empty
|
|
280
272
|
end
|
|
281
273
|
|
|
282
274
|
it 'should have an error of "must not contain the username"' do
|
|
283
275
|
validate_each
|
|
284
|
-
|
|
276
|
+
errors.include?("must not contain the username").should be_true
|
|
285
277
|
end
|
|
286
278
|
end
|
|
287
279
|
|
|
@@ -290,12 +282,12 @@ RSpec.describe PasswordIsStrongValidator do
|
|
|
290
282
|
|
|
291
283
|
it 'should record an error' do
|
|
292
284
|
validate_each
|
|
293
|
-
|
|
285
|
+
errors.should_not be_empty
|
|
294
286
|
end
|
|
295
287
|
|
|
296
288
|
it 'should have an error of "must not be a common password"' do
|
|
297
289
|
validate_each
|
|
298
|
-
|
|
290
|
+
errors.include?("must not be a common password").should be_true
|
|
299
291
|
end
|
|
300
292
|
end
|
|
301
293
|
|
|
@@ -304,12 +296,12 @@ RSpec.describe PasswordIsStrongValidator do
|
|
|
304
296
|
|
|
305
297
|
it 'should record an error' do
|
|
306
298
|
validate_each
|
|
307
|
-
|
|
299
|
+
errors.should_not be_empty
|
|
308
300
|
end
|
|
309
301
|
|
|
310
302
|
it 'should have an error of "must not be a common password"' do
|
|
311
303
|
validate_each
|
|
312
|
-
|
|
304
|
+
errors.include?("must not be a common password").should be_true
|
|
313
305
|
end
|
|
314
306
|
end
|
|
315
307
|
|
|
@@ -318,12 +310,12 @@ RSpec.describe PasswordIsStrongValidator do
|
|
|
318
310
|
|
|
319
311
|
it 'should record an error' do
|
|
320
312
|
validate_each
|
|
321
|
-
|
|
313
|
+
errors.should_not be_empty
|
|
322
314
|
end
|
|
323
315
|
|
|
324
316
|
it 'should have an error of "must not be a predictable sequence of characters"' do
|
|
325
317
|
validate_each
|
|
326
|
-
|
|
318
|
+
errors.include?("must not be a predictable sequence of characters").should be_true
|
|
327
319
|
end
|
|
328
320
|
end
|
|
329
321
|
|