Class MultiTkIp
In: tk/lib/remote-tk.rb
tk/lib/multi-tk.rb
Parent: Object

remove methods for security

Methods

_DEFAULT_MASTER   _IP_TABLE   _TK_TABLE_LIST   __create_safe_slave_obj   __create_trusted_slave_obj   __eval   __getip   __init_ip_env__   __invoke   __pseudo_toplevel   __pseudo_toplevel   __pseudo_toplevel=   __pseudo_toplevel=   __pseudo_toplevel_evaluable=   __pseudo_toplevel_evaluable=   __pseudo_toplevel_evaluable?   __pseudo_toplevel_evaluable?   _add_new_tables   _add_tk_procs   _conv_listelement   _conv_listelement   _create_console   _create_slave_object   _default_delete_hook   _destroy_slaves_of_slaveIP   _eval   _eval   _eval_with_enc   _eval_with_enc   _eval_without_enc   _eval_without_enc   _fromUTF8   _fromUTF8   _get_global_var   _get_global_var   _get_global_var2   _get_global_var2   _get_variable   _get_variable   _get_variable2   _get_variable2   _init_ip_env   _init_ip_internal   _invoke   _invoke   _invoke_with_enc   _invoke_with_enc   _invoke_without_enc   _invoke_without_enc   _ip_id_   _ip_id_   _is_master_of?   _make_menu_embeddable   _make_menu_embeddable   _merge_tklist   _merge_tklist   _receiver_mainloop   _remove_tk_procs   _return_value   _return_value   _set_global_var   _set_global_var   _set_global_var2   _set_global_var2   _set_variable   _set_variable   _set_variable2   _set_variable2   _split_tklist   _split_tklist   _thread_tkwait   _thread_tkwait   _thread_vwait   _thread_vwait   _tk_cmd_tbl   _tk_table_list   _tk_windows   _toUTF8   _toUTF8   _unset_global_var   _unset_global_var   _unset_global_var2   _unset_global_var2   _unset_variable   _unset_variable   _unset_variable2   _unset_variable2   abort   abort   add_tk_procs   alias_delete   alias_delete   alias_info   alias_info   alias_target   alias_target   aliases   aliases   alive?   alive?   allow_ruby_exit=   allow_ruby_exit=   allow_ruby_exit?   allow_ruby_exit?   assign_receiver_and_watchdog   background_call   background_call   background_eval   background_eval   background_eval_proc   background_eval_proc   background_eval_str   background_eval_str   background_eval_string   background_eval_string   bg_call   bg_call   bg_eval   bg_eval   bg_eval_proc   bg_eval_proc   bg_eval_str   bg_eval_str   bg_eval_string   bg_eval_string   bgerror   bgerror   call   call   call   cb_entry_class   cb_error   cb_eval   create_table   def_alias   def_alias   delete   delete   delete_cmd   delete_cmd   delete_slaves   delete_slaves   deleted?   deleted?   do_one_event   encoding   encoding=   encoding_convert_from   encoding_convert_to   encoding_convertfrom   encoding_convertto   eval   eval   eval_callback   eval_proc   eval_proc   eval_str   eval_str   eval_string   eval_string   exist?   exist?   exit   exit   exit!   exit!   expose_cmd   expose_cmd   get_bgerror_handler   get_cb_entry   get_eventloop_tick   get_eventloop_weight   get_limit   get_limit   get_no_event_wait   has_mainwindow?   has_mainwindow?   hidden_cmds   hidden_cmds   hide_cmd   hide_cmd   inherited   init_ip_env   init_ip_internal   inspect   inspect   invalid_namespace?   invalid_namespace?   invoke_hidden   invoke_hidden   invoke_hidden_on_global   invoke_hidden_on_global   invoke_hidden_on_namespace   invoke_hidden_on_namespace   ip_name   ip_name   mainloop   mainloop   mainloop_abort_on_exception   mainloop_abort_on_exception=   mainloop_watchdog   make_safe   make_safe   manipulable?   manipulable?   mark_trusted   mark_trusted   master?   master?   method_missing   new   new   new   new_master   new_safe_slave   new_slave   path   path   recursion_limit   recursion_limit   remove_tk_procs   restart   restart   running_mainloop?   safe?   safe?   safe_base?   safe_base?   safe_level   safe_level   safe_level=   safe_level=   safeip_add_to_access_path   safeip_configinfo   safeip_configure   safeip_delete   safeip_find_in_access_path   safeip_set_log_cmd   set_bgerror_handler   set_cb_error   set_eventloop_tick   set_eventloop_weight   set_limit   set_limit   set_no_event_wait   set_safe_level   set_safe_level   share_stderr   share_stderr   share_stdin   share_stdin   share_stdio   share_stdio   share_stdout   share_stdout   slave?   slave?   slaves   slaves   thread_eval_proc   thread_eval_proc   tk_cmd_tbl   tk_object_table   tk_windows   to_eval   to_eval   transfer_stderr   transfer_stderr   transfer_stdin   transfer_stdin   transfer_stdio   transfer_stdio   transfer_stdout   transfer_stdout   wait_on_mainloop=   wait_on_mainloop?  

Constants

BASE_DIR = File.dirname(__FILE__)

External Aliases

new -> __new
new_master -> new
new_slave -> new_trusted_slave
new_safe_slave -> new_safeTk

Attributes

cmd  [R] 
ip  [R] 
ret  [RW] 
target  [RW] 

Public Class methods

[Source]

# File tk/lib/remote-tk.rb, line 19
  def self._DEFAULT_MASTER
    # work only once
    if @flag
      @flag = nil
      @@DEFAULT_MASTER
    else
      nil
    end
  end

[Source]

# File tk/lib/remote-tk.rb, line 15
  def self._IP_TABLE; @@IP_TABLE; end

[Source]

# File tk/lib/remote-tk.rb, line 16
  def self._TK_TABLE_LIST; @@TK_TABLE_LIST; end

[Source]

# File tk/lib/multi-tk.rb, line 1324
  def self.__getip
    current = Thread.current
    if TclTkLib.mainloop_thread? != false && current['callback_ip']
      return current['callback_ip']
    end
    if current.group == ThreadGroup::Default
      @@DEFAULT_MASTER
    else
      ip = @@IP_TABLE[current.group]
      unless ip
        fail SecurityError, 
          "cannot call Tk methods on #{Thread.current.inspect}"
      end
      ip
    end
  end

[Source]

# File tk/lib/multi-tk.rb, line 867
    def self.__init_ip_env__(table, script)
      ret = []
      mtx = Mutex.new.lock
      @init_ip_env_queue.enq([mtx, ret, table, script])
      mtx.lock
      if ret[0].kind_of?(Exception)
        raise ret[0]
      else
        ret[0]
      end
    end

[Source]

# File tk/lib/multi-tk.rb, line 757
    def self.__pseudo_toplevel
      Thread.current.group == ThreadGroup::Default && 
        MultiTkIp.__getip == @@DEFAULT_MASTER &&
        self.__pseudo_toplevel_evaluable? && @pseudo_toplevel[1]
    end

[Source]

# File tk/lib/multi-tk.rb, line 763
    def self.__pseudo_toplevel=(m)
      unless (Thread.current.group == ThreadGroup::Default && 
                MultiTkIp.__getip == @@DEFAULT_MASTER)
        fail SecurityError, "no permission to manipulate"
      end

      # if m.kind_of?(Module) && m.respond_to?(:pseudo_toplevel_evaluable?)
      if m.respond_to?(:pseudo_toplevel_evaluable?)
        @pseudo_toplevel[0] = true
        @pseudo_toplevel[1] = m
      else
        fail ArgumentError, 'fail to set pseudo-toplevel'
      end
      self
    end

[Source]

# File tk/lib/multi-tk.rb, line 787
    def self.__pseudo_toplevel_evaluable=(mode)
      unless (Thread.current.group == ThreadGroup::Default && 
                MultiTkIp.__getip == @@DEFAULT_MASTER)
        fail SecurityError, "no permission to manipulate"
      end

      @pseudo_toplevel[0] = (mode)? true: false
    end

[Source]

# File tk/lib/multi-tk.rb, line 779
    def self.__pseudo_toplevel_evaluable?
      begin
        @pseudo_toplevel[0] && @pseudo_toplevel[1].pseudo_toplevel_evaluable?
      rescue Exception
        false
      end
    end

[Source]

# File tk/lib/multi-tk.rb, line 2280
  def _conv_listelement(arg)
    __getip._conv_listelement(arg)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2284
  def _create_console
    __getip._create_console
  end

[Source]

# File tk/lib/multi-tk.rb, line 2188
  def _eval(str)
    __getip._eval(str)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2204
  def _eval_with_enc(str)
    __getip._eval_with_enc(str)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2196
  def _eval_without_enc(str)
    __getip._eval_without_enc(str)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2216
  def _fromUTF8(str, encoding=nil)
    __getip._fromUTF8(str, encoding)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2251
  def _get_global_var(var)
    __getip._get_global_var(var)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2254
  def _get_global_var2(var, idx)
    __getip._get_global_var2(var, idx)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2232
  def _get_variable(var, flag)
    __getip._get_variable(var, flag)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2235
  def _get_variable2(var, idx, flag)
    __getip._get_variable2(var, idx, flag)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2192
  def _invoke(*args)
    __getip._invoke(*args)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2208
  def _invoke_with_enc(*args)
    __getip._invoke_with_enc(*args)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2200
  def _invoke_without_enc(*args)
    __getip._invoke_without_enc(*args)
  end

[Source]

# File tk/lib/multi-tk.rb, line 1316
  def self._ip_id_
    __getip._ip_id_
  end

[Source]

# File tk/lib/multi-tk.rb, line 2270
  def _make_menu_embeddable(menu_path)
    __getip._make_menu_embeddable(menu_path)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2277
  def _merge_tklist(*args)
    __getip._merge_tklist(*args)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2228
  def _return_value
    __getip._return_value
  end

[Source]

# File tk/lib/multi-tk.rb, line 2257
  def _set_global_var(var, value)
    __getip._set_global_var(var, value)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2260
  def _set_global_var2(var, idx, value)
    __getip._set_global_var2(var, idx, value)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2238
  def _set_variable(var, value, flag)
    __getip._set_variable(var, value, flag)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2241
  def _set_variable2(var, idx, value, flag)
    __getip._set_variable2(var, idx, value, flag)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2274
  def _split_tklist(str)
    __getip._split_tklist(str)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2224
  def _thread_tkwait(mode, target)
    __getip._thread_tkwait(mode, target)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2220
  def _thread_vwait(var)
    __getip._thread_vwait(var)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2212
  def _toUTF8(str, encoding=nil)
    __getip._toUTF8(str, encoding)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2263
  def _unset_global_var(var)
    __getip._unset_global_var(var)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2266
  def _unset_global_var2(var, idx)
    __getip._unset_global_var2(var, idx)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2244
  def _unset_variable(var, flag)
    __getip._unset_variable(var, flag)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2247
  def _unset_variable2(var, idx, flag)
    __getip._unset_variable2(var, idx, flag)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2165
  def abort(msg = nil)
    __getip.abort(msg)
  end

[Source]

# File tk/lib/multi-tk.rb, line 1651
  def self.add_tk_procs(name, args=nil, body=nil)
    if name.kind_of?(Array) # => an array of [name, args, body]
      name.each{|param| self.add_tk_procs(*param)}
    else
      name = name.to_s
      @@ADD_TK_PROCS << [name, args, body]
      @@IP_TABLE.each{|tg, ip| 
        ip._add_tk_procs(name, args, body)
      }
    end
  end

[Source]

# File tk/lib/multi-tk.rb, line 2792
  def self.alias_delete(slave, cmd_name)
    __getip.alias_delete(slave, cmd_name)
    self
  end

[Source]

# File tk/lib/multi-tk.rb, line 2783
  def self.alias_info(slave, cmd_name)
    __getip.alias_info(slave, cmd_name)
  end

[Source]

# File tk/lib/multi-tk.rb, line 3023
  def self.alias_target(aliascmd, slave = '')
    __getip.alias_target(aliascmd, slave)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2812
  def self.aliases(slave = '')
    __getip.aliases(slave)
  end

[Source]

# File tk/lib/multi-tk.rb, line 1472
  def self.alive?
    __getip.alive?
  end

[Source]

# File tk/lib/multi-tk.rb, line 2145
  def allow_ruby_exit= (mode)
    __getip.allow_ruby_exit = mode
  end

[Source]

# File tk/lib/multi-tk.rb, line 2141
  def allow_ruby_exit?
    __getip.allow_ruby_exit?
  end

[Source]

# File tk/lib/multi-tk.rb, line 835
    def self.assign_receiver_and_watchdog(target)
      ret = [nil]
      @assign_thread.raise(@assign_request.new(target, ret))
      while ret[0] == nil
        unless @assign_thread.alive?
          raise RuntimeError, 'lost the thread to assign a receiver and a watchdog thread'
        end
      end
      if ret[0].kind_of?(Exception)
        raise ret[0]
      else
        ret[0]
      end
    end

[Source]

# File tk/lib/multi-tk.rb, line 2071
  def bg_eval(*args, &blk)
    # class ==> interp object
    __getip.bg_eval(*args, &blk)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2044
  def bg_eval_proc(*args, &blk)
    # class ==> interp object
    __getip.bg_eval_proc(*args, &blk)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2059
  def bg_eval_string(cmd, *eval_args)
    # class ==> interp object
    __getip.bg_eval_string(cmd, *eval_args)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2965
  def self.bgerror(cmd = Proc.new, slave = nil, &b)
    __getip.bgerror(cmd, slave, &b)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2973
  def self.bgerror(slave = '')
    __getip.bgerror(slave)
  end

[Source]

# File tk/lib/multi-tk.rb, line 1683
  def self.cb_entry_class
    @@CB_ENTRY_CLASS
  end

[Source]

# File tk/lib/multi-tk.rb, line 1598
  def self.create_table
    if __getip.slave? 
      begin
        raise SecurityError, "slave-IP has no permission creating a new table"
      rescue SecurityError => e
        #p e.backtrace
        # Is called on a Ruby/Tk library?
        caller_info = e.backtrace[1]
        if caller_info =~ %r{^#{MultiTkIp::BASE_DIR}/(tk|tkextlib)/[^:]+\.rb:}
          # Probably, caller is a Ruby/Tk library  -->  allow creating
        else
          raise e
        end
      end
    end

    id = @@TK_TABLE_LIST.size
    obj = Object.new
    @@TK_TABLE_LIST << obj
    obj.instance_eval "def self.method_missing(m, *args)\nMultiTkIp.tk_object_table(\#{id}).__send__(m, *args)\nend\n"
    obj.freeze
    @@IP_TABLE.each{|tg, ip| ip._add_new_tables }
    return obj
  end

[Source]

# File tk/lib/multi-tk.rb, line 2803
  def self.def_alias(slave, new_cmd, org_cmd, *args)
    ret = __getip.def_alias(slave, new_cmd, org_cmd, *args)
    (ret == new_cmd)? self: nil
  end

[Source]

# File tk/lib/multi-tk.rb, line 2149
  def delete
    __getip.delete
  end

[Source]

# File tk/lib/multi-tk.rb, line 2842
  def self.delete_cmd(slave, cmd)
    __getip.delete_cmd(slave, cmd)
    self
  end

[Source]

# File tk/lib/multi-tk.rb, line 2822
  def self.delete_slaves(*args)
    __getip.delete_slaves(*args)
    self
  end

[Source]

# File tk/lib/multi-tk.rb, line 2153
  def deleted?
    __getip.deleted?
  end

[Source]

# File tk/lib/multi-tk.rb, line 2088
  def do_one_event(flag = TclTkLib::EventFlag::ALL)
    __getip.do_one_event(flag)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2067
  def eval(*args, &blk)
    # class ==> interp object
    __getip.eval(*args, &blk)
  end

class method

[Source]

# File tk/lib/multi-tk.rb, line 2038
  def eval_proc(*args, &blk)
    # class ==> interp object
    __getip.eval_proc(*args, &blk)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2053
  def eval_string(cmd, *eval_args)
    # class ==> interp object
    __getip.eval_string(cmd, *eval_args)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2832
  def self.exist?(slave = '')
    __getip.exist?(slave)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2169
  def exit(st = true)
    __getip.exit(st)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2173
  def exit!(st = false)
    __getip.exit!(st)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2856
  def self.expose_cmd(slave, cmd, aliasname = nil)
    __getip.expose_cmd(slave, cmd, aliasname)
    self
  end

[Source]

# File tk/lib/multi-tk.rb, line 1686
  def self.get_cb_entry(cmd)
    @@CB_ENTRY_CLASS.new(__getip, cmd).freeze
  end

[Source]

# File tk/lib/multi-tk.rb, line 2102
  def get_eventloop_tick
    __getip.get_eventloop_tick
  end

[Source]

# File tk/lib/multi-tk.rb, line 2114
  def get_eventloop_weight
    __getip.get_eventloop_weight
  end

[Source]

# File tk/lib/multi-tk.rb, line 3006
  def self.get_limit(limit_type, slave = '', slot = nil)
    __getip.get_limit(limit_type, slave, slot)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2108
  def get_no_event_wait
    __getip.get_no_event_wait
  end

[Source]

# File tk/lib/multi-tk.rb, line 2157
  def has_mainwindow?
    __getip.has_mainwindow?
  end

[Source]

# File tk/lib/multi-tk.rb, line 2879
  def self.hidden_cmds(slave = '')
    __getip.hidden_cmds(slave)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2870
  def self.hide_cmd(slave, cmd, aliasname = nil)
    __getip.hide_cmd(slave, cmd, aliasname)
    self
  end

[Source]

# File tk/lib/multi-tk.rb, line 890
  def self.inherited(subclass)
    # trust if on ThreadGroup::Default or @@DEFAULT_MASTER's ThreadGroup
    if @@IP_TABLE[Thread.current.group] == @@DEFAULT_MASTER
      begin
        class << subclass
          self.methods.each{|m|
            begin
              unless m == '__id__' || m == '__send__' || m == 'freeze'
                undef_method(m)
              end
            rescue Exception
              # ignore all exceptions
            end
          }
        end
      ensure
        subclass.freeze
        fail SecurityError, 
          "cannot create subclass of MultiTkIp on a untrusted ThreadGroup"
      end
    end
  end

[Source]

# File tk/lib/multi-tk.rb, line 1628
  def self.init_ip_env(script = Proc.new)
    @@INIT_IP_ENV << script
    if __getip.slave?
      begin
        raise SecurityError, "slave-IP has no permission initializing IP env"
      rescue SecurityError => e
        #p e.backtrace
        # Is called on a Ruby/Tk library?
        caller_info = e.backtrace[1]
        if caller_info =~ %r{^#{MultiTkIp::BASE_DIR}/(tk|tkextlib)/[^:]+\.rb:}
          # Probably, caller is a Ruby/Tk library  -->  allow creating
        else
          raise e
        end
      end
    end

    # @@IP_TABLE.each{|tg, ip| 
    #   ip._init_ip_env(script)
    # }
    @@DEFAULT_MASTER.__init_ip_env__(@@IP_TABLE, script)
  end

[Source]

# File tk/lib/multi-tk.rb, line 1675
  def self.init_ip_internal
    __getip._init_ip_internal(@@INIT_IP_ENV, @@ADD_TK_PROCS)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2161
  def invalid_namespace?
    __getip.invalid_namespace?
  end

[Source]

# File tk/lib/multi-tk.rb, line 2899
  def self.invoke_hidden(slave, cmd, *args)
    __getip.invoke_hidden(slave, cmd, *args)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2920
  def self.invoke_hidden_on_global(slave, cmd, *args)
    __getip.invoke_hidden_on_global(slave, cmd, *args)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2938
  def self.invoke_hidden_on_namespace(slave, ns, cmd, *args)
    __getip.invoke_hidden_on_namespace(slave, ns, cmd, *args)
  end

[Source]

# File tk/lib/multi-tk.rb, line 1485
  def self.ip_name
    __getip.ip_name
  end

[Source]

# File tk/lib/multi-tk.rb, line 2082
  def mainloop(check_root = true)
    __getip.mainloop(check_root)
  end

[Source]

# File tk/lib/multi-tk.rb, line 2091
  def mainloop_abort_on_exception
    # __getip.mainloop_abort_on_exception
    TclTkLib.mainloop_abort_on_exception
  end

[Source]

# File tk/lib/multi-tk.rb, line 2095
  def mainloop_abort_on_exception=(mode)
    # __getip.mainloop_abort_on_exception=(mode)
    TclTkLib.mainloop_abort_on_exception=(mode)
  end