implement 'should not allow retrieval of a password protected file with a wrong password'
authorLunar <lunar@anargeek.net>
Sun, 1 Aug 2010 22:50:44 +0000 (00:50 +0200)
committerLunar <lunar@anargeek.net>
Sun, 1 Aug 2010 22:50:44 +0000 (00:50 +0200)
coquelicot.rb
test_coquelicot.rb

index 325c515..2288494 100644 (file)
@@ -17,6 +17,8 @@ set :lockfile_options, { :timeout => 60,
                          :refresh => 2,
                          :debug   => false }
 
+class BadKey < StandardError; end
+
 class StoredFile
   attr_reader :meta
 
@@ -106,7 +108,7 @@ private
     yaml = ''
     buf = @file.read(BUFFER_LEN)
     content = @cipher.update(buf)
-    raise "bad key" unless content.start_with? YAML_START
+    raise BadKey unless content.start_with? YAML_START
     yaml << YAML_START
     block = content.split(YAML_START, 3)
     yaml << block[1]
@@ -326,7 +328,11 @@ end
 post '/:link' do |link|
   pass = params[:file_key]
   return 403 if pass.nil? or pass.empty?
-  return 403 unless send_stored_file(link, pass)
+  begin
+    return 403 unless send_stored_file(link, pass)
+  rescue BadKey => ex
+    403
+  end
 end
 
 helpers do
index f7f15c1..88659c3 100644 (file)
@@ -149,7 +149,20 @@ describe 'Coquelicot' do
     last_response.status.should eql(403)
   end
 
-  it "should not allow retrieval of a password protected file with a wrong password"
+  it "should not allow retrieval of a password protected file with a wrong password" do
+    post '/upload', 'file' => Rack::Test::UploadedFile.new(__FILE__, 'text/x-script.ruby'),
+                    'file_key' => 'somethingSecret',
+                    'upload_password' => UPLOAD_PASSWORD
+    last_response.redirect?.should be_true
+    follow_redirect!
+    last_response.should be_ok
+    doc = Hpricot(last_response.body)
+    url = (doc/'a').collect { |a| a.attributes['href'] }.
+      select { |h| h.start_with? "http://#{last_request.host}/" }[0]
+    get url
+    post url, 'file_key' => 'BAD'
+    last_response.status.should eql(403)
+  end
 
   it "should not allow retrieval after the time limit has expired"