rack_warden 0.0.9 → 0.0.10
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 +8 -8
- data/.gitignore +2 -0
- data/Gemfile +13 -10
- data/README.md +115 -53
- data/config.ru +1 -0
- data/lib/rack_warden.rb +33 -5
- data/lib/rack_warden/app.rb +73 -58
- data/lib/rack_warden/core_patches.rb +20 -0
- data/lib/rack_warden/env.rb +27 -0
- data/lib/rack_warden/frameworks.rb +34 -36
- data/lib/rack_warden/frameworks/rack.rb +36 -0
- data/lib/rack_warden/frameworks/rails.rb +29 -9
- data/lib/rack_warden/frameworks/sinatra.rb +15 -11
- data/lib/rack_warden/helpers.rb +197 -29
- data/lib/rack_warden/mail.rb +26 -0
- data/lib/rack_warden/models.rb +79 -40
- data/lib/rack_warden/models/user.rb +180 -22
- data/lib/rack_warden/routes.rb +159 -83
- data/lib/rack_warden/sinatra/decompile.rb +127 -0
- data/lib/rack_warden/sinatra/json.rb +131 -0
- data/lib/rack_warden/sinatra/namespace.rb +285 -0
- data/lib/rack_warden/sinatra/respond_with.rb +277 -0
- data/lib/rack_warden/version.rb +1 -1
- data/lib/rack_warden/views/rw_account_widget.html.erb +8 -0
- data/lib/rack_warden/views/rw_activation.email.erb +3 -0
- data/lib/rack_warden/views/rw_admin.html.erb +7 -5
- data/lib/rack_warden/views/rw_dbinfo.html.erb +5 -4
- data/lib/rack_warden/views/rw_error.html.erb +1 -0
- data/lib/rack_warden/views/rw_flash_widget.html.erb +12 -0
- data/lib/rack_warden/views/rw_index.html.erb +1 -1
- data/lib/rack_warden/views/rw_layout.html.erb +13 -19
- data/lib/rack_warden/views/rw_layout_admin.html.erb +6 -6
- data/lib/rack_warden/views/rw_login.html.erb +18 -5
- data/lib/rack_warden/views/rw_new_user.html.erb +22 -6
- data/lib/rack_warden/views/rw_protected.xml.erb +10 -0
- data/lib/rack_warden/views/rw_session.html.erb +34 -0
- data/lib/rack_warden/warden.rb +161 -30
- data/rack_warden.gemspec +16 -13
- metadata +84 -29
@@ -0,0 +1,26 @@
|
|
1
|
+
module RackWarden
|
2
|
+
class Mail < ::Mail::Message
|
3
|
+
def initialize(*args)
|
4
|
+
App.logger.debug "RW creating new mail message with args: #{args.inspect}"
|
5
|
+
|
6
|
+
mail_options = App.mail_options.dup
|
7
|
+
|
8
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
9
|
+
super( *[args, mail_options[:delivery_options].merge(options)].flatten )
|
10
|
+
|
11
|
+
_delivery_method = mail_options.delete(:via) || mail_options.delete(:delivery_method) || :test
|
12
|
+
_delivery_options = mail_options.delete(:via_options) || mail_options.delete(:delivery_options) || {:from=>'test@localhost'}
|
13
|
+
|
14
|
+
if _delivery_method.is_a?(Array)
|
15
|
+
delivery_method *_delivery_method
|
16
|
+
delivery_method.settings.merge _delivery_options
|
17
|
+
else
|
18
|
+
delivery_method _delivery_method, _delivery_options
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
|
data/lib/rack_warden/models.rb
CHANGED
@@ -1,45 +1,84 @@
|
|
1
1
|
# Setup the database connection, schema, etc.
|
2
2
|
module RackWarden
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
#... sort out environment HERE
|
19
|
-
#conf = RackWarden::App.environment || :development).to_s
|
20
|
-
end
|
21
|
-
|
22
|
-
#puts "RW DataMapper using log_path #{App.log_path}"
|
23
|
-
### CAUTION - There may be a file conflict between this and rack::commonlogger.
|
24
|
-
DataMapper::Logger.new(settings.log_file) #$stdout) #App.log_path)
|
25
|
-
|
26
|
-
|
27
|
-
DataMapper.setup(:default, get_database_config)
|
28
|
-
# Do DataMapper.repository.adapter to get connection info for this connection.
|
29
|
-
puts "RW DataMapper.setup #{DataMapper.repository.adapter}"
|
30
|
-
|
31
|
-
#puts "RW requiring model files in #{File.join(File.dirname(__FILE__), 'models/*')}"
|
32
|
-
Dir.glob(File.join(File.dirname(__FILE__), 'models/*')).each {|f| require f}
|
33
|
-
|
34
|
-
#puts "RW DataMapper.finalize"
|
35
|
-
# Tell DataMapper the models are done being defined
|
36
|
-
DataMapper.finalize
|
3
|
+
module Model
|
4
|
+
|
5
|
+
# Any modles used by RackWarden should inherit from Base.
|
6
|
+
class Base
|
7
|
+
def self.inherited(model)
|
8
|
+
model.instance_eval do
|
9
|
+
|
10
|
+
App.logger.debug "RW #{self}.inherited with #{model}"
|
11
|
+
include DataMapper::Resource
|
12
|
+
include BCrypt
|
13
|
+
def self.default_repository_name; App.repository_name; end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
37
18
|
|
38
|
-
|
39
|
-
|
40
|
-
|
19
|
+
# Load models, setup database adapter, setup db repository.
|
20
|
+
def self.initialize_models
|
21
|
+
|
22
|
+
# Select existing datamapper repository, create a new one, or create a default.
|
23
|
+
begin
|
24
|
+
DataMapper.repository(App.repository_name).adapter
|
25
|
+
if not App.database_config.to_s.downcase[/auto|existing/]
|
26
|
+
App.repository_name = :rack_warden
|
27
|
+
DataMapper.setup(App.repository_name, get_database_config)
|
28
|
+
end
|
29
|
+
rescue DataMapper::RepositoryNotSetupError
|
30
|
+
DataMapper.setup(App.repository_name, get_database_config)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Careful! This could expose sensitive db login info in the log files.
|
34
|
+
App.logger.debug "RW selected DataMapper repository #{DataMapper.repository(App.repository_name).adapter.inspect}"
|
35
|
+
|
36
|
+
# Careful! This could expose sensitive db login info in the log files.
|
37
|
+
App.logger.warn "RW using DataMapper repository #{DataMapper.repository(App.repository_name).adapter.options.dup.tap{|o| o.delete(:password); o.delete('password')}.inspect}"
|
38
|
+
|
39
|
+
App.logger.warn "RW DataMapper logging to #{DataMapper.logger.log} (level #{DataMapper.logger.level})"
|
40
|
+
|
41
|
+
|
42
|
+
# Load all models.
|
43
|
+
App.logger.debug "RW requiring model files in #{File.join(File.dirname(__FILE__), 'models/*')}"
|
44
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'models/*')).each {|f| require f}
|
45
|
+
|
46
|
+
# DataMapper finalize
|
47
|
+
App.logger.debug "RW DataMapper.finalize"
|
48
|
+
# Tell DataMapper the models are done being defined
|
49
|
+
DataMapper.finalize
|
50
|
+
|
51
|
+
# DataMapper auto upgrade.
|
52
|
+
App.logger.warn "RW User.auto_upgrade!"
|
53
|
+
# Update the database to match the properties of User.
|
54
|
+
#DataMapper.auto_upgrade!
|
55
|
+
User.auto_upgrade!
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
# Best guess at framework database settings.
|
60
|
+
def self.get_database_config
|
61
|
+
#App.logger.debug ActiveRecord::Base.configurations[(RackWarden::App.environment || :development).to_s].to_yaml
|
62
|
+
conf = case
|
63
|
+
when App.database_config.to_s.downcase == 'memory'; "sqlite3::memory:?cache=shared"
|
64
|
+
when App.database_config.to_s.downcase == 'file'; "sqlite3:///#{Dir.pwd}/rack_warden.sqlite3.db"
|
65
|
+
when App.database_config.to_s.downcase == 'auto';
|
66
|
+
(ActiveRecord::Base.connection_config rescue nil) ||
|
67
|
+
(ActiveRecord::Base.configurations rescue nil) ||
|
68
|
+
#(DataMapper.repository(App.repository_name).adapter[:options] rescue nil) ||
|
69
|
+
App.database_default
|
70
|
+
when App.database_config; App.database_config
|
71
|
+
else App.database_default
|
72
|
+
end
|
73
|
+
#... sort out environment HERE
|
74
|
+
rslt = conf[(RackWarden::App.environment || :development).to_s] || conf
|
75
|
+
rslt[:adapter] = 'mysql' if rslt && [:adapter]=='mysql2'
|
76
|
+
App.logger.debug "RW get_database_config rslt: #{rslt.inspect}"
|
77
|
+
return rslt
|
78
|
+
end
|
79
|
+
|
80
|
+
initialize_models
|
41
81
|
|
42
|
-
|
43
|
-
#puts "RW DataMapper repository #{DataMapper.repository.adapter.options}"
|
82
|
+
end # Model
|
44
83
|
|
45
|
-
end #
|
84
|
+
end # RackWarden
|
@@ -1,44 +1,202 @@
|
|
1
1
|
|
2
2
|
module RackWarden
|
3
3
|
|
4
|
-
class User
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
storage_names[:default] = App.user_table_name if App.user_table_name
|
4
|
+
class User < Model::Base
|
5
|
+
|
6
|
+
# DataMapper will build a user table name from the containing modules: rack_warden_users.
|
7
|
+
storage_names[App.repository_name] = App.user_table_name if App.user_table_name
|
9
8
|
|
10
9
|
property :id, Serial, :key => true
|
11
10
|
property :username, String, :length => 128, :unique => true, :required => true, :default => lambda {|r,v| r.instance_variable_get :@email}
|
12
|
-
property :email, String, :length => 128, :unique => true, :required => true
|
13
|
-
|
14
|
-
property :
|
11
|
+
property :email, String, :length => 128, :unique => true, :required => true, :format=>:email_address
|
12
|
+
property :encrypted_password, BCryptHash, :writer => :protected, :default => lambda {|r,v| BCrypt::Password.create(r.instance_variable_get :@password)}
|
13
|
+
property :remember_token, BCryptHash
|
14
|
+
property :remember_token_expires_at, EpochTime
|
15
|
+
property :activated_at, EpochTime
|
16
|
+
property :activation_code, BCryptHash
|
17
|
+
property :password_reset_code, BCryptHash
|
18
|
+
|
19
|
+
|
20
|
+
attr_accessor :password, :password_confirmation
|
21
|
+
|
22
|
+
before :create, :make_activation_code
|
23
|
+
after :create, :send_activation
|
15
24
|
|
16
|
-
|
17
|
-
# before :save, :set_username
|
25
|
+
### VALIDATION ###
|
18
26
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
27
|
+
validates_presence_of :password, :password_confirmation, :if => :password_required?
|
28
|
+
validates_confirmation_of :password, :if => :password_required?
|
29
|
+
validates_length_of :password, :min => 8, :if => :password
|
30
|
+
validates_with_method :password, :method => :valid_password_elements, :if => :password
|
31
|
+
validates_length_of :password_confirmation, :within => 8..40, :when => [:require_password, :user]
|
32
|
+
|
33
|
+
|
34
|
+
# check validity of password if we have a new resource, or there is a plaintext password provided
|
35
|
+
def password_required?
|
36
|
+
password || new?
|
37
|
+
end
|
38
|
+
|
39
|
+
# Validation returns nil if valid
|
40
|
+
def valid_password_elements
|
41
|
+
unless password_element_count >= 2
|
42
|
+
message = "Passwords must be minimum 8 characters in length
|
43
|
+
and contain at least two of the following character types: uppercase,
|
44
|
+
lowercase, numbers, symbols."
|
45
|
+
[false, message]
|
46
|
+
else
|
47
|
+
true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns number of specified character classes found in pwd
|
52
|
+
def password_element_count(pwd=password, character_classes = %w[upper lower digit punct])
|
53
|
+
character_classes.find_all{|c| pwd.to_s[/[[:#{c}:]]/]}.size
|
54
|
+
rescue
|
55
|
+
0
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
### CLASS ###
|
60
|
+
|
61
|
+
# Authenticates a user by their login name and unencrypted password. Returns the user or nil.
|
62
|
+
# This is not currently used in RackWarden (has it's own auth logic section).
|
63
|
+
def self.authenticate(login, password)
|
64
|
+
# hides records with a nil activated_at
|
65
|
+
#u = find :first, :conditions => ['login = ? and activated_at IS NOT NULL', login]
|
66
|
+
u = first(:conditions => ['(username = ? or email = ?) and activated_at IS NOT NULL', login, login])
|
67
|
+
if u && u.authenticate(password)
|
68
|
+
# This bit clears a password_reset_code (this assumes it's not needed, cuz user just authenticated successfully).
|
69
|
+
(u.update_attributes(:password_reset_code => nil)) if u.password_reset_code
|
70
|
+
u
|
71
|
+
else
|
72
|
+
nil
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.find_for_forget(email) #, question, answer)
|
77
|
+
first(:conditions => ['email = ? AND (activation_code IS NOT NULL or activated_at IS NOT NULL)', email])
|
78
|
+
#find :first, :conditions=>{:email=>email, :security_question=>question, :security_answer=>answer}
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.find_for_activate(code)
|
82
|
+
decoded = App.uri_decode(code)
|
83
|
+
App.logger.debug "RW find_for_activate with #{decoded}"
|
84
|
+
User.first :activation_code => "#{decoded}"
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
### INSTANCE ###
|
23
90
|
|
24
91
|
def authenticate(attempted_password)
|
25
|
-
if self.
|
92
|
+
if self.encrypted_password == attempted_password
|
26
93
|
true
|
27
94
|
else
|
28
95
|
false
|
29
96
|
end
|
30
97
|
end
|
31
98
|
|
32
|
-
def authorized?(options)
|
33
|
-
|
34
|
-
|
99
|
+
def authorized?(options={})
|
100
|
+
#options[:request].script_name[/login|new|create|logout/] ||
|
101
|
+
self.id==1
|
102
|
+
end
|
103
|
+
|
104
|
+
def remember_token?
|
105
|
+
remember_token_expires_at && Time.now.utc < remember_token_expires_at
|
106
|
+
end
|
107
|
+
|
108
|
+
# These create and unset the fields required for remembering users between browser closes
|
109
|
+
def remember_me
|
110
|
+
self.remember_token_expires_at = Time.now+(60*60*24*14) #2.weeks.from_now.utc
|
111
|
+
self.remember_token = "#{email}--#{remember_token_expires_at}"
|
112
|
+
save! && remember_token
|
113
|
+
end
|
114
|
+
|
115
|
+
def forget_me
|
116
|
+
self.remember_token_expires_at = nil
|
117
|
+
self.remember_token = nil
|
118
|
+
save! #(false)
|
119
|
+
end
|
120
|
+
|
121
|
+
def activate
|
122
|
+
@activated = true
|
123
|
+
self.activated_at = Time.now
|
124
|
+
self.activation_code = nil
|
125
|
+
# added by wbr for auto-password generation from blank activation
|
126
|
+
self.encrypted_password.to_s.empty? ? self.new_random_password : nil
|
127
|
+
self.save!
|
128
|
+
end
|
129
|
+
|
130
|
+
# Returns true if the user has just been activated.
|
131
|
+
def recently_activated?
|
132
|
+
@activated
|
133
|
+
end
|
134
|
+
|
135
|
+
def make_activation_code
|
136
|
+
self.activation_code = (Time.now.to_s.split(//).sort_by {rand}.join)
|
137
|
+
App.logger.debug "RW make_activation_code result #{activation_code}"
|
138
|
+
activation_code
|
139
|
+
end
|
140
|
+
|
141
|
+
def send_activation
|
142
|
+
RackWarden::Mail.new({
|
143
|
+
:to => email,
|
144
|
+
:subject => "Signup confirmation",
|
145
|
+
:body => App.render_template('rw_activation.email.erb', :user=>self)
|
146
|
+
}).deliver!
|
147
|
+
end
|
148
|
+
|
149
|
+
|
150
|
+
### Reset Password ###
|
151
|
+
|
152
|
+
def forgot_password
|
153
|
+
@forgotten_password = true
|
154
|
+
self.make_password_reset_code
|
155
|
+
end
|
156
|
+
|
157
|
+
def reset_password
|
158
|
+
# First update the password_reset_code before setting the
|
159
|
+
# reset_password flag to avoid duplicate email notifications.
|
160
|
+
update_attributes(:password_reset_code => nil)
|
161
|
+
@reset_password = true
|
162
|
+
# These steps will activate an account that hasn't been activated yet, allowing the user to activate when lost/forgotten activation email.
|
163
|
+
if activated_at == nil and activation_code != nil
|
164
|
+
activate
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def recently_reset_password?
|
169
|
+
@reset_password
|
170
|
+
end
|
171
|
+
|
172
|
+
def recently_forgot_password?
|
173
|
+
@forgotten_password
|
174
|
+
end
|
175
|
+
|
176
|
+
# wbr - to resend activation email from existing record
|
177
|
+
def recent_manual_activation?
|
178
|
+
@manual_activation
|
179
|
+
end
|
180
|
+
|
181
|
+
def make_password_reset_code
|
182
|
+
self.password_reset_code = ( Time.now.to_s.split(//).sort_by {rand}.join )
|
183
|
+
end
|
184
|
+
|
185
|
+
### ###
|
186
|
+
|
187
|
+
def new_random_password # should maybe be private?
|
188
|
+
self.make_password_reset_code # added by wbr for blank activation
|
189
|
+
@recently_generated_password = self.password_reset_code #added by wbr for blank activation
|
190
|
+
self.password = Digest::SHA1.hexdigest("--#{rand.to_s}--#{username}--")[0,10]
|
191
|
+
self.password_confirmation = self.password
|
35
192
|
end
|
36
193
|
|
37
|
-
|
38
|
-
|
39
|
-
|
194
|
+
# returns password_reset_code if recently generated password
|
195
|
+
def recently_generated_password
|
196
|
+
@recently_generated_password
|
197
|
+
end
|
40
198
|
|
41
|
-
end
|
199
|
+
end # User
|
42
200
|
|
43
201
|
|
44
202
|
# # Create a test User
|
data/lib/rack_warden/routes.rb
CHANGED
@@ -2,98 +2,174 @@ module RackWarden
|
|
2
2
|
module Routes
|
3
3
|
def self.included(base)
|
4
4
|
base.instance_eval do
|
5
|
-
|
5
|
+
|
6
|
+
App.logger.debug "RW loading routes"
|
7
|
+
|
8
|
+
respond_to :xml, :json, :js, :txt, :html, :yaml
|
9
|
+
|
10
|
+
# Before does not have access to uri-embedded params yet.
|
11
|
+
#before do
|
12
|
+
#end
|
13
|
+
|
6
14
|
if defined? ::RACK_WARDEN_STANDALONE
|
7
15
|
get '/?' do
|
8
16
|
default_page
|
9
17
|
end
|
10
18
|
end
|
19
|
+
|
20
|
+
namespace settings.rw_prefix do
|
11
21
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
22
|
+
# This is necessary for sinatra-namespace to do nested stuff,
|
23
|
+
# due to the namespace module only being half-baked.
|
24
|
+
helpers do
|
25
|
+
def settings
|
26
|
+
App.settings
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
### CORE ###
|
32
|
+
|
33
|
+
get '/?' do
|
34
|
+
default_page
|
35
|
+
end
|
36
|
+
|
37
|
+
get '/login' do
|
38
|
+
logger.debug "RW /login action"
|
39
|
+
# Trigger authentication on remember_me, in case they haven't hit a protected page yet.
|
40
|
+
warden.authenticate :remember_me
|
41
|
+
if User.count > 0
|
42
|
+
respond_with :'rw_login'
|
43
|
+
else
|
44
|
+
flash.rw_error = warden.message || "Please create an admin account"
|
45
|
+
redirect url_for('/new')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
post '/login' do
|
50
|
+
warden.authenticate!
|
51
|
+
|
52
|
+
flash.rw_success = warden.message || "Successful login"
|
53
|
+
|
54
|
+
return_to
|
55
|
+
end
|
56
|
+
|
57
|
+
get '/logout' do
|
58
|
+
#warden.raw_session.inspect
|
59
|
+
warden.authenticated? # Hack so warden will log out. See https://github.com/hassox/warden/issues/76.
|
60
|
+
warden.logout
|
61
|
+
flash.rw_success = 'You have been logged out'
|
62
|
+
redirect url(settings.default_route, false)
|
63
|
+
end
|
64
|
+
|
65
|
+
get '/new' do
|
66
|
+
halt(403, "Not authorized") unless settings.allow_public_signup || !(User.count > 0) || authorized?
|
67
|
+
respond_with :'rw_new_user', :recaptcha_sitekey=>settings.recaptcha['sitekey']
|
68
|
+
end
|
69
|
+
|
70
|
+
post '/create' do
|
71
|
+
verify_recaptcha if settings.recaptcha[:secret]
|
72
|
+
Halt("Could not create account") unless params[:user]
|
73
|
+
params[:user].delete_if {|k,v| v.nil? || v==''}
|
74
|
+
@user = User.new(params['user'])
|
75
|
+
if @user.save
|
76
|
+
warden.set_user(@user) if settings.login_on_create
|
77
|
+
# TODO: maybe put this line in the user model?
|
78
|
+
@user.activate if settings.mail_options[:delivery_method] == :test
|
79
|
+
flash.rw_success = warden.message || "Account created"
|
80
|
+
App.logger.info "RW /auth/create succeeded for '#{@user.username rescue nil}' #{@user.errors.entries}"
|
81
|
+
#redirect session[:return_to] || url(settings.default_route, false)
|
82
|
+
return_to url_for(logged_in? ? '/' : '/login')
|
83
|
+
else
|
84
|
+
flash.rw_error = "#{warden.message} => #{@user.errors.entries.join('. ')}"
|
85
|
+
App.logger.info "RW /auth/create failed for '#{@user.username rescue nil}' #{@user.errors.entries}"
|
86
|
+
redirect back #url('/auth/new', false)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
get '/activate/:code' do
|
91
|
+
redirect settings.default_route unless params[:code]
|
92
|
+
# TODO: move this logic into User. This should only be 'user = User.activate(params[:code])'
|
93
|
+
@user = User.find_for_activate(params[:code])
|
94
|
+
if @user.is_a? User #&& user.activated_at == nil
|
95
|
+
@user.activate
|
96
|
+
warden.set_user(@user) if settings.login_on_activate
|
97
|
+
flash.rw_success = "Account activated"
|
98
|
+
App.logger.info "RW /auth/activate succeeded for '#{@user.username rescue nil}' #{@user.errors.entries}"
|
99
|
+
#redirect "/auth/login"
|
100
|
+
return_to url_for(logged_in? ? '/' : '/login')
|
101
|
+
else
|
102
|
+
App.logger.info "RW /auth/activate failed for '#{@user}' with errors: #{$!}"
|
103
|
+
#halt "Could not activate"
|
104
|
+
redirect_error "The activation code was not valid"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
post '/unauthenticated' do
|
109
|
+
# I had to remove the condition, since it was not updating return path when it should have.
|
110
|
+
session[:return_to] = warden_options[:attempted_path] if !request.xhr? && !warden_options[:attempted_path][Regexp.new(settings.exclude_from_return_to)]
|
111
|
+
App.logger.info "RW attempted path unauthenticated: #{warden_options[:attempted_path]}"
|
112
|
+
App.logger.debug "RW will return-to #{session[:return_to]}"
|
113
|
+
App.logger.debug warden
|
114
|
+
# if User.count > 0
|
115
|
+
flash.rw_error = warden.message || "Please login to continue"
|
116
|
+
redirect url_for('/login')
|
117
|
+
# else
|
118
|
+
# flash[:rwarden][:error] = warden.message || "Please create an admin account"
|
119
|
+
# redirect url('/auth/new', false)
|
120
|
+
# end
|
121
|
+
end
|
122
|
+
|
123
|
+
get "/error" do
|
124
|
+
respond_with :'rw_error'
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
### UTILITY ###
|
76
130
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
131
|
+
get "/testing.?:format?" do
|
132
|
+
logger.debug "RW /auth/testing request.cookies" + request.cookies.to_yaml
|
133
|
+
logger.debug "RW /auth/testing response" + response.to_yaml
|
134
|
+
logger.debug "RW request headers #{headers.inspect}"
|
135
|
+
logger.debug "RW request.accept #{request.accept}"
|
136
|
+
logger.debug "RW env['sinatra.accept'] #{env['sinatra.accept']}"
|
137
|
+
logger.debug "RW mime_type(ext) #{mime_type(params[:ext])}"
|
138
|
+
response.set_cookie '_auth_testing_cookie', :value=>"Hi Im a Cookie", :expires=>Time.now+60, :path=>'/'
|
139
|
+
respond_with :'rw_protected' do |f|
|
140
|
+
f.yaml { "key: dat"}
|
141
|
+
end
|
142
|
+
#erb :'rw_protected.html'
|
143
|
+
end
|
83
144
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
145
|
+
get "/is_running" do
|
146
|
+
"YES"
|
147
|
+
end
|
148
|
+
|
149
|
+
get '/protected' do
|
150
|
+
require_login
|
151
|
+
respond_with :'rw_protected'
|
152
|
+
end
|
153
|
+
|
154
|
+
get "/dbinfo" do
|
155
|
+
require_authorization
|
156
|
+
#erb :'rw_dbinfo.html'
|
157
|
+
nested_erb :'rw_dbinfo.html', :'rw_layout_admin.html', settings.layout
|
158
|
+
end
|
159
|
+
|
160
|
+
get '/admin' do
|
161
|
+
require_authorization
|
162
|
+
#erb :'rw_admin.html', :layout=>settings.layout
|
163
|
+
nested_erb :'rw_admin.html', :'rw_layout_admin.html', settings.layout
|
164
|
+
#respond_with :rw_admin
|
165
|
+
end
|
166
|
+
|
167
|
+
get '/sessinfo' do
|
168
|
+
require_authorization
|
169
|
+
nested_erb :'rw_session.html', :'rw_layout_admin.html', settings.layout
|
170
|
+
end
|
90
171
|
|
91
|
-
|
92
|
-
warden.authenticate!
|
93
|
-
authorized?
|
94
|
-
#erb :'rw_admin.html', :layout=>settings.layout
|
95
|
-
nested_erb :'rw_admin.html', :'rw_layout_admin.html', settings.layout
|
96
|
-
end
|
172
|
+
end # namespace
|
97
173
|
|
98
174
|
end
|
99
175
|
end
|