improve compatibility with Ruby 1.9.1 or later
authorLunar <lunar@anargeek.net>
Tue, 20 Mar 2012 11:27:40 +0000 (12:27 +0100)
committerLunar <lunar@anargeek.net>
Thu, 14 Mar 2013 09:12:09 +0000 (10:12 +0100)
30 files changed:
Gemfile.lock
coquelicot.gemspec
lib/coquelicot.rb
lib/coquelicot/app.rb
lib/coquelicot/auth.rb
lib/coquelicot/auth/imap.rb
lib/coquelicot/auth/simplepass.rb
lib/coquelicot/depot.rb
lib/coquelicot/helpers.rb
lib/coquelicot/jyraphe_migrator.rb
lib/coquelicot/num.rb
lib/coquelicot/rack/multipart_parser.rb
lib/coquelicot/rack/upload.rb
lib/coquelicot/stored_file.rb
lib/coquelicot/version.rb
spec/coquelicot/app_spec.rb
spec/coquelicot/depot_spec.rb
spec/coquelicot/jyraphe_migrator_spec.rb
spec/coquelicot/rack/multipart_parser_spec.rb
spec/coquelicot/rack/upload_spec.rb
spec/coquelicot/stored_file_spec.rb
spec/coquelicot_spec.rb
spec/spec_helper.rb
views/auth/imap.haml
views/enter_file_key.haml
views/expired.haml
views/index.haml
views/layout.haml
views/ready.haml
views/style.sass

index 08b353f..dc85cec 100644 (file)
@@ -6,7 +6,7 @@ PATH
       haml (~> 3.1)
       haml-magic-translations (~> 0.3)
       json
-      lockfile
+      lockfile (~> 2.0)
       maruku
       multipart-parser
       rack (~> 1.1)
@@ -45,7 +45,7 @@ GEM
     json (1.6.5)
     kgio (2.7.2)
     locale (2.0.5)
-    lockfile (1.4.3)
+    lockfile (2.1.0)
     maruku (0.6.0)
       syntax (>= 1.0.0)
     mime-types (1.17.2)
index b81d583..b003618 100644 (file)
@@ -58,7 +58,7 @@ Gem::Specification.new do |s|
   s.add_runtime_dependency 'sass'
   s.add_runtime_dependency 'maruku'
   s.add_runtime_dependency 'fast_gettext'
-  s.add_runtime_dependency 'lockfile'
+  s.add_runtime_dependency 'lockfile', '~>2.0'
   s.add_runtime_dependency 'json'
   s.add_runtime_dependency 'rainbows'
   s.add_runtime_dependency 'multipart-parser'
index ef8cf6f..9b03863 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # 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>
index 1353276..e71c7fe 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # 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>
index c1138f1..7f45f52 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2012 potager.org <jardiniers@potager.org>
 #           © 2011 mh / immerda.ch <mh+coquelicot@immerda.ch>
index d59fc09..45239c6 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2012 potager.org <jardiniers@potager.org>
 #           © 2011 mh / immerda.ch <mh+coquelicot@immerda.ch>
index f2c56f0..948a37c 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2012 potager.org <jardiniers@potager.org>
 #           © 2011 mh / immerda.ch <mh+coquelicot@immerda.ch>
index 61f868b..e8c2713 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2010-2012 potager.org <jardiniers@potager.org>
 #
index df00742..cfcb09b 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # 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>
index 2f5849f..8eac432 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2010-2012 potager.org <jardiniers@potager.org>
 #
index a5970f2..560b804 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2012 potager.org <jardiniers@potager.org>
 #
index 4799e7f..a1ae382 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2012 potager.org <jardiniers@potager.org>
 #
index 2f9603d..1ff9cd1 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2012 potager.org <jardiniers@potager.org>
 #
index 7b53864..c30a7ef 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2010-2012 potager.org <jardiniers@potager.org>
 #
@@ -44,6 +45,8 @@ module Coquelicot
     end
 
     def self.create(path, pass, meta)
+      YAML::ENGINE.yamler = 'syck' if YAML.const_defined? :ENGINE
+
       salt = gen_salt
       clear_meta = { "Coquelicot" => COQUELICOT_VERSION,
                      "Salt" => Base64.encode64(salt).strip,
@@ -136,6 +139,7 @@ module Coquelicot
   private
 
     YAML_START = "--- \n"
+    YAML_START_RE = /^---( |\n)/
     CIPHER = 'AES-256-CBC'
     SALT_LEN = 8
     COQUELICOT_VERSION = '2.0'
@@ -158,6 +162,8 @@ module Coquelicot
     end
 
     def initialize(path, pass)
+      YAML::ENGINE.yamler = 'syck' if YAML.const_defined? :ENGINE
+
       @path = path
       @file = File.open(@path)
       if @file.lstat.size == 0 then
@@ -165,7 +171,7 @@ module Coquelicot
         return
       end
 
-      if YAML_START != (buf = @file.read(YAML_START.length)) then
+      unless YAML_START_RE =~ (buf = @file.readline)
         raise ArgumentError.new("unknown file, read #{buf.inspect}")
       end
       parse_clear_meta
@@ -179,7 +185,7 @@ module Coquelicot
 
     def parse_clear_meta
       meta = ''
-      until YAML_START == (line = @file.readline) do
+      until YAML_START_RE =~ (line = @file.readline) do
         meta += line
       end
       @meta = YAML.load(meta)
@@ -187,7 +193,11 @@ module Coquelicot
       unless @features
         raise ArgumentError.new('unknown file')
       end
-      @expire_at = Time.at(@meta['Expire-at'])
+      if @meta['Expire-at'].respond_to? :to_time
+        @expire_at = @meta['Expire-at'].to_time
+      else
+        @expire_at = Time.at(@meta['Expire-at'])
+      end
     end
 
     def init_decrypt_cipher(pass)
@@ -201,7 +211,7 @@ module Coquelicot
       begin
         content = @cipher.update(@file.read)
         content << @cipher.final
-        raise BadKey.new unless content.start_with? YAML_START
+        raise BadKey.new unless content =~ YAML_START_RE
         content
       rescue OpenSSL::Cipher::CipherError
         raise BadKey.new
@@ -214,7 +224,7 @@ module Coquelicot
       begin
         content = @cipher.update(buf)
         content << @cipher.final if @file.eof?
-        raise BadKey.new unless content.start_with? YAML_START
+        raise BadKey.new unless content =~ YAML_START_RE
       rescue OpenSSL::Cipher::CipherError
         raise BadKey.new
       end
index 36fda16..61bad28 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # 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>
index bf63f8c..f83bc4e 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2010-2012 potager.org <jardiniers@potager.org>
 #
index cca3abe..e3336b2 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2010-2012 potager.org <jardiniers@potager.org>
 #
index 3b495be..a9a504e 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2010-2012 potager.org <jardiniers@potager.org>
 #
index 85fa23a..7a0bfb8 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2012 potager.org <jardiniers@potager.org>
 #
@@ -292,7 +293,7 @@ module Coquelicot::Rack
                 data << buf until (buf = reader.call).nil?
               end
             end
-            data.should == File.read(file)
+            data.should == slurp(file)
           end
         end
       end
@@ -329,7 +330,7 @@ module Coquelicot::Rack
               end
               p.field(:field3)
             end
-            data.should == File.read(file)
+            data.should == slurp(file)
           end
         end
       end
@@ -374,8 +375,8 @@ module Coquelicot::Rack
                 data2 << buf until (buf = reader.call).nil?
               end
             end
-            data1.should == File.read(file1)
-            data2.should == File.read(file2)
+            data1.should == slurp(file1)
+            data2.should == slurp(file2)
           end
         end
       end
index 96791bb..f828d15 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2012 potager.org <jardiniers@potager.org>
 #
@@ -132,7 +133,7 @@ MULTIPART_DATA
             filename = File.basename(file)
             Coquelicot.depot.should_receive(:add_file).
                 with(file_key, hash_including('Filename' => filename)).
-                and_yield(file_content).and_yield(nil)
+                and_yield.and_yield
             subject
           end
           it 'should increment the depot size' do
index fbd199a..c6a765f 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2010-2012 potager.org <jardiniers@potager.org>
 #
@@ -37,7 +38,7 @@ module Coquelicot
         @src_length = File.stat(@src).size
         meta = { 'Expire-at' => 0 }
         meta.merge!(extra_meta)
-        content = File.read(@src)
+        content = slurp(@src)
         StoredFile.create(@stored_file_path, @pass, meta) do
           buf, content = content, nil
           buf
@@ -166,7 +167,7 @@ module Coquelicot
       end
       context 'in metadata file, clear part' do
         let(:test_salt) { "\0" * StoredFile::SALT_LEN }
-        let(:expire_at) { Time.now + 60 }
+        let(:expire_at) { Time.at(Time.now.to_i + 60) } # we need to round it at second-level
         before(:each) do
           StoredFile.stub(:gen_salt).and_return(test_salt)
           create_stored_file('Expire-at' => expire_at)
@@ -233,10 +234,10 @@ module Coquelicot
           create_stored_file
         end
         it 'should contain the file content' do
-          @cipher.content.should == File.read(@src)
+          @cipher.content.should == slurp(@src)
         end
         it 'should have the whole file for encrypted content' do
-          @content.string == File.read(@src)
+          @content.string == slurp(@src)
         end
       end
       context 'when the given block raise an error' do
@@ -339,7 +340,7 @@ module Coquelicot
           Dir.glob("#{@stored_file_path}*").each do |path|
             File.should_receive(:open) do |*args, &block|
               length = File.stat(path).size
-              file = StringIO.new(File.read(path))
+              file = StringIO.new(slurp(path))
               block.call(file)
               file.string.should == "\0" * length
             end
@@ -425,7 +426,7 @@ module Coquelicot
             another = StoredFile.open(@stored_file_path, @pass)
             buf = ''
             another.each { |data| buf << data }
-            buf.should == File.read(@src)
+            buf.should == slurp(@src)
           end
         end
         context 'when the file has been fully sent' do
index 5e6bcde..5d9949f 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2010-2012 potager.org <jardiniers@potager.org>
 #
@@ -66,7 +67,7 @@ Content-Disposition: form-data; name="#{name}"; filename="#{Rack::Utils.escape(v
 Content-Type: #{value.content_type}\r
 Content-Length: #{::File.stat(value.path).size}\r
 \r
-#{File.open(value.path).read}\r
+#{slurp(value.path)}\r
 PART
       else
         <<-PART
@@ -149,7 +150,7 @@ PART
         it "should be the same file as the uploaded" do
           last_response.should be_ok
           last_response['Content-Type'].should eql('text/x-script.ruby')
-          last_response.body.should eql(File.new(__FILE__).read)
+          last_response.body.should == slurp(__FILE__)
         end
 
         it "should have sent the right Content-Length" do
@@ -228,7 +229,7 @@ PART
       it "should be the same as the uploaded file" do
         last_response.should be_ok
         last_response['Content-Type'].should eql('text/x-script.ruby')
-        last_response.body.should eql(File.new(__FILE__).read)
+        last_response.body.should == slurp(__FILE__)
       end
 
       it "should not be downloadable any more" do
@@ -266,7 +267,7 @@ PART
           post @url, :file_key => 'somethingSecret'
           last_response.should be_ok
           last_response['Content-Type'].should eql('text/x-script.ruby')
-          last_response.body.should eql(File.new(__FILE__).read)
+          last_response.body.should == slurp(__FILE__)
         end
       end
 
index c394b23..887c902 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: UTF-8 -*-
 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
 # Copyright © 2010-2012 potager.org <jardiniers@potager.org>
 #
@@ -88,6 +89,16 @@ module CoquelicotSpecHelpers
     end
     result.string
   end
+
+  if defined? Encoding
+    def slurp(path)
+      File.read(path, :encoding => 'binary')
+    end
+  else
+    def slurp(path)
+      File.read(path)
+    end
+  end
 end
 
 ::RSpec.configure do |c|
index c7ed2ac..1faccb5 100644 (file)
@@ -1,3 +1,4 @@
+-# -*- coding: UTF-8 -*-
 -# Coquelicot: "one-click" file sharing with a focus on users' privacy.
 -# Copyright © 2012 potager.org <jardiniers@potager.org>
 -#           © 2011 mh / immerda.ch <mh+coquelicot@immerda.ch>
index 3e4870e..2c3b23d 100644 (file)
@@ -1,3 +1,4 @@
+-# -*- coding: UTF-8 -*-
 -# Coquelicot: "one-click" file sharing with a focus on users' privacy.
 -# Copyright © 2010 potager.org <jardiniers@potager.org>
 -#
index 3f28a5d..9379929 100644 (file)
@@ -1,3 +1,4 @@
+-# -*- coding: UTF-8 -*-
 -# Coquelicot: "one-click" file sharing with a focus on users' privacy.
 -# Copyright © 2010 potager.org <jardiniers@potager.org>
 -#
index 5775f02..17fb21a 100644 (file)
@@ -1,3 +1,4 @@
+-# -*- coding: UTF-8 -*-
 -# 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>
index b601512..3dd2428 100644 (file)
@@ -1,3 +1,4 @@
+-# -*- coding: UTF-8 -*-
 -# 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>
index 14cb6fa..f6eff04 100644 (file)
@@ -1,3 +1,4 @@
+-# -*- coding: UTF-8 -*-
 -# Coquelicot: "one-click" file sharing with a focus on users' privacy.
 -# Copyright © 2010 potager.org <jardiniers@potager.org>
 -#
index d6a41a7..122b0d3 100644 (file)
@@ -1,3 +1,4 @@
+@charset "utf-8"
 /*
  * Coquelicot: "one-click" file sharing with a focus on users' privacy.
  * Copyright © 2010-2012 potager.org <jardiniers@potager.org>