+ else
+ #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.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'
+ Notifier.deliver_signup_confirm(@user, @user.tokens.create(:referer => params[:referer]))
+ redirect_to :action => 'login'
+ else
+ render :action => 'new'
+ end