use a lightbox when available to enter upload password
authorLunar <lunar@anargeek.net>
Sun, 29 Aug 2010 16:04:48 +0000 (18:04 +0200)
committerLunar <lunar@anargeek.net>
Sun, 29 Aug 2010 16:04:48 +0000 (18:04 +0200)
coquelicot_app.rb
public/javascripts/coquelicot.js
test_coquelicot.rb
views/index.haml
views/style.sass

index 432d164..3bdde0f 100644 (file)
@@ -50,6 +50,14 @@ get '/ready/:link' do |link|
   haml :ready
 end
 
+post '/authenticate' do
+  pass unless request.xhr?
+  unless password_match? params[:upload_password] then
+    error 403, "Forbidden"
+  end
+  'OK'
+end
+
 post '/upload' do
   unless password_match? params[:upload_password] then
     error 403
index 8e7e438..f84caa4 100644 (file)
@@ -46,4 +46,37 @@ $(document).ready(function() {
       link.remove();
     });
   });
+
+  var authForm = $('<form></form>')
+  var authDiv = $('#upload-authentication').remove();
+  var lb = $.lightBoxFu;
+  authForm.bind('submit', function() {
+    var uploadPassword = $('#upload_password');
+    jQuery.ajax({
+      type: 'POST',
+      url: 'authenticate',
+      dataType: 'text',
+      data: { upload_password: uploadPassword.val() },
+      complete: function(res, status) {
+        if (status === 'success') {
+          var hiddenField = $('<input type="hidden" name="upload_password" />');
+          hiddenField.val(uploadPassword.val());
+          $('#upload').append(hiddenField);
+          lb.close();
+        } else if (res.responseText == 'Forbidden') {
+          $('#auth-message').text('Please try again!');
+        } else {
+          $('#auth-message').text('Error: ' + alert(status));
+        }
+        uploadPassword.val('');
+      }
+    });
+    return false;
+  });
+  lb.open({
+    html: authForm.append(authDiv).append('<div id="auth-message"></div>'),
+    width: "300px",
+    closeOnClick: false
+  });
+  $('#upload_password').focus();
 });
index b210ec1..298e1c5 100644 (file)
@@ -78,6 +78,18 @@ describe 'Coquelicot' do
     last_response.status.should eql(403)
   end
 
+  it "should allow AJAX upload password verification" do
+    request "/authenticate", :method => "POST", :xhr => true,
+                             :params => { :upload_password => UPLOAD_PASSWORD }
+    last_response.should be_ok
+    request "/authenticate", :method => "POST", :xhr => true,
+                             :params => { :upload_password => '' }
+    last_response.status.should eql(403)
+    request "/authenticate", :method => "POST", :xhr => true,
+                             :params => { :upload_password => 'wrong' }
+    last_response.status.should eql(403)
+  end
+
   it "should not store an uploaded file in cleartext" do
     upload
     files = Dir.glob("#{Coquelicot.depot.path}/*")
index 319c878..6ae63d5 100644 (file)
@@ -3,9 +3,10 @@
   .error= @error
 %form#upload{ :enctype => 'multipart/form-data',
               :action  => 'upload', :method => 'post' }
-  .field
-    %label{ :for => 'upload_password' } Upload password:
-    %input.input{ :type => 'password', :id => 'upload_password', :name => 'upload_password' }
+  #upload-authentication
+    .field
+      %label{ :for => 'upload_password' } Upload password:
+      %input.input{ :type => 'password', :id => 'upload_password', :name => 'upload_password' }
   .field
     %label{ :for => 'file' } File:
     %input.input{ :type => 'file', :id => 'file', :name => 'file' }
index 8eee5fd..3f343c9 100644 (file)
@@ -81,6 +81,11 @@ h1
   width: 0px
   height: 19px
 
+#auth-message
+  clear: both
+  color: red
+  text-align: center
+
 #footer
   margin-top: 7em
   padding-top: 1em