metasploit_data_models 4.0.1 → 4.1.3
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.github/workflows/verify.yml +75 -0
- data/app/models/mdm/nexpose_console.rb +7 -4
- data/app/models/mdm/note.rb +1 -1
- data/app/models/mdm/workspace.rb +6 -5
- data/app/models/metasploit_data_models/search/visitor/where.rb +1 -1
- data/db/migrate/20190308134512_create_async_callbacks.rb +0 -1
- data/lib/metasploit_data_models/version.rb +1 -1
- data/metasploit_data_models.gemspec +9 -18
- data/spec/app/models/mdm/host_spec.rb +27 -27
- data/spec/app/models/mdm/nexpose_console_spec.rb +15 -1
- data/spec/app/models/metasploit_data_models/ip_address/v4/segment/single_spec.rb +3 -3
- data/spec/app/models/metasploit_data_models/search/visitor/where_spec.rb +1 -1
- data/spec/dummy/config/{database.yml.travis → database.yml.github_actions} +4 -5
- metadata +43 -42
- metadata.gz.sig +0 -0
- data/.travis.yml +0 -22
- data/app/validators/ip_format_validator.rb +0 -22
- data/app/validators/parameters_validator.rb +0 -129
- data/app/validators/password_is_strong_validator.rb +0 -117
- data/bin/mdm_console +0 -68
- data/bin/rails +0 -14
- data/spec/app/validators/parameters_validator_spec.rb +0 -342
- data/spec/app/validators/password_is_strong_validator_spec.rb +0 -332
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7555384d31f970a18a9bbb5690a7222a786cdb966756007c3a1cfdc5075d4d36
|
4
|
+
data.tar.gz: deb67f833fd87103497c280059aee0636a247086e80d2b242709b78635943d76
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b35cf1660e18548a48ce3692a7536077544359a4cfb9d154c89b0a211f7ae2727ffa06501399eebfb1963531ce6a2f849ad1493918a893c0af454cce6b7598c
|
7
|
+
data.tar.gz: f43f98fce153d3774967efe636f7e53fd743f550ab37ee3856bb8f36e269c188ccd44823ae724e4f31c412833cba92809a9adc122106b1f94612ba0c0c318bc9
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
@@ -0,0 +1,75 @@
|
|
1
|
+
name: Verify
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- '*'
|
7
|
+
pull_request:
|
8
|
+
branches:
|
9
|
+
- '*'
|
10
|
+
|
11
|
+
jobs:
|
12
|
+
test:
|
13
|
+
runs-on: ubuntu-16.04
|
14
|
+
timeout-minutes: 40
|
15
|
+
|
16
|
+
services:
|
17
|
+
postgres:
|
18
|
+
image: postgres:9.6
|
19
|
+
ports: ["5432:5432"]
|
20
|
+
env:
|
21
|
+
POSTGRES_USER: postgres
|
22
|
+
POSTGRES_PASSWORD: postgres
|
23
|
+
options: >-
|
24
|
+
--health-cmd pg_isready
|
25
|
+
--health-interval 10s
|
26
|
+
--health-timeout 5s
|
27
|
+
--health-retries 5
|
28
|
+
|
29
|
+
strategy:
|
30
|
+
fail-fast: true
|
31
|
+
matrix:
|
32
|
+
ruby:
|
33
|
+
- 2.7
|
34
|
+
|
35
|
+
env:
|
36
|
+
RAILS_ENV: test
|
37
|
+
|
38
|
+
name: Ruby ${{ matrix.ruby }}
|
39
|
+
steps:
|
40
|
+
- name: Install system dependencies
|
41
|
+
run: sudo apt-get install libpcap-dev graphviz
|
42
|
+
|
43
|
+
- name: Checkout code
|
44
|
+
uses: actions/checkout@v2
|
45
|
+
|
46
|
+
- uses: actions/setup-ruby@v1
|
47
|
+
with:
|
48
|
+
ruby-version: ${{ matrix.ruby }}
|
49
|
+
|
50
|
+
- name: Setup bundler
|
51
|
+
run: |
|
52
|
+
gem install bundler
|
53
|
+
|
54
|
+
- uses: actions/cache@v2
|
55
|
+
with:
|
56
|
+
path: vendor/bundle
|
57
|
+
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
|
58
|
+
restore-keys: |
|
59
|
+
${{ runner.os }}-gems-
|
60
|
+
|
61
|
+
- name: Bundle install
|
62
|
+
run: |
|
63
|
+
bundle config path vendor/bundle
|
64
|
+
bundle install --jobs 4 --retry 3
|
65
|
+
|
66
|
+
- name: Test
|
67
|
+
run: |
|
68
|
+
cp spec/dummy/config/database.yml.github_actions spec/dummy/config/database.yml
|
69
|
+
bundle exec rake --version
|
70
|
+
bundle exec rake db:create db:migrate
|
71
|
+
|
72
|
+
# Disabling this check because it is proving unreliable
|
73
|
+
# git diff --exit-code spec/dummy/db/structure.sql
|
74
|
+
bundle exec rake spec
|
75
|
+
bundle exec rake yard
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# A connection to Nexpose from Metasploit.
|
2
2
|
class Mdm::NexposeConsole < ApplicationRecord
|
3
|
-
|
4
3
|
#
|
5
4
|
# Associations
|
6
5
|
#
|
@@ -80,7 +79,7 @@ class Mdm::NexposeConsole < ApplicationRecord
|
|
80
79
|
# Callbacks
|
81
80
|
#
|
82
81
|
|
83
|
-
|
82
|
+
before_validation :strip_protocol
|
84
83
|
|
85
84
|
#
|
86
85
|
# Serializations
|
@@ -96,10 +95,14 @@ class Mdm::NexposeConsole < ApplicationRecord
|
|
96
95
|
# Validations
|
97
96
|
#
|
98
97
|
|
99
|
-
validates :address, :presence => true
|
98
|
+
validates :address, :presence => true, :address_format => true
|
99
|
+
|
100
100
|
validates :name, :presence => true
|
101
|
+
|
101
102
|
validates :password, :presence => true
|
103
|
+
|
102
104
|
validates :port, :numericality => { :only_integer => true }, :inclusion => {:in => 1..65535}
|
105
|
+
|
103
106
|
validates :username, :presence => true
|
104
107
|
|
105
108
|
#
|
@@ -110,7 +113,7 @@ class Mdm::NexposeConsole < ApplicationRecord
|
|
110
113
|
#
|
111
114
|
# @return [void]
|
112
115
|
def strip_protocol
|
113
|
-
self.address.gsub!(/^http(s)*:\/\//i,'')
|
116
|
+
self.address.gsub!(/^http(s)*:\/\//i,'') unless self.address.nil?
|
114
117
|
end
|
115
118
|
|
116
119
|
Metasploit::Concern.run(self)
|
data/app/models/mdm/note.rb
CHANGED
@@ -113,7 +113,7 @@ class Mdm::Note < ApplicationRecord
|
|
113
113
|
#
|
114
114
|
# @return [void]
|
115
115
|
def normalize
|
116
|
-
if
|
116
|
+
if saved_change_to_data? and ntype =~ /fingerprint/ && host.workspace.present? && !host.workspace.import_fingerprint
|
117
117
|
host.normalize_os
|
118
118
|
end
|
119
119
|
end
|
data/app/models/mdm/workspace.rb
CHANGED
@@ -21,11 +21,6 @@ class Mdm::Workspace < ApplicationRecord
|
|
21
21
|
class_name: 'MetasploitDataModels::AutomaticExploitation:MatchSet',
|
22
22
|
inverse_of: :workspace
|
23
23
|
|
24
|
-
# @deprecated Use `Mdm::Workspace#core_credentials` defined by `Metasploit::Credential::Engine` to get
|
25
|
-
# `Metasploit::Credential::Core`s gathered from this workspace's {#hosts} and {#services}.
|
26
|
-
#
|
27
|
-
# Creds gathered from this workspace's {#hosts} and {#services}.
|
28
|
-
has_many :creds, :through => :services, :class_name => 'Mdm::Cred'
|
29
24
|
|
30
25
|
# Events that occurred in this workspace.
|
31
26
|
has_many :events, dependent: :delete_all, :class_name => 'Mdm::Event'
|
@@ -80,6 +75,12 @@ class Mdm::Workspace < ApplicationRecord
|
|
80
75
|
|
81
76
|
# Sessions opened on {#hosts} in this workspace.
|
82
77
|
has_many :sessions, :through => :hosts, :class_name => 'Mdm::Session'
|
78
|
+
|
79
|
+
# @deprecated Use `Mdm::Workspace#core_credentials` defined by `Metasploit::Credential::Engine` to get
|
80
|
+
# `Metasploit::Credential::Core`s gathered from this workspace's {#hosts} and {#services}.
|
81
|
+
#
|
82
|
+
# Creds gathered from this workspace's {#hosts} and {#services}.
|
83
|
+
has_many :creds, :through => :services, :class_name => 'Mdm::Cred'
|
83
84
|
|
84
85
|
#
|
85
86
|
# Attributes
|
@@ -91,7 +91,7 @@ class MetasploitDataModels::Search::Visitor::Where
|
|
91
91
|
visit 'MetasploitDataModels::Search::Operation::Port::Range' do |range_operation|
|
92
92
|
attribute = attribute_visitor.visit range_operation.operator
|
93
93
|
|
94
|
-
attribute.
|
94
|
+
attribute.between(range_operation.value)
|
95
95
|
end
|
96
96
|
|
97
97
|
#
|
@@ -5,27 +5,19 @@ require 'metasploit_data_models/version'
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = 'metasploit_data_models'
|
7
7
|
s.version = MetasploitDataModels::VERSION
|
8
|
-
s.authors = [
|
9
|
-
|
10
|
-
'Luke Imhoff',
|
11
|
-
"David 'thelightcosine' Maloney",
|
12
|
-
"Trevor 'burlyscudd' Rosen"
|
13
|
-
]
|
14
|
-
s.email = [
|
15
|
-
'shuckins@rapid7.com',
|
16
|
-
'luke_imhoff@rapid7.com',
|
17
|
-
'dmaloney@rapid7.com',
|
18
|
-
'trevor_rosen@rapid7.com'
|
19
|
-
]
|
8
|
+
s.authors = ['Metasploit Hackers']
|
9
|
+
s.email = ['msfdev@metasploit.com']
|
20
10
|
s.homepage = ""
|
21
11
|
s.summary = %q{Database code for MSF and Metasploit Pro}
|
22
12
|
s.description = %q{Implements minimal ActiveRecord models and database helper code used in both the Metasploit Framework (MSF) and Metasploit commercial editions.}
|
23
13
|
|
24
|
-
s.files = `git ls-files`.split("\n")
|
14
|
+
s.files = `git ls-files`.split("\n").reject { |file|
|
15
|
+
file =~ /^bin/
|
16
|
+
}
|
25
17
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
26
18
|
s.require_paths = %w{app/models app/validators lib}
|
27
19
|
|
28
|
-
s.required_ruby_version = '>= 2.
|
20
|
+
s.required_ruby_version = '>= 2.4'
|
29
21
|
|
30
22
|
# ---- Dependencies ----
|
31
23
|
# documentation
|
@@ -36,9 +28,7 @@ Gem::Specification.new do |s|
|
|
36
28
|
|
37
29
|
s.add_development_dependency 'rake'
|
38
30
|
|
39
|
-
|
40
|
-
# @note 0.8.7.4 has a bug where attribute writers show up as undocumented
|
41
|
-
s.add_development_dependency 'yard', '< 0.8.7.4'
|
31
|
+
s.add_development_dependency 'yard'
|
42
32
|
# debugging
|
43
33
|
s.add_development_dependency 'pry'
|
44
34
|
|
@@ -46,8 +36,9 @@ Gem::Specification.new do |s|
|
|
46
36
|
s.add_runtime_dependency 'activerecord', '~>5.2.2'
|
47
37
|
s.add_runtime_dependency 'activesupport', '~>5.2.2'
|
48
38
|
s.add_runtime_dependency 'metasploit-concern'
|
49
|
-
s.add_runtime_dependency 'metasploit-model'
|
39
|
+
s.add_runtime_dependency 'metasploit-model', '>=3.1'
|
50
40
|
s.add_runtime_dependency 'railties', '~>5.2.2'
|
41
|
+
s.add_runtime_dependency 'webrick'
|
51
42
|
|
52
43
|
# os fingerprinting
|
53
44
|
s.add_runtime_dependency 'recog', '~> 2.0'
|
@@ -471,33 +471,33 @@ RSpec.describe Mdm::Host, type: :model do
|
|
471
471
|
|
472
472
|
context 'os normalization' do
|
473
473
|
context '#get_arch_from_string' do
|
474
|
-
context "should return '
|
474
|
+
context "should return 'x86_64'" do
|
475
475
|
it "when the string contains 'x64'" do
|
476
|
-
expect(host.send(:get_arch_from_string, 'blahx64blah')).to eq('
|
476
|
+
expect(host.send(:get_arch_from_string, 'blahx64blah')).to eq('x86_64')
|
477
477
|
end
|
478
478
|
|
479
479
|
it "when the string contains 'X64'" do
|
480
|
-
expect(host.send(:get_arch_from_string, 'blahX64blah')).to eq('
|
480
|
+
expect(host.send(:get_arch_from_string, 'blahX64blah')).to eq('x86_64')
|
481
481
|
end
|
482
482
|
|
483
483
|
it "when the string contains 'x86_64'" do
|
484
|
-
expect(host.send(:get_arch_from_string, 'blahx86_64blah')).to eq('
|
484
|
+
expect(host.send(:get_arch_from_string, 'blahx86_64blah')).to eq('x86_64')
|
485
485
|
end
|
486
486
|
|
487
487
|
it "when the string contains 'X86_64'" do
|
488
|
-
expect(host.send(:get_arch_from_string, 'blahX86_64blah')).to eq('
|
488
|
+
expect(host.send(:get_arch_from_string, 'blahX86_64blah')).to eq('x86_64')
|
489
489
|
end
|
490
490
|
|
491
491
|
it "when the string contains 'amd64'" do
|
492
|
-
expect(host.send(:get_arch_from_string, 'blahamd64blah')).to eq('
|
492
|
+
expect(host.send(:get_arch_from_string, 'blahamd64blah')).to eq('x86_64')
|
493
493
|
end
|
494
494
|
|
495
495
|
it "when the string contains 'AMD64'" do
|
496
|
-
expect(host.send(:get_arch_from_string, 'blahAMD64blah')).to eq('
|
496
|
+
expect(host.send(:get_arch_from_string, 'blahAMD64blah')).to eq('x86_64')
|
497
497
|
end
|
498
498
|
|
499
499
|
it "when the string contains 'aMd64'" do
|
500
|
-
expect(host.send(:get_arch_from_string, 'blahamd64blah')).to eq('
|
500
|
+
expect(host.send(:get_arch_from_string, 'blahamd64blah')).to eq('x86_64')
|
501
501
|
end
|
502
502
|
end
|
503
503
|
|
@@ -531,21 +531,21 @@ RSpec.describe Mdm::Host, type: :model do
|
|
531
531
|
end
|
532
532
|
end
|
533
533
|
|
534
|
-
context "should return '
|
534
|
+
context "should return 'PowerPC'" do
|
535
535
|
it "when the string contains 'PowerPC'" do
|
536
|
-
expect(host.send(:get_arch_from_string, 'blahPowerPCblah')).to eq('
|
536
|
+
expect(host.send(:get_arch_from_string, 'blahPowerPCblah')).to eq('PowerPC')
|
537
537
|
end
|
538
538
|
|
539
539
|
it "when the string contains 'PPC'" do
|
540
|
-
expect(host.send(:get_arch_from_string, 'blahPPCblah')).to eq('
|
540
|
+
expect(host.send(:get_arch_from_string, 'blahPPCblah')).to eq('PowerPC')
|
541
541
|
end
|
542
542
|
|
543
543
|
it "when the string contains 'POWER'" do
|
544
|
-
expect(host.send(:get_arch_from_string, 'blahPOWERblah')).to eq('
|
544
|
+
expect(host.send(:get_arch_from_string, 'blahPOWERblah')).to eq('PowerPC')
|
545
545
|
end
|
546
546
|
|
547
547
|
it "when the string contains 'ppc'" do
|
548
|
-
expect(host.send(:get_arch_from_string, 'blahppcblah')).to eq('
|
548
|
+
expect(host.send(:get_arch_from_string, 'blahppcblah')).to eq('PowerPC')
|
549
549
|
end
|
550
550
|
end
|
551
551
|
|
@@ -560,22 +560,22 @@ RSpec.describe Mdm::Host, type: :model do
|
|
560
560
|
end
|
561
561
|
end
|
562
562
|
|
563
|
-
it "should return '
|
564
|
-
expect(host.send(:get_arch_from_string, 'blahSPARCblah')).to eq('
|
565
|
-
expect(host.send(:get_arch_from_string, 'blahSPaRCblah')).to eq('
|
566
|
-
expect(host.send(:get_arch_from_string, 'blahsparcblah')).to eq('
|
563
|
+
it "should return 'Sparc' if the string contains SPARC, regardless of case" do
|
564
|
+
expect(host.send(:get_arch_from_string, 'blahSPARCblah')).to eq('Sparc')
|
565
|
+
expect(host.send(:get_arch_from_string, 'blahSPaRCblah')).to eq('Sparc')
|
566
|
+
expect(host.send(:get_arch_from_string, 'blahsparcblah')).to eq('Sparc')
|
567
567
|
end
|
568
568
|
|
569
|
-
it "should return '
|
570
|
-
expect(host.send(:get_arch_from_string, 'blahARMblah')).to eq('
|
571
|
-
expect(host.send(:get_arch_from_string, 'blahArMblah')).to eq('
|
572
|
-
expect(host.send(:get_arch_from_string, 'blaharmblah')).to eq('
|
569
|
+
it "should return 'ARM' if the string contains 'ARM', regardless of case" do
|
570
|
+
expect(host.send(:get_arch_from_string, 'blahARMblah')).to eq('ARM')
|
571
|
+
expect(host.send(:get_arch_from_string, 'blahArMblah')).to eq('ARM')
|
572
|
+
expect(host.send(:get_arch_from_string, 'blaharmblah')).to eq('ARM')
|
573
573
|
end
|
574
574
|
|
575
|
-
it "should return '
|
576
|
-
expect(host.send(:get_arch_from_string, 'blahMIPSblah')).to eq('
|
577
|
-
expect(host.send(:get_arch_from_string, 'blahMiPslah')).to eq('
|
578
|
-
expect(host.send(:get_arch_from_string, 'blahmipsblah')).to eq('
|
575
|
+
it "should return 'MIPS' if the string contains 'MIPS', regardless of case" do
|
576
|
+
expect(host.send(:get_arch_from_string, 'blahMIPSblah')).to eq('MIPS')
|
577
|
+
expect(host.send(:get_arch_from_string, 'blahMiPslah')).to eq('MIPS')
|
578
|
+
expect(host.send(:get_arch_from_string, 'blahmipsblah')).to eq('MIPS')
|
579
579
|
end
|
580
580
|
end
|
581
581
|
|
@@ -588,7 +588,7 @@ RSpec.describe Mdm::Host, type: :model do
|
|
588
588
|
context 'arch' do
|
589
589
|
it 'should return a value for arch if there is one' do
|
590
590
|
result = host.send(:parse_windows_os_str, 'Windows x64')
|
591
|
-
expect(result['os.arch']).to eq('
|
591
|
+
expect(result['os.arch']).to eq('x86_64')
|
592
592
|
end
|
593
593
|
|
594
594
|
it "should not have an arch key if we don't know the arch" do
|
@@ -1093,7 +1093,7 @@ RSpec.describe Mdm::Host, type: :model do
|
|
1093
1093
|
fingerprint = FactoryBot.build(:mdm_retina_fingerprint, :host => host)
|
1094
1094
|
result = host.send(:normalize_scanner_fp, fingerprint).first
|
1095
1095
|
expect(result['os.product']).to eq( 'Windows Server 2003')
|
1096
|
-
expect(result['os.arch']).to eq('
|
1096
|
+
expect(result['os.arch']).to eq('x86_64')
|
1097
1097
|
expect(result['os.version']).to eq('SP2')
|
1098
1098
|
expect(result['os.certainty'].to_f).to eq(0.8)
|
1099
1099
|
end
|
@@ -32,7 +32,7 @@ RSpec.describe Mdm::NexposeConsole, type: :model do
|
|
32
32
|
|
33
33
|
context '#destroy' do
|
34
34
|
it 'should successfully destroy the object' do
|
35
|
-
nexpose_console = FactoryBot.create(:mdm_nexpose_console)
|
35
|
+
nexpose_console = FactoryBot.create(:mdm_nexpose_console, :address => 'localhost')
|
36
36
|
expect {
|
37
37
|
nexpose_console.destroy
|
38
38
|
}.to_not raise_error
|
@@ -50,6 +50,20 @@ RSpec.describe Mdm::NexposeConsole, type: :model do
|
|
50
50
|
expect(addressless_nexpose_console.errors[:address]).to include("can't be blank")
|
51
51
|
end
|
52
52
|
|
53
|
+
it 'should be valid for a valid hostname' do
|
54
|
+
host_nexpose_console = FactoryBot.build(:mdm_nexpose_console, :address => 'testvalue.test.com')
|
55
|
+
expect(host_nexpose_console).to be_valid
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should be invalid for a malformed hostname' do
|
59
|
+
host_nexpose_consoles = ['testvalue.test.com:', 'testvalue-.test.com', '[testvalue.test.com]']
|
60
|
+
host_nexpose_consoles.each do | entry |
|
61
|
+
host_nexpose_console = FactoryBot.build(:mdm_nexpose_console, :address => entry)
|
62
|
+
expect(host_nexpose_console).not_to be_valid
|
63
|
+
expect(host_nexpose_console.errors[:address]).to include("must be a valid (IP or hostname) address")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
53
67
|
it 'should be valid for IPv4 format' do
|
54
68
|
ipv4_nexpose_console = FactoryBot.build(:mdm_nexpose_console, :address => '192.168.1.120')
|
55
69
|
expect(ipv4_nexpose_console).to be_valid
|
@@ -233,7 +233,7 @@ RSpec.describe MetasploitDataModels::IPAddress::V4::Segment::Single, type: :mode
|
|
233
233
|
end
|
234
234
|
|
235
235
|
context '#to_s' do
|
236
|
-
subject(:
|
236
|
+
subject(:call_to_s) {
|
237
237
|
single.to_s
|
238
238
|
}
|
239
239
|
|
@@ -256,7 +256,7 @@ RSpec.describe MetasploitDataModels::IPAddress::V4::Segment::Single, type: :mode
|
|
256
256
|
it 'delegates to #value' do
|
257
257
|
expect(value).to receive(:to_s)
|
258
258
|
|
259
|
-
|
259
|
+
call_to_s
|
260
260
|
end
|
261
261
|
end
|
262
262
|
|
@@ -321,4 +321,4 @@ RSpec.describe MetasploitDataModels::IPAddress::V4::Segment::Single, type: :mode
|
|
321
321
|
end
|
322
322
|
end
|
323
323
|
end
|
324
|
-
end
|
324
|
+
end
|
@@ -129,7 +129,7 @@ RSpec.describe MetasploitDataModels::Search::Visitor::Where, type: :model do
|
|
129
129
|
attribute = double('Visited Operator')
|
130
130
|
allow(visitor.attribute_visitor).to receive(:visit).with(operator).and_return(attribute)
|
131
131
|
|
132
|
-
expect(attribute).to receive(:
|
132
|
+
expect(attribute).to receive(:between).with(range)
|
133
133
|
|
134
134
|
visit
|
135
135
|
end
|
@@ -1,18 +1,17 @@
|
|
1
|
-
# @note This file is only for use in
|
1
|
+
# @note This file is only for use in Github Actions. If you need to make a `spec/dummy/config/database.yml` for running
|
2
2
|
# rake, rake spec, or rspec locally, please customize `spec/dummy/config/database.yml.example`.
|
3
3
|
#
|
4
4
|
# @example Customizing config/database.yml.example
|
5
5
|
# cp spec/dummy/config/database.yml.example spec/dummy/config/database.yml
|
6
6
|
# # update password fields for each environment's user
|
7
7
|
|
8
|
-
# Using the postgres user locally without a host and port is the supported configuration from Travis-CI
|
9
|
-
#
|
10
|
-
# @see http://about.travis-ci.org/docs/user/database-setup/#PostgreSQL
|
11
8
|
development: &pgsql
|
12
9
|
adapter: postgresql
|
13
10
|
database: metasploit_data_models_development
|
11
|
+
host: localhost
|
14
12
|
username: postgres
|
15
|
-
|
13
|
+
password: postgres
|
14
|
+
pool: 25
|
16
15
|
timeout: 5
|
17
16
|
|
18
17
|
# Warning: The database defined as "test" will be erased and re-generated from your development database when you run
|