ziperu 0.1.1-arm-linux-musl
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/CHANGELOG.md +24 -0
- data/LICENSE-rubyzip.txt +24 -0
- data/LICENSE.txt +21 -0
- data/README.md +276 -0
- data/lib/rubyzip.rb +4 -0
- data/lib/zip/central_directory.rb +5 -0
- data/lib/zip/compressor.rb +5 -0
- data/lib/zip/constants.rb +5 -0
- data/lib/zip/crypto/aes_encryption.rb +5 -0
- data/lib/zip/crypto/decrypted_io.rb +5 -0
- data/lib/zip/crypto/encryption.rb +5 -0
- data/lib/zip/crypto/null_encryption.rb +5 -0
- data/lib/zip/crypto/traditional_encryption.rb +5 -0
- data/lib/zip/crypto.rb +5 -0
- data/lib/zip/decompressor.rb +5 -0
- data/lib/zip/deflater.rb +5 -0
- data/lib/zip/dirtyable.rb +5 -0
- data/lib/zip/dos_time.rb +5 -0
- data/lib/zip/entry.rb +5 -0
- data/lib/zip/entry_set.rb +5 -0
- data/lib/zip/errors.rb +5 -0
- data/lib/zip/extra_field/aes.rb +5 -0
- data/lib/zip/extra_field/generic.rb +5 -0
- data/lib/zip/extra_field/ntfs.rb +5 -0
- data/lib/zip/extra_field/old_unix.rb +5 -0
- data/lib/zip/extra_field/universal_time.rb +5 -0
- data/lib/zip/extra_field/unix.rb +5 -0
- data/lib/zip/extra_field/unknown.rb +5 -0
- data/lib/zip/extra_field/zip64.rb +5 -0
- data/lib/zip/extra_field.rb +5 -0
- data/lib/zip/file.rb +5 -0
- data/lib/zip/file_split.rb +5 -0
- data/lib/zip/filesystem/dir.rb +5 -0
- data/lib/zip/filesystem/directory_iterator.rb +5 -0
- data/lib/zip/filesystem/file.rb +5 -0
- data/lib/zip/filesystem/file_stat.rb +5 -0
- data/lib/zip/filesystem/zip_file_name_mapper.rb +5 -0
- data/lib/zip/filesystem.rb +5 -0
- data/lib/zip/inflater.rb +5 -0
- data/lib/zip/input_stream.rb +5 -0
- data/lib/zip/ioextras/abstract_input_stream.rb +5 -0
- data/lib/zip/ioextras/abstract_output_stream.rb +5 -0
- data/lib/zip/ioextras/fake_io.rb +5 -0
- data/lib/zip/ioextras.rb +5 -0
- data/lib/zip/null_compressor.rb +5 -0
- data/lib/zip/null_decompressor.rb +5 -0
- data/lib/zip/null_input_stream.rb +5 -0
- data/lib/zip/output_stream.rb +5 -0
- data/lib/zip/pass_thru_compressor.rb +5 -0
- data/lib/zip/pass_thru_decompressor.rb +5 -0
- data/lib/zip/streamable_directory.rb +5 -0
- data/lib/zip/streamable_stream.rb +5 -0
- data/lib/zip/version.rb +5 -0
- data/lib/zip.rb +19 -0
- data/lib/ziperu/3.1/ziperu.so +0 -0
- data/lib/ziperu/3.2/ziperu.so +0 -0
- data/lib/ziperu/3.3/ziperu.so +0 -0
- data/lib/ziperu/3.4/ziperu.so +0 -0
- data/lib/ziperu/4.0/ziperu.so +0 -0
- data/lib/ziperu/central_directory.rb +136 -0
- data/lib/ziperu/compressor.rb +14 -0
- data/lib/ziperu/constants.rb +148 -0
- data/lib/ziperu/crypto.rb +72 -0
- data/lib/ziperu/decompressor.rb +35 -0
- data/lib/ziperu/deflater.rb +41 -0
- data/lib/ziperu/dirtyable.rb +48 -0
- data/lib/ziperu/dos_time.rb +87 -0
- data/lib/ziperu/entry.rb +760 -0
- data/lib/ziperu/entry_set.rb +147 -0
- data/lib/ziperu/errors.rb +154 -0
- data/lib/ziperu/extra_field/aes.rb +52 -0
- data/lib/ziperu/extra_field/generic.rb +45 -0
- data/lib/ziperu/extra_field/ntfs.rb +98 -0
- data/lib/ziperu/extra_field/old_unix.rb +52 -0
- data/lib/ziperu/extra_field/universal_time.rb +81 -0
- data/lib/ziperu/extra_field/unix.rb +45 -0
- data/lib/ziperu/extra_field/unknown.rb +37 -0
- data/lib/ziperu/extra_field/zip64.rb +86 -0
- data/lib/ziperu/extra_field.rb +109 -0
- data/lib/ziperu/file.rb +614 -0
- data/lib/ziperu/file_split.rb +93 -0
- data/lib/ziperu/filesystem/dir.rb +88 -0
- data/lib/ziperu/filesystem/directory_iterator.rb +50 -0
- data/lib/ziperu/filesystem/file.rb +265 -0
- data/lib/ziperu/filesystem/file_stat.rb +112 -0
- data/lib/ziperu/filesystem/zip_file_name_mapper.rb +83 -0
- data/lib/ziperu/filesystem.rb +76 -0
- data/lib/ziperu/inflater.rb +60 -0
- data/lib/ziperu/input_stream.rb +296 -0
- data/lib/ziperu/ioextras/abstract_input_stream.rb +137 -0
- data/lib/ziperu/ioextras/abstract_output_stream.rb +57 -0
- data/lib/ziperu/ioextras/fake_io.rb +41 -0
- data/lib/ziperu/ioextras.rb +42 -0
- data/lib/ziperu/null_compressor.rb +20 -0
- data/lib/ziperu/null_decompressor.rb +25 -0
- data/lib/ziperu/null_input_stream.rb +55 -0
- data/lib/ziperu/output_stream.rb +223 -0
- data/lib/ziperu/pass_thru_compressor.rb +29 -0
- data/lib/ziperu/pass_thru_decompressor.rb +37 -0
- data/lib/ziperu/streamable_directory.rb +15 -0
- data/lib/ziperu/streamable_stream.rb +59 -0
- data/lib/ziperu/version.rb +7 -0
- data/lib/ziperu.rb +116 -0
- metadata +156 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Ported verbatim from rubyzip (Copyright (C) 2002-2026 the rubyzip authors).
|
|
4
|
+
|
|
5
|
+
module Ziperu
|
|
6
|
+
# Info-ZIP Extra for Zip64 size
|
|
7
|
+
class ExtraField::Zip64 < ExtraField::Generic # :nodoc:
|
|
8
|
+
attr_accessor :compressed_size, :disk_start_number,
|
|
9
|
+
:original_size, :relative_header_offset
|
|
10
|
+
|
|
11
|
+
HEADER_ID = ['0100'].pack('H*')
|
|
12
|
+
register_map
|
|
13
|
+
|
|
14
|
+
def initialize(binstr = nil)
|
|
15
|
+
# unparsed binary; we don't actually know what this contains
|
|
16
|
+
# without looking for FFs in the associated file header
|
|
17
|
+
# call parse after initializing with a binary string
|
|
18
|
+
@content = nil
|
|
19
|
+
@original_size = nil
|
|
20
|
+
@compressed_size = nil
|
|
21
|
+
@relative_header_offset = nil
|
|
22
|
+
@disk_start_number = nil
|
|
23
|
+
binstr && merge(binstr)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def ==(other)
|
|
27
|
+
other.original_size == @original_size &&
|
|
28
|
+
other.compressed_size == @compressed_size &&
|
|
29
|
+
other.relative_header_offset == @relative_header_offset &&
|
|
30
|
+
other.disk_start_number == @disk_start_number
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def merge(binstr)
|
|
34
|
+
return if binstr.empty?
|
|
35
|
+
|
|
36
|
+
_, @content = initial_parse(binstr)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# pass the values from the base entry (if applicable)
|
|
40
|
+
# wider values are only present in the extra field for base values set to all FFs
|
|
41
|
+
# returns the final values for the four attributes (from the base or zip64 extra record)
|
|
42
|
+
def parse(original_size, compressed_size, relative_header_offset = nil, disk_start_number = nil)
|
|
43
|
+
@original_size = extract(8, 'Q<') if original_size == 0xFFFFFFFF
|
|
44
|
+
@compressed_size = extract(8, 'Q<') if compressed_size == 0xFFFFFFFF
|
|
45
|
+
if relative_header_offset && relative_header_offset == 0xFFFFFFFF
|
|
46
|
+
@relative_header_offset = extract(8, 'Q<')
|
|
47
|
+
end
|
|
48
|
+
@disk_start_number = extract(4, 'V') if disk_start_number && disk_start_number == 0xFFFF
|
|
49
|
+
@content = nil
|
|
50
|
+
[@original_size || original_size,
|
|
51
|
+
@compressed_size || compressed_size,
|
|
52
|
+
@relative_header_offset || relative_header_offset,
|
|
53
|
+
@disk_start_number || disk_start_number]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def extract(size, format)
|
|
57
|
+
@content.slice!(0, size).unpack1(format)
|
|
58
|
+
end
|
|
59
|
+
private :extract
|
|
60
|
+
|
|
61
|
+
# We can suppress the zip64 extra field unless we know the size is large or
|
|
62
|
+
# the relative header offset is large (for central directory entries).
|
|
63
|
+
def suppress?
|
|
64
|
+
!((@original_size && @original_size >= 0xFFFFFFFF) ||
|
|
65
|
+
(@relative_header_offset && @relative_header_offset >= 0xFFFFFFFF))
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def pack_for_local
|
|
69
|
+
# Local header entries must contain original size and compressed size;
|
|
70
|
+
# other fields do not apply.
|
|
71
|
+
return '' unless @original_size && @compressed_size
|
|
72
|
+
|
|
73
|
+
[@original_size, @compressed_size].pack('Q<Q<')
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def pack_for_c_dir
|
|
77
|
+
# central directory entries contain only fields that didn't fit in the main entry part
|
|
78
|
+
packed = (+'').force_encoding('BINARY')
|
|
79
|
+
packed << [@original_size].pack('Q<') if @original_size
|
|
80
|
+
packed << [@compressed_size].pack('Q<') if @compressed_size
|
|
81
|
+
packed << [@relative_header_offset].pack('Q<') if @relative_header_offset
|
|
82
|
+
packed << [@disk_start_number].pack('V') if @disk_start_number
|
|
83
|
+
packed
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Ported verbatim from rubyzip (Copyright (C) 2002-2026 the rubyzip authors).
|
|
4
|
+
|
|
5
|
+
module Ziperu
|
|
6
|
+
class ExtraField < Hash # :nodoc:all
|
|
7
|
+
ID_MAP = {}
|
|
8
|
+
|
|
9
|
+
def initialize(binstr = nil, local: false)
|
|
10
|
+
merge(binstr, local: local) if binstr
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def extra_field_type_exist(binstr, id, len, index)
|
|
14
|
+
field_name = ID_MAP[id].name
|
|
15
|
+
if member?(field_name)
|
|
16
|
+
self[field_name].merge(binstr[index, len + 4])
|
|
17
|
+
else
|
|
18
|
+
field_obj = ID_MAP[id].new(binstr[index, len + 4])
|
|
19
|
+
self[field_name] = field_obj
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def extra_field_type_unknown(binstr, len, index, local)
|
|
24
|
+
self[:unknown] ||= Unknown.new
|
|
25
|
+
|
|
26
|
+
if !len || len + 4 > binstr[index..].bytesize
|
|
27
|
+
self[:unknown].merge(binstr[index..], local: local)
|
|
28
|
+
return
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
self[:unknown].merge(binstr[index, len + 4], local: local)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def merge(binstr, local: false)
|
|
35
|
+
return if binstr.empty?
|
|
36
|
+
|
|
37
|
+
i = 0
|
|
38
|
+
while i < binstr.bytesize
|
|
39
|
+
id = binstr[i, 2]
|
|
40
|
+
len = binstr[i + 2, 2].to_s.unpack1('v')
|
|
41
|
+
if id && ID_MAP.member?(id)
|
|
42
|
+
break if len.nil? # a known header cut off before its length
|
|
43
|
+
|
|
44
|
+
extra_field_type_exist(binstr, id, len, i)
|
|
45
|
+
elsif id
|
|
46
|
+
break unless extra_field_type_unknown(binstr, len, i, local)
|
|
47
|
+
end
|
|
48
|
+
i += len + 4
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def create(name)
|
|
53
|
+
unless (field_class = ID_MAP.values.find { |k| k.name == name })
|
|
54
|
+
raise Error, "Unknown extra field '#{name}'"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
self[name] = field_class.new
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Place Unknown last, so "extra" data that is missing the proper
|
|
61
|
+
# signature/size does not prevent known fields from being read back in.
|
|
62
|
+
def ordered_values
|
|
63
|
+
result = []
|
|
64
|
+
each { |k, v| k == :unknown ? result.push(v) : result.unshift(v) }
|
|
65
|
+
result
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Remove any extra fields that indicate they can be safely suppressed.
|
|
69
|
+
def suppress_fields!(fields)
|
|
70
|
+
reject! do |k, v|
|
|
71
|
+
v.suppress? if fields == true || [*fields].include?(k)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def to_local_bin
|
|
76
|
+
ordered_values.map! { |v| v.to_local_bin.force_encoding('BINARY') }.join
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
alias to_s to_local_bin
|
|
80
|
+
|
|
81
|
+
def to_c_dir_bin
|
|
82
|
+
ordered_values.map! { |v| v.to_c_dir_bin.force_encoding('BINARY') }.join
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def c_dir_size
|
|
86
|
+
to_c_dir_bin.bytesize
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def local_size
|
|
90
|
+
to_local_bin.bytesize
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
alias length local_size
|
|
94
|
+
alias size local_size
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
require 'ziperu/extra_field/unknown'
|
|
99
|
+
require 'ziperu/extra_field/generic'
|
|
100
|
+
require 'ziperu/extra_field/universal_time'
|
|
101
|
+
require 'ziperu/extra_field/old_unix'
|
|
102
|
+
require 'ziperu/extra_field/unix'
|
|
103
|
+
require 'ziperu/extra_field/zip64'
|
|
104
|
+
require 'ziperu/extra_field/ntfs'
|
|
105
|
+
require 'ziperu/extra_field/aes'
|
|
106
|
+
|
|
107
|
+
# Copyright (C) 2002, 2003 Thomas Sondergaard
|
|
108
|
+
# rubyzip is free software; you can redistribute it and/or
|
|
109
|
+
# modify it under the terms of the ruby license.
|