~costales/gui-ufw/17.10-pause-btn

« back to all changes in this revision

Viewing changes to gufw/gufw/view/update.py

  • Committer: costales
  • Date: 2016-11-08 19:14:11 UTC
  • Revision ID: costales.marcos@gmail.com-20161108191411-1rxmc73ssvdwh9k8
17.04

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Gufw 17.04.1 - http://gufw.org
 
2
# Copyright (C) 2008-2016 Marcos Alvarez Costales https://launchpad.net/~costales
 
3
#
 
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.
 
8
#
 
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.
 
13
#
 
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
 
16
# information.
 
17
 
 
18
import gi
 
19
import re
 
20
gi.require_version('Gtk', '3.0')
 
21
from gi.repository import Gtk
 
22
 
 
23
import gettext
 
24
from gettext import gettext as _
 
25
gettext.textdomain('gufw')
 
26
 
 
27
DIRECTION2NUM = {'in': 0,
 
28
                 'out': 1,
 
29
                 'both': 1}
 
30
LOGGING2NUM = {'': 0,
 
31
               'log': 1,
 
32
               'log-all': 2}
 
33
PROTO2NUM = {'': 0,
 
34
             'tcp': 1,
 
35
             'udp': 2 }
 
36
 
 
37
 
 
38
class Update:
 
39
    def __init__(self, gufw, ufw_row, description, cmd, policy, direction, proto, from_ip, from_port, to_ip, to_port, iface, routed, logging):
 
40
        self.gufw = gufw
 
41
        self.ufw_row = str(ufw_row)
 
42
        self.rule_description = description
 
43
        self.rule_cmd         = cmd
 
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
 
54
 
 
55
        self.builder = Gtk.Builder()
 
56
        self.builder.set_translation_domain('gufw')
 
57
        self.builder.add_from_file('/usr/share/gufw/ui/update.ui')
 
58
        
 
59
        self._set_objects_name()
 
60
        self._set_initial_values()
 
61
        
 
62
        self.win_update.set_transient_for(gufw.winMain)
 
63
        self.builder.connect_signals(self)
 
64
        self.win_update.show_all()
 
65
        
 
66
        if self.gufw.fw.get_policy('routed') == 'disabled':
 
67
            self.update_routed_img.set_visible(False)
 
68
            self.update_routed.set_visible(False)
 
69
        
 
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"))
 
78
    
 
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')
 
96
    
 
97
    def _set_initial_values(self):
 
98
        iface_num = 0
 
99
        routed_num = 0
 
100
        i = 0
 
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:
 
107
                iface_num = i + 1
 
108
            if ifaceName == self.rule_routed:
 
109
                routed_num = i + 1
 
110
            i += 1
 
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])
 
118
    
 
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)
 
124
    
 
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)
 
130
    
 
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"))
 
135
        else:
 
136
            self.update_btn.set_sensitive(True)
 
137
            self.update_btn.set_tooltip_text('')
 
138
    
 
139
    def on_update_protocol_changed(self, widget, data=None):
 
140
        self._set_update_btn_control()
 
141
    
 
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)
 
145
        else:
 
146
            self._set_to_port_sensitive(True)
 
147
        
 
148
        self._set_update_btn_control()
 
149
    
 
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)
 
153
        else:
 
154
            self._set_from_port_sensitive(True)
 
155
        
 
156
        self._set_update_btn_control()
 
157
    
 
158
    def on_btnUpdateCancel_clicked(self, widget, data=None):
 
159
        self.win_update.destroy()
 
160
    
 
161
    def on_UpdateRule_delete_event(self, widget, data=None):
 
162
        self.win_update.destroy()
 
163
    
 
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())
 
166
    
 
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())
 
169
    
 
170
    def on_update_rule_name_icon_press(self, widget, data=None, data2=None):
 
171
        self.update_rule_name.set_text('')
 
172
    
 
173
    def on_update_from_ip_icon_press(self, widget, data=None, data2=None):
 
174
        self.update_from_ip.set_text('')
 
175
    
 
176
    def on_update_to_ip_icon_press(self, widget, data=None, data2=None):
 
177
        self.update_to_ip.set_text('')
 
178
    
 
179
    def on_update_from_port_icon_press(self, widget, data=None, data2=None):
 
180
        self.update_from_port.set_text('')
 
181
    
 
182
    def on_update_to_port_icon_press(self, widget, data=None, data2=None):
 
183
        self.update_to_port.set_text('')
 
184
    
 
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"))
 
189
        else:
 
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"))
 
192
        
 
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)
 
200
    
 
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()):
 
203
            return
 
204
        
 
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()]
 
209
        
 
210
        new_proto = ''
 
211
        if self.update_protocol.get_sensitive():
 
212
            new_proto = self.gufw.NUM2PROTO[self.update_protocol.get_active()]
 
213
        
 
214
        new_iface = ''
 
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()
 
217
        
 
218
        new_routed = ''
 
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()
 
221
        
 
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()
 
231
        
 
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!"))
 
245
            return
 
246
        
 
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', ' | '))
 
252
        
 
253
        # Add new
 
254
        insert_row = ''
 
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)
 
256
 
 
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))
 
259
        
 
260
        self.gufw.print_rules(self.gufw.fw.get_rules())
 
261
        self.win_update.destroy()
 
262
    
 
263
    def _get_same_rules(self, rule_cmd):
 
264
        i = 0
 
265
        rules_rows = []
 
266
        while True:
 
267
            try:
 
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)
 
271
                if cmd == rule_cmd:
 
272
                    rules_rows.append(real_row)
 
273
            except Exception:
 
274
                rules_rows = sorted(rules_rows, key=int, reverse=True)
 
275
                return rules_rows
 
276
            i += 1