From f487e271c066e1ab44322fb1344fe3c6b9c01d15 Mon Sep 17 00:00:00 2001
From: Raphael <raphael@joindiaspora.com>
Date: Thu, 5 Aug 2010 10:43:02 -0700
Subject: [PATCH] RS, IZ; Posts now sign, signatures and keys now serialize

---
 app/models/person.rb | 17 +++++++++++++----
 app/models/post.rb   | 34 +++++++++++++++++-----------------
 app/models/user.rb   |  8 ++++----
 lib/encryptable.rb   |  8 ++++----
 4 files changed, 38 insertions(+), 29 deletions(-)

diff --git a/app/models/person.rb b/app/models/person.rb
index 3762d06495..234c780170 100644
--- a/app/models/person.rb
+++ b/app/models/person.rb
@@ -12,7 +12,8 @@ class Person
   key :email, String
   key :url, String
   key :active, Boolean, :default => false
-  key :key, OpenSSL::PKey::RSA 
+
+  key :serialized_key, String 
 
   one :profile, :class_name => 'Profile'
   many :posts, :class_name => 'Post', :foreign_key => :person_id
@@ -21,13 +22,13 @@ class Person
   timestamps!
 
   before_validation :clean_url
-  validates_presence_of :email, :url, :key
+  validates_presence_of :email, :url, :serialized_key
   validates_format_of :url, :with =>
      /^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix
   
   validates_true_for :url, :logic => lambda { self.url_unique?}
 
-  after_destroy :remove_all_traces, :remove_key
+  after_destroy :remove_all_traces
 
   scope :friends,  where(:_type => "Person", :active => true)
 
@@ -37,8 +38,16 @@ class Person
     "#{profile.first_name.to_s} #{profile.last_name.to_s}"
   end
 
+  def key
+    OpenSSL::PKey::RSA.new( serialized_key )
+  end
+
+  def key= new_key
+    raise TypeError unless new_key.class == OpenSSL::PKey::RSA
+    serialized_key = new_key.export
+  end
   def export_key
-    key.public_key.to_s  
+    key.public_key.export
   end
 
   protected
diff --git a/app/models/post.rb b/app/models/post.rb
index b1002ce917..1b4149fdcb 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -49,24 +49,24 @@ class Post
   end
 
 #ENCRYPTION
-    before_validation :sign_if_mine
-    validates_true_for :creator_signature, :logic => lambda {self.verify_creator_signature}
-    
-    xml_accessor :creator_signature
-    key :creator_signature, String
-    
-    def signable_accessors
-      accessors = self.class.roxml_attrs.collect{|definition| 
-        definition.accessor}
-      accessors.delete 'person'
-      accessors.delete 'creator_signature'
-      accessors
-    end
+  before_validation :sign_if_mine
+  validates_true_for :creator_signature, :logic => lambda {self.verify_creator_signature}
+  
+  xml_accessor :creator_signature
+  key :creator_signature, String
+  
+  def signable_accessors
+    accessors = self.class.roxml_attrs.collect{|definition| 
+      definition.accessor}
+    accessors.delete 'person'
+    accessors.delete 'creator_signature'
+    accessors
+  end
 
-    def signable_string
-      signable_accessors.collect{|accessor| 
-        (self.send accessor.to_sym).to_s}.join ';'
-    end
+  def signable_string
+    signable_accessors.collect{|accessor| 
+      (self.send accessor.to_sym).to_s}.join ';'
+  end
   
   def log_inspection
     Rails.logger.info self.inspect
diff --git a/app/models/user.rb b/app/models/user.rb
index f104c983ba..780bdd8023 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -74,7 +74,7 @@ class User < Person
 
   def receive_friend_request(friend_request)
     Rails.logger.info("receiving friend request #{friend_request.to_json}")
-    friend_request.person.key = OpenSSL::PKey::RSA.new(friend_request.exported_key)
+    friend_request.person.serialized_key = friend_request.exported_key
     if Request.where(:callback_url => friend_request.callback_url).first
       friend_request.activate_friend
       friend_request.destroy
@@ -124,14 +124,14 @@ class User < Person
   protected
   
   def assign_key
-    generate_key
+    self.serialized_key ||= generate_key.export
   end
 
   def generate_key
     puts "Generating key"
     
-    self.key = OpenSSL::PKey::RSA::generate 1024 
-    
+    OpenSSL::PKey::RSA::generate 1024 
+     
   end
 
 end
diff --git a/lib/encryptable.rb b/lib/encryptable.rb
index 0009c85f60..12b7bf90af 100644
--- a/lib/encryptable.rb
+++ b/lib/encryptable.rb
@@ -8,10 +8,10 @@
     
     def verify_signature(signature, person)
       return false unless signature && person.key
-      validity = nil
       Rails.logger.info("Verifying sig on #{signable_string} from person #{person.real_name}")
-      person.key.verify "SHA", signature, signable_string
-      
+      validity = person.key.verify "SHA", Base64.decode64(signature), signable_string
+      Rails.logger.info("Validity: #{validity}")
+      validity
     end
     
     protected
@@ -27,7 +27,7 @@
 
     def sign_with_key(key)
       Rails.logger.info("Signing #{signable_string}")
-      key.sign "SHA", signable_string
+      Base64.encode64(key.sign "SHA", signable_string)
       
     end
   end
-- 
GitLab