rubyzip 1.3.0 → 3.4.0
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 +4 -4
- data/Changelog.md +516 -0
- data/LICENSE.md +24 -0
- data/README.md +213 -51
- data/Rakefile +17 -12
- data/lib/rubyzip.rb +3 -0
- data/lib/zip/central_directory.rb +196 -123
- data/lib/zip/compressor.rb +3 -1
- data/lib/zip/constants.rb +81 -21
- data/lib/zip/crypto/aes_encryption.rb +120 -0
- data/lib/zip/crypto/decrypted_io.rb +46 -0
- data/lib/zip/crypto/encryption.rb +4 -2
- data/lib/zip/crypto/null_encryption.rb +5 -13
- data/lib/zip/crypto/traditional_encryption.rb +22 -16
- data/lib/zip/decompressor.rb +21 -2
- data/lib/zip/deflater.rb +12 -8
- data/lib/zip/dirtyable.rb +32 -0
- data/lib/zip/dos_time.rb +65 -13
- data/lib/zip/entry.rb +433 -249
- data/lib/zip/entry_set.rb +13 -9
- data/lib/zip/errors.rb +152 -15
- data/lib/zip/extra_field/aes.rb +50 -0
- data/lib/zip/extra_field/generic.rb +18 -18
- data/lib/zip/extra_field/ntfs.rb +10 -4
- data/lib/zip/extra_field/old_unix.rb +6 -2
- data/lib/zip/extra_field/universal_time.rb +45 -13
- data/lib/zip/extra_field/unix.rb +7 -3
- data/lib/zip/extra_field/unknown.rb +35 -0
- data/lib/zip/extra_field/zip64.rb +23 -7
- data/lib/zip/extra_field.rb +31 -27
- data/lib/zip/file.rb +225 -241
- data/lib/zip/file_split.rb +91 -0
- data/lib/zip/filesystem/dir.rb +86 -0
- data/lib/zip/filesystem/directory_iterator.rb +48 -0
- data/lib/zip/filesystem/file.rb +263 -0
- data/lib/zip/filesystem/file_stat.rb +110 -0
- data/lib/zip/filesystem/zip_file_name_mapper.rb +81 -0
- data/lib/zip/filesystem.rb +32 -585
- data/lib/zip/inflater.rb +28 -37
- data/lib/zip/input_stream.rb +113 -54
- data/lib/zip/ioextras/abstract_input_stream.rb +154 -55
- data/lib/zip/ioextras/abstract_output_stream.rb +13 -3
- data/lib/zip/ioextras.rb +8 -8
- data/lib/zip/null_compressor.rb +3 -1
- data/lib/zip/null_decompressor.rb +7 -12
- data/lib/zip/null_input_stream.rb +3 -1
- data/lib/zip/output_stream.rb +69 -50
- data/lib/zip/pass_thru_compressor.rb +5 -3
- data/lib/zip/pass_thru_decompressor.rb +17 -23
- data/lib/zip/streamable_directory.rb +6 -4
- data/lib/zip/streamable_stream.rb +10 -11
- data/lib/zip/version.rb +4 -1
- data/lib/zip.rb +32 -7
- data/rubyzip.gemspec +39 -0
- data/samples/example.rb +9 -4
- data/samples/example_filesystem.rb +4 -3
- data/samples/example_recursive.rb +3 -1
- data/samples/gtk_ruby_zip.rb +23 -21
- data/samples/qtzip.rb +13 -12
- data/samples/write_simple.rb +3 -4
- data/samples/zipfind.rb +24 -22
- metadata +85 -177
- data/TODO +0 -15
- data/lib/zip/extra_field/zip64_placeholder.rb +0 -15
- data/test/basic_zip_file_test.rb +0 -60
- data/test/case_sensitivity_test.rb +0 -69
- data/test/central_directory_entry_test.rb +0 -69
- data/test/central_directory_test.rb +0 -100
- data/test/crypto/null_encryption_test.rb +0 -57
- 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/gpbit3stored.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/oddExtraField.zip +0 -0
- data/test/data/path_traversal/Makefile +0 -10
- data/test/data/path_traversal/jwilk/README.md +0 -5
- data/test/data/path_traversal/jwilk/absolute1.zip +0 -0
- data/test/data/path_traversal/jwilk/absolute2.zip +0 -0
- data/test/data/path_traversal/jwilk/dirsymlink.zip +0 -0
- data/test/data/path_traversal/jwilk/dirsymlink2a.zip +0 -0
- data/test/data/path_traversal/jwilk/dirsymlink2b.zip +0 -0
- data/test/data/path_traversal/jwilk/relative0.zip +0 -0
- data/test/data/path_traversal/jwilk/relative2.zip +0 -0
- data/test/data/path_traversal/jwilk/symlink.zip +0 -0
- data/test/data/path_traversal/relative1.zip +0 -0
- data/test/data/path_traversal/tilde.zip +0 -0
- data/test/data/path_traversal/tuzovakaoff/README.md +0 -3
- data/test/data/path_traversal/tuzovakaoff/absolutepath.zip +0 -0
- data/test/data/path_traversal/tuzovakaoff/symlink.zip +0 -0
- data/test/data/rubycode.zip +0 -0
- data/test/data/rubycode2.zip +0 -0
- data/test/data/test.xls +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 -65
- data/test/encryption_test.rb +0 -42
- data/test/entry_set_test.rb +0 -163
- data/test/entry_test.rb +0 -154
- data/test/errors_test.rb +0 -35
- data/test/extra_field_test.rb +0 -76
- data/test/file_extract_directory_test.rb +0 -54
- data/test/file_extract_test.rb +0 -145
- data/test/file_permissions_test.rb +0 -65
- data/test/file_split_test.rb +0 -57
- data/test/file_test.rb +0 -666
- data/test/filesystem/dir_iterator_test.rb +0 -58
- data/test/filesystem/directory_test.rb +0 -139
- data/test/filesystem/file_mutating_test.rb +0 -87
- data/test/filesystem/file_nonmutating_test.rb +0 -508
- data/test/filesystem/file_stat_test.rb +0 -64
- data/test/gentestfiles.rb +0 -126
- data/test/inflater_test.rb +0 -14
- data/test/input_stream_test.rb +0 -182
- data/test/ioextras/abstract_input_stream_test.rb +0 -102
- 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 -154
- data/test/output_stream_test.rb +0 -128
- data/test/pass_thru_compressor_test.rb +0 -30
- data/test/pass_thru_decompressor_test.rb +0 -14
- data/test/path_traversal_test.rb +0 -141
- data/test/samples/example_recursive_test.rb +0 -37
- data/test/settings_test.rb +0 -95
- data/test/test_helper.rb +0 -234
- data/test/unicode_file_names_and_comments_test.rb +0 -62
- data/test/zip64_full_test.rb +0 -51
- data/test/zip64_support_test.rb +0 -14
data/lib/zip/extra_field.rb
CHANGED
|
@@ -1,50 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Zip
|
|
2
|
-
class ExtraField < Hash
|
|
4
|
+
class ExtraField < Hash # :nodoc:all
|
|
3
5
|
ID_MAP = {}
|
|
4
6
|
|
|
5
|
-
def initialize(binstr = nil)
|
|
6
|
-
merge(binstr) if binstr
|
|
7
|
+
def initialize(binstr = nil, local: false)
|
|
8
|
+
merge(binstr, local: local) if binstr
|
|
7
9
|
end
|
|
8
10
|
|
|
9
|
-
def extra_field_type_exist(binstr, id, len,
|
|
11
|
+
def extra_field_type_exist(binstr, id, len, index)
|
|
10
12
|
field_name = ID_MAP[id].name
|
|
11
13
|
if member?(field_name)
|
|
12
|
-
self[field_name].merge(binstr[
|
|
14
|
+
self[field_name].merge(binstr[index, len + 4])
|
|
13
15
|
else
|
|
14
|
-
field_obj = ID_MAP[id].new(binstr[
|
|
16
|
+
field_obj = ID_MAP[id].new(binstr[index, len + 4])
|
|
15
17
|
self[field_name] = field_obj
|
|
16
18
|
end
|
|
17
19
|
end
|
|
18
20
|
|
|
19
|
-
def extra_field_type_unknown(binstr, len,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
def extra_field_type_unknown(binstr, len, index, local)
|
|
22
|
+
self[:unknown] ||= Unknown.new
|
|
23
|
+
|
|
24
|
+
if !len || len + 4 > binstr[index..].bytesize
|
|
25
|
+
self[:unknown].merge(binstr[index..], local: local)
|
|
23
26
|
return
|
|
24
27
|
end
|
|
25
|
-
self['Unknown'] << binstr[i, len + 4]
|
|
26
|
-
end
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
s = ''.dup
|
|
30
|
-
class << s
|
|
31
|
-
alias_method :to_c_dir_bin, :to_s
|
|
32
|
-
alias_method :to_local_bin, :to_s
|
|
33
|
-
end
|
|
34
|
-
self['Unknown'] = s
|
|
29
|
+
self[:unknown].merge(binstr[index, len + 4], local: local)
|
|
35
30
|
end
|
|
36
31
|
|
|
37
|
-
def merge(binstr)
|
|
32
|
+
def merge(binstr, local: false)
|
|
38
33
|
return if binstr.empty?
|
|
34
|
+
|
|
39
35
|
i = 0
|
|
40
36
|
while i < binstr.bytesize
|
|
41
37
|
id = binstr[i, 2]
|
|
42
|
-
len = binstr[i + 2, 2].to_s.
|
|
38
|
+
len = binstr[i + 2, 2].to_s.unpack1('v')
|
|
43
39
|
if id && ID_MAP.member?(id)
|
|
44
40
|
extra_field_type_exist(binstr, id, len, i)
|
|
45
41
|
elsif id
|
|
46
|
-
|
|
47
|
-
break unless extra_field_type_unknown(binstr, len, i)
|
|
42
|
+
break unless extra_field_type_unknown(binstr, len, i, local)
|
|
48
43
|
end
|
|
49
44
|
i += len + 4
|
|
50
45
|
end
|
|
@@ -54,17 +49,25 @@ module Zip
|
|
|
54
49
|
unless (field_class = ID_MAP.values.find { |k| k.name == name })
|
|
55
50
|
raise Error, "Unknown extra field '#{name}'"
|
|
56
51
|
end
|
|
52
|
+
|
|
57
53
|
self[name] = field_class.new
|
|
58
54
|
end
|
|
59
55
|
|
|
60
|
-
#
|
|
61
|
-
# does not prevent known fields from being read back in
|
|
56
|
+
# Place Unknown last, so "extra" data that is missing the proper
|
|
57
|
+
# signature/size does not prevent known fields from being read back in.
|
|
62
58
|
def ordered_values
|
|
63
59
|
result = []
|
|
64
|
-
each { |k, v| k ==
|
|
60
|
+
each { |k, v| k == :unknown ? result.push(v) : result.unshift(v) }
|
|
65
61
|
result
|
|
66
62
|
end
|
|
67
63
|
|
|
64
|
+
# Remove any extra fields that indicate they can be safely suppressed.
|
|
65
|
+
def suppress_fields!(fields)
|
|
66
|
+
reject! do |k, v|
|
|
67
|
+
v.suppress? if fields == true || [*fields].include?(k)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
68
71
|
def to_local_bin
|
|
69
72
|
ordered_values.map! { |v| v.to_local_bin.force_encoding('BINARY') }.join
|
|
70
73
|
end
|
|
@@ -88,13 +91,14 @@ module Zip
|
|
|
88
91
|
end
|
|
89
92
|
end
|
|
90
93
|
|
|
94
|
+
require 'zip/extra_field/unknown'
|
|
91
95
|
require 'zip/extra_field/generic'
|
|
92
96
|
require 'zip/extra_field/universal_time'
|
|
93
97
|
require 'zip/extra_field/old_unix'
|
|
94
98
|
require 'zip/extra_field/unix'
|
|
95
99
|
require 'zip/extra_field/zip64'
|
|
96
|
-
require 'zip/extra_field/zip64_placeholder'
|
|
97
100
|
require 'zip/extra_field/ntfs'
|
|
101
|
+
require 'zip/extra_field/aes'
|
|
98
102
|
|
|
99
103
|
# Copyright (C) 2002, 2003 Thomas Sondergaard
|
|
100
104
|
# rubyzip is free software; you can redistribute it and/or
|