commit aeb052f26e4e64adee299b22ea1e740634dda7db Author: trinkey Date: Sun Dec 22 00:08:08 2024 -0500 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f8a110f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +message.sqlite3 diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5b3225f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "cSpell.words": [ + "TAUTH", + "tmessage" + ] +} diff --git a/config.py b/config.py new file mode 100644 index 0000000..a495f42 --- /dev/null +++ b/config.py @@ -0,0 +1,2 @@ +tCOMMON_URL_INTERNAL = "http://localhost:8888" +tCOMMON_TOKEN = "Secret tCommon-specific token" diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..0a97425 --- /dev/null +++ b/manage.py @@ -0,0 +1,14 @@ +import os +import sys + + +def main(): + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tmessage.settings") + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError("Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?") from exc + execute_from_command_line(sys.argv) + +if __name__ == "__main__": + main() diff --git a/tmessage/__init__.py b/tmessage/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tmessage/asgi.py b/tmessage/asgi.py new file mode 100644 index 0000000..407e37d --- /dev/null +++ b/tmessage/asgi.py @@ -0,0 +1,6 @@ +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tmessage.settings") +application = get_asgi_application() diff --git a/tmessage/settings.py b/tmessage/settings.py new file mode 100644 index 0000000..a3cf9f4 --- /dev/null +++ b/tmessage/settings.py @@ -0,0 +1,78 @@ +from pathlib import Path + +import requests + +from config import tCOMMON_TOKEN, tCOMMON_URL_INTERNAL + +config = requests.get(f"{tCOMMON_URL_INTERNAL}/api/initialize/", params={ + "token": tCOMMON_TOKEN +}, allow_redirects=False).json() + +if not config["success"]: + raise ImportError("tCommon token doesn't match") + +if not config["services"]["message"]: + raise ImportError("tMessage isn't registered in tCommon") + +DEBUG = config["debug"] +SECRET_KEY = config["services"]["message"]["token"] + +BASE_DIR = Path(__file__).resolve().parent.parent + +ALLOWED_HOSTS = ["*"] + +INSTALLED_APPS = [ + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages" +] + +MIDDLEWARE = [ + "django.middleware.security.SecurityMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware" +] + +ROOT_URLCONF = "tmessage.urls" + +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [ + BASE_DIR / "tmessage/templates" + ], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + ], + }, + }, +] + +WSGI_APPLICATION = "tmessage.wsgi.application" + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": BASE_DIR / "message.sqlite3", + } +} + +AUTH_PASSWORD_VALIDATORS = [] + +LANGUAGE_CODE = "en-us" +TIME_ZONE = "UTC" +USE_I18N = True +USE_TZ = True + +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" diff --git a/tmessage/templates/404.html b/tmessage/templates/404.html new file mode 100644 index 0000000..221afca --- /dev/null +++ b/tmessage/templates/404.html @@ -0,0 +1,7 @@ +{% extends "base.html" %} + +{% block body %} +

Hmm. That doesn't look right.

+ Make sure the URL is correct and try again. + (Error 404 - Page not found) +{% endblock %} diff --git a/tmessage/templates/base.html b/tmessage/templates/base.html new file mode 100644 index 0000000..883543d --- /dev/null +++ b/tmessage/templates/base.html @@ -0,0 +1,28 @@ + + + + + {% block title %}{% if title %}{{ title }} - {% endif %}{% endblock %}tMessage + + + + + + + + {% block head %}{% endblock %} + + + + + + + +
+ + {% block body %} + Something went horribly wrong! Please contact us so we can fix this. + {% endblock %} +
+ + diff --git a/tmessage/templates/noauth/index.html b/tmessage/templates/noauth/index.html new file mode 100644 index 0000000..e05120c --- /dev/null +++ b/tmessage/templates/noauth/index.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block body %} +

tMessage

+
Anonymously message your friends
+

+ Log in +

+{% endblock %} diff --git a/tmessage/urls.py b/tmessage/urls.py new file mode 100644 index 0000000..c916af1 --- /dev/null +++ b/tmessage/urls.py @@ -0,0 +1,12 @@ +from django.contrib import admin +from django.urls import path + +from .views import auth, index, message, profile + +urlpatterns = [ + path("", index), + path("auth/", auth), + path("u//", profile), + path("m//", message), + path("django-admin/", admin.site.urls) +] diff --git a/tmessage/views/__init__.py b/tmessage/views/__init__.py new file mode 100644 index 0000000..34da215 --- /dev/null +++ b/tmessage/views/__init__.py @@ -0,0 +1 @@ +from .templates import auth, index, message, profile # noqa: F401 diff --git a/tmessage/views/helper.py b/tmessage/views/helper.py new file mode 100644 index 0000000..85d2bcb --- /dev/null +++ b/tmessage/views/helper.py @@ -0,0 +1,43 @@ +import random +from urllib.parse import quote as url_escape + +import requests +from django.core.handlers.wsgi import WSGIRequest +from django.http import HttpResponse +from django.template import loader + +from tmessage.settings import config + +COLORS = ["rosewater", "flamingo", "pink", "mauve", "red", "maroon", "peach", "yellow", "green", "teal", "sky", "sapphire", "blue", "lavender"] + +def render_template( + request: WSGIRequest, + template: str, + /, *, + status: int=200, + headers: dict[str, str]={}, + content_type: str="text/html", + **context +) -> HttpResponse: + c = { + "accent": random.choice(COLORS), + "config": config + } + + for key, val in context.items(): + c[key] = val + + resp = HttpResponse( + loader.get_template(template).render(c, request), + status=status, + content_type=content_type + ) + + for key, val in headers.items(): + resp[key] = val + + return resp + +def is_logged_in(request: WSGIRequest) -> dict | None: + resp = requests.get(config["services"]["auth"]["url"]["int"] + f"/api/authenticated/?token={url_escape(config['services']['message']['token'])}&service=message", cookies={**request.COOKIES}).json() + return resp["success"] and resp["auth"] diff --git a/tmessage/views/templates.py b/tmessage/views/templates.py new file mode 100644 index 0000000..1733ef5 --- /dev/null +++ b/tmessage/views/templates.py @@ -0,0 +1,33 @@ +from datetime import datetime + +from django.core.handlers.wsgi import WSGIRequest +from django.http import HttpResponse, HttpResponseRedirect + +from .helper import is_logged_in, render_template + + +def auth(request: WSGIRequest) -> HttpResponseRedirect: + resp = HttpResponseRedirect("/") + if "remove" in request.GET: + resp.set_cookie("sessionid", "", max_age=0, expires=datetime(0, 0, 0)) + else: + resp.set_cookie("sessionid", request.GET.get("sessionid") or "") + + return resp + +def index(request: WSGIRequest) -> HttpResponse: + if is_logged_in(request): + return dashboard(request) + + return render_template( + request, "noauth/index.html" + ) + +def profile(request: WSGIRequest, username: str) -> HttpResponse: + ... + +def message(request: WSGIRequest, username: str) -> HttpResponse: + ... + +def dashboard(request: WSGIRequest) -> HttpResponse: + return render_template(request, "base.html") diff --git a/tmessage/wsgi.py b/tmessage/wsgi.py new file mode 100644 index 0000000..fa49cd8 --- /dev/null +++ b/tmessage/wsgi.py @@ -0,0 +1,6 @@ +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tmessage.settings") +application = get_wsgi_application()