Add port forward field to redirect rule form and model

This commit is contained in:
Eduardo Silva 2025-03-13 08:42:25 -03:00
parent 05e0f1e270
commit a61b0128ec
6 changed files with 75 additions and 12 deletions

View File

@ -1,14 +1,17 @@
from firewall.models import RedirectRule, FirewallRule, FirewallSettings
from wireguard.models import Peer, WireGuardInstance, NETMASK_CHOICES
from wgwadmlibrary.tools import list_network_interfaces
from django import forms
import re import re
from django import forms
from firewall.models import FirewallRule, FirewallSettings, RedirectRule
from wgwadmlibrary.tools import list_network_interfaces
from wireguard.models import Peer, WireGuardInstance
class RedirectRuleForm(forms.ModelForm): class RedirectRuleForm(forms.ModelForm):
description = forms.CharField(label='Description', required=False) description = forms.CharField(label='Description', required=False)
protocol = forms.ChoiceField(label='Protocol', choices=[('tcp', 'TCP'), ('udp', 'UDP')], initial='tcp') protocol = forms.ChoiceField(label='Protocol', choices=[('tcp', 'TCP'), ('udp', 'UDP')], initial='tcp')
port = forms.IntegerField(label='Port', initial=8080, min_value=1, max_value=65535) port = forms.IntegerField(label='Port', initial=8080, min_value=1, max_value=65535)
port_forward = forms.IntegerField(label='Port Forward', required=False, min_value=1, max_value=65535)
add_forward_rule = forms.BooleanField(label='Add Forward Rule', required=False, initial=True) add_forward_rule = forms.BooleanField(label='Add Forward Rule', required=False, initial=True)
masquerade_source = forms.BooleanField(label='Masquerade Source (not recommended)', required=False) masquerade_source = forms.BooleanField(label='Masquerade Source (not recommended)', required=False)
peer = forms.ModelChoiceField(label='Peer', queryset=Peer.objects.all(), required=False) peer = forms.ModelChoiceField(label='Peer', queryset=Peer.objects.all(), required=False)
@ -17,7 +20,7 @@ class RedirectRuleForm(forms.ModelForm):
class Meta: class Meta:
model = RedirectRule model = RedirectRule
fields = ['description', 'protocol', 'port', 'add_forward_rule', 'masquerade_source', 'peer', 'wireguard_instance', 'ip_address'] fields = ['description', 'protocol', 'port', 'add_forward_rule', 'masquerade_source', 'peer', 'wireguard_instance', 'ip_address', 'port_forward']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(RedirectRuleForm, self).__init__(*args, **kwargs) super(RedirectRuleForm, self).__init__(*args, **kwargs)
@ -31,6 +34,7 @@ class RedirectRuleForm(forms.ModelForm):
peer = cleaned_data.get('peer') peer = cleaned_data.get('peer')
ip_address = cleaned_data.get('ip_address') ip_address = cleaned_data.get('ip_address')
wireguard_instance = cleaned_data.get('wireguard_instance') wireguard_instance = cleaned_data.get('wireguard_instance')
port_forward = cleaned_data.get('port_forward')
if port == 8000 and protocol == 'tcp': if port == 8000 and protocol == 'tcp':
raise forms.ValidationError("Port 8000 (tcp) is reserved for wireguard-webadmin.") raise forms.ValidationError("Port 8000 (tcp) is reserved for wireguard-webadmin.")

View File

@ -0,0 +1,18 @@
# Generated by Django 5.1.5 on 2025-03-13 00:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('firewall', '0011_firewallsettings_last_firewall_reset'),
]
operations = [
migrations.AddField(
model_name='redirectrule',
name='port_forward_to',
field=models.PositiveIntegerField(default=8080),
),
]

View File

@ -0,0 +1,17 @@
# Generated by Django 5.1.5 on 2025-03-13 11:30
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('firewall', '0012_redirectrule_port_forward_to'),
]
operations = [
migrations.RemoveField(
model_name='redirectrule',
name='port_forward_to',
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 5.1.5 on 2025-03-13 11:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('firewall', '0013_remove_redirectrule_port_forward_to'),
]
operations = [
migrations.AddField(
model_name='redirectrule',
name='port_forward',
field=models.CharField(blank=True, max_length=5, null=True),
),
]

View File

@ -1,13 +1,17 @@
from django.db import models
from wireguard.models import Peer, WireGuardInstance
from wireguard.models import NETMASK_CHOICES
import uuid import uuid
from django.db import models
from wireguard.models import NETMASK_CHOICES
from wireguard.models import Peer, WireGuardInstance
class RedirectRule(models.Model): class RedirectRule(models.Model):
description = models.CharField(max_length=100, blank=True, null=True) description = models.CharField(max_length=100, blank=True, null=True)
protocol = models.CharField(max_length=3, default='tcp', choices=[('tcp', 'TCP'), ('udp', 'UDP')]) protocol = models.CharField(max_length=3, default='tcp', choices=[('tcp', 'TCP'), ('udp', 'UDP')])
port = models.PositiveIntegerField(default=8080) port = models.PositiveIntegerField(default=8080)
port_forward = models.CharField(max_length=5, blank=True, null=True)
add_forward_rule = models.BooleanField(default=True) add_forward_rule = models.BooleanField(default=True)
masquerade_source = models.BooleanField(default=False) masquerade_source = models.BooleanField(default=False)
peer = models.ForeignKey(Peer, on_delete=models.CASCADE, blank=True, null=True) peer = models.ForeignKey(Peer, on_delete=models.CASCADE, blank=True, null=True)

View File

@ -31,11 +31,13 @@
<input type="number" class="form-control" id="id_port" name="port" value="{{ form.port.value|default_if_none:'' }}"> <input type="number" class="form-control" id="id_port" name="port" value="{{ form.port.value|default_if_none:'' }}">
</div> </div>
<div class="form-group">
<label for="id_port_forward">Destination Port</label>
<input type="number" class="form-control" id="id_port_forward" name="port_forward" value="{{ form.port_forward.value|default_if_none:'' }}">
</div>
<div class="form-group"> <div class="form-group">
<label for="destinationType">Destination Type:</label> <label for="destinationType">Destination Type</label>
<select class="form-control" name="destinationType" id="destinationType"> <select class="form-control" name="destinationType" id="destinationType">
<option value="peer">Peer</option> <option value="peer">Peer</option>
<option value="ipAddress" {% if instance.ip_address %}selected{% endif %}>IP Address</option> <option value="ipAddress" {% if instance.ip_address %}selected{% endif %}>IP Address</option>