+ flash[:notice] = t 'user.make_friend.success', :name => name
+ Notifier.deliver_friend_notification(friend)
+ else
+ friend.add_error(t('user.make_friend.failed', :name => name))
+ end
+ else
+ flash[:warning] = t 'user.make_friend.already_a_friend', :name => name
+ end
+
+ if params[:referer]
+ redirect_to params[:referer]
+ else
+ redirect_to :controller => 'user', :action => 'view'
+ end
+ end
+ end
+
+ def remove_friend
+ if params[:display_name]
+ name = params[:display_name]
+ friend = User.find_by_display_name(name, :conditions => {:status => ["active", "confirmed"]})
+ if @user.is_friends_with?(friend)
+ Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{friend.id}"
+ flash[:notice] = t 'user.remove_friend.success', :name => friend.display_name
+ else
+ flash[:error] = t 'user.remove_friend.not_a_friend', :name => friend.display_name
+ end
+
+ if params[:referer]
+ redirect_to params[:referer]
+ else
+ redirect_to :controller => 'user', :action => 'view'
+ end
+ end
+ end
+
+ ##
+ # sets a user's status
+ def set_status
+ @this_user.update_attributes(:status => params[:status])
+ redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
+ end
+
+ ##
+ # delete a user, marking them as deleted and removing personal data
+ def delete
+ @this_user.delete
+ redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
+ end
+
+ ##
+ # display a list of users matching specified criteria
+ def list
+ if request.post?
+ ids = params[:user].keys.collect { |id| id.to_i }
+
+ User.update_all("status = 'confirmed'", :id => ids) if params[:confirm]
+ User.update_all("status = 'deleted'", :id => ids) if params[:hide]
+
+ redirect_to url_for(:status => params[:status], :ip => params[:ip], :page => params[:page])
+ else
+ conditions = Hash.new
+ conditions[:status] = params[:status] if params[:status]
+ conditions[:creation_ip] = params[:ip] if params[:ip]
+
+ @user_pages, @users = paginate(:users,
+ :conditions => conditions,
+ :order => :id,
+ :per_page => 50)
+ end
+ end
+
+private
+
+ ##
+ # 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)
+ failed_login t('user.login.account suspended')
+ 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_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 failed_login t('user.login.account suspended')
+ else failed_login t('user.login.auth failure')
+ end