Skip to content

Commit bf1f3dd

Browse files
committed
Small update
1 parent 5b0b103 commit bf1f3dd

1 file changed

Lines changed: 31 additions & 5 deletions

File tree

pycatfile/pyfile.py

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import atexit
2929
import shutil
3030
import base64
31+
import struct
3132
import logging
3233
import zipfile
3334
import platform
@@ -1080,6 +1081,31 @@ def format_ns_local(ts_ns, fmt='%Y-%m-%d %H:%M:%S'):
10801081
ns_str = "%09d" % ns
10811082
return base + "." + ns_str
10821083

1084+
def get_unix_timestamp_zip(member):
1085+
extra = member.extra
1086+
i = 0
1087+
1088+
# 1. Try to find UTC Extra Fields
1089+
while i + 4 <= len(extra):
1090+
tag, length = struct.unpack('<HH', extra[i:i+4])
1091+
data = extra[i+4 : i+4+length]
1092+
1093+
# 0x5455: Info-ZIP (Unix)
1094+
if tag == 0x5455 and len(data) >= 5:
1095+
if data[0] & 1:
1096+
return struct.unpack('<I', data[1:5])[0]
1097+
1098+
# 0x000a: NTFS (Windows)
1099+
elif tag == 0x000a and len(data) >= 24:
1100+
ntfs_mtime = struct.unpack('<Q', data[8:16])[0]
1101+
return int((ntfs_mtime / 1e7) - 11644473600)
1102+
1103+
i += 4 + length
1104+
1105+
# 2. Fallback: Convert MS-DOS date_time to Unix integer
1106+
dt = datetime.datetime(*member.date_time)
1107+
return int(dt.replace(tzinfo=datetime.timezone.utc).timestamp())
1108+
10831109
def CheckSumSupport(checkfor, guaranteed=True):
10841110
if(guaranteed):
10851111
try:
@@ -6429,13 +6455,13 @@ def AppendFilesWithContentFromZipFileToList(infile, extradata=[], jsondata={}, c
64296455
else:
64306456
fsize = format(int(member.file_size), 'x').lower()
64316457
fatime = 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()
64336459
fmtime = format(
6434-
int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower()
6460+
int(to_ns(get_unix_timestamp_zip(member))), 'x').lower()
64356461
fctime = format(
6436-
int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower()
6462+
int(to_ns(get_unix_timestamp_zip(member))), 'x').lower()
64376463
fbtime = format(
6438-
int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower()
6464+
int(to_ns(get_unix_timestamp_zip(member))), 'x').lower()
64396465
if(zipinfo.create_system == 0 or zipinfo.create_system == 10):
64406466
fwinattributes = format(int(zipinfo.external_attr & 0xFFFF), 'x').lower()
64416467
if ((hasattr(member, "is_dir") and member.is_dir()) or member.filename.endswith('/')):
@@ -9477,7 +9503,7 @@ def ZipFileListFiles(infile, verbose=False, returnfp=False):
94779503
if(len(fgprint) <= 0):
94789504
fgprint = str(fgid)
94799505
VerbosePrintOut(PrintPermissionString(fmode, ftype) + " " + str(fuprint) + "/" + str(fgprint) + " " + str(member.file_size).rjust(
9480-
15) + " " + datetime.datetime.utcfromtimestamp(int(time.mktime(member.date_time + (0, 0, -1)))).strftime('%Y-%m-%d %H:%M') + " " + printfname)
9506+
15) + " " + datetime.datetime.utcfromtimestamp(int(get_unix_timestamp_zip(zipinfo))).strftime('%Y-%m-%d %H:%M') + " " + printfname)
94819507
lcfi = lcfi + 1
94829508
if(returnfp):
94839509
return listarrayfiles['fp']

0 commit comments

Comments
 (0)