Modified: trunk/app/controllers/openid_controller.rb (2223 => 2224)
--- trunk/app/controllers/openid_controller.rb 2009-06-10 15:53:50 UTC (rev 2223)
+++ trunk/app/controllers/openid_controller.rb 2009-06-11 13:32:56 UTC (rev 2224)
@@ -1,5 +1,9 @@
gem 'ruby-openid'
+require 'openid'
+require 'openid/store/filesystem'
+
+
# http://www.danwebb.net/2007/2/27/the-no-shit-guide-to-supporting-openid-in-your-applications
class OpenidController < ApplicationController
before_filter :login_required
@@ -10,41 +14,55 @@
def create
openid_url = params[:openid_url]
- response = consumer.begin openid_url
+ begin
+ response = consumer.begin(openid_url)
- if response.status == OpenID::SUCCESS
return_to = url_for(:action="" 'complete')
trust_root = url_for(:controller=>'')
- redirect_url = response.redirect_url(trust_root, return_to, true) # <== immediate mode
- redirect_to redirect_url
+ url = "" return_to, true) # <== immediate mode
+ redirect_to(url)
return
+ rescue OpenID::DiscoveryFailure
+ flash[:error] = "Couldn't find an OpenID for that URL"
+ rescue RuntimeError, Timeout::Error => e
+ if e.class == Timeout::Error
+ flash[:error] = "Could not contact your OpenID server."
+ else
+ flash[:error] = "An unknown error occurred whilst contacting your OpenID server."
+ end
end
-
- flash[:error] = "Couldn't find an OpenID for that URL"
render :action ="" :new
end
def complete
- response = consumer.complete params
+ current_url = url_for(:action ="" 'complete', : false)
+ parameters = params.reject{|k,v|request.path_parameters[k]}
+ response = consumer.complete(parameters, current_url)
+
case response.status
- when OpenID::SUCCESS
+ when OpenID::Consumer::SUCCESS, OpenID::Consumer::SETUP_NEEDED
current_user.openid_url = response.identity_url
if current_user.save
redirect_to user_path(current_user)
+ return
else
flash[:error] = "OpenID already registered to another #{Conf.sitename} account"
- redirect_to new_openid_url
end
- return
- when OpenID::SETUP_NEEDED
- redirect_to response.setup_url # <== here!
- return
+ # In immediate mode, we shouldnt wont get these responses, but just in
+ # case..
+ when OpenID::Consumer::FAILURE
+ if response.display_identifier
+ flash[:error] = "Verification of #{response.display_identifier} failed: #{response.message}"
+ else
+ flash[:error] = "Verification failed: #{response.message}"
+ end
+ redirect_to new_openid_url
+ when OpenID::Consumer::CANCEL
+ flash[:error] = "OpenID transaction cancelled"
end
-
- flash[:error] = 'Could not log on with your OpenID'
redirect_to new_openid_url
end
@@ -55,7 +73,7 @@
# create the OpenID store for storing associations and nonces,
# putting it in your app's db directory
store_dir = Pathname.new(RAILS_ROOT).join('db').join('openid-store')
- store = OpenID::FilesystemStore.new(store_dir)
+ store = OpenID::Store::Filesystem.new(store_dir)
return OpenID::Consumer.new(session, store)
end
Modified: trunk/app/views/openid/new.rhtml (2223 => 2224)
--- trunk/app/views/openid/new.rhtml 2009-06-10 15:53:50 UTC (rev 2223)
+++ trunk/app/views/openid/new.rhtml 2009-06-11 13:32:56 UTC (rev 2224)
@@ -13,5 +13,6 @@
</p>
<%= submit_tag 'Validate', :disable_with => "Validating..." %>
+ <input type="submit" id="cancel_button" value="Return to your Profile" user_path(current_user) -%>';return false;"/>
<% end %>
-</div>
\ No newline at end of file
+</div>