#!/bin/bash # delete_starface_chat.sh — loescht den kompletten Chat-Verlauf eines Starface-Users # aus der Openfire-Chat-DB (Postgres, Datenbank "asterisk"). # # Aufruf: # ./delete_starface_chat.sh # # ist die Starface-Benutzer-ID wie sie im JID-Format verwendet wird, # z.B. "0001" (JID dann 0001@). Einfach die Nummer/den Login-Namen # des Users angeben, wie er in Starface als Benutzer-ID gefuehrt wird. # # Was das Script macht: # 1. Findet alle Konversationen (ofconversation) in denen der User als # Absender oder Empfaenger vorkommt (fromjid/tojid LIKE '@%'). # 2. Sichert ALLE betroffenen Zeilen aus ofmessagearchive + ofconversation # als CSV-Backup nach /var/backups/starface_chat_backups/ BEVOR irgendwas # geloescht wird. # 3. Loescht die Nachrichten aus ofmessagearchive. # 4. Loescht die zugehoerigen ofconversation-Eintraege, aber NUR wenn nach # dem Loeschen keine Nachricht mehr auf diese conversationid verweist # (falls doch noch andere Nutzer/Nachrichten dranhaengen, bleibt der # Konversations-Header stehen, nur ohne die geloeschten Nachrichten). # # Muss LOKAL auf dem Starface-Server laufen (braucht sudo-Zugriff auf den # postgres-User, psql muss installiert sein — ist bei Starface Standard). # # WICHTIG: Loescht die GEMEINSAME Konversation. Openfire speichert eine # Konversation zwischen zwei Usern als EINE gemeinsame History (keine # getrennten Kopien pro Teilnehmer). D.h. loescht man z.B. User 0022, dann # verschwindet auch bei dessen Chatpartnern (z.B. 0005) genau dieser eine # Chat mit 0022 — alle anderen Chats von 0005 mit anderen Usern bleiben # unberuehrt. Das ist technisch bedingt und so gewollt (siehe README). set -euo pipefail USER_ID="${1:-}" if [[ -z "$USER_ID" ]]; then echo "Usage: $0 " >&2 echo "Beispiel: $0 0001" >&2 exit 1 fi # Nur alphanumerisch + . _ - erlauben (keine SQL-Injection ueber das Argument) if [[ ! "$USER_ID" =~ ^[A-Za-z0-9._-]+$ ]]; then echo "Fehler: user_id enthaelt ungueltige Zeichen: '$USER_ID'" >&2 exit 1 fi JID_PATTERN="${USER_ID}@%" TS="$(date +%Y%m%d_%H%M%S)" BACKUP_DIR="/var/backups/starface_chat_backups" MSG_BACKUP="${BACKUP_DIR}/chat_backup_${USER_ID}_${TS}_messages.csv" CONV_BACKUP="${BACKUP_DIR}/chat_backup_${USER_ID}_${TS}_conversations.csv" mkdir -p "$BACKUP_DIR" chmod 777 "$BACKUP_DIR" # postgres-OS-User braucht Schreibzugriff fuer \copy PSQL="sudo -u postgres psql -d asterisk -v ON_ERROR_STOP=1" echo "== Starface Chat-Loeschung fuer User '${USER_ID}' ==" MSG_COUNT=$($PSQL -t -A -c "SELECT count(*) FROM ofmessagearchive WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}';") echo "Gefundene Nachrichten: ${MSG_COUNT}" if [[ "$MSG_COUNT" -eq 0 ]]; then echo "Keine Nachrichten fuer diesen User gefunden — nichts zu tun." exit 0 fi echo "Erstelle Backup..." $PSQL -c "\copy (SELECT * FROM ofmessagearchive WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}') TO '${MSG_BACKUP}' WITH CSV HEADER" $PSQL -c "\copy (SELECT * FROM ofconversation WHERE conversationid IN (SELECT DISTINCT conversationid FROM ofmessagearchive WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}')) TO '${CONV_BACKUP}' WITH CSV HEADER" echo "Backup gespeichert:" echo " ${MSG_BACKUP}" echo " ${CONV_BACKUP}" echo "Loesche Nachrichten + verwaiste Konversationen..." $PSQL <