rubyzip 1.1.7 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +137 -54
- data/Rakefile +6 -4
- data/lib/zip/central_directory.rb +17 -13
- data/lib/zip/compressor.rb +1 -2
- data/lib/zip/constants.rb +57 -5
- data/lib/zip/crypto/decrypted_io.rb +40 -0
- data/lib/zip/crypto/null_encryption.rb +4 -6
- data/lib/zip/crypto/traditional_encryption.rb +14 -14
- data/lib/zip/decompressor.rb +22 -4
- data/lib/zip/deflater.rb +8 -6
- data/lib/zip/dos_time.rb +17 -13
- data/lib/zip/entry.rb +171 -148
- data/lib/zip/entry_set.rb +16 -14
- data/lib/zip/errors.rb +3 -0
- data/lib/zip/extra_field/generic.rb +14 -13
- data/lib/zip/extra_field/ntfs.rb +18 -16
- data/lib/zip/extra_field/old_unix.rb +12 -11
- data/lib/zip/extra_field/universal_time.rb +46 -16
- data/lib/zip/extra_field/unix.rb +10 -9
- data/lib/zip/extra_field/zip64.rb +15 -12
- data/lib/zip/extra_field/zip64_placeholder.rb +1 -2
- data/lib/zip/extra_field.rb +18 -16
- data/lib/zip/file.rb +147 -115
- data/lib/zip/filesystem.rb +289 -272
- data/lib/zip/inflater.rb +24 -36
- data/lib/zip/input_stream.rb +44 -28
- data/lib/zip/ioextras/abstract_input_stream.rb +24 -17
- data/lib/zip/ioextras/abstract_output_stream.rb +4 -6
- data/lib/zip/ioextras.rb +2 -4
- data/lib/zip/null_compressor.rb +2 -2
- data/lib/zip/null_decompressor.rb +3 -11
- data/lib/zip/null_input_stream.rb +0 -0
- data/lib/zip/output_stream.rb +25 -17
- data/lib/zip/pass_thru_compressor.rb +6 -6
- data/lib/zip/pass_thru_decompressor.rb +14 -24
- data/lib/zip/streamable_directory.rb +3 -3
- data/lib/zip/streamable_stream.rb +7 -11
- data/lib/zip/version.rb +1 -1
- data/lib/zip.rb +15 -6
- data/samples/example.rb +29 -39
- data/samples/example_filesystem.rb +16 -18
- data/samples/example_recursive.rb +31 -25
- data/samples/gtk_ruby_zip.rb +84 -0
- data/samples/qtzip.rb +23 -32
- data/samples/write_simple.rb +10 -13
- data/samples/zipfind.rb +33 -40
- metadata +50 -141
- data/samples/gtkRubyzip.rb +0 -86
- data/test/basic_zip_file_test.rb +0 -64
- data/test/central_directory_entry_test.rb +0 -73
- data/test/central_directory_test.rb +0 -104
- data/test/crypto/null_encryption_test.rb +0 -53
- data/test/crypto/traditional_encryption_test.rb +0 -80
- data/test/data/WarnInvalidDate.zip +0 -0
- data/test/data/file1.txt +0 -46
- data/test/data/file1.txt.deflatedData +0 -0
- data/test/data/file2.txt +0 -1504
- data/test/data/globTest/foo/bar/baz/foo.txt +0 -0
- data/test/data/globTest/foo.txt +0 -0
- data/test/data/globTest/food.txt +0 -0
- data/test/data/globTest.zip +0 -0
- data/test/data/mimetype +0 -1
- data/test/data/notzippedruby.rb +0 -7
- data/test/data/ntfs.zip +0 -0
- data/test/data/rubycode.zip +0 -0
- data/test/data/rubycode2.zip +0 -0
- data/test/data/testDirectory.bin +0 -0
- data/test/data/zip64-sample.zip +0 -0
- data/test/data/zipWithDirs.zip +0 -0
- data/test/data/zipWithEncryption.zip +0 -0
- data/test/deflater_test.rb +0 -67
- data/test/encryption_test.rb +0 -42
- data/test/entry_set_test.rb +0 -138
- data/test/entry_test.rb +0 -165
- data/test/errors_test.rb +0 -36
- data/test/extra_field_test.rb +0 -78
- data/test/file_extract_directory_test.rb +0 -56
- data/test/file_extract_test.rb +0 -90
- data/test/file_split_test.rb +0 -60
- data/test/file_test.rb +0 -559
- data/test/filesystem/dir_iterator_test.rb +0 -62
- data/test/filesystem/directory_test.rb +0 -131
- data/test/filesystem/file_mutating_test.rb +0 -100
- data/test/filesystem/file_nonmutating_test.rb +0 -514
- data/test/filesystem/file_stat_test.rb +0 -66
- data/test/gentestfiles.rb +0 -134
- data/test/inflater_test.rb +0 -14
- data/test/input_stream_test.rb +0 -170
- data/test/ioextras/abstract_input_stream_test.rb +0 -103
- data/test/ioextras/abstract_output_stream_test.rb +0 -106
- data/test/ioextras/fake_io_test.rb +0 -18
- data/test/local_entry_test.rb +0 -156
- data/test/output_stream_test.rb +0 -129
- data/test/pass_thru_compressor_test.rb +0 -31
- data/test/pass_thru_decompressor_test.rb +0 -15
- data/test/settings_test.rb +0 -92
- data/test/test_helper.rb +0 -228
- data/test/unicode_file_names_and_comments_test.rb +0 -52
- data/test/zip64_full_test.rb +0 -53
- data/test/zip64_support_test.rb +0 -15
| @@ -24,9 +24,9 @@ module Zip | |
| 24 24 | 
             
                  end
         | 
| 25 25 | 
             
                end
         | 
| 26 26 |  | 
| 27 | 
            -
                def update_keys( | 
| 28 | 
            -
                  @key0 = ~Zlib.crc32( | 
| 29 | 
            -
                  @key1 = ((@key1 + (@key0 & 0xff)) *  | 
| 27 | 
            +
                def update_keys(num)
         | 
| 28 | 
            +
                  @key0 = ~Zlib.crc32(num, ~@key0)
         | 
| 29 | 
            +
                  @key1 = ((@key1 + (@key0 & 0xff)) * 134_775_813 + 1) & 0xffffffff
         | 
| 30 30 | 
             
                  @key2 = ~Zlib.crc32((@key1 >> 24).chr, ~@key2)
         | 
| 31 31 | 
             
                end
         | 
| 32 32 |  | 
| @@ -46,15 +46,15 @@ module Zip | |
| 46 46 | 
             
                    end
         | 
| 47 47 | 
             
                    header << (mtime.to_binary_dos_time & 0xff)
         | 
| 48 48 | 
             
                    header << (mtime.to_binary_dos_time >> 8)
         | 
| 49 | 
            -
                  end.map{|x| encode x}.pack( | 
| 49 | 
            +
                  end.map { |x| encode x }.pack('C*')
         | 
| 50 50 | 
             
                end
         | 
| 51 51 |  | 
| 52 52 | 
             
                def encrypt(data)
         | 
| 53 | 
            -
                  data.unpack( | 
| 53 | 
            +
                  data.unpack('C*').map { |x| encode x }.pack('C*')
         | 
| 54 54 | 
             
                end
         | 
| 55 55 |  | 
| 56 56 | 
             
                def data_descriptor(crc32, compressed_size, uncomprssed_size)
         | 
| 57 | 
            -
                  [0x08074b50, crc32, compressed_size, uncomprssed_size].pack( | 
| 57 | 
            +
                  [0x08074b50, crc32, compressed_size, uncomprssed_size].pack('VVVV')
         | 
| 58 58 | 
             
                end
         | 
| 59 59 |  | 
| 60 60 | 
             
                def reset!
         | 
| @@ -63,10 +63,10 @@ module Zip | |
| 63 63 |  | 
| 64 64 | 
             
                private
         | 
| 65 65 |  | 
| 66 | 
            -
                def encode( | 
| 66 | 
            +
                def encode(num)
         | 
| 67 67 | 
             
                  t = decrypt_byte
         | 
| 68 | 
            -
                  update_keys( | 
| 69 | 
            -
                  t ^  | 
| 68 | 
            +
                  update_keys(num.chr)
         | 
| 69 | 
            +
                  t ^ num
         | 
| 70 70 | 
             
                end
         | 
| 71 71 | 
             
              end
         | 
| 72 72 |  | 
| @@ -74,7 +74,7 @@ module Zip | |
| 74 74 | 
             
                include TraditionalEncryption
         | 
| 75 75 |  | 
| 76 76 | 
             
                def decrypt(data)
         | 
| 77 | 
            -
                  data.unpack( | 
| 77 | 
            +
                  data.unpack('C*').map { |x| decode x }.pack('C*')
         | 
| 78 78 | 
             
                end
         | 
| 79 79 |  | 
| 80 80 | 
             
                def reset!(header)
         | 
| @@ -86,10 +86,10 @@ module Zip | |
| 86 86 |  | 
| 87 87 | 
             
                private
         | 
| 88 88 |  | 
| 89 | 
            -
                def decode( | 
| 90 | 
            -
                   | 
| 91 | 
            -
                  update_keys( | 
| 92 | 
            -
                   | 
| 89 | 
            +
                def decode(num)
         | 
| 90 | 
            +
                  num ^= decrypt_byte
         | 
| 91 | 
            +
                  update_keys(num.chr)
         | 
| 92 | 
            +
                  num
         | 
| 93 93 | 
             
                end
         | 
| 94 94 | 
             
              end
         | 
| 95 95 | 
             
            end
         | 
    
        data/lib/zip/decompressor.rb
    CHANGED
    
    | @@ -1,9 +1,27 @@ | |
| 1 1 | 
             
            module Zip
         | 
| 2 | 
            -
              class Decompressor | 
| 3 | 
            -
                CHUNK_SIZE =  | 
| 4 | 
            -
             | 
| 2 | 
            +
              class Decompressor #:nodoc:all
         | 
| 3 | 
            +
                CHUNK_SIZE = 32_768
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                def self.decompressor_classes
         | 
| 6 | 
            +
                  @decompressor_classes ||= {}
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def self.register(compression_method, decompressor_class)
         | 
| 10 | 
            +
                  decompressor_classes[compression_method] = decompressor_class
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def self.find_by_compression_method(compression_method)
         | 
| 14 | 
            +
                  decompressor_classes[compression_method]
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                attr_reader :input_stream
         | 
| 18 | 
            +
                attr_reader :decompressed_size
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def initialize(input_stream, decompressed_size = nil)
         | 
| 5 21 | 
             
                  super()
         | 
| 6 | 
            -
             | 
| 22 | 
            +
             | 
| 23 | 
            +
                  @input_stream = input_stream
         | 
| 24 | 
            +
                  @decompressed_size = decompressed_size
         | 
| 7 25 | 
             
                end
         | 
| 8 26 | 
             
              end
         | 
| 9 27 | 
             
            end
         | 
    
        data/lib/zip/deflater.rb
    CHANGED
    
    | @@ -1,6 +1,5 @@ | |
| 1 1 | 
             
            module Zip
         | 
| 2 2 | 
             
              class Deflater < Compressor #:nodoc:all
         | 
| 3 | 
            -
             | 
| 4 3 | 
             
                def initialize(output_stream, level = Zip.default_compression, encrypter = NullEncrypter.new)
         | 
| 5 4 | 
             
                  super()
         | 
| 6 5 | 
             
                  @output_stream = output_stream
         | 
| @@ -8,18 +7,21 @@ module Zip | |
| 8 7 | 
             
                  @size          = 0
         | 
| 9 8 | 
             
                  @crc           = ::Zlib.crc32
         | 
| 10 9 | 
             
                  @encrypter     = encrypter
         | 
| 11 | 
            -
                  @buffer_stream = ::StringIO.new('')
         | 
| 12 10 | 
             
                end
         | 
| 13 11 |  | 
| 14 | 
            -
                def << | 
| 12 | 
            +
                def <<(data)
         | 
| 15 13 | 
             
                  val   = data.to_s
         | 
| 16 | 
            -
                  @crc  = Zlib | 
| 14 | 
            +
                  @crc  = Zlib.crc32(val, @crc)
         | 
| 17 15 | 
             
                  @size += val.bytesize
         | 
| 18 | 
            -
                   | 
| 16 | 
            +
                  buffer = @zlib_deflater.deflate(data)
         | 
| 17 | 
            +
                  if buffer.empty?
         | 
| 18 | 
            +
                    @output_stream
         | 
| 19 | 
            +
                  else
         | 
| 20 | 
            +
                    @output_stream << @encrypter.encrypt(buffer)
         | 
| 21 | 
            +
                  end
         | 
| 19 22 | 
             
                end
         | 
| 20 23 |  | 
| 21 24 | 
             
                def finish
         | 
| 22 | 
            -
                  @output_stream << @encrypter.encrypt(@buffer_stream.string)
         | 
| 23 25 | 
             
                  @output_stream << @encrypter.encrypt(@zlib_deflater.finish) until @zlib_deflater.finished?
         | 
| 24 26 | 
             
                end
         | 
| 25 27 |  | 
    
        data/lib/zip/dos_time.rb
    CHANGED
    
    | @@ -1,7 +1,6 @@ | |
| 1 1 | 
             
            module Zip
         | 
| 2 2 | 
             
              class DOSTime < Time #:nodoc:all
         | 
| 3 | 
            -
             | 
| 4 | 
            -
                #MS-DOS File Date and Time format as used in Interrupt 21H Function 57H:
         | 
| 3 | 
            +
                # MS-DOS File Date and Time format as used in Interrupt 21H Function 57H:
         | 
| 5 4 |  | 
| 6 5 | 
             
                # Register CX, the Time:
         | 
| 7 6 | 
             
                # Bits 0-4  2 second increments (0-29)
         | 
| @@ -14,31 +13,36 @@ module Zip | |
| 14 13 | 
             
                # bits 9-15 year (four digit year minus 1980)
         | 
| 15 14 |  | 
| 16 15 | 
             
                def to_binary_dos_time
         | 
| 17 | 
            -
                  (sec/2) +
         | 
| 16 | 
            +
                  (sec / 2) +
         | 
| 18 17 | 
             
                    (min << 5) +
         | 
| 19 18 | 
             
                    (hour << 11)
         | 
| 20 19 | 
             
                end
         | 
| 21 20 |  | 
| 22 21 | 
             
                def to_binary_dos_date
         | 
| 23 | 
            -
                   | 
| 22 | 
            +
                  day +
         | 
| 24 23 | 
             
                    (month << 5) +
         | 
| 25 24 | 
             
                    ((year - 1980) << 9)
         | 
| 26 25 | 
             
                end
         | 
| 27 26 |  | 
| 28 27 | 
             
                # Dos time is only stored with two seconds accuracy
         | 
| 29 28 | 
             
                def dos_equals(other)
         | 
| 30 | 
            -
                  to_i/2 == other.to_i/2
         | 
| 29 | 
            +
                  to_i / 2 == other.to_i / 2
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                # Create a DOSTime instance from a vanilla Time instance.
         | 
| 33 | 
            +
                def self.from_time(time)
         | 
| 34 | 
            +
                  local(time.year, time.month, time.day, time.hour, time.min, time.sec)
         | 
| 31 35 | 
             
                end
         | 
| 32 36 |  | 
| 33 | 
            -
                def self.parse_binary_dos_format( | 
| 34 | 
            -
                  second = 2 * (0b11111 &  | 
| 35 | 
            -
                  minute = (0b11111100000 &  | 
| 36 | 
            -
                  hour   = (0b1111100000000000 &  | 
| 37 | 
            -
                  day    = (0b11111 &  | 
| 38 | 
            -
                  month  = (0b111100000 &  | 
| 39 | 
            -
                  year   = ((0b1111111000000000 &  | 
| 37 | 
            +
                def self.parse_binary_dos_format(bin_dos_date, bin_dos_time)
         | 
| 38 | 
            +
                  second = 2 * (0b11111 & bin_dos_time)
         | 
| 39 | 
            +
                  minute = (0b11111100000 & bin_dos_time) >> 5
         | 
| 40 | 
            +
                  hour   = (0b1111100000000000 & bin_dos_time) >> 11
         | 
| 41 | 
            +
                  day    = (0b11111 & bin_dos_date)
         | 
| 42 | 
            +
                  month  = (0b111100000 & bin_dos_date) >> 5
         | 
| 43 | 
            +
                  year   = ((0b1111111000000000 & bin_dos_date) >> 9) + 1980
         | 
| 40 44 | 
             
                  begin
         | 
| 41 | 
            -
                     | 
| 45 | 
            +
                    local(year, month, day, hour, minute, second)
         | 
| 42 46 | 
             
                  end
         | 
| 43 47 | 
             
                end
         | 
| 44 48 | 
             
              end
         |