Class: Gitlab::SignedTag

Inherits:
Object
  • Object
show all
Includes:
Utils::StrongMemoize
Defined in:
lib/gitlab/signed_tag.rb

Direct Known Subclasses

Gpg::Tag, Gitlab::Ssh::Tag, X509::Tag

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(repository, context) ⇒ SignedTag

Returns a new instance of SignedTag.



50
51
52
53
# File 'lib/gitlab/signed_tag.rb', line 50

def initialize(repository, context)
  @repository = repository
  @context = context
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



55
56
57
# File 'lib/gitlab/signed_tag.rb', line 55

def context
  @context
end

#repositoryObject (readonly)

Returns the value of attribute repository.



55
56
57
# File 'lib/gitlab/signed_tag.rb', line 55

def repository
  @repository
end

Class Method Details

.batch_read_cached_signatures(project, signed_tags) ⇒ Object



32
33
34
35
36
37
38
# File 'lib/gitlab/signed_tag.rb', line 32

def batch_read_cached_signatures(project, signed_tags)
  signed_tags.group_by(&:signature_class).flat_map do |klass, signed_tags|
    next [] unless klass

    klass.by_project(project).by_object_name(signed_tags.map(&:object_name))
  end
end

.batch_write_cached_signatures(signed_tags, timeout: GitalyClient.fast_timeout) ⇒ Object



40
41
42
43
44
45
46
47
# File 'lib/gitlab/signed_tag.rb', line 40

def batch_write_cached_signatures(signed_tags, timeout: GitalyClient.fast_timeout)
  signed_tags.each { |st| st.signature_data(timeout: timeout) }
  new_cached_signatures = signed_tags.filter_map(&:build_cached_signature)
  new_cached_signatures.group_by(&:class).flat_map do |klass, tag_signatures|
    klass.bulk_insert!(tag_signatures)
  end
  new_cached_signatures
end

.class_for_signature_type(signature_type) ⇒ Object



13
14
15
16
17
18
19
20
21
22
# File 'lib/gitlab/signed_tag.rb', line 13

def class_for_signature_type(signature_type)
  case signature_type
  when :PGP
    Gitlab::Gpg::Tag
  when :X509
    Gitlab::X509::Tag
  when :SSH
    Gitlab::Ssh::Tag
  end
end

.context_from_tag(tag) ⇒ Object



24
25
26
27
28
29
30
# File 'lib/gitlab/signed_tag.rb', line 24

def context_from_tag(tag)
  {
    user_email: tag.user_email,
    id: tag.id,
    has_signature: tag.has_signature?
  }
end

.from_repository_tag(repository, tag) ⇒ Object



8
9
10
11
# File 'lib/gitlab/signed_tag.rb', line 8

def from_repository_tag(repository, tag)
  klass = class_for_signature_type(tag.signature_type)
  klass&.new(repository, klass.context_from_tag(tag))
end

Instance Method Details

#attributesObject



104
# File 'lib/gitlab/signed_tag.rb', line 104

def attributes; end

#build_cached_signatureObject



96
97
98
99
100
101
102
# File 'lib/gitlab/signed_tag.rb', line 96

def build_cached_signature
  attrs = attributes
  return if attrs.nil?

  now = Time.now.utc
  signature_class.new(attrs.merge(created_at: now, updated_at: now))
end

#lazy_cached_signature(timeout: GitalyClient.fast_timeout) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/gitlab/signed_tag.rb', line 72

def lazy_cached_signature(timeout: GitalyClient.fast_timeout)
  BatchLoader.for(self).batch(key: @repository.container.id) do |signed_tags, loader, args|
    tags_by_id = signed_tags.group_by(&:object_name)
    cache_hits = Set.new

    # Read previously cached signatures
    cached_signatures = Gitlab::SignedTag.batch_read_cached_signatures(args[:key], signed_tags)
    cached_signatures.each do |tag_signature|
      cache_hits.add(tag_signature.object_name)
      loader.call(tags_by_id[tag_signature.object_name].first, tag_signature)
    end

    # Write signatures that were previously not cached
    cache_misses = signed_tags.reject { |t| cache_hits.include?(t.object_name) }
    new_cached_signatures = Gitlab::SignedTag.batch_write_cached_signatures(cache_misses,
      timeout: timeout)
    new_cached_signatures.each do |tag_signature|
      loader.call(tags_by_id[tag_signature.object_name].first, tag_signature)
    end
  end
end

#object_nameObject



57
58
59
# File 'lib/gitlab/signed_tag.rb', line 57

def object_name
  @context[:id]
end

#signatureObject



68
69
70
# File 'lib/gitlab/signed_tag.rb', line 68

def signature
  return unless context[:has_signature]
end

#signature_classObject



94
# File 'lib/gitlab/signed_tag.rb', line 94

def signature_class; end

#signature_data(timeout: GitalyClient.fast_timeout) ⇒ Object



61
62
63
64
65
66
# File 'lib/gitlab/signed_tag.rb', line 61

def signature_data(timeout: GitalyClient.fast_timeout)
  return unless @repository

  @signature_data ||= Gitlab::Git::Tag.extract_signature_lazily(@repository, object_name,
    timeout: timeout)
end

#signature_textObject



106
107
108
# File 'lib/gitlab/signed_tag.rb', line 106

def signature_text
  signature_data&.fetch(0)
end

#signed_textObject



110
111
112
# File 'lib/gitlab/signed_tag.rb', line 110

def signed_text
  signature_data&.fetch(1)
end