]> git.openstreetmap.org Git - rails.git/commitdiff
Merge branch 'master' into openid
authorTom Hughes <tom@compton.nu>
Sun, 16 May 2010 23:30:43 +0000 (00:30 +0100)
committerTom Hughes <tom@compton.nu>
Sun, 16 May 2010 23:30:43 +0000 (00:30 +0100)
Conflicts:
app/controllers/user_controller.rb

1  2 
app/controllers/user_controller.rb
config/locales/en.yml
config/locales/is.yml

index f2d93d29ea9e2ad9cc29280cd5db9077f6a706f1,d86c9a4bafef12ae71260ad06ba43002b8084ac5..57881881a56f6edee7fb92570d126be4df0cc9c6
@@@ -20,6 -20,8 +20,6 @@@ class UserController < ApplicationContr
  
    def terms
      @title = t 'user.new.title'
 -    @user = User.new(params[:user])
 -
      @legale = params[:legale] || OSM.IPToCountry(request.remote_ip) || APP_CONFIG['default_legale']
      @text = OSM.legal_text_for_country(@legale)
  
        render :update do |page|
          page.replace_html "contributorTerms", :partial => "terms"
        end
 -    elsif @user.invalid?
 -      render :action => 'new'
 +    elsif params[:user]
 +      session[:referer] = params[:referer]
 +
 +      @user = User.new(params[:user])
 +
 +      if params[:user][:openid_url] and @user.pass_crypt.empty?
 +        # We are creating an account with OpenID and no password
 +        # was specified so create a random one
 +        @user.pass_crypt = ActiveSupport::SecureRandom.base64(16) 
 +        @user.pass_crypt_confirmation = @user.pass_crypt 
 +      end
 +
 +      if @user.valid?
 +        if params[:user][:openid_url].nil? or
 +            params[:user][:openid_url].empty?
 +          # No OpenID so just move on to the terms
 +          render :action => 'terms'
 +        else
 +          # Verify OpenID before moving on
 +          session[:new_user] = @user
 +          openid_verify(params[:user][:openid_url], @user)
 +        end
 +      else
 +        # Something is wrong, so rerender the form
 +        render :action => 'new'
 +      end
 +    elsif using_open_id?
 +      # The redirect from the OpenID provider reenters here
 +      # again and we need to pass the parameters through to
 +      # the open_id_authentication function
 +      @user = session.delete(:new_user)
 +
 +      openid_verify(nil, @user) do |user|
 +      end
 +
 +      if @user.openid_url.nil? or @user.invalid?
 +        render :action => 'new'
 +      else
 +        render :action => 'terms'
 +      end
      end
    end
  
@@@ -89,7 -53,7 +89,7 @@@
  
        if @user.save
          flash[:notice] = t 'user.new.flash create success message'
 -        Notifier.deliver_signup_confirm(@user, @user.tokens.create(:referer => params[:referer]))
 +        Notifier.deliver_signup_confirm(@user, @user.tokens.create(:referer => session.delete(:referer)))
          redirect_to :action => 'login'
        else
          render :action => 'new'
        @user.home_lat = params[:user][:home_lat]
        @user.home_lon = params[:user][:home_lon]
  
 -      if @user.save
 -        set_locale
 +      @user.openid_url = nil if params[:user][:openid_url].empty?
  
 -        if @user.new_email.nil? or @user.new_email.empty?
 -          flash[:notice] = t 'user.account.flash update success'
 -        else
 -          flash[:notice] = t 'user.account.flash update success confirm needed'
 -
 -          begin
 -            Notifier.deliver_email_confirm(@user, @user.tokens.create)
 -          rescue
 -            # Ignore errors sending email
 -          end
 -        end
 -
 -        redirect_to :action => "account", :display_name => @user.display_name
 +      if params[:user][:openid_url].length > 0 and
 +         params[:user][: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
 +        # it as a password equivalent for the user.
 +        session[:new_user] = @user
 +        openid_verify(params[:user][:openid_url], @user)
 +      else
 +        update_user(@user)
        end
 -    else
 -      if flash[:errors]
 -        flash[:errors].each do |attr,msg|
 -          attr = "new_email" if attr == "email"
 -          @user.errors.add(attr,msg)
 -        end
 +    elsif using_open_id?
 +      # The redirect from the OpenID provider reenters here
 +      # again and we need to pass the parameters through to
 +      # the open_id_authentication function
 +      @user = session.delete(:new_user)
 +      openid_verify(nil, @user) do |user|
 +        update_user(user)
        end
      end
    end
  
    def new
      @title = t 'user.new.title'
 -
 -    # The user is logged in already, so don't show them the signup
 -    # page, instead send them to the home page
 -    redirect_to :controller => 'site', :action => 'index' if session[:user]
 +    @referer = params[:referer] || session[:referer]
 +
 +    if session[:user]
 +      # The user is logged in already, so don't show them the signup
 +      # page, instead send them to the home page
 +      redirect_to :controller => 'site', :action => 'index'
 +    elsif not params['openid'].nil?
 +      flash.now[:notice] = t 'user.new.openid association'
 +    end
    end
  
    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 params[:username] or using_open_id?
 +      session[:remember_me] ||= params[:remember_me]
 +      session[:referer] ||= params[:referer]
  
 -      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]
 -        else
 -          redirect_to :controller => 'site', :action => 'index'
 -        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)
 -        webmaster = link_to t('user.login.webmaster'), "mailto:webmaster@openstreetmap.org"
 -        flash.now[:error] = t 'user.login.account suspended', :webmaster => webmaster
 +      if using_open_id?
 +        openid_authentication(params[:openid_url])
        else
 -        flash.now[:error] = t 'user.login.auth failure'
 +        password_authentication(params[:username], params[:password])
        end
 +    else
 +      @title = t 'user.login.title'
      end
    end
  
  
  private
  
-       failed_login t('user.login.account suspended')
 +  ##
 +  # handle password authentication
 +  def password_authentication(username, password)
 +    if user = User.authenticate(:username => username, :password => password)
 +      successful_login(user)
 +    elsif User.authenticate(:username => username, :password => password, :pending => true)
 +      failed_login t('user.login.account not active')
 +    elsif User.authenticate(:username => username, :password => password, :suspended => true)
-             when "pending" then failed_login t('user.login.account not active')
-             when "active", "confirmed" then successful_login(user)
-             when "suspended" then failed_login t('user.login.account suspended')
-             else failed_login t('user.login.auth failure')
++      webmaster = link_to t('user.login.webmaster'), "mailto:webmaster@openstreetmap.org"
++      failed_login t('user.login.account suspended', :webmaster => webmaster)
 +    else
 +      failed_login t('user.login.auth failure')
 +    end
 +  end
 +
 +  ##
 +  # handle OpenID authentication
 +  def openid_authentication(openid_url)
 +    # If we don't appear to have a user for this URL then ask the
 +    # provider for some extra information to help with signup
 +    if openid_url and User.find_by_openid_url(openid_url)
 +      optional = nil
 +    else
 +      optional = [:nickname, :email]
 +    end
 +
 +    # Start the authentication
 +    authenticate_with_open_id(openid_expand_url(openid_url), :optional => optional) do |result, identity_url, registration|
 +      if result.successful?
 +        # We need to use the openid url passed back from the OpenID provider
 +        # rather than the one supplied by the user, as these can be different.
 +        #
 +        # For example, you can simply enter yahoo.com in the login box rather
 +        # than a user specific url. Only once it comes back from the provider
 +        # provider do we know the unique address for the user.
 +        if user = User.find_by_openid_url(identity_url)
 +          case user.status
++            when "pending" then
++              failed_login t('user.login.account not active')
++            when "active", "confirmed" then
++              successful_login(user)
++            when "suspended" then
++              webmaster = link_to t('user.login.webmaster'), "mailto:webmaster@openstreetmap.org"
++              failed_login t('user.login.account suspended', :webmaster => webmaster)
++            else
++              failed_login t('user.login.auth failure')
 +          end
 +        else
 +          # We don't have a user registered to this OpenID, so redirect
 +          # to the create account page with username and email filled
 +          # in if they have been given by the OpenID provider through
 +          # the simple registration protocol.
 +          redirect_to :controller => 'user', :action => 'new', :nickname => registration['nickname'], :email => registration['email'], :openid => identity_url
 +        end
 +      elsif result.missing?
 +        failed_login t('user.login.openid missing provider')
 +      elsif result.invalid?
 +        failed_login t('user.login.openid invalid')
 +      else
 +        failed_login t('user.login.auth failure')
 +      end
 +    end
 +  end
 +
 +  ##
 +  # verify an OpenID URL
 +  def openid_verify(openid_url, user)
 +    user.openid_url = openid_url
 +
 +    authenticate_with_open_id(openid_expand_url(openid_url)) do |result, identity_url|
 +      if result.successful?
 +        # We need to use the openid url passed back from the OpenID provider
 +        # rather than the one supplied by the user, as these can be different.
 +        #
 +        # For example, you can simply enter yahoo.com in the login box rather
 +        # than a user specific url. Only once it comes back from the provider
 +        # provider do we know the unique address for the user.
 +        user.openid_url = identity_url
 +        yield user
 +      elsif result.missing?
 +        flash.now[:error] = t 'user.login.openid missing provider'
 +      elsif result.invalid?
 +        flash.now[:error] = t 'user.login.openid invalid'
 +      else
 +        flash.now[:error] = t 'user.login.auth failure'
 +      end
 +    end
 +  end
 +
 +  ##
 +  # special case some common OpenID providers by applying heuristics to
 +  # try and come up with the correct URL based on what the user entered
 +  def openid_expand_url(openid_url)
 +    if openid_url.nil?
 +      return nil
 +    elsif openid_url.match(/(.*)gmail.com(\/?)$/) or openid_url.match(/(.*)googlemail.com(\/?)$/)
 +      # Special case gmail.com as it is potentially a popular OpenID
 +      # provider and, unlike yahoo.com, where it works automatically, Google
 +      # have hidden their OpenID endpoint somewhere obscure this making it
 +      # somewhat less user friendly.
 +      return 'https://www.google.com/accounts/o8/id'
 +    else
 +      return openid_url
 +    end
 +  end  
 +
 +  ##
 +  # process a successful login
 +  def successful_login(user)
 +    session[:user] = user.id
 +
 +    session_expires_after 1.month if session[:remember_me]
 +
 +    if user.blocked_on_view
 +      redirect_to user.blocked_on_view, :referer => params[:referer]
 +    elsif session[:referer]
 +      redirect_to session[:referer]
 +    else
 +      redirect_to :controller => 'site', :action => 'index'
 +    end
 +
 +    session.delete(:remember_me)
 +    session.delete(:referer)
 +  end
 +
 +  ##
 +  # process a failed login
 +  def failed_login(message)
 +    flash[:error] = message
 +
 +    redirect_to :action => 'login', :referer =>  session[:referer]
 +
 +    session.delete(:remember_me)
 +    session.delete(:referer)
 +  end
 +
 +  ##
 +  # update a user's details
 +  def update_user(user)
 +    if user.save
 +      set_locale
 +
 +      if user.new_email.nil? or user.new_email.empty?
 +        flash.now[:notice] = t 'user.account.flash update success'
 +      else
 +        flash.now[:notice] = t 'user.account.flash update success confirm needed'
 +
 +        begin
 +          Notifier.deliver_email_confirm(user, user.tokens.create)
 +        rescue
 +          # Ignore errors sending email
 +        end
 +      end
 +    end
 +  end
 +
    ##
    # require that the user is a administrator, or fill out a helpful error message
    # and return them to the user page.
diff --combined config/locales/en.yml
index cc2dc5e980639f254e745c72e1fd8d917378ac01,9bdfe0e3c329339181f0f1fb4f43e2ca7477e443..861caaf358e238969325d975fdd04a7fc3878ff4
        create_account: "create an account"
        email or username: "Email Address or Username:"
        password: "Password:"
 +      openid: "{{logo}} OpenID:"
 +      username_heading: "Login with username and password:"
 +      openid_heading: "Login with OpenID:"
        remember: "Remember me:"
        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.
+       account suspended: Sorry, your account has been suspended due to suspicious activity.<br />Please contact the {{webmaster}} if you wish to discuss this.
+       webmaster: webmaster
        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 to be malformed"
 +      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"
        not displayed publicly: 'Not displayed publicly (see <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">privacy policy</a>)'
        display name: "Display Name:"
        display name description: "Your publicly displayed username. You can change this later in the preferences."
 +      openid: "{{logo}} OpenID:"
        password: "Password:"
        confirm password: "Confirm Password:"
 +      use openid: "Alternatively, use {{logo}} OpenID to login"
 +      openid no password: "With OpenID a password is not required, but some extra tools or server may still need one."
 +      openid association: |
 +        <p>Your OpenID is not associated with a OpenStreetMap account yet.</p>
 +        <ul>
 +          <li>If you are new to OpenStreetMap, please create a new account using the form below.</li>
 +          <li>
 +            If you already have an account, you can login to your account
 +            using your username and password and then associate the account
 +            with your OpenID in your user settings.
 +          </li>
 +        </ul> 
        continue: Continue
        flash create success message: "User was successfully created. Check your email for a confirmation note, and you will be mapping in no time :-)<br /><br />Please note that you will not be able to login until you've received and confirmed your email address.<br /><br />If you use an antispam system which sends confirmation requests then please make sure you whitelist webmaster@openstreetmap.org as we are unable to reply to any confirmation requests."
      terms:
        declined: "http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined"
        decline: "Decline"
        legale_select: "Please select your country of residence:"
-       legale_button: "Go"
        legale_names:
          france: "France"
          italy: "Italy"
        current email address: "Current Email Address:"
        new email address: "New Email Address:"
        email never displayed publicly: "(never displayed publicly)"
 +      openid:
 +        openid: "OpenID:"
 +        link: "http://wiki.openstreetmap.org/wiki/OpenID"
 +        link text: "what is this?"
        public editing:
          heading: "Public editing:"
          enabled: "Enabled. Not anonymous and can edit data."
      suspended:
        title: Account Suspended
        heading: Account Suspended
+       webmaster: webmaster
        body: |
          <p>
            Sorry, your account has been automatically suspended due to
          </p>
          <p>
            This decision will be reviewed by an administrator shortly, or
-           you may contact the <a href="mailto:{{webmaster}}">webmaster</a> if
-           you wish to discuss this.
+           you may contact the {{webmaster}} if you wish to discuss this.
          </p>
    user_role:
      filter:
diff --combined config/locales/is.yml
index 0bc1c5fcef6db56c9464c1c1a1da773440d2ec71,156f23381f437dce0da40361de5a404ef0b9fb06..702c182f0c441e77f5d0c9c9edb27f26f1185f74
@@@ -990,8 -990,6 +990,8 @@@ is
        current email address: "Núverandi netfang:"
        delete image: Eyða þessari mynd
        email never displayed publicly: (aldrei sýnt opinberlega)
 +      openid:
 +        link text: "hvað er openID?"
        flash update success: Stillingarnar þínar voru uppfærðar.
        flash update success confirm needed: Stillingarnar þínar voru uppfærðar. Póstur var sendur á netfangið þitt sem þú þarft að bregðast við til að netfangið þitt verði staðfest.
        home location: "Staðsetning:"
        please login: Vinsamlegast innskráðu þig eða {{create_user_link}}.
        remember: "Muna innskráninguna:"
        title: Innskrá
 +      openid_heading: "Innskráning með OpenID:"
 +      username_heading: "Innskráning með OpenStreetMap aðgang:"
 +      openid_logo_alt: "Innskrá með OpenID"
 +      openid_providers:
 +        openid:
 +          title: Innskrá með OpenID slóð
 +          alt: Innskrá með OpenID slóð
 +        yahoo:
 +          title: Innsrká með Yahoo! OpenID
 +          alt: Innsrká með Yahoo! OpenID
 +        google:
 +          title: Innsrká með Google OpenID
 +          alt: Innsrká með Google OpenID
 +        myopenid:
 +          title: Innsrká með myOpenID OpenID
 +          alt: Innsrká með myOpenID OpenID
 +        wordpress:
 +          title: Innsrká með Wordpress.com OpenID
 +          alt: Innsrká með Wordpress.com OpenID
 +        myspace:
 +          title: Innsrká með MySpace OpenID
 +          alt: Innsrká með MySpace OpenID
      logout: 
        heading: Útskrá
        logout_button: Útskrá
        confirm email address: "Staðfestu netfang:"
        confirm password: "Staðfestu lykilorðið:"
        contact_webmaster: Hafðu samband við <a href="mailto:webmaster@openstreetmap.org">vefstjóra</a> til að fá reikning búinn til.
+       continue: Halda áfram
        display name: "Sýnilegt nafn:"
        display name description: Nafn þitt sem aðrir notendur sjá, þú getur breytt því síðar í stillingunum þínum.
        email address: "Netfang:"
        no_auto_account_create: Því miður getum við eki búið til reikning fyrir þig sjálfkrafa.
        not displayed publicly: Ekki sýnt opinberlega (sjá <a href="http://wiki.openstreetmap.org/index.php?uselang=is&title=Privacy_Policy" title="Meðferð persónuupplýsinga, þ.á.m. netfanga">meðferð persónuupplýsinga</a>)
        password: "Lykilorð:"
 +      openID associate: "Tengja OpenID við þennan aðgang"
 +      openID: "OpenID:"
 +      openID description: '(Valfrjálst) Ef þú ert með <a href="http://wiki.openstreetmap.org/wiki/openID">OpenID</a> getur þú tengt það við nýja aðganginn þinn.'
 +      openID nopassword: "Með OpenID þarft þú ekki að gefa upp lykilorð við innskráningu. Í stað þess notar þú OpenID."
 +      openID association: |
 +        Þetta OpenID er ekki tengt við neinn OpenStreetMap aðgang.
 +        <ul>
 +          <li>Ef þú ert ekki með OpenStreetMap aðgang getur þú búið til nýjan aðgang hér fyrir neðan.</li>
 +          <li>
 +            Ef þú ert þegar með aðgang skaltu innskrá þig með
 +            honum. Svo getur þú tengt OpenID við aðganginn þinn á
 +            stillingarsíðunni.
 +          </li>
 +        </ul> 
 +      signup: Nýskrá
        title: Nýskrá
      no_such_user: 
        body: Það er ekki til notandi með nafninu {{user}}. Kannski slóstu nafnið rangt inn eða fylgdir ógildum tengli.
        title: Lykilorð endurstillt
      set_home: 
        flash success: Staðsetning þín hefur verið stillt
+     terms: 
+       agree: Samþykkja
+       consider_pd: Ég afsala mér höfundarétt á mínum framlögum
+       consider_pd_why: hvað þýðir þetta?
+       decline: Hafna
+       heading: Notandaskilmálar
+       legale_names: 
+         france: Frakkland
+         italy: Ítalía
+         rest_of_world: Restin af heiminum
+       legale_select: "Staðfærð og þýdd útgáfa notandaskilmálanna:"
+       press accept button: Eftirfarandi skilmálar gilda um framlög þín til OpenStreetMap. Vinsamlegast lestu þá og ýttu á „Samþykkja“ sért þú samþykk(ur) þeim, annars ekki.
      view: 
        activate_user: virkja þennan notanda
        add as friend: bæta við sem vin