MS DG cleaned up and fleshed out salmon specs
This commit is contained in:
parent
6dede984e9
commit
87c994fa47
7 changed files with 93 additions and 79 deletions
|
|
@ -19,7 +19,7 @@ module Job
|
|||
|
||||
people = Person.where(:id => person_ids)
|
||||
|
||||
salmon = Salmon::EncryptedSlap.create(user, Base64.decode64(enc_object_xml))
|
||||
salmon = Salmon::EncryptedSlap.create_by_user_and_activity(user, Base64.decode64(enc_object_xml))
|
||||
|
||||
failed_request_people = []
|
||||
|
||||
|
|
|
|||
|
|
@ -215,7 +215,7 @@ class User < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def salmon(post)
|
||||
Salmon::EncryptedSlap.create(self, post.to_diaspora_xml)
|
||||
Salmon::EncryptedSlap.create_by_user_and_activity(self, post.to_diaspora_xml)
|
||||
end
|
||||
|
||||
def build_relayable(model, options = {})
|
||||
|
|
|
|||
|
|
@ -6,12 +6,13 @@ module Salmon
|
|||
class MagicSigEnvelope
|
||||
attr_accessor :data, :data_type, :encoding, :alg, :sig, :author
|
||||
def self.parse(doc)
|
||||
puts doc.to_s
|
||||
env = self.new
|
||||
ns = {'me'=>'http://salmon-protocol.org/ns/magic-env'}
|
||||
env.encoding = doc.search('//me:env/me:encoding', ns).text.strip
|
||||
|
||||
if env.encoding != 'base64url'
|
||||
raise ArgumentError, "Magic Signature data must be encoded with base64url, was #{slap.magic_sig.encoding}"
|
||||
raise ArgumentError, "Magic Signature data must be encoded with base64url, was #{env.encoding}"
|
||||
end
|
||||
|
||||
env.data = doc.search('//me:env/me:data', ns).text
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ module Salmon
|
|||
attr_accessor :magic_sig, :author, :author_email, :parsed_data
|
||||
attr_accessor :aes_key, :iv
|
||||
|
||||
def self.create(user, activity)
|
||||
delegate :sig, :data_type, :to => :magic_sig
|
||||
|
||||
def self.create_by_user_and_activity(user, activity)
|
||||
salmon = self.new
|
||||
salmon.author = user.person
|
||||
aes_key_hash = user.person.gen_aes_key
|
||||
|
|
@ -20,34 +22,30 @@ module Salmon
|
|||
salmon
|
||||
end
|
||||
|
||||
def self.parse(xml, user=nil)
|
||||
def self.from_xml(xml, receiving_user=nil)
|
||||
slap = self.new
|
||||
doc = Nokogiri::XML(xml)
|
||||
|
||||
entry_doc = doc.search('entry')
|
||||
|
||||
### Header ##
|
||||
header_doc = slap.salmon_header(doc, user)
|
||||
header_doc = slap.salmon_header(doc, receiving_user)
|
||||
slap.author_email= header_doc.search('uri').text.split("acct:").last
|
||||
|
||||
slap.aes_key = header_doc.search('aes_key').text
|
||||
slap.iv = header_doc.search('iv').text
|
||||
|
||||
slap.magic_sig = MagicSigEnvelope.parse(doc.search('entry'))
|
||||
slap.magic_sig = MagicSigEnvelope.parse(entry_doc)
|
||||
|
||||
|
||||
#should be in encrypted salmon only
|
||||
key_hash = {'key' => slap.aes_key, 'iv' => slap.iv}
|
||||
|
||||
slap.parsed_data = slap.parse_data(key_hash, user)
|
||||
slap.parsed_data = slap.parse_data(key_hash, receiving_user)
|
||||
|
||||
slap
|
||||
end
|
||||
|
||||
def sig
|
||||
self.magic_sig.sig
|
||||
end
|
||||
|
||||
def data_type
|
||||
self.magic_sig.data_type
|
||||
end
|
||||
|
||||
# @return [String]
|
||||
def self.payload(activity, user=nil, aes_key_hash=nil)
|
||||
|
|
|
|||
|
|
@ -5,34 +5,43 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Salmon::EncryptedSlap do
|
||||
let(:post){ alice.post :status_message, :text => "hi", :to => alice.aspects.create(:name => "sdg").id }
|
||||
|
||||
let!(:created_salmon) {Salmon::EncryptedSlap.create(alice, post.to_diaspora_xml)}
|
||||
before do
|
||||
@post = alice.post(:status_message, :text => "hi", :to => alice.aspects.create(:name => "abcd").id)
|
||||
@created_salmon = Salmon::EncryptedSlap.create_by_user_and_activity(alice, @post.to_diaspora_xml)
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
|
||||
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
|
||||
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::EncryptedSlap.decode64url(@created_salmon.magic_sig.data)
|
||||
alice.aes_decrypt(decoded_string, key_hash).should == @post.to_diaspora_xml
|
||||
end
|
||||
|
||||
it 'sets aes and iv key' do
|
||||
created_salmon.aes_key.should_not be nil
|
||||
created_salmon.iv.should_not be nil
|
||||
@created_salmon.aes_key.should_not be_nil
|
||||
@created_salmon.iv.should_not be_nil
|
||||
end
|
||||
end
|
||||
|
||||
context 'marshalling' do
|
||||
let(:xml) {@created_salmon.xml_for(eve.person)}
|
||||
let(:parsed_salmon) { Salmon::EncryptedSlap.from_xml(xml, alice)}
|
||||
|
||||
it 'should parse out the aes key' do
|
||||
parsed_salmon.aes_key.should == @created_salmon.aes_key
|
||||
end
|
||||
|
||||
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::EncryptedSlap.decode64url(created_salmon.magic_sig.data)
|
||||
alice.aes_decrypt(decoded_string, key_hash).should == post.to_diaspora_xml
|
||||
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
|
||||
|
||||
describe '#xml_for' do
|
||||
let(:xml) {created_salmon.xml_for eve.person}
|
||||
let(:xml) {@created_salmon.xml_for eve.person}
|
||||
|
||||
it 'has a encrypted header field' do
|
||||
xml.include?("encrypted_header").should be true
|
||||
|
|
@ -41,49 +50,8 @@ describe Salmon::EncryptedSlap do
|
|||
it 'the encrypted_header field should contain the aes key' do
|
||||
doc = Nokogiri::XML(xml)
|
||||
decrypted_header = eve.decrypt(doc.search('encrypted_header').text)
|
||||
decrypted_header.include?(created_salmon.aes_key).should be true
|
||||
decrypted_header.include?(@created_salmon.aes_key).should be true
|
||||
end
|
||||
end
|
||||
|
||||
context 'marshaling' do
|
||||
let(:xml) {created_salmon.xml_for eve.person}
|
||||
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
|
||||
end
|
||||
|
||||
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 == alice.person.diaspora_handle
|
||||
|
||||
end
|
||||
|
||||
describe '#author' do
|
||||
it 'should reference a local author' do
|
||||
parsed_salmon.author.should == alice.person
|
||||
end
|
||||
|
||||
it 'should fail if no author is found' do
|
||||
parsed_salmon.author_email = 'tom@tom.joindiaspora.com'
|
||||
|
||||
|
||||
proc {parsed_salmon.author.public_key}.should raise_error "did you remember to async webfinger?"
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
it 'verifies the signature for the sender' do
|
||||
parsed_salmon.verified_for_key?(alice.public_key).should be true
|
||||
end
|
||||
|
||||
it 'contains the original data' do
|
||||
parsed_salmon.parsed_data.should == post.to_diaspora_xml
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -1,16 +1,63 @@
|
|||
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)
|
||||
@created_salmon = Salmon::Slap.create_by_user_and_activity(alice, @post.to_diaspora_xml)
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
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 'works' do
|
||||
salmon_string = @created_salmon.xml_for(nil)
|
||||
salmon = Salmon::Slap.parse(salmon_string)
|
||||
salmon = Salmon::Slap.from_xml(salmon_string)
|
||||
salmon.author.should == alice.person
|
||||
salmon.parsed_data.should == @post.to_diaspora_xml
|
||||
end
|
||||
|
||||
describe '#author' do
|
||||
let(:xml) {@created_salmon.xml_for(eve.person)}
|
||||
let(:parsed_salmon) { Salmon::Slap.from_xml(xml, alice)}
|
||||
|
||||
it 'should reference a local author' do
|
||||
parsed_salmon.author.should == alice.person
|
||||
end
|
||||
|
||||
it 'should fail if no author is found' do
|
||||
parsed_salmon.author_email = 'tom@tom.joindiaspora.com'
|
||||
expect {
|
||||
parsed_salmon.author.public_key
|
||||
}.should raise_error "did you remember to async webfinger?"
|
||||
end
|
||||
end
|
||||
|
||||
context 'marshaling' do
|
||||
let(:xml) {@created_salmon.xml_for(eve.person)}
|
||||
let(:parsed_salmon) { Salmon::Slap.from_xml(xml)}
|
||||
|
||||
it 'should parse out the authors diaspora_handle' do
|
||||
parsed_salmon.author_email.should == alice.person.diaspora_handle
|
||||
end
|
||||
|
||||
it 'verifies the signature for the sender' do
|
||||
parsed_salmon.verified_for_key?(alice.public_key).should be_true
|
||||
end
|
||||
|
||||
it 'verifies the signature for the sender' do
|
||||
parsed_salmon.verified_for_key?(Factory(:person).public_key).should be_false
|
||||
end
|
||||
|
||||
it 'contains the original data' do
|
||||
parsed_salmon.parsed_data.should == @post.to_diaspora_xml
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -60,8 +60,8 @@ describe Job::HttpMulti do
|
|||
|
||||
Typhoeus::Hydra.stub!(:new).and_return(@hydra)
|
||||
|
||||
salmon = Salmon::EncryptedSlap.create(bob, Base64.decode64(@post_xml))
|
||||
Salmon::EncryptedSlap.stub(:create).and_return(salmon)
|
||||
salmon = Salmon::EncryptedSlap.create_by_user_and_activity(bob, Base64.decode64(@post_xml))
|
||||
Salmon::EncryptedSlap.stub(:create_by_user_and_activity).and_return(salmon)
|
||||
salmon.should_receive(:xml_for).and_return("encrypted things")
|
||||
|
||||
Job::HttpMulti.perform(bob.id, @post_xml, [person.id])
|
||||
|
|
|
|||
Loading…
Reference in a new issue