From: Tom Hughes Date: Wed, 22 Jun 2011 21:36:43 +0000 (+0100) Subject: Merge branch 'master' into openstreetbugs X-Git-Tag: live~6101^2~144 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/7c98b41cc89068d049a18f8738276f19cd47095e?hp=c20b31b54ed3043e9ebf3964aa7c08f5ddc73a95 Merge branch 'master' into openstreetbugs --- diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 0b04f0f35..078823cbb 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -186,6 +186,7 @@ class AmfController < ApplicationController user = getuser(usertoken) if !user then return -1,"You are not logged in, so Potlatch can't write any changes to the database." end unless user.active_blocks.empty? then return -1,t('application.setup_user_auth.blocked') end + if REQUIRE_TERMS_AGREED and user.terms_agreed.nil? then return -1,"You must accept the contributor terms before you can edit." end if cstags if !tags_ok(cstags) then return -1,"One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." end @@ -573,6 +574,8 @@ class AmfController < ApplicationController user = getuser(usertoken) if !user then return -1,"You are not logged in, so the relation could not be saved." end unless user.active_blocks.empty? then return -1,t('application.setup_user_auth.blocked') end + if REQUIRE_TERMS_AGREED and user.terms_agreed.nil? then return -1,"You must accept the contributor terms before you can edit." end + if !tags_ok(tags) then return -1,"One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." end tags = strip_non_xml_chars tags @@ -661,7 +664,10 @@ class AmfController < ApplicationController user = getuser(usertoken) if !user then return -1,"You are not logged in, so the way could not be saved." end unless user.active_blocks.empty? then return -1,t('application.setup_user_auth.blocked') end + if REQUIRE_TERMS_AGREED and user.terms_agreed.nil? then return -1,"You must accept the contributor terms before you can edit." end + if pointlist.length < 2 then return -2,"Server error - way is only #{points.length} points long." end + if !tags_ok(attributes) then return -1,"One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." end attributes = strip_non_xml_chars attributes @@ -767,6 +773,8 @@ class AmfController < ApplicationController user = getuser(usertoken) if !user then return -1,"You are not logged in, so the point could not be saved." end unless user.active_blocks.empty? then return -1,t('application.setup_user_auth.blocked') end + if REQUIRE_TERMS_AGREED and user.terms_agreed.nil? then return -1,"You must accept the contributor terms before you can edit." end + if !tags_ok(tags) then return -1,"One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." end tags = strip_non_xml_chars tags @@ -850,6 +858,7 @@ class AmfController < ApplicationController user = getuser(usertoken) unless user then return -1,"You are not logged in, so the way could not be deleted." end unless user.active_blocks.empty? then return -1,t('application.setup_user_auth.blocked') end + if REQUIRE_TERMS_AGREED and user.terms_agreed.nil? then return -1,"You must accept the contributor terms before you can edit." end way_id = way_id.to_i nodeversions = {} diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6c19b3a52..619ef981a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -11,7 +11,7 @@ class ApplicationController < ActionController::Base @user = User.find(session[:user], :conditions => {:status => ["active", "confirmed", "suspended"]}) if @user.status == "suspended" - session[:user] = nil + session.delete(:user) session_expires_automatically redirect_to :controller => "user", :action => "suspended" @@ -50,7 +50,7 @@ class ApplicationController < ActionController::Base # method, otherwise an OAuth token was used, which has to be checked. unless current_token.nil? unless current_token.read_attribute(cap) - render :text => "OAuth token doesn't have that capability.", :status => :forbidden + report_error "OAuth token doesn't have that capability.", :forbidden return false end end @@ -61,11 +61,14 @@ class ApplicationController < ActionController::Base def require_cookies if request.cookies["_osm_session"].to_s == "" if params[:cookie_test].nil? + session[:cookie_test] = true redirect_to params.merge(:cookie_test => "true") return false else flash.now[:warning] = t 'application.require_cookies.cookies_needed' end + else + session.delete(:cookie_test) end end @@ -81,6 +84,11 @@ class ApplicationController < ActionController::Base end def require_allow_write_api require_capability(:allow_write_api) + + if REQUIRE_TERMS_AGREED and @user.terms_agreed.nil? + report_error "You must accept the contributor terms before you can edit.", :forbidden + return false + end end def require_allow_read_gpx require_capability(:allow_read_gpx) diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 97b0de73c..b337dc04c 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -27,22 +27,53 @@ class UserController < ApplicationController render :update do |page| page.replace_html "contributorTerms", :partial => "terms" 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 else + session[:referer] = params[:referer] + @title = t 'user.terms.title' @user = User.new(params[:user]) if params[:user] + if params[:user] and 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 if @user.invalid? if @user.new_record? + # Something is wrong with a new user, so rerender the form render :action => :new else + # Error in existing user, so go to account settings flash[:errors] = @user.errors redirect_to :action => :account, :display_name => @user.display_name end elsif @user.terms_agreed? + # Already agreed to terms, so just show settings redirect_to :action => :account, :display_name => @user.display_name + elsif params[:user] and params[:user][:openid_url] and not params[:user][:openid_url].empty? + # Verify OpenID before moving on + session[:new_user] = @user + openid_verify(params[:user][:openid_url], @user) end else + # Not logged in, so redirect to the login page redirect_to :action => :login, :referer => request.request_uri end end @@ -94,10 +125,11 @@ class UserController < ApplicationController @user.languages = request.user_preferred_languages @user.terms_agreed = Time.now.getutc @user.terms_seen = true + @user.openid_url = nil if @user.openid_url and @user.openid_url.empty? if @user.save flash[:notice] = t 'user.new.flash create success message', :email => @user.email - Notifier.deliver_signup_confirm(@user, @user.tokens.create(:referer => params[:referer])) + Notifier.deliver_signup_confirm(@user, @user.tokens.create(:referer => session.delete(:referer))) session[:token] = @user.tokens.create.token redirect_to :action => 'login', :referer => params[:referer] else @@ -136,22 +168,25 @@ class UserController < ApplicationController @user.preferred_editor = params[:user][:preferred_editor] end - if @user.save - set_locale - - 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' + @user.openid_url = nil if params[:user][:openid_url].empty? - 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 + 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 else if flash[:errors] @@ -217,46 +252,26 @@ class UserController < ApplicationController 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[:username] or using_open_id? + session[:remember_me] ||= params[:remember_me] + session[:referer] ||= params[:referer] - 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] - - target = params[:referer] || url_for(:controller => :site, :action => :index) - - # The user is logged in, so decide where to send them: - # - # - If they haven't seen the contributor terms, send them there. - # - If they have a block on them, show them that. - # - If they were referred to the login, send them back there. - # - Otherwise, send them to the home page. - if REQUIRE_TERMS_SEEN and not user.terms_seen - redirect_to :controller => :user, :action => :terms, :referer => target - elsif user.blocked_on_view - redirect_to user.blocked_on_view, :referer => target - else - redirect_to target - end - elsif user = User.authenticate(:username => email_or_display_name, :password => pass, :pending => true) - flash.now[:error] = t 'user.login.account not active', :reconfirm => url_for(:action => 'confirm_resend', :display_name => user.display_name) - 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 elsif flash[:notice].nil? flash.now[:notice] = t 'user.login.notice' @@ -272,9 +287,9 @@ class UserController < ApplicationController if token token.destroy end - session[:token] = nil + session.delete(:token) end - session[:user] = nil + session.delete(:user) session_expires_automatically if params[:referer] redirect_to params[:referer] @@ -476,6 +491,175 @@ class UserController < ApplicationController private + ## + # handle password authentication + def password_authentication(username, password) + if user = User.authenticate(:username => username, :password => password) + successful_login(user) + elsif user = User.authenticate(:username => username, :password => password, :pending => true) + failed_login t('user.login.account not active', :reconfirm => url_for(:action => 'confirm_resend', :display_name => user.display_name)) + elsif User.authenticate(:username => username, :password => password, :suspended => true) + 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) + required = nil + else + required = [:nickname, :email, "http://axschema.org/namePerson/friendly", "http://axschema.org/contact/email"] + end + + # Start the authentication + authenticate_with_open_id(openid_expand_url(openid_url), :required => required) do |result, identity_url, sreg, ax| + 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 + # Guard against not getting any extension data + sreg = Hash.new if sreg.nil? + ax = Hash.new if ax.nil? + + # 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. + nickname = sreg["nickname"] || ax["http://axschema.org/namePerson/friendly"] + email = sreg["email"] || ax["http://axschema.org/contact/email"] + redirect_to :controller => 'user', :action => 'new', :nickname => nickname, :email => 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] + + target = session[:referer] || url_for(:controller => :site, :action => :index) + + # The user is logged in, so decide where to send them: + # + # - If they haven't seen the contributor terms, send them there. + # - If they have a block on them, show them that. + # - If they were referred to the login, send them back there. + # - Otherwise, send them to the home page. + if REQUIRE_TERMS_SEEN and not user.terms_seen + redirect_to :controller => :user, :action => :terms, :referer => target + elsif user.blocked_on_view + redirect_to user.blocked_on_view, :referer => target + else + redirect_to target + 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 --git a/app/helpers/user_helper.rb b/app/helpers/user_helper.rb index 0147c3fe6..8686d5a03 100644 --- a/app/helpers/user_helper.rb +++ b/app/helpers/user_helper.rb @@ -1,2 +1,16 @@ module UserHelper + def openid_logo + image_tag "openid_small.png", :alt => t('user.login.openid_logo_alt'), :class => "openid_logo" + end + + def openid_button(name, url) + link_to_function( + image_tag("#{name}.png", :alt => t("user.login.openid_providers.#{name}.alt")), + nil, + :title => t("user.login.openid_providers.#{name}.title") + ) do |page| + page[:login_form][:openid_url][:value] = url + page[:login_form].submit() + end + end end diff --git a/app/models/user.rb b/app/models/user.rb index d2535bbd4..0b2a902df 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -23,13 +23,14 @@ class User < ActiveRecord::Base validates_confirmation_of :pass_crypt#, :message => ' must match the confirmation password' validates_uniqueness_of :display_name, :allow_nil => true validates_uniqueness_of :email + validates_uniqueness_of :openid_url, :allow_nil => true validates_length_of :pass_crypt, :within => 8..255 validates_length_of :display_name, :within => 3..255, :allow_nil => true - validates_email_format_of :email - validates_email_format_of :new_email, :allow_blank => true - validates_format_of :display_name, :with => /^[^\/;.,?]*$/ - validates_format_of :display_name, :with => /^\S/, :message => "has leading whitespace" - validates_format_of :display_name, :with => /\S$/, :message => "has trailing whitespace" + validates_email_format_of :email, :if => Proc.new { |u| u.email_changed? } + validates_email_format_of :new_email, :allow_blank => true, :if => Proc.new { |u| u.new_email_changed? } + validates_format_of :display_name, :with => /^[^\/;.,?]*$/, :if => Proc.new { |u| u.display_name_changed? } + validates_format_of :display_name, :with => /^\S/, :message => "has leading whitespace", :if => Proc.new { |u| u.display_name_changed? } + validates_format_of :display_name, :with => /\S$/, :message => "has trailing whitespace", :if => Proc.new { |u| u.display_name_changed? } validates_numericality_of :home_lat, :allow_nil => true validates_numericality_of :home_lon, :allow_nil => true validates_numericality_of :home_zoom, :only_integer => true, :allow_nil => true diff --git a/app/models/user_sweeper.rb b/app/models/user_sweeper.rb index d2fd983f7..7e420ae40 100644 --- a/app/models/user_sweeper.rb +++ b/app/models/user_sweeper.rb @@ -15,13 +15,18 @@ private if old_record and (new_record.nil? or old_record.visible? != new_record.visible? or - old_record.display_name != new_record.display_name) + old_record.display_name != new_record.display_name or + old_record.image != new_record.image) old_record.diary_entries.each do |entry| expire_action(:controller => 'diary_entry', :action => 'view', :display_name => old_record.display_name, :id => entry.id) expire_action(:controller => 'diary_entry', :action => 'list', :language => entry.language_code, :display_name => nil) expire_action(:controller => 'diary_entry', :action => 'rss', :language => entry.language_code, :display_name => nil) end + old_record.diary_comments.each do |comment| + expire_action(:controller => 'diary_entry', :action => 'view', :display_name => comment.diary_entry.user.display_name, :id => comment.diary_entry.id) + end + expire_action(:controller => 'diary_entry', :action => 'list', :language => nil, :display_name => nil) expire_action(:controller => 'diary_entry', :action => 'list', :language => nil, :display_name => old_record.display_name) diff --git a/app/views/user/account.html.erb b/app/views/user/account.html.erb index abece879f..d18971f0a 100644 --- a/app/views/user/account.html.erb +++ b/app/views/user/account.html.erb @@ -27,6 +27,11 @@ <%= f.password_field :pass_crypt_confirmation, {:value => '', :size => 30, :maxlength => 255, :autocomplete => :off} %> + + <%= t 'user.account.openid.openid' %> + <%= f.text_field :openid_url, {:id => "openid_url", :class => "openid_url"} %> (<%= t 'user.account.openid.link text' %>) + + <%= t 'user.account.public editing.heading' %> diff --git a/app/views/user/login.html.erb b/app/views/user/login.html.erb index 7cc4b6f24..2d90ba7cf 100644 --- a/app/views/user/login.html.erb +++ b/app/views/user/login.html.erb @@ -1,25 +1,80 @@
+

<%= t 'user.login.heading' %>

-

<%= t 'user.login.already have' %>

- - <% form_tag :action => 'login' do %> + <% form_tag({ :action => "login" }, { :id => "login_form" }) do %> <%= hidden_field_tag('referer', h(params[:referer])) %> + +

<%= t 'user.login.with username' %>

+ - - + +
<%= t 'user.login.email or username' %><%= text_field('user', 'email',{:value => "", :size => 28, :maxlength => 255, :tabindex => 1}) %>
<%= t 'user.login.password' %><%= password_field('user', 'password',{:value => "", :size => 28, :maxlength => 255, :tabindex => 2}) %> (<%= link_to t('user.login.lost password link'), :controller => 'user', :action => 'lost_password' %>)
<%= t 'user.login.email or username' %><%= text_field_tag "username", params[:username], :size => 28, :maxlength => 255, :tabindex => 1 %>
<%= t 'user.login.password' %><%= password_field_tag "password", "", :size => 28, :maxlength => 255, :tabindex => 2 %> (<%= link_to t('user.login.lost password link'), :controller => 'user', :action => 'lost_password' %>)
<%= check_box_tag "remember_me", "yes", false, :tabindex => 3 %>
<%= submit_tag t('user.login.login_button'), :tabindex => 3 %> + +
+ +

<%= t 'user.login.with openid' %>

+ + + + + + + + + + +
+ <%= + link_to_function(image_tag("openid.png", :alt => t("user.login.openid_providers.openid.title")), nil, :title => t("user.login.openid_providers.openid.title")) do |page| + page[:login_form][:openid_url].value = "http://" + page[:login_openid_buttons].hide + page[:login_openid_url].show + page[:login_openid_submit].show + end + %> + <%= openid_button "google", "gmail.com" %><%= openid_button "yahoo", "me.yahoo.com" %><%= openid_button "myopenid", "myopenid.com" %><%= openid_button "wordpress", "wordpress.com" %><%= openid_button "aol", "aol.com" %>
+ + + + + + + + + + +
+ <%= t 'user.login.openid', :logo => openid_logo %> + + <%= text_field_tag("openid_url", "", { :size => 28, :maxlength => 255, :tabindex => 3, :class => "openid_url" }) %> + (<%= t 'user.account.openid.link text' %>) +
<%= check_box_tag "remember_me", "yes", false, :tabindex => 5 %>
+ + <%= submit_tag t('user.login.login_button'), :tabindex => 6, :id => "login_openid_submit" %> <% end %> +
+

<%= t 'user.login.new to osm' %>

<%= t 'user.login.to make changes' %>

<%= t 'user.login.create account minute' %>

<%= button_to t('user.login.register now'), :action => :new, :referer => params[:referer] %>

-
+ +
+
+ +<%= + update_page_tag do |page| + page[:login_openid_url].hide + page[:login_openid_submit].hide + end +%> diff --git a/app/views/user/new.html.erb b/app/views/user/new.html.erb index 66d8826c2..5ff4ed028 100644 --- a/app/views/user/new.html.erb +++ b/app/views/user/new.html.erb @@ -2,37 +2,89 @@ <% if Acl.find_by_address(request.remote_ip, :conditions => {:k => "no_account_creation"}) %> -

<%= t 'user.new.no_auto_account_create' %> -

+

<%= t 'user.new.no_auto_account_create' %>

-

<%= t 'user.new.contact_webmaster' %> -

+

<%= t 'user.new.contact_webmaster' %>

<% else %> -

<%= t 'user.new.fill_form' %> -

+

<%= t 'user.new.fill_form' %>

<%= error_messages_for 'user' %> <% form_tag :action => 'terms' do %> -<%= hidden_field_tag('referer', h(params[:referer])) unless params[:referer].nil? %> - - - - - - - - - - - - - -
<%= t 'user.new.email address' %><%= text_field('user', 'email',{:size => 50, :maxlength => 255, :tabindex => 1}) %>
<%= t 'user.new.confirm email address' %><%= text_field('user', 'email_confirmation',{:size => 50, :maxlength => 255, :tabindex => 2}) %>
<%= t 'user.new.not displayed publicly' %>
 
<%= t 'user.new.display name' %><%= text_field('user', 'display_name',{:size => 30, :maxlength => 255, :tabindex => 3}) %>
<%= t 'user.new.display name description' %>
 
<%= t 'user.new.password' %><%= password_field('user', 'pass_crypt',{:size => 30, :maxlength => 255, :tabindex => 4}) %>
<%= t 'user.new.confirm password' %><%= password_field('user', 'pass_crypt_confirmation',{:size => 30, :maxlength => 255, :tabindex => 5}) %>
 
+ <%= hidden_field_tag('referer', h(@referer)) unless @referer.nil? %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<%= t 'user.new.email address' %><%= text_field(:user, :email, { :size => 50, :maxlength => 255, :tabindex => 1, :value => params[:email] }) %>
<%= t 'user.new.confirm email address' %><%= text_field(:user, :email_confirmation, { :size => 50, :maxlength => 255, :tabindex => 2, :value => params[:email] }) %>
<%= t 'user.new.not displayed publicly' %>
 
<%= t 'user.new.display name' %><%= text_field(:user, :display_name, { :size => 30, :maxlength => 255, :tabindex => 3, :value => params[:nickname] }) %>
<%= t 'user.new.display name description' %>
 
<%= t 'user.new.openid', :logo => openid_logo %><%= text_field(:user, :openid_url, { :id => "openid_url", :size => 50, :maxlength => 255, :tabindex => 4, :value => params[:openid], :class => "openid_url" }) %>
 
<%= t 'user.new.password' %><%= password_field(:user, :pass_crypt, { :size => 30, :maxlength => 255, :tabindex => 5 }) %>
<%= t 'user.new.confirm password' %><%= password_field(:user, :pass_crypt_confirmation, { :size => 30, :maxlength => 255, :tabindex => 6 }) %>
+ <%= link_to_function(t('user.new.use openid', :logo => openid_logo)) { |page| page.hide 'openid_prompt'; page.show 'openid_spacer', 'openid_url', 'openid_note' } %> + <%= t 'user.new.openid no password' %> +
 
<%= submit_tag t('user.new.continue'), :tabindex => 6 %>
<% end %> +<%= + update_page_tag do |page| + if params[:openid] or (@user and @user.openid_url) + page[:openid_prompt].hide + else + page[:openid_spacer].hide + page[:openid_url].hide + page[:openid_note].hide + end + end +%> + <%= javascript_include_tag 'https://ethnio.com/remotes/62786' %> <% end %> diff --git a/app/views/user/terms.html.erb b/app/views/user/terms.html.erb index cd352ab6f..e4644e815 100644 --- a/app/views/user/terms.html.erb +++ b/app/views/user/terms.html.erb @@ -33,12 +33,13 @@

<%= hidden_field_tag('referer', h(params[:referer])) unless params[:referer].nil? %> - <% if params[:user] %> + <% if @user.new_record? %> <%= hidden_field('user', 'email') %> <%= hidden_field('user', 'email_confirmation') %> <%= hidden_field('user', 'display_name') %> <%= hidden_field('user', 'pass_crypt') %> <%= hidden_field('user', 'pass_crypt_confirmation') %> + <%= hidden_field('user', 'openid_url') %> <% end %>

<%= submit_tag(t('user.terms.decline'), :name => "decline", :id => "decline") %> diff --git a/config/example.application.yml b/config/example.application.yml index dea87c247..eef48a7bb 100644 --- a/config/example.application.yml +++ b/config/example.application.yml @@ -71,6 +71,8 @@ standard_settings: &standard_settings #potlatch2_key: "" # Whether to require users to view the CTs before continuing to edit... require_terms_seen: false + # Whether to require users to agree to the CTs before editing + require_terms_agreed: false development: <<: *standard_settings diff --git a/config/initializers/openid.rb b/config/initializers/openid.rb new file mode 100644 index 000000000..966164b3e --- /dev/null +++ b/config/initializers/openid.rb @@ -0,0 +1 @@ +OpenIdAuthentication.store = :file diff --git a/config/locales/en.yml b/config/locales/en.yml index c619d449d..5b6d575d3 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1067,6 +1067,9 @@ en: