Skip to content
Extraits de code Groupes Projets
person.rb 4,15 ko
Newer Older
Raphael's avatar
Raphael a validé
#   Copyright (c) 2010, Diaspora Inc.  This file is
Raphael's avatar
Raphael a validé
#   licensed under the Affero General Public License version 3.  See
#   the COPYRIGHT file.
require File.expand_path('../../../lib/hcard', __FILE__)
maxwell's avatar
maxwell a validé
  include MongoMapper::Document
Raphael's avatar
Raphael a validé
  include Encryptor::Public
  xml_accessor :_id
  xml_accessor :diaspora_handle
  xml_accessor :profile, :as => Profile
Daniel Grippi's avatar
Daniel Grippi a validé
  key :url,            String
  key :diaspora_handle, String, :unique => true
  key :serialized_public_key, String
Daniel Grippi's avatar
Daniel Grippi a validé
  key :owner_id,  ObjectId
Raphael's avatar
Raphael a validé
  one :profile, :class_name => 'Profile'
maxwell's avatar
maxwell a validé
  many :albums, :class_name => 'Album', :foreign_key => :person_id
Daniel Grippi's avatar
Daniel Grippi a validé
  belongs_to :owner, :class_name => 'User'
  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
Raphael's avatar
Raphael a validé
  def self.search(query)
    query = Regexp.escape( query.to_s.strip )
danielvincent's avatar
danielvincent a validé
    Person.all('profile.first_name' => /^#{query}/i) | Person.all('profile.last_name' => /^#{query}/i)
    "#{profile.first_name.to_s} #{profile.last_name.to_s}"
Raphael's avatar
Raphael a validé
  def owns?(post)
    self.id == post.person.id
  end

  def receive_url
    "#{self.url}receive/users/#{self.id}/"
  end
danielvincent's avatar
danielvincent a validé
  def public_url
danielvincent's avatar
danielvincent a validé
    "#{self.url}users/#{self.owner.username}/public"
danielvincent's avatar
danielvincent a validé
  end

    Base64.encode64 OpenSSL::Digest::SHA256.new(self.exported_key).to_s
Raphael's avatar
Raphael a validé
  def public_key
    OpenSSL::PKey::RSA.new( serialized_public_key )
Raphael's avatar
Raphael a validé
  end

    raise "Don't change a key" if serialized_public_key
    @serialized_public_key = new_key
  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)
Raphael's avatar
Raphael a validé
     if local_person
       Rails.logger.info("Do not need to webfinger, found a local person #{local_person.real_name}")
Raphael's avatar
Raphael a validé
       local_person
     elsif  !identifier.include?("localhost") && !opts[:local]
Raphael's avatar
Raphael a validé
       begin
        Rails.logger.info("Webfingering #{identifier}")
Raphael's avatar
Raphael a validé
        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}"
Raphael's avatar
Raphael a validé
       end
       raise "No webfinger profile found at #{identifier}" if f.nil? || f.links.empty?
Raphael's avatar
Raphael a validé
       Person.from_webfinger_profile(identifier, f )
     end
maxwell's avatar
maxwell a validé
  end
Raphael's avatar
Raphael a validé
  def self.from_webfinger_profile( identifier, profile)
    new_person = Person.new
Raphael's avatar
Raphael a validé

    public_key_entry = profile.links.select{|x| x.rel == 'diaspora-public-key'}
    return nil unless public_key_entry
    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.diaspora_handle = identifier
Raphael's avatar
Raphael a validé
    hcard = HCard.find profile.hcard.first[:href]

    new_person.url = hcard[:url]
kook's avatar
kook a validé
    new_person.profile = Profile.new(:first_name => hcard[:given_name], :last_name => hcard[:family_name], :image_url => hcard[:photo])
Raphael's avatar
Raphael a validé
    if new_person.save
Raphael's avatar
Raphael a validé
      new_person
    else
Raphael's avatar
Raphael a validé
      nil
Raphael's avatar
Raphael a validé
    end
Raphael's avatar
Raphael a validé
  end
Raphael's avatar
Raphael a validé
  def remote?
    owner.nil?
  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
  private
  def remove_all_traces
    Post.all(:person_id => id).each{|p| p.delete}
    Album.all(:person_id => id).each{|p| p.delete}
Daniel Grippi's avatar
Daniel Grippi a validé
end