Commit 9ccdbb658b481ec9a5997eeedd99eaed3c1766f6

Authored by Larissa Reis
1 parent c383bcdc

Creates External Profile model for federated users

app/models/abuse_complaint.rb
1 1 class AbuseComplaint < Task
2 2 has_many :abuse_reports, :dependent => :destroy
3   - belongs_to :reported, :class_name => "Profile", :foreign_key => "requestor_id"
  3 + belongs_to :reported, :polymorphic => true, :foreign_key => "requestor_id"
4 4  
5 5 validates_presence_of :reported
6 6 alias :requestor :reported
... ...
app/models/abuse_report.rb
... ... @@ -2,7 +2,7 @@ class AbuseReport &lt; ApplicationRecord
2 2  
3 3 attr_accessible :content, :reason
4 4  
5   - belongs_to :reporter, :class_name => 'Person'
  5 + belongs_to :reporter, :polymorphic => true
6 6 belongs_to :abuse_complaint
7 7 has_many :reported_images, :dependent => :destroy
8 8  
... ...
app/models/comment.rb
... ... @@ -15,7 +15,7 @@ class Comment &lt; ApplicationRecord
15 15 alias :article= :source=
16 16 attr_accessor :follow_article
17 17  
18   - belongs_to :author, :class_name => 'Person', :foreign_key => 'author_id'
  18 + belongs_to :author, :polymorphic => true, :foreign_key => 'author_id'
19 19 has_many :children, :class_name => 'Comment', :foreign_key => 'reply_of_id', :dependent => :destroy
20 20 belongs_to :reply_of, :class_name => 'Comment', :foreign_key => 'reply_of_id'
21 21  
... ...
app/models/concerns/human.rb
... ... @@ -2,15 +2,15 @@ module Human
2 2 extend ActiveSupport::Concern
3 3  
4 4 included do
5   - has_many :comments, :foreign_key => :author_id
6   - has_many :abuse_reports, :foreign_key => 'reporter_id', :dependent => :destroy
  5 + has_many :comments, :as => :author, :foreign_key => :author_id
  6 + has_many :abuse_reports, :as => :reporter, :foreign_key => 'reporter_id', :dependent => :destroy
7 7  
8 8 scope :abusers, -> {
9   - joins(:abuse_complaints).where('tasks.status = 3').distinct.select('profiles.*')
  9 + joins(:abuse_complaints).where('tasks.status = 3').distinct.select("#{self.table_name}.*")
10 10 }
11 11 scope :non_abusers, -> {
12   - distinct.select("profiles.*").
13   - joins("LEFT JOIN tasks ON profiles.id = tasks.requestor_id AND tasks.type='AbuseComplaint'").
  12 + distinct.select("#{self.table_name}.*").
  13 + joins("LEFT JOIN tasks ON #{self.table_name}.id = tasks.requestor_id AND tasks.type='AbuseComplaint'").
14 14 where("tasks.status != 3 OR tasks.id is NULL")
15 15 }
16 16 end
... ...
app/models/concerns/profile_entity.rb
... ... @@ -2,14 +2,15 @@ module ProfileEntity
2 2 extend ActiveSupport::Concern
3 3  
4 4 included do
5   - attr_accessible :name, :identifier, :environment, :redirection_after_login
  5 + attr_accessible :name, :identifier, :environment
6 6  
7 7 validates_presence_of :identifier, :name
8   - validates_inclusion_of :redirection_after_login, :in => Environment.login_redirection_options.keys, :allow_nil => true
9 8  
10 9 belongs_to :environment
11 10 has_many :search_terms, :as => :context
12   - has_many :abuse_complaints, :foreign_key => 'requestor_id', :dependent => :destroy
  11 + has_many :abuse_complaints, :as => :reported, :foreign_key => 'requestor_id', :dependent => :destroy
  12 +
  13 + before_create :set_default_environment
13 14  
14 15 end
15 16  
... ... @@ -23,11 +24,15 @@ module ProfileEntity
23 24 self.save
24 25 end
25 26  
26   - def preferred_login_redirection
27   - redirection_after_login.blank? ? environment.redirection_after_login : redirection_after_login
28   - end
29   -
30 27 def opened_abuse_complaint
31 28 abuse_complaints.opened.first
32 29 end
  30 +
  31 + def set_default_environment
  32 + if self.environment.nil?
  33 + self.environment = Environment.default
  34 + end
  35 + true
  36 + end
  37 +
33 38 end
... ...
app/models/external_person.rb
1 1 # A pseudo profile is a person from a remote network
2   -class ExternalPerson
  2 +class ExternalPerson < ActiveRecord::Base
3 3  
4 4 include Human
5 5 include ProfileEntity
6 6  
  7 + validates_uniqueness_of :identifier, scope: :source
  8 +
  9 + attr_accessible :source, :email_md5_hash
  10 +
  11 + def self.get_or_create(webfinger)
  12 + user = ExternalPerson.find_by(identifier: webfinger.identifier, source: webfinger.domain)
  13 + if user.nil?
  14 + user = ExternalPerson.create!(identifier: webfinger.identifier,
  15 + name: webfinger.name,
  16 + source: webfinger.domain,
  17 + email_md5_hash: webfinger.email_md5
  18 + )
  19 + end
  20 + user
  21 + end
  22 +
  23 + def url
  24 + "http://#{self.source}/#{self.identifier}"
  25 + end
  26 +
  27 + def avatar
  28 + "http://#{self.source}/plugin/gravatar_provider/h/#{self.email_md5_hash}"
  29 + end
  30 +
  31 + def preferred_login_redirection
  32 + environment.redirection_after_login
  33 + end
  34 +
7 35 end
... ...
app/models/profile.rb
... ... @@ -6,7 +6,7 @@ class Profile &lt; ApplicationRecord
6 6 include ProfileEntity
7 7  
8 8 attr_accessible :public_profile, :nickname, :custom_footer, :custom_header, :address, :zip_code, :contact_phone, :image_builder, :description, :closed, :template_id, :lat, :lng, :is_template, :fields_privacy, :preferred_domain_id, :category_ids, :country, :city, :state, :national_region_code, :email, :contact_email, :redirect_l10n, :notification_time,
9   - :custom_url_redirection, :email_suggestions, :allow_members_to_invite, :invite_friends_only, :secret, :profile_admin_mail_notification
  9 + :custom_url_redirection, :email_suggestions, :allow_members_to_invite, :invite_friends_only, :secret, :profile_admin_mail_notification, :redirection_after_login
10 10  
11 11 # use for internationalizable human type names in search facets
12 12 # reimplement on subclasses
... ... @@ -411,14 +411,6 @@ class Profile &lt; ApplicationRecord
411 411 end
412 412 end
413 413  
414   - before_create :set_default_environment
415   - def set_default_environment
416   - if self.environment.nil?
417   - self.environment = Environment.default
418   - end
419   - true
420   - end
421   -
422 414 # registar callback for creating boxes after the object is created.
423 415 after_create :create_default_set_of_boxes
424 416  
... ... @@ -1103,6 +1095,10 @@ private :generate_url, :url_options
1103 1095 display_private_info_to?(current_person) || (public_fields.include?(field) && public?)
1104 1096 end
1105 1097  
  1098 + validates_inclusion_of :redirection_after_login, :in => Environment.login_redirection_options.keys, :allow_nil => true
  1099 + def preferred_login_redirection
  1100 + redirection_after_login.blank? ? environment.redirection_after_login : redirection_after_login
  1101 + end
1106 1102 settings_items :custom_url_redirection, type: String, default: nil
1107 1103  
1108 1104 def remove_from_suggestion_list(person)
... ...
db/migrate/20160420125236_add_type_to_polymorphic_profile_associations.rb 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +class AddTypeToPolymorphicProfileAssociations < ActiveRecord::Migration
  2 + def up
  3 + add_column :tasks, :reported_type, :string
  4 + add_column :abuse_reports, :reporter_type, :string
  5 + add_column :comments, :author_type, :string
  6 +
  7 + update("UPDATE tasks SET reported_type='Profile'")
  8 + update("UPDATE abuse_reports SET reporter_type='Person'")
  9 + update("UPDATE comments SET author_type='Person'")
  10 + end
  11 +
  12 + def down
  13 + remove_column :abuse_complaints, :reported_type
  14 + remove_column :abuse_reports, :reporter_type
  15 + remove_column :comments, :author_type
  16 + end
  17 +end
... ...
db/migrate/20160420140141_create_external_person.rb 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +class CreateExternalPerson < ActiveRecord::Migration
  2 + def change
  3 + create_table :external_people do |t|
  4 + t.string :name
  5 + t.string :identifier
  6 + t.string :source
  7 + t.string :email_md5_hash
  8 + t.integer :environment_id
  9 + t.boolean :visible, default: true
  10 + end
  11 + end
  12 +end
... ...
test/unit/comment_test.rb
... ... @@ -23,17 +23,14 @@ class CommentTest &lt; ActiveSupport::TestCase
23 23 end
24 24 end
25 25  
26   - should 'record authenticated author' do
  26 + should 'record authenticated author polymorphically' do
27 27 c = Comment.new
28   - assert_raise ActiveRecord::AssociationTypeMismatch do
29   - c.author = 1
30   - end
31   - assert_raise ActiveRecord::AssociationTypeMismatch do
32   - c.author = Profile
33   - end
34 28 assert_nothing_raised do
35 29 c.author = Person.new
36 30 end
  31 + assert_nothing_raised do
  32 + c.author = ExternalPerson.new
  33 + end
37 34 end
38 35  
39 36 should 'record unauthenticated author' do
... ...
test/unit/person_test.rb
... ... @@ -1831,9 +1831,9 @@ class PersonTest &lt; ActiveSupport::TestCase
1831 1831 p1 = fast_create(Person)
1832 1832 p2 = fast_create(Person)
1833 1833 article = fast_create(Article)
1834   - c1 = fast_create(Comment, :source_id => article.id, :author_id => p1.id)
1835   - c2 = fast_create(Comment, :source_id => article.id, :author_id => p2.id)
1836   - c3 = fast_create(Comment, :source_id => article.id, :author_id => p1.id)
  1834 + c1 = fast_create(Comment, :source_id => article.id, :author_id => p1.id, :author_type => 'Profile')
  1835 + c2 = fast_create(Comment, :source_id => article.id, :author_id => p2.id, :author_type => 'Profile')
  1836 + c3 = fast_create(Comment, :source_id => article.id, :author_id => p1.id, :author_type => 'Profile')
1837 1837  
1838 1838 assert_equivalent [c1,c3], p1.comments
1839 1839 end
... ...