diff options
author | Raphael Sofaer <raphael@joindiaspora.com> | 2011-07-22 06:15:47 +0400 |
---|---|---|
committer | Raphael Sofaer <raphael@joindiaspora.com> | 2011-07-22 06:15:47 +0400 |
commit | 17774d8b3b94ab0f3c6917c65d30552959fa387e (patch) | |
tree | b137571ec2acba9194efaebaa9fbd8ec38f00532 /app | |
parent | a1bf22fe7e4cbcb535ebfd6d108cf09d37856ebe (diff) |
Getting repost back to almost green.
Diffstat (limited to 'app')
-rw-r--r-- | app/models/signed_retraction.rb | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/app/models/signed_retraction.rb b/app/models/signed_retraction.rb new file mode 100644 index 000000000..75a4e5477 --- /dev/null +++ b/app/models/signed_retraction.rb @@ -0,0 +1,94 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3 or later. See +# the COPYRIGHT file. + +class SignedRetraction + include ROXML + include Diaspora::Webhooks + include Diaspora::Encryptable + + xml_name :signed_retraction + xml_attr :target_guid + xml_attr :target_type + xml_attr :sender_handle + xml_attr :target_author_signature + + attr_accessor :target_guid, + :target_type, + :target_author_signature, + :sender + + def signable_accessors + accessors = self.class.roxml_attrs.collect do |definition| + definition.accessor + end + accessors - ['target_author_signature'] + end + + def sender_handle= new_sender_handle + @sender = Person.where(:diaspora_handle => new_sender_handle).first + end + + def sender_handle + @sender.diaspora_handle + end + + def diaspora_handle + self.target.diaspora_handle + end + + def subscribers(user) + self.target.subscribers(user) + end + + def self.build(sender, target) + retraction = self.new + retraction.sender = sender + retraction.target = target + retraction.target_author_signature = retraction.sign_with_key(sender.encryption_key) if sender.person == target.author + retraction + end + + def target + @target ||= self.target_type.constantize.where(:guid => target_guid).first + end + + def guid + target_guid + end + def target= new_target + @target = new_target + @target_type = new_target.class.to_s + @target_guid = new_target.guid + end + + def perform receiving_user + Rails.logger.debug "Performing retraction for #{target_guid}" + puts "Performing retraction for #{target_guid}" + if reshare = Reshare.where(:author_id => receiving_user.person.id, :root_id => target.id).first + Postzord::Dispatch.new(receiving_user, self).post + end + self.target.unsocket_from_user receiving_user if target.respond_to? :unsocket_from_user + self.target.destroy + Rails.logger.info(:event => :retraction, :status => :complete, :target_type => self.target_type, :guid => self.target_guid) + end + + def receive(recipient, sender) + if self.target.nil? + Rails.logger.info("event=retraction status=abort reason='no post found' sender=#{sender.diaspora_handle} target_guid=#{target_guid}") + return + elsif self.target_author_signature_valid? + #this is a retraction from the upstream owner + self.perform(recipient) + else + Rails.logger.info("event=receive status=abort reason='object signature not valid' recipient=#{recipient.diaspora_handle} sender=#{self.parent.author.diaspora_handle} payload_type=#{self.class} parent_id=#{self.parent.id}") + return + end + self + end + + def target_author_signature_valid? + verify_signature(self.target_author_signature, self.target.author) + end +end + |