domingo, 29 de noviembre de 2009

Sandbox de codigo ruby

La semana pasada empece el desarrollo de una libreria de ruby que permita crear "sandbox" de codigo ruby

Un sandbox (traducido literalmente del ingles como "caja de arena") es un entorno "protegido" que permite ejecutar programas de una manera en la que no es posible que estos programas afecten a lo que esta "afuera" del sandbox (Por ej: ejecutar un programa de manera que no pueda tener acceso al sistema de archivos de la computadora en la que se esta ejecutando)
Enlace
Para el caso particular de ruby, cuando se da, por ejemplo, el caso del desarrollo de una plataforma que ejecuta dinamicamente codigo enviado por muchos usuarios... es esperable que este codigo no pueda acceder al sistema de archivos o a la bases de datos de la aplicacion (el caso de una aplicacion Rails). En ese caso un "sandbox" que encierre al codigo en su ejecucion restringiria la ejecucion de codigo no deseado.

En lo que se ve a simple vista en la web, no hay mucho desarrollo al respecto... y lo que hay pareciera ser plugins algo mas especificos de rails como acts_as_runnable_code. Es por eso que comence el proyecto arena-ruby-sandbox, que define la posibilidad de ejecutar el codigo asi:




require "sandbox"

class X
def foo(a)
print "foo(#{a})\n"

# estoy afuera del sandbox, por lo tanto puedo
# hacer cosas "privilegiadas" como crear archivos
# cosa que no puede hacerse desde adentro del sandbox
File.open("foo.txt") do |f|
f.write "foo(#{a})\n"
end

a+5
end

def foo_no_invocable
print "foo_no_invocable\n"
end
end

# instanciar el sandbox
s = Sandbox::Sandbox.new

x = X.new

s.serivice_provider = x
# indica que el metodo foo se puede ejecutar desde adentro del sandbox
s.permit :foo

print s.run("2+2") # => 4

print s.run("foo(2)") # => 7 (y escribe el archivo foo.txt con "foo(2)" )

print s.run("foo_no_invocable") # => NoMethodError (nunca se especifico que foo_no_invocable se podia invocar)

s.run("
File.open('foo.txt') do |f|
f.write \"foo\n\"
end
") # => NameError: uninitialized constant File
# ( la clase File no existe adentro del sandbox
# no se puede acceder al filesystem desde el sandbox
links

http://arena-ruby-sandbox.googlecode.com

martes, 24 de noviembre de 2009

Autocarga perversa

Textualmente, la rdoc del core de ruby, dice asi:

mod.const_missing(sym) => obj

Invoked when a reference is made to an undefined constant in mod. It is passed a symbol for the undefined constant, and returns a value to be used for that constant. The following code is a (very bad) example: if reference is made to an undefined constant, it attempts to load a file whose name is the lowercase version of the constant (thus class Fred is assumed to be in file fred.rb). If found, it returns the value of the loaded class. It therefore implements a perverse kind of autoload facility.


def Object.const_missing(name)
@looked_for ||= {}
str_name = name.to_s
raise "Class not found: #{name}" if @looked_for[str_name]
@looked_for[str_name] = 1
file = str_name.downcase
require file
klass = const_get(name)
return klass if klass
raise "Class not found: #{name}"
end


Esa funcion puede utilizarse para implementar "alguna clase perversa de mecanismo de autocarga", para citar un ejemplo, rails lo utiliza como parte de su funcionamiento habitual para recargar las clases automaticamente sin necesidad de reiniciar el servidor ni ejecutar ningun comando explicito (¿rails = perversion?, esto me emociona).

links

http://ruby-doc.org/core/classes/Module.html#M001693

http://www.google.com.ar/search?q=%22It+therefore+implements+a+perverse+kind+of+autoload+facility%22

domingo, 22 de noviembre de 2009

Web-Base Real Time Syntax Highlighting

Codepress es un editor de codigo fuente, que funciona 100% en javascript (del lado del browser) haciendolo muy simple de instalar y utilizar, por ejemplo, pueden editar el siguiente fragmento de codigo:

NOTA: puede que el highlighting no sea tan "automagico", pero seguro se refresca cada vez que se teclean las comillas dobles... despues cualquier cosa se investiga mas la herramienta...

NOTA2: Todavia no pude hacer andar bien el editor en el contexto del blog... pero al final estan todos los links a las paginas de prueba que muestran todo el potencial de la herramienta



Pagina de demo de codepress: http://bobdawg.org/codepress/
Descarga del paquete: http://sourceforge.net/projects/codepress/files/codepress/codepress-v.0.9.6/
Mi pagina de prueba: http://codepress-test.coolpage.biz/codepress/prueba.html