diff --git a/firewall/forms.py b/firewall/forms.py index 39d4816..11024dc 100644 --- a/firewall/forms.py +++ b/firewall/forms.py @@ -1,6 +1,7 @@ from firewall.models import RedirectRule, FirewallRule, FirewallSettings from wireguard.models import Peer, WireGuardInstance, NETMASK_CHOICES from django import forms +import re class RedirectRuleForm(forms.ModelForm): @@ -104,6 +105,8 @@ class FirewallRuleForm(forms.ModelForm): firewall_chain = cleaned_data.get('firewall_chain') rule_action = cleaned_data.get('rule_action') in_interface = cleaned_data.get('in_interface') + destination_port = self.cleaned_data.get('destination_port') + protocol = cleaned_data.get('protocol') if firewall_chain == 'forward' and rule_action not in ['accept', 'drop', 'reject']: raise forms.ValidationError("Invalid rule action for firewall chain 'forward'. Allowed actions are 'accept', 'drop', and 'reject'.") @@ -113,6 +116,21 @@ class FirewallRuleForm(forms.ModelForm): raise forms.ValidationError("Invalid rule action for firewall chain 'postrouting'. Allowed actions are 'masquerade' and 'accept'.") if in_interface: raise forms.ValidationError("In Interface cannot be used with firewall chain 'postrouting'.") + + if destination_port: + if protocol not in ['tcp', 'udp', 'both']: + raise forms.ValidationError("Destination Port can only be used with protocol 'tcp' and/or 'udp'.") + if not re.match(r'^(\d+|\d+:\d+)$', destination_port): + raise forms.ValidationError("Invalid destination port format. Use a single port number or a range of port numbers separated by a colon. Example: 80 or 8000:8080.") + + if ':' in destination_port: + start, end = map(int, destination_port.split(':')) + if not 1 <= start <= 65535 or not 1 <= end <= 65535 or start >= end: + raise forms.ValidationError("Invalid port range. The start and end port numbers must be between 1 and 65535 and the start port number must be less than the end port number.") + else: + port = int(destination_port) + if not 1 <= port <= 65535: + raise forms.ValidationError("Invalid port number. The port number must be between 1 and 65535.") return cleaned_data diff --git a/firewall/views.py b/firewall/views.py index 56f752c..d401a53 100644 --- a/firewall/views.py +++ b/firewall/views.py @@ -89,6 +89,7 @@ def manage_firewall_rule(request): firewall_settings, firewall_settings_created = FirewallSettings.objects.get_or_create(name='global') firewall_settings.pending_changes = True firewall_settings.save() + instance.delete() messages.success(request, 'Firewall rule deleted successfully') else: messages.warning(request, 'Error deleting Firewall rule|Confirmation did not match. Firewall rule was not deleted.') @@ -120,5 +121,6 @@ def manage_firewall_rule(request): context['forward_sort_order'] = highest_forward_sort_order + 10 context['postrouting_sort_order'] = highest_postrouting_sort_order + 10 + context['current_chain'] = current_chain return render(request, 'firewall/manage_firewall_rule.html', context=context) diff --git a/templates/base.html b/templates/base.html index c5e6036..62a9d27 100644 --- a/templates/base.html +++ b/templates/base.html @@ -104,10 +104,11 @@ diff --git a/templates/firewall/firewall_nav_tabs.html b/templates/firewall/firewall_nav_tabs.html index 9457ef3..63956fe 100644 --- a/templates/firewall/firewall_nav_tabs.html +++ b/templates/firewall/firewall_nav_tabs.html @@ -2,11 +2,12 @@ - + + \ No newline at end of file diff --git a/templates/firewall/firewall_rule_list.html b/templates/firewall/firewall_rule_list.html index 6d61c2e..0895a30 100644 --- a/templates/firewall/firewall_rule_list.html +++ b/templates/firewall/firewall_rule_list.html @@ -44,8 +44,6 @@ State Action - - {% for rule in firewall_rule_list %} @@ -53,8 +51,8 @@ {{ rule.sort_order }} {% if rule.description %}{% endif %} - {{ rule.in_interface }} - {{ rule.out_interface }} + {{ rule.in_interface|default_if_none:'' }} + {{ rule.out_interface|default_if_none:'' }} {% if rule.source_ip %}{% if rule.not_source %}! {% endif %}{{ rule.source_ip }}/{{ rule.source_netmask }}
{% endif%} {% for peer in rule.source_peer.all %}{% if rule.not_source %}! {% endif %}{{ peer }}{% if rule.source_peer_include_networks %} +{% endif %}
{% endfor %} @@ -65,8 +63,8 @@ {% for peer in rule.destination_peer.all %}{% if rule.not_destination %}! {% endif %}{{ peer }}{% if rule.destination_peer_include_networks %} +{% endif %}
{% endfor %} - {{ rule.get_protocol_display }} - {{ rule.destination_port }} + {{ rule.get_protocol_display|default_if_none:'' }} + {{ rule.destination_port|default_if_none:'' }} {% if rule.state_new %}{% if rule.not_state %}! {% endif %}New
{% endif %} {% if rule.state_related %}{% if rule.not_state %}! {% endif %}Related
{% endif %} diff --git a/templates/firewall/manage_firewall_rule.html b/templates/firewall/manage_firewall_rule.html index 688ffef..9d4f2df 100644 --- a/templates/firewall/manage_firewall_rule.html +++ b/templates/firewall/manage_firewall_rule.html @@ -370,37 +370,42 @@ + +{% endblock %} + + +{% block custom_page_scripts %} + @@ -454,6 +455,20 @@ updateSortOrder(); {% endif %} }); - - -{% endblock %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/templates/firewall/manage_redirect_rule.html b/templates/firewall/manage_redirect_rule.html index 31d7511..a5be14f 100644 --- a/templates/firewall/manage_redirect_rule.html +++ b/templates/firewall/manage_redirect_rule.html @@ -80,7 +80,7 @@ - Cancel + Back {% if instance %}Delete Rule{% endif %} diff --git a/templates/firewall/redirect_rule_list.html b/templates/firewall/redirect_rule_list.html index 63a4147..0c28717 100644 --- a/templates/firewall/redirect_rule_list.html +++ b/templates/firewall/redirect_rule_list.html @@ -66,6 +66,7 @@ + Create Port forwarding Rule @@ -75,5 +76,5 @@ -Create Port forwarding Rule + {% endblock %} \ No newline at end of file