htauth 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,208 @@
1
+ require File.join(File.dirname(__FILE__),"spec_helper.rb")
2
+ require 'htauth/passwd'
3
+ require 'tempfile'
4
+
5
+ describe HTAuth::Passwd do
6
+
7
+ before(:each) do
8
+
9
+ # existing
10
+ @tf = Tempfile.new("rpasswrd-passwd-test")
11
+ @tf.write(IO.read(PASSWD_ORIGINAL_TEST_FILE))
12
+ @tf.close
13
+ @htauth = HTAuth::Passwd.new
14
+
15
+ # new file
16
+ @new_file = File.join(File.dirname(@tf.path), "new-testfile")
17
+
18
+ # rework stdout and stderr
19
+ @stdout = StringIO.new
20
+ @old_stdout = $stdout
21
+ $stdout = @stdout
22
+
23
+ @stderr = StringIO.new
24
+ @old_stderr = $stderr
25
+ $stderr = @stderr
26
+
27
+ @stdin = StringIO.new
28
+ @old_stdin = $stdin
29
+ $stdin = @stdin
30
+ end
31
+
32
+ after(:each) do
33
+ @tf.close(true)
34
+ $stderr = @old_stderr
35
+ $stdout = @old_stdout
36
+ $stdin = @old_stdin
37
+ File.unlink(@new_file) if File.exist?(@new_file)
38
+ end
39
+
40
+ it "displays help appropriately" do
41
+ begin
42
+ @htauth.run([ "-h" ])
43
+ rescue SystemExit => se
44
+ se.status.should == 1
45
+ @stdout.string.should =~ /passwordfile username/m
46
+ end
47
+ end
48
+
49
+ it "displays the version appropriately" do
50
+ begin
51
+ @htauth.run([ "--version" ])
52
+ rescue SystemExit => se
53
+ se.status.should == 1
54
+ @stdout.string.should =~ /version #{HTAuth::VERSION}/
55
+ end
56
+ end
57
+
58
+ it "creates a new file with one md5 entry" do
59
+ begin
60
+ @stdin.puts "a secret"
61
+ @stdin.puts "a secret"
62
+ @stdin.rewind
63
+ @htauth.run([ "-m", "-c", @new_file, "alice" ])
64
+ rescue SystemExit => se
65
+ se.status.should == 0
66
+ l = IO.readlines(@new_file)
67
+ fields = l.first.split(':')
68
+ fields.first.should == "alice"
69
+ fields.last.should =~ /^\$apr1\$/
70
+ end
71
+ end
72
+
73
+ it "truncates an exiting file if told to create a new file" do
74
+ before_lines = IO.readlines(@tf.path)
75
+ begin
76
+ @stdin.puts "b secret"
77
+ @stdin.puts "b secret"
78
+ @stdin.rewind
79
+ @htauth.run([ "-c", @tf.path, "bob"])
80
+ rescue SystemExit => se
81
+ se.status.should == 0
82
+ after_lines = IO.readlines(@tf.path)
83
+ after_lines.size.should == 1
84
+ before_lines.size.should == 2
85
+ end
86
+ end
87
+
88
+ it "adds an entry to an existing file and force SHA" do
89
+ before_lines = IO.readlines(@tf.path)
90
+ begin
91
+ @stdin.puts "c secret"
92
+ @stdin.puts "c secret"
93
+ @stdin.rewind
94
+ @htauth.run([ "-s", @tf.path, "charlie" ])
95
+ rescue SystemExit => se
96
+ se.status.should == 0
97
+ after_lines = IO.readlines(@tf.path)
98
+ after_lines.should have(3).lines
99
+ al = after_lines.last.split(':')
100
+ al.first.should == "charlie"
101
+ al.last.should =~ /\{SHA\}/
102
+ end
103
+ end
104
+
105
+ it "can create a plaintext encrypted file" do
106
+ begin
107
+ @stdin.puts "a bad password"
108
+ @stdin.puts "a bad password"
109
+ @stdin.rewind
110
+ @htauth.run(["-c", "-p", @tf.path, "bradley"])
111
+ rescue SystemExit => se
112
+ se.status.should == 0
113
+ IO.read(@tf.path).strip.should == "bradley:a bad password"
114
+ end
115
+ end
116
+
117
+ it "has a batch mode for command line passwords" do
118
+ begin
119
+ @htauth.run(["-c", "-p", "-b", @tf.path, "bradley", "a bad password"])
120
+ rescue SystemExit => se
121
+ se.status.should == 0
122
+ IO.read(@tf.path).strip.should == "bradley:a bad password"
123
+ end
124
+ end
125
+
126
+ it "updates an entry in an existing file and force crypt" do
127
+ before_lines = IO.readlines(@tf.path)
128
+ begin
129
+ @stdin.puts "a new secret"
130
+ @stdin.puts "a new secret"
131
+ @stdin.rewind
132
+ @htauth.run([ "-d", @tf.path, "alice" ])
133
+ rescue SystemExit => se
134
+ @stderr.string.should == ""
135
+ se.status.should == 0
136
+ after_lines = IO.readlines(@tf.path)
137
+ after_lines.size.should == before_lines.size
138
+
139
+ a_b = before_lines.first.split(":")
140
+ a_a = after_lines.first.split(":")
141
+
142
+ a_b.first.should == a_a.first
143
+ a_b.last.should_not == a_a.last
144
+ end
145
+ end
146
+
147
+ it "deletes an entry in an existing file" do
148
+ begin
149
+ @htauth.run([ "-D", @tf.path, "bob" ])
150
+ rescue SystemExit => se
151
+ @stderr.string.should == ""
152
+ se.status.should == 0
153
+ IO.read(@tf.path).should == IO.read(PASSWD_DELETE_TEST_FILE)
154
+ end
155
+ end
156
+
157
+ it "sends to STDOUT when the -n option is used" do
158
+ begin
159
+ @htauth.run(["-n", "-p", "-b", "bradley", "a bad password"])
160
+ rescue SystemExit => se
161
+ se.status.should == 0
162
+ STDOUT.puts @stdout.string
163
+ @stdout.string.strip.should == "bradley:a bad password"
164
+ end
165
+ end
166
+
167
+ it "has an error if it does not have permissions on the file" do
168
+ begin
169
+ @stdin.puts "a secret"
170
+ @stdin.puts "a secret"
171
+ @stdin.rewind
172
+ @htauth.run([ "-c", "/etc/you-cannot-create-me", "alice"])
173
+ rescue SystemExit => se
174
+ @stderr.string.should =~ %r{Password file failure \(/etc/you-cannot-create-me\)}m
175
+ se.status.should == 1
176
+ end
177
+ end
178
+
179
+ it "has an error if the input passwords do not match" do
180
+ begin
181
+ @stdin.puts "a secret"
182
+ @stdin.puts "a bad secret"
183
+ @stdin.rewind
184
+ @htauth.run([ @tf.path, "alice"])
185
+ rescue SystemExit => se
186
+ @stderr.string.should =~ /They don't match, sorry./m
187
+ se.status.should == 1
188
+ end
189
+ end
190
+
191
+ it "has an error if the options are incorrect" do
192
+ begin
193
+ @htauth.run(["--blah"])
194
+ rescue SystemExit => se
195
+ @stderr.string.should =~ /ERROR:/m
196
+ se.status.should == 1
197
+ end
198
+ end
199
+
200
+ it "errors if send to stdout and create a new file options are both used" do
201
+ begin
202
+ @htauth.run(["-c", "-n"])
203
+ rescue SystemExit => se
204
+ @stderr.string.should =~ /ERROR:/m
205
+ se.status.should == 1
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,18 @@
1
+
2
+
3
+ require File.join(File.dirname(__FILE__),"spec_helper.rb")
4
+
5
+ require 'htauth/sha1'
6
+
7
+ describe HTAuth::Plaintext do
8
+ it "has a prefix" do
9
+ HTAuth::Plaintext.new.prefix.should == ""
10
+ end
11
+
12
+ it "encrypts the same way that apache does" do
13
+ apache_result = "a secret"
14
+ pt = HTAuth::Plaintext.new
15
+ pt.encode("a secret").should == apache_result
16
+ end
17
+ end
18
+
data/spec/sha1_spec.rb ADDED
@@ -0,0 +1,17 @@
1
+
2
+ require File.join(File.dirname(__FILE__),"spec_helper.rb")
3
+
4
+ require 'htauth/sha1'
5
+
6
+ describe HTAuth::Sha1 do
7
+ it "has a prefix" do
8
+ HTAuth::Sha1.new.prefix.should == "{SHA}"
9
+ end
10
+
11
+ it "encrypts the same way that apache does" do
12
+ apache_result = "{SHA}ZrnlrvmM7ZCOV3FAvM7la89NKbk="
13
+ sha1 = HTAuth::Sha1.new
14
+ sha1.encode("a secret").should == apache_result
15
+ end
16
+ end
17
+
@@ -0,0 +1,17 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+
4
+ $: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib"))
5
+ require 'htauth'
6
+
7
+ PASSWD_ORIGINAL_TEST_FILE = File.join(File.dirname(__FILE__), "test.original.passwd")
8
+ PASSWD_ADD_TEST_FILE = File.join(File.dirname(__FILE__), "test.add.passwd")
9
+ PASSWD_UPDATE_TEST_FILE = File.join(File.dirname(__FILE__), "test.update.passwd")
10
+ PASSWD_DELETE_TEST_FILE = File.join(File.dirname(__FILE__), "test.delete.passwd")
11
+ PASSWD_COMMENTED_TEST_FILE = File.join(File.dirname(__FILE__), "test.comments.passwd")
12
+
13
+ DIGEST_ORIGINAL_TEST_FILE = File.join(File.dirname(__FILE__), "test.original.digest")
14
+ DIGEST_ADD_TEST_FILE = File.join(File.dirname(__FILE__), "test.add.digest")
15
+ DIGEST_UPDATE_TEST_FILE = File.join(File.dirname(__FILE__), "test.update.digest")
16
+ DIGEST_DELETE_TEST_FILE = File.join(File.dirname(__FILE__), "test.delete.digest")
17
+ DIGEST_COMMENTED_TEST_FILE = File.join(File.dirname(__FILE__), "test.comments.digest")
@@ -0,0 +1,3 @@
1
+ bob:htauth:fcbeab6821d2ab3b00934c958db0fd1e
2
+ alice:htauth:2f361db93147d84831eb34f19d05bfbb
3
+ charlie:htauth-new:1ec9da72c45d9140949f338dc537c089
@@ -0,0 +1,3 @@
1
+ alice:$apr1$DghnA...$CsPcgerfsI/Ryy0AOAJtb0
2
+ bob:SFUkhjaJc18KA
3
+ charlie:{SHA}Cqrkk2no+ly0vYClUp49OJQahSE=
@@ -0,0 +1 @@
1
+ bob:htauth:fcbeab6821d2ab3b00934c958db0fd1e
@@ -0,0 +1 @@
1
+ alice:$apr1$DghnA...$CsPcgerfsI/Ryy0AOAJtb0
@@ -0,0 +1,2 @@
1
+ bob:htauth:fcbeab6821d2ab3b00934c958db0fd1e
2
+ alice:htauth:2f361db93147d84831eb34f19d05bfbb
@@ -0,0 +1,2 @@
1
+ alice:$apr1$DghnA...$CsPcgerfsI/Ryy0AOAJtb0
2
+ bob:SFUkhjaJc18KA
@@ -0,0 +1,2 @@
1
+ bob:htauth:fcbeab6821d2ab3b00934c958db0fd1e
2
+ alice:htauth:c32a4df25c6ecf75f3eaeb96771520de
@@ -0,0 +1,2 @@
1
+ alice:{SHA}GnoUUjgrLF07/6L9lW2BcaDXxB0=
2
+ bob:SFUkhjaJc18KA
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.4
3
+ specification_version: 1
4
+ name: htauth
5
+ version: !ruby/object:Gem::Version
6
+ version: 1.0.0
7
+ date: 2008-02-06 00:00:00 -07:00
8
+ summary: HTAuth provides htdigest and htpasswd support.
9
+ require_paths:
10
+ - lib
11
+ email: jeremy@hinegardner.org
12
+ homepage: http://copiousfreetime.rubyforge.org/htauth
13
+ rubyforge_project: copiousfreetime
14
+ description: HTAuth is a pure ruby replacement for the Apache support programs htdigest and htpasswd. Command line and API access are provided for access to htdigest and htpasswd files.
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message: |
29
+ Try out 'htpasswd-ruby' or 'htdigest-ruby' to get started.
30
+
31
+ authors:
32
+ - Jeremy Hinegardner
33
+ files:
34
+ - spec/crypt_spec.rb
35
+ - spec/digest_entry_spec.rb
36
+ - spec/digest_file_spec.rb
37
+ - spec/digest_spec.rb
38
+ - spec/md5_spec.rb
39
+ - spec/passwd_entry_spec.rb
40
+ - spec/passwd_file_spec.rb
41
+ - spec/passwd_spec.rb
42
+ - spec/plaintext_spec.rb
43
+ - spec/sha1_spec.rb
44
+ - spec/spec_helper.rb
45
+ - spec/test.add.digest
46
+ - spec/test.add.passwd
47
+ - spec/test.delete.digest
48
+ - spec/test.delete.passwd
49
+ - spec/test.original.digest
50
+ - spec/test.original.passwd
51
+ - spec/test.update.digest
52
+ - spec/test.update.passwd
53
+ - CHANGES
54
+ - LICENSE
55
+ - README
56
+ - lib/htauth/algorithm.rb
57
+ - lib/htauth/crypt.rb
58
+ - lib/htauth/digest.rb
59
+ - lib/htauth/digest_entry.rb
60
+ - lib/htauth/digest_file.rb
61
+ - lib/htauth/entry.rb
62
+ - lib/htauth/file.rb
63
+ - lib/htauth/gemspec.rb
64
+ - lib/htauth/md5.rb
65
+ - lib/htauth/passwd.rb
66
+ - lib/htauth/passwd_entry.rb
67
+ - lib/htauth/passwd_file.rb
68
+ - lib/htauth/plaintext.rb
69
+ - lib/htauth/sha1.rb
70
+ - lib/htauth/specification.rb
71
+ - lib/htauth/version.rb
72
+ - lib/htauth.rb
73
+ - bin/htdigest-ruby
74
+ - bin/htpasswd-ruby
75
+ test_files:
76
+ - spec/crypt_spec.rb
77
+ - spec/digest_entry_spec.rb
78
+ - spec/digest_file_spec.rb
79
+ - spec/digest_spec.rb
80
+ - spec/md5_spec.rb
81
+ - spec/passwd_entry_spec.rb
82
+ - spec/passwd_file_spec.rb
83
+ - spec/passwd_spec.rb
84
+ - spec/plaintext_spec.rb
85
+ - spec/sha1_spec.rb
86
+ - spec/spec_helper.rb
87
+ - spec/test.add.digest
88
+ - spec/test.add.passwd
89
+ - spec/test.delete.digest
90
+ - spec/test.delete.passwd
91
+ - spec/test.original.digest
92
+ - spec/test.original.passwd
93
+ - spec/test.update.digest
94
+ - spec/test.update.passwd
95
+ rdoc_options:
96
+ - --line-numbers
97
+ - --inline-source
98
+ - --main
99
+ - README
100
+ - --title
101
+ - "'htauth -- HTAuth provides htdigest and htpasswd support.'"
102
+ extra_rdoc_files:
103
+ - CHANGES
104
+ - LICENSE
105
+ - README
106
+ executables:
107
+ - htdigest-ruby
108
+ - htpasswd-ruby
109
+ extensions: []
110
+
111
+ requirements: []
112
+
113
+ dependencies:
114
+ - !ruby/object:Gem::Dependency
115
+ name: highline
116
+ version_requirement:
117
+ version_requirements: !ruby/object:Gem::Version::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: 1.4.0
122
+ version: