|
28 | 28 | import atexit |
29 | 29 | import shutil |
30 | 30 | import base64 |
| 31 | +import struct |
31 | 32 | import logging |
32 | 33 | import zipfile |
33 | 34 | import platform |
@@ -1081,6 +1082,31 @@ def format_ns_local(ts_ns, fmt='%Y-%m-%d %H:%M:%S'): |
1081 | 1082 | ns_str = "%09d" % ns |
1082 | 1083 | return base + "." + ns_str |
1083 | 1084 |
|
| 1085 | +def get_unix_timestamp_zip(member): |
| 1086 | + extra = member.extra |
| 1087 | + i = 0 |
| 1088 | + |
| 1089 | + # 1. Try to find UTC Extra Fields |
| 1090 | + while i + 4 <= len(extra): |
| 1091 | + tag, length = struct.unpack('<HH', extra[i:i+4]) |
| 1092 | + data = extra[i+4 : i+4+length] |
| 1093 | + |
| 1094 | + # 0x5455: Info-ZIP (Unix) |
| 1095 | + if tag == 0x5455 and len(data) >= 5: |
| 1096 | + if data[0] & 1: |
| 1097 | + return struct.unpack('<I', data[1:5])[0] |
| 1098 | + |
| 1099 | + # 0x000a: NTFS (Windows) |
| 1100 | + elif tag == 0x000a and len(data) >= 24: |
| 1101 | + ntfs_mtime = struct.unpack('<Q', data[8:16])[0] |
| 1102 | + return int((ntfs_mtime / 1e7) - 11644473600) |
| 1103 | + |
| 1104 | + i += 4 + length |
| 1105 | + |
| 1106 | + # 2. Fallback: Convert MS-DOS date_time to Unix integer |
| 1107 | + dt = datetime.datetime(*member.date_time) |
| 1108 | + return int(dt.replace(tzinfo=datetime.timezone.utc).timestamp()) |
| 1109 | + |
1084 | 1110 | def CheckSumSupport(checkfor, guaranteed=True): |
1085 | 1111 | if(guaranteed): |
1086 | 1112 | try: |
@@ -6430,13 +6456,13 @@ def AppendFilesWithContentFromZipFileToList(infile, extradata=[], jsondata={}, c |
6430 | 6456 | else: |
6431 | 6457 | fsize = format(int(member.file_size), 'x').lower() |
6432 | 6458 | fatime = format( |
6433 | | - int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower() |
| 6459 | + int(to_ns(get_unix_timestamp_zip(member))), 'x').lower() |
6434 | 6460 | fmtime = format( |
6435 | | - int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower() |
| 6461 | + int(to_ns(get_unix_timestamp_zip(member))), 'x').lower() |
6436 | 6462 | fctime = format( |
6437 | | - int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower() |
| 6463 | + int(to_ns(get_unix_timestamp_zip(member))), 'x').lower() |
6438 | 6464 | fbtime = format( |
6439 | | - int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower() |
| 6465 | + int(to_ns(get_unix_timestamp_zip(member))), 'x').lower() |
6440 | 6466 | if(zipinfo.create_system == 0 or zipinfo.create_system == 10): |
6441 | 6467 | fwinattributes = format(int(zipinfo.external_attr & 0xFFFF), 'x').lower() |
6442 | 6468 | if ((hasattr(member, "is_dir") and member.is_dir()) or member.filename.endswith('/')): |
@@ -9478,7 +9504,7 @@ def ZipFileListFiles(infile, verbose=False, returnfp=False): |
9478 | 9504 | if(len(fgprint) <= 0): |
9479 | 9505 | fgprint = str(fgid) |
9480 | 9506 | VerbosePrintOut(PrintPermissionString(fmode, ftype) + " " + str(fuprint) + "/" + str(fgprint) + " " + str(member.file_size).rjust( |
9481 | | - 15) + " " + datetime.datetime.utcfromtimestamp(int(time.mktime(member.date_time + (0, 0, -1)))).strftime('%Y-%m-%d %H:%M') + " " + printfname) |
| 9507 | + 15) + " " + datetime.datetime.utcfromtimestamp(int(get_unix_timestamp_zip(zipinfo))).strftime('%Y-%m-%d %H:%M') + " " + printfname) |
9482 | 9508 | lcfi = lcfi + 1 |
9483 | 9509 | if(returnfp): |
9484 | 9510 | return listarrayfiles['fp'] |
|
0 commit comments