# -*- coding: utf-8 -*-
"""只操作本程序创建的临时对象；全部数据为合成样本。"""
import os, sys, json, sqlite3, tempfile, pathlib, subprocess, time, socket, stat
from pathlib import Path
def emit(**kw):
    print(json.dumps(kw, ensure_ascii=False, sort_keys=True))
import tarfile,io
assert hasattr(tarfile,'data_filter'), '要求带data_filter的Python；禁止降级fully_trusted'
with tempfile.TemporaryDirectory(prefix='ywebs-next132-b2-tar-') as d:
    p=Path(d); archive=p/'demo.tar'; out=p/'staging'; out.mkdir()
    with tarfile.open(str(archive),'w') as t:
        info=tarfile.TarInfo('demo.conf'); payload=b'demo=true\n'; info.size=len(payload); info.mode=0o4777; info.uid=0; info.gid=0; info.uname='root'; info.gname='root'; t.addfile(info,io.BytesIO(payload))
        directory=tarfile.TarInfo('sub'); directory.type=tarfile.DIRTYPE; directory.mode=0o777; t.addfile(directory)
    with tarfile.open(str(archive)) as t:
        original=t.getmember('demo.conf'); filtered=tarfile.data_filter(original,str(out)); dir_filtered=tarfile.data_filter(t.getmember('sub'),str(out))
        assert filtered.uid is None and filtered.gid is None and filtered.uname is None and filtered.gname is None and filtered.mode & 0o7022==0 and dir_filtered.mode is None
        t.extractall(str(out),filter='data')
    f=out/'demo.conf'; f.chmod(0o600); assert f.read_bytes()==payload
    special=tarfile.TarInfo('device'); special.type=tarfile.CHRTYPE
    try: tarfile.data_filter(special,str(out)); rejected=False
    except tarfile.FilterError: rejected=True
    assert rejected
    mode=stat.S_IMODE(f.stat().st_mode) if os.name=='posix' else None
    if mode is not None: assert mode==0o600
    emit(source_mode=oct(original.mode),filtered_mode=oct(filtered.mode),filtered_uid=filtered.uid,directory_mode=dir_filtered.mode,special_rejected=rejected,extracted_bytes=len(payload),linux_final_mode=oct(mode) if mode is not None else None,scope='Windows不证明POSIX权限；Linux需另跑')
