metasploit-model 0.25.7 → 0.26.1
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 +8 -8
- data/app/models/metasploit/model/search/operation/association.rb +57 -0
- data/app/models/metasploit/model/search/operator/association.rb +24 -14
- data/app/models/metasploit/model/search/operator/base.rb +19 -3
- data/app/models/metasploit/model/search/operator/single.rb +21 -1
- data/app/models/metasploit/model/search/query.rb +20 -1
- data/lib/metasploit/model/association/tree.rb +130 -0
- data/lib/metasploit/model/search.rb +61 -27
- data/lib/metasploit/model/search/association.rb +152 -8
- data/lib/metasploit/model/search/attribute.rb +112 -22
- data/lib/metasploit/model/search/operator.rb +53 -1
- data/lib/metasploit/model/search/operator/help.rb +39 -1
- data/lib/metasploit/model/search/with.rb +44 -1
- data/lib/metasploit/model/version.rb +2 -2
- data/spec/app/models/metasploit/model/search/operation/association_spec.rb +67 -0
- data/spec/app/models/metasploit/model/search/operator/association_spec.rb +76 -76
- data/spec/app/models/metasploit/model/search/operator/deprecated/author_spec.rb +54 -18
- data/spec/app/models/metasploit/model/search/operator/deprecated/authority_spec.rb +20 -8
- data/spec/app/models/metasploit/model/search/operator/deprecated/platform_spec.rb +20 -8
- data/spec/app/models/metasploit/model/search/operator/deprecated/ref_spec.rb +86 -26
- data/spec/app/models/metasploit/model/search/operator/deprecated/text_spec.rb +63 -21
- data/spec/lib/metasploit/model/search/association/tree_spec.rb +385 -0
- data/spec/lib/metasploit/model/search/association_spec.rb +99 -10
- data/spec/lib/metasploit/model/search_spec.rb +48 -107
- data/spec/support/shared/examples/search/query/metasploit/model/search/operator/deprecated/authority.rb +19 -7
- metadata +7 -1
@@ -5,9 +5,9 @@ module Metasploit
|
|
5
5
|
# The major version number.
|
6
6
|
MAJOR = 0
|
7
7
|
# The minor version number, scoped to the {MAJOR} version number.
|
8
|
-
MINOR =
|
8
|
+
MINOR = 26
|
9
9
|
# The patch number, scoped to the {MINOR} version number.
|
10
|
-
PATCH =
|
10
|
+
PATCH = 1
|
11
11
|
|
12
12
|
# The full version string, including the {MAJOR}, {MINOR}, {PATCH}, and optionally, the {PRERELEASE} in the
|
13
13
|
# {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Metasploit::Model::Search::Operation::Association do
|
4
|
+
subject(:operation) {
|
5
|
+
described_class.new(
|
6
|
+
source_operation: source_operation
|
7
|
+
)
|
8
|
+
}
|
9
|
+
|
10
|
+
let(:source_operation) {
|
11
|
+
nil
|
12
|
+
}
|
13
|
+
|
14
|
+
context 'validation' do
|
15
|
+
before(:each) do
|
16
|
+
operation.valid?
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'errors on #source_operation' do
|
20
|
+
subject(:source_operation_errors) {
|
21
|
+
operation.errors[:source_operation]
|
22
|
+
}
|
23
|
+
|
24
|
+
let(:invalid_error) {
|
25
|
+
I18n.translate!('errors.messages.invalid')
|
26
|
+
}
|
27
|
+
|
28
|
+
context 'with #source_operation' do
|
29
|
+
let(:source_operation) {
|
30
|
+
double('#source_operation', valid?: valid)
|
31
|
+
}
|
32
|
+
|
33
|
+
context 'with valid' do
|
34
|
+
let(:valid) {
|
35
|
+
true
|
36
|
+
}
|
37
|
+
|
38
|
+
it { should_not include(invalid_error) }
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'without valid' do
|
42
|
+
let(:valid) {
|
43
|
+
false
|
44
|
+
}
|
45
|
+
|
46
|
+
it { should include(invalid_error) }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'without #source_operation' do
|
51
|
+
let(:blank_error) {
|
52
|
+
I18n.translate!('errors.messages.blank')
|
53
|
+
}
|
54
|
+
|
55
|
+
let(:source_operation) {
|
56
|
+
nil
|
57
|
+
}
|
58
|
+
|
59
|
+
it { should include(blank_error) }
|
60
|
+
it { should_not include(invalid_error) }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it { should_not respond_to :value }
|
66
|
+
it { should_not respond_to :value= }
|
67
|
+
end
|
@@ -1,108 +1,108 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Metasploit::Model::Search::Operator::Association do
|
4
|
-
|
4
|
+
subject(:operator) do
|
5
|
+
described_class.new(
|
6
|
+
:association => association,
|
7
|
+
:source_operator => source_operator
|
8
|
+
)
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:association) do
|
12
|
+
FactoryGirl.generate :metasploit_model_search_operator_association_association
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:source_operator) do
|
16
|
+
double('Metasploit::Model::Search::Operator::Base')
|
17
|
+
end
|
18
|
+
|
19
|
+
it { should be_a Metasploit::Model::Search::Operator::Base }
|
5
20
|
|
6
21
|
context 'validations' do
|
7
22
|
it { should validate_presence_of(:association) }
|
8
|
-
it { should validate_presence_of(:
|
23
|
+
it { should validate_presence_of(:source_operator) }
|
9
24
|
end
|
10
25
|
|
11
|
-
context '
|
12
|
-
|
13
|
-
|
26
|
+
context '#help' do
|
27
|
+
subject(:help) do
|
28
|
+
operator.help
|
14
29
|
end
|
15
30
|
|
16
|
-
|
17
|
-
|
18
|
-
:association => association,
|
19
|
-
:attribute_operator => attribute_operator
|
20
|
-
)
|
21
|
-
end
|
31
|
+
it 'should delegate to #source_operator' do
|
32
|
+
expect(source_operator).to receive(:help)
|
22
33
|
|
23
|
-
|
24
|
-
double('Metasploit::Model::Search::Operator::Attribute')
|
34
|
+
help
|
25
35
|
end
|
36
|
+
end
|
26
37
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'should delegate to #attribute_operator' do
|
33
|
-
attribute_operator.should_receive(:attribute)
|
34
|
-
|
35
|
-
attribute
|
36
|
-
end
|
38
|
+
context '#name' do
|
39
|
+
subject(:name) do
|
40
|
+
operator.name
|
37
41
|
end
|
38
42
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
attribute_operator.should_receive(:attribute_set)
|
43
|
+
let(:source_operator) {
|
44
|
+
double(
|
45
|
+
'Metasploit::Model::Search::Operator::Base',
|
46
|
+
name: source_operator_name
|
47
|
+
)
|
48
|
+
}
|
46
49
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
+
let(:source_operator_name) {
|
51
|
+
'source_operator_name'
|
52
|
+
}
|
50
53
|
|
51
|
-
|
52
|
-
subject(:help) do
|
53
|
-
association_operator.help
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'should delegate to #attribute_operator' do
|
57
|
-
attribute_operator.should_receive(:help)
|
54
|
+
it { should be_a Symbol }
|
58
55
|
|
59
|
-
|
60
|
-
|
56
|
+
it 'should be <association>.<source_operator.name>' do
|
57
|
+
expect(name).to eq :"#{association}.#{source_operator_name}"
|
61
58
|
end
|
59
|
+
end
|
62
60
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
61
|
+
context '#operate_on' do
|
62
|
+
subject(:operate_on) {
|
63
|
+
operator.operate_on(formatted_value)
|
64
|
+
}
|
67
65
|
|
68
|
-
|
69
|
-
|
66
|
+
#
|
67
|
+
# lets
|
68
|
+
#
|
70
69
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
70
|
+
let(:expected_source_operation) {
|
71
|
+
double('source operation')
|
72
|
+
}
|
75
73
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
end
|
74
|
+
let(:formatted_value) {
|
75
|
+
'formatted-value'
|
76
|
+
}
|
80
77
|
|
81
|
-
let(:
|
82
|
-
|
83
|
-
|
78
|
+
let(:source_operator) {
|
79
|
+
super().tap { |source_operator|
|
80
|
+
expect(source_operator).to receive(:operate_on).with(formatted_value).and_return(expected_source_operation)
|
81
|
+
}
|
82
|
+
}
|
84
83
|
|
85
|
-
|
86
|
-
described_class.new(
|
87
|
-
:association => association,
|
88
|
-
:attribute_operator => attribute_operator
|
89
|
-
)
|
90
|
-
end
|
84
|
+
it { should be_a Metasploit::Model::Search::Operation::Association }
|
91
85
|
|
92
|
-
|
93
|
-
|
94
|
-
|
86
|
+
context 'Metasploit::Model::Search::Operation::Association' do
|
87
|
+
context '#operator' do
|
88
|
+
subject(:operation_operator) {
|
89
|
+
operate_on.operator
|
90
|
+
}
|
95
91
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
end
|
92
|
+
it 'is this association operator' do
|
93
|
+
expect(operation_operator).to eq(operator)
|
94
|
+
end
|
95
|
+
end
|
101
96
|
|
102
|
-
|
97
|
+
context '#source_operation' do
|
98
|
+
subject(:source_operation) {
|
99
|
+
operate_on.source_operation
|
100
|
+
}
|
103
101
|
|
104
|
-
|
105
|
-
|
102
|
+
it 'is operation from Metasploit::Model::Search::Operator::Association#source_operator' do
|
103
|
+
expect(source_operation).to eq(expected_source_operation)
|
104
|
+
end
|
105
|
+
end
|
106
106
|
end
|
107
107
|
end
|
108
108
|
end
|
@@ -23,8 +23,8 @@ describe Metasploit::Model::Search::Operator::Deprecated::Author do
|
|
23
23
|
let(:authors_name_operator) do
|
24
24
|
Metasploit::Model::Search::Operator::Association.new(
|
25
25
|
:association => :authors,
|
26
|
-
:
|
27
|
-
:
|
26
|
+
:klass => klass,
|
27
|
+
:source_operator => name_operator
|
28
28
|
)
|
29
29
|
end
|
30
30
|
|
@@ -43,16 +43,16 @@ describe Metasploit::Model::Search::Operator::Deprecated::Author do
|
|
43
43
|
let(:email_addresses_domain_operator) do
|
44
44
|
Metasploit::Model::Search::Operator::Association.new(
|
45
45
|
:association => :email_addresses,
|
46
|
-
:
|
47
|
-
:
|
46
|
+
:klass => klass,
|
47
|
+
:source_operator => domain_operator
|
48
48
|
)
|
49
49
|
end
|
50
50
|
|
51
51
|
let(:email_addresses_local_operator) do
|
52
52
|
Metasploit::Model::Search::Operator::Association.new(
|
53
53
|
:association => :email_addresses,
|
54
|
-
:
|
55
|
-
:
|
54
|
+
:klass => klass,
|
55
|
+
:source_operator => local_operator
|
56
56
|
)
|
57
57
|
end
|
58
58
|
|
@@ -96,8 +96,14 @@ describe Metasploit::Model::Search::Operator::Deprecated::Author do
|
|
96
96
|
child('authors.name')
|
97
97
|
end
|
98
98
|
|
99
|
-
|
100
|
-
|
99
|
+
context 'Metasploit::Model::Search::Operation::Association#source_operation' do
|
100
|
+
subject(:source_operation) {
|
101
|
+
operation.source_operation
|
102
|
+
}
|
103
|
+
|
104
|
+
it 'uses entire formatted value' do
|
105
|
+
expect(source_operation.value).to eq(formatted_value)
|
106
|
+
end
|
101
107
|
end
|
102
108
|
end
|
103
109
|
|
@@ -106,8 +112,14 @@ describe Metasploit::Model::Search::Operator::Deprecated::Author do
|
|
106
112
|
child('email_addresses.domain')
|
107
113
|
end
|
108
114
|
|
109
|
-
|
110
|
-
|
115
|
+
context 'Metasploit::Model::Search::Operation::Association#source_operation' do
|
116
|
+
subject(:source_operation) {
|
117
|
+
operation.source_operation
|
118
|
+
}
|
119
|
+
|
120
|
+
it "uses portion of formatted value after '@'" do
|
121
|
+
expect(source_operation.value).to eq(domain)
|
122
|
+
end
|
111
123
|
end
|
112
124
|
end
|
113
125
|
|
@@ -116,8 +128,14 @@ describe Metasploit::Model::Search::Operator::Deprecated::Author do
|
|
116
128
|
child('email_addresses.local')
|
117
129
|
end
|
118
130
|
|
119
|
-
|
120
|
-
|
131
|
+
context 'Metasploit::Model::Search::Operation::Association#source_operation' do
|
132
|
+
subject(:source_operation) {
|
133
|
+
operation.source_operation
|
134
|
+
}
|
135
|
+
|
136
|
+
it "uses portion of formated value before '@'" do
|
137
|
+
expect(source_operation.value).to eq(local)
|
138
|
+
end
|
121
139
|
end
|
122
140
|
end
|
123
141
|
end
|
@@ -132,8 +150,14 @@ describe Metasploit::Model::Search::Operator::Deprecated::Author do
|
|
132
150
|
child('authors.name')
|
133
151
|
end
|
134
152
|
|
135
|
-
|
136
|
-
|
153
|
+
context 'Metasploit::Model::Search::Operation::Association#source_operation' do
|
154
|
+
subject(:source_operation) {
|
155
|
+
operation.source_operation
|
156
|
+
}
|
157
|
+
|
158
|
+
it 'uses entire formatted value' do
|
159
|
+
expect(source_operation.value).to eq(formatted_value)
|
160
|
+
end
|
137
161
|
end
|
138
162
|
end
|
139
163
|
|
@@ -142,8 +166,14 @@ describe Metasploit::Model::Search::Operator::Deprecated::Author do
|
|
142
166
|
child('email_addresses.domain')
|
143
167
|
end
|
144
168
|
|
145
|
-
|
146
|
-
|
169
|
+
context 'Metasploit::Model::Search::Operation::Association#source_operation' do
|
170
|
+
subject(:source_operation) {
|
171
|
+
operation.source_operation
|
172
|
+
}
|
173
|
+
|
174
|
+
it 'uses entire formatted value' do
|
175
|
+
expect(source_operation.value).to eq(formatted_value)
|
176
|
+
end
|
147
177
|
end
|
148
178
|
end
|
149
179
|
|
@@ -152,8 +182,14 @@ describe Metasploit::Model::Search::Operator::Deprecated::Author do
|
|
152
182
|
child('email_addresses.local')
|
153
183
|
end
|
154
184
|
|
155
|
-
|
156
|
-
|
185
|
+
context 'Metasploit::Model::Search::Operation::Association#source_operation' do
|
186
|
+
subject(:source_operation) {
|
187
|
+
operation.source_operation
|
188
|
+
}
|
189
|
+
|
190
|
+
it 'uses entire formatted value' do
|
191
|
+
expect(source_operation.value).to eq(formatted_value)
|
192
|
+
end
|
157
193
|
end
|
158
194
|
end
|
159
195
|
end
|
@@ -66,8 +66,8 @@ describe Metasploit::Model::Search::Operator::Deprecated::Authority do
|
|
66
66
|
let(:authorities_abbreviation_operator) do
|
67
67
|
Metasploit::Model::Search::Operator::Association.new(
|
68
68
|
:association => :authorities,
|
69
|
-
:
|
70
|
-
:
|
69
|
+
:klass => klass,
|
70
|
+
:source_operator => abbreviation_operator
|
71
71
|
)
|
72
72
|
end
|
73
73
|
|
@@ -90,8 +90,8 @@ describe Metasploit::Model::Search::Operator::Deprecated::Authority do
|
|
90
90
|
let(:references_designation_operator) do
|
91
91
|
Metasploit::Model::Search::Operator::Association.new(
|
92
92
|
:association => :references,
|
93
|
-
:
|
94
|
-
:
|
93
|
+
:klass => klass,
|
94
|
+
:source_operator => designation_operator
|
95
95
|
)
|
96
96
|
end
|
97
97
|
|
@@ -105,8 +105,14 @@ describe Metasploit::Model::Search::Operator::Deprecated::Authority do
|
|
105
105
|
operation_named('authorities.abbreviation')
|
106
106
|
end
|
107
107
|
|
108
|
-
|
109
|
-
|
108
|
+
context 'Metasploit::Model::Search::Operation::Association#source_operation' do
|
109
|
+
subject(:source_operation) {
|
110
|
+
operation.source_operation
|
111
|
+
}
|
112
|
+
|
113
|
+
it 'uses #abbreviation for value' do
|
114
|
+
expect(source_operation.value).to eq(abbreviation)
|
115
|
+
end
|
110
116
|
end
|
111
117
|
end
|
112
118
|
|
@@ -115,8 +121,14 @@ describe Metasploit::Model::Search::Operator::Deprecated::Authority do
|
|
115
121
|
operation_named('references.designation')
|
116
122
|
end
|
117
123
|
|
118
|
-
|
119
|
-
|
124
|
+
context 'Metasploit::Model::Search::Operation::Association#source_operation' do
|
125
|
+
subject(:source_operation) {
|
126
|
+
operation.source_operation
|
127
|
+
}
|
128
|
+
|
129
|
+
it 'uses formatted value for value' do
|
130
|
+
expect(source_operation.value).to eq(formatted_value)
|
131
|
+
end
|
120
132
|
end
|
121
133
|
end
|
122
134
|
end
|