Nextcloud Freigaben auf SQL Ebene

March 18, 2019 in linux ‐ 3 min read

In diesem Artikel möchte ich ein bisschen eintauchen in die Frage, wie Nextcloud die Informationen wer was mit wem geteilt hat auf Datenbankebene speichert.

Zunächst schauen wir uns erstmal an, auf welche Datenbank die Nextcloud schreibt. Hierzu schauen wir in die Datei config.php im Nextcloud Verzeichnis an. Uns interessiert dbname und dbhost.

image

Da dbhost localhost ist, die Datenbank also direkt auf meinem Server läuft verbinde ich mich ohne Angabe eines Servers. mysql -p

Anschließend lasse ich mir mit show databases die existierenden Datenbanken anzeigen. show databases;

Wie erwartet gibt es die Datenbank nextcloud_db, zu der ich mich verbinde. connect nextcloud_db;

image

Ein Blick in show tables zeigt einiges an SQL Tables. Uns interessieren vor allem die Tables oc_share und oc_filecache.

(Es kann sein, dass eure Tables anders heißen. Zum Beispiel nc_share und nc_filecache. Zuständig dafür ist, wie oben in der config.php zu sehen, das dbtableprefix)

Sehen wir uns ein Beispiel an. Der Benutzer Felix hat den Ordner /Privat/Podcast/CoreUtils mit dem Benutzer beegeees geteilt. In folgendem screenshot sehen wir, wie das im Webinterface der Nextcloud aussieht.

image

 

Schauen wir uns an was in der Datenbank passiert. Nextcloud Freigaben werden in oc_share verwaltet.

Mit describe können wir uns anschauen, wie oc share aufgebaut ist.

describe oc_share;

image

Es gibt einen Primärschlüssel “id”, welche die Freigabe eindeutig identifiziert. Dann gibt es noch die interessanten Felder:

  • file_target = was wird geteilt
  • share_with = mit wem wird etwas geteilt
  • share_name = unter welchem namen wird es angezeigt
  • file source = verweis auf die Datenbank oc_filecache

Schauen wir uns jetzt mal den grade erzeugten Datenbankeintrag an. Wir wissen, dass share_with beegeees sein muss und das file_target irgendwas mit Utils. So kann man recht einfach eine SQL Abfrage bauen.

select * from oc_share where share_with = "beegeees" and file_target like "%Utils%";

Die Formatierung macht das lesen aufgrund der Menge an Informationen etwas unübersichtlich aber es ist alles enthalten. Wer (uid_owner=felix) hat was (item_type=folder, file_target=/CoreUtils) mit wem (share_with=beegeees) geteilt.

image

Allerdings wird hieraus noch nicht wirklich klar, was /CoreUtils jetzt eigentlich ist und wo es liegt. Also schauen wir uns oc_filecache an.

describe oc_filecache;

image

Hier gibt es wieder einen Primärschlüssel, der Files im Chache identifiziert. Schauen wir jetzt mal, was hier an Infos zu fileid 20774 existieren auf den item_source referenziert hat.

image

Sie an, hier ist der Pfad mit dem die Nextcloud arbeitet. Schauen wir uns jetzt nochmal genau an, was in der config.php vom Anfang stand.

Hier war datadirectory als /var/nextcloud_data definiert. Dann war in oc_share der uidowner als Felix angegeben. Und in oc_filecache ist der path der referenzierten file_source als files/Privat/Podcast/CoreUtils angegeben.

Wenn wir diese Informationen jetzt zusammennehmen, müssten wir die Datei bzw. den Ordner im Dateisystem vom Server finden können.

image

Cheers, Ori