Cleanup, configuration
This commit is contained in:
		@@ -8,6 +8,8 @@ class Configuration
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private ?string $jwtSecret = null;
 | 
					    private ?string $jwtSecret = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private bool $allowAnonymousSubscribe = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static function createDefault(): Configuration
 | 
					    public static function createDefault(): Configuration
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return new Configuration();
 | 
					        return new Configuration();
 | 
				
			||||||
@@ -34,5 +36,16 @@ class Configuration
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return $this->jwtSecret;
 | 
					        return $this->jwtSecret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function getAllowAnonymousSubscribe():bool
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
							return $this->allowAnonymousSubscribe;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function setAllowAnonymousSubscribe(bool $allowAnonymousSubscribe): self
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
							$this->allowAnonymousSubscribe = $allowAnonymousSubscribe;
 | 
				
			||||||
 | 
							return $this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,7 @@ class Daemon
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public function start(): void
 | 
					    public function start(): void
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->server = new Server($this->config, []);
 | 
					        $this->server = new Server($this->config, $this->loop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $socket = new SocketServer("tcp://0.0.0.0:9000");
 | 
					        $socket = new SocketServer("tcp://0.0.0.0:9000");
 | 
				
			||||||
        $this->server->listen($socket);
 | 
					        $this->server->listen($socket);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,6 @@ use React\Http\Message\Response;
 | 
				
			|||||||
use React\Promise\Promise;
 | 
					use React\Promise\Promise;
 | 
				
			||||||
use React\Promise\PromiseInterface;
 | 
					use React\Promise\PromiseInterface;
 | 
				
			||||||
use React\Stream\ThroughStream;
 | 
					use React\Stream\ThroughStream;
 | 
				
			||||||
use SplObjectStorage;
 | 
					 | 
				
			||||||
use Symfony\Component\Uid\Uuid;
 | 
					use Symfony\Component\Uid\Uuid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class MercureHandler
 | 
					class MercureHandler
 | 
				
			||||||
@@ -26,7 +25,6 @@ class MercureHandler
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public function __construct(
 | 
					    public function __construct(
 | 
				
			||||||
        private Configuration $config,
 | 
					        private Configuration $config,
 | 
				
			||||||
        private SplObjectStorage $eventClients,
 | 
					 | 
				
			||||||
        private TopicManager $topicManager,
 | 
					        private TopicManager $topicManager,
 | 
				
			||||||
        ?LoopInterface $loop=null
 | 
					        ?LoopInterface $loop=null
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
@@ -102,17 +100,25 @@ class MercureHandler
 | 
				
			|||||||
            $claims = $tok->claims->getAll();
 | 
					            $claims = $tok->claims->getAll();
 | 
				
			||||||
            if (isset($claims['mercure']['subscribe'])) {
 | 
					            if (isset($claims['mercure']['subscribe'])) {
 | 
				
			||||||
                $subscribeClaims = $claims['mercure']['subscribe'];
 | 
					                $subscribeClaims = $claims['mercure']['subscribe'];
 | 
				
			||||||
                // TODO check topic against publishClaims
 | 
					 | 
				
			||||||
                if (!$this->checkTopicClaims($topics, $subscribeClaims)) {
 | 
					                if (!$this->checkTopicClaims($topics, $subscribeClaims)) {
 | 
				
			||||||
                    throw new SecurityException("Insufficient permissions for subscribe", SecurityException::ERR_NO_PERMISSION);
 | 
					                    throw new SecurityException(
 | 
				
			||||||
 | 
					                        message: "Insufficient permissions for subscribe", 
 | 
				
			||||||
 | 
					                        code: SecurityException::ERR_NO_PERMISSION
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            // TODO add option to allow/disallow anonymous acess. should still respect 
 | 
					            // Disallow if we don't allow anonymous subscribers. Note that anonymous
 | 
				
			||||||
 | 
					            // subscribers will not receive updates marked as private.
 | 
				
			||||||
 | 
					            if (!$this->config->getAllowAnonymousSubscribe()) {
 | 
				
			||||||
 | 
					                throw new SecurityException(
 | 
				
			||||||
 | 
					                    message: "Anonymous access disallowed",
 | 
				
			||||||
 | 
					                    code: SecurityException::ERR_ACCESS_DENIED
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        $this->topicManager->subscribe($subscriber, $topics);
 | 
					        $this->topicManager->subscribe($subscriber, $topics);
 | 
				
			||||||
        //$this->eventClients->attach($responseStream, $request);
 | 
					 | 
				
			||||||
        $responseStream->on('close', function () use ($subscriber, $topics) {
 | 
					        $responseStream->on('close', function () use ($subscriber, $topics) {
 | 
				
			||||||
            $this->topicManager->unsubscribe($subscriber, $topics);
 | 
					            $this->topicManager->unsubscribe($subscriber, $topics);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@@ -139,7 +145,10 @@ class MercureHandler
 | 
				
			|||||||
        $data = [];
 | 
					        $data = [];
 | 
				
			||||||
        foreach ($body as $param) {
 | 
					        foreach ($body as $param) {
 | 
				
			||||||
            if (!str_contains($param, "="))
 | 
					            if (!str_contains($param, "="))
 | 
				
			||||||
                throw new RequestException("Invalid request data", RequestException::ERR_INVALID_REQUEST_DATA);
 | 
					                throw new RequestException(
 | 
				
			||||||
 | 
					                    message: "Invalid request data", 
 | 
				
			||||||
 | 
					                    code: RequestException::ERR_INVALID_REQUEST_DATA
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
            [ $name, $value ] = array_map('urldecode', explode("=", $param, 2));
 | 
					            [ $name, $value ] = array_map('urldecode', explode("=", $param, 2));
 | 
				
			||||||
            if (in_array($name, [ 'topic' ])) {
 | 
					            if (in_array($name, [ 'topic' ])) {
 | 
				
			||||||
                if (!isset($data[$name]))
 | 
					                if (!isset($data[$name]))
 | 
				
			||||||
@@ -158,7 +167,10 @@ class MercureHandler
 | 
				
			|||||||
                $publishClaims = $claims['mercure']['publish'];
 | 
					                $publishClaims = $claims['mercure']['publish'];
 | 
				
			||||||
                // check topic against publishClaims
 | 
					                // check topic against publishClaims
 | 
				
			||||||
                if (!$this->checkTopicClaims($data['topic']??[], $publishClaims)) {
 | 
					                if (!$this->checkTopicClaims($data['topic']??[], $publishClaims)) {
 | 
				
			||||||
                    throw new SecurityException("Insufficient permissions for publish", SecurityException::ERR_NO_PERMISSION);
 | 
					                    throw new SecurityException(
 | 
				
			||||||
 | 
					                        message: "Insufficient permissions for publish", 
 | 
				
			||||||
 | 
					                        code: SecurityException::ERR_NO_PERMISSION
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
@@ -209,24 +221,6 @@ class MercureHandler
 | 
				
			|||||||
    private function publishMercureMessage(Message $message): void
 | 
					    private function publishMercureMessage(Message $message): void
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->topicManager->publish($message);
 | 
					        $this->topicManager->publish($message);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        // foreach ($this->webSocketClients as $webSocket) {
 | 
					 | 
				
			||||||
        //     $webSocket->write(json_encode([
 | 
					 | 
				
			||||||
        //         'type' => $message->type,
 | 
					 | 
				
			||||||
        //         'topic' => $message->topic,
 | 
					 | 
				
			||||||
        //         'data' => (@json_decode($message->data))??$message->data
 | 
					 | 
				
			||||||
        //     ]));
 | 
					 | 
				
			||||||
        // }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        $sseMessage = "";
 | 
					 | 
				
			||||||
        if ($message->type) {
 | 
					 | 
				
			||||||
            $sseMessage .= "event: ".$message->type."\n";
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        $sseMessage .= "data: ".$message->data."\n\n";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        foreach ($this->eventClients as $client) {
 | 
					 | 
				
			||||||
            $client->write($sseMessage);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -42,7 +42,7 @@ class Server
 | 
				
			|||||||
     * 
 | 
					     * 
 | 
				
			||||||
     * 
 | 
					     * 
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public function __construct(Configuration $config, array $options=[], ?LoopInterface $loop=null)
 | 
					    public function __construct(Configuration $config, ?LoopInterface $loop=null)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->loop = $loop??Loop::get();
 | 
					        $this->loop = $loop??Loop::get();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -53,7 +53,7 @@ class Server
 | 
				
			|||||||
        $this->eventClients = new SplObjectStorage();
 | 
					        $this->eventClients = new SplObjectStorage();
 | 
				
			||||||
        $this->webSocketClients = new SplObjectStorage();
 | 
					        $this->webSocketClients = new SplObjectStorage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $this->server = $this->createHttpServer($options);
 | 
					        $this->server = $this->createHttpServer();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -70,7 +70,7 @@ class Server
 | 
				
			|||||||
     * 
 | 
					     * 
 | 
				
			||||||
     * @return HttpServer
 | 
					     * @return HttpServer
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private function createHttpServer(array $options): HttpServer
 | 
					    private function createHttpServer(): HttpServer
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return new HttpServer(
 | 
					        return new HttpServer(
 | 
				
			||||||
            $this->responseMiddleware = new ResponseMiddleware(
 | 
					            $this->responseMiddleware = new ResponseMiddleware(
 | 
				
			||||||
@@ -85,8 +85,7 @@ class Server
 | 
				
			|||||||
                topicManager: $this->topicManager
 | 
					                topicManager: $this->topicManager
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            $this->mercureHandler     = new MercureHandler(
 | 
					            $this->mercureHandler     = new MercureHandler(
 | 
				
			||||||
                config: $this->config, 
 | 
					                config: $this->config,
 | 
				
			||||||
                eventClients: $this->eventClients, 
 | 
					 | 
				
			||||||
                topicManager: $this->topicManager
 | 
					                topicManager: $this->topicManager
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            $this->apiRequestHandler  = new ApiHandler(
 | 
					            $this->apiRequestHandler  = new ApiHandler(
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user