103 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Http\Controllers;
 | 
						|
 | 
						|
use Illuminate\Http\Request;
 | 
						|
use Illuminate\Support\Facades\DB;
 | 
						|
 | 
						|
use Sabre\DAV\Server;
 | 
						|
use Sabre\DAV\Auth\Plugin as AuthPlugin;
 | 
						|
use Sabre\DAV\Browser\Plugin as BrowserPlugin;
 | 
						|
use Sabre\CalDAV\Plugin as CalDAVPlugin;
 | 
						|
use Sabre\CardDAV\Plugin as CardDAVPlugin;
 | 
						|
use Sabre\CalDAV\Backend\PDO as CalDavPDO;
 | 
						|
use Sabre\CardDAV\Backend\PDO as CardDavPDO;
 | 
						|
 | 
						|
use Symfony\Component\HttpFoundation\Response;
 | 
						|
 | 
						|
use Sabre\HTTP\RequestInterface;
 | 
						|
use Sabre\HTTP\ResponseInterface;
 | 
						|
 | 
						|
use App\Services\Dav\PrincipalBackend;
 | 
						|
use App\Services\Dav\LaravelSabreAuthBackend;
 | 
						|
 | 
						|
class DavController extends Controller
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Single-action controller: handles every WebDAV request.
 | 
						|
     */
 | 
						|
    public function __invoke(Request $laravelRequest): Response
 | 
						|
    {
 | 
						|
        //\Log::debug('DavController reached', ['path' => $larevelRequest->path()]);
 | 
						|
        //\Log::debug('[DAV] raw headers', getallheaders());
 | 
						|
 | 
						|
        /**
 | 
						|
         * sabre back-ends tied to laravel's current db connection
 | 
						|
         */
 | 
						|
        $pdo = DB::connection()->getPdo();
 | 
						|
 | 
						|
        $principalBackend = new PrincipalBackend();
 | 
						|
        $calBackend       = new CalDavPDO($pdo);
 | 
						|
        $cardBackend      = new CardDavPDO($pdo);
 | 
						|
 | 
						|
        /**
 | 
						|
         * resource tree
 | 
						|
         */
 | 
						|
        $nodes = [
 | 
						|
            new \Sabre\DAVACL\PrincipalCollection($principalBackend),
 | 
						|
            new \Sabre\CalDAV\CalendarRoot($principalBackend, $calBackend),
 | 
						|
            new \Sabre\CardDAV\AddressBookRoot($principalBackend, $cardBackend),
 | 
						|
        ];
 | 
						|
 | 
						|
        /**
 | 
						|
         * create the server
 | 
						|
         */
 | 
						|
        $server = new Server($nodes);
 | 
						|
        $server->setBaseUri('/dav/');
 | 
						|
 | 
						|
        /**
 | 
						|
         * add plugins (order matters!)
 | 
						|
         */
 | 
						|
        if ($existing = $server->getPlugin('auth')) {
 | 
						|
            $server->removePlugin($existing);
 | 
						|
        }
 | 
						|
        $server->addPlugin(
 | 
						|
            new AuthPlugin(new LaravelSabreAuthBackend(), 'KithkinDAV')
 | 
						|
        );
 | 
						|
        $server->addPlugin(new \Sabre\DAVACL\Plugin());
 | 
						|
        //$server->addPlugin(new \Sabre\CalDAV\Plugin());
 | 
						|
        //$server->addPlugin(new \Sabre\CardDAV\Plugin());
 | 
						|
        //$server->addPlugin(new \Sabre\DAV\Browser\Plugin());
 | 
						|
 | 
						|
        /**
 | 
						|
         * execute (sabre sends the response and exits)
 | 
						|
         */
 | 
						|
        // logging
 | 
						|
        \Log::debug('[DAV] listener attached to', ['hash' => spl_object_hash($server)]);
 | 
						|
 | 
						|
        $server->on('beforeMethod', function ($req) {
 | 
						|
            \Log::debug('[DAV] beforeMethod', [
 | 
						|
                'verb'  => $req->getMethod(),
 | 
						|
                'url'   => $req->getUrl(),
 | 
						|
                'auth'  => $req->getHeader('Authorization'),
 | 
						|
            ]);
 | 
						|
        });
 | 
						|
 | 
						|
        $server->on('method:PROPFIND', function ($req) {
 | 
						|
            \Log::debug('[DAV] method:PROPFIND', [
 | 
						|
                'url'  => $req->getUrl(),
 | 
						|
                'auth' => $req->getHeader('Authorization'),
 | 
						|
            ]);
 | 
						|
        });
 | 
						|
 | 
						|
        \Log::debug('[DAV] about to exec', ['hash' => spl_object_hash($server)]);
 | 
						|
 | 
						|
        ob_start();
 | 
						|
        $server->exec();
 | 
						|
        $body = ob_get_clean();
 | 
						|
        $sabre = $server->httpResponse;
 | 
						|
        return new Response($body, $sabre->getStatus(), $sabre->getHeaders());
 | 
						|
    }
 | 
						|
}
 | 
						|
 |