Automatické čištění metadat souborů ve schránce v Pythonu
Na pozadí běžící démon pro Windows zachytává soubory ve schránce ihned po zkopírování a odstraňuje z nich metadata před vložením. Tím odpadá ruční zpracování obrázků, dokumentů a videí pomocí ExifTool nebo systémových utilit. Zpracování probíhá lokálně bez přenosu dat ven, s ochranou proti poškození a útokům přes symbolické odkazy.
Práce se schránkou přes Win32 API
Monitorování schránky realizuje vlákno ClipboardMonitor, které kontroluje clipboard každých 500 ms. Klíčový formát je CF_HDROP, obsahující seznam cest k souborům.
Problémy s pywin32:
- Ve starších verzích
GetClipboardData(CF_HDROP)vrací ukazatel naDROPFILES, vyžadujícíDragQueryFileWzshell32.dllpřesctypes. - V novějších — seznam řetězců, ale PyInstaller nebo nekompatibilita DLL narušuje chování.
Kód kontroly:
if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_HDROP):
file_list = win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)
Validace cest pro bezpečnost
Před zpracováním cesty procházejí přísnými kontrolami v validate_path:
- Absolutní cesta.
- Porovnání inode originálu a resolved_path (blokování symbolických odkazů).
- Vyloučení adresářů v
WINDIR. - Limit na počet souborů (ochrana proti hromadnému zpracování).
Tím se předchází symlink-útokům a zpracování systémových adresářů. Doplňkově se kontroluje resolved_path.is_file() pro vyloučení složek.
Architektura zpracování: přepsání na místě
Soubory jsou přepsány původní cestou bez nahrazení ve schránce — to zjednodušuje práci s blokováním paměti Windows. Posloupnost:
- Zkopírování souboru do schránky.
- Detekce
CF_HDROP. - Validace a předání do
MetadataScrubber. - Přepsání očištěnou verzí.
Čištění obrázků: atomární nahrazení
Podpora JPEG, PNG, TIFF, BMP. Odstraňují se EXIF s geodaty, zařízením, softwarem.
Strategie — dočasný soubor pro atomičnost:
with Image.open(file_path) as img:
data = list(img.getdata())
image_without_exif = Image.new(img.mode, img.size)
image_without_exif.putdata(data)
temp_path = file_path.with_suffix(file_path.suffix + '.temp')
image_without_exif.save(temp_path, format=format_name)
shutil.move(str(temp_path), str(file_path))
Zaručuje integritu: vložení obdrží buď originál, nebo očištěný soubor.
DOCX: přímá editace XML
python-docx mění vlastnosti, ale ne Sledování změn a komentáře. Řešení — parsování _blob částí:
xml = part._blob.decode('utf-8')
if 'w:revision' in xml or 'w:ins' in xml or 'w:del' in xml:
xml = xml.replace('w:revision', 'w:revision_removed')\
.replace('w:ins ', 'w:p ')\
.replace('w:del ', 'w:p ')
part._blob = xml.encode('utf-8')
Hack s replace odstraní tagy revizí u kořene, čímž se dokument stane finálním pro Word. Riziko — složité tabulky.
PDF a videa: základní podpora
PDF přes pypdf:
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.add_metadata({})
Přeskládání bez metadat. Videa (MP4, MKV, MOV) — základní čištění atomů, úplné vyžaduje ffmpeg.
Problémy se systémovou lištou
Vynechání upozornění kvůli chybám Shell_NotifyIcon:
- Nesprávný lifecycle HWND vede k
DestroyWindowselháním. - COM-objekty padají při zavření Tkinter.
Řešení — odstranění modulu pro stabilitu na pozadí. Polling 500 ms dává 0% CPU při nečinnosti.
Co je důležité
- Automatické čištění metadat (EXIF, Sledování změn, geodata) při kopírování do schránky.
- Ochrana proti symlink-útokům a systémovým cestám přes validaci.
- Atomární přepsání souborů bez rizika poškození.
- Lokální zpracování v Pythonu (PIL, pywin32, pypdf) bez externích serverů.
- Optimalizované monitorování schránky s minimální zátěží.
— Editorial Team
Zatím žádné komentáře.