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