Sha256: f1e9180831c319a9f93e24708ae00ea80b9919b3ae9b02874172fd2bac4e29f5

Contents?: true

Size: 1.44 KB

Versions: 14

Compression:

Stored size: 1.44 KB

Contents

module Safemode
  class Scope < Blankslate
    def initialize(delegate = nil, delegate_methods = [])
      @delegate = delegate        
      @delegate_methods = delegate_methods
      @locals = {}
    end
    
    def bind(instance_vars = {}, locals = {}, &block)
      @locals = symbolize_keys(locals) # why can't I just pull them to local scope in the same way like instance_vars?
      instance_vars = symbolize_keys(instance_vars)
      instance_vars.each {|key, obj| eval "@#{key} = instance_vars[:#{key}]" }
      @_safemode_output = ''
      binding
    end
  
    def to_jail
      self
    end
    
    def puts(*args)
      print args.to_s + "\n"
    end

    def print(*args)      
      @_safemode_output += args.to_s
    end
    
    def output
      @_safemode_output
    end

    def method_missing(method, *args, &block)
      if @locals.has_key?(method)
        @locals[method]
      elsif @delegate_methods.include?(method)
        @delegate.send method, *unjail_args(args), &block
      else
        raise Safemode::SecurityError.new(method, "#<Safemode::ScopeObject>")
      end
    end
    
    private
    
      def symbolize_keys(hash)
        hash.inject({}) do |hash, (key, value)| 
          hash[key.to_s.intern] = value
          hash
        end
      end
    
      def unjail_args(args)
        args.collect do |arg|        
          arg.class.name =~ /::Jail$/ ? arg.instance_variable_get(:@source) : arg
        end
      end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
safemode-1.3.7 lib/safemode/scope.rb
safemode-1.3.6 lib/safemode/scope.rb
safemode-1.3.5 lib/safemode/scope.rb
safemode-1.3.4 lib/safemode/scope.rb
safemode-1.3.3 lib/safemode/scope.rb
safemode-1.3.2 lib/safemode/scope.rb
safemode-1.3.1 lib/safemode/scope.rb
safemode-1.2.5 lib/safemode/scope.rb
safemode-1.2.4 lib/safemode/scope.rb
safemode-1.2.3 lib/safemode/scope.rb
safemode-1.2.2 lib/safemode/scope.rb
safemode-1.2.1 lib/safemode/scope.rb
safemode-1.2.0 lib/safemode/scope.rb
safemode-1.1.0 lib/safemode/scope.rb