Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/diaspora/diaspora.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorRaphael Sofaer <raphael@joindiaspora.com>2011-07-22 06:15:47 +0400
committerRaphael Sofaer <raphael@joindiaspora.com>2011-07-22 06:15:47 +0400
commit17774d8b3b94ab0f3c6917c65d30552959fa387e (patch)
treeb137571ec2acba9194efaebaa9fbd8ec38f00532 /app
parenta1bf22fe7e4cbcb535ebfd6d108cf09d37856ebe (diff)
Getting repost back to almost green.
Diffstat (limited to 'app')
-rw-r--r--app/models/signed_retraction.rb94
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
+