From a61b0128ec7c6f8f1439ea6eabe215bcc04c8dd8 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Thu, 13 Mar 2025 08:42:25 -0300 Subject: [PATCH] Add port forward field to redirect rule form and model --- firewall/forms.py | 14 +++++++++----- .../0012_redirectrule_port_forward_to.py | 18 ++++++++++++++++++ ...0013_remove_redirectrule_port_forward_to.py | 17 +++++++++++++++++ .../0014_redirectrule_port_forward.py | 18 ++++++++++++++++++ firewall/models.py | 10 +++++++--- templates/firewall/manage_redirect_rule.html | 10 ++++++---- 6 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 firewall/migrations/0012_redirectrule_port_forward_to.py create mode 100644 firewall/migrations/0013_remove_redirectrule_port_forward_to.py create mode 100644 firewall/migrations/0014_redirectrule_port_forward.py diff --git a/firewall/forms.py b/firewall/forms.py index bf42086..4e31c82 100644 --- a/firewall/forms.py +++ b/firewall/forms.py @@ -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 +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): description = forms.CharField(label='Description', required=False) 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_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) masquerade_source = forms.BooleanField(label='Masquerade Source (not recommended)', required=False) peer = forms.ModelChoiceField(label='Peer', queryset=Peer.objects.all(), required=False) @@ -17,7 +20,7 @@ class RedirectRuleForm(forms.ModelForm): class Meta: 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): super(RedirectRuleForm, self).__init__(*args, **kwargs) @@ -31,6 +34,7 @@ class RedirectRuleForm(forms.ModelForm): peer = cleaned_data.get('peer') ip_address = cleaned_data.get('ip_address') wireguard_instance = cleaned_data.get('wireguard_instance') + port_forward = cleaned_data.get('port_forward') if port == 8000 and protocol == 'tcp': raise forms.ValidationError("Port 8000 (tcp) is reserved for wireguard-webadmin.") diff --git a/firewall/migrations/0012_redirectrule_port_forward_to.py b/firewall/migrations/0012_redirectrule_port_forward_to.py new file mode 100644 index 0000000..070f326 --- /dev/null +++ b/firewall/migrations/0012_redirectrule_port_forward_to.py @@ -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), + ), + ] diff --git a/firewall/migrations/0013_remove_redirectrule_port_forward_to.py b/firewall/migrations/0013_remove_redirectrule_port_forward_to.py new file mode 100644 index 0000000..448dbed --- /dev/null +++ b/firewall/migrations/0013_remove_redirectrule_port_forward_to.py @@ -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', + ), + ] diff --git a/firewall/migrations/0014_redirectrule_port_forward.py b/firewall/migrations/0014_redirectrule_port_forward.py new file mode 100644 index 0000000..d5e6121 --- /dev/null +++ b/firewall/migrations/0014_redirectrule_port_forward.py @@ -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), + ), + ] diff --git a/firewall/models.py b/firewall/models.py index 413e505..70edf1d 100644 --- a/firewall/models.py +++ b/firewall/models.py @@ -1,13 +1,17 @@ -from django.db import models -from wireguard.models import Peer, WireGuardInstance -from wireguard.models import NETMASK_CHOICES import uuid +from django.db import models + +from wireguard.models import NETMASK_CHOICES +from wireguard.models import Peer, WireGuardInstance + class RedirectRule(models.Model): description = models.CharField(max_length=100, blank=True, null=True) protocol = models.CharField(max_length=3, default='tcp', choices=[('tcp', 'TCP'), ('udp', 'UDP')]) port = models.PositiveIntegerField(default=8080) + port_forward = models.CharField(max_length=5, blank=True, null=True) + add_forward_rule = models.BooleanField(default=True) masquerade_source = models.BooleanField(default=False) peer = models.ForeignKey(Peer, on_delete=models.CASCADE, blank=True, null=True) diff --git a/templates/firewall/manage_redirect_rule.html b/templates/firewall/manage_redirect_rule.html index a5be14f..d3c2a33 100644 --- a/templates/firewall/manage_redirect_rule.html +++ b/templates/firewall/manage_redirect_rule.html @@ -31,11 +31,13 @@ - - - +
+ + +
+
- +