htauth 1.2.0 → 2.0.0
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/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
|