public
Description: A library for safe evaluation of Ruby code based on ParseTree/RubyParser and Ruby2Ruby. Provides Rails ActionView template handlers for ERB and Haml.
Homepage: http://www.artweb-design.de
Clone URL: git://github.com/svenfuchs/safemode.git
commit  9af90112548bc5be5b897cd94e67e3cd374cef9b
tree    92baabf119d93cf56593b3638ec365d83546c331
parent  65c892659674bab0a90303df7414ae8a0b7dae8b
name age message
file LICENCSE Tue Apr 29 06:41:54 -0700 2008 Initial commit [svenfuchs]
file README.markdown Tue Apr 29 07:59:42 -0700 2008 Markdown formatting in README [svenfuchs]
file demo.rb Tue Apr 29 06:41:54 -0700 2008 Initial commit [svenfuchs]
file init.rb Sat May 03 09:48:05 -0700 2008 patch ActionView to allow conditional template ... [svenfuchs]
directory lib/ Sat May 03 12:28:41 -0700 2008 add optional parameters filename and line to Sa... [svenfuchs]
directory test/ Tue Apr 29 06:41:54 -0700 2008 Initial commit [svenfuchs]
README.markdown

Safemode

A library for safe evaluation of Ruby code based on ParseTree/RubyParser and Ruby2Ruby. Provides Rails ActionView template handlers for ERB and Haml.

Word of warning

This library is still highly experimental. Only use it at your own risk for anything beyond experiments and playing.

That said, please *do* play with it, read and run the unit tests and provide feedback to help make it waterproof and finally suitable for serious purposes.

Usage

For manual evaluation of Ruby code and ERB templates see demo.rb

You can use the ActionView template handlers by registering them, e.g., in a config/initializer file like so:

# in config/intializer/safemode_tempate_handlers.rb
ActionView::Base.register_template_handler :serb, ActionView::TemplateHandlers::SafeErb
ActionView::Base.register_template_handler :haml, ActionView::TemplateHandlers::SafeHaml

If you register the ERB template handler for the file extension :erb be aware that this most probably will break when your application tries to render an error message in development mode (because Rails will try to use the handler to render the error message itself).

You will then have to "whitelist" all method calls to the objects that are registered as template variables by explicitely allowing access to them. You can do that by defining a Safemode::Jail class for your classes, like so:

class User
  class Jail < Safemode::Jail
    allow :name
  end
end

This will allow your template users to access the name method on your User objects.

For more details about the concepts behind Safemode please refer to the following blog posts until a more comprehensive writeup is available:

Dependencies

Requires the gems:

  • either ParseTree or RubyParser
  • Ruby2Ruby

RubyParser has the advantage of being pure Ruby and not having any further system dependencies while ParseTree is is a C extension that uses RubyInline.

As of writing RubyParser alters StringIO and thus breaks usage with Rails. See http://www.zenspider.com/pipermail/parsetree/2008-April/000026.html

A patch is included that fixes this issue and can be applied to RubyParser. See lib/ruby_parser_string_io_patch.diff

Credits

  • Sven Fuchs - Maintainer
  • Peter Cooper

This code and all of the Safemode library's code was initially written by Sven Fuchs to allow Haml to have a safe mode. It was then modified and re-structured by Peter Cooper and Sven Fuchs to extend the idea to generic Ruby eval situations.