also protect requests other than POST /upload from too much input
authorLunar <lunar@anargeek.net>
Tue, 28 Feb 2012 22:40:22 +0000 (23:40 +0100)
committerLunar <lunar@anargeek.net>
Thu, 14 Mar 2013 09:12:08 +0000 (10:12 +0100)
lib/coquelicot/app.rb
spec/coquelicot/app_spec.rb

index 9a1992d..a3f4f49 100644 (file)
@@ -25,6 +25,7 @@ require 'digest/sha1'
 require 'fast_gettext'
 require 'upr'
 require 'moneta/memory'
+require 'rainbows'
 
 module Coquelicot
   class << self
@@ -38,10 +39,6 @@ module Coquelicot
   end
 
   class Application < Sinatra::Base
-    set :upr_backend, Upr::Monitor.new(Moneta::Memory.new)
-    use Upr, :backend => upr_backend, :path_info => %q{/upload}
-    use Coquelicot::Rack::Upload
-
     register Sinatra::ConfigFile
     register Coquelicot::Auth::Extension
 
@@ -60,6 +57,14 @@ module Coquelicot
 
     config_file File.expand_path('../../../conf/settings.yml', __FILE__)
 
+    set :upr_backend, Upr::Monitor.new(Moneta::Memory.new)
+    if defined?(Rainbows) && !Rainbows.server.nil? && !Rainbows.server.rewindable_input
+      use Upr, :backend => upr_backend, :path_info => %q{/upload}
+    end
+    use Coquelicot::Rack::Upload
+    # limit requests other than upload to an input body of 5 kiB max
+    use Rainbows::MaxBody, 5 * 1024
+
     FastGettext.add_text_domain 'coquelicot', :path => 'po', :type => 'po'
     FastGettext.available_locales = [ 'en', 'fr', 'de' ]
     Haml::MagicTranslations.enable(:fast_gettext)
index d4d9c35..834fd78 100644 (file)
@@ -18,6 +18,7 @@ require 'spec_helper'
 require 'capybara/dsl'
 
 describe Coquelicot::Application do
+  include Rack::Test::Methods
   include Capybara::DSL
   Capybara.app = Coquelicot::Application
 
@@ -42,4 +43,17 @@ describe Coquelicot::Application do
       find('h1').should have_content(title)
     end
   end
+
+  describe 'post /authenticate' do
+    context 'when given a request with too much input' do
+      before do
+        # README is bigger than 5 kiB
+        path = File.expand_path('../../../README', __FILE__)
+        post '/authenticate', :file => Rack::Test::UploadedFile.new(path, 'text/plain')
+      end
+      it 'should get status 413 (Request entity too large)' do
+        last_response.status.should == 413
+      end
+    end
+  end
 end