RS, IZ; Posts now sign, signatures and keys now serialize
This commit is contained in:
parent
4a3f6b2986
commit
f487e271c0
4 changed files with 38 additions and 29 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue