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