warden_strategies 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,5 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ rdoc
5
+ pkg
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Daniel Neighman
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,18 @@
1
+ = warden_strategies
2
+
3
+ A collection of warden strategies.
4
+
5
+ == Note on Patches/Pull Requests
6
+
7
+ * Fork the project.
8
+ * Make your feature addition or bug fix.
9
+ * Add tests for it. This is important so I don't break it in a
10
+ future version unintentionally.
11
+ * Commit, do not mess with rakefile, version, or history.
12
+ (if you want to have your own version, that is fine but
13
+ bump version in a commit by itself I can ignore when I pull)
14
+ * Send me a pull request. Bonus points for topic branches.
15
+
16
+ == Copyright
17
+
18
+ Copyright (c) 2009 Daniel Neighman. See LICENSE for details.
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "warden_strategies"
8
+ gem.summary = %Q{A collection of strategies for Warden}
9
+ gem.description = %Q{A collection of basic warden strategies}
10
+ gem.email = "has.sox@gmail.com"
11
+ gem.homepage = "http://github.com/hassox/warden_strategies"
12
+ gem.authors = ["Daniel Neighman"]
13
+ gem.add_development_dependency "rspec"
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+ rescue LoadError
17
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
18
+ end
19
+
20
+ require 'spec/rake/spectask'
21
+ Spec::Rake::SpecTask.new(:spec) do |spec|
22
+ spec.libs << 'lib' << 'spec'
23
+ spec.spec_files = FileList['spec/**/*_spec.rb']
24
+ end
25
+
26
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
27
+ spec.libs << 'lib' << 'spec'
28
+ spec.pattern = 'spec/**/*_spec.rb'
29
+ spec.rcov = true
30
+ end
31
+
32
+ task :spec => :check_dependencies
33
+
34
+ task :default => :spec
35
+
36
+ require 'rake/rdoctask'
37
+ Rake::RDocTask.new do |rdoc|
38
+ if File.exist?('VERSION')
39
+ version = File.read('VERSION')
40
+ else
41
+ version = ""
42
+ end
43
+
44
+ rdoc.rdoc_dir = 'rdoc'
45
+ rdoc.title = "warden_strategies #{version}"
46
+ rdoc.rdoc_files.include('README*')
47
+ rdoc.rdoc_files.include('lib/**/*.rb')
48
+ end
@@ -0,0 +1,15 @@
1
+ require 'warden'
2
+ $:.push(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ module WardenStrategies
5
+ autoload :Base, "warden_strategies/base"
6
+ autoload :Simple, "warden_strategies/simple"
7
+ autoload :Bcrypt, "warden_strategies/bcrypt"
8
+
9
+ module Mixins
10
+ module Bcrypt
11
+ autoload :Base, "warden_strategies/bcrypt/base"
12
+ autoload :ActiveRecord, "warden_strategies/bcrypt/active_record"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,35 @@
1
+ Rails.configuration.middleware.use RailsWarden::Manager do |manager|
2
+ manager.default_strategies :bcrypt
3
+ manager.failure_app = SessionsController
4
+ end
5
+
6
+ # Setup Session Serialization
7
+ Warden::Manager.serialize_into_session{ |user| [user.class, user.id] }
8
+ Warden::Manager.serialize_from_session{ |klass, id| klass.find(id) }
9
+
10
+ Warden::Strategies.add(:bcrypt) do
11
+ def valid?
12
+ params["username"] || params["password"]
13
+ end
14
+
15
+ def authenticate!
16
+ return fail! unless user = User.find_by_login(params["username"])
17
+
18
+ if user.crypted_password == "#{params["password"]}#{user.password_salt}"
19
+ success!(user)
20
+ else
21
+ errors.add(:login, "Username or Password incorrect")
22
+ fail!
23
+ end
24
+ end
25
+ end
26
+
27
+ Warden::Manager.after_authentication do |user, auth, opts|
28
+ old_current = user.current_login_at
29
+ old_current ||= user.current_login_at = DateTime.now
30
+ user.last_login_at = old_current
31
+ user.current_login_at = DateTime.now
32
+ user.login_count = 0 if user.login_count.nil?
33
+ user.login_count += 1
34
+ user.save(false)
35
+ end
@@ -0,0 +1,14 @@
1
+ module WardenStrategies
2
+ class Base < Warden::Strategies::Base
3
+
4
+ # Provides access to a user class.
5
+ # this should be overwritten in sub-classes to provde access
6
+ # to particular user classes
7
+ #
8
+ # @return A class to use as the "User" class for the request to use
9
+ # @api overwritable
10
+ def user_class
11
+ User
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,27 @@
1
+ module WardenStrategies
2
+
3
+ # Create a migration for the following fields:
4
+ # _crypted_password - String
5
+ # _password_salt - String
6
+ #
7
+ # Then include WardenStrategies::Bcrypt::Mixins::ActiveRecord
8
+ #
9
+ # @example
10
+ # class MyClass < ActiveRecord::Base
11
+ # include WardenStrategies::Bcrypt::Mixins::ActiveRecord
12
+ # end
13
+ class Bcrypt < WardenStrategies::Simple
14
+ module Mixins
15
+ autoload :Base, "warden_strategies/bcrypt/base"
16
+ autoload :ActiveRecord, "warden_strategies/bcrypt/active_record"
17
+ end
18
+
19
+ config do |c|
20
+ c[:required_params] = [:login, :password]
21
+ c[:authenticate_method] = :authenticate_with_bcrypt
22
+ c[:error_message] = "Username or Password incorrect"
23
+ end
24
+ end
25
+ end
26
+
27
+ Warden::Strategies.add(:simple_bcypt, WardenStrategies::Bcrypt)
@@ -0,0 +1,28 @@
1
+ module WardenStrategies
2
+ class Bcrypt
3
+
4
+ module Mixins
5
+ module ActiveRecord
6
+ def self.included(base)
7
+ base.class_eval do
8
+ extend WardenStrategies::Bcrypt::Mixins::ActiveRecord::ClassMethods
9
+ include WardenStrategies::Bcrypt::Mixins::Base
10
+
11
+ attr_accessor :password, :password_confirmation
12
+
13
+ validates_presence_of :crypted_password, :on => :update, :if => :has_no_credentials?
14
+ validates_confirmation_of :password, :if => :password
15
+ end
16
+ end
17
+
18
+ module ClassMethods
19
+ def authenticate_with_bcrypt(login, password)
20
+ user = self.find_by_login(login)
21
+ return nil unless user
22
+ user.crypted_password == "#{password}#{user.password_salt}"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,37 @@
1
+ module WardenStrategies
2
+ class Bcypt
3
+ module Mixins
4
+ module Base
5
+ def password=(pass)
6
+ @password = pass
7
+ unless pass.blank?
8
+ self._crypted_password = pass.nil? ? nil : ::BCrypt::Password.create("#{pass}#{password_salt}", :cost => 10)
9
+ end
10
+ @password
11
+ end
12
+
13
+ def crypted_password
14
+ @crypted_password ||= begin
15
+ ep = _crypted_password
16
+ ep.nil? ? nil : ::BCrypt::Password.new(ep)
17
+ end
18
+ end
19
+
20
+ def password_salt
21
+ @password_salt ||= begin
22
+ pws = _password_salt
23
+ pws.nil? ? (self._password_salt = Digest::SHA512.hexdigest(unique_token)) : pws
24
+ end
25
+ end
26
+
27
+ def has_no_credentials?
28
+ self._crypted_password.blank?
29
+ end
30
+
31
+ def unique_token
32
+ Time.now.to_s + (1..10).collect{ rand.to_s }.join
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,141 @@
1
+ module WardenStrategies
2
+
3
+ # The Simple strategy is a strategy that will accept a simple list of requried parameters, a user class
4
+ # an authenticate_method and an error message and use those to authenticate a "user"
5
+ #
6
+ # The following example will create a strategy that will check an account for a user login
7
+ # with the Account class using the authenitcate_account_holder method.
8
+ #
9
+ # for the given params "login" => "fred", "password => "sekrit", "account" => "main"
10
+ # The following would be called if all parameters are present
11
+ # Account.authenticate_account_holder("fred", "sekrit", "main")
12
+ #
13
+ # @example
14
+ # class AccountStrategy < WardenStrategies::Base
15
+ # config.merge!(
16
+ # :user_class => Account,
17
+ # :authenticate_method => :authenticate_account_holder,
18
+ # :required_params => [:login, :password, :account]
19
+ # )
20
+ # end
21
+ #
22
+ # Warden::Strategies.add(:account, AccountStrategy)
23
+ #
24
+ # # calls Account.authenticate_account_holder("login_param", "password_param", "account_param")
25
+ #
26
+ # @see WardenStrategies::Simple.config
27
+ class Simple < WardenStrategies::Base
28
+
29
+ # Sets the configuration for this strategy.
30
+ #
31
+ # The config will return and yeild a hash (if a block is given) with the configuration for this strategy.
32
+ # The following options are available
33
+ #
34
+ # :user_class
35
+ # :required_params
36
+ # :authenticate_method
37
+ # :error_message
38
+ #
39
+ # :user_class option will set the class for this strategy. If no user class is defined the super classes user_class method is called instead. Default - User
40
+ #
41
+ # :required_params is an array of required params that must be present for this strategy to run. Once the strategy is run, then these parameters are passed to the :authenticate_method in the order specified.
42
+ # The params can be specified as a symbol, a string, or a nested param. To specify a nested param seperate the string with a :
43
+ # Default []
44
+ #
45
+ # :authenticate_method specifies the method to call on the user_class when all the parameters are present
46
+ # Default :authenticate
47
+ #
48
+ # :error_message specifies the error message to call when the strategy fails (providing it's valid)
49
+ # Default "Could not login"
50
+ #
51
+ # @example
52
+ # class MyStrategy < WardenStrategies::Simple
53
+ # config do |c|
54
+ # c[:required_params] = [:login, :password]
55
+ # c[:authenticate_method] = :authenticate_with_password
56
+ # end
57
+ #
58
+ # @api public
59
+ def self.config
60
+ @config ||= {
61
+ :authenticate_method => :authenticate,
62
+ :error_message => "Could not login"
63
+ }
64
+ yield @config if block_given?
65
+ @config
66
+ end
67
+
68
+ # Returns the configured required_params for this class
69
+ # @api public
70
+ # @see WardenStrategies::Simple.config
71
+ def self.required_params
72
+ config[:required_params] ||= []
73
+ end
74
+
75
+ # Provides access to the required param for this class
76
+ # @see WardenStrategies::Simple.required_params
77
+ # @api public
78
+ def required_params
79
+ self.class.required_params
80
+ end
81
+
82
+ # Provides access to the User class for this strategy
83
+ # @see WardenStrategies::Simple.config
84
+ # @api public
85
+ def user_class
86
+ config[:user_class] || super
87
+ end
88
+
89
+ # Sets used in strategy selection. Returns true if all required_params are available in the request
90
+ # @return true if all valid params are returned false otherwise
91
+ # @see Warden::Strategy::Base#valid?
92
+ # @api private
93
+ def valid?
94
+ required_param_values.nil? ? false : !required_param_values.include?(nil)
95
+ end
96
+
97
+ # The workhorse. Will pass all requred_param_values to the configured authenticate_method
98
+ # @see WardenStrategies::Simple.config
99
+ # @see Warden::Strategy::Base#authenticate!
100
+ # @api private
101
+ def authenticate!
102
+ if u = user_class.send(config[:authenticate_method], *required_param_values)
103
+ success!(u)
104
+ else
105
+ fail!(config[:error_message])
106
+ end
107
+ end
108
+
109
+ # @return the values of the required params for the required_params, or nil if one of the params is not found
110
+ # @api public
111
+ def required_param_values
112
+ result = required_params.map do |val|
113
+ r = extract_value_from_params(val)
114
+ break if r.nil?
115
+ r
116
+ end
117
+ result
118
+ end
119
+
120
+ # Provides access to the config hash for this strategy
121
+ def config
122
+ self.class.config
123
+ end
124
+
125
+ private
126
+ def extract_value_from_params(key)
127
+ case key
128
+ when String, Symbol
129
+ keys = key.to_s.split(":")
130
+ if keys.size == 1
131
+ params[keys.first]
132
+ else
133
+ keys.inject(params){|p,k| p[k]}
134
+ end
135
+ when Proc
136
+ instance_eval(&key)
137
+ end
138
+ end
139
+
140
+ end
141
+ end
@@ -0,0 +1,10 @@
1
+ module WardenStrategies
2
+ module Spec
3
+ def env_with_params(path = "/", params = {})
4
+ method = params.fetch(:method, "GET")
5
+ Rack::MockRequest.env_for(path, :input => Rack::Utils.build_query(params),
6
+ 'HTTP_VERSION' => '1.1',
7
+ 'REQUEST_METHOD' => "#{method}")
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'rack'
4
+ require 'warden_strategies'
5
+ require 'spec'
6
+ require 'spec/autorun'
7
+
8
+ Dir[File.join(File.dirname(__FILE__), "helpers", "**/*.rb")].each do |f|
9
+ require f
10
+ end
11
+
12
+ Spec::Runner.configure do |config|
13
+ config.include(WardenStrategies::Spec)
14
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
+
3
+ describe WardenStrategies::Base do
4
+ before do
5
+ @env = Rack::MockRequest.env_for("/")
6
+ class ::User; end
7
+ end
8
+
9
+ it "should allow me to get the User class by default" do
10
+ s = WardenStrategies::Base.new(@env, scope = :default)
11
+ s.user_class.should == User
12
+ end
13
+
14
+ it "should allow me to get this in a subclass" do
15
+ class ::AStrategy < WardenStrategies::Base
16
+ end
17
+
18
+ s = AStrategy.new(@env)
19
+ s.user_class.should == User
20
+ end
21
+
22
+
23
+
24
+ end
@@ -0,0 +1,169 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
+
3
+ describe WardenStrategies::Simple do
4
+ before do
5
+ @env = Rack::MockRequest.env_for("/", :input => Rack::Utils.build_query(
6
+ :name => "Homer", "foo[bar]" => "baz"
7
+ ))
8
+ class ::User; end
9
+ end
10
+
11
+ it "should setup the spec correctly" do
12
+ req = Rack::Request.new(@env)
13
+ req.params["name"].should == "Homer"
14
+ req.params["foo"]["bar"].should == "baz"
15
+ end
16
+
17
+ it "should provide me with a configuration hash" do
18
+ WardenStrategies::Simple.config.should be_a_kind_of(Hash)
19
+ end
20
+
21
+ it "should allow me to specify the configuration via a block" do
22
+ WardenStrategies::Simple.config do |c|
23
+ c[:stuff] = :stuff
24
+ end
25
+ WardenStrategies::Simple.config[:stuff].should == :stuff
26
+ end
27
+
28
+ describe "required params" do
29
+ before do
30
+ class SimpleFoo < WardenStrategies::Simple
31
+ config[:required_params] = [:login, :password]
32
+ end
33
+ end
34
+
35
+ it "should set simple symbol or string required params" do
36
+ SimpleFoo.config[:required_params] = [:login, "password"]
37
+ SimpleFoo.required_params.should == [:login, "password"]
38
+ end
39
+
40
+ it "should provide me with access to the required params at an instance level" do
41
+ SimpleFoo.config[:required_params] = [:login, "password"]
42
+ SimpleFoo.new(@env).required_params.should == [:login, "password"]
43
+ end
44
+
45
+ it "should provide the required param values from the required params" do
46
+ env = env_with_params("/", :login => "foo", :password => "bar")
47
+ SimpleFoo.config[:required_params] = [:login, "password"]
48
+ s = SimpleFoo.new(env).required_param_values.should == ["foo", "bar"]
49
+ end
50
+
51
+ it "should set nested_params with a single value" do
52
+ env = env_with_params("/", :login => "foo", "foo[bar]" => "baz")
53
+ SimpleFoo.config[:required_params] = [:login, "foo:bar"]
54
+ s = SimpleFoo.new(env).required_param_values.should == ["foo", "baz"]
55
+ end
56
+
57
+ it "should set deeply nested params" do
58
+ env = env_with_params("/", :login => "foo", "foo[bar][baz]" => "paz")
59
+ SimpleFoo.config[:required_params] = [:login, "foo:bar:baz"]
60
+ s = SimpleFoo.new(env).required_param_values.should == ["foo", "paz"]
61
+ end
62
+
63
+ it "should set rediculously deeply nested params" do
64
+ env = env_with_params("/", :login => "foo", "foo[bar][baz][paz][soz][kaz]" => "homer")
65
+ SimpleFoo.config[:required_params] = [:login, "foo:bar:baz:paz:soz:kaz"]
66
+ s = SimpleFoo.new(env).required_param_values.should == ["foo", "homer"]
67
+ end
68
+
69
+ it "should set a nested param as a proc" do
70
+ env = env_with_params("/", :login => "foo", "sammy" => "barry")
71
+ SimpleFoo.config[:required_params] = [:login, Proc.new{ params["sammy"] }]
72
+ s = SimpleFoo.new(env).required_param_values.should == ["foo", "barry"]
73
+ end
74
+
75
+ it "should be valid if all required params are found" do
76
+ env = env_with_params("/", :login => "foo", "sammy" => "barry")
77
+ SimpleFoo.config[:required_params] = [:login, :sammy]
78
+ s = SimpleFoo.new(env).should be_valid
79
+ end
80
+
81
+ it "should be invalid if all required params are not found" do
82
+ env = env_with_params("/", :login => "foo")
83
+ SimpleFoo.config[:required_params] = [:login, :bar]
84
+ s = SimpleFoo.new(env).should_not be_valid
85
+ end
86
+
87
+ it "should be valid with no required_params set" do
88
+ env = env_with_params("/")
89
+ SimpleFoo.config[:required_params] = nil
90
+ s = SimpleFoo.new(env).should be_valid
91
+ end
92
+
93
+ it "should be valid with an emtpy array for a required_params" do
94
+ env = env_with_params("/")
95
+ SimpleFoo.config[:required_params] = []
96
+ s = SimpleFoo.new(env).should be_valid
97
+ end
98
+
99
+ it "should be invalid with a nested param missing" do
100
+ env = env_with_params("/")
101
+ SimpleFoo.config[:required_params] = [:login, "foo:bar:baz"]
102
+ s = SimpleFoo.new(env).should_not be_valid
103
+ end
104
+ end
105
+
106
+ describe "validating a strategy" do
107
+ before do
108
+ class SimpleFoo < WardenStrategies::Simple; end
109
+ class ::User
110
+ def self.authenticate(login)
111
+ login == "fred"
112
+ end
113
+ end
114
+
115
+ app = lambda do |env|
116
+ env['warden'].authenticate!
117
+ Rack::Response.new("OK").finish
118
+ end
119
+
120
+ fail_app = lambda do |env|
121
+ Rack::Response.new("FAIL").finish
122
+ end
123
+
124
+ Warden::Strategies.add(:simple, SimpleFoo)
125
+
126
+ @app = Rack::Builder.new do
127
+ use Rack::Session::Cookie
128
+ use Warden::Manager do |manager|
129
+ manager.default_strategies :simple
130
+ manager.failure_app = fail_app
131
+ end
132
+ run app
133
+ end
134
+ end
135
+
136
+ after do
137
+ Warden::Strategies.clear!
138
+ end
139
+
140
+ it "should validate a class by supplying the required params to the authenticate method" do
141
+ env = env_with_params("/", :login => "fred")
142
+ SimpleFoo.config[:required_params] = [:login]
143
+ s = SimpleFoo.new(env)
144
+ User.should_receive(:authenticate).with("fred").and_return("fred")
145
+ s.authenticate!
146
+ s.result.should == :success
147
+ end
148
+
149
+ it "should fail the validation if the param is nil or false" do
150
+ env = env_with_params("/")
151
+ SimpleFoo.config[:required_params] = [:login]
152
+ s = SimpleFoo.new(env)
153
+ s.should_not be_valid
154
+ User.should_not_receive(:authenticate)
155
+ @app.call(env)
156
+ end
157
+
158
+ it "should validate with a different return method" do
159
+ env = env_with_params("/", :login => "fred")
160
+ SimpleFoo.config[:required_params] = [:login]
161
+ SimpleFoo.config[:authenticate_method] = :authenticate_for_fred
162
+ User.should_receive(:authenticate_for_fred).and_return("fred")
163
+ s = SimpleFoo.new(env)
164
+ s.should be_valid
165
+ result = @app.call(env)
166
+ result[2].body.should include("OK")
167
+ end
168
+ end
169
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: warden_strategies
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Neighman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-25 00:00:00 +11:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: A collection of basic warden strategies
26
+ email: has.sox@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - LICENSE
33
+ - README.rdoc
34
+ files:
35
+ - .document
36
+ - .gitignore
37
+ - LICENSE
38
+ - README.rdoc
39
+ - Rakefile
40
+ - lib/warden_strategies.rb
41
+ - lib/warden_strategies/authlogic.rb
42
+ - lib/warden_strategies/base.rb
43
+ - lib/warden_strategies/bcrypt.rb
44
+ - lib/warden_strategies/bcrypt/active_record.rb
45
+ - lib/warden_strategies/bcrypt/base.rb
46
+ - lib/warden_strategies/simple.rb
47
+ - spec/helpers/request_helper.rb
48
+ - spec/spec_helper.rb
49
+ - spec/warden_strategies/base_spec.rb
50
+ - spec/warden_strategies/simple_spec.rb
51
+ has_rdoc: true
52
+ homepage: http://github.com/hassox/warden_strategies
53
+ licenses: []
54
+
55
+ post_install_message:
56
+ rdoc_options:
57
+ - --charset=UTF-8
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: "0"
71
+ version:
72
+ requirements: []
73
+
74
+ rubyforge_project:
75
+ rubygems_version: 1.3.5
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: A collection of strategies for Warden
79
+ test_files:
80
+ - spec/helpers/request_helper.rb
81
+ - spec/spec_helper.rb
82
+ - spec/warden_strategies/base_spec.rb
83
+ - spec/warden_strategies/simple_spec.rb