diff options
Diffstat (limited to '')
-rw-r--r-- | CPP/7zip/Archive/Zip/ZipItem.cpp | 68 |
1 files changed, 56 insertions, 12 deletions
diff --git a/CPP/7zip/Archive/Zip/ZipItem.cpp b/CPP/7zip/Archive/Zip/ZipItem.cpp index be33648..cffbb78 100644 --- a/CPP/7zip/Archive/Zip/ZipItem.cpp +++ b/CPP/7zip/Archive/Zip/ZipItem.cpp | |||
@@ -30,11 +30,12 @@ static const CUInt32PCharPair g_ExtraTypes[] = | |||
30 | { | 30 | { |
31 | { NExtraID::kZip64, "Zip64" }, | 31 | { NExtraID::kZip64, "Zip64" }, |
32 | { NExtraID::kNTFS, "NTFS" }, | 32 | { NExtraID::kNTFS, "NTFS" }, |
33 | { NExtraID::kUnix0, "UNIX" }, | ||
33 | { NExtraID::kStrongEncrypt, "StrongCrypto" }, | 34 | { NExtraID::kStrongEncrypt, "StrongCrypto" }, |
34 | { NExtraID::kUnixTime, "UT" }, | 35 | { NExtraID::kUnixTime, "UT" }, |
35 | { NExtraID::kUnixExtra, "UX" }, | 36 | { NExtraID::kUnix1, "UX" }, |
36 | { NExtraID::kUnix2Extra, "Ux" }, | 37 | { NExtraID::kUnix2, "Ux" }, |
37 | { NExtraID::kUnix3Extra, "ux" }, | 38 | { NExtraID::kUnixN, "ux" }, |
38 | { NExtraID::kIzUnicodeComment, "uc" }, | 39 | { NExtraID::kIzUnicodeComment, "uc" }, |
39 | { NExtraID::kIzUnicodeName, "up" }, | 40 | { NExtraID::kIzUnicodeName, "up" }, |
40 | { NExtraID::kIzNtSecurityDescriptor, "SD" }, | 41 | { NExtraID::kIzNtSecurityDescriptor, "SD" }, |
@@ -50,6 +51,23 @@ void CExtraSubBlock::PrintInfo(AString &s) const | |||
50 | if (pair.Value == ID) | 51 | if (pair.Value == ID) |
51 | { | 52 | { |
52 | s += pair.Name; | 53 | s += pair.Name; |
54 | if (ID == NExtraID::kUnixTime) | ||
55 | { | ||
56 | if (Data.Size() >= 1) | ||
57 | { | ||
58 | s += ':'; | ||
59 | const Byte flags = Data[0]; | ||
60 | if (flags & 1) s += 'M'; | ||
61 | if (flags & 2) s += 'A'; | ||
62 | if (flags & 4) s += 'C'; | ||
63 | const UInt32 size = (UInt32)(Data.Size()) - 1; | ||
64 | if (size % 4 == 0) | ||
65 | { | ||
66 | s += ':'; | ||
67 | s.Add_UInt32(size / 4); | ||
68 | } | ||
69 | } | ||
70 | } | ||
53 | /* | 71 | /* |
54 | if (ID == NExtraID::kApkAlign && Data.Size() >= 2) | 72 | if (ID == NExtraID::kApkAlign && Data.Size() >= 2) |
55 | { | 73 | { |
@@ -133,14 +151,22 @@ bool CExtraSubBlock::ExtractNtfsTime(unsigned index, FILETIME &ft) const | |||
133 | return false; | 151 | return false; |
134 | } | 152 | } |
135 | 153 | ||
136 | bool CExtraSubBlock::ExtractUnixTime(bool isCentral, unsigned index, UInt32 &res) const | 154 | bool CExtraSubBlock::Extract_UnixTime(bool isCentral, unsigned index, UInt32 &res) const |
137 | { | 155 | { |
156 | /* Info-Zip : | ||
157 | The central-header extra field contains the modification | ||
158 | time only, or no timestamp at all. | ||
159 | Size of Data is used to flag its presence or absence | ||
160 | If "Flags" indicates that Modtime is present in the local header | ||
161 | field, it MUST be present in the central header field, too | ||
162 | */ | ||
163 | |||
138 | res = 0; | 164 | res = 0; |
139 | UInt32 size = (UInt32)Data.Size(); | 165 | UInt32 size = (UInt32)Data.Size(); |
140 | if (ID != NExtraID::kUnixTime || size < 5) | 166 | if (ID != NExtraID::kUnixTime || size < 5) |
141 | return false; | 167 | return false; |
142 | const Byte *p = (const Byte *)Data; | 168 | const Byte *p = (const Byte *)Data; |
143 | Byte flags = *p++; | 169 | const Byte flags = *p++; |
144 | size--; | 170 | size--; |
145 | if (isCentral) | 171 | if (isCentral) |
146 | { | 172 | { |
@@ -168,18 +194,35 @@ bool CExtraSubBlock::ExtractUnixTime(bool isCentral, unsigned index, UInt32 &res | |||
168 | } | 194 | } |
169 | 195 | ||
170 | 196 | ||
171 | bool CExtraSubBlock::ExtractUnixExtraTime(unsigned index, UInt32 &res) const | 197 | // Info-ZIP's abandoned "Unix1 timestamps & owner ID info" |
198 | |||
199 | bool CExtraSubBlock::Extract_Unix01_Time(unsigned index, UInt32 &res) const | ||
172 | { | 200 | { |
173 | res = 0; | 201 | res = 0; |
174 | const size_t size = Data.Size(); | 202 | const unsigned offset = index * 4; |
175 | unsigned offset = index * 4; | 203 | if (Data.Size() < offset + 4) |
176 | if (ID != NExtraID::kUnixExtra || size < offset + 4) | 204 | return false; |
205 | if (ID != NExtraID::kUnix0 && | ||
206 | ID != NExtraID::kUnix1) | ||
177 | return false; | 207 | return false; |
178 | const Byte *p = (const Byte *)Data + offset; | 208 | const Byte *p = (const Byte *)Data + offset; |
179 | res = GetUi32(p); | 209 | res = GetUi32(p); |
180 | return true; | 210 | return true; |
181 | } | 211 | } |
182 | 212 | ||
213 | /* | ||
214 | // PKWARE's Unix "extra" is similar to Info-ZIP's abandoned "Unix1 timestamps" | ||
215 | bool CExtraSubBlock::Extract_Unix_Time(unsigned index, UInt32 &res) const | ||
216 | { | ||
217 | res = 0; | ||
218 | const unsigned offset = index * 4; | ||
219 | if (ID != NExtraID::kUnix0 || Data.Size() < offset) | ||
220 | return false; | ||
221 | const Byte *p = (const Byte *)Data + offset; | ||
222 | res = GetUi32(p); | ||
223 | return true; | ||
224 | } | ||
225 | */ | ||
183 | 226 | ||
184 | bool CExtraBlock::GetNtfsTime(unsigned index, FILETIME &ft) const | 227 | bool CExtraBlock::GetNtfsTime(unsigned index, FILETIME &ft) const |
185 | { | 228 | { |
@@ -199,7 +242,7 @@ bool CExtraBlock::GetUnixTime(bool isCentral, unsigned index, UInt32 &res) const | |||
199 | { | 242 | { |
200 | const CExtraSubBlock &sb = SubBlocks[i]; | 243 | const CExtraSubBlock &sb = SubBlocks[i]; |
201 | if (sb.ID == NFileHeader::NExtraID::kUnixTime) | 244 | if (sb.ID == NFileHeader::NExtraID::kUnixTime) |
202 | return sb.ExtractUnixTime(isCentral, index, res); | 245 | return sb.Extract_UnixTime(isCentral, index, res); |
203 | } | 246 | } |
204 | } | 247 | } |
205 | 248 | ||
@@ -214,8 +257,9 @@ bool CExtraBlock::GetUnixTime(bool isCentral, unsigned index, UInt32 &res) const | |||
214 | FOR_VECTOR (i, SubBlocks) | 257 | FOR_VECTOR (i, SubBlocks) |
215 | { | 258 | { |
216 | const CExtraSubBlock &sb = SubBlocks[i]; | 259 | const CExtraSubBlock &sb = SubBlocks[i]; |
217 | if (sb.ID == NFileHeader::NExtraID::kUnixExtra) | 260 | if (sb.ID == NFileHeader::NExtraID::kUnix0 || |
218 | return sb.ExtractUnixExtraTime(index, res); | 261 | sb.ID == NFileHeader::NExtraID::kUnix1) |
262 | return sb.Extract_Unix01_Time(index, res); | ||
219 | } | 263 | } |
220 | } | 264 | } |
221 | return false; | 265 | return false; |