From 3ecd224ce6556605b9ad50f19065f9486c275bab Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Sun, 18 Dec 2022 18:31:35 +0800 Subject: [PATCH] separate onebot 12 adapter things --- src/ZM/Plugin/OneBot12Adapter.php | 49 +++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/ZM/Plugin/OneBot12Adapter.php diff --git a/src/ZM/Plugin/OneBot12Adapter.php b/src/ZM/Plugin/OneBot12Adapter.php new file mode 100644 index 00000000..ebea5da7 --- /dev/null +++ b/src/ZM/Plugin/OneBot12Adapter.php @@ -0,0 +1,49 @@ +addEvent(WebSocketOpenEvent::class, [$this, 'handleWSReverseInput']); + } + + /** + * 接入和认证反向 WS 的连接 + */ + public function handleWSReverseInput(WebSocketOpenEvent $event): void + { + // 判断是不是 OneBot 12 反向 WS 连进来的,通过 Sec-WebSocket-Protocol 头 + $line = explode('.', $event->getRequest()->getHeaderLine('Sec-WebSocket-Protocol'), 2); + if ($line[0] === '12') { + logger()->info('检测到 OneBot 12 反向 WS 连接,正在进行认证...'); + // 是 OneBot 12 标准的,准许接入,进行鉴权 + $request = $event->getRequest(); + if (($stored_token = $event->getSocketConfig()['access_token'] ?? '') !== '') { + // 测试 Header + $token = $request->getHeaderLine('Authorization'); + if ($token === '') { + // 测试 Query + $token = $request->getQueryParams()['access_token'] ?? ''; + } + $token = explode('Bearer ', $token); + $info = ['impl' => $line[1] ?? 'unknown']; + if (!isset($token[1]) || $token[1] !== $stored_token) { // 没有 token,鉴权失败 + logger()->warning('OneBot 12 反向 WS 连接鉴权失败,拒绝接入'); + $event->withResponse(HttpFactory::createResponse(401, 'Unauthorized')); + return; + } + } + } + // 设置 OneBot 相关的东西 + ConnectionUtil::setConnection($event->getFd(), $info ?? []); + } +}