Skip to content
Extraits de code Groupes Projets
user.rb 7,1 ko
Newer Older
  • Learn to ignore specific revisions
  • require 'lib/diaspora/user/friending.rb'
    
    
    class User
      include MongoMapper::Document
    
      include Diaspora::UserModules::Friending
    
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable
    
    maxwell's avatar
    maxwell a validé
             
    
    maxwell's avatar
    maxwell a validé
      key :pending_request_ids, Array
    
    Raphael's avatar
    Raphael a validé
      key :visible_post_ids, Array
    
    
      one :person, :class_name => 'Person', :foreign_key => :owner_id
    
      many :friends, :in => :friend_ids, :class_name => 'Person'
    
    maxwell's avatar
    maxwell a validé
      many :pending_requests, :in => :pending_request_ids, :class_name => 'Request'
    
      many :raw_visible_posts, :in => :visible_post_ids, :class_name => 'Post'
    
      many :groups, :class_name => 'Group'
    
    
      before_validation_on_create :setup_person
    
      before_validation :do_bad_things 
    
      ######## Making things work ########
    
    Raphael's avatar
    Raphael a validé
      ensure_index :email
    
      def method_missing(method, *args)
        self.person.send(method, *args)
      end
    
    
      def real_name
        "#{person.profile.first_name.to_s} #{person.profile.last_name.to_s}"
    
      ######### Groups ######################
      def group( opts = {} )
        opts[:user] = self
        Group.create(opts)
      end
    
      ######## Posting ########
    
      def post(class_name, options = {})
        options[:person] = self.person
    
        if class_name == :photo
          raise "No album_id given" unless options[:album_id]
          group_ids = groups_with_post( options[:album_id] )
          group_ids.map!{ |group| group.id }
        else
          group_ids = options.delete(:to)
        end
    
        group_ids = [group_ids] if group_ids.is_a? BSON::ObjectID
    
    Raphael's avatar
    Raphael a validé
        raise "You must post to someone." if group_ids.nil? || group_ids.empty?
    
    
        model_class = class_name.to_s.camelize.constantize
        post = model_class.instantiate(options)
        post.creator_signature = post.sign_with_key(encryption_key)
    
    ilya's avatar
    ilya a validé
        post.save
    
        post.socket_to_uid(id, :group_ids => group_ids) if post.respond_to?(:socket_to_uid)
    
        push_to_groups(post, group_ids)
    
        self.raw_visible_posts << post
        self.save
        post
      end
    
      def push_to_groups( post, group_ids )
        if group_ids == :all || group_ids == "all"
          groups = self.groups
        else
          group_ids.map!{|gid| User.ensure_bson gid }
          groups = self.groups.find_all_by_id( group_ids )
        end
    #send to the groups
    
    Raphael's avatar
    Raphael a validé
        target_people = [] 
    
        groups.each{ |group|
    
    Raphael's avatar
    Raphael a validé
          target_people = target_people | group.people
        }
        post.push_to( target_people )
    
      def visible_posts( opts = {} )
        if opts[:by_members_of]
    
          return raw_visible_posts if opts[:by_members_of] == :all
    
          group = self.groups.find_by_id( opts[:by_members_of].id )
    
    
      ######## Commenting  ########
      def comment(text, options = {})
        raise "must comment on something!" unless options[:on]
    
        comment = Comment.new(:person_id => self.person.id, :text => text, :post => options[:on])
        comment.creator_signature = comment.sign_with_key(encryption_key)
        if comment.save
          dispatch_comment comment
          comment.socket_to_uid id
          comment
    
          Rails.logger.warn "this failed to save: #{comment.inspect}"
    
      def dispatch_comment( comment )
        if owns? comment.post
          comment.post_creator_signature = comment.sign_with_key(encryption_key)
          comment.save
          comment.push_downstream
        elsif owns? comment
          comment.save
          comment.push_upstream
    
      
      ######### Posts and Such ###############
    
    Raphael's avatar
    Raphael a validé
        post.unsocket_from_uid(self.id) if post.respond_to? :unsocket_from_uid
    
        retraction = Retraction.for(post)
        retraction.creator_signature = retraction.sign_with_key( encryption_key ) 
    
        retraction.push_to( self.friends.all )
    
      ########### Profile ######################
      def update_profile(params)
    
        params[:profile].delete(:image_url) if params[:profile][:image_url].empty?
    
    
        if self.person.update_attributes(params)
          self.profile.push_to( self.friends.all )
          true
        else
          false
        end
      end
    
    
      ###### Receiving #######
      def receive xml
    
        object = Diaspora::Parser.from_xml(xml)
    
        Rails.logger.debug("Receiving object:\n#{object.inspect}")
    
        raise "Signature was not valid on: #{object.inspect}" unless object.signature_valid?
    
        if object.is_a? Retraction
    
          if object.type == 'Person' && object.signature_valid?
    
            Rails.logger.info( "the person id is #{object.post_id} the friend found is #{visible_person_by_id(object.post_id).inspect}")
            unfriended_by visible_person_by_id(object.post_id)
    
          else
            object.perform self.id
    
            groups = self.groups_with_person(object.person)
    
            groups.each{ |group| group.post_ids.delete(User.ensure_bson(object.post_id))
    
        elsif object.is_a? Request
    
          person = Diaspora::Parser.get_or_create_person_object_from_xml( xml )
    
          person.serialized_key ||= object.exported_key
          object.person = person
          object.person.save
    
          old_request =  Request.first(:id => object.id)
          object.group_id = old_request.group_id if old_request
    
          object.save
    
          receive_friend_request(object)
        elsif object.is_a? Profile
    
          person = Diaspora::Parser.owner_id_from_xml xml
    
          person.profile = object
          person.save  
    
        elsif object.is_a?(Comment) 
    
          dispatch_comment object unless owns?(object)
    
          Rails.logger.debug("Saving object: #{object}")
    
          
          self.raw_visible_posts << object
          self.save
    
          groups = self.groups_with_person(object.person)
    
          groups.each{ |group| 
            group.posts << object
            group.save
            object.socket_to_uid(id, :group_id => group.id) if (object.respond_to?(:socket_to_uid) && !self.owns?(object))
    
      def self.instantiate!( opts = {} )
    
        opts[:person][:email] = opts[:email]
        opts[:person][:serialized_key] = generate_key
    
      def terse_url
        terse= self.url.gsub(/https?:\/\//, '')
        terse.gsub!(/www\./, '')
        terse = terse.chop! if terse[-1, 1] == '/'
        terse
      end
    
    
      def do_bad_things
        self.password_confirmation = self.password
      end 
    
    
      def visible_person_by_id( id )
    
        return self.person if id == self.person.id
        friends.detect{|x| x.id == id }
    
        groups.detect{|x| x.id == id }
    
    Raphael's avatar
    Raphael a validé
    
    
      def album_by_id( id )
    
        albums.detect{|x| x.id == id }
      end
    
    
      def groups_with_post( id )
        id = User.ensure_bson id
        self.groups.find_all_by_post_ids( id )
      end
    
    
      def groups_with_person person
    
        groups.select {|group| group.person_ids.include? id}
    
    Raphael's avatar
    Raphael a validé
        self.person.serialized_key ||= generate_key.export
        self.person.email ||= email
    
    ilya's avatar
    ilya a validé
      def all_group_ids
    
    ilya's avatar
    ilya a validé
        self.groups.all.collect{|x| x.id}
    
    ilya's avatar
    ilya a validé
      end
    
       def generate_key
        OpenSSL::PKey::RSA::generate 1024 
      end 
    
    
    Raphael's avatar
    Raphael a validé
      def self.generate_key
    
        OpenSSL::PKey::RSA::generate 1024 
    
    ilya's avatar
    ilya a validé
      end
    
    
    Raphael's avatar
    Raphael a validé
        id.class == String ? BSON::ObjectID(id) : id 
    
    Raphael's avatar
    Raphael a validé
      end