diaspora/lib/salmon/magic_sig_envelope.rb

80 lines
2 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.
module Salmon
class MagicSigEnvelope
attr_accessor :data, :data_type, :encoding, :alg, :sig, :author
# @return [MagicSigEnvelope]
def self.parse(doc)
env = self.new
env.encoding = doc.search('//me:env/me:encoding').text.strip
if env.encoding != 'base64url'
raise ArgumentError, "Magic Signature data must be encoded with base64url, was #{env.encoding}"
end
env.data = doc.search('//me:env/me:data').text
env.alg = doc.search('//me:env/me:alg').text.strip
unless 'RSA-SHA256' == env.alg
raise ArgumentError, "Magic Signature data must be signed with RSA-SHA256, was #{env.alg}"
end
env.sig = doc.search('//me:env/me:sig').text
env.data_type = doc.search('//me:env/me:data').first['type'].strip
env
end
# @return [MagicSigEnvelope]
def self.create(user, activity)
env = MagicSigEnvelope.new
env.author = user.person
env.data = Base64.urlsafe_encode64(activity)
env.data_type = env.get_data_type
env.encoding = env.get_encoding
env.alg = env.get_alg
#TODO: WHY DO WE DOUBLE ENCODE
env.sig = Base64.urlsafe_encode64(
user.encryption_key.sign OpenSSL::Digest::SHA256.new, env.signable_string )
env
end
# @return [String]
def signable_string
[@data, Base64.urlsafe_encode64(@data_type),Base64.urlsafe_encode64(@encoding), Base64.urlsafe_encode64(@alg)].join(".")
end
# @return [String]
def to_xml
<<ENTRY
<me:env>
<me:data type='#{@data_type}'>#{@data}</me:data>
<me:encoding>#{@encoding}</me:encoding>
<me:alg>#{@alg}</me:alg>
<me:sig>#{@sig}</me:sig>
</me:env>
ENTRY
end
# @return [String]
def get_encoding
'base64url'
end
# @return [String]
def get_data_type
'application/atom+xml'
end
# @return [String]
def get_alg
'RSA-SHA256'
end
end
end