Automatyczne czyszczenie metadanych plików w schowku za pomocą Pythona
Demon działający w tle dla Windows przechwytuje pliki w schowku zaraz po skopiowaniu i usuwa z nich metadane przed wklejeniem. Pozwala to uniknąć ręcznego przetwarzania obrazów, dokumentów i wideo za pomocą ExifTool lub narzędzi systemowych. Przetwarzanie odbywa się lokalnie bez przesyłania danych na zewnątrz, z ochroną przed uszkodzeniami i atakami przez dowiązania symboliczne.
Praca ze schowkiem przez Win32 API
Monitorowanie schowka realizowane jest przez wątek ClipboardMonitor, który sprawdza clipboard co 500 ms. Kluczowy format to CF_HDROP, zawierający listę ścieżek do plików.
Problemy z pywin32:
- W starszych wersjach
GetClipboardData(CF_HDROP)zwraca wskaźnik doDROPFILES, wymagającyDragQueryFileWzshell32.dllprzezctypes. - W nowszych — listę ciągów znaków, ale PyInstaller lub niezgodność DLL psuje zachowanie.
Kod sprawdzający:
if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_HDROP):
file_list = win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)
Walidacja ścieżek dla bezpieczeństwa
Przed przetworzeniem ścieżki przechodzą rygorystyczne kontrole w validate_path:
- Ścieżka bezwzględna.
- Porównanie inode oryginału i resolved_path (blokowanie dowiązań symbolicznych).
- Wykluczenie katalogów w
WINDIR. - Limit liczby plików (ochrona przed masowym przetwarzaniem).
Zapobiega to atakom przez symlinki i przetwarzaniu katalogów systemowych. Dodatkowo sprawdzane jest resolved_path.is_file() dla wykluczenia folderów.
Architektura przetwarzania: nadpisywanie w miejscu
Pliki są nadpisywane oryginalną ścieżką bez podmiany w schowku — upraszcza to pracę z blokadami pamięci Windows. Sekwencja:
- Kopiowanie pliku do schowka.
- Wykrycie
CF_HDROP. - Walidacja i przekazanie do
MetadataScrubber. - Nadpisanie oczyszczoną wersją.
Czyszczenie obrazów: atomowa wymiana
Obsługa JPEG, PNG, TIFF, BMP. Usuwane są EXIF z danymi geolokalizacyjnymi, urządzeniem, oprogramowaniem.
Strategia — plik tymczasowy dla atomowości:
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))
Gwarantuje integralność: wklejenie otrzymuje albo oryginał, albo oczyszczony plik.
DOCX: bezpośrednia edycja XML
python-docx zmienia właściwości, ale nie śledzenie zmian i komentarze. Rozwiązanie — parsowanie części _blob:
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 z replace usuwa tagi rewizji u źródła, czyniąc dokument finalnym dla Worda. Ryzyko — złożone tabele.
PDF i wideo: podstawowa obsługa
PDF przez pypdf:
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.add_metadata({})
Przebudowa bez metadanych. Wideo (MP4, MKV, MOV) — podstawowe czyszczenie atomów, pełne wymaga ffmpeg.
Problemy z zasobnikiem systemowym
Rezygnacja z powiadomień z powodu błędów Shell_NotifyIcon:
- Nieprawidłowy lifecycle HWND prowadzi do błędów
DestroyWindow. - Obiekty COM crashują przy zamykaniu Tkinter.
Rozwiązanie — wycięcie modułu dla stabilności tła. Polling 500 ms daje 0% CPU w bezczynności.
Co jest ważne
- Automatyczne czyszczenie metadanych (EXIF, śledzenie zmian, dane geolokalizacyjne) przy kopiowaniu do schowka.
- Ochrona przed atakami przez dowiązania symboliczne i ścieżkami systemowymi przez walidację.
- Atomowe nadpisywanie plików bez ryzyka uszkodzeń.
- Lokalne przetwarzanie w Pythonie (PIL, pywin32, pypdf) bez zewnętrznych serwerów.
- Zoptymalizowane monitorowanie schowka z minimalnym obciążeniem.
— Editorial Team
Brak komentarzy.