1
0
mirror of https://github.com/fwbuilder/fwbuilder synced 2026-03-25 04:37:22 +01:00

bugfix 2615,2609,2616,2619,2620,2621,2617,2605,2610,2601,2602,2565;

This commit is contained in:
2008-06-01 16:55:27 +00:00
parent fd94086859
commit 211e2ea88a
11 changed files with 222 additions and 117 deletions

View File

@ -70,6 +70,7 @@ ActionsDialog::ActionsDialog(QWidget *parent) : QWidget(parent)
BranchChainArea->addAcceptedTypes("Policy");
BranchChainArea->addAcceptedTypes("NAT");
BranchChainArea->addAcceptedTypes("Routing");
BranchChainArea->setHelperText("Drop rule set object here");
m_dialog->gridLayout17->addWidget(BranchChainArea);
connect (BranchChainArea,SIGNAL(objectDeleted()),this,SLOT(changed()));
connect (BranchChainArea,SIGNAL(objectInserted()),this,SLOT(changed()));
@ -79,6 +80,7 @@ ActionsDialog::ActionsDialog(QWidget *parent) : QWidget(parent)
BranchAnchorArea->addAcceptedTypes("Policy");
BranchAnchorArea->addAcceptedTypes("NAT");
BranchAnchorArea->addAcceptedTypes("Routing");
BranchAnchorArea->setHelperText("Drop rule set object here");
m_dialog->gridLayout20->addWidget(BranchAnchorArea);
connect (BranchAnchorArea,SIGNAL(objectDeleted()),this,SLOT(changed()));
connect (BranchAnchorArea,SIGNAL(objectInserted()),this,SLOT(changed()));

View File

@ -52,6 +52,7 @@
#include "fwbuilder/ICMPService.h"
#include "fwbuilder/TCPService.h"
#include "fwbuilder/UDPService.h"
#include "fwbuilder/UserService.h"
#include "fwbuilder/ServiceGroup.h"
#include "fwbuilder/Interval.h"
#include "fwbuilder/IntervalGroup.h"
@ -81,7 +82,7 @@ const char* systemObjects[] = {
"Services/TCP",
"Services/UDP",
"Services/TagServices",
"Services/Users",
"Firewalls",
"Time",
@ -111,6 +112,8 @@ FWBTree::FWBTree()
systemGroupPaths[ICMPService::TYPENAME] = "Services/ICMP";
systemGroupPaths[TCPService::TYPENAME] = "Services/TCP";
systemGroupPaths[UDPService::TYPENAME] = "Services/UDP";
systemGroupPaths[UserService::TYPENAME] = "Services/Users";
systemGroupPaths[TagService::TYPENAME] = "Services/TagServices";
systemGroupPaths[Firewall::TYPENAME] = "Firewalls";
@ -158,6 +161,9 @@ FWBTree::FWBTree()
systemGroupTypes[ICMPService::TYPENAME]= ServiceGroup::TYPENAME;
systemGroupNames[ICMPService::TYPENAME]= "ICMP" ;
systemGroupTypes[UserService::TYPENAME]= UserService::TYPENAME;
systemGroupNames[UserService::TYPENAME]= "User" ;
systemGroupTypes[TCPService::TYPENAME]= ServiceGroup::TYPENAME;
systemGroupNames[TCPService::TYPENAME]= "TCP" ;
@ -264,6 +270,7 @@ FWBTree::FWBTree()
cutMenuState["Services/IP"] = false;
cutMenuState["Services/TCP"] = false;
cutMenuState["Services/UDP"] = false;
cutMenuState["Services/Users"] = false;
cutMenuState["Services/TagServices"] = false;
cutMenuState["Time"] = false;
@ -284,6 +291,7 @@ FWBTree::FWBTree()
pasteMenuState["Services/IP"] = true;
pasteMenuState["Services/TCP"] = true;
pasteMenuState["Services/UDP"] = true;
pasteMenuState["Services/Users"] = true;
pasteMenuState["Services/TagServices"] = true;
pasteMenuState["Time"] = true;
@ -304,6 +312,7 @@ FWBTree::FWBTree()
deleteMenuState["Services/IP"] = false;
deleteMenuState["Services/TCP"] = false;
deleteMenuState["Services/UDP"] = false;
deleteMenuState["Services/Users"] = false;
deleteMenuState["Services/TagServices"] = false;
deleteMenuState["Time"] = false;
}
@ -461,6 +470,10 @@ FWObject* FWBTree::createNewLibrary(FWObjectDatabase *db)
o2->setName("UDP");
o1->add(o2);
o2 = db->create(UserService::TYPENAME);
o2->setName("Users");
o1->add(o2);
o2 = db->create(ServiceGroup::TYPENAME);
o2->setName("Custom");
o1->add(o2);

View File

@ -69,6 +69,7 @@ FWObjectDropArea::FWObjectDropArea(QWidget*p, const char * n, Qt::WFlags f):
m_objectDropArea = new Ui::FWObjectDropArea_q;
m_objectDropArea->setupUi(this);
object=NULL;
helperText =tr("Drop object here.");
}
void FWObjectDropArea::paintEvent(QPaintEvent *ev)
@ -116,7 +117,7 @@ void FWObjectDropArea::paintEvent(QPaintEvent *ev)
}
else
{
QString t=tr("Drop object here.");
QString t=helperText ;
int t_x=2;
int t_y=2;

View File

@ -51,6 +51,7 @@ class FWObjectDropArea : public QWidget//Ui::FWObjectDropArea_q
private:
libfwbuilder::FWObject *object;
QVector <QString> acceptedTypes ;
QString helperText ;
protected:
void paintEvent(QPaintEvent *ev);
void contextMenuEvent (QContextMenuEvent * e);
@ -65,7 +66,7 @@ class FWObjectDropArea : public QWidget//Ui::FWObjectDropArea_q
void setObject(libfwbuilder::FWObject * o){ object = o ;};
void addAcceptedTypes (QString type){acceptedTypes.push_back(type);};
bool isEmpty() {return object==NULL;};
void setHelperText (QString text){helperText=text;}
public slots:
void insertObject(libfwbuilder::FWObject *o);
void deleteObject();

View File

@ -562,7 +562,7 @@ QString FWObjectPropertiesFactory::getRuleActionProperties(PolicyRule *rule)
par = ropt->getStr("action_on_reject").c_str();
break;
case PolicyRule::Tag :
par = ropt->getStr("tagvalue").c_str();
par = rule->getTagValue().c_str();//ropt->getStr("tagvalue").c_str();
break;
case PolicyRule::Accounting :
par = ropt->getStr("rule_name_accounting").c_str();

View File

@ -110,6 +110,7 @@
#include "fwbuilder/UDPService.h"
#include "fwbuilder/ServiceGroup.h"
#include "fwbuilder/TagService.h"
#include "fwbuilder/UserService.h"
#include "fwbuilder/Interval.h"
#include "fwbuilder/IntervalGroup.h"
@ -180,6 +181,7 @@ ObjectManipulator::ObjectManipulator( QWidget *parent):
newObjectPopup->addAction(QIcon(icon_path+TCPService::TYPENAME+"/icon-tree"), tr( "New &TCP Serivce" ), this, SLOT( newTCP() ));
newObjectPopup->addAction(QIcon(icon_path+UDPService::TYPENAME+"/icon-tree"), tr( "New &UDP Service" ), this, SLOT( newUDP() ));
newObjectPopup->addAction(QIcon(icon_path+TagService::TYPENAME+"/icon-tree"), tr( "New &TagService" ), this, SLOT( newTagService() ));
newObjectPopup->addAction(QIcon(icon_path+UserService::TYPENAME+"/icon-tree"), tr( "New &User Service" ), this, SLOT( newUserService() ));
newObjectPopup->addAction(QIcon(icon_path+ServiceGroup::TYPENAME+"/icon-tree"), tr( "New &Service Group" ), this, SLOT( newServiceGroup() ));
newObjectPopup->addSeparator();
newObjectPopup->addAction(QIcon(icon_path+Interval::TYPENAME+"/icon-tree"), tr( "New Ti&me Interval" ), this, SLOT( newInterval() ));
@ -405,12 +407,14 @@ QVector <ObjectManipulator*> ObjectManipulator::getAllMdiObjectManipulators()
if (m_project->getRCS()==NULL)
return ret ;
QString fileName = m_project->getRCS()->getFileName();
ret.push_back (this);
for (int i = 0 ; i < subWindowList.size();i++)
{
ProjectPanel * pp = dynamic_cast<ProjectPanel *>(
subWindowList[i]->widget());
ProjectPanel * pp = dynamic_cast <ProjectPanel *>(subWindowList[i]->widget());
if (pp!=NULL)
{
{
if (pp==m_project)
continue ;
if (pp->getFileName () == fileName)
{
ret.push_back (pp->m_panel->om);
@ -438,17 +442,17 @@ void ObjectManipulator::removeObjectFromTreeView(FWObject *obj )
void ObjectManipulator::updateLibColor(FWObject *lib)
{
// QVector <ObjectManipulator*> oms = getAllMdiObjectManipulators();
// for (int i = 0 ; i < oms.size(); i++)
// {
// ObjectManipulator* pom = oms[i] ;
QTreeWidget *objTreeView = idxToTrees[ getIdxForLib(lib) ];
QString clr=lib->getStr("color").c_str();
QVector <ObjectManipulator*> oms = getAllMdiObjectManipulators();
QString clr=lib->getStr("color").c_str();
for (int i = 0 ; i < oms.size(); i++)
{
ObjectManipulator* pom = oms[i] ;
QTreeWidget *objTreeView = pom->idxToTrees[ pom->getIdxForLib(lib) ];
if (clr=="" || clr=="#000000" || clr=="black") clr="#FFFFFF";
QPalette palette = objTreeView->palette();
palette.setColor(QPalette::Active, QPalette::Base, QColor( clr ));
objTreeView->setPalette(palette);
// }
}
}
int ObjectManipulator::getIdxForLib(FWObject* lib)
@ -1893,9 +1897,7 @@ void ObjectManipulator::deleteObj()
bool emptyingTrash = false;
bool emptyingTrashInLib = false;
FWObject *delObjLib =
m_project->db()->findInIndex(FWObjectDatabase::getDeletedObjectsId());
FWObject *delObjLib = m_project->db()->findInIndex(FWObjectDatabase::getDeletedObjectsId());
if (fwbdebug)
qDebug("ObjectManipulator::deleteObj delObjLib=%p",delObjLib);
@ -2036,30 +2038,32 @@ void ObjectManipulator::delObj(FWObject *obj,bool openobj)
{
bool firstAction = true ;
QVector <ObjectManipulator*> oms = getAllMdiObjectManipulators();
if (fwbdebug)
qDebug("ObjectManipulator::delObj delete obj %p %s openobj=%d",
obj,obj->getName().c_str(),openobj);
FWObject *parent=obj->getParent();
FWObject *delObjLib = m_project->db()->findInIndex( DELETED_LIB );
if (fwbdebug)
qDebug("ObjectManipulator::delObj deleted obj lib %p",
delObjLib);
bool islib = Library::isA(obj);
// bool isintf = (Interface::isA(obj) && Firewall::isA(parent));
bool isfw = Firewall::isA(obj);
bool isDelObj = (delObjLib!=NULL && obj->isChildOf(delObjLib));
for (int i = 0 ; i < oms.size(); i++)
{
ObjectManipulator* pom = oms[i] ;
if (obj->getId()==STANDARD_LIB || obj->getId()==DELETED_LIB) return;
pom->m_project->findObjectWidget->reset();
try
{
if (fwbdebug)
qDebug("ObjectManipulator::delObj delete obj %p %s openobj=%d",
obj,obj->getName().c_str(),openobj);
FWObject *parent=obj->getParent();
FWObject *delObjLib = pom->m_project->db()->findInIndex( DELETED_LIB );
if (fwbdebug)
qDebug("ObjectManipulator::delObj deleted obj lib %p",
delObjLib);
bool islib = Library::isA(obj);
// bool isintf = (Interface::isA(obj) && Firewall::isA(parent));
bool isfw = Firewall::isA(obj);
bool isDelObj = (delObjLib!=NULL && obj->isChildOf(delObjLib));
if (!islib && !isDelObj && obj->getId()!=TEMPLATE_LIB)
pom->updateLastModifiedTimestampForAllFirewalls(obj);
@ -2067,16 +2071,15 @@ void ObjectManipulator::delObj(FWObject *obj,bool openobj)
if (fwbdebug)
qDebug("ObjectManipulator::delObj delete islib=%d isfw=%d isDelObj=%d",islib,isfw,isDelObj);
/*
* TODO: we have to remove not only the object, but also
* all its child objects from the database, as well as all
* references to them. This logic should really be in
* FWObject::removeAllInstances(FWObject*);
*/
/*
* TODO: we have to remove not only the object, but also all its child
* objects from the database, as well as all references to them. This
* logic should really be in FWObject::removeAllInstances(FWObject*);
*/
/* remove from our internal tables before it is removed from the
* object tree so we could use obj->getId()
*/
/* remove from our internal tables before it is removed from the
* object tree so we could use obj->getId()
*/
if (islib && !isDelObj)
{
int idx = pom->getIdxForLib(obj);
@ -2094,13 +2097,13 @@ void ObjectManipulator::delObj(FWObject *obj,bool openobj)
//if (isfw && !isDelObj) pom->m_project->deleteFirewall(obj);
// removeObjectFromTreeView(obj);
// removeObjectFromTreeView(obj);
QApplication::setOverrideCursor( QCursor( Qt::WaitCursor) );
if (islib && obj->isReadOnly()) obj->setReadOnly(false);
if (firstAction)
{
// if (firstAction)
// {
if (obj->getId()==TEMPLATE_LIB) // special case
{
if (fwbdebug)
@ -2118,21 +2121,22 @@ void ObjectManipulator::delObj(FWObject *obj,bool openobj)
parent=pom->m_project->db()->getFirstByType(
Library::TYPENAME);
}
QApplication::restoreOverrideCursor();
if (fwbdebug) qDebug("ObjectManipulator::delObj: done");
}
// }
pom->removeObjectFromTreeView(obj);
pom->m_project->scheduleRuleSetRedraw();
if (pom==this)
pom->m_project->scheduleRuleSetRedraw();
if (!isDelObj)
{
if (pom->allItems[delObjLib]!=NULL)
pom->insertSubtree( allItems[delObjLib], obj );
pom->insertSubtree( pom->allItems[delObjLib], obj );
} else
FWObjectClipboard::obj_clipboard->clear();
if (openobj)
if (openobj&&pom==this)
{
if (isfw && !isDelObj)
{
@ -2312,7 +2316,16 @@ bool ObjectManipulator::switchObjectInEditor(FWObject *obj)
if (fwbdebug) qDebug("ObjectManipulator::switchObjectInEditor");
m_project->unselectRules();
if (RuleSet::cast(obj)!=NULL)
{
// qDebug("!2");
if (obj!=m_project->getCurrentRuleSet())
{
if (m_project->getCurrentRuleSet()!=NULL)
m_project->openRuleSet(obj);
}
}
if (!m_project->isEditorVisible()) return false;
if (!m_project->requestEditorOwnership(this,
@ -2325,13 +2338,7 @@ bool ObjectManipulator::switchObjectInEditor(FWObject *obj)
if (obj!=m_project->getOpenedEditor())
{
if (RuleSet::cast(obj)!=NULL)
{
// qDebug("!2");
if (obj!=m_project->getCurrentRuleSet())
m_project->openRuleSet(obj);
}
m_project->openEditor(obj);
currentObj=obj;
active=true;
@ -3074,6 +3081,17 @@ void ObjectManipulator::newTagService()
editObject(o);
}
}
void ObjectManipulator::newUserService()
{
FWObject *o;
o=createObject(UserService::TYPENAME,tr("New User Service"));
if (o!=NULL)
{
openObject(o);
editObject(o);
}
}
void ObjectManipulator::newPhysicalAddress()
{
if ( currentObj->isReadOnly() ) return;

View File

@ -192,6 +192,7 @@ public slots:
void newTCP();
void newUDP();
void newTagService();
void newUserService();
void newServiceGroup();
void newInterval();

View File

@ -711,26 +711,26 @@ void ProjectPanel::showFirewalls(bool open_first_firewall)
{
/* if (fwbdebug) qDebug("ProjectPanel::showFirewalls");
list<FWObject*> fl;
// list<FWObject*> fl;
findFirewalls(db(), fl);
fl.sort(FWObjectNameCmpPredicate());
firewalls.clear();
m_panel->fwList->clear();
// m_panel->fwList->clear();
clearFirewallTabs();
m_panel->firewallName->setText("");
if (fl.size()==0)
{
m_panel->fwList->addItem( noFirewalls );
return;
}
// if (fl.size()==0)
// {
// m_panel->fwList->addItem( noFirewalls );
// return;
// }
for (list<FWObject*>::iterator m=fl.begin(); m!=fl.end(); m++)
addFirewallToList( *m );
// for (list<FWObject*>::iterator m=fl.begin(); m!=fl.end(); m++)
// addFirewallToList( *m );
if (open_first_firewall)
{
m_panel->fwList->setCurrentIndex( 0 );
// m_panel->fwList->setCurrentIndex( 0 );
openFirewall( 0 );
}
mainW->setActionsEnabled(fl.size()!=0);
@ -803,31 +803,33 @@ void ProjectPanel::reopenFirewall()
}
m_panel->rulesetname->setTextFormat(Qt::RichText);
QString name = "<B>";
name += visibleRuleSet->getName().c_str();
FWObject * p = visibleRuleSet->getParent();
name += p->getName().c_str();
name += " / ";
name += visibleRuleSet->getName().c_str();
name += "</B>";
Policy *rule = Policy::cast(visibleRuleSet);
m_panel->rulesetname->setText(name );
if (rule!=NULL)
{
// if (rule->getAction() == PolicyRule::Branch)
m_panel->ruleSets->addWidget( new PolicyView(this, rule,NULL) );
m_panel->rulesetname->setText(name + tr("Policy") + "</B>");
// addPolicyBranchTab(rule);
}
NAT *nat = NAT::cast(visibleRuleSet);
if (nat!=NULL)
{
m_panel->ruleSets->addWidget( new NATView(this, nat,NULL) );
m_panel->rulesetname->setText(name + tr("NAT")+ "</B>");
}
NAT *nat = NAT::cast(visibleRuleSet);
if (nat!=NULL)
{
m_panel->ruleSets->addWidget( new NATView(this, nat,NULL) );
}
Routing *r = Routing::cast(visibleRuleSet);
if (r!=NULL)
{
m_panel->ruleSets->addWidget( new RoutingView(this, r,NULL) );
m_panel->rulesetname->setText(name + tr("Routing")+ "</B>");
}
Routing *r = Routing::cast(visibleRuleSet);
if (r!=NULL)
{
m_panel->ruleSets->addWidget( new RoutingView(this, r,NULL) );
}
// as of 2.1.5 we have rule branches :-)
// so far branches are only supported in policy rules because only there
// we have action which we use to define branching rules

View File

@ -119,6 +119,17 @@ void RuleSetDialog::validate(bool *res)
*res=true;
if (!isTreeReadWrite(this,obj)) { *res=false; return; }
if (!validateName(this,obj,m_dialog->obj_name->text())) { *res=false; return; }
QRegExp rx("([a-zA-Z0-9_-+=@%^]+)");
if (!rx.exactMatch(m_dialog->obj_name->text()))
{
*res=false ;
QMessageBox::critical(this, "Firewall Builder",
tr("Not valid name '%1'. Only '[a-z][A-Z][0-9]_-+=@%^' characters.").arg( m_dialog->obj_name->text() ),
tr("&Continue"), 0, 0,
0 );
return ;
}
}
void RuleSetDialog::isChanged(bool *res)

View File

@ -1213,10 +1213,18 @@ QRect RuleSetView::calculateCellSize( int row, int col )
PolicyRule *ruleP = PolicyRule::cast( rule );
if (ruleP==NULL)
break ;
QString ac = ruleP->getActionAsString().c_str();
string act = ruleP->getActionAsString();
QString res="";
res = FWObjectPropertiesFactory::getRuleActionProperties(ruleP);
if (st->getShowDirectionText())
{
QString res2 = act.c_str();
res2 += " " ;
res = res2 + res ;
}
QString ac = res;
//FWObjectPropertiesFactory::getRuleActionProperties(
//PolicyRule::cast(rule));
QRect br=p.boundingRect(QRect(0, 0, 1000, 1000),
@ -1646,7 +1654,6 @@ void RuleSetView::paintCell(QPainter *pntr,
QString platform=getPlatform();
string act = rule->getActionAsString();
QString icn = chooseIcon((":/Icons/" + act).c_str()); //for example :/Icons/Continue
QString res="";
//FWOptions *ropt = rule->getOptionsObject();
@ -3502,12 +3509,17 @@ QVector <ProjectPanel*> RuleSetView::getAllMdiProjectPanel ()
{
QVector <ProjectPanel*> ret ;
QList<QMdiSubWindow *> subWindowList = mw->getMdiArea()->subWindowList();
if (m_project->getRCS()==NULL)
return ret ;
ret.push_back (m_project);
QString fileName = m_project->getRCS()->getFileName();
for (int i = 0 ; i < subWindowList.size();i++)
{
ProjectPanel * pp = dynamic_cast <ProjectPanel *>(subWindowList[i]->widget());
if (pp!=NULL)
{
if (pp==this->m_project)
continue ;
if (pp->getFileName () == fileName)
{
ret.push_back (pp);

View File

@ -139,7 +139,7 @@
<enum>QFrame::Plain</enum>
</property>
<property name="currentIndex" >
<number>3</number>
<number>9</number>
</property>
<widget class="QWidget" name="TagStrPage" >
<layout class="QGridLayout" >
@ -205,6 +205,18 @@
</item>
<item row="2" column="0" >
<widget class="QFrame" name="TagStrFrame" >
<property name="minimumSize" >
<size>
<width>80</width>
<height>80</height>
</size>
</property>
<property name="maximumSize" >
<size>
<width>80</width>
<height>16777215</height>
</size>
</property>
<property name="frameShape" >
<enum>QFrame::StyledPanel</enum>
</property>
@ -236,6 +248,19 @@
</layout>
</widget>
</item>
<item row="2" column="1" >
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" >
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="RejectPage" >
@ -939,16 +964,16 @@
<widget class="QWidget" name="BranchChainPage" >
<layout class="QGridLayout" >
<property name="leftMargin" >
<number>0</number>
<number>2</number>
</property>
<property name="topMargin" >
<number>0</number>
<number>2</number>
</property>
<property name="rightMargin" >
<number>0</number>
<number>2</number>
</property>
<property name="bottomMargin" >
<number>0</number>
<number>2</number>
</property>
<property name="horizontalSpacing" >
<number>2</number>
@ -956,7 +981,7 @@
<property name="verticalSpacing" >
<number>2</number>
</property>
<item row="0" column="1" >
<item row="0" column="1" colspan="2" >
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
@ -966,13 +991,13 @@
</property>
<property name="sizeHint" >
<size>
<width>20</width>
<height>0</height>
<width>589</width>
<height>21</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" colspan="2" >
<item row="1" column="0" colspan="3" >
<widget class="QLabel" name="textLabel1_3" >
<property name="text" >
<string>User-defined chain name:</string>
@ -982,31 +1007,14 @@
</property>
</widget>
</item>
<item row="4" column="0" >
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::MinimumExpanding</enum>
</property>
<property name="sizeHint" >
<item row="2" column="0" colspan="2" >
<widget class="QFrame" name="branchChainNameFrame" >
<property name="minimumSize" >
<size>
<width>20</width>
<height>0</height>
<width>80</width>
<height>80</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="0" colspan="2" >
<widget class="QCheckBox" name="ipt_branch_in_mangle" >
<property name="text" >
<string>In addition to 'filter', create branching rule in 'mangle' table as well</string>
</property>
</widget>
</item>
<item row="2" column="0" >
<widget class="QFrame" name="branchChainNameFrame" >
<property name="frameShape" >
<enum>QFrame::StyledPanel</enum>
</property>
@ -1038,6 +1046,42 @@
</layout>
</widget>
</item>
<item row="2" column="2" >
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" >
<size>
<width>531</width>
<height>30</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="0" colspan="3" >
<widget class="QCheckBox" name="ipt_branch_in_mangle" >
<property name="text" >
<string>In addition to 'filter', create branching rule in 'mangle' table as well</string>
</property>
</widget>
</item>
<item row="4" column="0" >
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::MinimumExpanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>30</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="BranchAnchorPage" >