/
app.rb
164 lines (133 loc) · 3.73 KB
/
app.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
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#! /usr/bin/env ruby
require 'rubygems'
require 'mongo_mapper'
require 'sinatra'
require 'yaml'
require 'openid'
require 'openid/store/filesystem'
require 'mongo'
use Rack::Session::Cookie
class User
include MongoMapper::Document
key :identity, String
key :color, String
end
configure :production do
mongo_url = ENV["MONGOHQ_URL"]
uri = URI.parse(mongo_url)
MongoMapper.connection = Mongo::Connection.from_uri(mongo_url)
MongoMapper.database = uri.path.gsub(/^\//,'')
end
configure :development, :test do
MongoMapper.connection = Mongo::Connection.new
MongoMapper.database = "rpsgame"
end
before do
protected! unless request.path_info == '/' || request.path_info[/^\/login/]
end
helpers do
def openid_consumer
#@openid_consumer ||= OpenID::Consumer.new(session, OpenID::Store::Filesystem.new("#{File.dirname(__FILE__)}/tmp/openid"))
@openid_consumer ||= OpenID::Consumer.new(session, nil)
end
def root_url
request.url.match(/(^.*\/{2}[^\/]*)/)[1]
end
def current_user
session["current_user"]
end
def logged_in
!!current_user
end
def protected!
redirect '/' unless logged_in
end
end
get '/' do
haml :index
end
get '/settings' do
haml :settings
end
post '/settings' do
current_user.color = params[:color]
current_user.save
redirect '/'
end
post '/challenge' do
opponent_id = params[:opponent]
opponent = User.first({:identity => opponent_id})
return "Who? <a href='/'>Try again</a>" if opponent.nil?
# start a game
redirect '/'
end
post '/login/openid' do
openid = params[:openid_identifier]
begin
oidreq = openid_consumer.begin(openid)
rescue OpenID::DiscoveryFailure => why
"Sorry, we couldn't find your identifier '#{openid}'"
else
# You could request additional information here - see specs:
# http://openid.net/specs/openid-simple-registration-extension-1_0.html
# oidreq.add_extension_arg('sreg','required','nickname')
# oidreq.add_extension_arg('sreg','optional','fullname, email')
# Send request - first parameter: Trusted Site,
# second parameter: redirect target
redirect oidreq.redirect_url(root_url, root_url + "/login/openid/complete")
end
end
get '/login/openid/complete' do
oidresp = openid_consumer.complete(params, request.url)
case oidresp.status
when OpenID::Consumer::FAILURE
"Sorry, we could not authenticate you with the identifier '{openid}'."
when OpenID::Consumer::SETUP_NEEDED
"Immediate request failed - Setup Needed"
when OpenID::Consumer::CANCEL
"Login cancelled."
when OpenID::Consumer::SUCCESS
user = User.first_or_create({:identity => oidresp.identity_url})
session["current_user"] = user
redirect "/"
end
end
get '/logout' do
session.clear
redirect '/'
end
__END__
@@ index
= haml :login_status, :layout => false
- if !logged_in
%form{ :action => "/login/openid", :method => "post" }
%label
OpenID URL:
%input{ :type => 'text', :name => 'openid_identifier' }
%input{ :type => 'submit', :value => 'Login' }
- else
%a{ :href => '/settings' } Settings
%form{ :action => "/challenge", :method => "post" }
%label
Opponent ID:
%input{ :type => "text", :name => "opponent" }
%input{ :type => "submit", :value => "Challenge" }
@@ settings
= haml :login_status, :layout => false
%form{ :action => "/settings", :method => "post" }
%label
Favorite color:
%input{ :type => "text", :name => "color" }
%input{ :type => "submit", "value" => "Configure" }
@@ login_status
.status
- if logged_in
:css
body {
background-color: #{ current_user.color || "#fff" };
}
%p
== Logged in as #{ current_user.identity }
%a{ :href => '/logout' } Logout
- else
%p Not logged in