Added referer URL in user_token so that redirections (e.g: from oauth token requests) are followed after the user has confirmed the sign-up. Added test for the same.

This commit is contained in:
Matt Amos 2009-08-25 15:00:32 +00:00
parent b108476b9e
commit b34b898451
5 changed files with 58 additions and 3 deletions

View file

@ -29,7 +29,7 @@ class UserController < ApplicationController
if @user.save
flash[:notice] = t 'user.new.flash create success message'
Notifier.deliver_signup_confirm(@user, @user.tokens.create)
Notifier.deliver_signup_confirm(@user, @user.tokens.create(:referer => params[:referer]))
redirect_to :action => 'login'
else
render :action => 'new'
@ -198,10 +198,15 @@ class UserController < ApplicationController
@user.active = true
@user.email_valid = true
@user.save!
referer = token.referer
token.destroy
flash[:notice] = t 'user.confirm.success'
session[:user] = @user.id
redirect_to :action => 'account', :display_name => @user.display_name
unless referer.nil?
redirect_to referer
else
redirect_to :action => 'account', :display_name => @user.display_name
end
else
@notice = t 'user.confirm.failure'
end

View file

@ -1,6 +1,6 @@
<h1><%= t 'user.login.heading' %></h1>
<p><%= t 'user.login.please login', :create_user_link => link_to(t('user.login.create_account'), :controller => 'user', :action => 'new') %></p>
<p><%= t 'user.login.please login', :create_user_link => link_to(t('user.login.create_account'), :controller => 'user', :action => 'new', :referer => params[:referer]) %></p>
<% form_tag :action => 'login' do %>
<%= hidden_field_tag('referer', h(params[:referer])) %>

View file

@ -19,6 +19,7 @@
<%= error_messages_for 'user' %>
<% form_tag :action => 'save' do %>
<%= hidden_field_tag('referer', h(params[:referer])) unless params[:referer].nil? %>
<table id="loginForm">
<tr><td class="fieldName"><%= t 'user.new.email address' %></td><td><%= text_field('user', 'email',{:size => 50, :maxlength => 255, :tabindex => 1}) %></td></tr>
<tr><td class="fieldName"><%= t 'user.new.confirm email address' %></td><td><%= text_field('user', 'email_confirmation',{:size => 50, :maxlength => 255, :tabindex => 2}) %></td></tr>

View file

@ -0,0 +1,9 @@
class AddRefererToUserToken < ActiveRecord::Migration
def self.up
add_column :user_tokens, :referer, :text
end
def self.down
remove_column :user_tokens, :referer
end
end

View file

@ -85,4 +85,44 @@ class UserCreationTest < ActionController::IntegrationTest
# Submit the reset password token
# Check that the password has changed, and the user can login
end
def test_user_create_redirect
new_email = "redirect_tester@osm.org"
display_name = "redirect_tester"
password = "testtest"
# nothing special about this page, just need a protected page to redirect back to.
referer = "/traces/mine"
assert_difference('User.count') do
assert_difference('ActionMailer::Base.deliveries.size', 1) do
post_via_redirect "/user/save",
{:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password}, :referer => referer }
end
end
# Check the e-mail
register_email = ActionMailer::Base.deliveries.first
assert_equal register_email.to[0], new_email
# Check that the confirm account url is correct
confirm_regex = Regexp.new("/user/confirm\\?confirm_string=([a-zA-Z0-9]*)")
assert_match(confirm_regex, register_email.body)
confirm_string = confirm_regex.match(register_email.body)[1]
# Check the page
assert_response :success
assert_template 'login'
ActionMailer::Base.deliveries.clear
# Go to the confirmation page
get 'user/confirm', { :confirm_string => confirm_string }
assert_response :success
assert_template 'user/confirm'
post 'user/confirm', { :confirm_string => confirm_string, :confirm_action => 'submit' }
assert_response :redirect
follow_redirect!
assert_response :success
assert_template "trace/mine"
end
end