diff --git a/app/models/job/http_multi.rb b/app/models/job/http_multi.rb index 40068c966..3b7b749da 100644 --- a/app/models/job/http_multi.rb +++ b/app/models/job/http_multi.rb @@ -19,7 +19,7 @@ module Job people = Person.where(:id => person_ids) - salmon = Salmon::EncryptedSalmonSlap.create(user, Base64.decode64(enc_object_xml)) + salmon = Salmon::EncryptedSlap.create(user, Base64.decode64(enc_object_xml)) failed_request_people = [] diff --git a/app/models/user.rb b/app/models/user.rb index 31731d743..fb7342248 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -215,7 +215,7 @@ class User < ActiveRecord::Base end def salmon(post) - Salmon::EncryptedSalmonSlap.create(self, post.to_diaspora_xml) + Salmon::EncryptedSlap.create(self, post.to_diaspora_xml) end def build_relayable(model, options = {}) diff --git a/lib/postzord/dispatch.rb b/lib/postzord/dispatch.rb index 81c61e35c..3b12e207a 100644 --- a/lib/postzord/dispatch.rb +++ b/lib/postzord/dispatch.rb @@ -18,7 +18,7 @@ class Postzord::Dispatch end def salmon - @salmon_factory ||= Salmon::EncryptedSalmonSlap.create(@sender, @xml) + @salmon_factory ||= Salmon::EncryptedSlap.create(@sender, @xml) end def post(opts = {}) diff --git a/lib/postzord/receiver.rb b/lib/postzord/receiver.rb index 4a49647ad..f39efd410 100644 --- a/lib/postzord/receiver.rb +++ b/lib/postzord/receiver.rb @@ -45,7 +45,7 @@ module Postzord protected def salmon - @salmon ||= Salmon::EncryptedSalmonSlap.parse(@salmon_xml, @user) + @salmon ||= Salmon::EncryptedSlap.parse(@salmon_xml, @user) end def xml_author diff --git a/lib/salmon/encrypted_salmon_slap.rb b/lib/salmon/encrypted_slap.rb similarity index 78% rename from lib/salmon/encrypted_salmon_slap.rb rename to lib/salmon/encrypted_slap.rb index d40a5c390..cf75e4e6f 100644 --- a/lib/salmon/encrypted_salmon_slap.rb +++ b/lib/salmon/encrypted_slap.rb @@ -3,7 +3,7 @@ # the COPYRIGHT file. module Salmon - class EncryptedSalmonSlap < SalmonSlap + class EncryptedSlap < Slap def header(person) < @@ -21,5 +21,10 @@ XML header = user.decrypt(doc.search('encrypted_header').text) Nokogiri::XML(header) end + + # @return [String] + def self.payload(activity, user, aes_key_hash) + user.person.aes_encrypt(activity, aes_key_hash) + end end end diff --git a/lib/salmon/magic_sig_envelope.rb b/lib/salmon/magic_sig_envelope.rb index cd7b9c34f..c60802ddc 100644 --- a/lib/salmon/magic_sig_envelope.rb +++ b/lib/salmon/magic_sig_envelope.rb @@ -16,13 +16,14 @@ module Salmon env.data = doc.search('//me:env/me:data', ns).text env.alg = doc.search('//me:env/me:alg', ns).text.strip - env.sig = doc.search('//me:env/me:sig', ns).text - env.data_type = doc.search('//me:env/me:data', ns).first['type'].strip unless 'RSA-SHA256' == env.alg raise ArgumentError, "Magic Signature data must be signed with RSA-SHA256, was #{env.alg}" end + env.sig = doc.search('//me:env/me:sig', ns).text + env.data_type = doc.search('//me:env/me:data', ns).first['type'].strip + env end @@ -34,6 +35,7 @@ module Salmon env.encoding = env.get_encoding env.alg = env.get_alg + #TODO: WHY DO WE DOUBLE ENCODE env.sig = Base64.urlsafe_encode64( user.encryption_key.sign OpenSSL::Digest::SHA256.new, env.signable_string ) diff --git a/lib/salmon/salmon.rb b/lib/salmon/salmon.rb index 0099fe0b4..1affeb986 100644 --- a/lib/salmon/salmon.rb +++ b/lib/salmon/salmon.rb @@ -39,7 +39,7 @@ end # Verify documents secured with Magic Signatures module Salmon - autoload :SalmonSlap, File.join(Rails.root, "lib", "salmon", "salmon_slap") - autoload :EncryptedSalmonSlap, File.join(Rails.root, "lib", "salmon", "encrypted_salmon_slap") - autoload :MagicSigEnvelope, File.join(Rails.root, "lib", "salmon", "magic_sig_envelope") + autoload :Slap, File.join(Rails.root, "lib", "salmon", "slap") + autoload :EncryptedSlap, File.join(Rails.root, "lib", "salmon", "encrypted_slap") + autoload :MagicSigEnvelope, File.join(Rails.root, "lib", "salmon", "magic_sig_envelope") end diff --git a/lib/salmon/salmon_slap.rb b/lib/salmon/slap.rb similarity index 90% rename from lib/salmon/salmon_slap.rb rename to lib/salmon/slap.rb index 3a7201662..4f2ffd211 100644 --- a/lib/salmon/salmon_slap.rb +++ b/lib/salmon/slap.rb @@ -3,17 +3,20 @@ # the COPYRIGHT file. module Salmon - class SalmonSlap + class Slap 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.author = user.person + aes_key_hash = user.person.gen_aes_key + + #additional headers + salmon.aes_key = aes_key_hash['key'] + salmon.iv = aes_key_hash['iv'] + + salmon.magic_sig = MagicSigEnvelope.create(user, self.payload(activity, user, aes_key_hash)) salmon end @@ -39,9 +42,14 @@ module Salmon slap end + # @return [String] + def self.payload(activity, user=nil, aes_key_hash=nil) + activity + end + # @return [String] def parse_data(key_hash, user=nil) - SalmonSlap.decode64url(self.magic_sig.data) + Slap.decode64url(self.magic_sig.data) end # @return [Nokogiri::Doc] @@ -55,7 +63,7 @@ module Salmon #{header(person)} #{@magic_sig.to_xml} - + ENTRY end diff --git a/spec/controllers/publics_controller_spec.rb b/spec/controllers/publics_controller_spec.rb index 16192a4a9..1616f09fc 100644 --- a/spec/controllers/publics_controller_spec.rb +++ b/spec/controllers/publics_controller_spec.rb @@ -57,7 +57,7 @@ describe PublicsController do xml2 = post1.to_diaspora_xml user2 = Factory(:user) - salmon_factory = Salmon::SalmonSlap.create(@user, xml2) + salmon_factory = Salmon::EncryptedSlap.create(@user, xml2) enc_xml = salmon_factory.xml_for(user2.person) Resque.should_receive(:enqueue).with(Job::ReceiveSalmon, @user.id, enc_xml).once diff --git a/spec/lib/postzord/dispatch_spec.rb b/spec/lib/postzord/dispatch_spec.rb index da8181c54..de6b1a60d 100644 --- a/spec/lib/postzord/dispatch_spec.rb +++ b/spec/lib/postzord/dispatch_spec.rb @@ -231,7 +231,7 @@ describe Postzord::Dispatch do it 'calls salmon_for each remote person' do salmon = @mailman.salmon - Salmon::SalmonSlap.stub(:create).and_return(salmon) + Salmon::EncryptedSlap.stub(:create).and_return(salmon) salmon.should_receive(:xml_for).with(alice.person).and_return('what') @hydra.stub!(:queue) @hydra.stub!(:run) diff --git a/spec/lib/postzord/receiver_spec.rb b/spec/lib/postzord/receiver_spec.rb index 3b3b24d32..434073fb4 100644 --- a/spec/lib/postzord/receiver_spec.rb +++ b/spec/lib/postzord/receiver_spec.rb @@ -24,7 +24,7 @@ describe Postzord::Receiver do describe '.initialize' do it 'valid for local' do Webfinger.should_not_receive(:new) - Salmon::SalmonSlap.should_not_receive(:parse) + Salmon::EncryptedSlap.should_not_receive(:parse) zord = Postzord::Receiver.new(@user, :person => @person2, :object => @original_post) zord.instance_variable_get(:@user).should_not be_nil @@ -37,7 +37,7 @@ describe Postzord::Receiver do web_mock = mock() web_mock.should_receive(:fetch).and_return true salmon_mock.should_receive(:author_email).and_return(true) - Salmon::SalmonSlap.should_receive(:parse).with(@salmon_xml, @user).and_return(salmon_mock) + Salmon::EncryptedSlap.should_receive(:parse).with(@salmon_xml, @user).and_return(salmon_mock) Webfinger.should_receive(:new).and_return(web_mock) zord = Postzord::Receiver.new(@user, :salmon_xml => @salmon_xml) diff --git a/spec/lib/salmon/encrypted_salmon_slap_spec.rb b/spec/lib/salmon/encrypted_slap_spec.rb similarity index 88% rename from spec/lib/salmon/encrypted_salmon_slap_spec.rb rename to spec/lib/salmon/encrypted_slap_spec.rb index 03b5dd2fb..99aac03b4 100644 --- a/spec/lib/salmon/encrypted_salmon_slap_spec.rb +++ b/spec/lib/salmon/encrypted_slap_spec.rb @@ -4,10 +4,10 @@ require 'spec_helper' -describe Salmon::EncryptedSalmonSlap do +describe Salmon::EncryptedSlap do let(:post){ alice.post :status_message, :text => "hi", :to => alice.aspects.create(:name => "sdg").id } - let!(:created_salmon) {Salmon::EncryptedSalmonSlap.create(alice, post.to_diaspora_xml)} + let!(:created_salmon) {Salmon::EncryptedSlap.create(alice, post.to_diaspora_xml)} describe '#create' do @@ -26,7 +26,7 @@ describe Salmon::EncryptedSalmonSlap 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::EncryptedSalmonSlap.decode64url(created_salmon.magic_sig.data) + decoded_string = Salmon::EncryptedSlap.decode64url(created_salmon.magic_sig.data) alice.aes_decrypt(decoded_string, key_hash).should == post.to_diaspora_xml end end @@ -47,7 +47,7 @@ describe Salmon::EncryptedSalmonSlap do context 'marshaling' do let(:xml) {created_salmon.xml_for eve.person} - let(:parsed_salmon) { Salmon::EncryptedSalmonSlap.parse(xml, eve)} + let(:parsed_salmon) { Salmon::EncryptedSlap.parse(xml, eve)} it 'should parse out the aes key' do parsed_salmon.aes_key.should == created_salmon.aes_key diff --git a/spec/lib/salmon/salmon_slap_spec.rb b/spec/lib/salmon/salmon_slap_spec.rb deleted file mode 100644 index 77f61c492..000000000 --- a/spec/lib/salmon/salmon_slap_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'spec_helper' - -describe Salmon::SalmonSlap do - -end diff --git a/spec/lib/salmon/slap_spec.rb b/spec/lib/salmon/slap_spec.rb new file mode 100644 index 000000000..7d1d076dc --- /dev/null +++ b/spec/lib/salmon/slap_spec.rb @@ -0,0 +1,16 @@ +require 'spec_helper' + +describe Salmon::Slap do + + before do + @post = alice.post(:status_message, :text => "hi", :to => alice.aspects.create(:name => "abcd").id) + @created_salmon = Salmon::Slap.create(alice, @post.to_diaspora_xml) + end + + it 'works' do + salmon_string = @created_salmon.xml_for(nil) + salmon = Salmon::Slap.parse(salmon_string) + salmon.author.should == alice.person + salmon.parsed_data.should == @post.to_diaspora_xml + end +end diff --git a/spec/models/jobs/http_multi_spec.rb b/spec/models/jobs/http_multi_spec.rb index 257d6ec8f..941e4b6d2 100644 --- a/spec/models/jobs/http_multi_spec.rb +++ b/spec/models/jobs/http_multi_spec.rb @@ -60,8 +60,8 @@ describe Job::HttpMulti do Typhoeus::Hydra.stub!(:new).and_return(@hydra) - salmon = Salmon::SalmonSlap.create(bob, Base64.decode64(@post_xml)) - Salmon::SalmonSlap.stub(:create).and_return(salmon) + salmon = Salmon::EncryptedSlap.create(bob, Base64.decode64(@post_xml)) + Salmon::EncryptedSlap.stub(:create).and_return(salmon) salmon.should_receive(:xml_for).and_return("encrypted things") Job::HttpMulti.perform(bob.id, @post_xml, [person.id])