From 56d7c67bbb266d41b9eec067f2beea1e7ca93e9f Mon Sep 17 00:00:00 2001 From: maxwell Date: Mon, 9 Aug 2010 17:21:41 -0700 Subject: [PATCH 1/2] Going toward pending requests --- app/controllers/publics_controller.rb | 3 +- app/helpers/requests_helper.rb | 1 - app/models/person.rb | 2 -- app/models/request.rb | 4 +-- app/models/user.rb | 18 +++++++---- config/routes.rb | 2 +- lib/diaspora/parser.rb | 4 +-- spec/controllers/publics_controller_spec.rb | 33 +++++++++++++++++---- spec/models/user_spec.rb | 14 +++++---- 9 files changed, 56 insertions(+), 25 deletions(-) diff --git a/app/controllers/publics_controller.rb b/app/controllers/publics_controller.rb index 0582e4571..9192f064e 100644 --- a/app/controllers/publics_controller.rb +++ b/app/controllers/publics_controller.rb @@ -18,8 +18,9 @@ class PublicsController < ApplicationController end def receive + user = User.first(:id => params[:id]) Rails.logger.info "PublicsController has received: #{params[:xml]}" - store_objects_from_xml params[:xml] + store_objects_from_xml params[:xml], user render :nothing => true end diff --git a/app/helpers/requests_helper.rb b/app/helpers/requests_helper.rb index 4404ec223..99f73be66 100644 --- a/app/helpers/requests_helper.rb +++ b/app/helpers/requests_helper.rb @@ -29,7 +29,6 @@ module RequestsHelper f = Redfinger.finger(identifier) action = subscription_mode(f) url = subscription_url(action, f) - { action => url } end diff --git a/app/models/person.rb b/app/models/person.rb index 196a249fa..477c091ca 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -5,7 +5,6 @@ class Person xml_accessor :_id xml_accessor :email xml_accessor :url - xml_accessor :serialized_key xml_accessor :profile, :as => Profile @@ -107,7 +106,6 @@ class Person end def owns?(post) - puts self.class self.id == post.person.id end diff --git a/app/models/request.rb b/app/models/request.rb index 1db410bbc..d55d1efb8 100644 --- a/app/models/request.rb +++ b/app/models/request.rb @@ -44,8 +44,8 @@ class Request end #ENCRYPTION - before_validation :sign_if_mine - validates_true_for :creator_signature, :logic => lambda {self.verify_creator_signature} + #before_validation :sign_if_mine + #validates_true_for :creator_signature, :logic => lambda {self.verify_creator_signature} xml_accessor :creator_signature key :creator_signature, String diff --git a/app/models/user.rb b/app/models/user.rb index 73c8987f3..2e43ecd00 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -5,12 +5,12 @@ class User :recoverable, :rememberable, :trackable, :validatable key :friend_ids, Array - key :pending_friend_ids, Array + key :pending_request_ids, Array one :person, :class_name => 'Person', :foreign_key => :owner_id many :friends, :in => :friend_ids, :class_name => 'Person' - many :pending_friends, :in => :pending_friend_ids, :class_name => 'Person' + many :pending_requests, :in => :pending_request_ids, :class_name => 'Request' before_validation_on_create :assign_key before_validation :do_bad_things @@ -31,9 +31,12 @@ class User ######### Friend Requesting def send_friend_request_to(friend_url) - unless self.friends.find{ |x| x.url == friend_url} + + unless self.friends.detect{ |x| x.url == friend_url} p = Request.instantiate(:to => friend_url, :from => self.person) if p.save + self.pending_requests << p + self.save p.push_to_url friend_url end p @@ -42,7 +45,7 @@ class User def accept_friend_request(friend_request_id) request = Request.where(:id => friend_request_id).first - n = pending_friends.delete(request.person) + n = pending_requests.delete(request) friends << request.person save @@ -57,12 +60,15 @@ class User def ignore_friend_request(friend_request_id) request = Request.first(:id => friend_request_id) person = request.person - pending_friends.delete(request.person) + pending_requests.delete(request) + save person.destroy unless person.user_refs > 0 request.destroy end def receive_friend_request(friend_request) + + puts friend_request.inspect Rails.logger.info("receiving friend request #{friend_request.to_json}") friend_request.person.serialized_key = friend_request.exported_key @@ -72,7 +78,7 @@ class User friend_request.destroy else friend_request.person.save - pending_friends << friend_request.person + pending_requests << friend_request save Rails.logger.info("#{self.real_name} has received a friend request") friend_request.save diff --git a/config/routes.rb b/config/routes.rb index 3726f5bf4..274eaa86a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -25,7 +25,7 @@ Diaspora::Application.routes.draw do |map| #public routes - match 'receive', :to => 'publics#receive' + match 'receive/users/:id', :to => 'publics#receive' match '.well-known/host-meta',:to => 'publics#host_meta' match 'webfinger', :to => 'publics#webfinger' match 'hcard', :to => 'publics#hcard' diff --git a/lib/diaspora/parser.rb b/lib/diaspora/parser.rb index 265e44912..3737e5c25 100644 --- a/lib/diaspora/parser.rb +++ b/lib/diaspora/parser.rb @@ -42,7 +42,7 @@ module Diaspora objects end - def store_objects_from_xml(xml) + def store_objects_from_xml(xml, user) objects = parse_objects_from_xml(xml) objects.each do |p| Rails.logger.info("Receiving object:\n#{p.inspect}") @@ -50,7 +50,7 @@ module Diaspora Rails.logger.info "Got a retraction for #{p.post_id}" p.perform elsif p.is_a? Request - User.owner.receive_friend_request(p) + user.receive_friend_request(p) elsif p.is_a? Profile p.save elsif p.respond_to?(:person) && !(p.person.nil?) && !(p.person.is_a? User) diff --git a/spec/controllers/publics_controller_spec.rb b/spec/controllers/publics_controller_spec.rb index 5b84098a4..1fca9f278 100644 --- a/spec/controllers/publics_controller_spec.rb +++ b/spec/controllers/publics_controller_spec.rb @@ -10,15 +10,38 @@ describe PublicsController do end describe 'receive endpoint' do + it 'should have a and endpoint and return a 200 on successful receipt of a request' do + post :receive, :id =>@user.id + response.code.should == '200' + end + + it 'should accept a post from another node and save the information' do - it 'should accept a post from anohter node and save the information' do - person = Factory.create(:person) message = StatusMessage.new(:message => 'foo', :person => person) - StatusMessage.all.count.should == 0 - post :receive, {:xml => Post.build_xml_for(message)} - StatusMessage.all.count.should == 1 + StatusMessage.all.count.should be 0 + post :receive, :id => @user.id, :xml => Post.build_xml_for(message) + StatusMessage.all.count.should be 1 end end + + + it 'should save requests for the specified user (LOCAL)' do + @user2 = Factory.create(:user) + @user2.person.save + + req = Request.instantiate(:from => @user2.person, :to => @user.person.url) + xml = Request.build_xml_for [req] + + puts xml + + + req.delete + post :receive, :id =>@user.id, :xml => xml + + @user2.pending_requests.count.should be 1 + @user.pending_requests.count.should be 1 + end + end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index c7435cf03..bcc977505 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -39,6 +39,10 @@ describe User do it 'should not be able to friend request an existing friend' do friend = Factory.create(:person) + + @user.friends << friend + @user.save + @user.send_friend_request_to( friend.url ).should be nil end @@ -52,27 +56,27 @@ describe User do it 'should get the pending friends' do person_one = Factory.create :person person_two = Factory.create :person - @user.pending_friends.empty?.should be true + @user.pending_requests.empty?.should be true @user.friends.empty?.should be true request = Request.instantiate(:to => @user.url, :from => person_one) person_one.destroy @user.receive_friend_request request - @user.pending_friends.size.should be 1 + @user.pending_requests.size.should be 1 @user.friends.size.should be 0 request_two = Request.instantiate(:to => @user.url, :from => person_two) person_two.destroy @user.receive_friend_request request_two - @user.pending_friends.size.should be 2 + @user.pending_requests.size.should be 2 @user.friends.size.should be 0 @user.accept_friend_request request.id - @user.pending_friends.size.should be 1 + @user.pending_requests.size.should be 1 @user.friends.size.should be 1 @user.ignore_friend_request request_two.id - @user.pending_friends.size.should be 0 + @user.pending_requests.size.should be 0 @user.friends.size.should be 1 end end From 38abd5166659792c2a900182d10696e19c95ae21 Mon Sep 17 00:00:00 2001 From: maxwell Date: Mon, 9 Aug 2010 21:09:51 -0700 Subject: [PATCH 2/2] MS IZ fixed a couple of failing specs in the parser --- app/controllers/publics_controller.rb | 2 +- app/models/person.rb | 2 +- lib/diaspora/parser.rb | 7 ++++ spec/controllers/publics_controller_spec.rb | 45 +++++++++++++-------- spec/lib/diaspora_parser_spec.rb | 39 +++++++++++++----- 5 files changed, 65 insertions(+), 30 deletions(-) diff --git a/app/controllers/publics_controller.rb b/app/controllers/publics_controller.rb index 0df200efa..acbe5e814 100644 --- a/app/controllers/publics_controller.rb +++ b/app/controllers/publics_controller.rb @@ -18,7 +18,7 @@ class PublicsController < ApplicationController end def receive - user = User.first(:id => params[:id]) + user = Person.first(:id => params[:id]).owner Rails.logger.debug "PublicsController has received: #{params[:xml]}" store_objects_from_xml params[:xml], user render :nothing => true diff --git a/app/models/person.rb b/app/models/person.rb index a82dd56cf..f633d04c7 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -28,7 +28,7 @@ class Person before_validation :clean_url - validates_presence_of :email, :url, :serialized_key, :profile + validates_presence_of :email, :url, :profile, :serialized_key validates_format_of :url, :with => /^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix diff --git a/lib/diaspora/parser.rb b/lib/diaspora/parser.rb index 59d7f45d4..719264f2f 100644 --- a/lib/diaspora/parser.rb +++ b/lib/diaspora/parser.rb @@ -27,6 +27,13 @@ module Diaspora person = parse_owner_id_from_xml post person.profile = object person.save + elsif object.is_a? Request + person_string = Nokogiri::XML(xml) { |cfg| cfg.noblanks }.xpath("/XML/posts/post/request/person").to_s + person = Person.from_xml person_string + person.serialized_key ||= object.exported_key + object.person = person + object.person.save + elsif object.respond_to? :person object.person = parse_owner_from_xml post.to_s end diff --git a/spec/controllers/publics_controller_spec.rb b/spec/controllers/publics_controller_spec.rb index 1fca9f278..e63601d6a 100644 --- a/spec/controllers/publics_controller_spec.rb +++ b/spec/controllers/publics_controller_spec.rb @@ -11,37 +11,48 @@ describe PublicsController do describe 'receive endpoint' do it 'should have a and endpoint and return a 200 on successful receipt of a request' do - post :receive, :id =>@user.id + post :receive, :id =>@user.person.id response.code.should == '200' end it 'should accept a post from another node and save the information' do - + pending person = Factory.create(:person) message = StatusMessage.new(:message => 'foo', :person => person) StatusMessage.all.count.should be 0 - post :receive, :id => @user.id, :xml => Post.build_xml_for(message) + post :receive, :id => @user.person.id, :xml => Post.build_xml_for(message) StatusMessage.all.count.should be 1 end end + describe 'friend requests' do + before do + @user2 = Factory.create(:user) + @user2.person.save - it 'should save requests for the specified user (LOCAL)' do - @user2 = Factory.create(:user) - @user2.person.save + req = Request.instantiate(:from => @user2.person, :to => @user.person.url) + @xml = Request.build_xml_for [req] + + req.delete + end + + it 'should save requests for the specified user (LOCAL)' do + post :receive, :id => @user.person.id, :xml => @xml + + @user.reload + @user.pending_requests.size.should be 1 + end + + it 'should save requests for the specified user (REMOTE)' do + @user2.person.delete + @user2.delete + post :receive, :id => @user.person.id, :xml => @xml + + @user.reload + @user.pending_requests.size.should be 1 + end - req = Request.instantiate(:from => @user2.person, :to => @user.person.url) - xml = Request.build_xml_for [req] - - puts xml - - req.delete - post :receive, :id =>@user.id, :xml => xml - - @user2.pending_requests.count.should be 1 - @user.pending_requests.count.should be 1 end - end diff --git a/spec/lib/diaspora_parser_spec.rb b/spec/lib/diaspora_parser_spec.rb index 91fdd5d99..f4cd09cc9 100644 --- a/spec/lib/diaspora_parser_spec.rb +++ b/spec/lib/diaspora_parser_spec.rb @@ -6,14 +6,14 @@ include Diaspora::Parser describe Diaspora::Parser do before do @user = Factory.create(:user, :email => "bob@aol.com") - @person = Factory.create(:person, :email => "bill@gates.com") + @person = Factory.create(:person_with_private_key, :email => "bill@gates.com") end it "should not store posts from me" do status_messages = [] 10.times { status_messages << Factory.build(:status_message, :person => @user)} xml = Post.build_xml_for(status_messages) - store_objects_from_xml(xml) + store_objects_from_xml(xml, @user) StatusMessage.count.should == 0 end @@ -25,7 +25,7 @@ describe Diaspora::Parser do \n HEY DUDE\n a@a.com\n a@a.com\n a@a.com\n " - store_objects_from_xml(xml) + store_objects_from_xml(xml, @user) Post.count.should == 0 end @@ -41,7 +41,7 @@ describe Diaspora::Parser do \n HEY DUDE\n a@a.com\n a@a.com\n a@a.com\n " - store_objects_from_xml(xml) + store_objects_from_xml(xml, @user) Post.count.should == 0 end @@ -56,7 +56,7 @@ describe Diaspora::Parser do " - store_objects_from_xml(xml) + store_objects_from_xml(xml, @user) Post.count.should == 0 end @@ -107,7 +107,7 @@ describe Diaspora::Parser do request = Post.build_xml_for( [retraction] ) StatusMessage.count.should == 1 - store_objects_from_xml( request ) + store_objects_from_xml( request, @user ) StatusMessage.count.should == 0 end @@ -116,15 +116,32 @@ describe Diaspora::Parser do original_person_id = @person.id xml = Request.build_xml_for [request] - + @person.destroy Person.all.count.should be 1 - store_objects_from_xml(xml) + store_objects_from_xml(xml, @user) Person.all.count.should be 2 Person.where(:url => request.callback_url).first.id.should == original_person_id end + it "should not create a new person if the person is already here" do + @user2 = Factory.create(:user) + request = Request.instantiate(:to =>"http://www.google.com/", :from => @user2.person) + + original_person_id = @user2.person.id + xml = Request.build_xml_for [request] + + + Person.all.count.should be 3 + store_objects_from_xml(xml, @user) + Person.all.count.should be 3 + + @user2.reload + @user2.person.serialized_key.include?("PRIVATE").should be true + + Person.where(:url => request.callback_url).first.id.should == original_person_id + end it "should activate the Person if I initiated a request to that url" do request = Request.instantiate(:to => @person.url, :from => @user).save @@ -139,7 +156,7 @@ describe Diaspora::Parser do @person.destroy request_remote.destroy - store_objects_from_xml(xml) + store_objects_from_xml(xml, @user) new_person = Person.first(:url => @person.url) new_person.nil?.should be false @user.reload @@ -152,7 +169,7 @@ describe Diaspora::Parser do request = Retraction.build_xml_for( [retraction] ) Person.count.should == 2 - store_objects_from_xml( request ) + store_objects_from_xml( request , @user) Person.count.should == 1 end @@ -178,7 +195,7 @@ describe Diaspora::Parser do old_profile.first_name.should == 'bob' #Marshal profile - store_objects_from_xml xml + store_objects_from_xml xml, @user #Check that marshaled profile is the same as old profile person = Person.first(:id => person.id)