From d1908e879b93852c3bbf6ee8ea9202b24a2ed6b2 Mon Sep 17 00:00:00 2001 From: Ultradesu Date: Tue, 25 Feb 2025 12:39:08 +0200 Subject: [PATCH] Added user dashboard --- mysite/urls.py | 5 +++-- requirements.txt | 1 + vpn/views.py | 19 ++++++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/mysite/urls.py b/mysite/urls.py index 32a1951..ac70c5c 100644 --- a/mysite/urls.py +++ b/mysite/urls.py @@ -17,11 +17,12 @@ Including another URLconf from django.contrib import admin from django.urls import path, include from django.views.generic import RedirectView -from vpn.views import shadowsocks +from vpn.views import shadowsocks, userFrontend urlpatterns = [ path('admin/', admin.site.urls), path('ss/', shadowsocks, name='shadowsocks'), path('dynamic/', shadowsocks, name='shadowsocks'), + path('stat/', userFrontend, name='userFrontend'), path('', RedirectView.as_view(url='/admin/', permanent=False)), -] \ No newline at end of file +] diff --git a/requirements.txt b/requirements.txt index d19ffbe..2adf048 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,4 +13,5 @@ setuptools==75.2.0 shortuuid==1.0.13 django-celery-results==2.5.1 PyYaml==6.0.2 +Markdown==3.7 git+https://github.com/celery/django-celery-beat#egg=django-celery-beat diff --git a/vpn/views.py b/vpn/views.py index e1d75a9..88876e8 100644 --- a/vpn/views.py +++ b/vpn/views.py @@ -2,6 +2,23 @@ import yaml import json from django.shortcuts import get_object_or_404 from django.http import JsonResponse, HttpResponse, Http404 +from mysite.settings import EXTERNAL_ADDRESS + +def userFrontend(request, user_hash): + from .models import User, ACLLink + try: + user = get_object_or_404(User, hash=user_hash) + except Http404: + return JsonResponse({"error": "Not allowed"}, status=403) + + acl_links = {} + for link in ACLLink.objects.filter(acl__user=user).select_related('acl__server'): + server_name = link.acl.server.name + if server_name not in acl_links: + acl_links[server_name] = [] + acl_links[server_name].append({"link": f"{EXTERNAL_ADDRESS}/ss/{link.link}#{link.acl.server.name}", "comment": link.comment}) + + return JsonResponse(acl_links) def shadowsocks(request, link): from .models import ACLLink, AccessLog @@ -22,7 +39,7 @@ def shadowsocks(request, link): if request.GET.get('mode') == 'json': config = { - "info": "Managed by OutFleet_v2 [github.com/house-of-vanity/OutFleet/]", + "info": "Managed by OutFleet_2 [github.com/house-of-vanity/OutFleet/]", "password": server_user.password, "method": server_user.method, "prefix": "\u0005\u00dc_\u00e0\u0001",