Newer
Older
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
Daniel Vincent Grippi
a validé
require File.expand_path('../../../lib/hcard', __FILE__)
Maxwell Salzberg
a validé
class Person
Maxwell Salzberg
a validé
include ROXML
Maxwell Salzberg
a validé
xml_accessor :url
xml_accessor :profile, :as => Profile
Raphael
a validé
xml_reader :exported_key
key :diaspora_handle, String, :unique => true
key :serialized_public_key, String
many :albums, :class_name => 'Album', :foreign_key => :person_id
timestamps!
before_destroy :remove_all_traces
before_validation :clean_url
validates_presence_of :url, :profile, :serialized_public_key
validates_format_of :url, :with =>
/^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix
query = Regexp.escape( query.to_s.strip )
Person.all('profile.first_name' => /^#{query}/i) | Person.all('profile.last_name' => /^#{query}/i)
end
def real_name
danielvincent
a validé
"#{profile.first_name.to_s} #{profile.last_name.to_s}"
def owns?(post)
self.id == post.person.id
end
def receive_url
"#{self.url}receive/users/#{self.id}/"
end
"#{self.url}users/#{self.owner.username}/public"
Raphael
a validé
maxwell
a validé
def public_key_hash
Raphael
a validé
Base64.encode64 OpenSSL::Digest::SHA256.new(self.exported_key).to_s
maxwell
a validé
end
OpenSSL::PKey::RSA.new( serialized_public_key )
Raphael
a validé
def exported_key
serialized_public_key
end
Raphael
a validé
def exported_key= new_key
raise "Don't change a key" if serialized_public_key
@serialized_public_key = new_key
Raphael
a validé
end
def self.by_webfinger( identifier, opts = {})
#need to check if this is a valid email structure, maybe should do in JS
local_person = Person.first(:diaspora_handle => identifier.gsub('acct:', '').to_s.downcase)
Rails.logger.info("Do not need to webfinger, found a local person #{local_person.real_name}")
elsif !identifier.include?("localhost") && !opts[:local]
Rails.logger.info("Webfingering #{identifier}")
f = Redfinger.finger(identifier)
rescue SocketError => e
raise "Diaspora server for #{identifier} not found" if e.message =~ /Name or service not known/
rescue Errno::ETIMEDOUT => e
raise "Connection timed out to Diaspora server for #{identifier}"
raise "No webfinger profile found at #{identifier}" if f.nil? || f.links.empty?
def self.from_webfinger_profile( identifier, profile)
new_person = Person.new
public_key_entry = profile.links.select{|x| x.rel == 'diaspora-public-key'}
pubkey = public_key_entry.first.href
new_person.exported_key = Base64.decode64 pubkey
guid = profile.links.select{|x| x.rel == 'http://joindiaspora.com/guid'}.first.href
new_person.id = guid
new_person.diaspora_handle = identifier
hcard = HCard.find profile.hcard.first[:href]
new_person.url = hcard[:url]
new_person.profile = Profile.new(:first_name => hcard[:given_name], :last_name => hcard[:family_name], :image_url => hcard[:photo])
end
def as_json(opts={})
{
:person => {
:id => self.id,
:name => self.real_name,
:diaspora_handle => self.diaspora_handle,
:url => self.url,
:exported_key => exported_key
}
}
end
def clean_url
self.url ||= "http://localhost:3000/" if self.class == User
if self.url
self.url = 'http://' + self.url unless self.url.match('http://' || 'https://')
self.url = self.url + '/' if self.url[-1,1] != '/'
end
end
Raphael
a validé
private
def remove_all_traces
Post.all(:person_id => id).each{|p| p.delete}
Album.all(:person_id => id).each{|p| p.delete}