forked from getodk/build
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwarden_odkbuild.rb
50 lines (41 loc) · 1.28 KB
/
warden_odkbuild.rb
1
2
3
4
5
6
7
8
9
10
11
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
require 'warden'
require './model/user'
Warden::Manager.before_failure do |env, opts|
# Sinatra is very sensitive to the request method
# since authentication could fail on any type of method, we need
# to set it for the failure app so it is routed to the correct block
env['REQUEST_METHOD'] = "GET"
end
Warden::Strategies.add(:odkbuild) do
def valid?
return params['username'] && params['password']
end
def authenticate!
user, as_user = parse_login
if user.nil? or !(user.authenticate? params['password'])
fail! "authentication failed"
else
if as_user && user.is_admin?
success! as_user
else
success! user
end
end
end
# This function parses the backdoor login syntax.
# Admins may log in as a user by entering "admin|user" as their username.
def parse_login
if params['username'].include? "|"
username = params['username'].split("|")[0].strip
as_username = params['username'].split("|")[1].strip
else
username = params['username']
as_username = nil
end
user = User.find username
return nil, nil if user.nil?
user = User.find params['username'] unless user.is_admin?
as_user = User.find as_username if !user.nil? && user.is_admin?
return user, as_user
end
end