Add Starface Chat-Loesch-Script mit README

This commit is contained in:
ARIA
2026-07-21 09:52:19 +00:00
commit 322270ee44
2 changed files with 184 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
#!/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 <user_id>
#
# <user_id> ist die Starface-Benutzer-ID wie sie im JID-Format verwendet wird,
# z.B. "0001" (JID dann 0001@<starface-ip>). 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 '<user_id>@%').
# 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 <user_id>" >&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 <<SQL
BEGIN;
CREATE TEMP TABLE affected_conv AS
SELECT DISTINCT conversationid FROM ofmessagearchive
WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}';
DELETE FROM ofmessagearchive
WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}';
-- Konversationen nur loeschen wenn wirklich keine Nachricht mehr uebrig ist
DELETE FROM ofconversation
WHERE conversationid IN (SELECT conversationid FROM affected_conv)
AND conversationid NOT IN (SELECT DISTINCT conversationid FROM ofmessagearchive);
COMMIT;
SQL
REMAINING=$($PSQL -t -A -c "SELECT count(*) FROM ofmessagearchive WHERE fromjid LIKE '${JID_PATTERN}' OR tojid LIKE '${JID_PATTERN}';")
echo "Fertig. Verbleibende Nachrichten fuer '${USER_ID}': ${REMAINING}"