summaryrefslogtreecommitdiff
path: root/lib/gitlab/background_migration/fix_pages_access_level.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/background_migration/fix_pages_access_level.rb')
-rw-r--r--lib/gitlab/background_migration/fix_pages_access_level.rb128
1 files changed, 0 insertions, 128 deletions
diff --git a/lib/gitlab/background_migration/fix_pages_access_level.rb b/lib/gitlab/background_migration/fix_pages_access_level.rb
deleted file mode 100644
index 8e46021bd93..00000000000
--- a/lib/gitlab/background_migration/fix_pages_access_level.rb
+++ /dev/null
@@ -1,128 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module BackgroundMigration
- # corrects stored pages access level on db depending on project visibility
- class FixPagesAccessLevel
- # Copy routable here to avoid relying on application logic
- module Routable
- def build_full_path
- if parent && path
- parent.build_full_path + '/' + path
- else
- path
- end
- end
- end
-
- # Namespace
- class Namespace < ActiveRecord::Base
- self.table_name = 'namespaces'
- self.inheritance_column = :_type_disabled
-
- include Routable
-
- belongs_to :parent, class_name: "Namespace"
- end
-
- # Project
- class Project < ActiveRecord::Base
- self.table_name = 'projects'
- self.inheritance_column = :_type_disabled
-
- include Routable
-
- belongs_to :namespace
- alias_method :parent, :namespace
- alias_attribute :parent_id, :namespace_id
-
- PRIVATE = 0
- INTERNAL = 10
- PUBLIC = 20
-
- def pages_deployed?
- Dir.exist?(public_pages_path)
- end
-
- def public_pages_path
- File.join(pages_path, 'public')
- end
-
- def pages_path
- # TODO: when we migrate Pages to work with new storage types, change here to use disk_path
- File.join(Settings.pages.path, build_full_path)
- end
- end
-
- # ProjectFeature
- class ProjectFeature < ActiveRecord::Base
- include ::EachBatch
-
- self.table_name = 'project_features'
-
- belongs_to :project
-
- PRIVATE = 10
- ENABLED = 20
- PUBLIC = 30
- end
-
- def perform(start_id, stop_id)
- fix_public_access_level(start_id, stop_id)
-
- make_internal_projects_public(start_id, stop_id)
-
- fix_private_access_level(start_id, stop_id)
- end
-
- private
-
- def access_control_is_enabled
- @access_control_is_enabled = Gitlab.config.pages.access_control
- end
-
- # Public projects are allowed to have only enabled pages_access_level
- # which is equivalent to public
- def fix_public_access_level(start_id, stop_id)
- project_features(start_id, stop_id, ProjectFeature::PUBLIC, Project::PUBLIC).each_batch do |features|
- features.update_all(pages_access_level: ProjectFeature::ENABLED)
- end
- end
-
- # If access control is disabled and project has pages deployed
- # project will become unavailable when access control will become enabled
- # we make these projects public to avoid negative surprise to user
- def make_internal_projects_public(start_id, stop_id)
- return if access_control_is_enabled
-
- project_features(start_id, stop_id, ProjectFeature::ENABLED, Project::INTERNAL).find_each do |project_feature|
- next unless project_feature.project.pages_deployed?
-
- project_feature.update(pages_access_level: ProjectFeature::PUBLIC)
- end
- end
-
- # Private projects are not allowed to have enabled access level, only `private` and `public`
- # If access control is enabled, these projects currently behave as if they have `private` pages_access_level
- # if access control is disabled, these projects currently behave as if they have `public` pages_access_level
- # so we preserve this behaviour for projects with pages already deployed
- # for project without pages we always set `private` access_level
- def fix_private_access_level(start_id, stop_id)
- project_features(start_id, stop_id, ProjectFeature::ENABLED, Project::PRIVATE).find_each do |project_feature|
- if access_control_is_enabled
- project_feature.update!(pages_access_level: ProjectFeature::PRIVATE)
- else
- fixed_access_level = project_feature.project.pages_deployed? ? ProjectFeature::PUBLIC : ProjectFeature::PRIVATE
- project_feature.update!(pages_access_level: fixed_access_level)
- end
- end
- end
-
- def project_features(start_id, stop_id, pages_access_level, project_visibility_level)
- ProjectFeature.where(id: start_id..stop_id).joins(:project)
- .where(pages_access_level: pages_access_level)
- .where(projects: { visibility_level: project_visibility_level })
- end
- end
- end
-end