Nextcloud besitzt seit Version 13 eine optionale End-to-End Encryption, was an sich nicht schlecht ist und – würde es denn funktionieren – für mich ein sog. "Killer-Feature" wäre, nur leider ist genau das kaputt. Also, richtig kaputt, nicht nur ein bisschen.

Die Entwickler hinter der Verschlüsselung lehnen das zwar auf Nachfrage ab, die Lösung erfodert aber dennoch ein paar Änderungen, d.h. auch die Spezifikation wurde geändert.

Wie auch immer, wer mit der aktuellen Implementierung herumspielt wird feststellen, dass die Encryption Keys manchmal zurückgesetzt werden müssen, weil die Software eben noch nicht ausgereift ist. Die Vorgehensweise folgt dabei weitgehend diesem GitHub-Kommentar.

Ausgehend davon, dass die Datenbank (hier PostgreSQL) für Nextcloud in einem Docker-Container läuft, muss man zuerst in diesen wechseln:

# psql -U pgadmin
psql (11.3)
Type "help" for help.

pgadmin=#

Danach kann man sich die Datenbanken ausgeben lassen:

pgadmin=# \l
                                  List of databases
   Name    |    Owner     | Encoding |  Collate   |   Ctype    |  Access privileges  
-----------+--------------+----------+------------+------------+---------------------
 nextcloud | oc_kopfkrieg | UTF8     | en_US.utf8 | en_US.utf8 | 
 pgadmin   | pgadmin      | UTF8     | en_US.utf8 | en_US.utf8 | 
 postgres  | pgadmin      | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | pgadmin      | UTF8     | en_US.utf8 | en_US.utf8 | =c/pgadmin         +
           |              |          |            |            | pgadmin=CTc/pgadmin
 template1 | pgadmin      | UTF8     | en_US.utf8 | en_US.utf8 | =c/pgadmin         +
           |              |          |            |            | pgadmin=CTc/pgadmin
(5 rows)

pgadmin=# 

Die gesuchte Datenbank ist offensichtlich „nextcloud“. Nachdem man das weiß, wechselt man zu dieser und lässt sich die darin befindlichen Tabellen ausgeben:

pgadmin=# \connect nextcloud
You are now connected to database "nextcloud" as user "pgadmin".
nextcloud=# \d
[…]
 public | federated_reshares                     | table    | oc_kopfkrieg
 public | file_locks                             | table    | oc_kopfkrieg
 public | file_locks_id_seq                      | sequence | oc_kopfkrieg
 public | filecache                              | table    | oc_kopfkrieg
 public | filecache_fileid_seq                   | sequence | oc_kopfkrieg
 public | files_trash                            | table    | oc_kopfkrieg
 public | files_trash_auto_id_seq                | sequence | oc_kopfkrieg
[…]
nextcloud=#

Je nach Alter der Nextcloud-Instanz entdeckt man hierbei entweder eine Tabelle „filecache“ oder „oc_filecache“. Die zu löschenden Daten kann man nun mit einer Query ausgeben lassen (benötigt wird hierzu auch der Benutzername des betroffenen Nextcloud-Accounts, welcher bei mir als Beispiel einfach nur „KopfKrieg“ lautet):

nextcloud=# SELECT * FROM filecache WHERE path LIKE 'appdata_%/end_to_end_encryption/meta-data/KopfKrieg%';
nextcloud=# SELECT * FROM filecache WHERE path LIKE 'appdata_%/end_to_end_encryption/%-keys/KopfKrieg.%.key';

Ist man sich sicher, dass die Einträge alle passen, erfolgt das Löschen mittels DELETE:

nextcloud=# DELETE FROM filecache WHERE path LIKE 'appdata_%/end_to_end_encryption/meta-data/KopfKrieg%';
nextcloud=# DELETE FROM filecache WHERE path LIKE 'appdata_%/end_to_end_encryption/%-keys/KopfKrieg.%.key';

Damit wäre der Datenbank-Teil abgeschlossen. Nicht zwingend erforderlich, aber empfehlenswert, ist noch ein manueller Cleanup des Dateicaches sowie eine Reparatur/Wartung:

# docker exec nextcloud su - www-data -s /bin/bash -c 'php -f /var/www/html/occ files:cleanup'
# docker exec nextcloud su - www-data -s /bin/bash -c 'php -f /var/www/html/occ maintenance:repair'

Das sollte noch ein paar Sachen geradebiegen (etwa Shares), die beim Löschvorgang der Datenbankeinträge nicht berücksichtig wurden. Das wäre es dann auch schon gewesen und man kann erneut die End-to-End Encryption ausprobieren, mit frischen Keys. Oder die dafür nötige App direkt deaktivieren, denn das ganze ist noch immer in einem sehr kaputten Zustand. Und sollte dementsprechend wirklich nicht verwendet werden, solange keiner der bestehenden Mängel behoben wurde.