diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-05-19 15:44:42 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-05-19 15:44:42 +0000 |
commit | 4555e1b21c365ed8303ffb7a3325d773c9b8bf31 (patch) | |
tree | 5423a1c7516cffe36384133ade12572cf709398d /lib/declarative_policy.rb | |
parent | e570267f2f6b326480d284e0164a6464ba4081bc (diff) | |
download | gitlab-ce-4555e1b21c365ed8303ffb7a3325d773c9b8bf31.tar.gz |
Add latest changes from gitlab-org/gitlab@13-12-stable-eev13.12.0-rc42
Diffstat (limited to 'lib/declarative_policy.rb')
-rw-r--r-- | lib/declarative_policy.rb | 112 |
1 files changed, 0 insertions, 112 deletions
diff --git a/lib/declarative_policy.rb b/lib/declarative_policy.rb deleted file mode 100644 index bd1c121fe79..00000000000 --- a/lib/declarative_policy.rb +++ /dev/null @@ -1,112 +0,0 @@ -# frozen_string_literal: true - -require_dependency 'declarative_policy/cache' -require_dependency 'declarative_policy/condition' -require_dependency 'declarative_policy/delegate_dsl' -require_dependency 'declarative_policy/policy_dsl' -require_dependency 'declarative_policy/rule_dsl' -require_dependency 'declarative_policy/preferred_scope' -require_dependency 'declarative_policy/rule' -require_dependency 'declarative_policy/runner' -require_dependency 'declarative_policy/step' - -require_dependency 'declarative_policy/base' - -module DeclarativePolicy - extend PreferredScope - - CLASS_CACHE_MUTEX = Mutex.new - CLASS_CACHE_IVAR = :@__DeclarativePolicy_CLASS_CACHE - - class << self - def policy_for(user, subject, opts = {}) - cache = opts[:cache] || {} - key = Cache.policy_key(user, subject) - - cache[key] ||= - # to avoid deadlocks in multi-threaded environment when - # autoloading is enabled, we allow concurrent loads, - # https://gitlab.com/gitlab-org/gitlab-foss/issues/48263 - ActiveSupport::Dependencies.interlock.permit_concurrent_loads do - class_for(subject).new(user, subject, opts) - end - end - - def class_for(subject) - return GlobalPolicy if subject == :global - return NilPolicy if subject.nil? - - subject = find_delegate(subject) - - policy_class = class_for_class(subject.class) - raise "no policy for #{subject.class.name}" if policy_class.nil? - - policy_class - end - - def has_policy?(subject) - !class_for_class(subject.class).nil? - end - - private - - # This method is heavily cached because there are a lot of anonymous - # modules in play in a typical rails app, and #name performs quite - # slowly for anonymous classes and modules. - # - # See https://bugs.ruby-lang.org/issues/11119 - # - # if the above bug is resolved, this caching could likely be removed. - def class_for_class(subject_class) - unless subject_class.instance_variable_defined?(CLASS_CACHE_IVAR) - CLASS_CACHE_MUTEX.synchronize do - # re-check in case of a race - break if subject_class.instance_variable_defined?(CLASS_CACHE_IVAR) - - policy_class = compute_class_for_class(subject_class) - subject_class.instance_variable_set(CLASS_CACHE_IVAR, policy_class) - end - end - - subject_class.instance_variable_get(CLASS_CACHE_IVAR) - end - - def compute_class_for_class(subject_class) - if subject_class.respond_to?(:declarative_policy_class) - return subject_class.declarative_policy_class.constantize - end - - subject_class.ancestors.each do |klass| - name = klass.name - - next unless name - - begin - policy_class = "#{name}Policy".constantize - - # NOTE: the < operator here tests whether policy_class - # inherits from Base. We can't use #is_a? because that - # tests for *instances*, not *subclasses*. - return policy_class if policy_class < Base - rescue NameError - nil - end - end - - nil - end - - def find_delegate(subject) - seen = Set.new - - while subject.respond_to?(:declarative_policy_delegate) - raise ArgumentError, "circular delegations" if seen.include?(subject.object_id) - - seen << subject.object_id - subject = subject.declarative_policy_delegate - end - - subject - end - end -end |