mirror of
https://github.com/eduardogsilva/wireguard_webadmin.git
synced 2026-01-31 11:36:18 +00:00
Update peer management view and forms.
This commit is contained in:
@@ -1,21 +1,56 @@
|
||||
import ipaddress
|
||||
|
||||
from crispy_forms.bootstrap import FormActions
|
||||
from crispy_forms.helper import FormHelper
|
||||
from crispy_forms.layout import Layout, Submit, Button
|
||||
from django import forms
|
||||
from django.core.validators import MinValueValidator, MaxValueValidator
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from wireguard.models import NETMASK_CHOICES, Peer, PeerAllowedIP
|
||||
|
||||
|
||||
class PeerForm(forms.ModelForm):
|
||||
class PeerModelForm(forms.ModelForm):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.helper = FormHelper()
|
||||
self.helper.form_method = 'post'
|
||||
self.helper.layout = Layout(
|
||||
*self.Meta.fields,
|
||||
FormActions(
|
||||
Submit('save', _('Save'), css_class='btn-primary'),
|
||||
Button('cancel', _('Back'), css_class='btn-outline-secondary', onclick='window.history.back()')
|
||||
)
|
||||
)
|
||||
|
||||
class PeerNameForm(PeerModelForm):
|
||||
name = forms.CharField(label=_('Name'), required=False)
|
||||
|
||||
class Meta:
|
||||
model = Peer
|
||||
fields = ['name']
|
||||
|
||||
|
||||
class PeerKeepaliveForm(PeerModelForm):
|
||||
persistent_keepalive = forms.IntegerField(
|
||||
label=_('Persistent Keepalive'),
|
||||
required=True,
|
||||
validators=[MinValueValidator(1), MaxValueValidator(3600)],
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Peer
|
||||
fields = ['persistent_keepalive']
|
||||
|
||||
|
||||
class PeerKeysForm(PeerModelForm):
|
||||
public_key = forms.CharField(label=_('Public Key'), required=True)
|
||||
private_key = forms.CharField(label=_('Private Key'), required=False)
|
||||
pre_shared_key = forms.CharField(label=_('Pre-Shared Key'), required=True)
|
||||
persistent_keepalive = forms.IntegerField(label=_('Persistent Keepalive'), required=True)
|
||||
|
||||
|
||||
class Meta:
|
||||
model = Peer
|
||||
fields = ['name', 'public_key', 'private_key', 'pre_shared_key', 'persistent_keepalive']
|
||||
fields = ['public_key', 'private_key', 'pre_shared_key']
|
||||
|
||||
|
||||
class PeerAllowedIPForm(forms.ModelForm):
|
||||
|
||||
@@ -14,7 +14,7 @@ from user_manager.models import UserAcl
|
||||
from wgwadmlibrary.tools import check_sort_order_conflict, deduplicate_sort_order, default_sort_peers, \
|
||||
user_allowed_instances, user_allowed_peers, user_has_access_to_instance, user_has_access_to_peer
|
||||
from wireguard.models import Peer, PeerAllowedIP, WireGuardInstance
|
||||
from wireguard_peer.forms import PeerAllowedIPForm, PeerForm
|
||||
from wireguard_peer.forms import PeerAllowedIPForm, PeerNameForm, PeerKeepaliveForm, PeerKeysForm
|
||||
|
||||
|
||||
def generate_peer_default(wireguard_instance):
|
||||
@@ -184,12 +184,8 @@ def view_wireguard_peer_create(request):
|
||||
|
||||
@login_required
|
||||
def view_wireguard_peer_manage(request):
|
||||
if request.method == 'POST':
|
||||
if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=30).exists():
|
||||
return render(request, 'access_denied.html', {'page_title': 'Access Denied'})
|
||||
else:
|
||||
if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=20).exists():
|
||||
return render(request, 'access_denied.html', {'page_title': 'Access Denied'})
|
||||
if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=20).exists():
|
||||
return render(request, 'access_denied.html', {'page_title': 'Access Denied'})
|
||||
user_acl = get_object_or_404(UserAcl, user=request.user)
|
||||
|
||||
current_peer = get_object_or_404(Peer, uuid=request.GET.get('peer'))
|
||||
@@ -197,6 +193,8 @@ def view_wireguard_peer_manage(request):
|
||||
raise Http404
|
||||
current_instance = current_peer.wireguard_instance
|
||||
if request.GET.get('action') == 'delete':
|
||||
if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=30).exists():
|
||||
return render(request, 'access_denied.html', {'page_title': 'Access Denied'})
|
||||
if request.GET.get('confirmation') == 'delete':
|
||||
current_peer.wireguard_instance.pending_changes = True
|
||||
current_peer.wireguard_instance.save()
|
||||
@@ -206,28 +204,62 @@ def view_wireguard_peer_manage(request):
|
||||
else:
|
||||
messages.warning(request, _('Error deleting peer|Invalid confirmation message. Type "delete" to confirm.'))
|
||||
return redirect('/peer/manage/?peer=' + str(current_peer.uuid))
|
||||
page_title = _('Update Peer: ') + str(current_peer)
|
||||
page_title = _('Peer Configuration: ') + str(current_peer)
|
||||
peer_ip_list = current_peer.peerallowedip_set.filter(config_file='server').order_by('priority')
|
||||
peer_client_ip_list = current_peer.peerallowedip_set.filter(config_file='client').order_by('priority')
|
||||
|
||||
if request.method == 'POST':
|
||||
form = PeerForm(request.POST, instance=current_peer)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
messages.success(request, _('Peer updated|Peer updated successfully.'))
|
||||
current_peer.wireguard_instance.pending_changes = True
|
||||
current_peer.wireguard_instance.save()
|
||||
return redirect('/peer/list/?uuid=' + str(current_peer.wireguard_instance.uuid))
|
||||
else:
|
||||
form = PeerForm(instance=current_peer)
|
||||
|
||||
context = {
|
||||
'page_title': page_title, 'current_instance': current_instance, 'current_peer': current_peer, 'form': form,
|
||||
'page_title': page_title, 'current_instance': current_instance, 'current_peer': current_peer,
|
||||
'peer_ip_list': peer_ip_list, 'peer_client_ip_list': peer_client_ip_list
|
||||
}
|
||||
return render(request, 'wireguard/wireguard_manage_peer.html', context)
|
||||
|
||||
|
||||
@login_required
|
||||
def view_wireguard_peer_edit_field(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'})
|
||||
user_acl = get_object_or_404(UserAcl, user=request.user)
|
||||
|
||||
current_peer = get_object_or_404(Peer, uuid=request.GET.get('peer'))
|
||||
if not user_has_access_to_peer(user_acl, current_peer):
|
||||
raise Http404
|
||||
|
||||
group = request.GET.get('group')
|
||||
form_classes = {
|
||||
'name': PeerNameForm,
|
||||
'keepalive': PeerKeepaliveForm,
|
||||
'keys': PeerKeysForm
|
||||
}
|
||||
|
||||
if group not in form_classes:
|
||||
raise Http404
|
||||
|
||||
FormClass = form_classes[group]
|
||||
|
||||
form = FormClass(request.POST or None, instance=current_peer)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
current_peer.wireguard_instance.pending_changes = True
|
||||
current_peer.wireguard_instance.save()
|
||||
messages.success(request, _('Peer updated|Peer updated successfully.'))
|
||||
return redirect('/peer/manage/?peer=' + str(current_peer.uuid))
|
||||
|
||||
page_title = _('Edit Peer')
|
||||
if group == 'name':
|
||||
page_title = _('Edit Peer Name')
|
||||
elif group == 'keepalive':
|
||||
page_title = _('Edit Keepalive')
|
||||
elif group == 'keys':
|
||||
page_title = _('Edit Keys')
|
||||
|
||||
context = {
|
||||
'page_title': page_title,
|
||||
'form': form,
|
||||
}
|
||||
return render(request, 'generic_form.html', context)
|
||||
|
||||
|
||||
def view_manage_ip_address(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'})
|
||||
|
||||
Reference in New Issue
Block a user