1 /*
2
3 Firewall Builder
4
5 Copyright (C) 2003 NetCitadel, LLC
6
7 Author: Vadim Kurland vadim@fwbuilder.org
8
9 $Id$
10
11 This program is free software which we release under the GNU General Public
12 License. You may redistribute and/or modify this program under the terms
13 of that license as published by the Free Software Foundation; either
14 version 2 of the License, or (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 To get a copy of the GNU General Public License, write to the Free Software
22 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
24 */
25
26
27 #include "config.h"
28 #include "global.h"
29 #include "utils.h"
30
31 #include "FWBTree.h"
32 #include "TCPServiceDialog.h"
33 #include "FWCmdChange.h"
34
35 #include "ProjectPanel.h"
36 #include "fwbuilder/Library.h"
37 #include "fwbuilder/TCPService.h"
38
39 #include <memory>
40
41 #include <qlineedit.h>
42 #include <qspinbox.h>
43 #include <qcheckbox.h>
44 #include <qtextedit.h>
45 #include <qcombobox.h>
46 #include <qpushbutton.h>
47 #include <qmessagebox.h>
48 #include <qlabel.h>
49 #include <QUndoStack>
50
51
52 using namespace std;
53 using namespace libfwbuilder;
54
TCPServiceDialog(QWidget * parent)55 TCPServiceDialog::TCPServiceDialog(QWidget *parent) : BaseObjectDialog(parent)
56 {
57 m_dialog = new Ui::TCPServiceDialog_q;
58 m_dialog->setupUi(this);
59
60 obj=NULL;
61
62 connectSignalsOfAllWidgetsToSlotChange();
63 }
64
~TCPServiceDialog()65 TCPServiceDialog::~TCPServiceDialog()
66 {
67 delete m_dialog;
68 }
69
loadFWObject(FWObject * o)70 void TCPServiceDialog::loadFWObject(FWObject *o)
71 {
72 obj=o;
73 TCPService *s = dynamic_cast<TCPService*>(obj);
74 assert(s!=NULL);
75
76 init=true;
77
78 m_dialog->obj_name->setText( QString::fromUtf8(s->getName().c_str()) );
79 m_dialog->ss->setValue( TCPUDPService::cast(s)->getSrcRangeStart() );
80 m_dialog->se->setValue( TCPUDPService::cast(s)->getSrcRangeEnd() );
81 m_dialog->ds->setValue( TCPUDPService::cast(s)->getDstRangeStart() );
82 m_dialog->de->setValue( TCPUDPService::cast(s)->getDstRangeEnd() );
83
84 m_dialog->urg_m->setChecked( s->getBool("urg_flag_mask") );
85 m_dialog->ack_m->setChecked( s->getBool("ack_flag_mask") );
86 m_dialog->psh_m->setChecked( s->getBool("psh_flag_mask") );
87 m_dialog->rst_m->setChecked( s->getBool("rst_flag_mask") );
88 m_dialog->syn_m->setChecked( s->getBool("syn_flag_mask") );
89 m_dialog->fin_m->setChecked( s->getBool("fin_flag_mask") );
90
91 m_dialog->urg_s->setChecked( s->getBool("urg_flag") );
92 m_dialog->ack_s->setChecked( s->getBool("ack_flag") );
93 m_dialog->psh_s->setChecked( s->getBool("psh_flag") );
94 m_dialog->rst_s->setChecked( s->getBool("rst_flag") );
95 m_dialog->syn_s->setChecked( s->getBool("syn_flag") );
96 m_dialog->fin_s->setChecked( s->getBool("fin_flag") );
97
98 m_dialog->established->setChecked( s->getBool("established") );
99
100 m_dialog->commentKeywords->loadFWObject(o);
101
102 toggleEstablished();
103
104 m_dialog->obj_name->setEnabled(!o->isReadOnly());
105 setDisabledPalette(m_dialog->obj_name);
106
107 m_dialog->ss->setEnabled(!o->isReadOnly());
108 setDisabledPalette(m_dialog->ss);
109
110 m_dialog->se->setEnabled(!o->isReadOnly());
111 setDisabledPalette(m_dialog->se);
112
113 m_dialog->ds->setEnabled(!o->isReadOnly());
114 setDisabledPalette(m_dialog->ds);
115
116 m_dialog->de->setEnabled(!o->isReadOnly());
117 setDisabledPalette(m_dialog->de);
118
119 m_dialog->urg_m->setEnabled(!o->isReadOnly());
120 setDisabledPalette(m_dialog->urg_m);
121
122 m_dialog->ack_m->setEnabled(!o->isReadOnly());
123 setDisabledPalette(m_dialog->ack_m);
124
125 m_dialog->psh_m->setEnabled(!o->isReadOnly());
126 setDisabledPalette(m_dialog->psh_m);
127
128 m_dialog->rst_m->setEnabled(!o->isReadOnly());
129 setDisabledPalette(m_dialog->rst_m);
130
131 m_dialog->syn_m->setEnabled(!o->isReadOnly());
132 setDisabledPalette(m_dialog->syn_m);
133
134 m_dialog->fin_m->setEnabled(!o->isReadOnly());
135 setDisabledPalette(m_dialog->fin_m);
136
137 m_dialog->urg_s->setEnabled(!o->isReadOnly());
138 setDisabledPalette(m_dialog->urg_s);
139
140 m_dialog->ack_s->setEnabled(!o->isReadOnly());
141 setDisabledPalette(m_dialog->ack_s);
142
143 m_dialog->psh_s->setEnabled(!o->isReadOnly());
144 setDisabledPalette(m_dialog->psh_s);
145
146 m_dialog->rst_s->setEnabled(!o->isReadOnly());
147 setDisabledPalette(m_dialog->rst_s);
148
149 m_dialog->syn_s->setEnabled(!o->isReadOnly());
150 setDisabledPalette(m_dialog->syn_s);
151
152 m_dialog->fin_s->setEnabled(!o->isReadOnly());
153 setDisabledPalette(m_dialog->fin_s);
154
155 m_dialog->established->setEnabled(!o->isReadOnly());
156 setDisabledPalette(m_dialog->established);
157
158 init=false;
159 }
160
validate(bool * res)161 void TCPServiceDialog::validate(bool *res)
162 {
163 *res = true;
164 if (!validateName(this,obj,m_dialog->obj_name->text()))
165 {
166 *res = false;
167 return;
168 }
169 }
170
171
172
applyChanges()173 void TCPServiceDialog::applyChanges()
174 {
175 std::auto_ptr<FWCmdChange> cmd( new FWCmdChange(m_project, obj));
176 FWObject* new_state = cmd->getNewState();
177
178 string oldname = obj->getName();
179 new_state->setName( string(m_dialog->obj_name->text().toUtf8().constData()) );
180 m_dialog->commentKeywords->applyChanges(new_state);
181
182 // check port ranges (bug #1695481, range start must be <= range end)
183 // See #981 Do this check in applyChanges() rather than validate so we
184 // can update end of range input fields instead of signalling invalid
185 // configuration.
186
187 int sps = m_dialog->ss->value();
188 int spe = m_dialog->se->value();
189 int dps = m_dialog->ds->value();
190 int dpe = m_dialog->de->value();
191
192 if (sps > spe) m_dialog->se->setValue( m_dialog->ss->value() );
193 if (dps > dpe) m_dialog->de->setValue( m_dialog->ds->value() );
194
195 spe = m_dialog->se->value();
196 dpe = m_dialog->de->value();
197
198 TCPUDPService::cast(new_state)->setSrcRangeStart(m_dialog->ss->value());
199 TCPUDPService::cast(new_state)->setSrcRangeEnd(m_dialog->se->value());
200 TCPUDPService::cast(new_state)->setDstRangeStart(m_dialog->ds->value());
201 TCPUDPService::cast(new_state)->setDstRangeEnd(m_dialog->de->value());
202
203 new_state->setBool("urg_flag_mask", m_dialog->urg_m->isChecked() );
204 new_state->setBool("ack_flag_mask", m_dialog->ack_m->isChecked() );
205 new_state->setBool("psh_flag_mask", m_dialog->psh_m->isChecked() );
206 new_state->setBool("rst_flag_mask", m_dialog->rst_m->isChecked() );
207 new_state->setBool("syn_flag_mask", m_dialog->syn_m->isChecked() );
208 new_state->setBool("fin_flag_mask", m_dialog->fin_m->isChecked() );
209
210 new_state->setBool("urg_flag", m_dialog->urg_s->isChecked() );
211 new_state->setBool("ack_flag", m_dialog->ack_s->isChecked() );
212 new_state->setBool("psh_flag", m_dialog->psh_s->isChecked() );
213 new_state->setBool("rst_flag", m_dialog->rst_s->isChecked() );
214 new_state->setBool("syn_flag", m_dialog->syn_s->isChecked() );
215 new_state->setBool("fin_flag", m_dialog->fin_s->isChecked() );
216
217 new_state->setBool("established", m_dialog->established->isChecked());
218
219 if (!cmd->getOldState()->cmp(new_state, true))
220 {
221 if (obj->isReadOnly()) return;
222 m_project->undoStack->push(cmd.release());
223 }
224
225 }
226
toggleEstablished()227 void TCPServiceDialog::toggleEstablished()
228 {
229 bool using_established = m_dialog->established->isChecked();
230
231 m_dialog->urg_m->setEnabled( !using_established );
232 m_dialog->ack_m->setEnabled( !using_established );
233 m_dialog->psh_m->setEnabled( !using_established );
234 m_dialog->rst_m->setEnabled( !using_established );
235 m_dialog->syn_m->setEnabled( !using_established );
236 m_dialog->fin_m->setEnabled( !using_established );
237
238 m_dialog->urg_s->setEnabled( !using_established );
239 m_dialog->ack_s->setEnabled( !using_established );
240 m_dialog->psh_s->setEnabled( !using_established );
241 m_dialog->rst_s->setEnabled( !using_established );
242 m_dialog->syn_s->setEnabled( !using_established );
243 m_dialog->fin_s->setEnabled( !using_established );
244
245 m_dialog->flags_lbl_1->setEnabled( !using_established );
246 m_dialog->flags_lbl_2->setEnabled( !using_established );
247 m_dialog->flags_lbl_3->setEnabled( !using_established );
248 m_dialog->flags_lbl_u->setEnabled( !using_established );
249 m_dialog->flags_lbl_a->setEnabled( !using_established );
250 m_dialog->flags_lbl_p->setEnabled( !using_established );
251 m_dialog->flags_lbl_r->setEnabled( !using_established );
252 m_dialog->flags_lbl_s->setEnabled( !using_established );
253 m_dialog->flags_lbl_f->setEnabled( !using_established );
254
255 }
256
257