Refactor the extraction and generation of GPG subkeys
This commit is contained in:
		
							parent
							
								
									328f4a505b
								
							
						
					
					
						commit
						d0572d9aad
					
				|  | @ -20,8 +20,7 @@ class GpgKey < ActiveRecord::Base | ||||||
|     format: { |     format: { | ||||||
|       with: /\A#{KEY_PREFIX}((?!#{KEY_PREFIX})(?!#{KEY_SUFFIX}).)+#{KEY_SUFFIX}\Z/m, |       with: /\A#{KEY_PREFIX}((?!#{KEY_PREFIX})(?!#{KEY_SUFFIX}).)+#{KEY_SUFFIX}\Z/m, | ||||||
|       message: "is invalid. A valid public GPG key begins with '#{KEY_PREFIX}' and ends with '#{KEY_SUFFIX}'" |       message: "is invalid. A valid public GPG key begins with '#{KEY_PREFIX}' and ends with '#{KEY_SUFFIX}'" | ||||||
|     }, |     } | ||||||
|     unless: :parent_id? |  | ||||||
| 
 | 
 | ||||||
|   validates :fingerprint, |   validates :fingerprint, | ||||||
|     presence: true, |     presence: true, | ||||||
|  | @ -37,9 +36,9 @@ class GpgKey < ActiveRecord::Base | ||||||
|     # the error about the fingerprint |     # the error about the fingerprint | ||||||
|     unless: -> { errors.has_key?(:key) } |     unless: -> { errors.has_key?(:key) } | ||||||
| 
 | 
 | ||||||
|   before_validation :extract_fingerprint, :extract_primary_keyid, unless: :parent_id? |   before_validation :extract_fingerprint, :extract_primary_keyid | ||||||
|   after_commit :update_invalid_gpg_signatures, on: :create |   after_commit :update_invalid_gpg_signatures, on: :create | ||||||
|   after_save :generate_subkeys, unless: :parent_id? |   after_create :generate_subkeys | ||||||
| 
 | 
 | ||||||
|   def primary_keyid |   def primary_keyid | ||||||
|     super&.upcase |     super&.upcase | ||||||
|  | @ -49,10 +48,6 @@ class GpgKey < ActiveRecord::Base | ||||||
|     super&.upcase |     super&.upcase | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def key |  | ||||||
|     parent_id? ? parent.key : super |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def key=(value) |   def key=(value) | ||||||
|     super(value&.strip) |     super(value&.strip) | ||||||
|   end |   end | ||||||
|  | @ -119,13 +114,7 @@ class GpgKey < ActiveRecord::Base | ||||||
|     gpg_subkeys = Gitlab::Gpg.subkeys_from_key(key) |     gpg_subkeys = Gitlab::Gpg.subkeys_from_key(key) | ||||||
| 
 | 
 | ||||||
|     gpg_subkeys[primary_keyid].each do |subkey_data| |     gpg_subkeys[primary_keyid].each do |subkey_data| | ||||||
|       unless subkeys.where(fingerprint: subkey_data[:fingerprint]).exists? |       subkeys.create!(keyid: subkey_data[:keyid], fingerprint: subkey_data[:fingerprint]) | ||||||
|         subkeys.create!( |  | ||||||
|           user: user, |  | ||||||
|           primary_keyid: subkey_data[:keyid], |  | ||||||
|           fingerprint: subkey_data[:fingerprint] |  | ||||||
|         ) |  | ||||||
|       end |  | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -43,12 +43,7 @@ module Gitlab | ||||||
|         raw_keys.each_with_object(grouped_subkeys).each do |raw_key, subkeys| |         raw_keys.each_with_object(grouped_subkeys).each do |raw_key, subkeys| | ||||||
|           primary_subkey_id = raw_key.primary_subkey.keyid |           primary_subkey_id = raw_key.primary_subkey.keyid | ||||||
| 
 | 
 | ||||||
|           raw_key.subkeys.each do |subkey| |           raw_key.subkeys[1..-1].each do |subkey| | ||||||
|             # Skip if current subkey is a master key |  | ||||||
|             next if primary_subkey_id == subkey.keyid |  | ||||||
|             # Skip if it isn't a sign key |  | ||||||
|             next if subkey.capability.exclude?(:sign) |  | ||||||
| 
 |  | ||||||
|             subkeys[primary_subkey_id] << { keyid: subkey.keyid, fingerprint: subkey.fingerprint } |             subkeys[primary_subkey_id] << { keyid: subkey.keyid, fingerprint: subkey.fingerprint } | ||||||
|           end |           end | ||||||
|         end |         end | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue