1
# Gufw 17.04.1 - http://gufw.org
2
# Copyright (C) 2008-2016 Marcos Alvarez Costales https://launchpad.net/~costales
4
# Gufw is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 3 of the License, or
7
# (at your option) any later version.
9
# Gufw is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU General Public License for more details.
14
# You should have received a copy of the GNU General Public License
15
# along with Gufw; if not, see http://www.gnu.org/licenses for more
20
gi.require_version('Gtk', '3.0')
21
from gi.repository import Gtk
24
from gettext import gettext as _
25
gettext.textdomain('gufw')
27
DIRECTION2NUM = {'in': 0,
39
def __init__(self, gufw, ufw_row, description, cmd, policy, direction, proto, from_ip, from_port, to_ip, to_port, iface, routed, logging):
41
self.ufw_row = str(ufw_row)
42
self.rule_description = description
44
self.rule_policy = policy
45
self.rule_direction = direction
46
self.rule_proto = proto
47
self.rule_from_ip = from_ip
48
self.rule_from_port = from_port
49
self.rule_to_ip = to_ip
50
self.rule_to_port = to_port
51
self.rule_iface = iface
52
self.rule_routed = routed
53
self.rule_logging = logging
55
self.builder = Gtk.Builder()
56
self.builder.set_translation_domain('gufw')
57
self.builder.add_from_file('/usr/share/gufw/ui/update.ui')
59
self._set_objects_name()
60
self._set_initial_values()
62
self.win_update.set_transient_for(gufw.winMain)
63
self.builder.connect_signals(self)
64
self.win_update.show_all()
66
if self.gufw.fw.get_policy('routed') == 'disabled':
67
self.update_routed_img.set_visible(False)
68
self.update_routed.set_visible(False)
70
# Set sensitive values
71
self.update_from_ip.set_text(self.rule_from_ip)
72
self.update_from_port.set_text(self.rule_from_port)
73
self.update_to_ip.set_text(self.rule_to_ip)
74
self.update_to_port.set_text(self.rule_to_port)
75
if self.update_iface.get_active_text() == _("All Interfaces"):
76
self.update_routed.set_sensitive(False)
77
self.update_routed.set_tooltip_text(_("You need to set an Interface"))
79
def _set_objects_name(self):
80
self.win_update = self.builder.get_object('UpdateRule')
81
self.update_rule_name = self.builder.get_object('update_rule_name')
82
self.update_policy = self.builder.get_object('update_policy')
83
self.update_direction = self.builder.get_object('update_direction')
84
self.update_iface = self.builder.get_object('update_iface')
85
self.update_routed = self.builder.get_object('update_routed')
86
self.update_routed_img = self.builder.get_object('update_routed_img')
87
self.update_log = self.builder.get_object('update_log')
88
self.update_protocol = self.builder.get_object('update_protocol')
89
self.update_from_ip = self.builder.get_object('update_from_ip')
90
self.update_from_port = self.builder.get_object('update_from_port')
91
self.update_to_ip = self.builder.get_object('update_to_ip')
92
self.update_to_port = self.builder.get_object('update_to_port')
93
self.warning = self.builder.get_object('lbl_preconfig_info')
94
self.warning_box = self.builder.get_object('warningbox')
95
self.update_btn = self.builder.get_object('btnUpdate')
97
def _set_initial_values(self):
101
self.update_iface.append_text(_("All Interfaces"))
102
self.update_routed.append_text(_("Not Forward"))
103
for ifaceName in self.gufw.fw.get_net_interfaces():
104
self.update_iface.append_text(ifaceName)
105
self.update_routed.append_text(ifaceName)
106
if ifaceName == self.rule_iface:
108
if ifaceName == self.rule_routed:
111
self.update_rule_name.set_text(self.rule_description)
112
self.update_policy.set_active(self.gufw.POLICY2NUM[self.rule_policy])
113
self.update_direction.set_active(DIRECTION2NUM[self.rule_direction])
114
self.update_iface.set_active(iface_num)
115
self.update_routed.set_active(routed_num)
116
self.update_log.set_active(LOGGING2NUM[self.rule_logging])
117
self.update_protocol.set_active(PROTO2NUM[self.rule_proto])
119
def _set_from_port_sensitive(self, value=True):
120
self.update_protocol.set_sensitive(value)
121
self.update_from_ip.set_sensitive(value)
122
self.update_to_ip.set_sensitive(value)
123
self.update_to_port.set_sensitive(value)
125
def _set_to_port_sensitive(self, value=True):
126
self.update_protocol.set_sensitive(value)
127
self.update_from_ip.set_sensitive(value)
128
self.update_to_ip.set_sensitive(value)
129
self.update_from_port.set_sensitive(value)
131
def _set_update_btn_control(self):
132
if (':' in self.update_to_port.get_text() or ':' in self.update_from_port.get_text()) and not self.update_protocol.get_active():
133
self.update_btn.set_sensitive(False)
134
self.update_btn.set_tooltip_text(_("Choose a TCP or UDP Protocol with a range of ports"))
136
self.update_btn.set_sensitive(True)
137
self.update_btn.set_tooltip_text('')
139
def on_update_protocol_changed(self, widget, data=None):
140
self._set_update_btn_control()
142
def on_update_to_port_changed(self, widget, data=None):
143
if '/' in self.update_to_port.get_text():
144
self._set_to_port_sensitive(False)
146
self._set_to_port_sensitive(True)
148
self._set_update_btn_control()
150
def on_update_from_port_changed(self, widget, data=None):
151
if '/' in self.update_from_port.get_text():
152
self._set_from_port_sensitive(False)
154
self._set_from_port_sensitive(True)
156
self._set_update_btn_control()
158
def on_btnUpdateCancel_clicked(self, widget, data=None):
159
self.win_update.destroy()
161
def on_UpdateRule_delete_event(self, widget, data=None):
162
self.win_update.destroy()
164
def on_update_copy_from_IP_clicked(self, widget, data=None):
165
self.update_from_ip.set_text(self.gufw.fw.get_internal_ip())
167
def on_update_copy_to_IP_clicked(self, widget, data=None):
168
self.update_to_ip.set_text(self.gufw.fw.get_internal_ip())
170
def on_update_rule_name_icon_press(self, widget, data=None, data2=None):
171
self.update_rule_name.set_text('')
173
def on_update_from_ip_icon_press(self, widget, data=None, data2=None):
174
self.update_from_ip.set_text('')
176
def on_update_to_ip_icon_press(self, widget, data=None, data2=None):
177
self.update_to_ip.set_text('')
179
def on_update_from_port_icon_press(self, widget, data=None, data2=None):
180
self.update_from_port.set_text('')
182
def on_update_to_port_icon_press(self, widget, data=None, data2=None):
183
self.update_to_port.set_text('')
185
def on_update_iface_changed(self, widget, data=None, data2=None):
186
if self.update_iface.get_active_text() != _("All Interfaces"):
187
self.update_routed.set_sensitive(True)
188
self.update_routed.set_tooltip_text(_("The IP/Port will be forward to this interface"))
190
self.update_routed.set_sensitive(False)
191
self.update_routed.set_tooltip_text(_("You need to set an Interface for forwarding to this another interface"))
193
# Not allow same iface when is routed
194
if self.gufw.fw.get_policy('routed') != 'disabled':
195
self.update_routed.remove_all()
196
self.update_routed.append_text(_("Not Forward"))
197
for ifaceName in self.gufw.fw.get_net_interfaces(self.update_iface.get_active_text()):
198
self.update_routed.append_text(ifaceName)
199
self.update_routed.set_active(0)
201
def on_btnUpdate_clicked(self, widget, data=None):
202
if not self.gufw.validate_rule(self.win_update, self.update_from_ip.get_text(), self.update_from_port.get_text(), self.update_to_ip.get_text(), self.update_to_port.get_text(), '', self.update_routed.get_active_text()):
205
new_description = self.update_rule_name.get_text()
206
new_policy = self.gufw.NUM2POLICY[self.update_policy.get_active()]
207
new_direction = self.gufw.NUM2DIRECTION[self.update_direction.get_active()]
208
new_logging = self.gufw.NUM2LOGGING[self.update_log.get_active()]
211
if self.update_protocol.get_sensitive():
212
new_proto = self.gufw.NUM2PROTO[self.update_protocol.get_active()]
215
if self.update_iface.get_sensitive() and self.update_iface.get_active_text() != _("All Interfaces"):
216
new_iface = self.update_iface.get_active_text()
219
if self.update_routed.get_sensitive() and self.update_routed.get_active_text() != _("Not Forward"):
220
new_routed = self.update_routed.get_active_text()
222
new_from_ip = new_from_port = new_to_ip = new_to_port = ''
223
if self.update_from_ip.get_sensitive():
224
new_from_ip = self.update_from_ip.get_text()
225
if self.update_from_port.get_sensitive():
226
new_from_port = self.update_from_port.get_text()
227
if self.update_to_ip.get_sensitive():
228
new_to_ip = self.update_to_ip.get_text()
229
if self.update_to_port.get_sensitive():
230
new_to_port = self.update_to_port.get_text()
232
if (self.rule_description == new_description and
233
self.rule_policy == new_policy and
234
self.rule_direction == new_direction and
235
self.rule_proto == new_proto and
236
self.rule_from_ip == new_from_ip and
237
self.rule_from_port == new_from_port and
238
self.rule_to_ip == new_to_ip and
239
self.rule_to_port == new_to_port and
240
self.rule_iface == new_iface and
241
self.rule_routed == new_routed and
242
self.rule_logging == new_logging):
243
self.warning_box.set_message_type(3)
244
self.warning.set_text(_("No changes were made!"))
247
# Delete the same rules
248
same_rules_rows = self._get_same_rules(self.rule_cmd)
249
for same_row in same_rules_rows:
250
cmd = self.gufw.fw.delete_rule(same_row)
251
self.gufw.add_to_log(_("Editing rule (Removing): ") + new_description + ' | ' + cmd[0] + ' > ' + cmd[1].replace('\n', ' | '))
255
cmd = self.gufw.fw.add_rule(new_description, insert_row, new_policy, new_direction, new_iface, new_routed, new_logging, new_proto, new_from_ip, new_from_port, new_to_ip, new_to_port)
257
self.gufw.add_to_log(_("Editing rule (Adding): ") + new_description + ' | ' + cmd[1] + ' > ' + cmd[2].replace('\n', ' | '), self.gufw.POLICY2COLOR[new_policy])
258
self.gufw.set_statusbar_msg(_("Updated rule ") + str(self.ufw_row))
260
self.gufw.print_rules(self.gufw.fw.get_rules())
261
self.win_update.destroy()
263
def _get_same_rules(self, rule_cmd):
268
iter_row = self.gufw.rules_model.get_iter(i,)
269
cmd = self.gufw.rules_model.get_value(iter_row, 2)
270
real_row = self.gufw.rules_model.get_value(iter_row, 14)
272
rules_rows.append(real_row)
274
rules_rows = sorted(rules_rows, key=int, reverse=True)