From 53a8f300859a50d9f99f1821c35bca999fced6d8 Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Thu, 8 Jun 2023 23:05:26 +0200 Subject: v2 --- ttun_server/__init__.py | 6 ++++++ ttun_server/endpoints.py | 22 ++++++++++++++++++++-- ttun_server/redis.py | 2 +- ttun_server/types.py | 1 + 4 files changed, 28 insertions(+), 3 deletions(-) (limited to 'ttun_server') diff --git a/ttun_server/__init__.py b/ttun_server/__init__.py index 17a8e7a..81f8cd4 100644 --- a/ttun_server/__init__.py +++ b/ttun_server/__init__.py @@ -20,3 +20,9 @@ server = Starlette( Route('/{path:path}', Proxy), ] ) + +try: + from ._version import version + __version__ = version +except ImportError: + __version__ = 'development' diff --git a/ttun_server/endpoints.py b/ttun_server/endpoints.py index 6728c31..3e263da 100644 --- a/ttun_server/endpoints.py +++ b/ttun_server/endpoints.py @@ -1,6 +1,7 @@ import asyncio import logging import os +from asyncio import create_task from base64 import b64decode, b64encode from typing import Optional, Any from uuid import uuid4 @@ -11,6 +12,7 @@ from starlette.responses import Response from starlette.types import Scope, Receive, Send from starlette.websockets import WebSocket +import ttun_server from ttun_server.proxy_queue import ProxyQueue from ttun_server.types import RequestData, Config, Message, MessageType @@ -40,9 +42,10 @@ class Proxy(HTTPEndpoint): request_queue = await ProxyQueue.get_for_identifier(subdomain) + logger.debug('PROXY %s%s ', subdomain, request.url) await request_queue.enqueue( Message( - type=MessageType.request, + type=MessageType.request.value, identifier=identifier, payload= RequestData( @@ -85,16 +88,31 @@ class Tunnel(WebSocketEndpoint): async def handle_requests(self, websocket: WebSocket): while request := await self.proxy_queue.dequeue(): - await websocket.send_json(request) + create_task(websocket.send_json(request)) async def on_connect(self, websocket: WebSocket) -> None: await websocket.accept() self.config = await websocket.receive_json() + client_version = self.config.get('version', '1.0.0') + logger.debug('client_version %s', client_version) + + if 'git' not in client_version and ttun_server.__version__ != 'development': + [client_major, *_] = [int(i) for i in client_version.split('.')[:3]] + [server_major, *_] = [int(i) for i in ttun_server.__version__.split('.')] + + if client_major < server_major: + await websocket.close(4000, 'Your client is too old') + + if client_major > server_major: + await websocket.close(4001, 'Your client is too new') + + if self.config['subdomain'] is None \ or await ProxyQueue.has_connection(self.config['subdomain']): self.config['subdomain'] = uuid4().hex + self.proxy_queue = await ProxyQueue.create_for_identifier(self.config['subdomain']) hostname = os.environ.get("TUNNEL_DOMAIN") diff --git a/ttun_server/redis.py b/ttun_server/redis.py index 344c107..3065dec 100644 --- a/ttun_server/redis.py +++ b/ttun_server/redis.py @@ -3,7 +3,7 @@ import os from aioredis import ConnectionPool, Redis -class RedisConnectionPool(): +class RedisConnectionPool: instance: 'RedisConnectionPool' = None def __init__(self): diff --git a/ttun_server/types.py b/ttun_server/types.py index 2f1959f..8a4d929 100644 --- a/ttun_server/types.py +++ b/ttun_server/types.py @@ -10,6 +10,7 @@ class MessageType(Enum): class Config(TypedDict): subdomain: str + client_version: str class RequestData(TypedDict): -- cgit v1.2.3