Automatische Metadatenbereinigung für Zwischenablage-Dateien in Python
Ein Hintergrund-Daemon für Windows fängt Dateien in der Zwischenablage direkt nach dem Kopieren ab und entfernt deren Metadaten vor dem Einfügen. Dadurch entfällt die manuelle Bearbeitung von Bildern, Dokumenten und Videos mit ExifTool oder Systemwerkzeugen. Die Verarbeitung erfolgt lokal ohne externe Datenübertragung, mit Schutz vor Beschädigung und Symlink-Angriffen.
Arbeiten mit der Zwischenablage über Win32-API
Die Zwischenablage-Überwachung wird durch einen ClipboardMonitor-Thread implementiert, der die Zwischenablage alle 500 ms abfragt. Das Schlüsselformat ist CF_HDROP, das eine Liste von Dateipfaden enthält.
Probleme mit pywin32:
- In älteren Versionen gibt
GetClipboardData(CF_HDROP)einen Zeiger aufDROPFILESzurück, wasDragQueryFileWausshell32.dllüberctypeserfordert. - In neueren Versionen gibt es eine Liste von Strings zurück, aber PyInstaller oder DLL-Fehlanpassungen können dieses Verhalten stören.
Prüfcode:
if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_HDROP):
file_list = win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)
Pfadvalidierung für Sicherheit
Vor der Verarbeitung durchlaufen Pfade strenge Prüfungen in validate_path:
- Absoluter Pfad.
- Vergleich von ursprünglichem Inode und resolved_path (um Symlinks zu blockieren).
- Ausschluss von Verzeichnissen in
WINDIR. - Begrenzung der Anzahl von Dateien (Schutz vor Massenverarbeitung).
Dies verhindert Symlink-Angriffe und die Verarbeitung von Systemverzeichnissen. Zusätzlich wird resolved_path.is_file() geprüft, um Ordner auszuschließen.
Verarbeitungsarchitektur: In-Place-Überschreibung
Dateien werden an ihrem ursprünglichen Pfad überschrieben, ohne Ersetzung in der Zwischenablage – dies vereinfacht den Umgang mit Windows-Sperren im Speicher. Ablauf:
- Kopieren einer Datei in die Zwischenablage.
- Erkennen von
CF_HDROP. - Validierung und Weitergabe an
MetadataScrubber. - Überschreiben mit der bereinigten Version.
Bildbereinigung: Atomare Ersetzung
Unterstützung für JPEG, PNG, TIFF, BMP. Entfernt EXIF-Daten einschließlich Geolokation, Geräte- und Softwareinformationen.
Strategie – temporäre Datei für Atomarität:
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))
Sichert Integrität: Einfügen erhält entweder die Original- oder die bereinigte Datei.
DOCX: Direkte XML-Bearbeitung
python-docx ändert Eigenschaften, aber nicht Änderungsnachverfolgung und Kommentare. Lösung – Parsen von _blob-Teilen:
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')
Ein Hack mit replace entfernt Revisions-Tags an der Wurzel, macht das Dokument für Word final. Risiko – komplexe Tabellen.
PDF und Video: Grundlegende Unterstützung
PDF über pypdf:
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.add_metadata({})
Neuerstellung ohne Metadaten. Video (MP4, MKV, MOV) – grundlegende Atom-Bereinigung; vollständige Bereinigung erfordert ffmpeg.
Probleme mit dem System Tray
Vermeidung von Benachrichtigungen aufgrund von Shell_NotifyIcon-Fehlern:
- Falscher HWND-Lebenszyklus führt zu
DestroyWindow-Fehlern. - COM-Objekte stürzen ab beim Schließen von Tkinter.
Lösung – Entfernung des Moduls für Hintergrundstabilität. Abfrage alle 500 ms führt zu 0% CPU-Auslastung im Leerlauf.
Wichtige Punkte
- Automatische Metadatenbereinigung (EXIF, Änderungsnachverfolgung, Geolokation) beim Kopieren in die Zwischenablage.
- Schutz vor Symlink-Angriffen und Systempfaden durch Validierung.
- Atomare Dateiüberschreibung ohne Korruptionsrisiko.
- Lokale Verarbeitung in Python (PIL, pywin32, pypdf) ohne externe Server.
- Optimierte Zwischenablage-Überwachung mit minimalem Overhead.
— Editorial Team
Noch keine Kommentare.