app init; implemented service detection
This commit is contained in:
parent
a84bd86c63
commit
b992cde357
10 changed files with 322 additions and 0 deletions
38
.vscode/launch.json
vendored
Normal file
38
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Launch built-in server and debug",
|
||||
"type": "php",
|
||||
"request": "launch",
|
||||
"runtimeArgs": [
|
||||
"-S",
|
||||
"localhost:8000",
|
||||
"-t",
|
||||
"."
|
||||
],
|
||||
"port": 9003,
|
||||
"serverReadyAction": {
|
||||
"action": "openExternally"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Debug current script in console",
|
||||
"type": "php",
|
||||
"request": "launch",
|
||||
"program": "${file}",
|
||||
"cwd": "${fileDirname}",
|
||||
"externalConsole": false,
|
||||
"port": 9003
|
||||
},
|
||||
{
|
||||
"name": "Listen for Xdebug",
|
||||
"type": "php",
|
||||
"request": "launch",
|
||||
"port": 9003
|
||||
}
|
||||
]
|
||||
}
|
18
appinfo/info.xml
Normal file
18
appinfo/info.xml
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0"?>
|
||||
<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
|
||||
<id>dav_push</id>
|
||||
<name>DAV Push</name>
|
||||
<summary>Implements the DAV Push specification</summary>
|
||||
<description><![CDATA[This app allows you to send push notifications from your Nextcloud server to different clients, including mobile devices, desktop computers, and web browsers.]]></description>
|
||||
<version>0.0.1</version>
|
||||
<licence>agpl</licence>
|
||||
<author mail="info@bitfire.at" homepage="https://github.com/bitfireAT/webdav-push">bitfire web engineering</author>
|
||||
<author mail="mail@jonathan-treffler.de">Jonathan Treffler</author>
|
||||
<namespace>DavPush</namespace>
|
||||
<category>tools</category>
|
||||
<bugs>https://github.com/bitfireAT/nc-ext-caldav-carddav-push/issues</bugs>
|
||||
<dependencies>
|
||||
<nextcloud min-version="28" max-version="28"/>
|
||||
</dependencies>
|
||||
</info>
|
11
appinfo/routes.php
Normal file
11
appinfo/routes.php
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
declare(strict_types=1);
|
||||
// SPDX-FileCopyrightText: bitfire web engineering GmbH <info@bitfire.at>
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
return [
|
||||
'resources' => [
|
||||
],
|
||||
'routes' => [
|
||||
]
|
||||
];
|
30
lib/AppInfo/Application.php
Normal file
30
lib/AppInfo/Application.php
Normal file
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
// SPDX-FileCopyrightText: bitfire web engineering GmbH <info@bitfire.at>
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
namespace OCA\DavPush\AppInfo;
|
||||
|
||||
use OCP\AppFramework\App;
|
||||
use OCP\AppFramework\Bootstrap\IBootstrap;
|
||||
use OCP\AppFramework\Bootstrap\IRegistrationContext;
|
||||
use OCP\AppFramework\Bootstrap\IBootContext;
|
||||
|
||||
use OCA\DAV\Events\SabrePluginAddEvent;
|
||||
|
||||
use OCA\DavPush\Listener\SabrePluginAddListener;
|
||||
|
||||
class Application extends App implements IBootstrap {
|
||||
public const APP_ID = 'dav_push';
|
||||
|
||||
public function __construct() {
|
||||
parent::__construct(self::APP_ID);
|
||||
}
|
||||
|
||||
public function register(IRegistrationContext $context): void {
|
||||
$context->registerEventListener(SabrePluginAddEvent::class, SabrePluginAddListener::class);
|
||||
}
|
||||
|
||||
public function boot(IBootContext $context): void {
|
||||
}
|
||||
}
|
106
lib/Dav/ServiceDetectionPlugin.php
Normal file
106
lib/Dav/ServiceDetectionPlugin.php
Normal file
|
@ -0,0 +1,106 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* @copyright 2024 Christopher Ng <chrng8@gmail.com>
|
||||
*
|
||||
* @author Christopher Ng <chrng8@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\DavPush\Dav;
|
||||
|
||||
use OCP\IUser;
|
||||
use OCP\IUserSession;
|
||||
|
||||
use OCP\AppFramework\Db\DoesNotExistException;
|
||||
use OCA\DAV\Connector\Sabre\Node;
|
||||
use OCA\DavPush\Transport\TransportManager;
|
||||
|
||||
use Sabre\DAV\INode;
|
||||
use Sabre\DAV\PropFind;
|
||||
use Sabre\DAV\Server;
|
||||
use Sabre\DAV\ServerPlugin;
|
||||
|
||||
class ServiceDetectionPlugin extends ServerPlugin {
|
||||
|
||||
public const PUSH_PREFIX = '{DAV:Push}';
|
||||
public const PROPERTY_PUSH_TRANSPORTS = self::PUSH_PREFIX . 'push-transports';
|
||||
public const PROPERTY_PUSH_TOPIC = self::PUSH_PREFIX . 'topic';
|
||||
|
||||
|
||||
public function __construct(
|
||||
private IUserSession $userSession,
|
||||
private TransportManager $transportManager,
|
||||
) {
|
||||
}
|
||||
|
||||
public function initialize(Server $server): void {
|
||||
$server->on('propFind', [$this, 'propFind']);
|
||||
}
|
||||
|
||||
public function propFind(PropFind $propFind, INode $node) {
|
||||
if (count(array_intersect([self::PROPERTY_PUSH_TRANSPORTS, self::PROPERTY_PUSH_TOPIC], $propFind->getRequestedProperties())) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
//if (!($node instanceof Node)) {
|
||||
// return;
|
||||
//}
|
||||
|
||||
$propFind->handle(
|
||||
self::PROPERTY_PUSH_TRANSPORTS,
|
||||
function () use ($node) {
|
||||
//$user = $this->userSession->getUser();
|
||||
//if (!($user instanceof IUser)) {
|
||||
// return [];
|
||||
//}
|
||||
|
||||
$transports = $this->transportManager->getTransports();
|
||||
|
||||
$result = [];
|
||||
|
||||
foreach($transports as $transport) {
|
||||
$result[] = [
|
||||
(self::PUSH_PREFIX . "transport") => [
|
||||
(self::PUSH_PREFIX . $transport->getId()) => $transport->getAdditionalInformation(),
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
//throw new \Exception( "\$result = " . json_encode($result) );
|
||||
|
||||
return $result;
|
||||
},
|
||||
);
|
||||
|
||||
$propFind->handle(
|
||||
self::PROPERTY_PUSH_TOPIC,
|
||||
//function () use ($node) {
|
||||
//$user = $this->userSession->getUser();
|
||||
//if (!($user instanceof IUser)) {
|
||||
// return [];
|
||||
//}
|
||||
|
||||
// return "test-return-push";
|
||||
//},
|
||||
"test-return-push-topic"
|
||||
);
|
||||
}
|
||||
}
|
28
lib/Event/RegisterTransportsEvent.php
Normal file
28
lib/Event/RegisterTransportsEvent.php
Normal file
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace OCA\DavPush\Event;
|
||||
|
||||
use OCP\EventDispatcher\Event;
|
||||
|
||||
use OCA\DavPush\Transport\TransportManager;
|
||||
|
||||
/**
|
||||
* This event is triggered during the initialization of DAV Push.
|
||||
* Use it to register external push transports.
|
||||
*/
|
||||
class RegisterTransportsEvent extends Event {
|
||||
|
||||
/** @var TransportManager */
|
||||
private $transportManager;
|
||||
|
||||
public function __construct(TransportManager $transportManager) {
|
||||
parent::__construct();
|
||||
$this->transportManager = $transportManager;
|
||||
}
|
||||
|
||||
public function getTransportManager(): TransportManager {
|
||||
return $this->transportManager;
|
||||
}
|
||||
}
|
25
lib/Listener/SabrePluginAddListener.php
Normal file
25
lib/Listener/SabrePluginAddListener.php
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace OCA\DavPush\Listener;
|
||||
|
||||
use OCA\DAV\Events\SabrePluginAddEvent;
|
||||
use OCA\DavPush\Dav\ServiceDetectionPlugin;
|
||||
|
||||
use OCP\EventDispatcher\Event;
|
||||
use OCP\EventDispatcher\IEventListener;
|
||||
|
||||
use Psr\Container\ContainerInterface;
|
||||
|
||||
class SabrePluginAddListener implements IEventListener {
|
||||
public function __construct(private ContainerInterface $container) {}
|
||||
|
||||
public function handle(Event $event): void {
|
||||
if ($event instanceof SabrePluginAddEvent) {
|
||||
$serviceDetectionPlugin = $this->container->get(ServiceDetectionPlugin::class);
|
||||
|
||||
$event->getServer()->addPlugin($serviceDetectionPlugin);
|
||||
}
|
||||
}
|
||||
}
|
11
lib/PushTransports/WebPushTransport.php
Normal file
11
lib/PushTransports/WebPushTransport.php
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace OCA\DavPush\PushTransports;
|
||||
|
||||
use OCA\DavPush\Transport\Transport;
|
||||
|
||||
class WebPushTransport extends Transport {
|
||||
protected $id = "web-push";
|
||||
}
|
17
lib/Transport/Transport.php
Normal file
17
lib/Transport/Transport.php
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace OCA\DavPush\Transport;
|
||||
|
||||
abstract class Transport {
|
||||
protected $id;
|
||||
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function getAdditionalInformation() {
|
||||
return [];
|
||||
}
|
||||
}
|
38
lib/Transport/TransportManager.php
Normal file
38
lib/Transport/TransportManager.php
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace OCA\DavPush\Transport;
|
||||
|
||||
use OCP\EventDispatcher\IEventDispatcher;
|
||||
|
||||
use OCA\DavPush\Event\RegisterTransportsEvent;
|
||||
use OCA\DavPush\PushTransports\WebPushTransport;
|
||||
|
||||
class TransportManager {
|
||||
/**
|
||||
* @var Transport[]
|
||||
*/
|
||||
private array $transports = [];
|
||||
|
||||
public function __construct(IEventDispatcher $dispatcher) {
|
||||
// register integrated transports
|
||||
$this->registerTransport(new WebPushTransport());
|
||||
|
||||
// register transports provided by other apps
|
||||
$event = new RegisterTransportsEvent($this);
|
||||
$dispatcher->dispatchTyped($event);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Transport[]
|
||||
*/
|
||||
public function getTransports(): array {
|
||||
return $this->transports;
|
||||
}
|
||||
|
||||
public function registerTransport(Transport $transport): self {
|
||||
$this->transports[] = $transport;
|
||||
return $this;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue