|
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 |
@@ -1074,6 +1075,31 @@ def format_ns_local(ts_ns, fmt='%Y-%m-%d %H:%M:%S'): |
1074 | 1075 | ns_str = "%09d" % ns |
1075 | 1076 | return base + "." + ns_str |
1076 | 1077 |
|
| 1078 | +def get_unix_timestamp_zip(member): |
| 1079 | + extra = member.extra |
| 1080 | + i = 0 |
| 1081 | + |
| 1082 | + # 1. Try to find UTC Extra Fields |
| 1083 | + while i + 4 <= len(extra): |
| 1084 | + tag, length = struct.unpack('<HH', extra[i:i+4]) |
| 1085 | + data = extra[i+4 : i+4+length] |
| 1086 | + |
| 1087 | + # 0x5455: Info-ZIP (Unix) |
| 1088 | + if tag == 0x5455 and len(data) >= 5: |
| 1089 | + if data[0] & 1: |
| 1090 | + return struct.unpack('<I', data[1:5])[0] |
| 1091 | + |
| 1092 | + # 0x000a: NTFS (Windows) |
| 1093 | + elif tag == 0x000a and len(data) >= 24: |
| 1094 | + ntfs_mtime = struct.unpack('<Q', data[8:16])[0] |
| 1095 | + return int((ntfs_mtime / 1e7) - 11644473600) |
| 1096 | + |
| 1097 | + i += 4 + length |
| 1098 | + |
| 1099 | + # 2. Fallback: Convert MS-DOS date_time to Unix integer |
| 1100 | + dt = datetime.datetime(*member.date_time) |
| 1101 | + return int(dt.replace(tzinfo=datetime.timezone.utc).timestamp()) |
| 1102 | + |
1077 | 1103 | def CheckSumSupport(checkfor, guaranteed=True): |
1078 | 1104 | if(guaranteed): |
1079 | 1105 | try: |
@@ -6423,13 +6449,13 @@ def AppendFilesWithContentFromZipFileToList(infile, extradata=[], jsondata={}, c |
6423 | 6449 | else: |
6424 | 6450 | fsize = format(int(member.file_size), 'x').lower() |
6425 | 6451 | fatime = format( |
6426 | | - int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower() |
| 6452 | + int(to_ns(get_unix_timestamp_zip(member))), 'x').lower() |
6427 | 6453 | fmtime = format( |
6428 | | - int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower() |
| 6454 | + int(to_ns(get_unix_timestamp_zip(member))), 'x').lower() |
6429 | 6455 | fctime = format( |
6430 | | - int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower() |
| 6456 | + int(to_ns(get_unix_timestamp_zip(member))), 'x').lower() |
6431 | 6457 | fbtime = format( |
6432 | | - int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower() |
| 6458 | + int(to_ns(get_unix_timestamp_zip(member))), 'x').lower() |
6433 | 6459 | if(zipinfo.create_system == 0 or zipinfo.create_system == 10): |
6434 | 6460 | fwinattributes = format(int(zipinfo.external_attr & 0xFFFF), 'x').lower() |
6435 | 6461 | if ((hasattr(member, "is_dir") and member.is_dir()) or member.filename.endswith('/')): |
@@ -9471,7 +9497,7 @@ def ZipFileListFiles(infile, verbose=False, returnfp=False): |
9471 | 9497 | if(len(fgprint) <= 0): |
9472 | 9498 | fgprint = str(fgid) |
9473 | 9499 | VerbosePrintOut(PrintPermissionString(fmode, ftype) + " " + str(fuprint) + "/" + str(fgprint) + " " + str(member.file_size).rjust( |
9474 | | - 15) + " " + datetime.datetime.utcfromtimestamp(int(time.mktime(member.date_time + (0, 0, -1)))).strftime('%Y-%m-%d %H:%M') + " " + printfname) |
| 9500 | + 15) + " " + datetime.datetime.utcfromtimestamp(int(get_unix_timestamp_zip(zipinfo))).strftime('%Y-%m-%d %H:%M') + " " + printfname) |
9475 | 9501 | lcfi = lcfi + 1 |
9476 | 9502 | if(returnfp): |
9477 | 9503 | return listarrayfiles['fp'] |
|
0 commit comments