rack_warden 0.0.1

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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NGNkOTlhNmIwZjk0MDZmMTRhNzM2NGMwZGZhM2E5YzJmNzU0ZmU4YQ==
5
+ data.tar.gz: !binary |-
6
+ YzcxMjBlMmE2OWVmZmJlZWQyMGI3ZDE3YjMwMTY1NzVhYzZjZmFlMg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YmY1MTJiOGU1YWRjMTQ1MzFiOGVjZDZhOTM0YjNiMGJmMzIzN2EyYTI0YWUx
10
+ Y2EwMmY4YjM0MjgzMjQ1Y2Y4MTRhZmMyMTJiMWQ2MjQ2NWM2N2NiODFjODY0
11
+ ZDhjMzc2MTZmN2U4MWFlMjE3OGE2MDNkYmYwMjc0NDBmY2JiZmU=
12
+ data.tar.gz: !binary |-
13
+ ZmJhNzQzODVjYjU1M2E0YzJjNGM1ZTRmMzhkNWM1N2Q3NTk5MjdiMmVlYjg3
14
+ NjRhOWRiYzI4YjIyZGRjYWUzYWQ0OWRhM2ZlNzNhY2NjNjcwMmE1NTcxZjc3
15
+ YWExOTQ3YTA0MjgxNzQyOTg2ZGM1ZWQ1YWMxZjk3Mjc1MGYwYTE=
@@ -0,0 +1,20 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf./log
15
+
16
+ /vendor/
17
+ *.db
18
+ todo.txt
19
+ *.bak
20
+
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rack_warden.gemspec
4
+ gemspec
5
+
6
+
7
+ # gem 'sinatra'
8
+ # gem 'sinatra-flash', require: 'sinatra/flash'
9
+ # gem 'bcrypt'
10
+ # gem 'data_mapper'
11
+ # gem 'dm-sqlite-adapter'
12
+ # gem 'warden'
13
+ #
14
+ # #gem 'shotgun'
15
+ # #gem 'tux'
16
+ # #gem 'thin'
17
+
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 William Richardson
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,63 @@
1
+ # RackWarden
2
+
3
+ RackWarden is a rack middleware mini-app that provides user authentication and management to any rack-based app. RackWarden uses Sinatra for the mini-app, Warden for authentication, and DataMapper for database connections.
4
+
5
+ RackWarden is in its infancy. It's currently a great starter to get you going with plug-in authentication for your ruby app. Over time it will grow into a more fully featured package while maintaining a focus on simplicity and transparency.
6
+
7
+ RackWarden is based on the sinatra-warden-example at https://github.com/sklise/sinatra-warden-example. If you're new to warden and/or sinatra, I highly recommend downloading and experimenting with that example.
8
+
9
+
10
+ ## Installation
11
+
12
+ In your Gemfile:
13
+
14
+ gem 'rack_warden'
15
+
16
+ Then:
17
+
18
+ $ bundle
19
+
20
+ Or install manually:
21
+
22
+ $ gem install rack_warden
23
+
24
+
25
+ ## Usage
26
+
27
+ A few simple steps will have your entire app protected.
28
+
29
+ ### Sinatra
30
+
31
+ class MySinatraApp < Sinatra::Base
32
+ use RackWarden
33
+
34
+ before do
35
+ require_login
36
+ end
37
+
38
+ get "/" do
39
+ erb "All routes are now protected"
40
+ end
41
+ end
42
+
43
+ ### Rails
44
+
45
+ application.rb or environment.rb
46
+
47
+ config.middleware.use RackWarden
48
+
49
+ application-controller.rb
50
+
51
+ before_filter :require_login
52
+
53
+ ### Others...
54
+
55
+ ## How it works
56
+
57
+ ...
58
+
59
+ ## Customizing
60
+
61
+ ...
62
+
63
+
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require './lib/rack_warden'
4
+
5
+ desc "Get version"
6
+ task :version do
7
+ puts RackWarden::VERSION
8
+ end
@@ -0,0 +1,7 @@
1
+ require 'bundler'
2
+
3
+ Bundler.require
4
+
5
+ require 'rack_warden'
6
+
7
+ run RackWarden
@@ -0,0 +1,18 @@
1
+ require "sinatra/base"
2
+ require "sinatra/flash"
3
+ require 'bcrypt'
4
+ require 'data_mapper'
5
+ require 'warden'
6
+ require 'open-uri'
7
+
8
+ # gem 'data_mapper'
9
+ # gem 'dm-sqlite-adapter'
10
+ # gem 'warden'
11
+
12
+ require "rack_warden/app"
13
+ require "rack_warden/model"
14
+ require "rack_warden/version"
15
+
16
+ # module RackWarden
17
+ # # Your code goes here...
18
+ # end
@@ -0,0 +1,232 @@
1
+ # require 'bundler'
2
+ # Bundler.require
3
+
4
+ class RackWarden < Sinatra::Base
5
+ enable :sessions
6
+ register Sinatra::Flash
7
+
8
+ set :layout, :'rack_warden_layout.html'
9
+ set :default_route, '/'
10
+ set :database, "sqlite://#{Dir.pwd}/rack_warden.sqlite.db"
11
+
12
+
13
+ # WBR - This will receive params and a block from the parent "use" statement.
14
+ # This middleware app has been modified to process the parent use-block in
15
+ # the context of the RackWarden class. So you can set settings on RackWarden,
16
+ # when you call "use RackWarden"
17
+ # Example:
18
+ #
19
+ # use RackWarden :layout=>:'my_layout' do |rack_warden_instance, parent_app_instance|
20
+ # set :myvar, 'something'
21
+ # end
22
+ #
23
+ def initialize(parent_app=nil, *args, &block)
24
+ #puts "INITIALIZE RackWarden INSTANCE [parent_app, self, args, block]: #{[parent_app, self, args, block]}"
25
+ # extract options.
26
+ opts = args.last.is_a?(Hash) ? args.pop : {}
27
+ klass = self.class
28
+ if parent_app
29
+ # append views from opts.
30
+ klass.set(:original_views, opts.has_key?(:views) ? klass.views : nil)
31
+ #klass.set(:views => [Array(klass.views), opts.delete(:views)].flatten) if opts[:views]
32
+ # set app settings with remainder of opts.
33
+ klass.set opts if opts.any?
34
+ # eval the use-block from the parent app, in context of this app.
35
+ klass.instance_exec(self, parent_instance, &block) if block_given?
36
+ # do parent_app setup.
37
+ setup_parent_app(parent_app, args, opts)
38
+ #parent_app.class.helpers(RackWardenHelpers) rescue ApplicationController.send(:include, RackWardenHelpers)
39
+ end
40
+ # finally, send parent app to super, but don't send the use-block (thus the empty proc)
41
+ super(parent_app, &Proc.new{})
42
+ end
43
+
44
+ def setup_parent_app(parent_app, args, opts)
45
+ puts "RACKWARDEN initializing parent app: #{parent_app}"
46
+ puts "RACKWARDEN parent app parents: #{parent_app.class.parents}"
47
+ puts "RACKWARDEN parent app ancestors: #{parent_app.class.ancestors}"
48
+ klass = self.class
49
+ case
50
+ when parent_app.class.ancestors.find{|x| x.to_s=='Sinatra::Base'}
51
+ parent_app.class.helpers(RackWardenHelpers)
52
+ default_parent_views = File.join(Dir.pwd,"views")
53
+ when parent_app.class.parents.find{|x| x.to_s=='ActionDispatch'}
54
+ ApplicationController.send(:include, RackWardenHelpers)
55
+ default_parent_views = File.join(Dir.pwd, "app/views")
56
+ end
57
+
58
+ new_views = []
59
+ original_views = klass.original_views
60
+ # append parent rails views folder unless opts.has_key?(:views)
61
+ new_views << default_parent_views unless opts.has_key?(:views)
62
+ # append original_views, if original_views
63
+ new_views << original_views if original_views
64
+ klass.set(:views => [Array(klass.views), new_views].flatten.compact.uniq) if new_views.any?
65
+ puts "RACKWARDEN views: #{klass.views}"
66
+ end
67
+
68
+ use Warden::Manager do |config|
69
+ # Tell Warden how to save our User info into a session.
70
+ # Sessions can only take strings, not Ruby code, we'll store
71
+ # the User's `id`
72
+ config.serialize_into_session{|user| user.id }
73
+ # Now tell Warden how to take what we've stored in the session
74
+ # and get a User from that information.
75
+ config.serialize_from_session{|id| User.get(id) }
76
+
77
+ config.scope_defaults :default,
78
+ # "strategies" is an array of named methods with which to
79
+ # attempt authentication. We have to define this later.
80
+ strategies: [:password],
81
+ # The action is a route to send the user to when
82
+ # warden.authenticate! returns a false answer. We'll show
83
+ # this route below.
84
+ action: 'auth/unauthenticated'
85
+ # When a user tries to log in and cannot, this specifies the
86
+ # app to send the user to.
87
+ config.failure_app = self
88
+ end
89
+
90
+ Warden::Manager.before_failure do |env,opts|
91
+ env['REQUEST_METHOD'] = 'POST'
92
+ end
93
+
94
+ Warden::Strategies.add(:password) do
95
+ def valid?
96
+ params['user'] && params['user']['username'] && params['user']['password']
97
+ end
98
+
99
+ def authenticate!
100
+ user = User.first(username: params['user']['username'])
101
+
102
+ if user.nil?
103
+ fail!("The username you entered does not exist.")
104
+ elsif user.authenticate(params['user']['password'])
105
+ success!(user)
106
+ else
107
+ fail!("Could not log in")
108
+ end
109
+ end
110
+
111
+ end
112
+
113
+ # Also bring these into your main app helpers.
114
+ module RackWardenHelpers
115
+ # WBR - override. This passes block to be rendered to first template that matches.
116
+ def find_template(views, name, engine, &block)
117
+ # puts "THE VIEWS: #{views}"
118
+ # puts "THE NAME: #{name}"
119
+ # puts "THE ENGINE: #{engine}"
120
+ # puts "THE BLOCK: #{block}"
121
+ Array(views).each { |v| super(v, name, engine, &block) }
122
+ end
123
+
124
+ def require_login
125
+ warden.authenticate!
126
+ end
127
+
128
+ def warden
129
+ env['warden']
130
+ end
131
+
132
+ def current_user
133
+ warden.user
134
+ end
135
+
136
+ def logged_in?
137
+ warden.authenticated?
138
+ end
139
+
140
+
141
+ # TODO: Shouldn't these be in warden block above? But they don't work there for some reason.
142
+
143
+ def valid_user_input?
144
+ params['user'] && params['user']['username'] && params['user']['password']
145
+ end
146
+
147
+ # TODO: This doesn't work.
148
+ def create_user
149
+
150
+ recaptcha
151
+
152
+ return unless valid_user_input?
153
+ user = User.create(username: params['user']['username'])
154
+ user.password = params['user']['password']
155
+ user.save && warden.set_user(user)
156
+ end
157
+
158
+ # reCAPTCHA. See https://www.google.com/recaptcha/admin#site/318693958?setup
159
+ def recaptcha(skip_redirect=false)
160
+ _recaptcha = ActiveSupport::JSON.decode(open("https://www.google.com/recaptcha/api/siteverify?secret=6LdG4v4SAAAAAJxwcS8pZRG371ZucyYg5yVUji_V&response=#{params['g-recaptcha-response']}&remoteip=#{request.ip}").read)
161
+ puts "RECAPTCHA", _recaptcha
162
+ #(render action and return) unless recaptcha['success']
163
+ unless _recaptcha['success'] || skip_redirect
164
+ flash(:rwarden)[:error] = "Please confirm you are human."
165
+ redirect back
166
+ end
167
+ end
168
+
169
+ end # RackWardenHelpers
170
+ helpers RackWardenHelpers
171
+
172
+
173
+ # WBR. I disabled this so upstream apps would work.
174
+ get '/auth' do
175
+ erb "Warden authentication for any rack based app", :layout=>settings.layout
176
+ end
177
+
178
+ get '/auth/login' do
179
+ erb :'login_user.html', :layout=>settings.layout
180
+ end
181
+
182
+ post '/auth/login' do
183
+ warden.authenticate!
184
+
185
+ flash(:rwarden)[:success] = warden.message || "Successful login"
186
+
187
+ puts "RETURN_TO #{session[:return_to]}"
188
+ if session[:return_to].nil?
189
+ redirect settings.default_route
190
+ else
191
+ redirect session[:return_to]
192
+ end
193
+ end
194
+
195
+ get '/auth/logout' do
196
+ warden.raw_session.inspect
197
+ warden.logout
198
+ flash(:rwarden)[:success] = 'You have been logged out'
199
+ redirect settings.default_route
200
+ end
201
+
202
+ get '/auth/create' do
203
+ erb :'create_user.html', :layout=>settings.layout
204
+ end
205
+
206
+ post '/auth/create' do
207
+ if create_user
208
+ flash(:rwarden)[:success] = warden.message || "Account created"
209
+ redirect session[:return_to] || settings.default_route
210
+ else
211
+ flash(:rwarden)[:error] = warden.message || "Could not create account"
212
+ redirect url('/auth/create')
213
+ end
214
+ end
215
+
216
+ post '/auth/unauthenticated' do
217
+ # I had to remove the condition, since it was not updating return path when it should have.
218
+ session[:return_to] = env['warden.options'][:attempted_path] if !request.xhr? && !env['warden.options'][:attempted_path][/login/]
219
+ puts "WARDEN ATTEMPTED PATH: #{env['warden.options'][:attempted_path]}"
220
+ puts warden
221
+ flash(:rwarden)[:error] = warden.message || "Please login to continue"
222
+ redirect url('/auth/login')
223
+ end
224
+
225
+ get '/auth/protected' do
226
+ warden.authenticate!
227
+
228
+ erb :'rack_warden_protected.html', :layout=>settings.layout
229
+ end
230
+
231
+ end # RackWarden
232
+
@@ -0,0 +1,33 @@
1
+ #require 'bcrypt'
2
+ DataMapper.setup(:default, RackWarden.database)
3
+
4
+ class User
5
+ include DataMapper::Resource
6
+ include BCrypt
7
+
8
+ property :id, Serial, key: true
9
+ property :username, String, length: 128
10
+
11
+ property :password, BCryptHash
12
+
13
+ def authenticate(attempted_password)
14
+ if self.password == attempted_password
15
+ true
16
+ else
17
+ false
18
+ end
19
+ end
20
+ end
21
+
22
+ # Tell DataMapper the models are done being defined
23
+ DataMapper.finalize
24
+
25
+ # Update the database to match the properties of User.
26
+ DataMapper.auto_upgrade!
27
+
28
+ # # Create a test User
29
+ # if User.count == 0
30
+ # @user = User.create(username: "admin")
31
+ # @user.password = "admin"
32
+ # @user.save
33
+ # end
@@ -0,0 +1,3 @@
1
+ class RackWarden < Sinatra::Base
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ <% @section_title = "Create Account" %>
2
+ <form action="/auth/create" method="post">
3
+ <p>Username: <input type="text" name="user[username]" /></p>
4
+ <p>Password: <input type="password" name="user[password]" /></p>
5
+ <div class="g-recaptcha control text-control" data-sitekey="6LdG4v4SAAAAAGn0ZYauCpycY3s6I5pczqRtWZuH"></div>
6
+ <input type="submit" value="Create" />
7
+ </form>
@@ -0,0 +1,6 @@
1
+ <% @section_title = "Login" %>
2
+ <form action="/auth/login" method="post">
3
+ <p>Username: <input type="text" name="user[username]" /></p>
4
+ <p>Password: <input type="password" name="user[password]" /></p>
5
+ <input type="submit" value="Log In" /> or <a href="<%=url('/auth/create')%>">Create a new account</a>
6
+ </form>
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Rack Warden</title>
5
+
6
+ <style>
7
+ body {
8
+ margin: 10px auto;
9
+ width: 800px;
10
+ }
11
+ </style>
12
+
13
+ <script src='https://www.google.com/recaptcha/api.js'></script>
14
+ </head>
15
+ <body>
16
+ <h1>Rack Warden</h1>
17
+
18
+ <p><a href="/auth/login">Log In</a> | <a href="/auth/protected">Protected Page</a> | <a href="/auth/logout">Log Out</a></p>
19
+
20
+ <% if flash(:rwarden)[:success] %>
21
+ <div style="color:green;">
22
+ <%= flash(:rwarden)[:success] %>
23
+ </div>
24
+ <% end %>
25
+
26
+ <% if flash(:rwarden)[:error] %>
27
+ <div style="color:red;">
28
+ <%= flash(:rwarden)[:error] %>
29
+ </div>
30
+ <% end %>
31
+
32
+ <%= yield %>
33
+ </body>
34
+ </html>
@@ -0,0 +1 @@
1
+ <h2>Protected Page Example</h2>
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'sinatra/base'
5
+ require 'rack_warden/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "rack_warden"
9
+ spec.version = RackWarden::VERSION
10
+ spec.authors = ["William Richardson"]
11
+ spec.email = ["wbr@mac.com"]
12
+ spec.summary = %q{A warden/sinatra micro-app providing authentication and user management to any rack-based app}
13
+ spec.description = %q{A warden/sinatra micro-app providing authentication and user management to any rack-based app.}
14
+ spec.homepage = ""
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.7"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "tux"
25
+ spec.add_development_dependency "thin"
26
+
27
+ spec.add_dependency "sinatra"
28
+ spec.add_dependency "sinatra-flash"
29
+ spec.add_dependency "bcrypt"
30
+ spec.add_dependency "data_mapper"
31
+ spec.add_dependency "dm-sqlite-adapter"
32
+ spec.add_dependency "warden"
33
+ end
metadata ADDED
@@ -0,0 +1,202 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack_warden
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - William Richardson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: tux
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thin
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sinatra
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sinatra-flash
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: bcrypt
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: data_mapper
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: dm-sqlite-adapter
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: warden
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ! '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: A warden/sinatra micro-app providing authentication and user management
154
+ to any rack-based app.
155
+ email:
156
+ - wbr@mac.com
157
+ executables: []
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - .gitignore
162
+ - Gemfile
163
+ - LICENSE.txt
164
+ - README.md
165
+ - Rakefile
166
+ - config.ru
167
+ - lib/rack_warden.rb
168
+ - lib/rack_warden/app.rb
169
+ - lib/rack_warden/model.rb
170
+ - lib/rack_warden/version.rb
171
+ - lib/rack_warden/views/create_user.html.erb
172
+ - lib/rack_warden/views/login_user.html.erb
173
+ - lib/rack_warden/views/rack_warden_index.html.erb
174
+ - lib/rack_warden/views/rack_warden_layout.html.erb
175
+ - lib/rack_warden/views/rack_warden_protected.html.erb
176
+ - rack_warden.gemspec
177
+ homepage: ''
178
+ licenses:
179
+ - MIT
180
+ metadata: {}
181
+ post_install_message:
182
+ rdoc_options: []
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ! '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubyforge_project:
197
+ rubygems_version: 2.2.2
198
+ signing_key:
199
+ specification_version: 4
200
+ summary: A warden/sinatra micro-app providing authentication and user management to
201
+ any rack-based app
202
+ test_files: []