diff --git a/vpn/views.py b/vpn/views.py index ee0e5b8..887702d 100644 --- a/vpn/views.py +++ b/vpn/views.py @@ -3,43 +3,62 @@ import json from django.shortcuts import get_object_or_404 from django.http import JsonResponse, HttpResponse, Http404 - def shadowsocks(request, link): from .models import ACLLink, AccessLog try: acl_link = get_object_or_404(ACLLink, link=link) acl = acl_link.acl except Http404: - AccessLog.objects.create(user=None, server="Unknown", action="Failed", data=f"ACL not found for link: {link}") + AccessLog.objects.create(user=None, server="Unknown", action="Failed", + data=f"ACL not found for link: {link}") return JsonResponse({"error": "Not allowed"}, status=403) - + try: server_user = acl.server.get_user(acl.user, raw=True) except Exception as e: - AccessLog.objects.create(user=acl.user, server=acl.server.name, action="Failed", data=f"{e}") + AccessLog.objects.create(user=acl.user, server=acl.server.name, action="Failed", + data=f"{e}") return JsonResponse({"error": f"Couldn't get credentials from server. {e}"}) - config = { - "transport": { - "$type": "tcpudp", - "tcp": { - "$type": "shadowsocks", - "endpoint": f"{acl.server.client_hostname}:{server_user.port}", - "cipher": f"{server_user.method}", - "secret": f"{server_user.password}", - "prefix": "\u0005\u00dc_\u00e0\u0001" - }, - "udp": { - "$type": "shadowsocks", - "endpoint": f"{acl.server.client_hostname}:{server_user.port}", - "cipher": f"{server_user.method}", - "secret": f"{server_user.password}", - "prefix": "\u0005\u00dc_\u00e0\u0001" - } - } - } + if request.GET.get('mode') == 'json': + config = { + "info": "Managed by OutFleet_v2 [github.com/house-of-vanity/OutFleet/]", + "password": server_user.password, + "method": server_user.method, + "prefix": "\u0005\u00dc_\u00e0\u0001", + "server": acl.server.client_hostname, + "server_port": server_user.port, + "access_url": server_user.access_url, + "outfleet": { + "acl_link": link, + "server_name": acl.server.name, + "server_type": acl.server.server_type, + } + } + response = yaml.dump(config, allow_unicode=True) + else: + config = { + "transport": { + "$type": "tcpudp", + "tcp": { + "$type": "shadowsocks", + "endpoint": f"{acl.server.client_hostname}:{server_user.port}", + "cipher": f"{server_user.method}", + "secret": f"{server_user.password}", + "prefix": "\u0005\u00dc_\u00e0\u0001" + }, + "udp": { + "$type": "shadowsocks", + "endpoint": f"{acl.server.client_hostname}:{server_user.port}", + "cipher": f"{server_user.method}", + "secret": f"{server_user.password}", + "prefix": "\u0005\u00dc_\u00e0\u0001" + } + } + } + response = json.dumps(config, indent=2) - AccessLog.objects.create(user=acl.user, server=acl.server.name, action="Success", data=json.dumps(config, indent=2)) + AccessLog.objects.create(user=acl.user, server=acl.server.name, action="Success", data=response) + + return HttpResponse(response, content_type=f"{ 'application/json; charset=utf-8' if request.GET.get('mode') == 'json' else 'text/html' }") - yaml_data = yaml.dump(config, allow_unicode=True) - return HttpResponse(yaml_data, content_type="text/html")