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
shrike
Claire 2022-04-26 21:22:09 +02:00 committed by GitHub
parent f47a9ddc9f
commit 33cd80d69c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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'