ronin 1.5.0 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +11 -0
- data/.github/workflows/ruby.yml +32 -0
- data/.gitignore +7 -7
- data/.ruby-version +1 -0
- data/COPYING.txt +3 -3
- data/ChangeLog.md +25 -11
- data/Gemfile +21 -20
- data/README.md +102 -81
- data/Rakefile +4 -5
- data/bin/ronin +7 -12
- data/bin/ronin-campaigns +7 -12
- data/bin/ronin-console +7 -12
- data/bin/ronin-creds +7 -12
- data/bin/ronin-database +7 -12
- data/bin/ronin-emails +7 -12
- data/bin/ronin-exec +7 -12
- data/bin/ronin-fuzzer +7 -12
- data/bin/ronin-help +7 -12
- data/bin/ronin-hosts +7 -12
- data/bin/ronin-install +7 -12
- data/bin/ronin-ips +7 -12
- data/bin/ronin-net-proxy +7 -12
- data/bin/ronin-repos +7 -12
- data/bin/ronin-uninstall +7 -12
- data/bin/ronin-update +7 -12
- data/bin/ronin-urls +7 -12
- data/bin/ronin-wordlist +7 -12
- data/gemspec.yml +8 -8
- data/lib/bond/completions/ronin.rb +23 -23
- data/lib/ronin.rb +3 -3
- data/lib/ronin/address.rb +6 -7
- data/lib/ronin/arch.rb +3 -3
- data/lib/ronin/author.rb +5 -7
- data/lib/ronin/auto_load.rb +5 -5
- data/lib/ronin/bootstrap.rb +3 -3
- data/lib/ronin/campaign.rb +3 -3
- data/lib/ronin/config.rb +5 -7
- data/lib/ronin/credential.rb +3 -3
- data/lib/ronin/database.rb +3 -3
- data/lib/ronin/database/database.rb +8 -12
- data/lib/ronin/database/exceptions.rb +3 -3
- data/lib/ronin/database/exceptions/invalid_config.rb +3 -3
- data/lib/ronin/database/exceptions/unknown_repository.rb +3 -3
- data/lib/ronin/database/migrations.rb +3 -3
- data/lib/ronin/database/migrations/1.0.0.rb +3 -3
- data/lib/ronin/database/migrations/1.1.0.rb +3 -3
- data/lib/ronin/database/migrations/exceptions.rb +3 -3
- data/lib/ronin/database/migrations/exceptions/duplicate_migration.rb +3 -3
- data/lib/ronin/database/migrations/exceptions/unknown_migration.rb +3 -3
- data/lib/ronin/database/migrations/graph.rb +3 -3
- data/lib/ronin/database/migrations/migration.rb +3 -3
- data/lib/ronin/database/migrations/migrations.rb +3 -3
- data/lib/ronin/email_address.rb +5 -7
- data/lib/ronin/environment.rb +3 -3
- data/lib/ronin/exceptions.rb +3 -3
- data/lib/ronin/exceptions/duplicate_repository.rb +3 -3
- data/lib/ronin/exceptions/repository_not_found.rb +3 -3
- data/lib/ronin/host_name.rb +3 -3
- data/lib/ronin/host_name_ip_address.rb +3 -3
- data/lib/ronin/installation.rb +5 -7
- data/lib/ronin/ip_address.rb +6 -8
- data/lib/ronin/ip_address_mac_address.rb +3 -3
- data/lib/ronin/license.rb +6 -6
- data/lib/ronin/mac_address.rb +3 -3
- data/lib/ronin/model.rb +3 -3
- data/lib/ronin/model/has_authors.rb +3 -3
- data/lib/ronin/model/has_description.rb +3 -3
- data/lib/ronin/model/has_license.rb +3 -3
- data/lib/ronin/model/has_name.rb +3 -3
- data/lib/ronin/model/has_title.rb +3 -3
- data/lib/ronin/model/has_unique_name.rb +5 -7
- data/lib/ronin/model/has_version.rb +3 -3
- data/lib/ronin/model/importable.rb +3 -3
- data/lib/ronin/model/model.rb +7 -8
- data/lib/ronin/model/types.rb +3 -3
- data/lib/ronin/model/types/description.rb +9 -12
- data/lib/ronin/open_port.rb +5 -7
- data/lib/ronin/organization.rb +3 -3
- data/lib/ronin/os.rb +5 -7
- data/lib/ronin/os_guess.rb +3 -3
- data/lib/ronin/password.rb +3 -3
- data/lib/ronin/port.rb +3 -3
- data/lib/ronin/repositories.rb +3 -3
- data/lib/ronin/repository.rb +3 -3
- data/lib/ronin/ronin.rb +3 -3
- data/lib/ronin/script.rb +3 -3
- data/lib/ronin/script/buildable.rb +3 -3
- data/lib/ronin/script/deployable.rb +3 -3
- data/lib/ronin/script/exceptions.rb +3 -3
- data/lib/ronin/script/exceptions/build_failed.rb +3 -3
- data/lib/ronin/script/exceptions/deploy_failed.rb +3 -3
- data/lib/ronin/script/exceptions/exception.rb +3 -3
- data/lib/ronin/script/exceptions/not_built.rb +3 -3
- data/lib/ronin/script/exceptions/test_failed.rb +3 -3
- data/lib/ronin/script/path.rb +3 -3
- data/lib/ronin/script/script.rb +3 -3
- data/lib/ronin/script/testable.rb +3 -3
- data/lib/ronin/service.rb +3 -3
- data/lib/ronin/service_credential.rb +3 -3
- data/lib/ronin/software.rb +3 -3
- data/lib/ronin/spec/database.rb +27 -21
- data/lib/ronin/target.rb +3 -3
- data/lib/ronin/tcp_port.rb +3 -3
- data/lib/ronin/udp_port.rb +3 -3
- data/lib/ronin/ui.rb +3 -3
- data/lib/ronin/ui/cli.rb +3 -3
- data/lib/ronin/ui/cli/class_command.rb +14 -7
- data/lib/ronin/ui/cli/cli.rb +5 -5
- data/lib/ronin/ui/cli/command.rb +5 -7
- data/lib/ronin/ui/cli/commands.rb +3 -3
- data/lib/ronin/ui/cli/commands/campaigns.rb +5 -7
- data/lib/ronin/ui/cli/commands/console.rb +3 -3
- data/lib/ronin/ui/cli/commands/creds.rb +3 -3
- data/lib/ronin/ui/cli/commands/database.rb +3 -3
- data/lib/ronin/ui/cli/commands/emails.rb +3 -3
- data/lib/ronin/ui/cli/commands/exec.rb +3 -3
- data/lib/ronin/ui/cli/commands/fuzzer.rb +16 -16
- data/lib/ronin/ui/cli/commands/help.rb +3 -3
- data/lib/ronin/ui/cli/commands/hosts.rb +5 -7
- data/lib/ronin/ui/cli/commands/install.rb +7 -11
- data/lib/ronin/ui/cli/commands/ips.rb +5 -7
- data/lib/ronin/ui/cli/commands/net/proxy.rb +19 -12
- data/lib/ronin/ui/cli/commands/repos.rb +3 -3
- data/lib/ronin/ui/cli/commands/uninstall.rb +3 -3
- data/lib/ronin/ui/cli/commands/update.rb +3 -3
- data/lib/ronin/ui/cli/commands/urls.rb +3 -3
- data/lib/ronin/ui/cli/commands/wordlist.rb +3 -3
- data/lib/ronin/ui/cli/exceptions.rb +3 -3
- data/lib/ronin/ui/cli/exceptions/unknown_command.rb +3 -3
- data/lib/ronin/ui/cli/model_command.rb +6 -9
- data/lib/ronin/ui/cli/printing.rb +3 -3
- data/lib/ronin/ui/cli/resources_command.rb +7 -11
- data/lib/ronin/ui/cli/script_command.rb +5 -10
- data/lib/ronin/ui/console.rb +3 -3
- data/lib/ronin/ui/console/commands.rb +3 -3
- data/lib/ronin/ui/console/console.rb +3 -3
- data/lib/ronin/ui/console/context.rb +3 -3
- data/lib/ronin/ui/console/shell.rb +3 -3
- data/lib/ronin/url.rb +5 -7
- data/lib/ronin/url_query_param.rb +3 -3
- data/lib/ronin/url_query_param_name.rb +6 -6
- data/lib/ronin/url_scheme.rb +4 -4
- data/lib/ronin/user_name.rb +3 -3
- data/lib/ronin/vendor.rb +3 -3
- data/lib/ronin/version.rb +5 -5
- data/lib/ronin/web_credential.rb +5 -7
- data/man/ronin-campaigns.1.md +20 -20
- data/man/ronin-console.1.md +17 -17
- data/man/ronin-creds.1.md +16 -16
- data/man/ronin-database.1.md +23 -23
- data/man/ronin-emails.1.md +18 -18
- data/man/ronin-exec.1.md +11 -11
- data/man/ronin-fuzzer.1.md +23 -23
- data/man/ronin-help.1.md +5 -5
- data/man/ronin-hosts.1.md +20 -20
- data/man/ronin-install.1.md +18 -18
- data/man/ronin-ips.1.md +21 -21
- data/man/ronin-net-proxy.1.md +24 -24
- data/man/ronin-repos.1.md +18 -18
- data/man/ronin-uninstall.1.md +14 -14
- data/man/ronin-update.1.md +14 -14
- data/man/ronin-urls.1.md +22 -22
- data/man/ronin-wordlist.1.md +14 -13
- data/man/ronin.1.md +1 -1
- data/spec/arch_spec.rb +59 -46
- data/spec/author_spec.rb +14 -14
- data/spec/campaign_spec.rb +8 -0
- data/spec/credential_spec.rb +11 -8
- data/spec/database_spec.rb +6 -6
- data/spec/email_address_spec.rb +23 -20
- data/spec/host_name_spec.rb +24 -22
- data/spec/installation_spec.rb +6 -6
- data/spec/ip_address_spec.rb +31 -26
- data/spec/license_spec.rb +15 -9
- data/spec/mac_address_spec.rb +17 -8
- data/spec/model/has_authors_spec.rb +56 -37
- data/spec/model/has_description_spec.rb +36 -23
- data/spec/model/has_license_spec.rb +38 -28
- data/spec/model/has_name_spec.rb +36 -19
- data/spec/model/has_title_spec.rb +27 -14
- data/spec/model/has_version_spec.rb +64 -35
- data/spec/model/model_spec.rb +57 -33
- data/spec/model/models/{basic_model.rb → base_model.rb} +1 -1
- data/spec/model/models/{custom_model.rb → inherited_model.rb} +2 -3
- data/spec/os_spec.rb +24 -20
- data/spec/password_spec.rb +17 -9
- data/spec/port_spec.rb +30 -22
- data/spec/repository_spec.rb +59 -60
- data/spec/ronin_spec.rb +4 -4
- data/spec/script/buildable_spec.rb +8 -8
- data/spec/script/deployable_spec.rb +7 -7
- data/spec/script/path_spec.rb +42 -40
- data/spec/script/script_spec.rb +23 -23
- data/spec/script/testable_spec.rb +20 -20
- data/spec/service_spec.rb +14 -8
- data/spec/software_spec.rb +30 -17
- data/spec/spec_helper.rb +4 -4
- data/spec/ui/cli/classes/test_command.rb +2 -4
- data/spec/ui/cli/cli_spec.rb +5 -5
- data/spec/ui/cli/command_spec.rb +34 -30
- data/spec/url_query_param_spec.rb +23 -14
- data/spec/url_scheme_spec.rb +12 -9
- data/spec/url_spec.rb +64 -61
- data/spec/vendor_spec.rb +15 -8
- metadata +122 -150
- data/.gemtest +0 -0
@@ -4,26 +4,39 @@ require 'model/models/titled_model'
|
|
4
4
|
require 'ronin/model/has_title'
|
5
5
|
|
6
6
|
describe Model::HasTitle do
|
7
|
-
|
7
|
+
let(:model) { TitledModel }
|
8
8
|
|
9
|
-
|
9
|
+
describe ".included" do
|
10
|
+
subject { model }
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
it "should include Ronin::Model" do
|
13
|
+
expect(subject.ancestors).to include(Model)
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
it "should define a title property" do
|
17
|
+
expect(subject.properties).to be_named(:title)
|
18
|
+
end
|
17
19
|
end
|
18
20
|
|
19
|
-
|
20
|
-
subject
|
21
|
-
|
21
|
+
describe ".titled" do
|
22
|
+
subject { model }
|
23
|
+
|
24
|
+
let(:title1) { 'Foo one' }
|
25
|
+
let(:title2) { 'Foo bar two' }
|
26
|
+
|
27
|
+
before do
|
28
|
+
subject.create!(:title => title1)
|
29
|
+
subject.create!(:title => title2)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should be able to find resources with similar titles" do
|
33
|
+
resources = subject.titled('Foo')
|
22
34
|
|
23
|
-
|
35
|
+
expect(resources.length).to eq(2)
|
36
|
+
expect(resources[0].title).to be == title1
|
37
|
+
expect(resources[1].title).to be == title2
|
38
|
+
end
|
24
39
|
|
25
|
-
|
26
|
-
resources[0].title.should == 'Foo one'
|
27
|
-
resources[1].title.should == 'Foo bar two'
|
40
|
+
after { subject.destroy }
|
28
41
|
end
|
29
42
|
end
|
@@ -4,55 +4,84 @@ require 'model/models/versioned_model'
|
|
4
4
|
require 'ronin/model/has_version'
|
5
5
|
|
6
6
|
describe Model::HasVersion do
|
7
|
-
|
7
|
+
let(:model) { VersionedModel }
|
8
8
|
|
9
|
-
|
10
|
-
subject
|
9
|
+
describe ".included" do
|
10
|
+
subject { model }
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
)
|
12
|
+
it "should include Ronin::Model" do
|
13
|
+
expect(subject.ancestors).to include(Model)
|
14
|
+
end
|
16
15
|
|
17
|
-
|
18
|
-
:version
|
19
|
-
|
20
|
-
)
|
16
|
+
it "should define a version property" do
|
17
|
+
expect(subject.properties).to be_named(:version)
|
18
|
+
end
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
:content => 'Foo'
|
25
|
-
)
|
26
|
-
end
|
20
|
+
it "should default the version property to '0.1'" do
|
21
|
+
resource = subject.new
|
27
22
|
|
28
|
-
|
29
|
-
|
23
|
+
expect(resource.version).to eq('0.1')
|
24
|
+
end
|
30
25
|
end
|
31
26
|
|
32
|
-
|
33
|
-
subject
|
34
|
-
end
|
27
|
+
describe ".revision" do
|
28
|
+
subject { model }
|
35
29
|
|
36
|
-
|
37
|
-
|
30
|
+
before do
|
31
|
+
subject.create(
|
32
|
+
:version => '1.1',
|
33
|
+
:content => 'one'
|
34
|
+
)
|
38
35
|
|
39
|
-
|
40
|
-
|
36
|
+
subject.create(
|
37
|
+
:version => '1.1',
|
38
|
+
:content => 'two'
|
39
|
+
)
|
40
|
+
|
41
|
+
subject.create(
|
42
|
+
:version => '1.2',
|
43
|
+
:content => 'three'
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should allow querying specific revisions" do
|
48
|
+
resources = subject.revision('1.1')
|
41
49
|
|
42
|
-
|
43
|
-
|
50
|
+
expect(resources.length).to eq(2)
|
51
|
+
expect(resources[0].version).to eq('1.1')
|
52
|
+
expect(resources[0].content).to eq('one')
|
44
53
|
|
45
|
-
|
46
|
-
|
47
|
-
|
54
|
+
expect(resources[1].version).to eq('1.1')
|
55
|
+
expect(resources[1].content).to eq('two')
|
56
|
+
end
|
48
57
|
|
49
|
-
|
50
|
-
resources[1].content.should == 'Bar'
|
58
|
+
after { subject.destroy }
|
51
59
|
end
|
52
60
|
|
53
|
-
|
54
|
-
|
61
|
+
describe ".latest" do
|
62
|
+
subject { model }
|
63
|
+
|
64
|
+
before do
|
65
|
+
subject.create(
|
66
|
+
:version => '1.0',
|
67
|
+
:content => 'foo'
|
68
|
+
)
|
69
|
+
|
70
|
+
subject.create(
|
71
|
+
:version => '1.5',
|
72
|
+
:content => 'foo'
|
73
|
+
)
|
74
|
+
|
75
|
+
subject.create(
|
76
|
+
:version => '1.1',
|
77
|
+
:content => 'foo'
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should allow querying the latest revision" do
|
82
|
+
resource = subject.all(:content => 'foo').latest
|
55
83
|
|
56
|
-
|
84
|
+
expect(resource.version).to eq('1.5')
|
85
|
+
end
|
57
86
|
end
|
58
87
|
end
|
data/spec/model/model_spec.rb
CHANGED
@@ -1,74 +1,98 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'model/models/
|
3
|
-
require 'model/models/
|
2
|
+
require 'model/models/base_model'
|
3
|
+
require 'model/models/inherited_model'
|
4
4
|
|
5
5
|
require 'ronin/model/model'
|
6
6
|
|
7
7
|
describe Model do
|
8
|
-
|
8
|
+
let(:base_model) { BaseModel }
|
9
|
+
let(:inherited_model) { InheritedModel }
|
9
10
|
|
10
|
-
|
11
|
+
describe ".included" do
|
12
|
+
subject { base_model }
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
subject.default_repository_name.should == :default
|
14
|
+
it "should have a default repository name" do
|
15
|
+
expect(subject.default_repository_name).to eq(:default)
|
16
|
+
end
|
16
17
|
end
|
17
18
|
|
18
|
-
|
19
|
-
|
19
|
+
describe ".new" do
|
20
|
+
subject { base_model }
|
20
21
|
|
21
|
-
|
22
|
-
|
22
|
+
it "should allow creating new instances of the model" do
|
23
|
+
resource = subject.new(:name => 'joe')
|
24
|
+
|
25
|
+
expect(resource.name).to eq('joe')
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when the model defines an initialize method" do
|
29
|
+
subject { inherited_model }
|
23
30
|
|
24
|
-
|
25
|
-
|
31
|
+
it "should call initialize when creating new instances of the model" do
|
32
|
+
resource = subject.new(:name => 'joe')
|
26
33
|
|
27
|
-
|
28
|
-
|
34
|
+
expect(resource.name).to eq('joe')
|
35
|
+
expect(resource.var).to eq(2)
|
36
|
+
end
|
37
|
+
end
|
29
38
|
end
|
30
39
|
|
31
|
-
|
32
|
-
|
40
|
+
describe ".create!" do
|
41
|
+
subject { inherited_model }
|
42
|
+
|
43
|
+
it "should call initialize when creating a new resource" do
|
44
|
+
resource = subject.create!(:name => 'jim')
|
33
45
|
|
34
|
-
|
35
|
-
|
46
|
+
expect(resource.name).to eq('jim')
|
47
|
+
expect(resource.var).to eq(2)
|
48
|
+
|
49
|
+
resource.destroy
|
50
|
+
end
|
36
51
|
end
|
37
52
|
|
38
|
-
|
39
|
-
|
53
|
+
describe ".first" do
|
54
|
+
subject { inherited_model }
|
55
|
+
|
56
|
+
before { subject.create!(:name => 'bob') }
|
57
|
+
|
58
|
+
it "should call initialize when loading from the database" do
|
59
|
+
resource = subject.first(:name => 'bob')
|
40
60
|
|
41
|
-
|
42
|
-
|
43
|
-
|
61
|
+
expect(resource.name).to eq('bob')
|
62
|
+
expect(resource.var).to eq(2)
|
63
|
+
end
|
64
|
+
|
65
|
+
after { subject.destroy }
|
44
66
|
end
|
45
67
|
|
46
|
-
describe "humanize_attributes" do
|
47
|
-
let(:
|
68
|
+
describe "#humanize_attributes" do
|
69
|
+
let(:model) { base_model }
|
70
|
+
|
71
|
+
subject { model.new(:name => 'joe', :age => 21) }
|
48
72
|
|
49
73
|
it "should humanize the attributes of a model" do
|
50
|
-
|
74
|
+
expect(subject.humanize_attributes).to be == {
|
51
75
|
'Name' => 'joe',
|
52
76
|
'Age' => '21'
|
53
77
|
}
|
54
78
|
end
|
55
79
|
|
56
80
|
it "should exclude certain attributes to humanize" do
|
57
|
-
|
81
|
+
expect(subject.humanize_attributes(:exclude => [:name])).to be == {
|
58
82
|
'Age' => '21'
|
59
83
|
}
|
60
84
|
end
|
61
85
|
|
62
86
|
it "should filter out nil values" do
|
63
|
-
|
87
|
+
subject.age = nil
|
64
88
|
|
65
|
-
|
89
|
+
expect(subject.humanize_attributes).to be == {'Name' => 'joe'}
|
66
90
|
end
|
67
91
|
|
68
92
|
it "should filter out empty values" do
|
69
|
-
|
93
|
+
subject.name = ''
|
70
94
|
|
71
|
-
|
95
|
+
expect(subject.humanize_attributes).to be == {'Age' => '21'}
|
72
96
|
end
|
73
97
|
end
|
74
98
|
end
|
data/spec/os_spec.rb
CHANGED
@@ -1,44 +1,48 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
|
2
3
|
require 'ronin/os'
|
3
4
|
|
4
5
|
describe OS do
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
let(:name) { 'Linux' }
|
7
|
+
let(:version) { '2.6.11' }
|
8
|
+
|
9
|
+
subject { described_class.new(:name => name, :version => version) }
|
8
10
|
|
9
11
|
describe "predefine" do
|
10
|
-
it "should provide methods for built-in
|
11
|
-
os =
|
12
|
+
it "should provide methods for built-in described_classes" do
|
13
|
+
os = described_class.linux
|
12
14
|
|
13
|
-
os.name.
|
15
|
+
expect(os.name).to eq('Linux')
|
14
16
|
end
|
15
17
|
|
16
|
-
it "should provide methods for creating
|
17
|
-
os =
|
18
|
+
it "should provide methods for creating described_classes with versions" do
|
19
|
+
os = described_class.linux(version)
|
18
20
|
|
19
|
-
os.version.
|
21
|
+
expect(os.version).to eq(version)
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
25
|
+
describe "validations" do
|
26
|
+
it "should require a name" do
|
27
|
+
os = described_class.new
|
28
|
+
expect(os).not_to be_valid
|
26
29
|
|
27
|
-
|
28
|
-
|
30
|
+
os.name = 'test'
|
31
|
+
expect(os).to be_valid
|
32
|
+
end
|
29
33
|
end
|
30
34
|
|
31
35
|
describe "#to_s" do
|
32
36
|
it "should convert both the name and version" do
|
33
|
-
|
34
|
-
|
35
|
-
os.to_s.should == 'Linux 2.6.23'
|
37
|
+
expect(subject.to_s).to eq("#{name} #{version}")
|
36
38
|
end
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
+
context "without a version" do
|
41
|
+
subject { described_class.new(:name => name) }
|
40
42
|
|
41
|
-
|
43
|
+
it "should convert just the name if there is no version" do
|
44
|
+
expect(subject.to_s).to eq(name)
|
45
|
+
end
|
42
46
|
end
|
43
47
|
end
|
44
48
|
end
|
data/spec/password_spec.rb
CHANGED
@@ -1,14 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
|
2
3
|
require 'ronin/password'
|
3
4
|
|
4
5
|
describe Password do
|
5
6
|
let(:password) { 'secret' }
|
6
|
-
subject { Password.new(:clear_text => password) }
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
subject { described_class.new(:clear_text => password) }
|
9
|
+
|
10
|
+
describe "validations" do
|
11
|
+
it "should require a clear-text password" do
|
12
|
+
pass = described_class.new
|
13
|
+
expect(pass).not_to be_valid
|
10
14
|
|
11
|
-
|
15
|
+
pass.clear_text = password
|
16
|
+
expect(pass).to be_valid
|
17
|
+
end
|
12
18
|
end
|
13
19
|
|
14
20
|
describe "#digest" do
|
@@ -17,23 +23,25 @@ describe Password do
|
|
17
23
|
it "should calculate the digest of the password" do
|
18
24
|
digest = subject.digest(:sha1)
|
19
25
|
|
20
|
-
digest.
|
26
|
+
expect(digest).to eq(Digest::SHA1.hexdigest(password))
|
21
27
|
end
|
22
28
|
|
23
29
|
it "should calculate the digest of the password and prepended salt" do
|
24
30
|
digest = subject.digest(:sha1, :prepend_salt => salt)
|
25
31
|
|
26
|
-
digest.
|
32
|
+
expect(digest).to eq(Digest::SHA1.hexdigest(salt + password))
|
27
33
|
end
|
28
34
|
|
29
35
|
it "should calculate the digest of the password and appended salt" do
|
30
36
|
digest = subject.digest(:sha1, :append_salt => salt)
|
31
37
|
|
32
|
-
digest.
|
38
|
+
expect(digest).to eq(Digest::SHA1.hexdigest(password + salt))
|
33
39
|
end
|
34
40
|
end
|
35
41
|
|
36
|
-
|
37
|
-
|
42
|
+
describe "#to_s" do
|
43
|
+
it "should include the password" do
|
44
|
+
expect(subject.to_s).to eq(password)
|
45
|
+
end
|
38
46
|
end
|
39
47
|
end
|