From 006f4aeec0fd7c97f198f115008e63f7f9fec0f7 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Sun, 14 Aug 2011 16:05:28 -0400 Subject: [PATCH] add ripl multi-line evaluation --- lib/rack/webconsole.rb | 1 + lib/rack/webconsole/repl.rb | 22 ++------------- lib/rack/webconsole/shell.rb | 53 ++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 20 deletions(-) create mode 100644 lib/rack/webconsole/shell.rb diff --git a/lib/rack/webconsole.rb b/lib/rack/webconsole.rb index d5e9faa..20009c3 100644 --- a/lib/rack/webconsole.rb +++ b/lib/rack/webconsole.rb @@ -3,6 +3,7 @@ require 'rack/webconsole/asset_helpers' require 'rack/webconsole/assets' require 'rack/webconsole/sandbox' +require 'rack/webconsole/shell' require 'rack/webconsole/railtie' if defined?(Rails::Railtie) diff --git a/lib/rack/webconsole/repl.rb b/lib/rack/webconsole/repl.rb index 1181663..96cd00d 100644 --- a/lib/rack/webconsole/repl.rb +++ b/lib/rack/webconsole/repl.rb @@ -67,26 +67,8 @@ def call(env) return [status, headers, response] unless check_legitimate(req) - result = begin - $sandbox ||= Sandbox.new - - # Force conversion to symbols due to issues with lovely 1.8.7 - boilerplate = local_variables.map(&:to_sym) + [:ls] - - result = $sandbox.instance_eval """ - result = (#{params['query']}) - ls = (local_variables.map(&:to_sym) - [#{boilerplate.map(&:inspect).join(', ')}]) - @locals ||= {} - @locals.update(ls.inject({}) do |hash, value| - hash.update({value => eval(value.to_s)}) - end) - result - """ - - result.inspect - rescue=>e - "Error: " + e.message - end + $sandbox ||= Sandbox.new + result = Shell.eval_query params['query'] response_body = MultiJson.encode(:result => result) headers = {} headers['Content-Type'] = 'application/json' diff --git a/lib/rack/webconsole/shell.rb b/lib/rack/webconsole/shell.rb new file mode 100644 index 0000000..36e58d8 --- /dev/null +++ b/lib/rack/webconsole/shell.rb @@ -0,0 +1,53 @@ +require 'ripl' + +class Rack::Webconsole + module Shell + def self.eval_query(query) + Ripl.shell.input = query + Ripl.shell.loop_once + Ripl.shell.return_result + end + + def get_input + history << @input + @input + end + + def loop_eval(query) + # Force conversion to symbols due to issues with lovely 1.8.7 + boilerplate = local_variables.map(&:to_sym) + [:ls] + + $sandbox.instance_eval """ + result = (#{query}) + ls = (local_variables.map(&:to_sym) - [#{boilerplate.map(&:inspect).join(', ')}]) + @locals ||= {} + @locals.update(ls.inject({}) do |hash, value| + hash.update({value => eval(value.to_s)}) + end) + result + """ + end + + def print_eval_error(err) + @result = "Error: " + err.message + end + + def return_result + @error_raised ? result : result.inspect + end + + # Disable unused callbacks + def print_result(result) end + def before_loop() end + end +end + +# Disable readline's #get_input +Ripl.config[:readline] = false +# Let ripl users detect web shells +Ripl.config[:web] = true +Ripl::Shell.include Rack::Webconsole::Shell +# must come after Webconsole plugin +require 'ripl/multi_line' +# Initialize ripl plugins +Ripl.shell.before_loop