89 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| # Gitlab::VisibilityLevelChecker verifies that:
 | |
| #   - Current @project.visibility_level is not restricted
 | |
| #   - Override visibility param is not restricted
 | |
| #     - @see https://docs.gitlab.com/ee/api/project_import_export.html#import-a-file
 | |
| #
 | |
| # @param current_user [User] Current user object to verify visibility level against
 | |
| # @param project [Project] Current project that is being created/imported
 | |
| # @param project_params [Hash] Supplementary project params (e.g. import
 | |
| # params containing visibility override)
 | |
| #
 | |
| # @example
 | |
| #   user = User.find(2)
 | |
| #   project = Project.last
 | |
| #   project_params = {:import_data=>{:data=>{:override_params=>{"visibility"=>"public"}}}}
 | |
| #   level_checker = Gitlab::VisibilityLevelChecker.new(user, project, project_params: project_params)
 | |
| #
 | |
| #   project_visibility = level_checker.level_restricted?
 | |
| #   => #<Gitlab::VisibilityEvaluationResult:0x00007fbe16ee33c0 @restricted=true, @visibility_level=20>
 | |
| #
 | |
| #   if project_visibility.restricted?
 | |
| #     deny_visibility_level(project, project_visibility.visibility_level)
 | |
| #   end
 | |
| #
 | |
| # @return [VisibilityEvaluationResult] Visibility evaluation result. Responds to:
 | |
| # #restricted - boolean indicating if level is restricted
 | |
| # #visibility_level - integer of restricted visibility level
 | |
| #
 | |
| module Gitlab
 | |
|   class VisibilityLevelChecker
 | |
|     def initialize(current_user, project, project_params: {})
 | |
|       @current_user   = current_user
 | |
|       @project        = project
 | |
|       @project_params = project_params
 | |
|     end
 | |
| 
 | |
|     def level_restricted?
 | |
|       return VisibilityEvaluationResult.new(true, override_visibility_level_value) if override_visibility_restricted?
 | |
|       return VisibilityEvaluationResult.new(true, project.visibility_level) if project_visibility_restricted?
 | |
| 
 | |
|       VisibilityEvaluationResult.new(false, nil)
 | |
|     end
 | |
| 
 | |
|     private
 | |
| 
 | |
|     attr_reader :current_user, :project, :project_params
 | |
| 
 | |
|     def override_visibility_restricted?
 | |
|       return unless import_data
 | |
|       return unless override_visibility_level
 | |
|       return if Gitlab::VisibilityLevel.allowed_for?(current_user, override_visibility_level_value)
 | |
| 
 | |
|       true
 | |
|     end
 | |
| 
 | |
|     def project_visibility_restricted?
 | |
|       return if Gitlab::VisibilityLevel.allowed_for?(current_user, project.visibility_level)
 | |
| 
 | |
|       true
 | |
|     end
 | |
| 
 | |
|     def import_data
 | |
|       @import_data ||= project_params[:import_data]
 | |
|     end
 | |
| 
 | |
|     def override_visibility_level
 | |
|       @override_visibility_level ||= import_data.deep_symbolize_keys.dig(:data, :override_params, :visibility)
 | |
|     end
 | |
| 
 | |
|     def override_visibility_level_value
 | |
|       @override_visibility_level_value ||= Gitlab::VisibilityLevel.level_value(override_visibility_level)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   class VisibilityEvaluationResult
 | |
|     attr_reader :visibility_level
 | |
| 
 | |
|     def initialize(restricted, visibility_level)
 | |
|       @restricted = restricted
 | |
|       @visibility_level = visibility_level
 | |
|     end
 | |
| 
 | |
|     def restricted?
 | |
|       @restricted
 | |
|     end
 | |
|   end
 | |
| end
 |