ya 0.1.0 → 0.2.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.
- data/README.rdoc +16 -0
- data/VERSION +1 -1
- data/lib/ya/digest.rb +3 -3
- data/lib/ya/directory.rb +22 -6
- data/test/test_ya.rb +39 -4
- data/ya.gemspec +1 -1
- metadata +1 -1
data/README.rdoc
CHANGED
@@ -3,6 +3,22 @@
|
|
3
3
|
Ya is a simple authentication module that uses a YAML flat file as its directory
|
4
4
|
store.
|
5
5
|
|
6
|
+
== Synopsis
|
7
|
+
|
8
|
+
Access = Ya.open(Rails.root + 'config' + 'access.yml')
|
9
|
+
|
10
|
+
Access.add('username', 'password')
|
11
|
+
Access.authenticate('username', 'fails')
|
12
|
+
# => false
|
13
|
+
Access.authenticate('nobody', 'fails')
|
14
|
+
# => nil
|
15
|
+
Access.authenticate('username', 'password')
|
16
|
+
# => { :username => { :salt => ?, :hash => ? } }
|
17
|
+
|
18
|
+
Access.mod('username', :meta => 'awesome')
|
19
|
+
Access.lookup('username')
|
20
|
+
# => { :username => { :salt => ?, :hash => ?, :meta => 'awesome' } }
|
21
|
+
|
6
22
|
== Copyright
|
7
23
|
|
8
24
|
Copyright (c) 2009 Carsten Nielsen. See LICENSE for details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/ya/digest.rb
CHANGED
@@ -14,13 +14,13 @@ module Ya
|
|
14
14
|
::Digest::SHA1.hexdigest("#{Time.now}-#{rand RANDOM_SEED}")
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def salt_and_hash(password)
|
18
18
|
salt = random_hash
|
19
19
|
hash = salt_password(salt, password)
|
20
|
-
{ :
|
20
|
+
{ :salt => salt, :hash => hash }
|
21
21
|
end
|
22
22
|
|
23
|
-
module_function :salt_password, :random_hash, :
|
23
|
+
module_function :salt_password, :random_hash, :salt_and_hash
|
24
24
|
|
25
25
|
end
|
26
26
|
end
|
data/lib/ya/directory.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module Ya
|
2
2
|
class Directory
|
3
3
|
|
4
|
-
def initialize(
|
5
|
-
@
|
6
|
-
FileUtils.touch(@
|
4
|
+
def initialize(directory_file)
|
5
|
+
@directory_file = directory_file
|
6
|
+
FileUtils.touch(@directory_file)
|
7
7
|
end
|
8
8
|
|
9
9
|
def lookup(login)
|
@@ -18,7 +18,19 @@ module Ya
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def add(login, password, attrs = {})
|
21
|
-
|
21
|
+
dump_record(login.to_sym => Digest.salt_and_hash(password).merge(attrs))
|
22
|
+
end
|
23
|
+
|
24
|
+
def mod(login, attrs = {})
|
25
|
+
record = lookup(login)
|
26
|
+
return nil unless record
|
27
|
+
dump_record(login.to_sym => record.merge(attrs))
|
28
|
+
end
|
29
|
+
|
30
|
+
def reset(login, new_password)
|
31
|
+
record = lookup(login)
|
32
|
+
return nil unless record
|
33
|
+
dump_record(login.to_sym => record.merge(Digest.salt_and_hash(new_password)))
|
22
34
|
end
|
23
35
|
|
24
36
|
def remove(login)
|
@@ -28,12 +40,16 @@ module Ya
|
|
28
40
|
|
29
41
|
private
|
30
42
|
|
43
|
+
def dump_record(record)
|
44
|
+
dump(load.merge(record))
|
45
|
+
end
|
46
|
+
|
31
47
|
def load
|
32
|
-
YAML.load_file(@
|
48
|
+
YAML.load_file(@directory_file) || {}
|
33
49
|
end
|
34
50
|
|
35
51
|
def dump(directory)
|
36
|
-
File.open(@
|
52
|
+
File.open(@directory_file, 'w') { |f| f.puts(directory.to_yaml) }
|
37
53
|
end
|
38
54
|
|
39
55
|
end
|
data/test/test_ya.rb
CHANGED
@@ -33,6 +33,42 @@ class TestYa < Test::Unit::TestCase
|
|
33
33
|
FileUtils.rm('test.yml')
|
34
34
|
end
|
35
35
|
|
36
|
+
context '#reset (for existing record)' do
|
37
|
+
setup { @directory.reset('heycarsten', 'passnerd') }
|
38
|
+
|
39
|
+
should 'change the password' do
|
40
|
+
assert @directory.authenticate('heycarsten', 'passnerd')
|
41
|
+
end
|
42
|
+
|
43
|
+
should 'not change anything else' do
|
44
|
+
assert_equal 'data', @directory.lookup('heycarsten')[:meta]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context '#reset (for nonexistant record)' do
|
49
|
+
setup { @directory.reset('nobody', 'password') }
|
50
|
+
|
51
|
+
should 'do nothing' do
|
52
|
+
assert_nil @directory.lookup('nobody')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context '#mod (for existing record)' do
|
57
|
+
setup { @directory.mod('heycarsten', :meta => 'face') }
|
58
|
+
|
59
|
+
should 'update the record' do
|
60
|
+
assert_equal 'face', @directory.lookup('heycarsten')[:meta]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context '#mod (for nonexistant record)' do
|
65
|
+
setup { @directory.mod('nobody', :meta => 'value') }
|
66
|
+
|
67
|
+
should 'do nothing' do
|
68
|
+
assert_nil @directory.lookup('nobody')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
36
72
|
context '#remove (for a record that exists)' do
|
37
73
|
setup { @directory.remove('heycarsten') }
|
38
74
|
|
@@ -75,10 +111,9 @@ class TestYa < Test::Unit::TestCase
|
|
75
111
|
context 'Ya::Digest' do
|
76
112
|
context '.generate' do
|
77
113
|
should 'return a hash representing a new record' do
|
78
|
-
|
79
|
-
assert_equal 40,
|
80
|
-
assert_equal 40,
|
81
|
-
assert_equal 'stuff', record[:username][:extra]
|
114
|
+
h = Ya::Digest.salt_and_hash('password')
|
115
|
+
assert_equal 40, h[:salt].length
|
116
|
+
assert_equal 40, h[:hash].length
|
82
117
|
end
|
83
118
|
end
|
84
119
|
|
data/ya.gemspec
CHANGED