diff --git a/vendor/gems/message_bus/lib/message_bus.rb b/vendor/gems/message_bus/lib/message_bus.rb index 7b3fefc09df..514e6f2001b 100644 --- a/vendor/gems/message_bus/lib/message_bus.rb +++ b/vendor/gems/message_bus/lib/message_bus.rb @@ -10,6 +10,7 @@ require "message_bus/client" require "message_bus/connection_manager" require "message_bus/message_handler" require "message_bus/rack/middleware" +require "message_bus/rack/diagnostics" # we still need to take care of the logger if defined?(::Rails) @@ -71,19 +72,28 @@ module MessageBus::Implementation end def site_id_lookup(&blk) - @site_id_lookup ||= blk + @site_id_lookup = blk if blk + @site_id_lookup end def user_id_lookup(&blk) - @user_id_lookup ||= blk + @user_id_lookup = blk if blk + @user_id_lookup + end + + def is_admin_lookup(&blk) + @is_admin_lookup = blk if blk + @is_admin_lookup end def on_connect(&blk) - @on_connect ||= blk + @on_connect = blk if blk + @on_connect end def on_disconnect(&blk) - @on_disconnect ||= blk + @on_disconnect = blk if blk + @on_disconnect end def allow_broadcast=(val) diff --git a/vendor/gems/message_bus/lib/message_bus/rack/diagnostics.rb b/vendor/gems/message_bus/lib/message_bus/rack/diagnostics.rb new file mode 100644 index 00000000000..09426227884 --- /dev/null +++ b/vendor/gems/message_bus/lib/message_bus/rack/diagnostics.rb @@ -0,0 +1,35 @@ +module MessageBus::Rack; end + +class MessageBus::Rack::Diagnostics + def initialize(app, config = {}) + @app = app + end + + def index + html = < + + + +

Message Bus Diags

+ + +HTML + return [200, {"content-type" => "text/html;"}, html] + end + + def call(env) + + return @app.call(env) unless env['PATH_INFO'].start_with? '/message-bus/_diagnostics' + + route = env['PATH_INFO'].split('/message_bus/_diagnostics')[1] + + if MessageBus.is_admin_lookup.nil? || !MessageBus.is_admin_lookup.call + return [403, {}, ["not allowed"]] + end + + return index unless route + + return [404, {}, ["not found"]] + end +end diff --git a/vendor/gems/message_bus/lib/message_bus/rack/middleware.rb b/vendor/gems/message_bus/lib/message_bus/rack/middleware.rb index 7f9e0ec402f..f240266a4f0 100644 --- a/vendor/gems/message_bus/lib/message_bus/rack/middleware.rb +++ b/vendor/gems/message_bus/lib/message_bus/rack/middleware.rb @@ -46,6 +46,11 @@ class MessageBus::Rack::Middleware return [200,{"Content-Type" => "text/html"},["sent"]] end + if env['PATH_INFO'].start_with? '/message-bus/_diagnostics' + diags = MessageBus::Rack::Diagnostics.new(@app) + return diags.call(env) + end + client_id = env['PATH_INFO'].split("/")[2] return [404, {}, ["not found"]] unless client_id diff --git a/vendor/gems/message_bus/spec/lib/middleware_spec.rb b/vendor/gems/message_bus/spec/lib/middleware_spec.rb index 1d7bd279797..65306cf5c65 100644 --- a/vendor/gems/message_bus/spec/lib/middleware_spec.rb +++ b/vendor/gems/message_bus/spec/lib/middleware_spec.rb @@ -107,11 +107,22 @@ describe MessageBus::Rack::Middleware do ensure MessageBus.long_polling_interval = 5000 end - - end end + describe "diagnostics" do + + it "should return a 403 if a user attempts to get at the _diagnostics path" do + get "/message-bus/_diagnostics" + last_response.status.should == 403 + end + + it "should get a 200 with html for an authorized user" do + MessageBus.stub(:is_admin_lookup).and_return(lambda{ true }) + get "/message-bus/_diagnostics" + last_response.status.should == 200 + end + end describe "polling" do before do