change StoredFile.create interface
[coquelicot.git] / lib / coquelicot / app.rb
index d9cd169..961c5b4 100644 (file)
@@ -1,3 +1,20 @@
+# Coquelicot: "one-click" file sharing with a focus on users' privacy.
+# Copyright © 2010-2012 potager.org <jardiniers@potager.org>
+#           © 2011 mh / immerda.ch <mh+coquelicot@immerda.ch>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
 require 'lockfile'
 require 'sinatra/base'
 require 'sinatra/config_file'
@@ -71,13 +88,12 @@ module Coquelicot
         not_found
       end
       @expire_at = file.expire_at
-      @base = request.url.gsub(/\/ready\/[^\/]*$/, '')
       @name = "#{link}"
       unless pass.nil?
         @name << "-#{pass}"
         @unprotected = true
       end
-      @url = "#{@base}/#{@name}"
+      @url = uri(@name)
       haml :ready
     end
 
@@ -127,16 +143,17 @@ module Coquelicot
         pass = params[:file_key]
       end
       src = params[:file][:tempfile]
+      src.rewind
       link = Coquelicot.depot.add_file(
-         src, pass,
+         pass,
          { "Expire-at" => expire_at.to_i,
            "One-time-only" => one_time_only,
            "Filename" => params[:file][:filename],
            "Length" => src.stat.size,
            "Content-Type" => params[:file][:type],
-         })
-      redirect "ready/#{link}-#{pass}" if params[:file_key].nil? or params[:file_key].empty?
-      redirect "ready/#{link}"
+         }) { src.eof? ? nil : src.read }
+      redirect to("/ready/#{link}-#{pass}") if params[:file_key].nil? or params[:file_key].empty?
+      redirect to("/ready/#{link}")
     end
 
     def expired
@@ -196,19 +213,8 @@ module Coquelicot
     end
 
     helpers do
-      def base_href
-        url = request.scheme + "://"
-        url << request.host
-        if request.scheme == "https" && request.port != 443 ||
-            request.scheme == "http" && request.port != 80
-          url << ":#{request.port}"
-        end
-        url << request.script_name
-        "#{url}/"
-      end
-
       def clone_url
-        settings.respond_to?(:clone_url) ? settings.clone_url : "#{base_href}coquelicot.git"
+        settings.respond_to?(:clone_url) ? settings.clone_url : uri('coquelicot.git')
       end
 
       def authenticate(params)