archive-zip 0.4.0 → 0.5.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.
data/NEWS
CHANGED
@@ -6,7 +6,18 @@ detailed information is available in the rest of the documentation.
|
|
6
6
|
<b>NOTE:</b> Date stamps in the following entries are in YYYY/MM/DD format.
|
7
7
|
|
8
8
|
|
9
|
-
== v0.
|
9
|
+
== v0.5.0 (2012/03/01)
|
10
|
+
|
11
|
+
=== Fixes
|
12
|
+
|
13
|
+
* Avoid timezone discrepancies in encryption tests.
|
14
|
+
* Moved the DOSTime class to the Archive namespace (Chris Schneider).
|
15
|
+
|
16
|
+
=== Notes
|
17
|
+
|
18
|
+
* Broke backward compatibility of the DOSTime class.
|
19
|
+
|
20
|
+
== v0.4.0 (2011/08/29)
|
10
21
|
|
11
22
|
=== Features
|
12
23
|
|
data/Rakefile
CHANGED
@@ -75,6 +75,8 @@ PKG_FILES = FileList.new('**/*', '**/.[^.][^.]*') do |files|
|
|
75
75
|
files.exclude('**/.*.sw?')
|
76
76
|
# Exclude Git administrative files and directories.
|
77
77
|
files.exclude(%r{(^|[/\\])\.git(ignore|modules)?([/\\]|$)})
|
78
|
+
# Exclude Rubunius compiled Ruby files.
|
79
|
+
files.exclude('**/*.rbc')
|
78
80
|
|
79
81
|
# Exclude the top level pkg, doc, and examples directories and their contents.
|
80
82
|
files.exclude(%r{^(pkg|doc|examples)([/\\]|$)})
|
data/lib/archive/support/time.rb
CHANGED
@@ -14,7 +14,7 @@ class Time
|
|
14
14
|
dos_year = 0 if dos_year < 0
|
15
15
|
dos_year = 119 if dos_year > 119
|
16
16
|
|
17
|
-
DOSTime.new(
|
17
|
+
Archive::DOSTime.new(
|
18
18
|
(dos_sec ) |
|
19
19
|
(min << 5) |
|
20
20
|
(hour << 11) |
|
@@ -27,61 +27,64 @@ end
|
|
27
27
|
|
28
28
|
# A representation of the DOS time structure which can be converted into
|
29
29
|
# instances of Time.
|
30
|
-
|
31
|
-
|
30
|
+
module Archive
|
31
|
+
class DOSTime
|
32
|
+
include Comparable
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
34
|
+
# Creates a new instance of DOSTime. _dos_time_ is a 4 byte String or
|
35
|
+
# unsigned number (Integer) representing an MS-DOS time structure where:
|
36
|
+
# Bits 0-4:: 2 second increments (0-29)
|
37
|
+
# Bits 5-10:: minutes (0-59)
|
38
|
+
# Bits 11-15:: hours (0-24)
|
39
|
+
# Bits 16-20:: day (1-31)
|
40
|
+
# Bits 21-24:: month (1-12)
|
41
|
+
# Bits 25-31:: four digit year minus 1980 (0-119)
|
42
|
+
#
|
43
|
+
# If _dos_time_ is ommitted or +nil+, a new instance is created based on the
|
44
|
+
# current time.
|
45
|
+
def initialize(dos_time = nil)
|
46
|
+
case dos_time
|
47
|
+
when nil
|
48
|
+
@dos_time = Time.now.to_dos_time.dos_time
|
49
|
+
when Integer
|
50
|
+
@dos_time = dos_time
|
51
|
+
else
|
52
|
+
unless dos_time.length == 4 then
|
53
|
+
raise ArgumentError, 'length of DOS time structure is not 4'
|
54
|
+
end
|
55
|
+
@dos_time = dos_time.unpack('V')[0]
|
53
56
|
end
|
54
|
-
@dos_time = dos_time.unpack('V')[0]
|
55
57
|
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# Returns -1 if _other_ is a time earlier than this one, 0 if _other_ is the
|
59
|
-
# same time, and 1 if _other_ is a later time.
|
60
|
-
def cmp(other)
|
61
|
-
@dos_time <=> other.dos_time
|
62
|
-
end
|
63
|
-
alias :<=> :cmp
|
64
58
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
59
|
+
# Returns -1 if _other_ is a time earlier than this one, 0 if _other_ is the
|
60
|
+
# same time, and 1 if _other_ is a later time.
|
61
|
+
def cmp(other)
|
62
|
+
to_i <=> other.to_i
|
63
|
+
end
|
64
|
+
alias :<=> :cmp
|
70
65
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
hour = ((0b11111 << 11 & @dos_time) >> 11)
|
77
|
-
day = ((0b11111 << 16 & @dos_time) >> 16)
|
78
|
-
month = ((0b1111 << 21 & @dos_time) >> 21)
|
79
|
-
year = ((0b1111111 << 25 & @dos_time) >> 25) + 1980
|
80
|
-
return Time.local(year, month, day, hour, minute, second)
|
81
|
-
end
|
66
|
+
# Returns the time value of this object as an integer representing the DOS
|
67
|
+
# time structure.
|
68
|
+
def to_i
|
69
|
+
@dos_time
|
70
|
+
end
|
82
71
|
|
83
|
-
|
72
|
+
# Returns the 32 bit integer that backs this object packed into a String in
|
73
|
+
# little endian format. This is suitable for use with #new.
|
74
|
+
def pack
|
75
|
+
[to_i].pack('V')
|
76
|
+
end
|
84
77
|
|
85
|
-
|
86
|
-
|
78
|
+
# Returns a Time instance which is equivalent to the time represented by
|
79
|
+
# this object.
|
80
|
+
def to_time
|
81
|
+
second = ((0b11111 & @dos_time) ) * 2
|
82
|
+
minute = ((0b111111 << 5 & @dos_time) >> 5)
|
83
|
+
hour = ((0b11111 << 11 & @dos_time) >> 11)
|
84
|
+
day = ((0b11111 << 16 & @dos_time) >> 16)
|
85
|
+
month = ((0b1111 << 21 & @dos_time) >> 21)
|
86
|
+
year = ((0b1111111 << 25 & @dos_time) >> 25) + 1980
|
87
|
+
return Time.local(year, month, day, hour, minute, second)
|
88
|
+
end
|
89
|
+
end
|
87
90
|
end
|
@@ -58,13 +58,9 @@ module Archive; class Zip; module Codec
|
|
58
58
|
# flipped before processing. The new CRC value must have its bits
|
59
59
|
# flipped as well for storage and later use. This applies to the
|
60
60
|
# handling of @key0 and @key2.
|
61
|
-
|
62
|
-
# NOTE: XOR'ing with 0xffffffff is used instead of simple bit negation
|
63
|
-
# in case this is run on a platform with a native integer size of
|
64
|
-
# something other than 32 bits.
|
65
|
-
@key0 = Zlib.crc32(char, @key0 ^ 0xffffffff) ^ 0xffffffff
|
61
|
+
@key0 = ~Zlib.crc32(char, ~@key0)
|
66
62
|
@key1 = ((@key1 + (@key0 & 0xff)) * 134775813 + 1) & 0xffffffff
|
67
|
-
@key2 = Zlib.crc32((@key1 >> 24).chr,
|
63
|
+
@key2 = ~Zlib.crc32((@key1 >> 24).chr, ~@key2)
|
68
64
|
nil
|
69
65
|
end
|
70
66
|
|
@@ -157,14 +153,13 @@ module Archive; class Zip; module Codec
|
|
157
153
|
|
158
154
|
# Create and encrypt a 12 byte header to protect the encrypted file data
|
159
155
|
# from attack. The first 10 bytes are random, and the last 2 bytes are
|
160
|
-
# the low order word
|
161
|
-
# format.
|
156
|
+
# the low order word in little endian byte order of the last modified
|
157
|
+
# time of the entry in DOS format.
|
162
158
|
header = ''
|
163
159
|
10.times do
|
164
160
|
header << rand(256).chr
|
165
161
|
end
|
166
|
-
|
167
|
-
header << (time & 0xff).chr << ((time >> 8) & 0xff).chr
|
162
|
+
header << mtime.to_dos_time.pack[0, 2]
|
168
163
|
|
169
164
|
# Take care to ensure that all bytes in the header are written.
|
170
165
|
while header.size > 0 do
|
data/lib/archive/zip/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: archive-zip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-03-03 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: io-like
|
16
|
-
requirement: &
|
16
|
+
requirement: &12753840 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.3.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *12753840
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &12752440 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.9.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *12752440
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: mspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &12750780 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: 1.5.12
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *12750780
|
47
47
|
description: ! 'Archive::Zip provides a simple Ruby-esque interface to creating, extracting,
|
48
48
|
and
|
49
49
|
|
@@ -212,7 +212,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
212
212
|
version: '0'
|
213
213
|
requirements: []
|
214
214
|
rubyforge_project: archive-zip
|
215
|
-
rubygems_version: 1.8.
|
215
|
+
rubygems_version: 1.8.10
|
216
216
|
signing_key:
|
217
217
|
specification_version: 3
|
218
218
|
summary: Simple, extensible, pure Ruby ZIP archive support.
|