shield 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,19 +2,23 @@ require "digest/sha2"
2
2
 
3
3
  module Shield
4
4
  module Password
5
- def self.encrypt(password, salt = generate_salt)
6
- digest(password, salt) + salt
5
+ autoload :Simple, "shield/password/simple"
6
+ autoload :PBKDF2, "shield/password/pbkdf2"
7
+
8
+ def self.strategy=(s)
9
+ @strategy = s
7
10
  end
8
11
 
9
- def self.check(password, encrypted)
10
- sha512, salt = encrypted.to_s[0..127], encrypted.to_s[128..-1]
12
+ def self.strategy
13
+ @strategy ||= Shield::Password::Simple
14
+ end
11
15
 
12
- digest(password, salt) == sha512
16
+ def self.encrypt(password, salt = generate_salt)
17
+ strategy.encrypt(password, salt)
13
18
  end
14
19
 
15
- private
16
- def self.digest(password, salt)
17
- Digest::SHA512.hexdigest("#{ password }#{ salt }")
20
+ def self.check(password, encrypted)
21
+ strategy.check(password, encrypted)
18
22
  end
19
23
 
20
24
  def self.generate_salt
@@ -0,0 +1,23 @@
1
+ require "pbkdf2"
2
+
3
+ module Shield
4
+ module Password
5
+ module PBKDF2
6
+ extend Shield::Password::Simple
7
+
8
+ def self.digest(password, salt)
9
+ ::PBKDF2.new do |p|
10
+ p.password = password
11
+ p.salt = salt
12
+ p.iterations = iterations
13
+ p.hash_function = :sha512
14
+ end.hex_string
15
+ end
16
+
17
+ class << self
18
+ attr_accessor :iterations
19
+ end
20
+ @iterations = 5000
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ module Shield
2
+ module Password
3
+ module Simple
4
+ extend self
5
+
6
+ def encrypt(password, salt)
7
+ digest(password, salt) + salt
8
+ end
9
+
10
+ def check(password, encrypted)
11
+ sha512, salt = encrypted.to_s[0..127], encrypted.to_s[128..-1]
12
+
13
+ digest(password, salt) == sha512
14
+ end
15
+
16
+ private
17
+ def digest(password, salt)
18
+ Digest::SHA512.hexdigest("#{ password }#{ salt }")
19
+ end
20
+ end
21
+ end
22
+ end
@@ -9,8 +9,8 @@ class Cutest::Scope
9
9
  include Rack::Test::Methods
10
10
 
11
11
  def assert_redirected_to(path)
12
- assert 302 == last_response.status
13
- assert path == last_response.headers["Location"]
12
+ assert_equal 302, last_response.status
13
+ assert_equal path, URI(last_response.headers["Location"]).path
14
14
  end
15
15
 
16
16
  def session
@@ -1,23 +1,43 @@
1
1
  require File.expand_path("helper", File.dirname(__FILE__))
2
2
 
3
- test "encrypt" do
4
- encrypted = Shield::Password.encrypt("password")
5
- assert Shield::Password.check("password", encrypted)
6
- end
3
+ # Shield::Password::Simple
4
+ scope do
5
+ test "encrypt" do
6
+ encrypted = Shield::Password.encrypt("password")
7
+ assert Shield::Password.check("password", encrypted)
8
+ end
9
+
10
+ test "with custom 64 character salt" do
11
+ encrypted = Shield::Password.encrypt("password", "A" * 64)
12
+ assert Shield::Password.check("password", encrypted)
13
+ end
14
+
15
+ test "nil password doesn't raise" do
16
+ ex = nil
7
17
 
8
- test "with custom 64 character salt" do
9
- encrypted = Shield::Password.encrypt("password", "A" * 64)
10
- assert Shield::Password.check("password", encrypted)
18
+ begin
19
+ encrypted = Shield::Password.encrypt(nil)
20
+ rescue Exception => e
21
+ ex = e
22
+ end
23
+
24
+ assert nil == ex
25
+ end
11
26
  end
12
27
 
13
- test "nil password doesn't raise" do
14
- ex = nil
28
+ # Shield::Password::PBKDF2
29
+ scope do
30
+ setup do
31
+ Shield::Password.strategy = Shield::Password::PBKDF2
32
+ end
15
33
 
16
- begin
17
- encrypted = Shield::Password.encrypt(nil)
18
- rescue Exception => e
19
- ex = e
34
+ test "encrypt" do
35
+ encrypted = Shield::Password.encrypt("password")
36
+ assert Shield::Password.check("password", encrypted)
20
37
  end
21
38
 
22
- assert nil == ex
39
+ test "with custom 64 character salt" do
40
+ encrypted = Shield::Password.encrypt("password", "A" * 64)
41
+ assert Shield::Password.check("password", encrypted)
42
+ end
23
43
  end
metadata CHANGED
@@ -1,118 +1,95 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: shield
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 3
9
- version: 0.0.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Michel Martens
13
9
  - Damian Janowski
14
10
  - Cyril David
15
11
  autorequire:
16
12
  bindir: bin
17
13
  cert_chain: []
18
-
19
- date: 2011-02-16 00:00:00 +08:00
20
- default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
14
+ date: 2012-01-20 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
23
17
  name: cutest
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirement: &2156259380 !ruby/object:Gem::Requirement
26
19
  none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- segments:
31
- - 0
32
- version: "0"
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
33
24
  type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: sinatra
37
25
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
26
+ version_requirements: *2156259380
27
+ - !ruby/object:Gem::Dependency
28
+ name: sinatra
29
+ requirement: &2156274580 !ruby/object:Gem::Requirement
39
30
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- segments:
44
- - 0
45
- version: "0"
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
46
35
  type: :development
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: rack-test
50
36
  prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
37
+ version_requirements: *2156274580
38
+ - !ruby/object:Gem::Dependency
39
+ name: rack-test
40
+ requirement: &2156273800 !ruby/object:Gem::Requirement
52
41
  none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- segments:
57
- - 0
58
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
59
46
  type: :development
60
- version_requirements: *id003
61
- description: "\n Provides all the protocol you need in order to do authentication on\n your rack application. The implementation specifics can be found in\n http://github.com/cyx/shield-contrib\n "
62
- email:
47
+ prerelease: false
48
+ version_requirements: *2156273800
49
+ description: ! "\n Provides all the protocol you need in order to do authentication
50
+ on\n your rack application. The implementation specifics can be found in\n http://github.com/cyx/shield-contrib\n
51
+ \ "
52
+ email:
63
53
  - michel@soveran.com
64
54
  - djanowski@dimaion.com
65
- - cyx@pipetodevnull.com
55
+ - me@cyrildavid.com
66
56
  executables: []
67
-
68
57
  extensions: []
69
-
70
58
  extra_rdoc_files: []
71
-
72
- files:
59
+ files:
73
60
  - lib/shield/helpers.rb
74
61
  - lib/shield/model.rb
75
62
  - lib/shield/password.rb
63
+ - lib/shield/password/simple.rb
64
+ - lib/shield/password/pbkdf2.rb
76
65
  - lib/shield.rb
77
- - README.markdown
78
- - LICENSE
79
- - Rakefile
80
66
  - test/helper.rb
81
67
  - test/model_test.rb
82
68
  - test/password_hash_test.rb
83
69
  - test/shield_test.rb
84
70
  - test/sinatra_test.rb
85
- has_rdoc: true
86
71
  homepage: http://github.com/cyx/shield
87
72
  licenses: []
88
-
89
73
  post_install_message:
90
74
  rdoc_options: []
91
-
92
- require_paths:
75
+ require_paths:
93
76
  - lib
94
- required_ruby_version: !ruby/object:Gem::Requirement
77
+ required_ruby_version: !ruby/object:Gem::Requirement
95
78
  none: false
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- segments:
100
- - 0
101
- version: "0"
102
- required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
84
  none: false
104
- requirements:
105
- - - ">="
106
- - !ruby/object:Gem::Version
107
- segments:
108
- - 0
109
- version: "0"
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
110
89
  requirements: []
111
-
112
90
  rubyforge_project: shield
113
- rubygems_version: 1.3.7
91
+ rubygems_version: 1.8.11
114
92
  signing_key:
115
93
  specification_version: 3
116
94
  summary: Generic authentication protocol for rack applications.
117
95
  test_files: []
118
-
data/LICENSE DELETED
@@ -1,19 +0,0 @@
1
- Copyright (c) 2009 Michel Martens, Damian Janowski and Cyril David
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy
4
- of this software and associated documentation files (the "Software"), to deal
5
- in the Software without restriction, including without limitation the rights
6
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- copies of the Software, and to permit persons to whom the Software is
8
- furnished to do so, subject to the following conditions:
9
-
10
- The above copyright notice and this permission notice shall be included in
11
- all copies or substantial portions of the Software.
12
-
13
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- THE SOFTWARE.
@@ -1,36 +0,0 @@
1
- # Shield
2
-
3
- Shield
4
-
5
- _n. A solid piece of metal code used to protect your application._
6
-
7
- ## Why another authentication library?
8
-
9
- 1. Because most of the other libraries are too huge.
10
- 2. Extending other libraries is a pain.
11
- 3. Writing code is fun :-)
12
-
13
- ## Description of Shield
14
-
15
- 1. Simple
16
- 2. Doesn't get in the way
17
- 3. Extensible (see [shield-contrib][shield-contrib]).
18
-
19
- ## Getting started
20
-
21
- The fastest way to get started is by using one of the drop-in solutions
22
- in [shield-contrib][shield-contrib].
23
-
24
- ## Tutorials
25
-
26
- You can learn more by reading through some of our tutorials:
27
-
28
- 1. [Sinatra & OHM][sin-ohm]
29
- 2. [Sinatra & Sequel][sin-sequel]
30
-
31
-
32
- [sin]: http://sinatrarb.com
33
- [ohm]: http://ohm.keyvalue.org
34
- [shield-contrib]: http://github.com/cyx/shield-contrib
35
- [sin-ohm]: http://cyx.github.com/shield/sinatra-ohm.html
36
- [sin-sequel]: http://cyx.github.com/shield/sinatra-sequel.html
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- desc "Run all tests using cutest."
2
- task :test do
3
- system("cutest -r ./test/helper ./test/*_test.rb")
4
- end
5
-
6
- task :default => :test