Fix instance actor being incorrectly created when running migrations (#18109)
* Add migration test about instance actor key * Fix old migration * Work around incorrect database state
This commit is contained in:
parent
f47a9ddc9f
commit
33cd80d69c
4 changed files with 20 additions and 1 deletions
|
@ -559,6 +559,12 @@ class Account < ApplicationRecord
|
||||||
before_validation :prepare_username, on: :create
|
before_validation :prepare_username, on: :create
|
||||||
before_destroy :clean_feed_manager
|
before_destroy :clean_feed_manager
|
||||||
|
|
||||||
|
def ensure_keys!
|
||||||
|
return unless local? && private_key.blank? && public_key.blank?
|
||||||
|
generate_keys
|
||||||
|
save!
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def prepare_contents
|
def prepare_contents
|
||||||
|
|
|
@ -13,7 +13,7 @@ module AccountFinderConcern
|
||||||
end
|
end
|
||||||
|
|
||||||
def representative
|
def representative
|
||||||
Account.find(-99)
|
Account.find(-99).tap(&:ensure_keys!)
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
Account.create!(id: -99, actor_type: 'Application', locked: true, username: Rails.configuration.x.local_domain)
|
Account.create!(id: -99, actor_type: 'Application', locked: true, username: Rails.configuration.x.local_domain)
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,6 +2,14 @@ class AddInstanceActor < ActiveRecord::Migration[5.2]
|
||||||
class Account < ApplicationRecord
|
class Account < ApplicationRecord
|
||||||
# Dummy class, to make migration possible across version changes
|
# Dummy class, to make migration possible across version changes
|
||||||
validates :username, uniqueness: { scope: :domain, case_sensitive: false }
|
validates :username, uniqueness: { scope: :domain, case_sensitive: false }
|
||||||
|
|
||||||
|
before_create :generate_keys
|
||||||
|
|
||||||
|
def generate_keys
|
||||||
|
keypair = OpenSSL::PKey::RSA.new(2048)
|
||||||
|
self.private_key = keypair.to_pem
|
||||||
|
self.public_key = keypair.public_key.to_pem
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def up
|
def up
|
||||||
|
|
|
@ -33,6 +33,11 @@ namespace :tests do
|
||||||
puts 'AccountConversation records not created as expected'
|
puts 'AccountConversation records not created as expected'
|
||||||
exit(1)
|
exit(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if Account.find(-99).private_key.blank?
|
||||||
|
puts 'Instance actor does not have a private key'
|
||||||
|
exit(1)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
desc 'Populate the database with test data for 2.4.0'
|
desc 'Populate the database with test data for 2.4.0'
|
||||||
|
|
Loading…
Reference in a new issue