commit 90c8cbb4a1ae63b67d863eafb011b6f9d34b07f9 Author: BarsTiger Date: Sun Jul 16 23:52:18 2023 +0300 Added auth and webmessages diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..846fd33 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +/.idea/ +/venv/ +/tests/ +/build/ +/dist/ +/data/ +__pycache__ + +poetry.lock diff --git a/README.md b/README.md new file mode 100644 index 0000000..abbbe51 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# dragonion-core +Core library for both [[dragonion]](https://github.com/dragonionx/dragonion) and +[[dragonion-server]](https://github.com/dragonionx/dragonion-server) diff --git a/dragonion_core/__init__.py b/dragonion_core/__init__.py new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/dragonion_core/__init__.py @@ -0,0 +1 @@ +pass diff --git a/dragonion_core/proto/__init__.py b/dragonion_core/proto/__init__.py new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/dragonion_core/proto/__init__.py @@ -0,0 +1 @@ +pass diff --git a/dragonion_core/proto/file/__init__.py b/dragonion_core/proto/file/__init__.py new file mode 100644 index 0000000..b1ef98d --- /dev/null +++ b/dragonion_core/proto/file/__init__.py @@ -0,0 +1,6 @@ +from .auth import AuthFile + + +__all__ = [ + 'AuthFile' +] diff --git a/dragonion_core/proto/file/auth.py b/dragonion_core/proto/file/auth.py new file mode 100644 index 0000000..00f201e --- /dev/null +++ b/dragonion_core/proto/file/auth.py @@ -0,0 +1,15 @@ +import sqlitedict + + +class AuthFile(sqlitedict.SqliteDict): + """ + Valid AuthFile has fields: + host - .onion url of service + auth - v3 onion auth string in format, that can be written to .auth_private file + """ + def __init__(self, service): + super().__init__( + filename=f'{service}.auth', + tablename='auth', + autocommit=True + ) diff --git a/dragonion_core/proto/web/__init__.py b/dragonion_core/proto/web/__init__.py new file mode 100644 index 0000000..bdb115a --- /dev/null +++ b/dragonion_core/proto/web/__init__.py @@ -0,0 +1,22 @@ +from .webmessage import ( + webmessage_type_literal, + webmessage_error_message_literal, + WebMessageMessage, + WebErrorMessage, + WebNotificationMessage, + WebUserMessage, + WebMessage, + webmessages_union +) + + +__all__ = [ + 'webmessage_type_literal', + 'webmessage_error_message_literal', + 'WebMessageMessage', + 'WebErrorMessage', + 'WebNotificationMessage', + 'WebUserMessage', + 'WebMessage', + 'webmessages_union' +] diff --git a/dragonion_core/proto/web/webmessage.py b/dragonion_core/proto/web/webmessage.py new file mode 100644 index 0000000..5da0abf --- /dev/null +++ b/dragonion_core/proto/web/webmessage.py @@ -0,0 +1,69 @@ +from typing import Literal, Final, Union +from dataclasses_json import dataclass_json +from dataclasses import dataclass + + +webmessage_type_literal = Literal[ + "connect", "message", "disconnect", "error", "notification" +] +webmessage_error_message_literal = Literal[ + "unknown", "username_exists", "invalid_webmessage" +] + + +@dataclass_json +@dataclass +class _WebAnyMessage: + username: str | None = None + type: webmessage_type_literal = "message" + message: str | None = None + error_message: webmessage_error_message_literal | None = None + + +@dataclass_json +@dataclass +class WebMessageMessage: + username: str + message: str + type: Final = "message" + + +@dataclass_json +@dataclass +class WebErrorMessage: + error_message: webmessage_error_message_literal + type: Final = "error" + + +@dataclass_json +@dataclass +class WebUserMessage: + type: Literal["connect", "disconnect"] + username: str + + +@dataclass_json +@dataclass +class WebNotificationMessage: + message: str + type: Final = "notification" + + +webmessages_union = Union[ + WebMessageMessage, + WebErrorMessage, + WebUserMessage, + WebNotificationMessage +] + + +class WebMessage: + @staticmethod + def from_json(data) -> webmessages_union: + return { + "connect": WebUserMessage.from_json, + "disconnect": WebUserMessage.from_json, + "message": WebMessageMessage.from_json, + "error": WebErrorMessage.from_json, + "notification": WebNotificationMessage.from_json + }[_WebAnyMessage.from_json(data).type](data) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..6303f5e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,17 @@ +[tool.poetry] +name = "dragonion-core" +version = "0.1.0" +description = "" +authors = ["BarsTiger "] +readme = "README.md" +packages = [{include = "dragonion_core"}] + +[tool.poetry.dependencies] +python = "^3.10" +dataclasses-json = "^0.5.9" +sqlitedict = "^2.1.0" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api"