Merge branch 'master' into openid
authorTom Hughes <tom@compton.nu>
Fri, 7 May 2010 21:28:07 +0000 (22:28 +0100)
committerTom Hughes <tom@compton.nu>
Fri, 7 May 2010 21:28:07 +0000 (22:28 +0100)
Conflicts:
app/controllers/user_controller.rb

1  2 
app/controllers/user_controller.rb
app/models/user.rb
config/environment.rb
config/locales/en.yml
public/stylesheets/common.css
test/fixtures/users.yml

index 77f63dfc619706256fdaa43d24bdee27a299b81d,222840a0610a60ed1117594c65e746eca7742ef5..41a08363cc5bb1b3bbca51df6ac49a075afc7ff3
@@@ -24,71 -24,13 +24,71 @@@ class UserController < ApplicationContr
      if Acl.find_by_address(request.remote_ip, :conditions => {:k => "no_account_creation"})
        render :action => 'new'
      else
 -      @user = User.new(params[:user])
 -
 -      @user.status = "pending"
 -      @user.data_public = true
 -      @user.description = "" if @user.description.nil?
 -      @user.creation_ip = request.remote_ip
 -      @user.languages = request.user_preferred_languages
 +      #The redirect from the OpenID provider reenters here again 
 +      #and we need to pass the parameters through to the  
 +      #open_id_authentication function a second time 
 +      if params[:open_id_complete] 
 +        openid_verify('', true) 
 +        #We have set the user.openid_url to nil beforehand. If it hasn't 
 +        #been set to a new valid openid_url, it means the openid couldn't be validated 
 +        if @user.nil? or @user.openid_url.nil? 
 +          render :action => 'new' 
 +          return 
 +        end   
 +      else
 +        @user = User.new(params[:user])
 +
-         @user.visible = true
++        @user.status = "pending"
 +        @user.data_public = true
 +        @user.description = "" if @user.description.nil?
 +        @user.creation_ip = request.remote_ip
 +        @user.languages = request.user_preferred_languages
 +        #Set the openid_url to nil as for one it is used 
 +        #to check if the openid could be validated and secondly 
 +        #to not get dupplicate conflicts for an empty openid  
 +        @user.openid_url = nil
 +
 +        if (!params[:user][:openid_url].nil? and params[:user][:openid_url].length > 0)
 +          if (@user.pass_crypt.nil? or @user.pass_crypt.length == 0)
 +            #if the password is empty, but we have a openid 
 +            #then generate a random passowrd to disable 
 +            #loging in via password 
 +            @user.pass_crypt = ActiveSupport::SecureRandom.base64(16) 
 +            @user.pass_crypt_confirmation = @user.pass_crypt 
 +          end
 +          #Validate all of the other fields before
 +          #redirecting to the openid provider
 +          if !@user.valid?
 +            render :action => 'new'
 +          else        
 +            #TODO: Is it a problem to store the user variable with respect to password safty in the session variables?
 +            #Store the user variable in the session for it to be accessible when redirecting back from the openid provider
 +            session[:new_usr] = @user
 +            begin
 +              @norm_openid_url = OpenIdAuthentication.normalize_identifier(params[:user][:openid_url])
 +            rescue
 +              flash.now[:error] = t 'user.login.openid invalid'
 +              render :action => 'new'
 +              return
 +            end
 +            #Verify that the openid provided is valid and that the user is the owner of the id
 +            openid_verify(@norm_openid_url, true)
 +            #openid_verify can return in two ways:
 +            #Either it returns with a redirect to the openid provider who then freshly
 +            #redirects back to this url if the openid is valid, or if the openid is not plausible
 +            #and no provider for it could be found it just returns
 +            #we want to just let the redirect through
 +            if response.headers["Location"].nil?
 +              render :action => 'new'
 +            end
 +          end
 +          #At this point there was either an error and the page has been rendered,
 +          #or there is a redirect to the openid provider and the rest of the method
 +          #gets executed whenn this method gets reentered after redirecting back
 +          #from the openid provider
 +          return
 +        end
 +      end
  
        if @user.save
          flash[:notice] = t 'user.new.flash create success message'
              # Ignore errors sending email
            end
          end
+         redirect_to :action => "account", :display_name => @user.display_name
        end
 +
 +      if (params[:user][:openid_url].length > 0)
 +        begin
 +          @norm_openid_url = OpenIdAuthentication.normalize_identifier(params[:user][:openid_url])
 +          if (@norm_openid_url != @user.openid_url)
 +            #If the OpenID has changed, we want to check that it is a valid OpenID and one
 +            #the user has control over before saving the openID as a password equivalent for
 +            #the user.
 +            openid_verify(@norm_openid_url, false)
 +          end
 +        rescue
 +          flash.now[:error] = t 'user.login.openid invalid'
 +        end
 +      end
 +
      else
        if flash[:errors]
          flash[:errors].each do |attr,msg|
    def login
      @title = t 'user.login.title'
  
 -    if params[:user]
 -      email_or_display_name = params[:user][:email]
 -      pass = params[:user][:password]
 -      user = User.authenticate(:username => email_or_display_name, :password => pass)
 -
 -      if user
 -        session[:user] = user.id
 -        session_expires_after 1.month if params[:remember_me]
 -
 -        # The user is logged in, if the referer param exists, redirect
 -        # them to that unless they've also got a block on them, in
 -        # which case redirect them to the block so they can clear it.
 -        if user.blocked_on_view
 -          redirect_to user.blocked_on_view, :referrer => params[:referrer]
 -        elsif params[:referer]
 -          redirect_to params[:referer]
 +    #The redirect from the OpenID provider reenters here again
 +    #and we need to pass the parameters through to the 
 +    # open_id_authentication function
 +    if params[:open_id_complete]
 +      user = open_id_authentication('')
 +    elsif params[:user]
 +      if !params[:user][:openid_url].nil? and !params[:user][:openid_url].empty?
 +        session[:remember] = params[:remember_me]
 +        #construct the openid request. This will redirect to the OpenID server to ask for validation
 +        #The external OpenID server will then redirect back to the login method and reenters at the top
 +        open_id_authentication(params[:user][:openid_url])
 +        return
 +      else
 +        email_or_display_name = params[:user][:email]
 +        pass = params[:user][:password]
 +
 +        if user = User.authenticate(:username => email_or_display_name, :password => pass)
 +          session[:user] = user.id
 +          session_expires_after 1.month if params[:remember_me]
-         elsif User.authenticate(:username => email_or_display_name, :password => pass, :inactive => true)
++        elsif User.authenticate(:username => email_or_display_name, :password => pass, :pending => true)
 +          flash.now[:error] = t 'user.login.account not active'
++        elsif User.authenticate(:username => email_or_display_name, :password => pass, :suspended => true)
++          flash.now[:error] = t 'user.login.account suspended'
          else
 -          redirect_to :controller => 'site', :action => 'index'
 +          flash.now[:error] = t 'user.login.auth failure'
          end
 -      elsif User.authenticate(:username => email_or_display_name, :password => pass, :pending => true)
 -        flash.now[:error] = t 'user.login.account not active'
 -      elsif User.authenticate(:username => email_or_display_name, :password => pass, :suspended => true)
 -        flash.now[:error] = t 'user.login.account suspended'
 +      end
 +    end
 +
 +    if user
 +      # The user is logged in, if the referer param exists, redirect
 +      # them to that unless they've also got a block on them, in
 +      # which case redirect them to the block so they can clear it.
 +      if user.blocked_on_view
 +        redirect_to user.blocked_on_view, :referrer => params[:referrer]
 +      elsif params[:referer]
 +        redirect_to params[:referer]
        else
 -        flash.now[:error] = t 'user.login.auth failure'
 +        redirect_to :controller => 'site', :action => 'index'
        end
      end
    end
Simple merge
Simple merge
index cb4de862ebe887a41843d67f546fa5923ce727be,fbf8e7a0462ab620397b0f0f7133c744718234a4..97551164f6a387f6e56ab52a3550025ac9defa16
        lost password link: "Lost your password?"
        login_button: "Login"
        account not active: "Sorry, your account is not active yet.<br />Please click on the link in the account confirmation email to activate your account."
+       account suspended: Sorry, your account has been suspended due to suspicious activity.<br />Please contact the <a href="mailto:webmaster@openstreetmap.org">webmaster</a> if you wish to discuss this.
        auth failure: "Sorry, could not log in with those details."
 +      openid missing provider: "Sorry, could not contact your OpenID provider"
 +      openid invalid: "Sorry, your OpenID seems misformed"
 +      openid_logo_alt: "Log in with an OpenID"
 +      openid_providers:
 +        openid:
 +          title: Login with an OpenID URL
 +          alt: Login with an OpenID URL
 +        yahoo:
 +          title: Login with a Yahoo! OpenID
 +          alt: Login with a Yahoo! OpenID
 +        google:
 +          title: Login with a Google OpenID
 +          alt: Login with a Google OpenID
 +        myopenid:
 +          title: Login with a myOpenID OpenID
 +          alt: Login with a myOpenID OpenID
 +        wordpress:
 +          title: Login with a Wordpress.com OpenID
 +          alt: Login with a Wordpress.com OpenID
 +        myspace:
 +          title: Login with a MySpace OpenID
 +          alt: Login with a MySpace OpenID
      logout:
        title: "Logout"
        heading: "Logout from OpenStreetMap"
Simple merge
Simple merge