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.
- checksums.yaml +15 -0
- data/.gitignore +20 -0
- data/Gemfile +17 -0
- data/LICENSE.txt +22 -0
- data/README.md +63 -0
- data/Rakefile +8 -0
- data/config.ru +7 -0
- data/lib/rack_warden.rb +18 -0
- data/lib/rack_warden/app.rb +232 -0
- data/lib/rack_warden/model.rb +33 -0
- data/lib/rack_warden/version.rb +3 -0
- data/lib/rack_warden/views/create_user.html.erb +7 -0
- data/lib/rack_warden/views/login_user.html.erb +6 -0
- data/lib/rack_warden/views/rack_warden_index.html.erb +0 -0
- data/lib/rack_warden/views/rack_warden_layout.html.erb +34 -0
- data/lib/rack_warden/views/rack_warden_protected.html.erb +1 -0
- data/rack_warden.gemspec +33 -0
- metadata +202 -0
checksums.yaml
ADDED
@@ -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=
|
data/.gitignore
ADDED
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
|
+
|
data/LICENSE.txt
ADDED
@@ -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.
|
data/README.md
ADDED
@@ -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
|
+
|
data/Rakefile
ADDED
data/config.ru
ADDED
data/lib/rack_warden.rb
ADDED
@@ -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,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>
|
File without changes
|
@@ -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>
|
data/rack_warden.gemspec
ADDED
@@ -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: []
|