Class: Ci::JobToken::Allowlist

Inherits:
Object
  • Object
show all
Includes:
Gitlab::Utils::StrongMemoize
Defined in:
app/models/ci/job_token/allowlist.rb

Instance Method Summary collapse

Constructor Details

#initialize(source_project, direction: :inbound) ⇒ Allowlist



8
9
10
11
# File 'app/models/ci/job_token/allowlist.rb', line 8

def initialize(source_project, direction: :inbound)
  @source_project = source_project
  @direction = direction
end

Instance Method Details

#add!(target_project, user:, default_permissions: true, policies: []) ⇒ Object



36
37
38
39
40
41
42
43
44
45
# File 'app/models/ci/job_token/allowlist.rb', line 36

def add!(target_project, user:, default_permissions: true, policies: [])
  Ci::JobToken::ProjectScopeLink.create!(
    source_project: @source_project,
    direction: @direction,
    target_project: target_project,
    added_by: user,
    default_permissions: default_permissions,
    job_token_policies: policies
  )
end

#add_group!(target_group, user:, default_permissions: true, policies: []) ⇒ Object



47
48
49
50
51
52
53
54
55
# File 'app/models/ci/job_token/allowlist.rb', line 47

def add_group!(target_group, user:, default_permissions: true, policies: [])
  Ci::JobToken::GroupScopeLink.create!(
    source_project: @source_project,
    target_group: target_group,
    added_by: user,
    default_permissions: default_permissions,
    job_token_policies: policies
  )
end

#autopopulated_group_global_idsObject



71
72
73
# File 'app/models/ci/job_token/allowlist.rb', line 71

def autopopulated_group_global_ids
  group_links.autopopulated.map { |link| link.target_group.to_global_id }.uniq
end

#autopopulated_project_global_idsObject



67
68
69
# File 'app/models/ci/job_token/allowlist.rb', line 67

def autopopulated_project_global_ids
  project_links.autopopulated.map { |link| link.target_project.to_global_id }.uniq
end

#bulk_add_groups!(target_groups, user:, autopopulated: false, policies: []) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'app/models/ci/job_token/allowlist.rb', line 104

def bulk_add_groups!(target_groups, user:, autopopulated: false, policies: [])
  now = Time.zone.now

  groups = target_groups.map do |target_group|
    Ci::JobToken::GroupScopeLink.new(
      source_project_id: @source_project.id,
      target_group: target_group,
      autopopulated: autopopulated,
      added_by: user,
      job_token_policies: policies,
      created_at: now
    )
  end

  Ci::JobToken::GroupScopeLink.bulk_insert!(groups)
end

#bulk_add_projects!(target_projects, user:, autopopulated: false, policies: []) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'app/models/ci/job_token/allowlist.rb', line 86

def bulk_add_projects!(target_projects, user:, autopopulated: false, policies: [])
  now = Time.zone.now

  projects = target_projects.map do |target_project|
    Ci::JobToken::ProjectScopeLink.new(
      source_project_id: @source_project.id,
      target_project: target_project,
      autopopulated: autopopulated,
      added_by: user,
      job_token_policies: policies,
      direction: @direction,
      created_at: now
    )
  end

  Ci::JobToken::ProjectScopeLink.bulk_insert!(projects)
end


63
64
65
# File 'app/models/ci/job_token/allowlist.rb', line 63

def group_link_traversal_ids
  group_links.includes(:target_group).map { |g| g.target_group.traversal_ids }
end


81
82
83
84
# File 'app/models/ci/job_token/allowlist.rb', line 81

def group_links
  Ci::JobToken::GroupScopeLink
    .with_source(@source_project)
end

#groupsObject



32
33
34
# File 'app/models/ci/job_token/allowlist.rb', line 32

def groups
  ::Group.id_in(group_links.pluck(:target_group_id))
end

#includes_group?(target_project) ⇒ Boolean



19
20
21
# File 'app/models/ci/job_token/allowlist.rb', line 19

def includes_group?(target_project)
  group_links_for_target(target_project).any?
end

#includes_project?(target_project) ⇒ Boolean



13
14
15
16
17
# File 'app/models/ci/job_token/allowlist.rb', line 13

def includes_project?(target_project)
  project_links
    .with_target(target_project)
    .exists?
end

#nearest_scope_for_target_project(target_project) ⇒ Object



23
24
25
26
# File 'app/models/ci/job_token/allowlist.rb', line 23

def nearest_scope_for_target_project(target_project)
  project_links.with_target(target_project).first ||
    group_links_for_target(target_project).first
end


57
58
59
60
61
# File 'app/models/ci/job_token/allowlist.rb', line 57

def project_link_traversal_ids
  project_links.includes(target_project: :project_namespace).map do |p|
    p.target_project.project_namespace.traversal_ids
  end
end


75
76
77
78
79
# File 'app/models/ci/job_token/allowlist.rb', line 75

def project_links
  Ci::JobToken::ProjectScopeLink
    .with_source(@source_project)
    .where(direction: @direction)
end

#projectsObject



28
29
30
# File 'app/models/ci/job_token/allowlist.rb', line 28

def projects
  Project.from_union(target_projects, remove_duplicates: false)
end