diff options
Diffstat (limited to 'db')
-rw-r--r-- | db/migrate/20171002161539_create_gpg_key_subkeys_for_existing_gpg_keys.rb | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/db/migrate/20171002161539_create_gpg_key_subkeys_for_existing_gpg_keys.rb b/db/migrate/20171002161539_create_gpg_key_subkeys_for_existing_gpg_keys.rb new file mode 100644 index 00000000000..355fbfbbede --- /dev/null +++ b/db/migrate/20171002161539_create_gpg_key_subkeys_for_existing_gpg_keys.rb @@ -0,0 +1,59 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateGpgKeySubkeysForExistingGpgKeys < ActiveRecord::Migration + disable_ddl_transaction! + + DOWNTIME = false + + class GpgKey < ActiveRecord::Base + self.table_name = 'gpg_keys' + + include EachBatch + include ShaAttribute + + sha_attribute :primary_keyid + sha_attribute :fingerprint + + has_many :subkeys, class_name: 'GpgKeySubkey' + end + + class GpgKeySubkey < ActiveRecord::Base + self.table_name = 'gpg_key_subkeys' + + include ShaAttribute + + sha_attribute :keyid + sha_attribute :fingerprint + end + + def up + GpgKey.each_batch do |batch| + batch.each do |gpg_key| + create_subkeys(gpg_key) && update_signatures(gpg_key) + end + end + end + + def down + end + + private + + def create_subkeys(gpg_key) + gpg_subkeys = Gitlab::Gpg.subkeys_from_key(gpg_key.key) + + gpg_subkeys[gpg_key.primary_keyid.upcase]&.each do |subkey_data| + gpg_key.subkeys.build(keyid: subkey_data[:keyid], fingerprint: subkey_data[:fingerprint]) + end + + # Improve latency by doing all INSERTs in a single call + GpgKey.transaction do + gpg_key.save! + end + end + + def update_signatures(gpg_key) + InvalidGpgSignatureUpdateWorker.perform_async(gpg_key.id) + end +end |