htauth 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY.md +7 -0
- data/Manifest.txt +7 -5
- data/README.md +0 -1
- data/Rakefile +0 -2
- data/bin/htdigest-ruby +2 -9
- data/bin/htpasswd-ruby +2 -9
- data/lib/htauth.rb +2 -3
- data/lib/htauth/algorithm.rb +54 -14
- data/lib/htauth/cli.rb +8 -0
- data/lib/htauth/cli/digest.rb +130 -0
- data/lib/htauth/cli/passwd.rb +179 -0
- data/lib/htauth/console.rb +31 -0
- data/lib/htauth/crypt.rb +1 -2
- data/lib/htauth/digest_entry.rb +31 -11
- data/lib/htauth/digest_file.rb +95 -9
- data/lib/htauth/entry.rb +2 -2
- data/lib/htauth/error.rb +18 -0
- data/lib/htauth/file.rb +87 -16
- data/lib/htauth/md5.rb +1 -2
- data/lib/htauth/passwd_entry.rb +47 -15
- data/lib/htauth/passwd_file.rb +108 -11
- data/lib/htauth/plaintext.rb +1 -2
- data/lib/htauth/sha1.rb +13 -13
- data/lib/htauth/version.rb +2 -19
- data/spec/cli/digest_spec.rb +150 -0
- data/spec/cli/passwd_spec.rb +206 -0
- data/spec/digest_entry_spec.rb +55 -55
- data/spec/digest_file_spec.rb +50 -50
- data/spec/md5_spec.rb +9 -9
- data/spec/passwd_entry_spec.rb +133 -133
- data/spec/passwd_file_spec.rb +50 -50
- data/spec/plaintext_spec.rb +8 -8
- data/spec/sha1_spec.rb +8 -8
- data/spec/spec_helper.rb +7 -0
- metadata +11 -23
- data/lib/htauth/digest.rb +0 -132
- data/lib/htauth/errors.rb +0 -10
- data/lib/htauth/passwd.rb +0 -181
- data/spec/digest_spec.rb +0 -150
- data/spec/passwd_spec.rb +0 -206
data/spec/passwd_entry_spec.rb
CHANGED
@@ -2,137 +2,137 @@ require 'spec_helper'
|
|
2
2
|
require 'htauth/passwd_entry'
|
3
3
|
|
4
4
|
describe HTAuth::PasswdEntry do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
5
|
+
before(:each) do
|
6
|
+
@alice = HTAuth::PasswdEntry.new("alice", "a secret", "crypt", { :salt => "mD" })
|
7
|
+
@bob = HTAuth::PasswdEntry.new("bob", "b secret", "crypt", { :salt => "b8"})
|
8
|
+
@salt = "lo1tk/.."
|
9
|
+
end
|
10
|
+
|
11
|
+
it "initializes with a user and realm" do
|
12
|
+
@alice.user.must_equal "alice"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has the correct crypt password" do
|
16
|
+
@alice.password = "a secret"
|
17
|
+
@alice.digest.must_equal "mDwdZuXalQ5zk"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "encrypts correctly for md5" do
|
21
|
+
bob = HTAuth::PasswdEntry.new("bob", "b secret", "md5", { :salt => @salt })
|
22
|
+
bob.digest.must_equal "$apr1$lo1tk/..$CarApvZPee0F6Wj1U0GxZ1"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "encrypts correctly for sha1" do
|
26
|
+
bob = HTAuth::PasswdEntry.new("bob", "b secret", "sha1", { :salt => @salt })
|
27
|
+
bob.digest.must_equal "{SHA}b/tjGXbX80MEKVnF200S43ca4hY="
|
28
|
+
end
|
29
|
+
|
30
|
+
it "encrypts correctly for plaintext" do
|
31
|
+
bob = HTAuth::PasswdEntry.new("bob", "b secret", "plaintext", { :salt => @salt })
|
32
|
+
bob.digest.must_equal "b secret"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "encrypts with crypt as a default, when parsed from crypt()'d line" do
|
36
|
+
bob2 = HTAuth::PasswdEntry.from_line(@bob.to_s)
|
37
|
+
bob2.algorithm.must_be_instance_of( Array )
|
38
|
+
bob2.algorithm.size.must_equal 2
|
39
|
+
bob2.password = "another secret"
|
40
|
+
bob2.algorithm.must_be_instance_of(HTAuth::Crypt)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "encrypts with crypt as a default, when parsed from plaintext line" do
|
44
|
+
p = HTAuth::PasswdEntry.new('paul', 'p secret', 'plaintext')
|
45
|
+
p2 = HTAuth::PasswdEntry.from_line(p.to_s)
|
46
|
+
p2.algorithm.must_be_instance_of(Array)
|
47
|
+
p2.algorithm.size.must_equal 2
|
48
|
+
p2.password = "another secret"
|
49
|
+
p2.algorithm.must_be_instance_of(HTAuth::Crypt)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "encrypts with md5 as default, when parsed from an md5 line" do
|
53
|
+
m = HTAuth::PasswdEntry.new("mary", "m secret", "md5")
|
54
|
+
m2 = HTAuth::PasswdEntry.from_line(m.to_s)
|
55
|
+
m2.algorithm.must_be_instance_of(HTAuth::Md5)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "encrypts with sha1 as default, when parsed from an sha1 line" do
|
59
|
+
s = HTAuth::PasswdEntry.new("steve", "s secret", "sha1")
|
60
|
+
s2 = HTAuth::PasswdEntry.from_line(s.to_s)
|
61
|
+
s2.algorithm.must_be_instance_of(HTAuth::Sha1)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "determins the algorithm to be crypt when checking a password" do
|
65
|
+
bob2 = HTAuth::PasswdEntry.from_line(@bob.to_s)
|
66
|
+
bob2.algorithm.must_be_instance_of(Array)
|
67
|
+
bob2.algorithm.size.must_equal 2
|
68
|
+
bob2.authenticated?("b secret").must_equal true
|
69
|
+
bob2.algorithm.must_be_instance_of(HTAuth::Crypt)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "determins the algorithm to be plain when checking a password" do
|
73
|
+
bob2 = HTAuth::PasswdEntry.from_line("bob:b secret")
|
74
|
+
bob2.algorithm.must_be_instance_of(Array)
|
75
|
+
bob2.algorithm.size.must_equal 2
|
76
|
+
bob2.authenticated?("b secret").must_equal true
|
77
|
+
bob2.algorithm.must_be_instance_of(HTAuth::Plaintext)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "authenticates correctly against md5" do
|
81
|
+
m = HTAuth::PasswdEntry.new("mary", "m secret", "md5")
|
82
|
+
m2 = HTAuth::PasswdEntry.from_line(m.to_s)
|
83
|
+
m2.authenticated?("m secret").must_equal true
|
84
|
+
end
|
85
|
+
|
86
|
+
it "authenticates correctly against sha1" do
|
87
|
+
s = HTAuth::PasswdEntry.new("steve", "s secret", "sha1")
|
88
|
+
s2 = HTAuth::PasswdEntry.from_line(s.to_s)
|
89
|
+
s2.authenticated?("s secret").must_equal true
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
it "returns username for a key" do
|
96
|
+
@alice.key.must_equal "alice"
|
97
|
+
end
|
98
|
+
|
99
|
+
it "checks the password correctly" do
|
100
|
+
@bob.authenticated?("b secret").must_equal true
|
101
|
+
end
|
102
|
+
|
103
|
+
it "formats correctly when put to a string" do
|
104
|
+
@bob.to_s.must_equal "bob:b8Ml4Jp9I0N8E"
|
105
|
+
end
|
106
|
+
|
107
|
+
it "parses an input line" do
|
108
|
+
@bob_new = HTAuth::PasswdEntry.from_line("bob:b8Ml4Jp9I0N8E")
|
109
|
+
@bob.user.must_equal @bob_new.user
|
110
|
+
@bob.digest.must_equal @bob_new.digest
|
111
|
+
end
|
112
|
+
|
113
|
+
it "knows if an input line is a possible entry and raises an exception" do
|
114
|
+
lambda { HTAuth::PasswdEntry.is_entry!("#stuff") }.must_raise(HTAuth::InvalidPasswdEntry)
|
115
|
+
lambda { HTAuth::PasswdEntry.is_entry!("this:that:other:stuff") }.must_raise(HTAuth::InvalidPasswdEntry)
|
116
|
+
lambda { HTAuth::PasswdEntry.is_entry!("this:that:other") }.must_raise(HTAuth::InvalidPasswdEntry)
|
117
|
+
lambda { HTAuth::PasswdEntry.is_entry!("this:that:0a90549e8ffb2dd62f98252a95d88xyz") }.must_raise(HTAuth::InvalidPasswdEntry)
|
118
|
+
end
|
119
|
+
|
120
|
+
it "knows if an input line is a possible entry and returns false" do
|
121
|
+
HTAuth::PasswdEntry.is_entry?("#stuff").must_equal false
|
122
|
+
HTAuth::PasswdEntry.is_entry?("this:that:other:stuff").must_equal false
|
123
|
+
HTAuth::PasswdEntry.is_entry?("this:that:other").must_equal false
|
124
|
+
HTAuth::PasswdEntry.is_entry?("this:that:0a90549e8ffb2dd62f98252a95d88xyz").must_equal false
|
125
|
+
end
|
126
|
+
|
127
|
+
it "knows if an input line is a possible entry and returns true" do
|
128
|
+
HTAuth::PasswdEntry.is_entry?("bob:irRm0g.SDfCyI").must_equal true
|
129
|
+
HTAuth::PasswdEntry.is_entry?("bob:b secreat").must_equal true
|
130
|
+
HTAuth::PasswdEntry.is_entry?("bob:{SHA}b/tjGXbX80MEKVnF200S43ca4hY=").must_equal true
|
131
|
+
HTAuth::PasswdEntry.is_entry?("bob:$apr1$lo1tk/..$CarApvZPee0F6Wj1U0GxZ1").must_equal true
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
it "duplicates itself" do
|
136
|
+
@alice.dup.to_s.must_equal @alice.to_s
|
137
|
+
end
|
138
138
|
end
|
data/spec/passwd_file_spec.rb
CHANGED
@@ -4,63 +4,63 @@ require 'tempfile'
|
|
4
4
|
|
5
5
|
describe HTAuth::PasswdFile do
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@tf2 = Tempfile.new("rpasswrd-passwd-empty")
|
14
|
-
@tf2.close
|
15
|
-
@empty_passwd_file = HTAuth::PasswdFile.new(@tf2.path)
|
16
|
-
end
|
7
|
+
before(:each) do
|
8
|
+
@tf = Tempfile.new("rpasswrd-passwd")
|
9
|
+
@tf.write(IO.read(PASSWD_ORIGINAL_TEST_FILE))
|
10
|
+
@tf.close
|
11
|
+
@passwd_file = HTAuth::PasswdFile.new(@tf.path)
|
17
12
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
13
|
+
@tf2 = Tempfile.new("rpasswrd-passwd-empty")
|
14
|
+
@tf2.close
|
15
|
+
@empty_passwd_file = HTAuth::PasswdFile.new(@tf2.path)
|
16
|
+
end
|
22
17
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
after(:each) do
|
19
|
+
@tf2.close(true)
|
20
|
+
@tf.close(true)
|
21
|
+
end
|
27
22
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
it "can update an entry in an already existing passwd file, algorithm can change" do
|
34
|
-
@passwd_file.add_or_update("alice", "a new secret", "sha1")
|
35
|
-
@passwd_file.contents.must_equal IO.read(PASSWD_UPDATE_TEST_FILE)
|
36
|
-
end
|
23
|
+
it "can add a new entry to an already existing passwd file" do
|
24
|
+
@passwd_file.add_or_update("charlie", "c secret", "sha1")
|
25
|
+
@passwd_file.contents.must_equal IO.read(PASSWD_ADD_TEST_FILE)
|
26
|
+
end
|
37
27
|
|
38
|
-
|
39
|
-
|
40
|
-
|
28
|
+
it "can tell if an entry already exists in the passwd file" do
|
29
|
+
@passwd_file.has_entry?("alice").must_equal true
|
30
|
+
@passwd_file.has_entry?("david").must_equal false
|
31
|
+
end
|
41
32
|
|
42
|
-
|
43
|
-
|
44
|
-
|
33
|
+
it "can update an entry in an already existing passwd file, algorithm can change" do
|
34
|
+
@passwd_file.add_or_update("alice", "a new secret", "sha1")
|
35
|
+
@passwd_file.contents.must_equal IO.read(PASSWD_UPDATE_TEST_FILE)
|
36
|
+
end
|
45
37
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
38
|
+
it "fetches a copy of an entry" do
|
39
|
+
@passwd_file.fetch("alice").to_s.must_equal "alice:$apr1$DghnA...$CsPcgerfsI/Ryy0AOAJtb0"
|
40
|
+
end
|
50
41
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
42
|
+
it "raises an error if an attempt is made to alter a non-existenet file" do
|
43
|
+
lambda { HTAuth::PasswdFile.new("some-file") }.must_raise(HTAuth::FileAccessError)
|
44
|
+
end
|
45
|
+
|
46
|
+
# this test will only work on systems that have /etc/ssh_host_rsa_key
|
47
|
+
it "raises an error if an attempt is made to open a file where no permissions are granted" do
|
48
|
+
lambda { HTAuth::PasswdFile.new("/etc/ssh_host_rsa_key") }.must_raise(HTAuth::FileAccessError)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "deletes an entry" do
|
52
|
+
@passwd_file.delete("bob")
|
53
|
+
@passwd_file.contents.must_equal IO.read(PASSWD_DELETE_TEST_FILE)
|
54
|
+
end
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
lines = IO.readlines(@tf.path)
|
62
|
-
lines.size.must_equal 1
|
63
|
-
lines.first.split(':').first.must_equal "alice"
|
64
|
-
lines.first.split(':').last.must_match( /\$apr1\$/ )
|
56
|
+
it "is usable in a ruby manner and yeilds itself when opened" do
|
57
|
+
HTAuth::PasswdFile.open(@tf.path) do |pf|
|
58
|
+
pf.add_or_update("alice", "a new secret", "md5")
|
59
|
+
pf.delete('bob')
|
65
60
|
end
|
61
|
+
lines = IO.readlines(@tf.path)
|
62
|
+
lines.size.must_equal 1
|
63
|
+
lines.first.split(':').first.must_equal "alice"
|
64
|
+
lines.first.split(':').last.must_match( /\$apr1\$/ )
|
65
|
+
end
|
66
66
|
end
|
data/spec/plaintext_spec.rb
CHANGED
@@ -2,14 +2,14 @@ require 'spec_helper'
|
|
2
2
|
require 'htauth/plaintext'
|
3
3
|
|
4
4
|
describe HTAuth::Plaintext do
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
it "has a prefix" do
|
6
|
+
HTAuth::Plaintext.new.prefix.must_equal ""
|
7
|
+
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
it "encrypts the same way that apache does" do
|
10
|
+
apache_result = "a secret"
|
11
|
+
pt = HTAuth::Plaintext.new
|
12
|
+
pt.encode("a secret").must_equal apache_result
|
13
|
+
end
|
14
14
|
end
|
15
15
|
|
data/spec/sha1_spec.rb
CHANGED
@@ -2,14 +2,14 @@ require 'spec_helper'
|
|
2
2
|
require 'htauth/sha1'
|
3
3
|
|
4
4
|
describe HTAuth::Sha1 do
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
it "has a prefix" do
|
6
|
+
HTAuth::Sha1.new.prefix.must_equal "{SHA}"
|
7
|
+
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
it "encrypts the same way that apache does" do
|
10
|
+
apache_result = "{SHA}ZrnlrvmM7ZCOV3FAvM7la89NKbk="
|
11
|
+
sha1 = HTAuth::Sha1.new
|
12
|
+
sha1.encode("a secret").must_equal apache_result
|
13
|
+
end
|
14
14
|
end
|
15
15
|
|
data/spec/spec_helper.rb
CHANGED
@@ -19,3 +19,10 @@ DIGEST_ADD_TEST_FILE = File.join(File.dirname(__FILE__), "test.add.digest"
|
|
19
19
|
DIGEST_UPDATE_TEST_FILE = File.join(File.dirname(__FILE__), "test.update.digest")
|
20
20
|
DIGEST_DELETE_TEST_FILE = File.join(File.dirname(__FILE__), "test.delete.digest")
|
21
21
|
DIGEST_COMMENTED_TEST_FILE = File.join(File.dirname(__FILE__), "test.comments.digest")
|
22
|
+
|
23
|
+
require 'stringio'
|
24
|
+
class ConsoleIO < StringIO
|
25
|
+
def noecho(&block)
|
26
|
+
yield self
|
27
|
+
end
|
28
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: htauth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Hinegardner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -66,20 +66,6 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0.9'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: highline
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '1.6'
|
76
|
-
type: :runtime
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '1.6'
|
83
69
|
description: HTAuth is a pure ruby replacement for the Apache support programs htdigest
|
84
70
|
and htpasswd. Command line and API access are provided for access to htdigest and
|
85
71
|
htpasswd files.
|
@@ -104,28 +90,30 @@ files:
|
|
104
90
|
- bin/htpasswd-ruby
|
105
91
|
- lib/htauth.rb
|
106
92
|
- lib/htauth/algorithm.rb
|
93
|
+
- lib/htauth/cli.rb
|
94
|
+
- lib/htauth/cli/digest.rb
|
95
|
+
- lib/htauth/cli/passwd.rb
|
96
|
+
- lib/htauth/console.rb
|
107
97
|
- lib/htauth/crypt.rb
|
108
|
-
- lib/htauth/digest.rb
|
109
98
|
- lib/htauth/digest_entry.rb
|
110
99
|
- lib/htauth/digest_file.rb
|
111
100
|
- lib/htauth/entry.rb
|
112
|
-
- lib/htauth/
|
101
|
+
- lib/htauth/error.rb
|
113
102
|
- lib/htauth/file.rb
|
114
103
|
- lib/htauth/md5.rb
|
115
|
-
- lib/htauth/passwd.rb
|
116
104
|
- lib/htauth/passwd_entry.rb
|
117
105
|
- lib/htauth/passwd_file.rb
|
118
106
|
- lib/htauth/plaintext.rb
|
119
107
|
- lib/htauth/sha1.rb
|
120
108
|
- lib/htauth/version.rb
|
109
|
+
- spec/cli/digest_spec.rb
|
110
|
+
- spec/cli/passwd_spec.rb
|
121
111
|
- spec/crypt_spec.rb
|
122
112
|
- spec/digest_entry_spec.rb
|
123
113
|
- spec/digest_file_spec.rb
|
124
|
-
- spec/digest_spec.rb
|
125
114
|
- spec/md5_spec.rb
|
126
115
|
- spec/passwd_entry_spec.rb
|
127
116
|
- spec/passwd_file_spec.rb
|
128
|
-
- spec/passwd_spec.rb
|
129
117
|
- spec/plaintext_spec.rb
|
130
118
|
- spec/sha1_spec.rb
|
131
119
|
- spec/spec_helper.rb
|
@@ -170,14 +158,14 @@ summary: HTAuth is a pure ruby replacement for the Apache support programs htdig
|
|
170
158
|
and htpasswd. Command line and API access are provided for access to htdigest and
|
171
159
|
htpasswd files.
|
172
160
|
test_files:
|
161
|
+
- spec/cli/digest_spec.rb
|
162
|
+
- spec/cli/passwd_spec.rb
|
173
163
|
- spec/crypt_spec.rb
|
174
164
|
- spec/digest_entry_spec.rb
|
175
165
|
- spec/digest_file_spec.rb
|
176
|
-
- spec/digest_spec.rb
|
177
166
|
- spec/md5_spec.rb
|
178
167
|
- spec/passwd_entry_spec.rb
|
179
168
|
- spec/passwd_file_spec.rb
|
180
|
-
- spec/passwd_spec.rb
|
181
169
|
- spec/plaintext_spec.rb
|
182
170
|
- spec/sha1_spec.rb
|
183
171
|
- spec/spec_helper.rb
|