diff --git a/templates/wireguard/wireguard_peer_list.html b/templates/wireguard/wireguard_peer_list.html index 64a745f..9e7b4bc 100644 --- a/templates/wireguard/wireguard_peer_list.html +++ b/templates/wireguard/wireguard_peer_list.html @@ -28,10 +28,21 @@ {% else %} {{ peer.public_key|slice:":16" }}{% if peer.public_key|length > 16 %}...{% endif %} {% endif %} - - - - + + + {% if user_acl.user_level >= 30 %} +
+ +
+ +
+
+ {% endif %} + + + +
+ {% comment %}This needs to be improved{% endcomment %}

diff --git a/wgwadmlibrary/tools.py b/wgwadmlibrary/tools.py index ebd08b2..5986f4c 100644 --- a/wgwadmlibrary/tools.py +++ b/wgwadmlibrary/tools.py @@ -86,7 +86,7 @@ def list_network_interfaces(): def default_sort_peers(wireguard_instance: WireGuardInstance): - unsorted_peers = Peer.objects.filter(wireguard_instance=wireguard_instance, sort_order=0).order_by('created') + unsorted_peers = Peer.objects.filter(wireguard_instance=wireguard_instance, sort_order__lte=0).order_by('created') highest_sort_order = Peer.objects.filter(wireguard_instance=wireguard_instance).aggregate(Max('sort_order'))['sort_order__max'] if not highest_sort_order: highest_sort_order = 0 @@ -96,4 +96,21 @@ def default_sort_peers(wireguard_instance: WireGuardInstance): peer.sort_order = new_sort_order peer.save() new_sort_order += 1 - return unsorted_peers \ No newline at end of file + return unsorted_peers + + +def deduplicate_sort_order(wireguard_instance: WireGuardInstance): + peers = Peer.objects.filter(wireguard_instance=wireguard_instance) + for peer in peers: + duplicated_peers = peers.filter(sort_order=peer.sort_order).exclude(uuid=peer.uuid) + for duplicated_peer in duplicated_peers: + duplicated_peer.sort_order = 0 + duplicated_peer.save() + return peers + + +def check_sort_order_conflict(peer: Peer): + peers = Peer.objects.filter(wireguard_instance=peer.wireguard_instance, sort_order=peer.sort_order).exclude(uuid=peer.uuid) + if peers.exists(): + return True + return False \ No newline at end of file diff --git a/wireguard_peer/views.py b/wireguard_peer/views.py index 9882eab..bb3877a 100644 --- a/wireguard_peer/views.py +++ b/wireguard_peer/views.py @@ -6,7 +6,7 @@ from django.contrib import messages from django.db.models import Max import subprocess import ipaddress -from wgwadmlibrary.tools import user_has_access_to_peer, user_has_access_to_instance, user_allowed_instances, user_allowed_peers, default_sort_peers +from wgwadmlibrary.tools import user_has_access_to_peer, user_has_access_to_instance, user_allowed_instances, user_allowed_peers, default_sort_peers, deduplicate_sort_order, check_sort_order_conflict from django.http import Http404 from wireguard_peer.forms import PeerAllowedIPForm, PeerForm @@ -71,10 +71,48 @@ def view_wireguard_peer_list(request): if user_has_access_to_instance(user_acl, current_instance): add_peer_enabled = True - context = {'page_title': page_title, 'wireguard_instances': wireguard_instances, 'current_instance': current_instance, 'peer_list': peer_list, 'pending_changes_warning': pending_changes_warning, 'add_peer_enabled': add_peer_enabled} + context = {'page_title': page_title, 'wireguard_instances': wireguard_instances, 'current_instance': current_instance, 'peer_list': peer_list, 'pending_changes_warning': pending_changes_warning, 'add_peer_enabled': add_peer_enabled, 'user_acl': user_acl} return render(request, 'wireguard/wireguard_peer_list.html', context) +@login_required +def view_wireguard_peer_sort(request): + if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=30).exists(): + return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) + peer = get_object_or_404(Peer, uuid=request.GET.get('peer')) + # check if the current sort order is duplicated with another peer + if check_sort_order_conflict(peer): + deduplicate_sort_order(peer.wireguard_instance) + redirect_url = f'/peer/list/?uuid={peer.wireguard_instance.uuid}#peer-{peer.public_key}' + direction = request.GET.get('direction') + sort_order_changed = False + if direction == 'up': + previous_peer = Peer.objects.filter(wireguard_instance=peer.wireguard_instance, sort_order__lt=peer.sort_order).order_by('-sort_order').first() + if previous_peer: + peer.sort_order, previous_peer.sort_order = previous_peer.sort_order, peer.sort_order + peer.save() + previous_peer.save() + sort_order_changed = True + else: + messages.warning(request, 'Cannot move peer up|Peer is already at the top.') + elif direction == 'down': + next_peer = Peer.objects.filter(wireguard_instance=peer.wireguard_instance, sort_order__gt=peer.sort_order).order_by('sort_order').first() + if next_peer: + peer.sort_order, next_peer.sort_order = next_peer.sort_order, peer.sort_order + peer.save() + next_peer.save() + sort_order_changed = True + else: + messages.warning(request, 'Cannot move peer down|Peer is already at the bottom.') + + if sort_order_changed: + # check if the new sort order is duplicated with another peer + if check_sort_order_conflict(peer): + deduplicate_sort_order(peer.wireguard_instance) + + return redirect(redirect_url) + + @login_required def view_wireguard_peer_manage(request): if request.method == 'POST': diff --git a/wireguard_webadmin/settings.py b/wireguard_webadmin/settings.py index 74dc4b8..87dea26 100644 --- a/wireguard_webadmin/settings.py +++ b/wireguard_webadmin/settings.py @@ -134,6 +134,6 @@ STATICFILES_DIRS = [ DNS_CONFIG_FILE = '/etc/dnsmasq/wireguard_webadmin_dns.conf' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -WIREGUARD_WEBADMIN_VERSION = 9701 +WIREGUARD_WEBADMIN_VERSION = 9702 from wireguard_webadmin.production_settings import * diff --git a/wireguard_webadmin/urls.py b/wireguard_webadmin/urls.py index 979e6c2..b413bec 100644 --- a/wireguard_webadmin/urls.py +++ b/wireguard_webadmin/urls.py @@ -17,7 +17,7 @@ Including another URLconf from django.contrib import admin from django.urls import path from wireguard.views import view_welcome, view_wireguard_status, view_wireguard_manage_instance -from wireguard_peer.views import view_wireguard_peer_list, view_wireguard_peer_manage, view_manage_ip_address +from wireguard_peer.views import view_wireguard_peer_list, view_wireguard_peer_manage, view_manage_ip_address, view_wireguard_peer_sort from console.views import view_console from user_manager.views import view_user_list, view_manage_user, view_peer_group_list, view_peer_group_manage from accounts.views import view_create_first_user, view_login, view_logout @@ -36,6 +36,7 @@ urlpatterns = [ path('dns/manage_static_host/', view_manage_static_host, name='manage_static_host'), path('dns/manage_settings/', view_manage_dns_settings, name='manage_dns_settings'), path('peer/list/', view_wireguard_peer_list, name='wireguard_peer_list'), + path('peer/sort/', view_wireguard_peer_sort, name='wireguard_peer_sort'), path('peer/manage/', view_wireguard_peer_manage, name='wireguard_peer_manage'), path('peer/manage_ip_address/', view_manage_ip_address, name='manage_ip_address'), path('console/', view_console, name='console'),