rack_warden 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []