Sha256: 2d412885a944bb723496a01ef8a4b08a9af45e72f602ae426c9c95aff7626702

Contents?: true

Size: 1.99 KB

Versions: 2047

Compression:

Stored size: 1.99 KB

Contents

# frozen_string_literal: true
require_relative 'omap'
require_relative 'set'

module Psych
  class ClassLoader # :nodoc:
    BIG_DECIMAL = 'BigDecimal'
    COMPLEX     = 'Complex'
    DATE        = 'Date'
    DATE_TIME   = 'DateTime'
    EXCEPTION   = 'Exception'
    OBJECT      = 'Object'
    PSYCH_OMAP  = 'Psych::Omap'
    PSYCH_SET   = 'Psych::Set'
    RANGE       = 'Range'
    RATIONAL    = 'Rational'
    REGEXP      = 'Regexp'
    STRUCT      = 'Struct'
    SYMBOL      = 'Symbol'

    def initialize
      @cache = CACHE.dup
    end

    def load klassname
      return nil if !klassname || klassname.empty?

      find klassname
    end

    def symbolize sym
      symbol
      sym.to_sym
    end

    constants.each do |const|
      konst = const_get const
      class_eval <<~RUBY
        def #{const.to_s.downcase}
          load #{konst.inspect}
        end
      RUBY
    end

    private

    def find klassname
      @cache[klassname] ||= resolve(klassname)
    end

    def resolve klassname
      name    = klassname
      retried = false

      begin
        path2class(name)
      rescue ArgumentError, NameError => ex
        unless retried
          name    = "Struct::#{name}"
          retried = ex
          retry
        end
        raise retried
      end
    end

    CACHE = Hash[constants.map { |const|
      val = const_get const
      begin
        [val, ::Object.const_get(val)]
      rescue
        nil
      end
    }.compact].freeze

    class Restricted < ClassLoader
      def initialize classes, symbols
        @classes = classes
        @symbols = symbols
        super()
      end

      def symbolize sym
        return super if @symbols.empty?

        if @symbols.include? sym
          super
        else
          raise DisallowedClass.new('load', 'Symbol')
        end
      end

      private

      def find klassname
        if @classes.include? klassname
          super
        else
          raise DisallowedClass.new('load', klassname)
        end
      end
    end
  end
end

Version data entries

2,047 entries across 2,047 versions & 12 rubygems

Version Path
mux_ruby-3.20.0 vendor/bundle/ruby/3.2.0/gems/psych-4.0.4/lib/psych/class_loader.rb
ory-client-1.15.12 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-client-1.15.10 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
mux_ruby-3.19.0 vendor/bundle/ruby/3.2.0/gems/psych-4.0.4/lib/psych/class_loader.rb
ory-client-1.15.7 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-client-1.15.6 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-client-1.15.5 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-client-1.15.4 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-client-1.15.3 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-client-1.15.0 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-client-1.14.5 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
mux_ruby-3.18.0 vendor/bundle/ruby/3.2.0/gems/psych-4.0.4/lib/psych/class_loader.rb
ory-client-1.14.4 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-client-1.14.3 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-client-1.14.2 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-kratos-client-1.2.1 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-client-1.14.1 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-client-1.14.0 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-hydra-client-2.2.1 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb
ory-oathkeeper-client-0.40.8 vendor/bundle/ruby/3.1.0/gems/psych-4.0.6/lib/psych/class_loader.rb