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 "IPServiceDialog.h"
33 #include "ProjectPanel.h"
34 #include "FWCmdChange.h"
35
36 #include "fwbuilder/Library.h"
37 #include "fwbuilder/IPService.h"
38 #include "fwbuilder/ServiceGroup.h"
39
40 #include <memory>
41
42 #include <qlineedit.h>
43 #include <qspinbox.h>
44 #include <qcheckbox.h>
45 #include <qtextedit.h>
46 #include <qcombobox.h>
47 #include <qpushbutton.h>
48 #include <QUndoStack>
49
50 #include <iostream>
51
52 #include "FWWindow.h"
53 using namespace libfwbuilder;
54 using namespace std;
55
IPServiceDialog(QWidget * parent)56 IPServiceDialog::IPServiceDialog(QWidget *parent) : BaseObjectDialog(parent)
57 {
58 m_dialog = new Ui::IPServiceDialog_q;
59 m_dialog->setupUi(this);
60 obj=NULL;
61
62 connectSignalsOfAllWidgetsToSlotChange();
63 }
64
~IPServiceDialog()65 IPServiceDialog::~IPServiceDialog()
66 {
67 delete m_dialog;
68 }
69
setCodeLabel()70 void IPServiceDialog::setCodeLabel()
71 {
72 if (m_dialog->use_dscp->isChecked())
73 {
74 m_dialog->code_label->setText(
75 tr("DSCP code or class:"));
76 }
77 else
78 {
79 m_dialog->code_label->setText(
80 tr("TOS code (numeric):"));
81 }
82 }
83
loadFWObject(FWObject * o)84 void IPServiceDialog::loadFWObject(FWObject *o)
85 {
86 obj=o;
87 IPService *s = dynamic_cast<IPService*>(obj);
88 assert(s!=NULL);
89
90 init = true;
91
92 //apply->setEnabled( false );
93
94 // See #893 No need to show object attributes if the object is "Any"
95 if (obj->getId() == FWObjectDatabase::ANY_SERVICE_ID)
96 {
97 m_dialog->object_attributes_1->hide();
98 m_dialog->object_attributes_2->hide();
99 m_dialog->object_attributes_3->hide();
100
101 m_dialog->commentKeywords->setReadOnlyComment(
102 QObject::tr(
103 "When used in the Service field of a rule, "
104 "the Any object will match all "
105 "IP, ICMP, TCP or UDP services. To update your rule to "
106 "match only specific "
107 "service, drag-and-drop an object from "
108 "the Object tree into the field in the rule."));
109
110 //m_dialog->comment->setReadOnly(true);
111 //setDisabledPalette(m_dialog->comment);
112 } else
113 {
114 m_dialog->obj_name->setText( QString::fromUtf8(s->getName().c_str()) );
115 m_dialog->protocolNum->setValue( s->getProtocolNumber() );
116 m_dialog->any_opt->setChecked( s->getBool("any_opt") );
117 m_dialog->lsrr->setChecked( s->getBool("lsrr") );
118 m_dialog->ssrr->setChecked( s->getBool("ssrr") );
119 m_dialog->rr->setChecked( s->getBool("rr") );
120 m_dialog->timestamp->setChecked( s->getBool("ts") );
121 m_dialog->all_fragments->setChecked( s->getBool("fragm") );
122 m_dialog->short_fragments->setChecked( s->getBool("short_fragm") );
123 m_dialog->router_alert->setChecked( s->getBool("rtralt") );
124
125 string tos = s->getTOSCode();
126 string dscp = s->getDSCPCode();
127
128 if (!dscp.empty())
129 {
130 m_dialog->use_dscp->setChecked(true);
131 m_dialog->code->setText(dscp.c_str());
132 }
133 else
134 {
135 m_dialog->use_tos->setChecked(true);
136 m_dialog->code->setText(tos.c_str());
137 }
138 setCodeLabel();
139
140 anyOptionsStateChanged();
141
142 m_dialog->commentKeywords->loadFWObject(o);
143
144 m_dialog->object_attributes_1->show();
145 m_dialog->object_attributes_2->show();
146 m_dialog->object_attributes_3->show();
147
148 m_dialog->obj_name->setEnabled(!o->isReadOnly());
149 setDisabledPalette(m_dialog->obj_name);
150
151 m_dialog->protocolNum->setEnabled(!o->isReadOnly());
152 setDisabledPalette(m_dialog->protocolNum);
153
154 m_dialog->any_opt->setEnabled(!o->isReadOnly());
155 setDisabledPalette(m_dialog->any_opt);
156
157 m_dialog->lsrr->setEnabled(!o->isReadOnly());
158 setDisabledPalette(m_dialog->lsrr);
159
160 m_dialog->ssrr->setEnabled(!o->isReadOnly());
161 setDisabledPalette(m_dialog->ssrr);
162
163 m_dialog->rr->setEnabled(!o->isReadOnly());
164 setDisabledPalette(m_dialog->rr);
165
166 m_dialog->timestamp->setEnabled(!o->isReadOnly());
167 setDisabledPalette(m_dialog->timestamp);
168
169 m_dialog->router_alert->setEnabled(!o->isReadOnly());
170 setDisabledPalette(m_dialog->router_alert);
171
172 m_dialog->all_fragments->setEnabled(!o->isReadOnly());
173 setDisabledPalette(m_dialog->all_fragments);
174
175 m_dialog->short_fragments->setEnabled(!o->isReadOnly());
176 setDisabledPalette(m_dialog->short_fragments);
177
178 m_dialog->use_tos->setEnabled(!o->isReadOnly());
179 m_dialog->use_dscp->setEnabled(!o->isReadOnly());
180 m_dialog->code->setEnabled(!o->isReadOnly());
181 setDisabledPalette(m_dialog->code);
182
183 //anyOptionsStateChanged();
184 }
185
186 init = false;
187 }
188
changed()189 void IPServiceDialog::changed()
190 {
191 if (fwbdebug) qDebug() << "IPServiceDialog::changed()";
192
193 setCodeLabel();
194 BaseObjectDialog::changed();
195 }
196
anyOptionsStateChanged()197 void IPServiceDialog::anyOptionsStateChanged()
198 {
199 bool any_opt_state = m_dialog->any_opt->isChecked();
200
201 if (any_opt_state)
202 {
203 m_dialog->lsrr->setChecked(false);
204 m_dialog->ssrr->setChecked(false);
205 m_dialog->rr->setChecked(false);
206 m_dialog->timestamp->setChecked(false);
207 m_dialog->router_alert->setChecked(false);
208 }
209
210 m_dialog->lsrr->setEnabled(!any_opt_state);
211 m_dialog->ssrr->setEnabled(!any_opt_state);
212 m_dialog->rr->setEnabled(!any_opt_state);
213 m_dialog->timestamp->setEnabled(!any_opt_state);
214 m_dialog->router_alert->setEnabled(!any_opt_state);
215
216 changed();
217 }
218
validate(bool * res)219 void IPServiceDialog::validate(bool *res)
220 {
221 *res=true;
222 if (!validateName(this,obj,m_dialog->obj_name->text())) { *res=false; return; }
223 }
224
applyChanges()225 void IPServiceDialog::applyChanges()
226 {
227 std::auto_ptr<FWCmdChange> cmd( new FWCmdChange(m_project, obj));
228 FWObject* new_state = cmd->getNewState();
229
230 string oldname=obj->getName();
231 new_state->setName( string(m_dialog->obj_name->text().toUtf8().constData()) );
232 m_dialog->commentKeywords->applyChanges(new_state);
233
234 new_state->setInt("protocol_num", m_dialog->protocolNum->value() );
235 new_state->setBool("any_opt", m_dialog->any_opt->isChecked() );
236 new_state->setBool("lsrr", m_dialog->lsrr->isChecked() );
237 new_state->setBool("ssrr", m_dialog->ssrr->isChecked() );
238 new_state->setBool("rr", m_dialog->rr->isChecked() );
239 new_state->setBool("ts", m_dialog->timestamp->isChecked() );
240 new_state->setBool("fragm", m_dialog->all_fragments->isChecked() );
241 new_state->setBool("short_fragm", m_dialog->short_fragments->isChecked() );
242
243 // router-alert IP option has only one defined value - "0". All other
244 // values are reserved atm. RFC 2113
245 new_state->setBool("rtralt", m_dialog->router_alert->isChecked() );
246 if (m_dialog->router_alert->isChecked()) new_state->setInt("rtralt_value", 0);
247
248 IPService *ip = IPService::cast(new_state);
249 if (m_dialog->use_dscp->isChecked())
250 {
251 ip->setDSCPCode(m_dialog->code->text().toUtf8().constData());
252 ip->setTOSCode("");
253 } else
254 {
255 ip->setTOSCode(m_dialog->code->text().toUtf8().constData());
256 ip->setDSCPCode("");
257 }
258
259 if (!cmd->getOldState()->cmp(new_state, true))
260 {
261 if (obj->isReadOnly()) return;
262 m_project->undoStack->push(cmd.release());
263 }
264 }
265
266