Dropbox-like Public-Ordner in ownCloud

Ich war nicht nur wegen der sehr guten Synchronisation Fan von Dropbox, sondern habe auch den Public-Ordner sehr gerne genutzt. Da mir, bedingt durch den Umzug in meine ownCloud, die Funktionalität des Public-Ordners verloren ging und die Sharing-Funktion von ownCloud alles andere als brauchbar ist, da sie direkt den kompletten Inhalt des Ordners offenbart, musste früher oder später eine Lösung her.

In Anlehnung an das URL-Schema von Dropbox (_https://dl.dropbox.com/u//_) habe ich mich bei meiner Implementation für _https:///u//_ entschieden. Funktioniert bisher auch ganz gut.

Ein funktionierendes Beispiel gibt’s natürlich auch: http://oc.tamcore.eu/u/philipp/screenshots/2011-12-06-20-41-20.png

Um die Funktion in eurer ownCloud nutzen zu können sind lediglich zwei kleine Schritte notwendig.

Zuerst müsst ihr die Datei pub.php (Download) im Root-Verzeichnis der ownCloud-Installation anlegen

<?php
    if (!isset($_GET['u'], $_GET['f'])) exit;

    $user = $_GET['u'];
    if (preg_match('/[^a-zA-Z0-9 _\.@\-]/', $user)) exit;
    $want = getcwd() . '/data/' . $user . '/files/Public';
    $have = realpath(getcwd() . '/data/' . $user . '/files/Public/'. $_GET['f']);
    if (strpos($have, $want, 0) === false) exit;

    if (file_exists($have)) {
        header('Content-Type: ' . mime_content_type($have));
        readfile($have);
    } else {
        header('Status: 404 Not Found');
    }
?>

Anschließend müsst ihr folgende RewriteRule an das Ende des mod_rewrite-Blocks der .htaccess anhängen

RewriteRule ^u/([^/]*)/(.*) /pub.php?u=$1&f=$2 [L]

oder eure nginx.conf entsprechend um

location /u/ {
    rewrite ^/u/(.*)/(.*)$ /pub.php?u=$1&f=$2 last;
}

ergänzen (Danke keving!)

Das wars. Jetzt sollten die Daten aus den Public-Ordnern der jeweiligen Nutzer problemlos über das obige Schema erreichbar sein.