fix pod table migration if someone deleted a user (owner) manually
This commit is contained in:
parent
e90f72ff37
commit
10af3a8b11
5 changed files with 44 additions and 8 deletions
|
|
@ -27,6 +27,8 @@ class Pod < ActiveRecord::Base
|
||||||
where(arel_table[:status].gt(Pod.statuses[:no_errors])).where.not(status: Pod.statuses[:version_failed])
|
where(arel_table[:status].gt(Pod.statuses[:no_errors])).where.not(status: Pod.statuses[:version_failed])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
validate :not_own_pod
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
def find_or_create_by(opts) # Rename this method to not override an AR method
|
def find_or_create_by(opts) # Rename this method to not override an AR method
|
||||||
uri = URI.parse(opts.fetch(:url))
|
uri = URI.parse(opts.fetch(:url))
|
||||||
|
|
@ -112,4 +114,10 @@ class Pod < ActiveRecord::Base
|
||||||
@uri ||= (ssl ? URI::HTTPS : URI::HTTP).build(host: host, port: port)
|
@uri ||= (ssl ? URI::HTTPS : URI::HTTP).build(host: host, port: port)
|
||||||
@uri.dup
|
@uri.dup
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def not_own_pod
|
||||||
|
pod_uri = AppConfig.pod_uri
|
||||||
|
pod_port = DEFAULT_PORTS.include?(pod_uri.port) ? nil : pod_uri.port
|
||||||
|
errors.add(:base, "own pod not allowed") if pod_uri.host == host && pod_port == port
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -46,9 +46,9 @@ class ExtendPods < ActiveRecord::Migration
|
||||||
add_column :people, :pod_id, :integer
|
add_column :people, :pod_id, :integer
|
||||||
add_index :people, :url, length: 190
|
add_index :people, :url, length: 190
|
||||||
add_foreign_key :people, :pods, name: :people_pod_id_fk, on_delete: :cascade
|
add_foreign_key :people, :pods, name: :people_pod_id_fk, on_delete: :cascade
|
||||||
Person.where(owner: nil).group_by {|person| person[:url] }.each do |url, _|
|
Person.where(owner: nil).distinct(:url).pluck(:url).each do |url|
|
||||||
pod = Pod.find_or_create_by(url: url)
|
pod = Pod.find_or_create_by(url: url)
|
||||||
Person.where(url: url).update_all(pod_id: pod.id)
|
Person.where(url: url, owner_id: nil).update_all(pod_id: pod.id) if pod.persisted?
|
||||||
end
|
end
|
||||||
|
|
||||||
# cleanup unused pods
|
# cleanup unused pods
|
||||||
|
|
|
||||||
|
|
@ -369,7 +369,7 @@ FactoryGirl.define do
|
||||||
factory(:federation_person_from_webfinger, class: DiasporaFederation::Entities::Person) do
|
factory(:federation_person_from_webfinger, class: DiasporaFederation::Entities::Person) do
|
||||||
sequence(:guid) { UUID.generate :compact }
|
sequence(:guid) { UUID.generate :compact }
|
||||||
sequence(:diaspora_id) {|n| "bob-person-#{n}#{r_str}@example.net" }
|
sequence(:diaspora_id) {|n| "bob-person-#{n}#{r_str}@example.net" }
|
||||||
url AppConfig.pod_uri.to_s
|
url "https://example.net/"
|
||||||
exported_key OpenSSL::PKey::RSA.generate(1024).public_key.export
|
exported_key OpenSSL::PKey::RSA.generate(1024).public_key.export
|
||||||
profile {
|
profile {
|
||||||
DiasporaFederation::Entities::Profile.new(
|
DiasporaFederation::Entities::Profile.new(
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ describe Postzord::Receiver::Public do
|
||||||
xml = Salmon::Slap.create_by_user_and_activity(bob, comment.to_diaspora_xml).xml_for(nil)
|
xml = Salmon::Slap.create_by_user_and_activity(bob, comment.to_diaspora_xml).xml_for(nil)
|
||||||
person = bob.person
|
person = bob.person
|
||||||
person.owner = nil
|
person.owner = nil
|
||||||
person.pod = Pod.find_or_create_by(url: AppConfig.pod_uri)
|
person.pod = Pod.find_or_create_by(url: "https://example.org/")
|
||||||
person.save
|
person.save
|
||||||
bob.destroy
|
bob.destroy
|
||||||
comment.destroy
|
comment.destroy
|
||||||
|
|
|
||||||
|
|
@ -25,18 +25,46 @@ describe Pod, type: :model do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "updates ssl boolean if upgraded to https" do
|
it "updates ssl boolean if upgraded to https" do
|
||||||
pod = Pod.find_or_create_by(url: "http://joindiaspora.com/")
|
pod = Pod.find_or_create_by(url: "http://example.org/")
|
||||||
expect(pod.ssl).to be false
|
expect(pod.ssl).to be false
|
||||||
pod = Pod.find_or_create_by(url: "https://joindiaspora.com/")
|
pod = Pod.find_or_create_by(url: "https://example.org/")
|
||||||
expect(pod.ssl).to be true
|
expect(pod.ssl).to be true
|
||||||
end
|
end
|
||||||
|
|
||||||
it "does not update ssl boolean if downgraded to http" do
|
it "does not update ssl boolean if downgraded to http" do
|
||||||
pod = Pod.find_or_create_by(url: "https://joindiaspora.com/")
|
pod = Pod.find_or_create_by(url: "https://example.org/")
|
||||||
expect(pod.ssl).to be true
|
expect(pod.ssl).to be true
|
||||||
pod = Pod.find_or_create_by(url: "http://joindiaspora.com/")
|
pod = Pod.find_or_create_by(url: "http://example.org/")
|
||||||
expect(pod.ssl).to be true
|
expect(pod.ssl).to be true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "validation" do
|
||||||
|
it "is valid" do
|
||||||
|
pod = Pod.find_or_create_by(url: "https://example.org/")
|
||||||
|
expect(pod).to be_valid
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't allow own pod" do
|
||||||
|
pod = Pod.find_or_create_by(url: AppConfig.url_to("/"))
|
||||||
|
expect(pod).not_to be_valid
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't allow own pod with default port" do
|
||||||
|
uri = URI.parse("https://example.org/")
|
||||||
|
allow(AppConfig).to receive(:pod_uri).and_return(uri)
|
||||||
|
|
||||||
|
pod = Pod.find_or_create_by(url: AppConfig.url_to("/"))
|
||||||
|
expect(pod).not_to be_valid
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't allow own pod with other scheme" do
|
||||||
|
uri = URI.parse("https://example.org/")
|
||||||
|
allow(AppConfig).to receive(:pod_uri).and_return(uri)
|
||||||
|
|
||||||
|
pod = Pod.find_or_create_by(url: "http://example.org/")
|
||||||
|
expect(pod).not_to be_valid
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe ".check_all!" do
|
describe ".check_all!" do
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue