diaspora/spec/lib/postzord/receiver/public_spec.rb
Maxwell Salzberg 190fceaf5c [SECURITY FIX] please update your pod ASAP
This is a fix for public messages, where a malicious pod could spoof a message from someone a user was connected to, as the verified signatures were not checked that the object was also from said sender.  This hole only affected public messages, and the private part of code had the correct checks
THX to s-f-s(Stephan Schulz) for reporting and tracking down this issue, and props to Raven24(florian.staudacher@gmx.at) for helping me test the patch
2012-07-02 10:00:12 -07:00

124 lines
3.7 KiB
Ruby

# Copyright (c) 2010-2011, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
require 'spec_helper'
require Rails.root.join('lib', 'postzord')
require Rails.root.join('lib', 'postzord', 'receiver', 'public')
describe Postzord::Receiver::Public do
before do
@post = Factory.build(:status_message, :author => alice.person, :public => true)
@created_salmon = Salmon::Slap.create_by_user_and_activity(alice, @post.to_diaspora_xml)
@xml = @created_salmon.xml_for(nil)
end
context 'round trips works with' do
it 'a comment' do
sm = Factory(:status_message, :author => alice.person)
comment = bob.build_comment(:text => 'yo', :post => sm)
comment.save
#bob signs his comment, and then sends it up
xml = Salmon::Slap.create_by_user_and_activity(bob, comment.to_diaspora_xml).xml_for(nil)
bob.destroy
comment.destroy
expect{
receiver = Postzord::Receiver::Public.new(xml)
receiver.perform!
}.to change(Comment, :count).by(1)
end
end
describe '#initialize' do
it 'creates a Salmon instance variable' do
receiver = Postzord::Receiver::Public.new(@xml)
receiver.salmon.should_not be_nil
end
end
describe '#perform!' do
before do
@receiver = Postzord::Receiver::Public.new(@xml)
end
it 'calls verify_signature' do
@receiver.should_receive(:verified_signature?)
@receiver.perform!
end
it 'returns false if signature is not verified' do
@receiver.should_receive(:verified_signature?).and_return(false)
@receiver.perform!.should be_false
end
context 'if signature is valid' do
it 'calls recipient_user_ids' do
@receiver.should_receive(:recipient_user_ids)
@receiver.perform!
end
it 'saves the parsed object' do
@receiver.should_receive(:save_object)
@receiver.perform!
end
it 'enqueues a Jobs::ReceiveLocalBatch' do
Resque.should_receive(:enqueue).with(Jobs::ReceiveLocalBatch, anything, anything, anything)
@receiver.perform!
end
it 'intergrates' do
fantasy_resque do
@receiver.perform!
end
end
end
end
describe '#verify_signature?' do
it 'calls Slap#verified_for_key?' do
receiver = Postzord::Receiver::Public.new(@xml)
receiver.salmon.should_receive(:verified_for_key?).with(instance_of(OpenSSL::PKey::RSA))
receiver.verified_signature?
end
end
describe '#recipient_user_ids' do
it 'calls User.all_sharing_with_person' do
User.should_receive(:all_sharing_with_person).and_return(stub(:select => []))
receiver = Postzord::Receiver::Public.new(@xml)
receiver.perform!
end
end
describe '#receive_relayable' do
before do
@comment = bob.build_comment(:text => 'yo', :post => Factory(:status_message))
@comment.save
created_salmon = Salmon::Slap.create_by_user_and_activity(alice, @comment.to_diaspora_xml)
xml = created_salmon.xml_for(nil)
@comment.delete
@receiver = Postzord::Receiver::Public.new(xml)
end
it 'receives only for the parent author if he is local to the pod' do
comment = stub.as_null_object
@receiver.instance_variable_set(:@object, comment)
comment.should_receive(:receive)
@receiver.receive_relayable
end
it 'calls notifiy_users' do
comment = stub.as_null_object
@receiver.instance_variable_set(:@object, comment)
local_batch_receiver = stub.as_null_object
Postzord::Receiver::LocalBatch.stub(:new).and_return(local_batch_receiver)
local_batch_receiver.should_receive(:notify_users)
@receiver.receive_relayable
end
end
end