streams/Code/Module/Dav.php

144 lines
4.5 KiB
PHP
Raw Normal View History

2016-04-19 03:38:38 +00:00
<?php
2021-12-03 03:01:39 +00:00
2022-02-16 04:08:28 +00:00
namespace Code\Module;
2020-05-06 04:34:31 +00:00
2022-09-04 01:35:50 +00:00
2022-06-22 10:19:52 +00:00
2016-04-19 03:38:38 +00:00
/**
2022-02-16 04:08:28 +00:00
* @file Code/Module/Dav.php
2016-04-19 03:38:38 +00:00
* @brief Initialize Hubzilla's cloud (SabreDAV).
*
* Module for accessing the DAV storage area from a DAV client.
*/
2019-04-17 23:54:06 +00:00
use Sabre\DAV as SDAV;
2021-12-02 22:33:36 +00:00
use Sabre\DAV\Auth\Plugin;
2022-02-16 04:08:28 +00:00
use Code\Lib\System;
2022-09-04 01:35:50 +00:00
use Code\Storage\Stdio;
2022-02-16 04:08:28 +00:00
use Code\Lib\Libprofile;
use Code\Lib\Channel;
use Code\Storage\BasicAuth;
use Code\Storage\Browser;
use Code\Web\Controller;
use Code\Web\HTTPSig;
2016-04-19 03:38:38 +00:00
require_once('include/attach.php');
require_once('include/auth.php');
require_once('include/security.php');
2016-04-19 03:38:38 +00:00
2021-12-02 23:02:31 +00:00
class Dav extends Controller
{
/**
* @brief Fires up the SabreDAV server.
*
*/
public function init()
{
foreach (['REDIRECT_REMOTE_USER', 'HTTP_AUTHORIZATION'] as $head) {
/* Basic authentication */
2022-09-04 01:35:50 +00:00
if (array_key_exists($head, $_SERVER) && str_starts_with(trim($_SERVER[$head]), 'Basic')) {
2021-12-02 23:02:31 +00:00
$userpass = @base64_decode(substr(trim($_SERVER[$head]), 6));
if (strlen($userpass)) {
list($name, $password) = explode(':', $userpass);
$_SERVER['PHP_AUTH_USER'] = $name;
$_SERVER['PHP_AUTH_PW'] = $password;
}
break;
}
/* Signature authentication */
2022-09-04 01:35:50 +00:00
if (array_key_exists($head, $_SERVER) && str_starts_with(trim($_SERVER[$head]), 'Signature')) {
2021-12-02 23:02:31 +00:00
if ($head !== 'HTTP_AUTHORIZATION') {
$_SERVER['HTTP_AUTHORIZATION'] = $_SERVER[$head];
continue;
}
$sigblock = HTTPSig::parse_sigheader($_SERVER[$head]);
if ($sigblock) {
$keyId = str_replace('acct:', '', $sigblock['keyId']);
if ($keyId) {
2022-06-17 02:56:53 +00:00
$r = hubloc_id_addr_query($keyId, 1);
2021-12-02 23:02:31 +00:00
if ($r) {
2022-01-25 01:26:12 +00:00
$c = Channel::from_hash($r[0]['hubloc_hash']);
2021-12-02 23:02:31 +00:00
if ($c) {
2021-12-03 03:01:39 +00:00
$a = q(
"select * from account where account_id = %d limit 1",
2021-12-02 23:02:31 +00:00
intval($c['channel_account_id'])
);
if ($a) {
$record = ['channel' => $c, 'account' => $a[0]];
$channel_login = $c['channel_id'];
}
}
}
if (!$record) {
continue;
}
if ($record) {
$verified = HTTPSig::verify('', $record['channel']['channel_pubkey']);
if (!($verified && $verified['header_signed'] && $verified['header_valid'])) {
$record = null;
}
if ($record['account']) {
authenticate_success($record['account']);
if ($channel_login) {
change_channel($channel_login);
}
}
break;
}
}
}
}
}
2021-12-03 03:01:39 +00:00
if (!is_dir('store')) {
2022-06-22 10:19:52 +00:00
Stdio::mkdir('store', STORAGE_DEFAULT_PERMISSIONS, false);
2021-12-03 03:01:39 +00:00
}
2021-12-02 23:02:31 +00:00
2021-12-03 03:01:39 +00:00
if (argc() > 1) {
2021-12-02 23:02:31 +00:00
Libprofile::load(argv(1), 0);
2021-12-03 03:01:39 +00:00
}
2021-12-02 23:02:31 +00:00
$auth = new BasicAuth();
2021-12-03 03:01:39 +00:00
// $auth->observer = get_observer_hash();
2020-05-06 04:34:31 +00:00
2021-12-02 23:02:31 +00:00
$auth->setRealm(ucfirst(System::get_platform_name()) . ' ' . 'WebDAV');
2016-05-11 02:40:15 +00:00
2022-02-16 04:08:28 +00:00
$rootDirectory = new \Code\Storage\Directory('/', $auth);
2021-12-02 23:02:31 +00:00
// A SabreDAV server-object
$server = new SDAV\Server($rootDirectory);
2021-12-02 23:02:31 +00:00
$authPlugin = new Plugin($auth);
$server->addPlugin($authPlugin);
2021-12-02 23:02:31 +00:00
// prevent overwriting changes each other with a lock backend
$lockBackend = new SDAV\Locks\Backend\File('cache/locks');
$lockPlugin = new SDAV\Locks\Plugin($lockBackend);
2021-12-02 23:02:31 +00:00
$server->addPlugin($lockPlugin);
2021-12-02 23:02:31 +00:00
// provide a directory view for the cloud in Hubzilla
$browser = new Browser($auth);
$auth->setBrowserPlugin($browser);
2021-12-02 23:02:31 +00:00
// Experimental QuotaPlugin
2022-02-16 04:08:28 +00:00
// $server->addPlugin(new \Code\Storage\QuotaPlugin($auth));
2021-12-02 23:02:31 +00:00
// All we need to do now, is to fire up the server
$server->exec();
2021-12-02 23:02:31 +00:00
killme();
}
2016-04-19 03:38:38 +00:00
}