From 904143d10057099e6027bc985734705d6e9c97e4 Mon Sep 17 00:00:00 2001 From: ilya Date: Tue, 28 Sep 2010 11:25:18 -0700 Subject: [PATCH 01/15] rake task to move the private key --- lib/tasks/db.rake | 13 +++++++++++++ lib/tasks/generate_session_secret.rake | 1 - 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index 396bb145d..82fc6fa9f 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -65,4 +65,17 @@ namespace :db do } puts "everything should be peachy" end + + task :move_private_key do + User.all.each do |user| + if user.private_key.nil? + user.private_key = user.person.serialized_key + user.save + person = user.person + person.serialized_key = nil + person.serialized_public_key = user.encryption_key.public_key + person.save + end + end + end end diff --git a/lib/tasks/generate_session_secret.rake b/lib/tasks/generate_session_secret.rake index 90274dff3..c9fc129de 100644 --- a/lib/tasks/generate_session_secret.rake +++ b/lib/tasks/generate_session_secret.rake @@ -19,7 +19,6 @@ namespace :generate do Rails.application.config.secret_token = '#{secret}' EOF -puts "YAY!!" end end From 6eede48f9fd47ef316245b82f9f1da337f844397 Mon Sep 17 00:00:00 2001 From: ilya Date: Tue, 28 Sep 2010 12:39:33 -0700 Subject: [PATCH 02/15] started to refactor the salmon spec, changed data in to be parsed data to be more clear --- lib/diaspora/user/receiving.rb | 4 +- lib/salmon/salmon.rb | 4 +- spec/lib/salmon_salmon_spec.rb | 96 ++++++++++++++++++++-------------- 3 files changed, 60 insertions(+), 44 deletions(-) diff --git a/lib/diaspora/user/receiving.rb b/lib/diaspora/user/receiving.rb index 5d737d8e9..671db1a59 100644 --- a/lib/diaspora/user/receiving.rb +++ b/lib/diaspora/user/receiving.rb @@ -5,8 +5,8 @@ module Diaspora cleartext = decrypt( ciphertext) salmon = Salmon::SalmonSlap.parse cleartext if salmon.verified_for_key?(salmon.author.public_key) - Rails.logger.info("data in salmon: #{salmon.data}") - self.receive(salmon.data) + Rails.logger.info("data in salmon: #{salmon.parsed_data}") + self.receive(salmon.parsed_data) end end diff --git a/lib/salmon/salmon.rb b/lib/salmon/salmon.rb index 5d2857196..15e1c3e1e 100644 --- a/lib/salmon/salmon.rb +++ b/lib/salmon/salmon.rb @@ -41,7 +41,7 @@ end module Salmon class SalmonSlap - attr_accessor :magic_sig, :author, :author_email, :data, :data_type, :sig + attr_accessor :magic_sig, :author, :author_email, :parsed_data, :data_type, :sig def self.parse(xml) slap = self.new doc = Nokogiri::XML(xml) @@ -50,7 +50,7 @@ module Salmon slap.magic_sig = MagicSigEnvelope.parse sig_doc if 'base64url' == slap.magic_sig.encoding - slap.data = decode64url(slap.magic_sig.data) + slap.parsed_data = decode64url(slap.magic_sig.data) slap.sig = slap.magic_sig.sig else raise ArgumentError, "Magic Signature data must be encoded with base64url, was #{slap.magic_sig.encoding}" diff --git a/spec/lib/salmon_salmon_spec.rb b/spec/lib/salmon_salmon_spec.rb index 6d467d4ea..b75a90abd 100644 --- a/spec/lib/salmon_salmon_spec.rb +++ b/spec/lib/salmon_salmon_spec.rb @@ -5,52 +5,68 @@ require 'spec_helper' describe Salmon do - before do + let(:user){Factory.create :user} + let(:post){ user.post :status_message, :message => "hi", :to => user.aspect(:name => "sdg").id } - @user = Factory.create :user - @post = @user.post :status_message, :message => "hi", :to => @user.aspect(:name => "sdg").id - @sent_salmon = Salmon::SalmonSlap.create(@user, @post.to_diaspora_xml) - @parsed_salmon = Salmon::SalmonSlap.parse @sent_salmon.to_xml - stub_success("tom@tom.joindiaspora.com") - end + describe '#create' do + let!(:created_salmon) {Salmon::SalmonSlap.create(user, post.to_diaspora_xml)} - it 'should verify the signature on a roundtrip' do - - @sent_salmon.magic_sig.data.should == @parsed_salmon.magic_sig.data - - @sent_salmon.magic_sig.sig.should == @parsed_salmon.magic_sig.sig - @sent_salmon.magic_sig.signable_string.should == @parsed_salmon.magic_sig.signable_string - - @parsed_salmon.verified_for_key?(OpenSSL::PKey::RSA.new(@user.exported_key)).should be true - @sent_salmon.verified_for_key?(OpenSSL::PKey::RSA.new(@user.exported_key)).should be true - end - - it 'should return the data so it can be "received"' do - - xml = @post.to_diaspora_xml - - @parsed_salmon.data.should == xml - end - - it 'should parse out the authors diaspora_handle' do - @parsed_salmon.author_email.should == @user.person.diaspora_handle + it 'has data in the magic envelope' do + created_salmon.magic_sig.data.should_not be nil + end + + it 'has no parsed_data' do + created_salmon.parsed_data.should be nil + end end - it 'should reference a local author' do - @parsed_salmon.author.should == @user.person - end + context 'round trip' do + before do + @sent_salmon = Salmon::SalmonSlap.create(user, post.to_diaspora_xml) + @parsed_salmon = Salmon::SalmonSlap.parse @sent_salmon.to_xml + stub_success("tom@tom.joindiaspora.com") + end - it 'should reference a remote author' do - @parsed_salmon.author_email = 'tom@tom.joindiaspora.com' - @parsed_salmon.author.public_key.should_not be_nil - end - it 'should fail to reference a nonexistent remote author' do - @parsed_salmon.author_email = 'idsfug@difgubhpsduh.rgd' - proc { - Redfinger.stub(:finger).and_return(nil) #Redfinger returns nil when there is no profile - @parsed_salmon.author.real_name}.should raise_error /No webfinger profile found/ - end + it 'should verify the signature on a roundtrip' do + @sent_salmon.magic_sig.data.should == @parsed_salmon.magic_sig.data + + @sent_salmon.magic_sig.sig.should == @parsed_salmon.magic_sig.sig + @sent_salmon.magic_sig.signable_string.should == @parsed_salmon.magic_sig.signable_string + + @parsed_salmon.verified_for_key?(OpenSSL::PKey::RSA.new(user.exported_key)).should be true + @sent_salmon.verified_for_key?(OpenSSL::PKey::RSA.new(user.exported_key)).should be true + end + + it 'should return the data so it can be "received"' do + + xml = post.to_diaspora_xml + + @parsed_salmon.parsed_data.should == xml + end + + it 'should parse out the authors diaspora_handle' do + @parsed_salmon.author_email.should == user.person.diaspora_handle + + end + + it 'should reference a local author' do + @parsed_salmon.author.should == user.person + end + + it 'should reference a remote author' do + @parsed_salmon.author_email = 'tom@tom.joindiaspora.com' + @parsed_salmon.author.public_key.should_not be_nil + end + + it 'should fail to reference a nonexistent remote author' do + @parsed_salmon.author_email = 'idsfug@difgubhpsduh.rgd' + proc { + Redfinger.stub(:finger).and_return(nil) #Redfinger returns nil when there is no profile + @parsed_salmon.author.real_name}.should raise_error /No webfinger profile found/ + end + + end end From c7d29b29c84eb0502cbc85b5245e38304ab79930 Mon Sep 17 00:00:00 2001 From: ilya Date: Tue, 28 Sep 2010 13:22:19 -0700 Subject: [PATCH 03/15] the salmon now encrypts the activity, and stores the aes key in the header --- lib/salmon/salmon.rb | 21 +++++++++++++-------- spec/lib/salmon_salmon_spec.rb | 10 ++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/salmon/salmon.rb b/lib/salmon/salmon.rb index 15e1c3e1e..82893a59d 100644 --- a/lib/salmon/salmon.rb +++ b/lib/salmon/salmon.rb @@ -41,7 +41,19 @@ end module Salmon class SalmonSlap - attr_accessor :magic_sig, :author, :author_email, :parsed_data, :data_type, :sig + attr_accessor :magic_sig, :author, :author_email, :aes_key, :iv, :parsed_data, + :data_type, :sig + + def self.create(user, activity) + salmon = self.new + salmon.author = user.person + aes_key_hash = user.person.gen_aes_key + salmon.aes_key = aes_key_hash['key'] + salmon.iv = aes_key_hash['iv'] + salmon.magic_sig = MagicSigEnvelope.create(user , user.person.aes_encrypt(activity, aes_key_hash)) + salmon + end + def self.parse(xml) slap = self.new doc = Nokogiri::XML(xml) @@ -65,13 +77,6 @@ module Salmon slap end - def self.create(user, activity) - salmon = self.new - salmon.author = user.person - salmon.magic_sig = MagicSigEnvelope.create(user , activity) - salmon - end - def to_xml xml =< diff --git a/spec/lib/salmon_salmon_spec.rb b/spec/lib/salmon_salmon_spec.rb index b75a90abd..ef24b5037 100644 --- a/spec/lib/salmon_salmon_spec.rb +++ b/spec/lib/salmon_salmon_spec.rb @@ -18,7 +18,17 @@ describe Salmon do it 'has no parsed_data' do created_salmon.parsed_data.should be nil end + + it 'sets aes and iv key' do + created_salmon.aes_key.should_not be nil + created_salmon.iv.should_not be nil + end + it 'should make the data in the signature encrypted with that key' do + key_hash = {'key' => created_salmon.aes_key, 'iv' => created_salmon.iv} + decoded_string = Salmon::SalmonSlap.decode64url(created_salmon.magic_sig.data) + user.aes_decrypt(decoded_string, key_hash).to_s.should == post.to_diaspora_xml.to_s + end end context 'round trip' do From 46bf0cfd99e0504122e3caeb9065848119870b4b Mon Sep 17 00:00:00 2001 From: ilya Date: Tue, 28 Sep 2010 15:11:01 -0700 Subject: [PATCH 04/15] roundtrip done, just need to clean and move to the new api --- lib/salmon/salmon.rb | 43 ++++++++++++++++++++++++++++++++-- spec/lib/salmon_salmon_spec.rb | 42 +++++++++++++++++++++++++++++---- 2 files changed, 79 insertions(+), 6 deletions(-) diff --git a/lib/salmon/salmon.rb b/lib/salmon/salmon.rb index 82893a59d..bd2c0b1b9 100644 --- a/lib/salmon/salmon.rb +++ b/lib/salmon/salmon.rb @@ -54,15 +54,26 @@ module Salmon salmon end - def self.parse(xml) + def self.parse(xml, user) slap = self.new doc = Nokogiri::XML(xml) sig_doc = doc.search('entry') + + ### Header ## + decrypted_header = user.decrypt(doc.search('encrypted_header').text) + puts decrypted_header + header_doc = Nokogiri::XML(decrypted_header) + puts header_doc.inspect + slap.aes_key = header_doc.search('aes_key').text + slap.iv = header_doc.search('iv').text + slap.magic_sig = MagicSigEnvelope.parse sig_doc if 'base64url' == slap.magic_sig.encoding - slap.parsed_data = decode64url(slap.magic_sig.data) + + key_hash = {'key' => slap.aes_key, 'iv' => slap.iv} + slap.parsed_data = user.aes_decrypt(decode64url(slap.magic_sig.data), key_hash) slap.sig = slap.magic_sig.sig else raise ArgumentError, "Magic Signature data must be encoded with base64url, was #{slap.magic_sig.encoding}" @@ -91,6 +102,34 @@ ENTRY end + def xml_for person + xml =< + + #{person.encrypt(decrypted_header.rstrip)} + + #{@author.real_name} + acct:#{@author.diaspora_handle} + + #{@magic_sig.to_xml} + +ENTRY + + end + + def decrypted_header + header =<
+ #{iv} + #{aes_key} + + #{@author.real_name} + acct:#{@author.diaspora_handle} + +
+HEADER + end + def author if @author @author diff --git a/spec/lib/salmon_salmon_spec.rb b/spec/lib/salmon_salmon_spec.rb index ef24b5037..3ea98afe0 100644 --- a/spec/lib/salmon_salmon_spec.rb +++ b/spec/lib/salmon_salmon_spec.rb @@ -6,10 +6,12 @@ require 'spec_helper' describe Salmon do let(:user){Factory.create :user} + let(:user2) {Factory.create :user} let(:post){ user.post :status_message, :message => "hi", :to => user.aspect(:name => "sdg").id } + let!(:created_salmon) {Salmon::SalmonSlap.create(user, post.to_diaspora_xml)} + describe '#create' do - let!(:created_salmon) {Salmon::SalmonSlap.create(user, post.to_diaspora_xml)} it 'has data in the magic envelope' do created_salmon.magic_sig.data.should_not be nil @@ -24,17 +26,49 @@ describe Salmon do created_salmon.iv.should_not be nil end - it 'should make the data in the signature encrypted with that key' do + it 'makes the data in the signature encrypted with that key' do key_hash = {'key' => created_salmon.aes_key, 'iv' => created_salmon.iv} decoded_string = Salmon::SalmonSlap.decode64url(created_salmon.magic_sig.data) - user.aes_decrypt(decoded_string, key_hash).to_s.should == post.to_diaspora_xml.to_s + user.aes_decrypt(decoded_string, key_hash).should == post.to_diaspora_xml end end + + describe '#xml_for' do + let(:xml) {created_salmon.xml_for user2.person} + + it 'has a encrypted header field' do + xml.include?("encrypted_header").should be true + end + + it 'the encrypted_header field should contain the aes key' do + doc = Nokogiri::XML(xml) + decrypted_header = user2.decrypt(doc.search('encrypted_header').text) + decrypted_header.include?(created_salmon.aes_key).should be true + end + end + + context 'marshaling' do + let(:xml) {created_salmon.xml_for user2.person} + let(:parsed_salmon) { Salmon::SalmonSlap.parse(xml, user2)} + + it 'should parse out the aes key' do + parsed_salmon.aes_key.should == created_salmon.aes_key + end + + it 'should parse out the iv' do + parsed_salmon.iv.should == created_salmon.iv + end + + it 'contains the original data' do + parsed_salmon.parsed_data.should == post.to_diaspora_xml + end + + end context 'round trip' do before do @sent_salmon = Salmon::SalmonSlap.create(user, post.to_diaspora_xml) - @parsed_salmon = Salmon::SalmonSlap.parse @sent_salmon.to_xml + @parsed_salmon = stub_success("tom@tom.joindiaspora.com") end From e9521d71441801dca530b6fc88dfedc028f6d806 Mon Sep 17 00:00:00 2001 From: ilya Date: Wed, 29 Sep 2010 12:15:54 -0700 Subject: [PATCH 05/15] tiny commit to switch branches --- spec/lib/salmon_salmon_spec.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spec/lib/salmon_salmon_spec.rb b/spec/lib/salmon_salmon_spec.rb index 3ea98afe0..116e0719d 100644 --- a/spec/lib/salmon_salmon_spec.rb +++ b/spec/lib/salmon_salmon_spec.rb @@ -7,6 +7,7 @@ require 'spec_helper' describe Salmon do let(:user){Factory.create :user} let(:user2) {Factory.create :user} + let(:user3) {Factory.create :user} let(:post){ user.post :status_message, :message => "hi", :to => user.aspect(:name => "sdg").id } let!(:created_salmon) {Salmon::SalmonSlap.create(user, post.to_diaspora_xml)} @@ -58,6 +59,10 @@ describe Salmon do it 'should parse out the iv' do parsed_salmon.iv.should == created_salmon.iv end + it 'should parse out the authors diaspora_handle' do + parsed_salmon.author_email.should == user.person.diaspora_handle + + end it 'contains the original data' do parsed_salmon.parsed_data.should == post.to_diaspora_xml @@ -91,10 +96,7 @@ describe Salmon do @parsed_salmon.parsed_data.should == xml end - it 'should parse out the authors diaspora_handle' do - @parsed_salmon.author_email.should == user.person.diaspora_handle - end it 'should reference a local author' do @parsed_salmon.author.should == user.person From b6a912dd02b827da26c2ae493b448328628396d0 Mon Sep 17 00:00:00 2001 From: ilya Date: Thu, 30 Sep 2010 15:17:53 -0700 Subject: [PATCH 06/15] slowly getting specs to pass on with the new api --- app/models/user.rb | 11 +++-- lib/diaspora/user/friending.rb | 4 +- lib/diaspora/user/receiving.rb | 2 +- lib/salmon/salmon.rb | 20 +-------- spec/lib/salmon_salmon_spec.rb | 69 ++++++++++++-------------------- spec/models/user/receive_spec.rb | 5 ++- 6 files changed, 39 insertions(+), 72 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index ca248a8f2..0e19eb6af 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -170,8 +170,9 @@ class User end def push_to_people(post, people) + salmon = salmon(post) people.each{|person| - salmon(post, :to => person) + push_to_person( person, salmon.xml_for( person )) } end @@ -182,10 +183,8 @@ class User end - def salmon( post, opts = {} ) - salmon = Salmon::SalmonSlap.create(self, post.to_diaspora_xml) - push_to_person( opts[:to], salmon.to_xml) - salmon + def salmon( post ) + Salmon::SalmonSlap.create(self, post.to_diaspora_xml) end ######## Commenting ######## @@ -217,7 +216,7 @@ class User push_to_people comment, people_in_aspects(aspects_with_post(comment.post.id)) elsif owns? comment comment.save - salmon comment, :to => comment.post.person + push_to_people comment, [comment.post.person] end end diff --git a/lib/diaspora/user/friending.rb b/lib/diaspora/user/friending.rb index 0f6cc6c5c..36850c745 100644 --- a/lib/diaspora/user/friending.rb +++ b/lib/diaspora/user/friending.rb @@ -22,7 +22,7 @@ module Diaspora aspect.requests << request aspect.save - salmon request, :to => desired_friend + push_to_people request, [desired_friend] end request end @@ -80,7 +80,7 @@ module Diaspora def unfriend(bad_friend) Rails.logger.info("#{self.real_name} is unfriending #{bad_friend.inspect}") retraction = Retraction.for(self) - salmon( retraction, :to => bad_friend) + push_to_people retraction, [bad_friend] remove_friend(bad_friend) end diff --git a/lib/diaspora/user/receiving.rb b/lib/diaspora/user/receiving.rb index 671db1a59..fe6b7d8c8 100644 --- a/lib/diaspora/user/receiving.rb +++ b/lib/diaspora/user/receiving.rb @@ -3,7 +3,7 @@ module Diaspora module Receiving def receive_salmon ciphertext cleartext = decrypt( ciphertext) - salmon = Salmon::SalmonSlap.parse cleartext + salmon = Salmon::SalmonSlap.parse cleartext, self if salmon.verified_for_key?(salmon.author.public_key) Rails.logger.info("data in salmon: #{salmon.parsed_data}") self.receive(salmon.parsed_data) diff --git a/lib/salmon/salmon.rb b/lib/salmon/salmon.rb index bd2c0b1b9..5ce1156be 100644 --- a/lib/salmon/salmon.rb +++ b/lib/salmon/salmon.rb @@ -62,9 +62,7 @@ module Salmon ### Header ## decrypted_header = user.decrypt(doc.search('encrypted_header').text) - puts decrypted_header header_doc = Nokogiri::XML(decrypted_header) - puts header_doc.inspect slap.aes_key = header_doc.search('aes_key').text slap.iv = header_doc.search('iv').text @@ -88,20 +86,6 @@ module Salmon slap end - def to_xml - xml =< - - - #{@author.real_name} - acct:#{@author.diaspora_handle} - - #{@magic_sig.to_xml} - -ENTRY - - end - def xml_for person xml =< @@ -119,14 +103,14 @@ ENTRY def decrypted_header header =<
+ #{iv} #{aes_key} #{@author.real_name} acct:#{@author.diaspora_handle} -
+ HEADER end diff --git a/spec/lib/salmon_salmon_spec.rb b/spec/lib/salmon_salmon_spec.rb index 116e0719d..e10ad5b48 100644 --- a/spec/lib/salmon_salmon_spec.rb +++ b/spec/lib/salmon_salmon_spec.rb @@ -64,55 +64,38 @@ describe Salmon do end + describe '#author' do + before do + stub_success("tom@tom.joindiaspora.com") + end + + it 'should reference a local author' do + parsed_salmon.author.should == user.person + end + + it 'should reference a remote author' do + parsed_salmon.author_email = 'tom@tom.joindiaspora.com' + parsed_salmon.author.public_key.should_not be_nil + end + + it 'should fail to reference a nonexistent remote author' do + parsed_salmon.author_email = 'idsfug@difgubhpsduh.rgd' + proc { + Redfinger.stub(:finger).and_return(nil) #Redfinger returns nil when there is no profile + parsed_salmon.author.real_name}.should raise_error /No webfinger profile found/ + end + end + + it 'verifies the signature for the sender' do + parsed_salmon.verified_for_key?(user.public_key).should be true + end + it 'contains the original data' do parsed_salmon.parsed_data.should == post.to_diaspora_xml end end - context 'round trip' do - before do - @sent_salmon = Salmon::SalmonSlap.create(user, post.to_diaspora_xml) - @parsed_salmon = - stub_success("tom@tom.joindiaspora.com") - end - it 'should verify the signature on a roundtrip' do - - @sent_salmon.magic_sig.data.should == @parsed_salmon.magic_sig.data - - @sent_salmon.magic_sig.sig.should == @parsed_salmon.magic_sig.sig - @sent_salmon.magic_sig.signable_string.should == @parsed_salmon.magic_sig.signable_string - - @parsed_salmon.verified_for_key?(OpenSSL::PKey::RSA.new(user.exported_key)).should be true - @sent_salmon.verified_for_key?(OpenSSL::PKey::RSA.new(user.exported_key)).should be true - end - - it 'should return the data so it can be "received"' do - - xml = post.to_diaspora_xml - - @parsed_salmon.parsed_data.should == xml - end - - - - it 'should reference a local author' do - @parsed_salmon.author.should == user.person - end - - it 'should reference a remote author' do - @parsed_salmon.author_email = 'tom@tom.joindiaspora.com' - @parsed_salmon.author.public_key.should_not be_nil - end - - it 'should fail to reference a nonexistent remote author' do - @parsed_salmon.author_email = 'idsfug@difgubhpsduh.rgd' - proc { - Redfinger.stub(:finger).and_return(nil) #Redfinger returns nil when there is no profile - @parsed_salmon.author.real_name}.should raise_error /No webfinger profile found/ - end - - end end diff --git a/spec/models/user/receive_spec.rb b/spec/models/user/receive_spec.rb index 5bdddce67..f11de234f 100644 --- a/spec/models/user/receive_spec.rb +++ b/spec/models/user/receive_spec.rb @@ -173,11 +173,12 @@ describe User do describe 'salmon' do before do @post = @user.post :status_message, :message => "hello", :to => @aspect.id - @salmon = @user.salmon( @post, :to => @user2.person ) + @salmon = @user.salmon( @post ) end it 'should receive a salmon for a post' do - @user2.receive_salmon( @user2.person.encrypt(@salmon.to_xml) ) + puts @salmon.inspect + @user2.receive_salmon( @salmon.xml_for @user2.person ) @user2.visible_post_ids.include?(@post.id).should be true end end From 7dcde292e1da7b36b9b973b06d2f0723fbc221e0 Mon Sep 17 00:00:00 2001 From: ilya Date: Sat, 2 Oct 2010 12:34:16 -0700 Subject: [PATCH 07/15] user posting spec is now green, now stubbing on the apropriate method --- app/models/user.rb | 12 ++++++++++-- spec/models/user/posting_spec.rb | 6 +++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 0e19eb6af..a70594adc 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -166,13 +166,18 @@ class User aspect.save target_people = target_people | aspect.people } + push_to_people(post, target_people) end def push_to_people(post, people) + puts post.inspect + puts post.to_diaspora_xml + puts "Leaving push_to_people" salmon = salmon(post) people.each{|person| - push_to_person( person, salmon.xml_for( person )) + xml = salmon.xml_for person + push_to_person( person, xml) } end @@ -184,7 +189,10 @@ class User end def salmon( post ) - Salmon::SalmonSlap.create(self, post.to_diaspora_xml) + puts post.inspect + puts post.to_diaspora_xml + created_salmon = Salmon::SalmonSlap.create(self, post.to_diaspora_xml) + created_salmon end ######## Commenting ######## diff --git a/spec/models/user/posting_spec.rb b/spec/models/user/posting_spec.rb index d86433ad6..518c03d2d 100644 --- a/spec/models/user/posting_spec.rb +++ b/spec/models/user/posting_spec.rb @@ -71,19 +71,19 @@ describe User do describe '#push_to_aspects' do it 'should push a post to a aspect' do - user.should_receive(:salmon).twice + user.should_receive(:push_to_person).twice user.push_to_aspects(post, aspect.id) end it 'should push a post to all aspects' do - user.should_receive(:salmon).exactly(3).times + user.should_receive(:push_to_person).exactly(3).times user.push_to_aspects(post, :all) end end describe '#push_to_people' do it 'should push to people' do - user.should_receive(:salmon).twice + user.should_receive(:push_to_person).twice user.push_to_people(post, [user2.person, user3.person]) end end From 304e4ad32be9f765aa04c86d26e44be82cc6053d Mon Sep 17 00:00:00 2001 From: ilya Date: Sat, 2 Oct 2010 12:37:53 -0700 Subject: [PATCH 08/15] removed the puts --- app/models/user.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index a70594adc..1ec3c63e5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -171,9 +171,6 @@ class User end def push_to_people(post, people) - puts post.inspect - puts post.to_diaspora_xml - puts "Leaving push_to_people" salmon = salmon(post) people.each{|person| xml = salmon.xml_for person @@ -189,8 +186,6 @@ class User end def salmon( post ) - puts post.inspect - puts post.to_diaspora_xml created_salmon = Salmon::SalmonSlap.create(self, post.to_diaspora_xml) created_salmon end From f9cecd9d895690431b2bfc988996b2fdb146ada6 Mon Sep 17 00:00:00 2001 From: ilya Date: Sat, 2 Oct 2010 13:03:11 -0700 Subject: [PATCH 09/15] specs are green --- lib/diaspora/user/receiving.rb | 5 ++-- spec/controllers/publics_controller_spec.rb | 33 +++++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/diaspora/user/receiving.rb b/lib/diaspora/user/receiving.rb index fe6b7d8c8..a16727c26 100644 --- a/lib/diaspora/user/receiving.rb +++ b/lib/diaspora/user/receiving.rb @@ -1,9 +1,8 @@ module Diaspora module UserModules module Receiving - def receive_salmon ciphertext - cleartext = decrypt( ciphertext) - salmon = Salmon::SalmonSlap.parse cleartext, self + def receive_salmon salmon_xml + salmon = Salmon::SalmonSlap.parse salmon_xml, self if salmon.verified_for_key?(salmon.author.public_key) Rails.logger.info("data in salmon: #{salmon.parsed_data}") self.receive(salmon.parsed_data) diff --git a/spec/controllers/publics_controller_spec.rb b/spec/controllers/publics_controller_spec.rb index 70d851a3e..83042ea55 100644 --- a/spec/controllers/publics_controller_spec.rb +++ b/spec/controllers/publics_controller_spec.rb @@ -5,16 +5,16 @@ require 'spec_helper' describe PublicsController do - render_views + render_views + let(:user) {Factory.create :user} before do - @user = Factory.create(:user) - sign_in :user, @user + sign_in :user, user 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.person.id + post :receive, :id =>user.person.id response.code.should == '200' end @@ -22,14 +22,15 @@ describe PublicsController do user2 = Factory.create(:user) message = user2.build_post(:status_message, :message => "hi") - @user.reload - @user.visible_post_ids.include?(message.id).should be false - xml = @user.person.encrypt(user2.salmon(message, :to => @user.person).to_xml) + user.reload + user.visible_post_ids.include?(message.id).should be false + + xml = user2.salmon(message).xml_for(user.person) - post :receive, :id => @user.person.id, :xml => xml + post :receive, :id => user.person.id, :xml => xml - @user.reload - @user.visible_post_ids.include?(message.id).should be true + user.reload + user.visible_post_ids.include?(message.id).should be true end end @@ -47,9 +48,9 @@ describe PublicsController do @user3 = Factory.create(:user) - req = @user2.send_friend_request_to(@user.person, aspect) + req = @user2.send_friend_request_to(user.person, aspect) - @xml = @user.person.encrypt(@user2.salmon(req, :to => @user.person).to_xml) + @xml = @user2.salmon(req).xml_for(user.person) req.delete @user2.reload @@ -58,18 +59,18 @@ describe PublicsController do it 'should add the pending request to the right user if the target person exists locally' do @user2.delete - post :receive, :id => @user.person.id, :xml => @xml + post :receive, :id => user.person.id, :xml => @xml - assigns(:user).should eq(@user) + assigns(:user).should eq(user) end it 'should add the pending request to the right user if the target person does not exist locally' do Person.should_receive(:by_webfinger).with(@user2.person.diaspora_handle).and_return(@user2.person) @user2.person.delete @user2.delete - post :receive, :id => @user.person.id, :xml => @xml + post :receive, :id => user.person.id, :xml => @xml - assigns(:user).should eq(@user) + assigns(:user).should eq(user) end end end From 7b690f5dcbd0984a900de370aa5b2e52fdc515e0 Mon Sep 17 00:00:00 2001 From: ilya Date: Sat, 2 Oct 2010 13:20:23 -0700 Subject: [PATCH 10/15] slight publics controller spec refactor --- spec/controllers/publics_controller_spec.rb | 30 +++++++++------------ spec/models/user/receive_spec.rb | 1 - 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/spec/controllers/publics_controller_spec.rb b/spec/controllers/publics_controller_spec.rb index 83042ea55..d8d700bd8 100644 --- a/spec/controllers/publics_controller_spec.rb +++ b/spec/controllers/publics_controller_spec.rb @@ -7,6 +7,7 @@ require 'spec_helper' describe PublicsController do render_views let(:user) {Factory.create :user} + let(:user2){Factory.create :user} before do sign_in :user, user @@ -19,7 +20,6 @@ describe PublicsController do end it 'should accept a post from another node and save the information' do - user2 = Factory.create(:user) message = user2.build_post(:status_message, :message => "hi") user.reload @@ -42,33 +42,27 @@ describe PublicsController do end describe 'friend requests' do + let(:aspect2) {user2.aspect(:name => 'disciples')} + let!(:req) {user2.send_friend_request_to(user.person, aspect2)} + let!(:xml) {user2.salmon(req).xml_for(user.person)} before do - @user2 = Factory.create(:user) - aspect = @user2.aspect(:name => 'disciples') - - @user3 = Factory.create(:user) - - req = @user2.send_friend_request_to(user.person, aspect) - - @xml = @user2.salmon(req).xml_for(user.person) - req.delete - @user2.reload - @user2.pending_requests.count.should be 1 + user2.reload + user2.pending_requests.count.should be 1 end it 'should add the pending request to the right user if the target person exists locally' do - @user2.delete - post :receive, :id => user.person.id, :xml => @xml + user2.delete + post :receive, :id => user.person.id, :xml => xml assigns(:user).should eq(user) end it 'should add the pending request to the right user if the target person does not exist locally' do - Person.should_receive(:by_webfinger).with(@user2.person.diaspora_handle).and_return(@user2.person) - @user2.person.delete - @user2.delete - post :receive, :id => user.person.id, :xml => @xml + Person.should_receive(:by_webfinger).with(user2.person.diaspora_handle).and_return(user2.person) + user2.person.delete + user2.delete + post :receive, :id => user.person.id, :xml => xml assigns(:user).should eq(user) end diff --git a/spec/models/user/receive_spec.rb b/spec/models/user/receive_spec.rb index f11de234f..fce699cf6 100644 --- a/spec/models/user/receive_spec.rb +++ b/spec/models/user/receive_spec.rb @@ -177,7 +177,6 @@ describe User do end it 'should receive a salmon for a post' do - puts @salmon.inspect @user2.receive_salmon( @salmon.xml_for @user2.person ) @user2.visible_post_ids.include?(@post.id).should be true end From 88dafbf5cc97c1d994495b7030d5eef848f5fee6 Mon Sep 17 00:00:00 2001 From: ilya Date: Sat, 2 Oct 2010 13:29:36 -0700 Subject: [PATCH 11/15] changed deploy branch --- config/deploy_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/deploy_config.yml b/config/deploy_config.yml index 6aacbf3ff..38e504a03 100644 --- a/config/deploy_config.yml +++ b/config/deploy_config.yml @@ -6,7 +6,7 @@ cross_server: deploy_to: '/usr/local/app/diaspora' user: 'root' repo: 'git://github.com/diaspora/diaspora.git' - branch: 'master' + branch: 'salmon_refactor' default_env: 'development' servers: tom: From dadacbd0925703404fcd70e93df56bc8a4fee6fb Mon Sep 17 00:00:00 2001 From: ilya Date: Sun, 3 Oct 2010 13:33:01 -0700 Subject: [PATCH 12/15] removed whitespace striping --- lib/salmon/salmon.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/salmon/salmon.rb b/lib/salmon/salmon.rb index 5ce1156be..9ed5567c5 100644 --- a/lib/salmon/salmon.rb +++ b/lib/salmon/salmon.rb @@ -90,7 +90,7 @@ module Salmon xml =< - #{person.encrypt(decrypted_header.rstrip)} + #{person.encrypt(decrypted_header)} #{@author.real_name} acct:#{@author.diaspora_handle} From 3eaf4e0ba1658d61c54a0f646650f3c649cbbe75 Mon Sep 17 00:00:00 2001 From: ilya Date: Sun, 3 Oct 2010 17:33:31 -0700 Subject: [PATCH 13/15] a couple of logger lines to help debug on remote --- lib/diaspora/user/receiving.rb | 1 + lib/encryptor.rb | 1 + lib/salmon/salmon.rb | 6 +++--- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/diaspora/user/receiving.rb b/lib/diaspora/user/receiving.rb index a16727c26..cf4015eeb 100644 --- a/lib/diaspora/user/receiving.rb +++ b/lib/diaspora/user/receiving.rb @@ -2,6 +2,7 @@ module Diaspora module UserModules module Receiving def receive_salmon salmon_xml + Rails.logger.info("#{self.real_name} got a salmon #{salmon_xml}") salmon = Salmon::SalmonSlap.parse salmon_xml, self if salmon.verified_for_key?(salmon.author.public_key) Rails.logger.info("data in salmon: #{salmon.parsed_data}") diff --git a/lib/encryptor.rb b/lib/encryptor.rb index e9c4936e1..232b10e0f 100644 --- a/lib/encryptor.rb +++ b/lib/encryptor.rb @@ -37,6 +37,7 @@ module Encryptor module Private def decrypt cipher_json + Rails.logger.info("#{self.real_name} is JSON parsing the #{ Base64.decode64 cipher_json} ") json = JSON.parse(Base64.decode64 cipher_json) aes_key = get_aes_key json['aes_key'] aes_decrypt(json['ciphertext'], aes_key) diff --git a/lib/salmon/salmon.rb b/lib/salmon/salmon.rb index 9ed5567c5..4258a8d88 100644 --- a/lib/salmon/salmon.rb +++ b/lib/salmon/salmon.rb @@ -62,9 +62,9 @@ module Salmon ### Header ## decrypted_header = user.decrypt(doc.search('encrypted_header').text) - header_doc = Nokogiri::XML(decrypted_header) - slap.aes_key = header_doc.search('aes_key').text - slap.iv = header_doc.search('iv').text + header_doc = Nokogiri::XML(decrypted_header) + slap.aes_key = header_doc.search('aes_key').text + slap.iv = header_doc.search('iv').text slap.magic_sig = MagicSigEnvelope.parse sig_doc From ce4f8cab8b6ea8298c133b83e1c4fb3db62749ec Mon Sep 17 00:00:00 2001 From: ilya Date: Sun, 3 Oct 2010 17:39:16 -0700 Subject: [PATCH 14/15] not encrypting the entire thing --- app/models/user.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 1ec3c63e5..2f63f4b5f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -180,7 +180,7 @@ class User def push_to_person( person, xml ) Rails.logger.debug("Adding xml for #{self} to message queue to #{url}") - QUEUE.add_post_request( person.receive_url, person.encrypt(xml) ) + QUEUE.add_post_request( person.receive_url, xml ) QUEUE.process end From 0d2d5b65fb8df68fe18c0e1ee2f63fe37304cc48 Mon Sep 17 00:00:00 2001 From: ilya Date: Sun, 3 Oct 2010 18:08:18 -0700 Subject: [PATCH 15/15] removed the logging statements, now servers communicate sucessfully and only re-encrypt the header for people --- lib/diaspora/user/receiving.rb | 1 - lib/encryptor.rb | 1 - 2 files changed, 2 deletions(-) diff --git a/lib/diaspora/user/receiving.rb b/lib/diaspora/user/receiving.rb index cf4015eeb..a16727c26 100644 --- a/lib/diaspora/user/receiving.rb +++ b/lib/diaspora/user/receiving.rb @@ -2,7 +2,6 @@ module Diaspora module UserModules module Receiving def receive_salmon salmon_xml - Rails.logger.info("#{self.real_name} got a salmon #{salmon_xml}") salmon = Salmon::SalmonSlap.parse salmon_xml, self if salmon.verified_for_key?(salmon.author.public_key) Rails.logger.info("data in salmon: #{salmon.parsed_data}") diff --git a/lib/encryptor.rb b/lib/encryptor.rb index 232b10e0f..e9c4936e1 100644 --- a/lib/encryptor.rb +++ b/lib/encryptor.rb @@ -37,7 +37,6 @@ module Encryptor module Private def decrypt cipher_json - Rails.logger.info("#{self.real_name} is JSON parsing the #{ Base64.decode64 cipher_json} ") json = JSON.parse(Base64.decode64 cipher_json) aes_key = get_aes_key json['aes_key'] aes_decrypt(json['ciphertext'], aes_key)