rubyzip 0.9.5 → 1.3.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 +7 -0
- data/README.md +334 -45
- data/Rakefile +11 -6
- data/TODO +0 -1
- data/lib/zip/central_directory.rb +208 -0
- data/lib/zip/compressor.rb +1 -2
- data/lib/zip/constants.rb +61 -8
- data/lib/zip/crypto/encryption.rb +11 -0
- data/lib/zip/crypto/null_encryption.rb +43 -0
- data/lib/zip/crypto/traditional_encryption.rb +99 -0
- data/lib/zip/decompressor.rb +4 -4
- data/lib/zip/deflater.rb +18 -14
- data/lib/zip/dos_time.rb +48 -0
- data/lib/zip/entry.rb +700 -0
- data/lib/zip/entry_set.rb +86 -0
- data/lib/zip/errors.rb +18 -0
- data/lib/zip/extra_field/generic.rb +43 -0
- data/lib/zip/extra_field/ntfs.rb +90 -0
- data/lib/zip/extra_field/old_unix.rb +44 -0
- data/lib/zip/extra_field/universal_time.rb +47 -0
- data/lib/zip/extra_field/unix.rb +37 -0
- data/lib/zip/extra_field/zip64.rb +68 -0
- data/lib/zip/extra_field/zip64_placeholder.rb +15 -0
- data/lib/zip/extra_field.rb +101 -0
- data/lib/zip/file.rb +443 -0
- data/lib/zip/{zipfilesystem.rb → filesystem.rb} +179 -164
- data/lib/zip/inflater.rb +29 -28
- data/lib/zip/input_stream.rb +173 -0
- data/lib/zip/ioextras/abstract_input_stream.rb +111 -0
- data/lib/zip/ioextras/abstract_output_stream.rb +43 -0
- data/lib/zip/ioextras.rb +21 -149
- data/lib/zip/null_compressor.rb +2 -2
- data/lib/zip/null_decompressor.rb +8 -6
- data/lib/zip/null_input_stream.rb +3 -2
- data/lib/zip/output_stream.rb +189 -0
- data/lib/zip/pass_thru_compressor.rb +7 -7
- data/lib/zip/pass_thru_decompressor.rb +19 -19
- data/lib/zip/{zip_streamable_directory.rb → streamable_directory.rb} +3 -3
- data/lib/zip/streamable_stream.rb +56 -0
- data/lib/zip/version.rb +3 -0
- data/lib/zip.rb +71 -0
- data/samples/example.rb +44 -32
- data/samples/example_filesystem.rb +16 -18
- data/samples/example_recursive.rb +33 -28
- data/samples/{gtkRubyzip.rb → gtk_ruby_zip.rb} +26 -28
- data/samples/qtzip.rb +22 -31
- data/samples/write_simple.rb +12 -13
- data/samples/zipfind.rb +31 -39
- data/test/basic_zip_file_test.rb +60 -0
- data/test/case_sensitivity_test.rb +69 -0
- data/test/central_directory_entry_test.rb +69 -0
- data/test/central_directory_test.rb +100 -0
- data/test/crypto/null_encryption_test.rb +57 -0
- data/test/crypto/traditional_encryption_test.rb +80 -0
- data/test/data/WarnInvalidDate.zip +0 -0
- data/test/data/file1.txt +46 -0
- data/test/data/file1.txt.deflatedData +0 -0
- data/test/data/file2.txt +1504 -0
- 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 +1 -0
- data/test/data/notzippedruby.rb +7 -0
- data/test/data/ntfs.zip +0 -0
- data/test/data/oddExtraField.zip +0 -0
- data/test/data/path_traversal/Makefile +10 -0
- data/test/data/path_traversal/jwilk/README.md +5 -0
- 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 +3 -0
- 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 +65 -0
- data/test/encryption_test.rb +42 -0
- data/test/entry_set_test.rb +163 -0
- data/test/entry_test.rb +154 -0
- data/test/errors_test.rb +35 -0
- data/test/extra_field_test.rb +76 -0
- data/test/file_extract_directory_test.rb +54 -0
- data/test/file_extract_test.rb +145 -0
- data/test/file_permissions_test.rb +65 -0
- data/test/file_split_test.rb +57 -0
- data/test/file_test.rb +666 -0
- data/test/filesystem/dir_iterator_test.rb +58 -0
- data/test/filesystem/directory_test.rb +139 -0
- data/test/filesystem/file_mutating_test.rb +87 -0
- data/test/filesystem/file_nonmutating_test.rb +508 -0
- data/test/filesystem/file_stat_test.rb +64 -0
- data/test/gentestfiles.rb +126 -0
- data/test/inflater_test.rb +14 -0
- data/test/input_stream_test.rb +182 -0
- data/test/ioextras/abstract_input_stream_test.rb +102 -0
- data/test/ioextras/abstract_output_stream_test.rb +106 -0
- data/test/ioextras/fake_io_test.rb +18 -0
- data/test/local_entry_test.rb +154 -0
- data/test/output_stream_test.rb +128 -0
- data/test/pass_thru_compressor_test.rb +30 -0
- data/test/pass_thru_decompressor_test.rb +14 -0
- data/test/path_traversal_test.rb +141 -0
- data/test/samples/example_recursive_test.rb +37 -0
- data/test/settings_test.rb +95 -0
- data/test/test_helper.rb +234 -0
- data/test/unicode_file_names_and_comments_test.rb +62 -0
- data/test/zip64_full_test.rb +51 -0
- data/test/zip64_support_test.rb +14 -0
- metadata +275 -41
- data/NEWS +0 -162
- data/lib/zip/stdrubyext.rb +0 -77
- data/lib/zip/tempfile_bugfixed.rb +0 -195
- data/lib/zip/zip.rb +0 -54
- data/lib/zip/zip_central_directory.rb +0 -139
- data/lib/zip/zip_entry.rb +0 -639
- data/lib/zip/zip_entry_set.rb +0 -66
- data/lib/zip/zip_extra_field.rb +0 -213
- data/lib/zip/zip_file.rb +0 -318
- data/lib/zip/zip_input_stream.rb +0 -134
- data/lib/zip/zip_output_stream.rb +0 -172
- data/lib/zip/zip_streamable_stream.rb +0 -47
@@ -1,172 +0,0 @@
|
|
1
|
-
module Zip
|
2
|
-
# ZipOutputStream is the basic class for writing zip files. It is
|
3
|
-
# possible to create a ZipOutputStream object directly, passing
|
4
|
-
# the zip file name to the constructor, but more often than not
|
5
|
-
# the ZipOutputStream will be obtained from a ZipFile (perhaps using the
|
6
|
-
# ZipFileSystem interface) object for a particular entry in the zip
|
7
|
-
# archive.
|
8
|
-
#
|
9
|
-
# A ZipOutputStream inherits IOExtras::AbstractOutputStream in order
|
10
|
-
# to provide an IO-like interface for writing to a single zip
|
11
|
-
# entry. Beyond methods for mimicking an IO-object it contains
|
12
|
-
# the method put_next_entry that closes the current entry
|
13
|
-
# and creates a new.
|
14
|
-
#
|
15
|
-
# Please refer to ZipInputStream for example code.
|
16
|
-
#
|
17
|
-
# java.util.zip.ZipOutputStream is the original inspiration for this
|
18
|
-
# class.
|
19
|
-
|
20
|
-
class ZipOutputStream
|
21
|
-
include IOExtras::AbstractOutputStream
|
22
|
-
|
23
|
-
attr_accessor :comment
|
24
|
-
|
25
|
-
# Opens the indicated zip file. If a file with that name already
|
26
|
-
# exists it will be overwritten.
|
27
|
-
def initialize(fileName, stream=false)
|
28
|
-
super()
|
29
|
-
@fileName = fileName
|
30
|
-
if stream
|
31
|
-
@outputStream = StringIO.new
|
32
|
-
else
|
33
|
-
@outputStream = File.new(@fileName, "wb")
|
34
|
-
end
|
35
|
-
@entrySet = ZipEntrySet.new
|
36
|
-
@compressor = NullCompressor.instance
|
37
|
-
@closed = false
|
38
|
-
@currentEntry = nil
|
39
|
-
@comment = nil
|
40
|
-
end
|
41
|
-
|
42
|
-
# Same as #initialize but if a block is passed the opened
|
43
|
-
# stream is passed to the block and closed when the block
|
44
|
-
# returns.
|
45
|
-
def ZipOutputStream.open(fileName)
|
46
|
-
return new(fileName) unless block_given?
|
47
|
-
zos = new(fileName)
|
48
|
-
yield zos
|
49
|
-
ensure
|
50
|
-
zos.close if zos
|
51
|
-
end
|
52
|
-
|
53
|
-
# Same as #open but writes to a filestream instead
|
54
|
-
def ZipOutputStream.write_buffer
|
55
|
-
zos = new('', true)
|
56
|
-
yield zos
|
57
|
-
return zos.close_buffer
|
58
|
-
end
|
59
|
-
|
60
|
-
# Closes the stream and writes the central directory to the zip file
|
61
|
-
def close
|
62
|
-
return if @closed
|
63
|
-
finalize_current_entry
|
64
|
-
update_local_headers
|
65
|
-
write_central_directory
|
66
|
-
@outputStream.close
|
67
|
-
@closed = true
|
68
|
-
end
|
69
|
-
|
70
|
-
# Closes the stream and writes the central directory to the zip file
|
71
|
-
def close_buffer
|
72
|
-
return @outputStream if @closed
|
73
|
-
finalize_current_entry
|
74
|
-
update_local_headers
|
75
|
-
write_central_directory
|
76
|
-
@closed = true
|
77
|
-
return @outputStream
|
78
|
-
end
|
79
|
-
|
80
|
-
# Closes the current entry and opens a new for writing.
|
81
|
-
# +entry+ can be a ZipEntry object or a string.
|
82
|
-
def put_next_entry(entryname, comment = nil, extra = nil, compression_method = ZipEntry::DEFLATED, level = Zlib::DEFAULT_COMPRESSION)
|
83
|
-
raise ZipError, "zip stream is closed" if @closed
|
84
|
-
new_entry = ZipEntry.new(@fileName, entryname.to_s)
|
85
|
-
new_entry.unix_perms = entryname.unix_perms if entryname.respond_to? :unix_perms
|
86
|
-
new_entry.comment = comment if !comment.nil?
|
87
|
-
if (!extra.nil?)
|
88
|
-
new_entry.extra = ZipExtraField === extra ? extra : ZipExtraField.new(extra.to_s)
|
89
|
-
end
|
90
|
-
new_entry.compression_method = compression_method
|
91
|
-
init_next_entry(new_entry, level)
|
92
|
-
@currentEntry = new_entry
|
93
|
-
end
|
94
|
-
|
95
|
-
def copy_raw_entry(entry)
|
96
|
-
entry = entry.dup
|
97
|
-
raise ZipError, "zip stream is closed" if @closed
|
98
|
-
raise ZipError, "entry is not a ZipEntry" if !entry.kind_of?(ZipEntry)
|
99
|
-
finalize_current_entry
|
100
|
-
@entrySet << entry
|
101
|
-
src_pos = entry.local_entry_offset
|
102
|
-
entry.write_local_entry(@outputStream)
|
103
|
-
@compressor = NullCompressor.instance
|
104
|
-
entry.get_raw_input_stream {
|
105
|
-
|is|
|
106
|
-
is.seek(src_pos, IO::SEEK_SET)
|
107
|
-
IOExtras.copy_stream_n(@outputStream, is, entry.compressed_size)
|
108
|
-
}
|
109
|
-
@compressor = NullCompressor.instance
|
110
|
-
@currentEntry = nil
|
111
|
-
end
|
112
|
-
|
113
|
-
private
|
114
|
-
def finalize_current_entry
|
115
|
-
return unless @currentEntry
|
116
|
-
finish
|
117
|
-
@currentEntry.compressed_size = @outputStream.tell - @currentEntry.localHeaderOffset -
|
118
|
-
@currentEntry.calculate_local_header_size
|
119
|
-
@currentEntry.size = @compressor.size
|
120
|
-
@currentEntry.crc = @compressor.crc
|
121
|
-
@currentEntry = nil
|
122
|
-
@compressor = NullCompressor.instance
|
123
|
-
end
|
124
|
-
|
125
|
-
def init_next_entry(entry, level = Zlib::DEFAULT_COMPRESSION)
|
126
|
-
finalize_current_entry
|
127
|
-
@entrySet << entry
|
128
|
-
entry.write_local_entry(@outputStream)
|
129
|
-
@compressor = get_compressor(entry, level)
|
130
|
-
end
|
131
|
-
|
132
|
-
def get_compressor(entry, level)
|
133
|
-
case entry.compression_method
|
134
|
-
when ZipEntry::DEFLATED then Deflater.new(@outputStream, level)
|
135
|
-
when ZipEntry::STORED then PassThruCompressor.new(@outputStream)
|
136
|
-
else raise ZipCompressionMethodError,
|
137
|
-
"Invalid compression method: '#{entry.compression_method}'"
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
def update_local_headers
|
142
|
-
pos = @outputStream.tell
|
143
|
-
@entrySet.each {
|
144
|
-
|entry|
|
145
|
-
@outputStream.pos = entry.localHeaderOffset
|
146
|
-
entry.write_local_entry(@outputStream)
|
147
|
-
}
|
148
|
-
@outputStream.pos = pos
|
149
|
-
end
|
150
|
-
|
151
|
-
def write_central_directory
|
152
|
-
cdir = ZipCentralDirectory.new(@entrySet, @comment)
|
153
|
-
cdir.write_to_stream(@outputStream)
|
154
|
-
end
|
155
|
-
|
156
|
-
protected
|
157
|
-
|
158
|
-
def finish
|
159
|
-
@compressor.finish
|
160
|
-
end
|
161
|
-
|
162
|
-
public
|
163
|
-
# Modeled after IO.<<
|
164
|
-
def << (data)
|
165
|
-
@compressor << data
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
# Copyright (C) 2002, 2003 Thomas Sondergaard
|
171
|
-
# rubyzip is free software; you can redistribute it and/or
|
172
|
-
# modify it under the terms of the ruby license.
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Zip
|
2
|
-
class ZipStreamableStream < DelegateClass(ZipEntry) #nodoc:all
|
3
|
-
def initialize(entry)
|
4
|
-
super(entry)
|
5
|
-
@tempFile = Tempfile.new(File.basename(name), File.dirname(zipfile))
|
6
|
-
@tempFile.binmode
|
7
|
-
end
|
8
|
-
|
9
|
-
def get_output_stream
|
10
|
-
if block_given?
|
11
|
-
begin
|
12
|
-
yield(@tempFile)
|
13
|
-
ensure
|
14
|
-
@tempFile.close
|
15
|
-
end
|
16
|
-
else
|
17
|
-
@tempFile
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def get_input_stream
|
22
|
-
if ! @tempFile.closed?
|
23
|
-
raise StandardError, "cannot open entry for reading while its open for writing - #{name}"
|
24
|
-
end
|
25
|
-
@tempFile.open # reopens tempfile from top
|
26
|
-
@tempFile.binmode
|
27
|
-
if block_given?
|
28
|
-
begin
|
29
|
-
yield(@tempFile)
|
30
|
-
ensure
|
31
|
-
@tempFile.close
|
32
|
-
end
|
33
|
-
else
|
34
|
-
@tempFile
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def write_to_zip_output_stream(aZipOutputStream)
|
39
|
-
aZipOutputStream.put_next_entry(self)
|
40
|
-
get_input_stream { |is| IOExtras.copy_stream(aZipOutputStream, is) }
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# Copyright (C) 2002, 2003 Thomas Sondergaard
|
46
|
-
# rubyzip is free software; you can redistribute it and/or
|
47
|
-
# modify it under the terms of the ruby license.
|