diff options
Diffstat (limited to 'kmyfirewall/kmfwidgets')
77 files changed, 13641 insertions, 0 deletions
diff --git a/kmyfirewall/kmfwidgets/Makefile.am b/kmyfirewall/kmfwidgets/Makefile.am new file mode 100644 index 0000000..c06a44c --- /dev/null +++ b/kmyfirewall/kmfwidgets/Makefile.am @@ -0,0 +1,38 @@ +INCLUDES = $(all_includes) -I$(srcdir)/../core -I../core -I../ipteditor -I../genericinterface +METASOURCES = AUTO +lib_LTLIBRARIES = libkmfwidgets.la +libkmfwidgets_la_LDFLAGS = -no-undefined $(all_libraries) +libkmfwidgets_la_LIBADD = \ + $(LIB_KPARTS) ../core/libkmfcore.la + + +libkmfwidgets_la_SOURCES = kmfchecklistitem.cpp kmfchecklistoutput.cpp \ + kmfdocumentinfo.cpp kmfgenericinterfaceeditprotocol.cpp kmfgenericinterfaceeditprotocol.h \ + kmfhostwidget.cpp kmfinterfacewidget.cpp kmfiptdocoptions.cpp kmfiptdocview.cpp \ + kmfipv4addresswidget.cpp kmflistview.cpp kmflistviewitem.cpp kmfmainwindow.cpp \ + kmfmultiportwidget.cpp kmfmynetworkwidget.cpp kmfnethostpropertieswidget.cpp \ + kmfnetworkwidget.cpp kmfnewdocdlg.cpp kmfobjectinfo.cpp kmfportwidget.cpp kmfprocout.cpp \ + kmfprotocollistview.cpp kmfprotocolpropertieswidget.cpp kmfqtdesignerplugin.cpp \ + kmfselectactivetarget.cpp kmfselectinterface.cpp kmfsystemsettingslinux.cpp \ + kmftemplatechooser.cpp kmftransactionlog.cpp kmyfirewalldocumentinfo.ui \ + kmyfirewallgenericinterfaceeditprotocolwidget.ui kmyfirewallhostwidget.ui kmyfirewallinterfacewidget.ui \ + kmyfirewalliptdocoptions.ui kmyfirewallipv4adddresswidget.ui kmyfirewallmultiportwidget.ui \ + kmyfirewallmynetworkwidget.ui kmyfirewallnethostproperties.ui kmyfirewallnetworkwidget.ui \ + kmyfirewallnewdocument.ui kmyfirewallobjectinfo.ui kmyfirewallportwidget.ui \ + kmyfirewallprotocollistview.ui kmyfirewallprotocolpropertieswidget.ui kmyfirewallselectactivetarget.ui \ + kmyfirewallselectinterface.ui kmyfirewallsystemsettingslinux.ui kmyfirewalltemplatechooser.ui \ + kmyfirewalltransactionlog.ui + + +libkmfwidgetsincludedir = $(includedir)/kmyfirewall/kmfwidgets/ + +libkmfwidgetsinclude_HEADERS = kmfprocout.h kmflistview.h kmflistviewitem.h \ + kmfmultiportwidget.h kmfportwidget.h kmfchecklistoutput.h kmfnewdocdlg.h kmfchecklistitem.h \ + kmfmainwindow.h kmfnetworkwidget.h kmfiptdocoptions.h kmfiptdocoptions.h \ + kmfobjectinfo.h kmyfirewallselectinterface.h + +noinst_HEADERS = kmfdocumentinfo.h kmfhostwidget.h kmfinterfacewidget.h \ + kmfipv4addresswidget.h kmfmynetworkwidget.h kmfnethostpropertieswidget.h kmfprotocollistview.h \ + kmfprotocolpropertieswidget.h kmfqtdesignerplugin.h kmfselectactivetarget.h kmfsystemsettingslinux.h \ + kmftemplatechooser.h kmftransactionlog.h + diff --git a/kmyfirewall/kmfwidgets/kmfchecklistitem.cpp b/kmyfirewall/kmfwidgets/kmfchecklistitem.cpp new file mode 100644 index 0000000..171f1f7 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfchecklistitem.cpp @@ -0,0 +1,58 @@ +// +// C++ Implementation: kmfchecklistitem +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#include "kmfchecklistitem.h" + +// QT includes + +// KDE includes +#include <kdebug.h> + +// Project includes +#include "../core/netfilterobject.h" +#include "../core/kmfprotocol.h" +#include "../core/kmfprotocolusage.h" + +namespace KMF { + +KMFCheckListItem::KMFCheckListItem( QListView *parent, QListViewItem *after, const QString& text, Type tt, KMFProtocolUsage* obj ) : QCheckListItem( parent, after, text, tt ) { + loadKMFProtocolUsage( obj ); +} +KMFCheckListItem::KMFCheckListItem( QListViewItem *parent, const QString& text , Type tt, KMFProtocolUsage* obj ) : QCheckListItem( parent, text, tt ) { + loadKMFProtocolUsage( obj ); +} +KMFCheckListItem::KMFCheckListItem( QListViewItem *parent, QListViewItem *after, const QString& text, Type tt, KMFProtocolUsage* obj ) : QCheckListItem( parent, after, text, tt ) { + loadKMFProtocolUsage( obj ); +} + +KMFCheckListItem::~KMFCheckListItem() {} + + +void KMFCheckListItem::loadKMFProtocolUsage( KMFProtocolUsage* obj ) { + if ( KMFProtocolUsage *prot = dynamic_cast<KMFProtocolUsage*> ( obj ) ) { + m_protocolUsage = prot; + } else { + kdDebug() << "ERROR: Given NetfilterObject has wrong type" << endl; + } +} + +} + diff --git a/kmyfirewall/kmfwidgets/kmfchecklistitem.h b/kmyfirewall/kmfwidgets/kmfchecklistitem.h new file mode 100644 index 0000000..8d8cc01 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfchecklistitem.h @@ -0,0 +1,53 @@ +// +// C++ Interface: kmfchecklistitem +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#ifndef KMFCHECKLISTITEM_H +#define KMFCHECKLISTITEM_H + +#include <qlistview.h> +#include <kdemacros.h> + +namespace KMF { +class KMFProtocol; +class KMFProtocolUsage; +class NetfilterObject; + +class KDE_EXPORT KMFCheckListItem : public QCheckListItem +{ +public: + KMFCheckListItem( QListViewItem *parent, const QString&, Type tt = Controller, KMFProtocolUsage* = 0 ); + KMFCheckListItem( QListView *parent, QListViewItem *after, const QString&, Type tt = Controller, KMFProtocolUsage* = 0 ); + KMFCheckListItem( QListViewItem *parent, QListViewItem *after, const QString&, Type tt = Controller, KMFProtocolUsage* = 0); + ~KMFCheckListItem(); + + +public: + KMFProtocolUsage* protocolUsage() const { + return m_protocolUsage; + }; + +private: + void loadKMFProtocolUsage( KMFProtocolUsage* ); + + KMFProtocolUsage *m_protocolUsage; +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfchecklistoutput.cpp b/kmyfirewall/kmfwidgets/kmfchecklistoutput.cpp new file mode 100644 index 0000000..3ec367d --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfchecklistoutput.cpp @@ -0,0 +1,104 @@ +/*************************************************************************** + begin : Tue Jul 30 2002 + copyright : (C) 2002 by Christian Hubinger + email : chubinger@irrsinnig.org +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kmfchecklistoutput.h" + +// QT includs +#include <qlabel.h> +#include <qlistbox.h> +#include <qpushbutton.h> +#include <qlistview.h> +#include <qlayout.h> +#include <qstring.h> + +// kde includes +#include <klocale.h> +#include <kdebug.h> +#include <kglobal.h> +#include <kiconloader.h> + +namespace KMF { +KMFCheckListOutput::KMFCheckListOutput( QWidget *parent, const char *name , bool modal, WFlags fl ) : QDialog( parent, name, modal, fl ) { + setCaption( "KMyFirewall" ); + QGridLayout *l_prog = new QGridLayout( this,4,2,6,11 ); + text = new QLabel( i18n("<qt><b>Trying to guess the system configuration...</b><br>" + "If errors are occurring you'll have to setup the configuration yourself." + "</qt>"), this); + l_prog -> addMultiCellWidget( text, 0, 0, 0, 2 ); + + mpb_ok = new QPushButton( this, "Ok" ); + mpb_ok->setText( i18n( "&Close Window" ) ); + l_prog -> addMultiCellWidget( mpb_ok, 4, 4, 0, 2 ); + + mlb_outputView = new QListView( this, "msg" ); + mlb_outputView->addColumn( i18n( "Looking For" ) ); + mlb_outputView->addColumn( i18n( "Found?" ) ); + mlb_outputView->setSelectionMode( QListView::NoSelection ); + mlb_outputView->setSorting( -1 ); + l_prog -> addMultiCellWidget( mlb_outputView, 1, 3, 0, 2 ); + + + connect( mpb_ok, SIGNAL( clicked() ) , this, SLOT( hide() ) ); + m_currItem = new QListViewItem( mlb_outputView ); + m_currItem->setText( 0, i18n( "Starting system scan..." ) ); + loadIcons(); + this->resize( 450, 450 ); +} + +KMFCheckListOutput::~KMFCheckListOutput() {} + +void KMFCheckListOutput::appendLine( const QString &txt ) { + QListViewItem * item = new QListViewItem( mlb_outputView, m_currItem ); + item->setMultiLinesEnabled( true ); + item->setText( 0, txt ); + m_currItem = item; + kdDebug() << "void KMFCheckListOutput::appendLine(QString txt)" << endl; +} + +void KMFCheckListOutput::setStatus( bool ok, const QString &err_msg ) { + kdDebug() << "void KMFCheckListOutput::setStatus(bool ok,QString &err_msg)" << endl; + if ( ok ) { + m_currItem->setPixmap( 1, icon_ok ); + } else { + m_currItem->setPixmap( 1, icon_err ); + m_currItem->setOpen( true ); + if ( !err_msg.isEmpty() ) { + QListViewItem * item = new QListViewItem( m_currItem ); + item->setText( 0, err_msg ); + } + } +} + +void KMFCheckListOutput::clearList() { + kdDebug() << "void KMFCheckListOutput::clearList()" << endl; + mlb_outputView->clear(); +} + +void KMFCheckListOutput::loadIcons() { + kdDebug() << "void KMFCheckListOutput::loadIcons()" << endl; + KIconLoader *loader = KGlobal::iconLoader(); + QString icon_name; + + icon_name = "stop"; + icon_err = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "button_ok"; + icon_ok = loader->loadIcon( icon_name, KIcon::Small ); + +} + +} + +#include "kmfchecklistoutput.moc" diff --git a/kmyfirewall/kmfwidgets/kmfchecklistoutput.h b/kmyfirewall/kmfwidgets/kmfchecklistoutput.h new file mode 100644 index 0000000..73d8887 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfchecklistoutput.h @@ -0,0 +1,64 @@ +/*************************************************************************** + begin : Tue Jul 30 2002 + copyright : (C) 2002 by Christian Hubinger + email : chubinger@irrsinnig.org +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KMFCHECKLISTOUTPUT_H +#define KMFCHECKLISTOUTPUT_H + +#include <qdialog.h> +#include <qpixmap.h> +#include <kdemacros.h> +class QLabel; +class QListView; +class QListViewItem; +class QString; +class QPushButton; +namespace KMF { +/** + *@author Christian Hubinger + */ + +class KDE_EXPORT KMFCheckListOutput : public QDialog { + Q_OBJECT +public: + KMFCheckListOutput( QWidget *parent = 0, const char *name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~KMFCheckListOutput(); + + /** + Appends one line at the End Of the List + */ + void appendLine( const QString &txt ); + + /** + Sets the Status of the last created ListItem + */ + void setStatus( bool ok, const QString &err_msg ); + + void clearList(); + +private: + + // Functions + void loadIcons(); + + // Data + QListView *mlb_outputView; + QPushButton *mpb_ok; + QListViewItem *m_currItem; + QPixmap icon_ok; + QPixmap icon_err; + QLabel *text; +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfdocumentinfo.cpp b/kmyfirewall/kmfwidgets/kmfdocumentinfo.cpp new file mode 100644 index 0000000..2d8a1fb --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfdocumentinfo.cpp @@ -0,0 +1,80 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004 +// +// Copyright: See COPYING file that comes with this distribution +// +// License: GPL +// + + +#include "kmfdocumentinfo.h" + +// QT includes +#include <qstring.h> +#include <qtextedit.h> +#include <qlineedit.h> +#include <qpushbutton.h> + + +// KDE includes +#include <kapplication.h> +#include <kdebug.h> + +// project includes +#include "../core/kmfdoc.h" +#include "../core/kmfnetwork.h" +#include "../core/kmfundoengine.h" +namespace KMF { +KMFDocumentInfo::KMFDocumentInfo(QWidget* parent, const char* name, bool modal, WFlags fl) + : KMyFirewallDocumentInfo(parent,name, modal,fl) { + connect( b_help, SIGNAL( clicked() ), + this, SLOT( slotHelp() ) ); + connect( b_saveAsTemplate, SIGNAL( clicked() ), this, SLOT( slotSaveAsTemplate() ) ); + +} + +KMFDocumentInfo::~KMFDocumentInfo() {} + +void KMFDocumentInfo::slotSaveAsTemplate() { + kdDebug() << "slotSaveAsTemplate()" << endl; + emit sigSaveAsTemplate(); +} + +/*$SPECIALIZATION$*/ +void KMFDocumentInfo::accept() { + if ( ! txt_name->text().isNull() ) { + m_doc->setName( txt_name->text() ); +// m_doc->changed(); + // m_doc->network()->changed(); + } + + if ( ! txt_description->text().isNull() ) { + m_doc->setDescription( txt_description->text() ); +// m_doc->changed(); + // m_doc->network()->changed(); + } + + QDialog::accept(); +} + +void KMFDocumentInfo::loadDoc( KMFDoc* doc ) { + m_doc = doc; + txt_name->setText( doc->name() ); + txt_description->setText( doc->description() ); +} + +void KMFDocumentInfo::slotHelp() { + kdDebug() << "void KMFDocumentInfo::slotHelp()" << endl; + kapp->invokeHelp(); +} + + +} + +#include "kmfdocumentinfo.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfdocumentinfo.h b/kmyfirewall/kmfwidgets/kmfdocumentinfo.h new file mode 100644 index 0000000..059d488 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfdocumentinfo.h @@ -0,0 +1,58 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004 +// +// Copyright: See COPYING file that comes with this distribution +// License: GPL +// + +#ifndef KMFDOCUMENTINFO_H +#define KMFDOCUMENTINFO_H + +#include "kmyfirewalldocumentinfo.h" + +// QT includes + +// KDE includes +#include <kdemacros.h> + +// project includes +namespace KMF { +class KMFDoc; + +class KDE_EXPORT KMFDocumentInfo : public KMyFirewallDocumentInfo { + Q_OBJECT + +public: + KMFDocumentInfo(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~KMFDocumentInfo(); + /*$PUBLIC_FUNCTIONS$*/ + + void loadDoc( KMFDoc* ); + +public slots: + /*$PUBLIC_SLOTS$*/ + +protected: + /*$PROTECTED_FUNCTIONS$*/ + +protected slots: + /*$PROTECTED_SLOTS$*/ + virtual void accept(); + void slotSaveAsTemplate(); + void slotHelp(); + +private: // data + KMFDoc *m_doc; + +signals: + void sigSaveAsTemplate(); + +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.cpp b/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.cpp new file mode 100644 index 0000000..45ad652 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.cpp @@ -0,0 +1,452 @@ +// +// C++ Implementation: kmfgenericinterfaceeditprotocol +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#include "kmfgenericinterfaceeditprotocol.h" + +// QT includes +#include <qstring.h> +#include <qcheckbox.h> +#include <qfile.h> +#include <qdir.h> +#include <qdom.h> +#include <qstring.h> +#include <qstringlist.h> +#include <qlistview.h> +#include <qradiobutton.h> +#include <qpushbutton.h> +#include <qlineedit.h> +#include <qtextedit.h> +#include <qbuttongroup.h> +#include <qgroupbox.h> +#include <qspinbox.h> +#include <quuid.h> +#include <qcombobox.h> + +// KDE includes +#include <klocale.h> +#include <kdebug.h> +#include <kstandarddirs.h> +#include <klocale.h> +#include <kio/netaccess.h> +#include <kio/job.h> +#include <ktrader.h> +#include <klibloader.h> +#include <klistview.h> +#include <klistbox.h> +#include <knuminput.h> +#include <kpushbutton.h> +#include <kmessagebox.h> +#include <ktempfile.h> +#include <kcombobox.h> + +// Project includes +#include "kmflistviewitem.h" +#include "../version.h" +#include "../core/kmfgenericdoc.h" +#include "../core/kmfnetwork.h" +#include "../core/kmfprotocol.h" +#include "../core/kmfprotocollibrary.h" +#include "../core/kmfprotocolcategory.h" +#include "../core/kmferror.h" +#include "../core/kmferrorhandler.h" + +namespace KMF { +KMFGenericInterfaceEditProtocol::KMFGenericInterfaceEditProtocol( QWidget *parent, const char *name, WFlags f ) + : KMyFirewallGenericInterfaceEditProtocolWidget( parent, name, f ) { + // m_protocolsLoaded = false; +// m_protocols.clear(); + + connect( m_lv_protocols, SIGNAL( pressed( QListViewItem* ) ) , + this, SLOT( slotNewItemSelected( QListViewItem* ) ) ); + + connect( m_lb_tcpPorts, SIGNAL( currentChanged ( QListBoxItem * ) ), this, SLOT( slotCurrentTCPPortChanged( QListBoxItem * ) ) ); + + connect( m_lb_udpPorts, SIGNAL( currentChanged ( QListBoxItem * ) ), this, SLOT( slotCurrentUDPPortChanged( QListBoxItem * ) ) ); + + // connect( m_sb_port_num, SIGNAL( valueChanged( int ) ), this, SLOT( slotPortVauleChanged( int ) ) ); + + connect( m_te_desc, SIGNAL( textChanged() ), this, SLOT( slotNameDescritionChanged() ) ); + connect( m_le_protocolName , SIGNAL( textChanged( const QString& ) ), this, SLOT( slotNameDescritionChanged() ) ); + connect( m_rb_tcp, SIGNAL( clicked() ), this, SLOT( slotProtocolTypeChanged() ) ); + connect( m_rb_udp, SIGNAL( clicked() ), this, SLOT( slotProtocolTypeChanged() ) ); + + connect( m_b_add_port, SIGNAL( clicked() ), this, SLOT( slotAddPort() ) ); + connect( m_b_del_port, SIGNAL( clicked() ), this, SLOT( slotDelPort() ) ); + + connect( m_b_new_protocol, SIGNAL( clicked() ), this, SLOT( slotAddProtocol() ) ); + connect( m_b_del_protocol, SIGNAL( clicked() ), this, SLOT( slotDelProtocol() ) ); + + connect( m_cb_showAll,SIGNAL( toggled( bool ) ), this , SLOT( slotUpdateView() ) ); +} + + +KMFGenericInterfaceEditProtocol::~KMFGenericInterfaceEditProtocol() {} + + + +void KMFGenericInterfaceEditProtocol::slotNewItemSelected( QListViewItem* qit ) { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotNewItemSelected(...)" << endl; + + KMFListViewItem *item = dynamic_cast<KMFListViewItem*> ( qit ); + if ( ! item ) { + kdDebug() << "Item was no KMFListViewItem!" << endl; + m_gb_edit->setEnabled( false ); + m_b_del_protocol->setEnabled( false ); + return; + } + + if ( m_protocol && + item->type() == NetfilterObject::PROTOCOL && + m_protocol->uuid() == item->protocol()->uuid() ) { + kdDebug() << "Selected Same Protocal again" << endl; + m_gb_edit->setEnabled( m_protocol->customProtocol() ); + m_b_del_protocol->setEnabled( m_protocol->customProtocol() ); + return; + } + if ( item->type() != NetfilterObject::PROTOCOL ) { + return; + } + m_gb_edit->setEnabled( true ); + m_b_del_protocol->setEnabled( true ); + m_protocol = item->protocol(); + updateEdit(); +} + +void KMFGenericInterfaceEditProtocol::slotCurrentTCPPortChanged( QListBoxItem * item ) { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotCurrentTCPPortChanged()" << endl; + if ( ! item ) { + return; + } + + m_lb_udpPorts->clearSelection(); +// m_sb_port_num->setValue( item->text().toInt() ); + m_rb_tcp->setChecked( true ); + +} + +void KMFGenericInterfaceEditProtocol::slotCurrentUDPPortChanged( QListBoxItem * item ) { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotCurrentUDPPortChanged()" << endl; + if ( ! item ) { + return; + } + m_lb_tcpPorts->clearSelection(); +/* m_sb_port_num->blockSignals( true ); + m_sb_port_num->setValue( item->text().toInt() ); + m_sb_port_num->blockSignals( false );*/ + m_rb_udp->setChecked( true ); +} + +void KMFGenericInterfaceEditProtocol::slotProtocolTypeChanged() { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotProtocolTypeChanged()" << endl; + if ( ! m_protocol ) { + kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl; + return; + } + + m_lb_udpPorts->clearSelection(); + m_lb_tcpPorts->clearSelection(); +} +void KMFGenericInterfaceEditProtocol::slotAddPort() { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotAddPort()" << endl; + if ( ! m_protocol ) { + kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl; + return; + } + + m_lb_udpPorts->clearSelection(); + m_lb_tcpPorts->clearSelection(); + if ( m_rb_tcp->isChecked() ) { + m_protocol->addPort( m_sb_port_num->text(), KMFProtocol::TCP ); + m_lb_tcpPorts->blockSignals( true ); + m_lb_tcpPorts->clear(); + // QStringList l = QStringList::split( ",", m_protocol->tcpPortsList() ); + m_lb_tcpPorts->insertStringList( QStringList::split( ",", m_protocol->tcpPortsList() ) ); + + + m_lb_tcpPorts->blockSignals( false ); + + for( uint i= 0; i< m_lb_tcpPorts->count(); i++ ) { + if ( m_lb_tcpPorts->text( i ) == m_sb_port_num->text() ) { + m_lb_tcpPorts->setSelected( i, true ); + } + } + slotProtocolChanged(); + } else if ( m_rb_udp->isChecked() ) { + m_protocol->addPort( m_sb_port_num->text(), KMFProtocol::UDP ); + m_lb_udpPorts->blockSignals( true ); + m_lb_udpPorts->clear(); +// for( uint i= 0; i< m_protocol->udpPorts()->count(); i++ ) { +// m_lb_udpPorts->insert( *m_protocol->udpPorts().at( i ) ); +// } + m_lb_udpPorts->insertStringList( QStringList::split( ",", m_protocol->udpPortsList() ) ); + m_lb_udpPorts->blockSignals( false ); + + for( uint i= 0; i< m_lb_udpPorts->count(); i++ ) { + if ( m_lb_udpPorts->text( i ) == m_sb_port_num->text() ) { + m_lb_udpPorts->setSelected( i, true ); + } + } + slotProtocolChanged(); + } +} + +void KMFGenericInterfaceEditProtocol::slotDelPort() { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotDelPort()" << endl; + if ( m_lb_tcpPorts->selectedItem() ) { + m_protocol->delPort( m_lb_tcpPorts->selectedItem()->text(), KMFProtocol::TCP ); + m_lb_tcpPorts->blockSignals( true ); + m_lb_tcpPorts->clear(); + m_lb_tcpPorts->insertStringList( QStringList::split( ",", m_protocol->tcpPortsList() ) ); + m_lb_tcpPorts->blockSignals( false ); + if ( m_lb_tcpPorts->count() > 0 ) { + m_lb_tcpPorts->setSelected( 0, true ); + } + slotProtocolChanged(); + } else if ( m_lb_udpPorts->selectedItem() ) { + m_protocol->delPort( m_lb_udpPorts->selectedItem()->text(), KMFProtocol::UDP ); + m_lb_udpPorts->blockSignals( true ); + m_lb_udpPorts->clear(); + m_lb_udpPorts->insertStringList( QStringList::split( ",", m_protocol->udpPortsList() ) ); + m_lb_udpPorts->blockSignals( false ); + if ( m_lb_udpPorts->count() > 0 ) { + m_lb_udpPorts->setSelected( 0, true ); + } + slotProtocolChanged(); + } +} + +void KMFGenericInterfaceEditProtocol::slotAddProtocol() { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotAddProtocol()" << endl; +// KMFProtocolCategory* catCustom = KMFProtocol::findCategory( KMFProtocolCategory::customCategoryUuid() ); +// if ( ! catCustom ) { +// catCustom = KMFProtocolCategory::createCategory( i18n("Custom Protocols") ); +// catCustom->setUuid( KMFProtocolCategory::customCategoryUuid().toString() ); +// } + + KMFProtocol *p = KMFProtocolCategory::getCustomCategory()->createProtocol( i18n("New Protocol") ); + p->setName( i18n("New Protocol") ); + p->setCustomProtocol( true ); + m_protocol = p; + slotUpdateView(); + +// KMFListViewItem *item = new KMFListViewItem( m_lv_protocols, p ); +// item->loadNetfilterObject( p ); +// item->setupProtocolView(); +// +// m_lv_protocols->setSelected( item, true ); +// slotNewItemSelected( item ); +} + +void KMFGenericInterfaceEditProtocol::slotDelProtocol() { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotDelProtocol()" << endl; + if ( ! m_protocol ) { + return; + kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl; + } + int doit = KMessageBox::questionYesNo ( this , i18n( "<p>Are you sure that you want to delete " + "the protocol: <b>%1</b>?</p>").arg( m_protocol->name() ), + i18n( "Delete Protocol" ), KStdGuiItem::yes(), KStdGuiItem::no() /*, "protocol_edit_delete_protocol"*/ ); + + // kdDebug() << "Got Answer: " << doit << endl; + if ( doit != 3 ) { + return; + } + // FIXME: Casees Mem0ry Leak, but app crashed othwise! + m_protocol->category()->delProtocol( m_protocol, false ); + m_protocol = 0; + slotNewItemSelected( 0 ); + slotUpdateView(); +} + +void KMFGenericInterfaceEditProtocol::slotOnProtocolDeleleted( QObject* ) { + m_protocol = 0; + slotUpdateView(); + slotNewItemSelected( 0 ); +} + +void KMFGenericInterfaceEditProtocol::slotPortVauleChanged( int val ) { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotPortVauleChanged()" << endl; + if ( ! m_protocol ) { + kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl; + return; + } + + QString s = ""; + s.setNum( val ); + if ( m_rb_udp->isChecked() ) { + QListBoxItem *i = m_lb_udpPorts->selectedItem(); + if ( ! i ) { + return; + } + QString strVal = ""; + strVal.setNum( val ); + if ( m_protocol->replaceUDPPort( i->text().toInt(), val ) ) { + m_lb_udpPorts->blockSignals( true ); + m_lb_udpPorts->clear(); + m_lb_udpPorts->insertStringList( QStringList::split( ",", m_protocol->udpPortsList() ) ); + + for( uint i= 0; i< m_lb_udpPorts->count(); i++ ) { + if ( m_lb_udpPorts->text( i ) == strVal ) { + m_lb_udpPorts->setSelected( i, true ); + break; + } + } + m_lb_udpPorts->blockSignals( false ); + slotProtocolChanged(); + } + } else if ( m_rb_tcp->isChecked() ) { + QListBoxItem *i = m_lb_tcpPorts->selectedItem(); + if ( ! i ) { + return; + } + + QString strVal = ""; + strVal.setNum( val ); + + if( m_protocol->replaceTCPPort( i->text().toInt(), val ) ) { + m_lb_tcpPorts->blockSignals( true ); + m_lb_tcpPorts->clear(); + m_lb_tcpPorts->insertStringList( QStringList::split( ",", m_protocol->tcpPortsList() ) ); + for( uint i= 0; i< m_lb_tcpPorts->count(); i++ ) { + if ( m_lb_tcpPorts->text( i ) == strVal ) { + m_lb_tcpPorts->setSelected( i, true ); + break; + } + } + m_lb_tcpPorts->blockSignals( false ); + slotProtocolChanged(); + } + } +} + +void KMFGenericInterfaceEditProtocol::slotNameDescritionChanged() { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotNameDescritionChanged()" << endl; + if ( ! m_protocol ) { + kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl; + return; + } + + if ( ! m_le_protocolName->text().isEmpty() ) { + m_protocol->setName( m_le_protocolName->text().stripWhiteSpace().simplifyWhiteSpace() ); + } + m_protocol->setDescription( m_te_desc->text().stripWhiteSpace().simplifyWhiteSpace() ); + + // m_protocol->setCategory( m_cob_ + slotProtocolChanged(); +} + +void KMFGenericInterfaceEditProtocol::slotProtocolChanged() { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotProtocolChanged()" << endl; + QListViewItemIterator it( m_lv_protocols ); + while ( it.current() ) { + KMFListViewItem *kit = dynamic_cast<KMFListViewItem*> ( it.current() ); + if ( kit->type() == NetfilterObject::PROTOCOL && + kit->protocol()->uuid() == m_protocol->uuid() ) { + kit->setupProtocolView(); + kit->setOpen( true ); + return; + } + ++it; + } +} + +void KMFGenericInterfaceEditProtocol::updateEdit() { + kdDebug() << "void KMFGenericInterfaceEditProtocol::updateEdit()" << endl; + if ( ! m_protocol ) { + kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl; + m_gb_edit->setEnabled( false ); + m_b_del_protocol->setEnabled( false ); + return; + } + m_gb_edit->setEnabled( m_protocol->customProtocol() ); + m_b_del_protocol->setEnabled( m_protocol->customProtocol() ); + + m_le_protocolName->blockSignals( true ); + m_te_desc->blockSignals( true ); + + m_le_protocolName->setText( m_protocol->name() ); + m_te_desc->setText( m_protocol->description() ); + + m_le_protocolName->blockSignals( false ); + m_te_desc->blockSignals( false ); + + m_lb_tcpPorts->clear(); + m_lb_udpPorts->clear(); + m_lb_tcpPorts->insertStringList( QStringList::split( ",", m_protocol->tcpPortsList() ) ); + m_lb_udpPorts->insertStringList( QStringList::split( ",", m_protocol->udpPortsList() ) ); +} + +void KMFGenericInterfaceEditProtocol::slotUpdateView() { + kdDebug() << "void KMFGenericInterfaceEditProtocol::slotUpdateView()" << endl; + m_lv_protocols->clear(); + KMFProtocolCategory::getCustomCategory(); + + if ( m_cb_showAll->isChecked() ) { + QValueList<KMFProtocolCategory*>& protCats = KMFProtocolLibrary::instance()->protocolCategories(); + QValueList<KMFProtocolCategory*>::iterator it; + for( it = protCats.begin(); it != protCats.end(); ++it ) { + KMFProtocolCategory* cat = *it; + kdDebug() << "\nSetup Category: Item" << cat->name() << endl; + + KMFListViewItem *item = new KMFListViewItem( m_lv_protocols, cat ); + item->loadNetfilterObject( cat ); + item->setupProtocolCategoryView(); + if ( cat == KMFProtocolCategory::getCustomCategory() ) { + item->setOpen( true ); + } + } + } else { + KMFProtocolCategory* customCat = KMFProtocolCategory::getCustomCategory(); + KMFListViewItem *item = new KMFListViewItem( m_lv_protocols, customCat ); + item->loadNetfilterObject( customCat ); + item->setupProtocolCategoryView(); + item->setOpen( true ); + } + + QValueList< KMFProtocol* >& prots = KMFProtocolCategory::getCustomCategory()->protocols(); + QValueList< KMFProtocol* >::iterator it; + for( it = prots.begin(); it != prots.end(); ++it ) { + KMFProtocol* p= *it; + disconnect( p, SIGNAL( destroyed( QObject* ) ), + this, SLOT( slotOnProtocolDeleleted( QObject* ) ) ); + connect( p, SIGNAL( destroyed( QObject* ) ), + this, SLOT( slotOnProtocolDeleleted( QObject* ) ) ); + } + + setEnabled( true ); +} + + +void KMFGenericInterfaceEditProtocol::loadDoc( KMFNetwork* doc ) { + kdDebug() << "void KMFGenericInterfaceLogging::loadDoc( KMFGenericDoc* )" << endl; + m_network = doc; + slotUpdateView(); +} + +void KMFGenericInterfaceEditProtocol::saveProtocols() { + kdDebug() << "KMFGenericInterfaceEditProtocol::saveProtocols()" << endl; + KMFErrorHandler *errH = new KMFErrorHandler( "KMFErrorHandler" ); + errH->showError( KMFProtocolLibrary::instance()->saveProtocolLibrary() ); +} + +} + +#include "kmfgenericinterfaceeditprotocol.moc" diff --git a/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.h b/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.h new file mode 100644 index 0000000..658eb07 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.h @@ -0,0 +1,90 @@ +// +// C++ Interface: kmfgenericinterfaceeditprotocol +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#ifndef KMFGENERICINTERFACEEDITPROTOCOL_H +#define KMFGENERICINTERFACEEDITPROTOCOL_H + +#include "kmyfirewallgenericinterfaceeditprotocolwidget.h" + +// QT Includes +#include <qptrlist.h> +#include <qstring.h> +#include <qguardedptr.h> +#include <qpixmap.h> + +/** +@author Christian Hubinger +*/ + +class QListViewItem; +class QListBoxItem; + +namespace KMF { +class KMFGenericDoc; +class KMFNetwork; +class KMFProtocol; +class KMFListViewItem; +class KMFProtocolCategory; + +class KMFGenericInterfaceEditProtocol : public KMyFirewallGenericInterfaceEditProtocolWidget { + Q_OBJECT +public: + KMFGenericInterfaceEditProtocol( QWidget *parent = 0, const char *name = 0, WFlags f = 0 ); + + ~KMFGenericInterfaceEditProtocol(); + + void saveProtocols(); + // void loadProtocols(); + +public slots: + void slotUpdateView(); + +protected slots: + void slotNewItemSelected( QListViewItem* ); + void slotCurrentTCPPortChanged( QListBoxItem * ); + void slotCurrentUDPPortChanged( QListBoxItem * ); + void slotPortVauleChanged( int ); + void slotProtocolChanged(); + void slotNameDescritionChanged(); + void slotProtocolTypeChanged(); + void slotAddPort(); + void slotDelPort(); + void slotAddProtocol(); + void slotDelProtocol(); + void slotOnProtocolDeleleted( QObject* ); +public: + void loadDoc( KMFNetwork* ); + +private: // Methods + + void updateEdit(); + const QString& getXMLSniplet(); +// KMFProtocolCategory* getCuustomCategotry(); + +private: // DATA + KMFNetwork *m_network; + // QPtrList<KMFProtocol> m_protocols; + QGuardedPtr<KMFProtocol> m_protocol; + // bool m_protocolsLoaded; + +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfhostwidget.cpp b/kmyfirewall/kmfwidgets/kmfhostwidget.cpp new file mode 100644 index 0000000..4f3c0e5 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfhostwidget.cpp @@ -0,0 +1,368 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#include "kmfhostwidget.h" + +// QT includes +#include <qtextedit.h> +#include <qpushbutton.h> +#include <qcolor.h> +#include <qlabel.h> + +// KDE includes +#include <kled.h> +#include <kcombobox.h> +#include <knuminput.h> +#include <kdebug.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kio/netaccess.h> +#include <kapplication.h> +#include <ktrader.h> +#include <kparts/part.h> +#include <kparts/plugin.h> +#include <kparts/factory.h> + + +// Project includes +#include "../core/kmferror.h" +#include "../core/kmferrorhandler.h" +#include "../core/xmlnames.h" +#include "../core/kmftarget.h" +#include "../core/kmftargetconfig.h" +#include "../core/kmfundoengine.h" +#include "../core/kmfcompilerinterface.h" +#include "../core/kmfinstallerinterface.h" +namespace KMF { +KMFHostWidget::KMFHostWidget(QWidget* parent, const char* name, WFlags fl ) + : KMyFirewallHostWidget(parent, name, fl ) +{ + kdDebug() << "KMFHostWidget::KMFHostWidget(QWidget* parent, const char* name, WFlags fl)" << endl; + connect( m_sb_host_0, SIGNAL( valueChanged ( int ) ), + this, SLOT( slotAddressChanged( int ) ) ); + connect( m_sb_host_1, SIGNAL( valueChanged ( int ) ), + this, SLOT( slotAddressChanged( int ) ) ); + connect( m_sb_host_2, SIGNAL( valueChanged ( int ) ), + this, SLOT( slotAddressChanged( int ) ) ); + connect( m_sb_host_3, SIGNAL( valueChanged ( int ) ), + this, SLOT( slotAddressChanged( int ) ) ); + + connect( m_sb_host_sshPort, SIGNAL( valueChanged ( int ) ), + this, SLOT( slotSSHPortChanged( int ) ) ); + + + connect( m_cb_backend, SIGNAL( activated( const QString& ) ), + this, SLOT( slotBackaendChanged( const QString& ) ) ); + connect( m_cb_os, SIGNAL( activated( const QString& ) ), + this, SLOT( slotOSChanged( const QString& ) ) ); + + connect( m_host_desc, SIGNAL( textChanged() ), + this, SLOT( slotDescriptionChanged() ) ); + + connect( m_cmd_testSSH, SIGNAL( clicked() ), + this, SLOT( slotTestConnection() ) ); + connect( m_cmd_autoConf, SIGNAL( clicked() ), + this, SLOT( slotTryAutoConfiguration() ) ); +} + +KMFHostWidget::~KMFHostWidget() +{ + + +} + +void KMFHostWidget::InitGUI() { + kdDebug() << "KMFHostWidget::InitGUI()" << endl; + m_cb_backend->blockSignals( true ); + m_cb_os->blockSignals( true ); + m_cb_backend->clear(); + m_cb_os->clear(); + + + // kdDebug() << "Start query" << endl; + KTrader::OfferList offers = KTrader::self()->query( "KMyFirewall/Compiler"); + // kdDebug() << "Query performed for KMyFirewall/Installer" << endl; + KTrader::OfferList::iterator it; + if ( offers.empty() ) { + kdDebug() << "ERROR: NO MATCHING PLUGIN FOUND" << endl; + } + for ( it = offers.begin(); it != offers.end(); ++it ) { + KService::Ptr ptr = *it; + KLibFactory *factory = KLibLoader::self()->factory( ptr->library().local8Bit().data() ); + kdDebug() << KLibLoader::self()->lastErrorMessage() << endl; + if ( !factory ) { + KMessageBox::error( 0, i18n("<qt><b>Compiler plugin could not be loaded.</b></qt>") ); + kdDebug() << "Couldn't load plugin: " << ptr->name() << endl; + } + + if ( KMFCompilerInterface *compiler = dynamic_cast<KMFCompilerInterface*> ( factory->create( this , "KMFCompilerInterface") ) ) { + m_cb_os->insertItem( compiler->osGUIName() ); + } + } + slotOSChanged( m_cb_os->currentText() ); + m_cb_backend->blockSignals( false ); + m_cb_os->blockSignals( false ); +} + +/*$SPECIALIZATION$*/ +void KMFHostWidget::loadHost( KMFTarget *target ) { + kdDebug() << "KMFHostWidget::loadHost( KMFTarget * " + target->guiName() + " )" << endl; + m_target = target; + + + updateView(); +} + + +void KMFHostWidget::updateView() { + kdDebug() << "KMFHostWidget::updateView()" << endl; + m_sb_host_0->blockSignals( true ); + m_sb_host_1->blockSignals( true ); + m_sb_host_2->blockSignals( true ); + m_sb_host_3->blockSignals( true ); + m_sb_host_sshPort->blockSignals( true ); + m_cb_backend->blockSignals( true ); + m_cb_os->blockSignals( true ); + m_host_desc->blockSignals( true ); + m_cmd_testSSH->blockSignals( true ); + m_led_configStatus->off(); + if ( m_target ) { + m_led_configStatus->on(); + if ( m_target->config()->isValid() ) { + m_led_configStatus->setColor( Qt::green ); + m_lbl_configStatus->setText( i18n( "Config Ok" ) ); + } else { + m_led_configStatus->setColor( Qt::red ); + m_lbl_configStatus->setText( i18n( "Invalid Config!" ) ); + } + + + m_cb_backend->setEnabled( true ); + m_cb_os->setEnabled( true ); + m_host_desc->setEnabled( true ); + m_cmd_testSSH->setEnabled( true ); + m_sb_host_sshPort->setEnabled( true ); + m_cb_backend->setEnabled( true ); + m_cb_os->setEnabled( true ); + m_sb_host_0->setEnabled( true ); + m_sb_host_1->setEnabled( true ); + m_sb_host_2->setEnabled( true ); + m_sb_host_3->setEnabled( true ); + m_cmd_autoConf->setEnabled( true ); + m_host_desc->setEnabled( true ); + m_host_desc->setReadOnly( false ); + if ( m_target->installer() ) { + for( int i = 0; i < m_cb_os->count(); i++ ) { + if ( m_cb_os->text( i ).lower() == m_target->installer()->osGUIName().lower() ) { + m_cb_os->setCurrentItem( i ); + break; + } + } + + m_cb_backend->clear(); + QValueList<KMFCompilerInterface*> *comps = m_target->installer()->compilers(); + QValueList<KMFCompilerInterface*>::iterator it; + + for ( it = comps->begin(); it != comps->end(); ++it ) { + kdDebug() << "Found Compiler: " << (*it)->backendGUIName() << endl; + m_cb_backend->insertItem( (*it)->backendGUIName() ); + } + + for( int i = 0; i < m_cb_backend->count(); i++ ) { + if ( m_cb_backend->text( i ).lower() == m_target->compiler()->backendGUIName().lower() ) { + m_cb_backend->setCurrentItem( i ); + break; + } + } + } + + if ( m_target->isLocalhost() ) { +// m_cmd_testSSH->setEnabled( false ); +// m_sb_host_sshPort->setEnabled( false ); + m_sb_host_0->setEnabled( false ); + m_sb_host_1->setEnabled( false ); + m_sb_host_2->setEnabled( false ); + m_sb_host_3->setEnabled( false ); + m_host_desc->setReadOnly( true ); + } + + + IPAddress * addr = m_target->address(); + m_sb_host_0->setValue( addr->getDigit( 0 ) ); + m_sb_host_1->setValue( addr->getDigit( 1 ) ); + m_sb_host_2->setValue( addr->getDigit( 2 ) ); + m_sb_host_3->setValue( addr->getDigit( 3 ) ); + + m_sb_host_sshPort->setValue( m_target->sshPort() ); + +/* m_cb_backend->setCurrentItem( m_target->config()->backend(), false ); + m_cb_os->setCurrentItem( m_target->config()->oS(), false );*/ + + if ( m_host_desc->text().simplifyWhiteSpace() != m_target->description() ) { + m_host_desc->setText( m_target->description() ); + } + + } else { + m_sb_host_0->setEnabled( false ); + m_sb_host_1->setEnabled( false ); + m_sb_host_2->setEnabled( false ); + m_sb_host_3->setEnabled( false ); + m_cb_backend->setEnabled( false ); + m_cb_os->setEnabled( false ); + m_sb_host_sshPort->setEnabled( false ); + m_cmd_testSSH->setEnabled( false ); + m_host_desc->setEnabled( false ); + m_cmd_autoConf->setEnabled( false ); + m_host_desc->setReadOnly( true ); + } + + m_sb_host_0->blockSignals( false ); + m_sb_host_1->blockSignals( false ); + m_sb_host_2->blockSignals( false ); + m_sb_host_3->blockSignals( false ); + m_cb_backend->blockSignals( false ); + m_cb_os->blockSignals( false ); + m_host_desc->blockSignals( false ); + m_sb_host_sshPort->blockSignals( false ); + m_cmd_testSSH->blockSignals( false ); +} + +void KMFHostWidget::slotTestConnection() { + if ( ! m_target ) { + return; + } + if ( KIO::NetAccess::fish_execute( m_target->getFishUrl(), "ls /", + KApplication::kApplication()->mainWidget() ) != 0) { + KMessageBox::information( this, i18n("Conneted successfully to: %1").arg( m_target->toFriendlyString() ) ); + } else { + KMessageBox::error( this, i18n("Connetion to: %1 failed!").arg( m_target->toFriendlyString() ) ); + } +} +void KMFHostWidget::slotTryAutoConfiguration(){ + kdDebug() << "KMFHostWidget::slotTryAutoConfiguration())" << endl; + if ( ! m_target ) { + return; + } + KMFError* err = m_target->tryAutoConfiguration(); + KMFErrorHandler* errH = new KMFErrorHandler( i18n("Auto Confguration of: %1").arg( m_target->toFriendlyString() ) ); + if ( ! errH->showError( err ) ) { + return; + } + if ( ! m_target->config()->isValid() ) { + KMessageBox::error( this, i18n("<qt><p>Auto Confguration of: %1 could not determinate all needed setting. You'll need to configure the mmissing settings.</p></qt>").arg( m_target->toFriendlyString() ) ); + } else { + KMessageBox::information( this, i18n("<qt><p>Auto Confguration of: %1 finished successfully.</p></qt>").arg( m_target->toFriendlyString() ) ); + } + emit sigTargetChanged(); +} + +void KMFHostWidget::slotTryAutoConfiguration_Callback( KMFTarget* ) { + disconnect( m_target, SIGNAL( sigTargetChanged( KMFTarget* ) ), + this,SLOT( slotTryAutoConfiguration_Callback( KMFTarget* ) ) ); + if ( ! m_target->config()->isValid() ) { + KMessageBox::error( 0, i18n("<qt><p>Auto Confguration of: %1 could not determinate all needed setting. You'll need to configure the mmissing settings.</p></qt>").arg( m_target->toFriendlyString() ) ); + } else { + KMessageBox::information( this, i18n("<qt><p>Auto Confguration of: %1 finished successfully.</p></qt>").arg( m_target->toFriendlyString() ) ); + } + emit sigTargetChanged(); +} + +void KMFHostWidget::slotAddressChanged( int val ) { + kdDebug() << "KMFHostWidget::slotAddressChanged( int " << val << " )" << endl; + KMFUndoEngine::instance()->startTransaction( + m_target, + i18n( "Edit address of target: %1.").arg( m_target->guiName() ) + ); + m_target->address()->setAddress( + m_sb_host_0->value(), + m_sb_host_1->value(), + m_sb_host_2->value(), + m_sb_host_3->value() ); + KMFUndoEngine::instance()->endTransaction(); + emit sigTargetChanged(); + +} + +void KMFHostWidget::slotSSHPortChanged( int val ) { + kdDebug() << "KMFHostWidget:::slotSSHPortChanged( int " << val << " )" << endl; + KMFUndoEngine::instance()->startTransaction( + m_target, + i18n( "Edit SSH port of target: %1.").arg( m_target->guiName() ) + ); + m_target->setSSHPort( val ); + KMFUndoEngine::instance()->endTransaction(); + emit sigTargetChanged(); +} + + + +void KMFHostWidget::slotOSChanged( const QString& val ) { + kdDebug() << "KMFHostWidget:::slotOSChanged( const QString& " << val << " )" << endl; + if ( ! m_target ) { + return; + } + KMFUndoEngine::instance()->startTransaction( + m_target->config(), + i18n( "Edit operation system setting of target: %1.").arg( m_target->guiName() ) + ); + m_target->config()->setOS( val.lower() ); + + m_cb_backend->blockSignals( true ); + m_cb_backend->clear(); + QValueList<KMFCompilerInterface*> *comps = m_target->installer()->compilers(); + QValueList<KMFCompilerInterface*>::iterator it; + + for ( it = comps->begin(); it != comps->end(); ++it ) { + kdDebug() << "Found Compiler: " << (*it)->backendGUIName() << endl; + m_cb_backend->insertItem( (*it)->backendGUIName() ); + } + m_cb_backend->blockSignals( false ); + slotBackaendChanged( m_cb_backend->currentText() ); + + KMFUndoEngine::instance()->endTransaction(); + emit sigTargetChanged(); +} + +void KMFHostWidget::slotBackaendChanged( const QString& val ) { + kdDebug() << "KMFHostWidget::slotBackaendChanged( const QString& " << val << " )" << endl; + KMFUndoEngine::instance()->startTransaction( + m_target->config(), + i18n( "Edit backend setting of target: %1.").arg( m_target->guiName() ) + ); + m_target->config()->setBackend( val.lower() ); + + + + KMFUndoEngine::instance()->endTransaction(); + emit sigTargetChanged(); +} + +void KMFHostWidget::slotDescriptionChanged() { + kdDebug() << "KMFHostWidget::slotDescriptionChanged()" << endl; + if ( m_host_desc->text() == m_target->description() ) { + kdDebug() << "Description Unchanged" << endl; + return; + } + KMFUndoEngine::instance()->startTransaction( + m_target, + i18n( "Edit documentation of target: %1.").arg( m_target->guiName() ) + ); + m_target->setDescription( m_host_desc->text().simplifyWhiteSpace() ); + KMFUndoEngine::instance()->endTransaction(); + emit sigTargetChanged(); +} + +} + +#include "kmfhostwidget.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfhostwidget.h b/kmyfirewall/kmfwidgets/kmfhostwidget.h new file mode 100644 index 0000000..20aaf55 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfhostwidget.h @@ -0,0 +1,69 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef KMFHOSTWIDGET_H +#define KMFHOSTWIDGET_H + +#include "kmyfirewallhostwidget.h" + +#include <qwidget.h> +#include <kdialogbase.h> +#include <kconfig.h> +#include <kglobal.h> +#include <kprocess.h> +#include <qstring.h> +#include <qpixmap.h> +#include <qguardedptr.h> + +namespace KMF { +class KMFTarget; + +class KMFHostWidget : public KMyFirewallHostWidget +{ + Q_OBJECT + +public: + KMFHostWidget(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~KMFHostWidget(); + /*$PUBLIC_FUNCTIONS$*/ + void loadHost( KMFTarget *target ); + void InitGUI(); + +public slots: + /*$PUBLIC_SLOTS$*/ + + +protected: + /*$PROTECTED_FUNCTIONS$*/ + void updateView(); + +protected slots: + /*$PROTECTED_SLOTS$*/ + void slotAddressChanged( int ); + void slotSSHPortChanged( int ); + void slotOSChanged( const QString& ); + void slotBackaendChanged( const QString& ); + void slotDescriptionChanged(); + void slotTestConnection(); + void slotTryAutoConfiguration(); + void slotTryAutoConfiguration_Callback( KMFTarget* ); + signals: + void sigTargetChanged(); + + +private: + QGuardedPtr<KMFTarget> m_target; + +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmfinterfacewidget.cpp b/kmyfirewall/kmfwidgets/kmfinterfacewidget.cpp new file mode 100644 index 0000000..e2979b7 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfinterfacewidget.cpp @@ -0,0 +1,173 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#include "kmfinterfacewidget.h" + +// QT includes +#include <qstringlist.h> + +// KDE includes +#include <klocale.h> +#include <kcombobox.h> +#include <kapplication.h> +#include <kdebug.h> +#include <klocale.h> +#include <kurlrequester.h> +#include <kguiitem.h> +#include <kpushbutton.h> +#include <knuminput.h> +#include <klistbox.h> +#include <kcombobox.h> +#include <kiconloader.h> +#include <kglobal.h> +#include <kmessagebox.h> +#include <klistview.h> + +// Prokject includes +#include "../core/kmftarget.h" +#include "../core/kmftargetconfig.h" +#include "../core/kmfundoengine.h" +namespace KMF { +KMFInterfaceWidget::KMFInterfaceWidget( QWidget* parent, const char* name, WFlags fl ) + : KMyFirewallInterfaceWidget( parent, name, fl ) { + connect( m_b_add_int, SIGNAL( clicked() ), this, SLOT( slotAddInterface() ) ); + connect( m_b_del_int, SIGNAL( clicked() ), this, SLOT( slotDelInterface() ) ); + + m_cb_int_name->clear(); + m_cb_int_name->insertItem( "eth" ); + m_cb_int_name->insertItem( "ppp" ); + m_cb_int_name->insertItem( "ippp" ); + m_cb_int_name->insertItem( "ppoe" ); + m_cb_int_name->insertItem( "wlan" ); + m_cb_int_name->insertItem( "tun" ); + m_cb_int_name->insertItem( "tap" ); + m_cb_int_name->insertItem( "gre" ); + m_cb_int_name->insertItem( "lo" ); +} + +KMFInterfaceWidget::~KMFInterfaceWidget() {} + +void KMFInterfaceWidget::loadTarget( KMFTarget* target ) { + kdDebug() << "KMFInterfaceWidget::loadTarget( KMFTarget* target )" << endl; + m_target = target; + updateView(); +} + +void KMFInterfaceWidget::updateView(){ + kdDebug() << "KMFInterfaceWidget::updateView()" << endl; + if ( ! m_target ) { + return; + } + KMFTargetConfig *conf = m_target->config(); + kdDebug() << "Load Config:" << endl; + kdDebug() << conf->toString() << endl; + m_lb_int->clear(); + QStringList ints = conf->interfaces(); + for ( QStringList::Iterator it = ints.begin(); it != ints.end(); ++it ) { + QString s = *it; + kdDebug() << "Load Interface: " << s << endl; + m_lb_int->insertItem( s ); + } +} + +void KMFInterfaceWidget::slotAddInterface() { + QString int_name = m_cb_int_name->currentText(); + int int_num = m_sb_int_num->value(); + QString str_num; + str_num.setNum( int_num ); + QString interface = int_name; + if ( int_name != "lo" ) + interface += str_num; + for ( uint i = 0;i < m_lb_int->count();i++ ) { + QString interf = m_lb_int->text( i ); + if ( interface == interf ) { + KMessageBox::sorry( this, i18n( "You cannot have more then one interface with the same name." ), + i18n( "Configuration" ) ); + return ; + } + } + m_lb_int->insertItem( interface ); + + + KMFUndoEngine::instance()->startTransaction( + m_target->config(), + i18n( "Edit interfaces for target: %1.").arg( m_target->guiName() ) + ); + m_target->config()->setInterfaces( interfaces() ); + KMFUndoEngine::instance()->endTransaction(); + +} + +void KMFInterfaceWidget::addInterface( const QString& interface ) { + for ( uint i = 0;i < m_lb_int->count();i++ ) { + QString interf = m_lb_int->text( i ); + if ( interface == interf ) { + KMessageBox::sorry( this, i18n( "You cannot have more then one interface with the same name." ), + i18n( "Configuration" ) ); + return ; + } + } + m_lb_int->insertItem( interface ); +} + +void KMFInterfaceWidget::addInterfaces( QStringList interfcaes ) { + m_lb_int-> insertStringList( interfcaes ); +} + +void KMFInterfaceWidget::slotDelInterface() { + int index = m_lb_int->currentItem(); + if ( index > -1 ) { + switch ( QMessageBox::warning( this, i18n( "Configuration" ), + i18n( "Are you sure that you want to delete\n" + "this interface?\n" ), + i18n( "&OK" ), i18n( "&Cancel" ), + 0, 2 ) ) { + + case 0: // OK clicked + m_lb_int->removeItem( index ); + KMFUndoEngine::instance()->startTransaction( + m_target->config(), + i18n( "Edit interfaces for target: %1.").arg( m_target->guiName() ) + ); + m_target->config()->setInterfaces( interfaces() ); + KMFUndoEngine::instance()->endTransaction(); + break; + } + + } else { + KMessageBox::sorry( this, i18n( "You have to select an interface first before you can delete it." ), + i18n( "Configuration" ) ); + return ; + + } +} + +void KMFInterfaceWidget::clear() { + m_lb_int->clear(); +} + +QStringList KMFInterfaceWidget::interfaces() { + QStringList ifs; + for ( uint i = 0;i < m_lb_int->count();i++ ) { + QString interf = m_lb_int->text( i ); + if ( !interf.isEmpty() ) { + kdDebug() << "Found Interface " << interf << endl; + ifs << interf; + } + } + return ifs; +} + +} +#include "kmfinterfacewidget.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfinterfacewidget.h b/kmyfirewall/kmfwidgets/kmfinterfacewidget.h new file mode 100644 index 0000000..cd898bd --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfinterfacewidget.h @@ -0,0 +1,63 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef KMFINTERFACEWIDGET_H +#define KMFINTERFACEWIDGET_H + +#include "kmyfirewallinterfacewidget.h" + +#include <qstring.h> + +#include <qguardedptr.h> + +class QStringList; + +namespace KMF { +class KMFTarget; + +class KMFInterfaceWidget : public KMyFirewallInterfaceWidget { + Q_OBJECT + +public: + KMFInterfaceWidget( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~KMFInterfaceWidget(); + /*$PUBLIC_FUNCTIONS$*/ + void addInterface( const QString& interface ); + void addInterfaces( QStringList interfaces ); + void clear(); + + void loadTarget( KMFTarget* target ); + + QStringList interfaces(); + +public slots: + /*$PUBLIC_SLOTS$*/ + void slotDelInterface(); + void slotAddInterface(); + + +protected: + /*$PROTECTED_FUNCTIONS$*/ + void updateView(); + +protected slots: + /*$PROTECTED_SLOTS$*/ + +signals: + void sigTargetChanged(); + +private: + QGuardedPtr<KMFTarget> m_target; +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmfiptdocoptions.cpp b/kmyfirewall/kmfwidgets/kmfiptdocoptions.cpp new file mode 100644 index 0000000..32599b8 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfiptdocoptions.cpp @@ -0,0 +1,88 @@ +/*************************************************************************** + begin : Wed Aug 21 2002 + copyright : (C) 2002 by Christian Hubinger + email : chubinger@irrsinnig.org.orphi.iki +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kmfiptdocoptions.h" + + +// qt includes +#include <qcheckbox.h> + +// kde includes +#include <kdebug.h> +#include <kapplication.h> +#include <kmessagebox.h> +#include <klocale.h> + +// project includes +#include "../core/kmfdoc.h" +#include "../core/kmfiptdoc.h" +#include "../core/kmfundoengine.h" +#include "../core/kmfnetwork.h" +#include "../core/kmftarget.h" +namespace KMF { +KMFIPTDocOptions::KMFIPTDocOptions( QWidget *parent, const char *name ) : KMyFirewallIPTDocOptions( parent, name ) {} + +KMFIPTDocOptions::~KMFIPTDocOptions() {} + +void KMFIPTDocOptions::loadDoc( KMFIPTDoc* doc ) { + kdDebug() << "void KMFIPTDocOptions::loadDoc(KMFIPTDoc* doc)" << endl; + kmfdoc = doc; + c_use_filter->setChecked( kmfdoc->useFilter() ); + c_use_nat->setChecked( kmfdoc->useNat() ); + c_use_mangle->setChecked( kmfdoc->useMangle() ); + c_use_ipfwd->setChecked( kmfdoc->useIPFwd() ); + c_use_rp_filter->setChecked( kmfdoc->useRPFilter() ); + c_use_martians->setChecked( kmfdoc->useMartians() ); + c_use_syn_cookies->setChecked( kmfdoc->useSynCookies() ); + c_use_modules->setChecked( kmfdoc->useModules() ); +} +void KMFIPTDocOptions::accept() { + if ( ! c_use_filter->isChecked() && ! c_use_nat->isChecked() && ! c_use_mangle->isChecked() ) { + KMessageBox::sorry(this, i18n("<p>Sorry, you need to use at least one of the three tables -- <b> filter, nat</b> or <b>mangle</b>:<br>it does not make any sense to work on a ruleset where you cannot add any rules.</p>") ); + return; + } + + + KMFUndoEngine::instance()->startTransaction( + kmfdoc, + i18n( "Edit document settings for target: %1.").arg( kmfdoc->target()->guiName() ) + ); + kmfdoc->setUseFilter( c_use_filter->isChecked() ); + kmfdoc->setUseNat( c_use_nat->isChecked() ); + kmfdoc->setUseMangle( c_use_mangle->isChecked() ); + kmfdoc->setUseIPFwd( c_use_ipfwd->isChecked() ); + if ( c_use_rp_filter->isChecked() ) { + kmfdoc->setUseRPFilter( true ); + kmfdoc->setUseMartians( c_use_martians->isChecked() ); + } else { + kmfdoc->setUseRPFilter( false ); + kmfdoc->setUseMartians( false ); + } + kmfdoc->setUseSynCookies( c_use_syn_cookies->isChecked() ); + kmfdoc->setUseModules( c_use_modules->isChecked() ); + // kmfdoc->network()->changed(); + KMFUndoEngine::instance()->endTransaction(); + emit sigConfigChanged(); + QDialog::accept(); +} + +void KMFIPTDocOptions::slotHelp() { + kdDebug() << "void KMFIPTDocOptions::slotHelp() {" << endl; + kapp->invokeHelp(); +} + +} +#include "kmfiptdocoptions.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfiptdocoptions.h b/kmyfirewall/kmfwidgets/kmfiptdocoptions.h new file mode 100644 index 0000000..a4dd317 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfiptdocoptions.h @@ -0,0 +1,49 @@ +/*************************************************************************** + begin : Wed Aug 21 2002 + copyright : (C) 2002 by Christian Hubinger + email : chubinger@irrsinnig.org.orphi.iki +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KMFIPTDOCOPTIONS_H +#define KMFIPTDOCOPTIONS_H + +#include <qwidget.h> +#include <kdemacros.h> +#include "kmyfirewalliptdocoptions.h" + +/** + *@author Christian Hubinger + */ + +class QString; + +namespace KMF { +class KMFIPTDoc; + +class KDE_EXPORT KMFIPTDocOptions : public KMyFirewallIPTDocOptions { + Q_OBJECT +public: + KMFIPTDocOptions( QWidget *parent = 0, const char *name = 0 ); + ~KMFIPTDocOptions(); + void loadDoc( KMFIPTDoc* doc ); + +public slots: + void slotHelp(); + void accept(); +private: + KMFIPTDoc* kmfdoc; +signals: + void sigConfigChanged(); + +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfiptdocview.cpp b/kmyfirewall/kmfwidgets/kmfiptdocview.cpp new file mode 100644 index 0000000..ee5e91b --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfiptdocview.cpp @@ -0,0 +1,110 @@ +// +// C++ Implementation: kmfiptdocview +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2005 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "kmfiptdocview.h" + +// QT includes + + +// KDE includes +#include <kdebug.h> + +// Project includes +#include "../core/kmfiptdoc.h" +#include "../core/kmfdoc.h" +#include "../core/iptable.h" +#include "../core/xmlnames.h" +namespace KMF { +KMFIPTDocView::KMFIPTDocView(QWidget *parent, const char *name) : QTabWidget(parent, name) +{ + loaded = false; + m_iptViewFilter = new KMFListView( 0, "view" ); + m_iptViewNat = new KMFListView( 0, "view" ); + m_iptViewMangle = new KMFListView( 0, "view" ); + addTab( m_iptViewFilter, "Filter" ); + addTab( m_iptViewNat, "Nat" ); + addTab( m_iptViewMangle, "Mangle" ); + + m_iptViewFilter ->setEnabled( true ); + m_iptViewFilter->clear(); + m_iptViewFilter->slotUpdateView(); + + m_iptViewNat ->setEnabled( true ); + m_iptViewNat->clear(); + m_iptViewNat->slotUpdateView(); + + m_iptViewMangle ->setEnabled( true ); + m_iptViewMangle->clear(); + m_iptViewMangle->slotUpdateView(); + + setMinimumSize( 600, 400 ); +} + + +KMFIPTDocView::~KMFIPTDocView() +{ +} + +void KMFIPTDocView::slotLoadDoc( KMFIPTDoc *iptdoc ) { + kdDebug() << "void KMFIPTDocView::slotLoadDoc( KMFIPTDoc *iptdoc )" << endl; + if ( ! loaded ) { + m_iptViewMangle->clear(); + m_iptViewFilter->slotLoadNode( iptdoc->table( Constants::FilterTable_Name ) ); + m_iptViewFilter->slotUpdateView(); + m_iptViewMangle->clear(); + m_iptViewNat->slotLoadNode( iptdoc->table( Constants::NatTable_Name ) ); + m_iptViewFilter->slotUpdateView(); + m_iptViewMangle->clear(); + m_iptViewMangle->slotLoadNode( iptdoc->table( Constants::MangleTable_Name ) ); + m_iptViewFilter->slotUpdateView(); + loaded = true; + } else { + + m_iptViewFilter->slotUpdateView( iptdoc->table( Constants::FilterTable_Name ) ); + m_iptViewFilter->slotUpdateView(); + + m_iptViewNat->slotUpdateView( iptdoc->table( Constants::NatTable_Name ) ); + m_iptViewNat->slotUpdateView(); + + m_iptViewMangle->slotUpdateView( iptdoc->table( Constants::MangleTable_Name ) ); + m_iptViewMangle->slotUpdateView(); + } +} + +void KMFIPTDocView::slotLoadTable( IPTable* ) { + +} + +void KMFIPTDocView::close() { + kdDebug() << "void KMFIPTDocView::close()" << endl; + emit closing(); + QTabWidget::close(); +} + +void KMFIPTDocView::show() { + kdDebug() << "void KMFIPTDocView::show()" << endl; + emit showing(); + QTabWidget::show(); + m_iptViewFilter->slotUpdateView(); + m_iptViewNat->slotUpdateView(); + m_iptViewMangle->slotUpdateView(); +} + +void KMFIPTDocView::hide() { + kdDebug() << "void KMFIPTDocView::hide()" << endl; + emit closing(); + QTabWidget::hide(); +} + + +} + +#include "kmfiptdocview.moc" diff --git a/kmyfirewall/kmfwidgets/kmfiptdocview.h b/kmyfirewall/kmfwidgets/kmfiptdocview.h new file mode 100644 index 0000000..88093d4 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfiptdocview.h @@ -0,0 +1,69 @@ +// +// C++ Interface: kmfiptdocview +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2005 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef KMFIPTDOCVIEW_H +#define KMFIPTDOCVIEW_H + +#include <qtabwidget.h> + + +#include "kmflistview.h" + +// Project includes + +namespace KMF { +class KMFIPTDoc; +class IPTable; + +/** +@author Christian Hubinger +*/ +class KMFIPTDocView : public QTabWidget +{ +Q_OBJECT +public: + KMFIPTDocView(QWidget *parent = 0, const char *name = 0); + + ~KMFIPTDocView(); + +KMFListView* filterView() const { + return m_iptViewFilter; +}; + +KMFListView* natView() const { + return m_iptViewNat; +}; + +KMFListView* mangleView() const { + return m_iptViewMangle; +}; + + +public slots: + void slotLoadDoc( KMFIPTDoc* ); + void slotLoadTable( IPTable* ); + void close(); + void show(); + void hide(); + +private: + KMFListView *m_iptViewFilter; + KMFListView *m_iptViewNat; + KMFListView *m_iptViewMangle; + bool loaded; + +signals: + void closing(); + void showing(); + +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfipv4addresswidget.cpp b/kmyfirewall/kmfwidgets/kmfipv4addresswidget.cpp new file mode 100644 index 0000000..8a19942 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfipv4addresswidget.cpp @@ -0,0 +1,117 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#include "kmfipv4addresswidget.h" + +// QT includes +#include <qlistview.h> +#include <qcheckbox.h> +#include <qspinbox.h> +#include <qcombobox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qgroupbox.h> +#include <qwidgetstack.h> +#include <qtextedit.h> +#include <qtimer.h> + + +// KDE includes +#include <kdebug.h> +#include <klocale.h> +#include <klistview.h> +#include <kcombobox.h> +#include <kpopupmenu.h> +#include <kiconloader.h> +#include <kinputdialog.h> +#include <knuminput.h> + +// Project includes +#include "../core/ipaddress.h" +namespace KMF { +KMFIPv4AddressWidget::KMFIPv4AddressWidget ( QWidget* parent, const char* name, WFlags fl ) + : KMyFirewallIPv4AdddressWidget ( parent,name,fl ) { + +// m_address = new IPAddress( 0,0,0,0 ); + connect( m_sb_from_1, SIGNAL( valueChanged( const QString& ) ), + this, SLOT( slotAddressChanged( const QString& ) ) ); + connect( m_sb_from_2, SIGNAL( valueChanged( const QString& ) ), + this, SLOT( slotAddressChanged( const QString& ) ) ); + connect( m_sb_from_3, SIGNAL( valueChanged( const QString& ) ), + this, SLOT( slotAddressChanged( const QString& ) ) ); + connect( m_sb_from_4, SIGNAL( valueChanged( const QString& ) ), + this, SLOT( slotAddressChanged( const QString& ) ) ); +} + +KMFIPv4AddressWidget::~KMFIPv4AddressWidget() {} + +/*$SPECIALIZATION$*/ + +void KMFIPv4AddressWidget::loadIPAddress( int d0, int d1, int d2, int d3 ) { + kdDebug() << "KMFIPv4AddressWidget::loadIPAddress( " + << d0 << "." + << d1 << "." + << d2 << "." + << d3 << " )" << endl; + + + + m_sb_from_1->blockSignals( true ); + m_sb_from_2->blockSignals( true ); + m_sb_from_3->blockSignals( true ); + m_sb_from_4->blockSignals( true ); + + m_sb_from_1->setValue( d0 ); + m_sb_from_2->setValue( d1 ); + m_sb_from_3->setValue( d2 ); + m_sb_from_4->setValue( d3 ); + + m_sb_from_1->blockSignals( false ); + m_sb_from_2->blockSignals( false ); + m_sb_from_3->blockSignals( false ); + m_sb_from_4->blockSignals( false ); + + m_sb_from_1->setEnabled( true ); + m_sb_from_2->setEnabled( true ); + m_sb_from_3->setEnabled( true ); + m_sb_from_4->setEnabled( true ); + + // m_address->setAddress( d0, d1, d2, d3 ); +} + +void KMFIPv4AddressWidget::slotAddressChanged( const QString& ) { + kdDebug() << "KMFIPv4AddressWidget::slotAddressChanged( const QString& )" << endl; + /* + if ( ! m_address ) { + return; + } + + const QString& newAddr = m_sb_from_1->text() +"."+ + m_sb_from_2->text() +"."+ + m_sb_from_3->text() +"."+ + m_sb_from_4->text(); + if ( m_address->toString() == newAddr ) { + return; + }*/ + + emit sigAddressChanged( + m_sb_from_1->value(), + m_sb_from_2->value(), + m_sb_from_3->value(), + m_sb_from_4->value() ); +} + +} + +#include "kmfipv4addresswidget.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfipv4addresswidget.h b/kmyfirewall/kmfwidgets/kmfipv4addresswidget.h new file mode 100644 index 0000000..3ae2a6b --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfipv4addresswidget.h @@ -0,0 +1,52 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef KMFIPV4ADDRESSWIDGET_H +#define KMFIPV4ADDRESSWIDGET_H + +#include "kmyfirewallipv4adddresswidget.h" + +// QT include +#include <qguardedptr.h> + +namespace KMF { +class IPAddress; + +class KMFIPv4AddressWidget : public KMyFirewallIPv4AdddressWidget { + Q_OBJECT + + public: + KMFIPv4AddressWidget ( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~KMFIPv4AddressWidget(); + void loadIPAddress( int, int, int, int ); + + /*$PUBLIC_FUNCTIONS$*/ + + public slots: + /*$PUBLIC_SLOTS$*/ + + protected: + /*$PROTECTED_FUNCTIONS$*/ + + protected slots: + /*$PROTECTED_SLOTS$*/ + void slotAddressChanged( const QString& ); + + private: +// IPAddress *m_address; + + signals: + void sigAddressChanged( int, int, int, int ); +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmflistview.cpp b/kmyfirewall/kmfwidgets/kmflistview.cpp new file mode 100644 index 0000000..072e348 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmflistview.cpp @@ -0,0 +1,1148 @@ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +/* +Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2001-2004 +*/ + + + +#include "kmflistview.h" + +// QT includes +#include <qstring.h> +#include <qptrlist.h> +#include <kiconloader.h> + +// KDE includes +#include <kapplication.h> +#include <kdebug.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kconfig.h> + +// Project includes +#include "../core/netfilterobject.h" +#include "../core/kmfdoc.h" +#include "../core/iptable.h" +#include "../core/iptchain.h" +#include "../core/iptrule.h" +#include "../core/iptruleoption.h" +#include "../core/kmfconfig.h" +#include "../core/kmfappstate.h" +#include "../core/xmlnames.h" +#include "../kmyfirewall.h" +#include "kmflistviewitem.h" +namespace KMF { +KMFListView::KMFListView( QWidget *parent, const char *name ) : KListView( parent, name ) { + loadIcons(); + connect( this, SIGNAL( sigLoadNode( NetfilterObject* ) ), + this, SLOT( slotLoadNode( NetfilterObject* ) ) ); + cast_error = i18n( "ERROR: Wrong ListViewItem Class used!\nThis is no KMFListViewItem" ); + setSorting(0,true); + m_show_desc = true; + m_show_cmds = false; + m_show_objectID = false; + m_NetfilterObject = 0; + + + addColumn( i18n( "Rule No." ) ); + addColumn( QString::null ); + addColumn( i18n( "Value" ) ); + setSizePolicy( QSizePolicy( ( QSizePolicy::SizeType ) 2, ( QSizePolicy::SizeType ) 2, 0, 0, + sizePolicy().hasHeightForWidth() ) ); + setFrameShape( KListView::StyledPanel ); + setFrameShadow( KListView::Sunken ); + setSorting( 0, true ); + setFullWidth( true ); + setItemsMovable( true ); + setDropHighlighter( true ); + setDropVisualizer( true ); + setSelectionMode( QListView::Single ); + +} + + +KMFListView::~KMFListView() {} + +void KMFListView::slotLoadNode( NetfilterObject* node ) { + kdDebug() << "void KMFListView::loadNode( NetfilterObject* node )" << endl; + if ( ! node ) { + kdDebug() << "node == 0" << endl; + return; + } + m_NetfilterObject = node; + + if ( m_NetfilterObject->type() == NetfilterObject::TABLE ) { + if ( IPTable * table = dynamic_cast<IPTable*> ( node ) ) { + bool changed = false; + if ( KMFConfig::showDocumentation() ) { + if ( ! m_show_desc ) + changed = true; + m_show_desc = true; + } else { + if ( m_show_desc ) + changed = true; + m_show_desc = false; + } + if ( KMFConfig::showCommandLine() ) { + if ( ! m_show_cmds ) + changed = true; + m_show_cmds = true; + } else { + if ( m_show_cmds ) + changed = true; + m_show_cmds = false; + } + if ( KMFConfig::showObjectID() ) { + if ( ! m_show_objectID ) + changed = true; + m_show_objectID = true; + } else { + if ( m_show_objectID ) + changed = true; + m_show_objectID = false; + } + setUpdatesEnabled( false ); + setupTableView( table ); + setUpdatesEnabled( true ); + sort(); + triggerUpdate(); + } else { + KMessageBox::error( this, i18n( "Found invalid ListViewItem." ), i18n( "Found invalid ListViewItem." ) ); + } + } +} + +void KMFListView::slotUpdateView() { + kdDebug() << "KMFListView::slotUpdateView()." << endl; + if ( ! m_NetfilterObject ) { + kdDebug() << "m_NetfilterObject = 0" << endl; + return ; + } + if ( ! KMFAppState::upAndRunning() ) { + kdDebug() << "Doing Nothing during startup." << endl; + this->clearAllItems(); + return; + } +/* if ( ! KMFAppState::hasOpenDoc() ) { + kdDebug() << "No Open doc. disabling view!" << endl; + this->clearAllItems(); + setEnabled( false ); + return; + }*/ + setEnabled( true ); + emit sigLoadNode( m_NetfilterObject ); +} + +void KMFListView::slotUpdateView( NetfilterObject* obj ) { + if ( ! obj ) + return; + if ( ! KMFAppState::upAndRunning() ) { + kdDebug() << "Doing Nothing during startup." << endl; + this->clearAllItems(); + return; + } + if ( obj->type() == NetfilterObject::TABLE ) { + if ( ! m_NetfilterObject ) + return; + emit sigLoadNode( m_NetfilterObject ); + } else if ( obj->type() == NetfilterObject::CHAIN ) { + if ( IPTChain* chain = dynamic_cast<IPTChain*>( obj ) ) { + if ( KMFListViewItem* item = findKMFItem( chain->name(), 2, chain->uuid() ) ) { + if ( KMFListViewItem* parent = dynamic_cast<KMFListViewItem*>( item->parent() ) ) { + emit sigLoadNode( m_NetfilterObject ); +// kdDebug() << "Starting update for Chain Item..." << endl; + setUpdatesEnabled( false ); + setupChainView( chain, parent ); + setUpdatesEnabled( true ); + triggerUpdate(); +// kdDebug() << "Finished update for Chain Item." << endl; + } + } + } + } else if ( obj->type() == NetfilterObject::RULE ) { + if ( IPTRule* rule = dynamic_cast<IPTRule*>( obj ) ) { + if ( KMFListViewItem* item = findKMFItem( rule->name(), 2, rule->uuid()) ) { + if ( KMFListViewItem* parent = dynamic_cast<KMFListViewItem*>( item->parent() ) ) { +// kdDebug() << "Starting update for Rule Item..." << endl; + setUpdatesEnabled( false ); + setupRuleView( rule, parent ); + setUpdatesEnabled( true ); + triggerUpdate(); +// kdDebug() << "Finished update for Rule Item." << endl; + } + } + } + } +} + +KMFListViewItem* KMFListView::getRootItem() { + KMFListViewItem * item = dynamic_cast<KMFListViewItem*>( firstChild() ); + if ( item ) { + return item; + } else { + return 0; + } +} + +void KMFListView::slotChangeRoot( QListViewItem* /*item*/ ) { + // if ( ! item || item == 0) + // return; + // + // if ( KMFListViewItem * tmp_item = dynamic_cast<KMFListViewItem *>( item ) ) { + // if ( tmp_item == 0 || ! tmp_item ) + // return ; + // if ( tmp_item->isTopItem() && tmp_item->type() == KMFListViewItem::RULEOPTION ) + // if ( tmp_item->ruleOption() ) + // emit sigLoadNode( tmp_item->ruleOption() ); + // if ( tmp_item->isTopItem() && tmp_item->type() == KMFListViewItem::RULE ) + // if ( tmp_item->rule() ) + // emit sigLoadNode( tmp_item->rule() ); + // if ( tmp_item->isTopItem() && tmp_item->type() == KMFListViewItem::CHAIN ) + // if ( tmp_item->chain() ) + // emit sigLoadNode( tmp_item->chain() ); + // if ( tmp_item->isTopItem() && tmp_item->type() == KMFListViewItem::TABLE ) + // if ( tmp_item->table() ) + // emit sigLoadNode( tmp_item->table() ); + // } +} + +void KMFListView::setupTableView( IPTable* table ) { +// kdDebug() << "KMFListView::setupTableView(IPTable* table, KMFListViewItem* item )" << endl; + if ( ! table ) + return ; + KMFListViewItem* item = 0; + item = findKMFItem( table->name(), 2, table->uuid() ); + if ( ! item ) { + item = new KMFListViewItem( this, 0, table ); + item->setOpen( true ); + } + + item->sortChildItems( 0, true ); + item->setTopItem( true ); + item->setInUse( true ); + item->setOpen( true ); + item->setText( 0, i18n( "Table:" ) ); + item->setPixmap( 0 , icon_table ); + item->setText( 2, table->name() ); + + QPtrList<IPTChain> chains = table->chains(); + QPtrList<IPTChain> used_chains; + for ( int i = chains.count(); i >= 0; i-- ) { + IPTChain* chain = 0; + chain = chains.at( i ); + if ( chain ) { + used_chains.append ( chain ); + QString str_obj_id = ""; + str_obj_id = chain->uuid().toString(); + + if ( m_existed_chains.findIndex ( chain->name() + "|" + str_obj_id ) == -1 ) + m_existed_chains.append ( chain->name() + "|" + str_obj_id ); + + if ( ! m_dict_existed_rules.find( chain->uuid() ) ) { + m_dict_existed_rules.insert( chain->uuid().toString(), new QStringList ); + } + setupChainView( chain, item ); + } + } + if ( ! m_existed_chains.isEmpty() ) { + for ( QStringList::Iterator it = m_existed_chains.begin(); it != m_existed_chains.end(); ++it ) { + QString existed_chain_name_id = *it; + int delimiter = existed_chain_name_id.find( "|" ); + QString existed_chain_name = existed_chain_name_id.left( delimiter ); + QString existed_chain_id_str = existed_chain_name_id.right( existed_chain_name_id.length() - delimiter - 1 ); +/* QUuid existed_obj_id = -1; + bool ok; + existed_obj_id = existed_chain_id_str.toInt( &ok );*/ + QUuid existed_obj_id( existed_chain_id_str ); +// kdDebug() << "Found Existed Name: " << existed_chain_name << " ID: " << existed_obj_id << endl; + bool have = false; + QPtrListIterator<IPTChain> it2( used_chains ); + IPTChain* used_chain = 0; + while ( it2.current() ) { + used_chain = it2.current(); +// kdDebug() << "Entering: while ( used_chain )" << endl; + ++it2; + if ( existed_chain_name == used_chain->name() ) { +// kdDebug() << "Chain: " << used_chain->name() << " already existed:" << endl; + have = true; + } + } + if ( ! have ) { +// kdDebug() << "Chain: " << existed_chain_name << " could not be found" << endl; + KMFListViewItem* del_item = findKMFItem( existed_chain_name, 2, existed_obj_id ); + if ( del_item ) { +// kdDebug() << "Chain: " << existed_chain_name << " was DELETED:" << endl; + delete del_item; + } + } + } + } + + m_existed_chains.clear(); + QPtrListIterator<IPTChain> it3 ( used_chains ); + while ( it3.current() ) { + IPTChain * chain = it3.current(); + ++it3; + QString str_obj_id = chain->uuid().toString(); + // str_obj_id = str_obj_id.setNum( chain->uuid() ); + + m_existed_chains.append( chain->name() + "|" + str_obj_id ); + } + + KMFListViewItem * item_desc = 0; + item_desc = findKMFItem( i18n( "Documentation:" ), 0, table->uuid() ); + + if ( !table->description().isEmpty() && m_show_desc ) { + if ( ! item_desc ) { + item_desc = new KMFListViewItem( item, 0, table ); + } + + item_desc->setInUse( true ); + item_desc->setMultiLinesEnabled( true ); + item_desc->setText( 0, i18n( "Documentation:" ) ); + item_desc->setPixmap( 1, icon_rename ); + item_desc->setText( 2, table->description() ); + + } else if ( item_desc ) { + delete item_desc; + } + + + KMFListViewItem* item_obj_id = 0; + item_obj_id = findKMFItem( i18n( "Object ID:" ), 0, table->uuid(),true,item ); + + if ( KMFConfig::showObjectID() ) { + if ( ! item_obj_id ) { + item_obj_id = new KMFListViewItem( item, 0, table ); + } + item_obj_id->setInUse( true ); + item_obj_id->setText( 0, i18n( "Object ID:" ) ); + item_obj_id->setText( 2, table->uuid().toString() ); + } else if ( item_obj_id ) { + delete item_obj_id; + } +// kdDebug() << "Sorting Table Item Children..." << endl; + item->sort(); +} + +void KMFListView::setupChainView( IPTChain* chain, KMFListViewItem* parent ) { +// kdDebug() << "KMFListView::setupChainView( IPTChain* chain, KMFListViewItem* item )" << endl; + if ( ! chain || ! parent ) + return ; + + KMFListViewItem * item = 0; + item = findKMFItem( chain->name(), 2, chain->uuid(), true, parent ); + if ( ! item ) { +// kdDebug() << "No Item for Chain: " << chain->name() << " found.\nNeed to create a new one." << endl; + item = new KMFListViewItem( parent, 0, chain ); + } + item->sortChildItems( 0, true ); + item->setTopItem( true ); + item->setInUse( true ); + QPixmap icon_null; + item->setText( 0, i18n( "Chain:" ) ); + if ( chain->isBuildIn() ) { + item->setPixmap( 0, icon_builtin ); + } else { + item->setPixmap( 0, icon_user ); + } + + if ( chain->logging() ) { + item->setPixmap( 1, icon_log ); + } else { + item->setPixmap( 1, icon_null ); + } + QString chain_name = chain->name(); + item->setText( 2, chain_name ); + + + KMFListViewItem * i_chain_cmd = 0; + i_chain_cmd = findKMFItem( i18n( "Cmd:" ), 0, chain->uuid(), true, item ); + + if ( ! chain->isBuildIn() && m_show_cmds ) { + if ( ! i_chain_cmd ) { + i_chain_cmd = new KMFListViewItem( item , 0, chain ); + } + QString tmp_cmd = chain->createIPTablesChainDefinition(); + // kdDebug() << "Setting up item: i_chain_cmd" << endl; + i_chain_cmd->setInUse( true ); + i_chain_cmd->setText( 0, i18n( "Cmd:" ) ); + i_chain_cmd->setPixmap( 0, icon_cmd ); + i_chain_cmd->setText( 2, tmp_cmd ); + } else if ( i_chain_cmd ) { + delete i_chain_cmd; + } + + // logging+++++++++++++++++++++++++++++++++++++++++++++++++++ + // kdDebug() << "Setting up item: i_chain_log" << endl; + bool logging = chain->logging(); + KMFListViewItem * i_chain_log = 0; + i_chain_log = findKMFItem( i18n( "Chain logging:" ), 0, chain->uuid(), true, item ); + + if ( ! logging && i_chain_log ) { + delete i_chain_log; + } + + if ( logging ) { + if ( ! i_chain_log ) { + i_chain_log = new KMFListViewItem( item, 0, chain ); + i_chain_log->setOpen( true ); + } + i_chain_log->setInUse( true ); + i_chain_log->setText( 0, i18n( "Chain logging:" ) ); + // kdDebug() << "Logging enabled" << endl; + // i_chain_log->setPixmap( 1, icon_log ); + i_chain_log->setText( 2, i18n( "Dropped Packets" ) ); + QString limit = chain->logLimit(); + QString prefix = chain->logPrefix(); + QString burst = chain->logBurst(); + KMFListViewItem * i_limit = 0; + i_limit = findKMFItem( i18n( "Limit rate:" ), 0, chain->uuid(), true, i_chain_log ); + + + if ( ( limit.isEmpty() || limit == XML::Undefined_Value ) && i_limit ) { + delete i_limit; + } else + if ( ! limit.isEmpty() && limit != XML::Undefined_Value ) { + if ( ! i_limit ) { + i_limit = new KMFListViewItem( i_chain_log, 0, chain ); + i_limit->setOpen( true ); + } + + i_limit->setInUse( true ); + i_limit->setText( 0, i18n( "Limit rate:" ) ); + i_limit->setText( 2, limit ); + + KMFListViewItem * i_burst = 0; + i_burst = findKMFItem( i18n( "Limit burst:" ), 0, chain->uuid(), true, i_chain_log ); + + if ( ( burst.isEmpty() || burst == XML::Undefined_Value ) && i_burst ) { + delete i_burst; + } + + if ( ! burst.isEmpty() && burst != XML::Undefined_Value ) { + // kdDebug() << "Setting up item: i_burst" << endl; + if ( ! i_burst ) { + i_burst = new KMFListViewItem( i_chain_log, i_limit, chain ); + i_burst->setOpen( true ); + } + i_burst->setInUse( true ); + i_burst->setText( 0, i18n( "Limit burst:" ) ); + i_burst->setText( 2, burst ); + } + } + + KMFListViewItem* i_prefix = 0; + i_prefix = findKMFItem( i18n( "Log prefix:" ), 0, chain->uuid(), true, i_chain_log ); + + if ( ( prefix.isEmpty() || prefix == XML::Undefined_Value ) && i_prefix ) { + delete i_prefix; + } + + if ( ! prefix.isEmpty() && prefix != XML::Undefined_Value ) { + // kdDebug() << "Setting up item: i_prefix" << endl; + if ( ! i_prefix ) { + i_prefix = new KMFListViewItem( i_chain_log, 0, chain ); + i_prefix->setOpen( true ); + } + i_prefix->setInUse( true ); + i_prefix->setText( 0, i18n( "Log prefix:" ) ); + i_prefix->setText( 2, prefix ); + + } + } + + // // chain feeds++++++++++++++++++++++++++++++++++++++++++++ + QString str = chain->name(); + QPtrList<IPTRule> feeds = chain->chainFeeds(); + bool buildin = chain->isBuildIn(); + // kdDebug() << "Setting up item: i_chain_feeds" << endl; + KMFListViewItem * i_chain_feeds = 0; + i_chain_feeds = findKMFItem( i18n( "Chain Feeds:" ), 0, chain->uuid(), true, item ); + if ( ! i_chain_feeds ) { + if ( logging ) + i_chain_feeds = new KMFListViewItem( item, i_chain_log, chain ); + else + i_chain_feeds = new KMFListViewItem( item, item, chain ); + i_chain_feeds->setOpen( true ); + } + i_chain_feeds->setText( 0, i18n( "Chain Feeds:" ) ); + i_chain_feeds->setInUse( true ); + if ( buildin ) { + i_chain_feeds->setText( 2, i18n( "System Feed" ) ); + } else { + int number = feeds.count(); + QString num_feed = i18n( "1 Feed", "%n Feeds", number ); + i_chain_feeds->setText( 2, num_feed ); + i_chain_feeds->setInUse( true ); + i_chain_feeds->deleteChildren(); + IPTRule *curr_rule = 0; + QPtrList<KMFListViewItem> used_items; + if ( ! feeds.isEmpty() ) { + i_chain_feeds->setPixmap( 0, icon_feed ); + QPtrListIterator<IPTRule> it( feeds ); + while ( it.current() ) { + curr_rule = it.current(); + ++it; + KMFListViewItem * item_feeds = new KMFListViewItem( i_chain_feeds, chain ); + item_feeds->setInUse( true ); + item_feeds->setText( 0, i18n( "From chain: %1" ).arg( curr_rule->chain() ->name() ) ); + item_feeds->setPixmap( 2, icon_rule ); + item_feeds->setText( 2, curr_rule->name() ); + } + } + } + // //chain fwds++++++++++++++++++++++++++++++++++++++++++++++++ + QPtrList<IPTRule> fwds = chain->chainFwds(); + + // kdDebug() << "Setting up item: i_chain_fwds" << endl; + KMFListViewItem * i_chain_fwds = 0; + i_chain_fwds = findKMFItem( i18n( "Chain forwards:" ), 0, chain->uuid(), true, item ); + if ( ! i_chain_fwds ) { + i_chain_fwds = new KMFListViewItem( item, i_chain_feeds, chain ); + i_chain_fwds->setOpen( true ); + } + + int number2 = fwds.count(); + QString num_fwd = i18n( "1 Forward", "%n Forwards", number2 ); + i_chain_fwds->setInUse( true ); + i_chain_fwds->setText( 0, i18n( "Chain forwards:" ) ); + i_chain_fwds->setText( 2, num_fwd ); + +// QPtrList<KMFListViewItem> used_items; + i_chain_fwds->deleteChildren(); + if ( !fwds.isEmpty() ) { + i_chain_fwds->setPixmap( 0, icon_fwds ); + IPTRule * curr_rule; + QPtrListIterator<IPTRule> it( fwds ); + while ( it.current() ) { + curr_rule = it.current(); + ++it; + KMFListViewItem * item_fwds = new KMFListViewItem( i_chain_fwds, chain ); + item_fwds->setInUse( true ); + item_fwds->setPixmap( 0, icon_rule ); + item_fwds->setText( 0, i18n( "Rule: %1" ).arg( curr_rule->name() ) ); + item_fwds->setPixmap( 1, icon_fwd ); + item_fwds->setText( 2, curr_rule->target() ); + } + } + + + //########### Start Rules #################### + QPtrList<IPTRule> tmp_ruleset = chain->chainRuleset(); + + // kdDebug() << "Setting up item: i_chain_allrules" << endl; + KMFListViewItem* i_chain_allrules = 0; + i_chain_allrules = findKMFItem( i18n( "Rule(s):" ), 0, chain->uuid(), true, item ); + if ( ! i_chain_allrules ) { + i_chain_allrules = new KMFListViewItem( item, i_chain_fwds, chain ); + i_chain_allrules->setOpen( TRUE ); + } + i_chain_allrules->sortChildItems( 0, true ); + + int number3 = tmp_ruleset.count(); + QString num_rules = i18n( "1 Rule", "%n Rules", number3 ); + i_chain_allrules->setInUse( true ); + i_chain_allrules->setText( 0, i18n( "Rule(s):" ) ); + i_chain_allrules->setPixmap( 0, icon_rule ); + i_chain_allrules->setText( 2, num_rules ); + + QPtrList<IPTRule> used_rules; + QStringList *existed_rules = m_dict_existed_rules.find( chain->uuid() ); + + if ( existed_rules ) { + if ( !tmp_ruleset.isEmpty() ) { + IPTRule * curr_rule; + for ( curr_rule = tmp_ruleset.last(); curr_rule; curr_rule = tmp_ruleset.prev() ) { +// kdDebug() << "Entering: for ( curr_rule = tmp_ruleset.last(); curr_rule; curr_rule = tmp_ruleset.prev() )" << endl; + used_rules.append( curr_rule ); + if ( existed_rules->findIndex ( curr_rule->name() + "|" + curr_rule->uuid().toString() ) == -1 ) { + existed_rules->append( curr_rule->name() + "|" + curr_rule->uuid().toString() ); + } + setupRuleView( curr_rule , i_chain_allrules ); + } + } + if ( ! existed_rules->isEmpty() ) + for ( QStringList::Iterator it = existed_rules->begin(); it != existed_rules->end(); ++it ) { + QString existed_rule_name_id = *it; + int delimiter = existed_rule_name_id.find( "|" ); + QString existed_rule_name = existed_rule_name_id.left( delimiter ); + QString existed_rule_id_str = existed_rule_name_id.right( existed_rule_name_id.length() - delimiter - 1 ); + QUuid existed_obj_id( existed_rule_id_str ); +/* bool ok; + existed_obj_id = existed_rule_id_str.toInt( &ok );*/ +// kdDebug() << "Found Existed Name: " << existed_rule_name << " ID: " << existed_obj_id << endl; + bool have = false; + QPtrListIterator<IPTRule> it2( used_rules ); + IPTRule* used_rule = 0; + while ( it2.current() ) { + used_rule = it2.current(); +// kdDebug() << "Entering: while ( used_rule )" << endl; + ++it2; + if ( /*existed_rule_name == used_rule->name() &&*/ existed_obj_id == used_rule->uuid() ) { + kdDebug() << "Rule: " << used_rule->name() << " already existed." << endl; + have = true; + } + } + if ( ! have ) { +// kdDebug() << "Rule: " << existed_rule_name << " could not be found" << endl; + KMFListViewItem* del_item = findKMFItem( existed_rule_name, 2, existed_obj_id ); + if ( del_item ) { +// kdDebug() << "Rule: " << existed_rule_name << " was DELETED:" << endl; + delete del_item; + } else { + del_item = findKMFItem( i18n("Rule"), 0, existed_obj_id, false ); + if ( del_item ) { +// kdDebug() << "Rule: " << existed_rule_name << " was DELETED:" << endl; + delete del_item; + } + } + } + } + + existed_rules->clear(); + + QPtrListIterator<IPTRule> it3 ( used_rules ); + while ( it3.current() ) { + IPTRule * rule = it3.current(); + ++it3; + existed_rules->append( rule->name() + "|" + rule->uuid().toString() ); + } + } + //########### End Rules #################### + + // default target ++++++++++++++++++++++++++++++++++++ + + KMFListViewItem * i_deftg = 0; + i_deftg = findKMFItem( i18n( "Target:" ), 0, chain->uuid(), true, item ); + if ( ! i_deftg ) { + i_deftg = new KMFListViewItem( item, i_chain_allrules, chain ); + } + + if ( ! chain->hasDefaultTarget() ) { + delete i_deftg; + } else { + QString def_tg = chain->defaultTarget(); + QString cmd = chain->createIPTablesChainDefaultTarget(); + + // kdDebug() << "Setting up item: i_deftg" << endl; + i_deftg->setInUse( true ); + i_deftg->setPixmap( 0, icon_target ); + i_deftg->setText( 0, i18n( "Target:" ) ); + i_deftg->setText( 2, def_tg ); + kdDebug() << "Target: " << cmd << endl; + if ( def_tg == "DROP" ) { + i_deftg->setPixmap( 1, icon_drop ); + } else if ( def_tg == "ACCEPT" ) { + i_deftg->setPixmap( 1, icon_accept ); + } + + // kdDebug() << "Setting up item: i_deftg_rule" << endl; + KMFListViewItem * i_deftg_rule = 0; + i_deftg_rule = findKMFItem( i18n( "Policy Cmd:" ), 0, chain->uuid(), true, i_deftg ); + + if ( m_show_cmds ) { + if ( ! i_deftg_rule ) { + i_deftg_rule = new KMFListViewItem( i_deftg, chain ); + i_deftg_rule->setOpen( false ); + } + i_deftg_rule->setInUse( true ); + i_deftg_rule->setText( 0, i18n( "Policy Cmd:" ) ); + i_deftg_rule->setPixmap( 0, icon_cmd ); + i_deftg_rule->setText( 2, cmd ); + } else { + if ( i_deftg_rule ) + delete i_deftg_rule; + } + } + + KMFListViewItem * item_desc = 0; + item_desc = findKMFItem( i18n( "Documentation:" ), 0, chain->uuid(), true, item ); + + if ( !chain->description().isEmpty() && ! chain->isBuildIn() ) { + if ( ! item_desc ) { + item_desc = new KMFListViewItem( item, item, chain ); + } + item_desc->setInUse( true ); + item_desc->setMultiLinesEnabled( true ); + item_desc->setText( 0, i18n( "Documentation:" ) ); + item_desc->setPixmap( 1, icon_rename ); + item_desc->setText( 2, chain->description() ); + + } else if( !chain->description().isEmpty() && chain->isBuildIn() && m_show_desc ) { + if ( ! item_desc ) { + item_desc = new KMFListViewItem( item, item, chain ); + } + item_desc->setInUse( true ); + item_desc->setMultiLinesEnabled( true ); + item_desc->setText( 0, i18n( "Documentation:" ) ); + item_desc->setPixmap( 1, icon_rename ); + item_desc->setText( 2, chain->description() ); + } else if ( item_desc ) { + delete item_desc; + } + + KMFListViewItem* item_obj_id = 0; + item_obj_id = findKMFItem( i18n( "Object ID:" ), 0, chain->uuid(),true,item ); + + if ( KMFConfig::showObjectID() ) { + if ( ! item_obj_id ) { + item_obj_id = new KMFListViewItem( item, 0, chain ); + } + item_obj_id->setInUse( true ); + item_obj_id->setText( 0, i18n( "Object ID:" ) ); + QString sid = ""; + item_obj_id->setText( 2, chain->uuid().toString() ); + } else if ( item_obj_id ) { + delete item_obj_id; + } +// kdDebug() << "Sorting Chain Item Children...\n" << endl; + item->sort(); +} + +void KMFListView::setupRuleView( IPTRule* rule, KMFListViewItem* parent ) { +// kdDebug() << "KMFListView::setupRuleView( IPTRule* rule, KMFListViewItem* item )" << endl; + if ( ! rule || ! parent ) + return ; + + KMFListViewItem * item = 0; + item = findKMFItem( rule->name(), 2, rule->uuid(), true, parent ); + if ( ! item ) { +// kdDebug() << "No Item for Rule: " << rule->name() << " found.\nNeed to create a new one." << endl; + item = new KMFListViewItem( parent, parent, rule ); + } + item->sortChildItems( 0, true ); + item->setTopItem( true ); + item->setInUse( true ); + QPixmap icon_null; + QString rule_name = rule->name(); + QString rule_target = rule->target(); + QString rule_cmd = rule->toString(); + + QString rule_nr = ""; + if ( rule->customRule() && rule->enabled() ) { + rule_nr = rule_nr + "Custom "; + } + if ( !rule->enabled() ) { + rule_nr = rule_nr + "Disabled "; + } + rule_nr = rule_nr + "Rule:"; + QString rule_number = ""; + rule_number = rule_number.setNum( rule->ruleNum() +1 ); + rule_nr = rule_nr + " " + rule_number; +// item->setPixmap( 0, icon_rule ); + item->setText( 0, rule_nr ); + if ( ! rule->enabled() ) + item->setPixmap( 0, icon_disabled ); + else if ( rule->logging() ) + item->setPixmap( 0, icon_log ); + else + item->setPixmap( 0, icon_rule ); + + item->setText( 1, QString::null ); + item->setPixmap( 2, icon_null ); + item->setText( 2, rule_name ); + item->setRenameEnabled( 2, true ); + + // kdDebug() << "There are options defined for the rule " << endl; + KMFListViewItem* item_target = 0; + item_target = findKMFItem( i18n( "Target:" ), 0, rule->uuid(), true, item ); + if ( !item_target ) { + item_target = new KMFListViewItem( item, 0, rule ); + } + item_target->setInUse( true ); + item_target->setText( 0, i18n( "Target:" ) ); + item_target->setPixmap( 0, icon_target ); + item_target->setText( 2, rule_target ); + if ( rule_target == "ACCEPT" ) { + item_target->setPixmap( 1, icon_accept ); + } else if ( rule_target == "DROP" ) { + item_target->setPixmap( 1, icon_drop ); + } else if ( rule_target == "LOG" ) { + item_target->setPixmap( 1, icon_log ); + } else if ( rule_target == "REJECT" ) { + item_target->setPixmap( 1, icon_reject ); + } else if ( rule_target == "RETURN" ) { + item_target->setPixmap( 1, icon_return ); + } else if ( rule_target == "QUEUE" ) { + item_target->setPixmap( 1, icon_queue ); + } + + KMFListViewItem* item_cmd = 0; + item_cmd = findKMFItem( i18n( "Cmd:" ), 0, rule->uuid(), true, item ); + + if ( m_show_cmds ) { + if ( ! item_cmd ) { + item_cmd = new KMFListViewItem( item, 0, rule ); + } + item_cmd->setInUse( true ); + item_cmd->setMultiLinesEnabled( true ); + item_cmd->setText( 0, i18n( "Cmd:" ) ); + item_cmd->setPixmap( 0, icon_cmd ); + item_cmd->setText( 2, rule_cmd ); + } else if ( item_cmd ) { + delete item_cmd; + } + + //############## Start Rule Options ############ + QPtrList<QString>* available_options = IPTRuleOption::getAvailableOptionTypes(); + for ( uint j = 0;j < available_options->count();j++ ) { + QString type = ""; + type = *available_options->at( j ); + if ( type.isEmpty() ) + return ; + + IPTRuleOption* opt = 0; + opt = rule->getOptionForName( type ); + if ( ! opt ) { + return ; + } + +// kdDebug() << "Found Option: " << opt->guiName() << " is emty "<< opt->isEmpty() << endl; + + if ( ! opt->isEmpty() ) { + if ( !opt->isTargetOption() ) { + setupRuleOptionView( opt, item ); + } else if ( opt->isTargetOption() ) { + setupRuleOptionView( opt, item_target ); + } + } else { + + KMFListViewItem * kmfitem = 0; + kmfitem = findKMFItem( opt->guiName(), 0, opt->uuid(), true, item ); + if ( kmfitem ) { + delete kmfitem; + } else { + kmfitem = findKMFItem( opt->guiName(), 0, opt->uuid(), true, item_target ); + if ( kmfitem ) { + delete kmfitem; + } + } + + + } + } + //############## End Rule Options ############ + + KMFListViewItem * item_log = 0; + item_log = findKMFItem( i18n( "Logging:" ), 0, rule->uuid(),true,item ); + if ( rule->logging() && ! rule->enabled() ) { + if ( ! item_log ) { + item_log = new KMFListViewItem( item, 0, rule ); + } + item_log->setInUse( true ); + item_log->setText( 0, i18n( "Logging:" ) ); + item_log->setPixmap( 1, icon_log ); + item_log->setText( 2, i18n( "Logging matching Packets" ) ); + } else if ( item_log ) { + delete item_log; + } + + + KMFListViewItem * item_desc = 0; + item_desc = findKMFItem( i18n( "Documentation:" ), 0, rule->uuid(),true,item ); + + if ( !rule->description().isEmpty() ) { + if ( ! item_desc ) { + item_desc = new KMFListViewItem( item, 0, rule ); + } + + item_desc->setInUse( true ); + item_desc->setMultiLinesEnabled( true ); + item_desc->setText( 0, i18n( "Documentation:" ) ); + item_desc->setPixmap( 1, icon_rename ); + item_desc->setText( 2, rule->description() ); + + } else if ( item_desc ) { + delete item_desc; + } + + KMFListViewItem* item_obj_id = 0; + item_obj_id = findKMFItem( i18n( "Object ID:" ), 0, rule->uuid(),true,item ); + + if ( KMFConfig::showObjectID() ) { + if ( ! item_obj_id ) { + item_obj_id = new KMFListViewItem( item, 0, rule ); + } + item_obj_id->setInUse( true ); + item_obj_id->setText( 0, i18n( "Object ID:" ) ); + QString sid = ""; + item_obj_id->setText( 2, rule->uuid().toString() ); + } else if ( item_obj_id ) { + delete item_obj_id; + } + item->sort(); +} + +void KMFListView::setupRuleOptionView( IPTRuleOption* option, KMFListViewItem* parent ) { +// kdDebug() << "void KMFListView::setupRuleOptionView( IPTRuleOption* option, KMFListViewItem* parent )" << endl; + if ( ! option || ! parent ) + return ; + + QString type = option->getOptionType(); + QStringList values = option->getValues(); + QDict<QStringList>* gui_string_dict = option->getGUIStringDict(); + QStringList* gui_strings = gui_string_dict->find( type ); + QString name = ""; + + KMFListViewItem * item = 0; + item = findKMFItem( option->guiName(), 0, option->uuid(),true,parent ); + + if ( values.count() < 1 || option->isEmpty() ) { + if ( item ) { + delete item; + } + return; + } + + if ( ! item ) { +// // kdDebug() << "No Item for Option: " << *gui_strings->at( 0 ) << " found.\nCreateing a new one." << endl; + item = new KMFListViewItem( parent, parent, option ); + item->setOpen( true ); + } + + item->setTopItem( true ); + item->setInUse( true ); + item->setPixmap( 0, icon_filter ); + item->setText( 0, option->guiName() ); + + // KMFListViewItem* item_filter = 0; + for ( uint i = 0; i < values.count(); i++ ) { + QString val = ""; + val = *values.at( i ); + if ( val.isNull() ) + return ; + + + if ( gui_strings->count() > i /* + 1 */ ) { + // if (val == XML::BoolOn_Value) + // val = ""; + + QString gui_name = ""; + gui_name = *gui_strings->at( i /* + 1 */ ); + KMFListViewItem * item_opt = 0; + item_opt = findKMFItem( gui_name, 0, option->uuid(),true,item ); + + if ( gui_name.isEmpty() || val == XML::Undefined_Value || val.simplifyWhiteSpace().isEmpty() || val == XML::BoolOff_Value ) { + if ( item_opt ) { + delete item_opt; + } + } else { + if ( ! item_opt ) { +// kdDebug() << "Creating Item for option Name: " << gui_name << endl; + item_opt = new KMFListViewItem( item, 0, option ); + item_opt->setOpen( true ); + } + if ( val != XML::BoolOn_Value ) { + item_opt->setInUse( true ); + item_opt->setText( 0, gui_name ); + item_opt->setText( 2, val ); + } else { + item_opt->setInUse( true ); + item_opt->setText( 0, gui_name ); + } + } + } + } + + KMFListViewItem *item_obj_id = 0; + item_obj_id = findKMFItem( i18n( "Object ID:" ), 0, option->uuid(),true,item ); + if ( KMFConfig::showObjectID() ) { + if ( ! item_obj_id ) { + item_obj_id = new KMFListViewItem( item, 0, option ); + } + item_obj_id->setInUse( true ); + item_obj_id->setText( 0, i18n( "Object ID:" ) ); + item_obj_id->setText( 2, option->uuid().toString() ); + } else if ( item_obj_id ) { + delete item_obj_id; + } +} + +void KMFListView::clearAllItems() { +// kdDebug() << "void KMFListView::clearAllItems()" << endl; +/* m_existed_chains.clear(); + m_dict_existed_rules.clear();*/ + clear(); +} + +KMFListViewItem* KMFListView::findKMFItem( const QString & text, int column, const QUuid& obj_id, bool exact /*= true*/, KMFListViewItem* from_item /*= 0*/ ) { + // kdDebug() << "KMFListViewItem* KMFListView::findKMFItem(const QString& text: " << text << ", int column:" << column << ", int obj_id: " << obj_id << ")" << endl; + if ( text.isNull() || column < 0 ) + return 0; + if ( from_item ) { +// from_item->setText(1,"Serching this item"); + QListViewItemIterator it( from_item ); + QListViewItem * qitem = 0; + + qitem = from_item->firstChild(); + while ( qitem ) { + KMFListViewItem * item = 0; + item = dynamic_cast<KMFListViewItem*> ( qitem ); + if ( item ) { +// item->setPixmap(1,icon_accept); + if ( obj_id.isNull() ) { + if ( item->text( column ) == text ) { + return item; + } + } else { + if ( exact ) { + if ( item->text( column ) == text && item->uuid() == obj_id ) + return item; + } else { + if ( item->text( column ).contains( text ) && item->uuid() == obj_id ) + return item; + } + } + } else { + kdDebug() << "CAST ERROR: Item not of type KMFListViewItem" << endl; + return 0; + } + qitem = qitem->nextSibling(); + } + } else { + QListViewItemIterator it( this ); + while ( it.current() ) { + QListViewItem * qitem = it.current(); + ++it; + KMFListViewItem * item = 0; + item = dynamic_cast<KMFListViewItem*> ( qitem ); + if ( item ) { + if ( obj_id.isNull() ) { + if ( item->text( column ) == text ) { + return item; + } + } else { + if ( exact ) { + if ( item->text( column ) == text && item->uuid() == obj_id ) + return item; + } else { + if ( item->text( column ).contains( text ) && item->uuid() == obj_id ) + return item; + } + } + } else { + kdDebug() << "CAST ERROR: Item not of type KMFListViewItem" << endl; + } + } + } +// kdDebug() << "Couldn't find Item " << text << " column: " << column << ", int obj_id: " << obj_id << endl; + return 0; +} + +KMFListViewItem* KMFListView::findKMFItem( const QString & text1, int column1,const QString & text2, int column2, const QUuid& obj_id ) { + // kdDebug() << "KMFListViewItem* KMFListView::findKMFItem(const QString& text: " << text << ", int column:" << column << ", int obj_id: " << obj_id << ")" << endl; + if ( text1.isNull() || column1 < 0 || obj_id.isNull() || text2.isNull() || column2 < 0 ) + return 0; + + QListViewItemIterator it( this ); + while ( it.current() ) { + QListViewItem * qitem = it.current(); + ++it; + KMFListViewItem * item = 0; + item = dynamic_cast<KMFListViewItem*> ( qitem ); + if ( item ) { + if ( item->text( column1 ) == text1 && item->text( column2 ) == text2 && item->uuid() == obj_id ) + return item; + } else { + kdDebug() << "CAST ERROR: Item not of type KMFListViewItem" << endl; + } + } +// kdDebug() << "Couldn't find Item " << text << " column: " << column << ", int obj_id: " << obj_id << endl; + return 0; +} + + +void KMFListView::loadIcons() { + kdDebug() << "void KMFListView::loadIcons()" << endl; + KIconLoader *loader = KGlobal::iconLoader(); + QString icon_name; + + icon_name = "up"; + icon_up = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "down"; + icon_down = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "ereaser"; + icon_del = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "filenew"; + icon_new = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "edit"; + icon_edit = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "rule"; + icon_rule = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "user_defined"; + icon_user = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "builtin"; + icon_builtin = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "table"; + icon_table = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "filter"; + icon_filter = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "text"; + icon_rename = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "view_tree"; + icon_chain = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "reject"; + icon_reject = loader->loadIcon( icon_name, KIcon::User ); + + icon_name = "target"; + icon_target = loader->loadIcon( icon_name, KIcon::User ); + + icon_name = "stop"; + icon_drop = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "button_ok"; + icon_accept = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "filesaveas"; + icon_log = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "undo"; + icon_return = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "editclear"; + icon_cmd = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "filter"; + icon_filter = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "pipe"; + icon_queue = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "button_cancel"; + icon_disabled = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "1rightarrow"; + icon_fwd = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "2rightarrow"; + icon_fwds = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "fill"; + icon_feed = loader->loadIcon( icon_name, KIcon::Small ); + +} + + +} + +#include "kmflistview.moc" diff --git a/kmyfirewall/kmfwidgets/kmflistview.h b/kmyfirewall/kmfwidgets/kmflistview.h new file mode 100644 index 0000000..bcc89e8 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmflistview.h @@ -0,0 +1,91 @@ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +/* +Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2001-2004 +*/ + + +#ifndef KMFLISTVIEW_H +#define KMFLISTVIEW_H + +#include <klistview.h> + + +// QT includes +#include <qptrlist.h> +#include <qintdict.h> +#include <qdict.h> +#include <qstringlist.h> +#include <qvaluelist.h> +#include <qpixmap.h> +#include <quuid.h> +#include <qguardedptr.h> +// Project includes + +/** +@author Christian Hubinger +*/ +class KListViewItem; +namespace KMF { +class NetfilterObject; +class IPTable; +class IPTChain; +class IPTRule; +class IPTRuleOption; +class KMFListViewItem; + + +class KDE_EXPORT KMFListView : public KListView { + Q_OBJECT +public: + KMFListView( QWidget *parent = 0, const char *name = 0 ); + + ~KMFListView(); + + KMFListViewItem* getRootItem(); + void clearAllItems(); + +public slots: + void slotLoadNode( NetfilterObject* ); + void slotUpdateView(); + void slotUpdateView( NetfilterObject* ); + KMFListViewItem* findKMFItem( const QString& text, int column, const QUuid& obj_id, bool exact = true, KMFListViewItem* from = 0 ); + KMFListViewItem* findKMFItem( const QString& text1, int column1,const QString& text2, int column2, const QUuid& obj_id ); + +signals: + void sigUpdateItem( int ); + +private: + void loadIcons(); + void setupTableView( IPTable* ); + void setupChainView( IPTChain*, KMFListViewItem* ); + void setupRuleView( IPTRule*, KMFListViewItem* ); + void setupRuleOptionView( IPTRuleOption*, KMFListViewItem* ); + +private slots: + void slotChangeRoot( QListViewItem* ); + +private: // data + QGuardedPtr<NetfilterObject> m_NetfilterObject; + IPTable *m_table; + QString cast_error; + + QStringList m_existed_chains; + QDict< QStringList > m_dict_existed_rules; + + bool m_show_desc, m_show_cmds, m_show_objectID; + + QPixmap icon_up, icon_down, icon_del, icon_edit, icon_rule, icon_filter, icon_rename, + icon_chain, icon_log, icon_accept, icon_drop, icon_cmd, icon_reject, icon_return, + icon_target, icon_queue, icon_new, icon_disabled, icon_feed, icon_fwd, icon_fwds, icon_user, icon_builtin, icon_table; +signals: + void sigLoadNode( NetfilterObject* ); +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmflistviewitem.cpp b/kmyfirewall/kmfwidgets/kmflistviewitem.cpp new file mode 100644 index 0000000..b58305d --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmflistviewitem.cpp @@ -0,0 +1,431 @@ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +/* +Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2001-2004 +*/ + +#include "kmflistviewitem.h" + +// QT includes + +// KDE includes +#include <kdebug.h> +#include <klocale.h> +#include <kiconloader.h> +#include <kglobal.h> + +// Project includes +#include "../core/xmlnames.h" +#include "../core/ipaddress.h" +#include "../core/kmfnetzone.h" +#include "../core/kmfnethost.h" +#include "../core/kmftarget.h" +#include "../core/kmftargetconfig.h" +#include "../core/kmfprotocol.h" +#include "../core/kmfprotocolcategory.h" +#include "../core/iptable.h" +#include "../core/iptchain.h" +#include "../core/iptrule.h" +#include "../core/iptruleoption.h" +#include "../core/netfilterobject.h" +namespace KMF { +KMFListViewItem::KMFListViewItem( KListView *parent, NetfilterObject* obj ) : KListViewItem( parent ) { + m_top = false; + loadNetfilterObject(obj); + m_inUse = false; +} +KMFListViewItem::KMFListViewItem( KListView *parent, KListViewItem *after, NetfilterObject* obj ) : KListViewItem( parent, after ) { + m_top = false; + loadNetfilterObject(obj); + m_inUse = false; +} +KMFListViewItem::KMFListViewItem( KListViewItem *parent, NetfilterObject* obj ) : KListViewItem( parent ) { + m_top = false; + loadNetfilterObject(obj); + m_inUse = false; +} +KMFListViewItem::KMFListViewItem( KListViewItem *parent, KListViewItem *after, NetfilterObject* obj ) : KListViewItem( parent, after ) { + m_top = false; + loadNetfilterObject(obj); + m_inUse = false; +} + +KMFListViewItem::~KMFListViewItem() { +} + +void KMFListViewItem::loadNetfilterObject( NetfilterObject* obj ) { + m_object = obj; + // m_obj_id = -1; + m_table = 0; + m_chain = 0; + m_rule = 0; + m_option = 0; + m_zone = 0; + m_host = 0; + m_target = 0; + m_protocol = 0; + m_protocolCategory = 0; + // m_type = -1; + if ( ! obj ) + return; + + m_obj_id = obj->uuid(); + + if ( IPTable *table = dynamic_cast<IPTable*> ( obj ) ) { + // m_type = KMFListViewItem::TABLE; + m_table = table; + } else if ( IPTChain *chain = dynamic_cast<IPTChain*> ( obj ) ) { + // m_type = KMFListViewItem::CHAIN; + m_chain = chain; + } else if ( IPTRule *rule = dynamic_cast<IPTRule*> ( obj ) ) { + // m_type = KMFListViewItem::RULE; + m_rule = rule; + } else if ( IPTRuleOption *opt = dynamic_cast<IPTRuleOption*> ( obj ) ) { + // m_type = KMFListViewItem::RULEOPTION; + m_option = opt; + } else if ( KMFNetZone *zone = dynamic_cast<KMFNetZone*> ( obj ) ) { + // m_type = KMFListViewItem::NETZONE; + m_zone = zone; + } else if ( KMFNetHost *host = dynamic_cast<KMFNetHost*> ( obj ) ) { + // m_type = KMFListViewItem::NETHOST; + m_host = host; + } else if ( KMFTarget *host = dynamic_cast<KMFTarget*> ( obj ) ) { + // m_type = KMFListViewItem::KMFTARGET; + m_target = host; + } else if ( KMFProtocol *prot = dynamic_cast<KMFProtocol*> ( obj ) ) { + // m_type = KMFListViewItem::KMFTARGET; + // kdDebug() << "KMFListViewItem::loadNetfilterObject(..) - loaded Protocol" << endl; + m_protocol = prot; + } else if ( KMFProtocolCategory *protCat = dynamic_cast<KMFProtocolCategory*> ( obj ) ) { + // m_type = KMFListViewItem::KMFTARGET; + // kdDebug() << "KMFListViewItem::loadNetfilterObject(..) - loaded Protocol" << endl; + m_protocolCategory = protCat; + } +} + +int KMFListViewItem::type() { + return m_object->type(); +} + +void KMFListViewItem::setTopItem( bool onoff ) { + m_top = onoff; +} + +void KMFListViewItem::setInUse( bool onoff ) { + if ( ! onoff ) + setChildrenInUse ( true ); + m_inUse = onoff; +} + +bool KMFListViewItem::inUse() { + bool ret = m_inUse; + m_inUse = false; + return ret; +} + + + +NetfilterObject* KMFListViewItem::netfilterObject() const { + return m_object; +} + +void KMFListViewItem::setChildrenInUse( bool onoff ) { + KMFListViewItem* item = this; + item = dynamic_cast<KMFListViewItem*> ( item->firstChild() ); + while ( item ){ + item->setInUse( onoff ); + item = dynamic_cast<KMFListViewItem*> ( item->nextSibling() ); + } +} +void KMFListViewItem::deleteChildren() { + while ( firstChild() ) { + kdDebug() << "Deleting Item: " << text(0) << " " << text(2) << endl; + delete firstChild(); + } +} + + +void KMFListViewItem::setupProtocolView() { + kdDebug() << " KMFListViewItem::setupProtocolView()" << endl; + if ( ! m_protocol ) { + kdDebug() << " KMFListViewItem::setupProtocolView(): m_protocol == 0" << endl; + return; + } + + while( firstChild() ) { + delete firstChild(); + } + + setPixmap(0, KGlobal:: iconLoader()->loadIcon("kmyfirewall", KIcon::Small ) ); + setText( 0, protocol()->name() ); + setText( 1, protocol()->description() ); + // setOpen( true ); + + if ( protocol()->tcpPorts().size() > 0 ) { + KMFListViewItem *tcpPorts = new KMFListViewItem( this, 0, protocol() ); + tcpPorts->loadNetfilterObject( protocol() ); + tcpPorts->setText( 0, i18n("TCP Ports:") ); + tcpPorts->setText( 1, protocol()->tcpPortsList() ); + } + if ( protocol()->udpPorts().size() > 0 ) { + KMFListViewItem *udpPorts = new KMFListViewItem( this, 0, protocol() ); + udpPorts->loadNetfilterObject( protocol() ); + udpPorts->setText( 0, i18n("UDP Ports:") ); + udpPorts->setText( 1, protocol()->udpPortsList() ); + } + +/* while ( it.current() ) { + }*/ +} + + +void KMFListViewItem::setupProtocolCategoryView() { + while( firstChild() ) { + delete firstChild(); + } + + setPixmap(0, KGlobal::iconLoader()->loadIcon( "folder" , KIcon::Small ) ); + setText( 0, protocolCategory()->name() ); + setText( 1, protocolCategory()->description() ); + + QValueList< KMFProtocol* >& prots = protocolCategory()->protocols(); + QValueList< KMFProtocol* >::iterator it; + for( it = prots.begin(); it != prots.end(); ++it ) { + KMFListViewItem *prot = new KMFListViewItem( this, 0, (*it) ); + prot->setupProtocolView(); + } +} + +void KMFListViewItem::setupTargetView() { +// if ( target()->isCurrentTarget() ) { +// setFont( QFont::Bold ); +// } else { +// setFont( QFont::Bold ); +// } + if ( target()->isCurrentTarget() ) { + setPixmap(0, KGlobal:: iconLoader()->loadIcon("kmyfirewall", KIcon::Small ) ); + } else { + setPixmap(0, KGlobal:: iconLoader()->loadIcon("enhanced_browsing", KIcon::Small ) ); + } + setText( 0, target()->guiName() ); + setText( 1,"[" + target()->address()->toString() + "]" ); + setText( 2, target()->config()->oS() ); + setText( 3, target()->config()->backend() ); + setText( 4, target()->description() ); +} + +void KMFListViewItem::setupNetHostView() { + setPixmap(0, KGlobal:: iconLoader()->loadIcon("home_white", KIcon::Small ) ); + setText( 0, host()->guiName() ); + setText( 1,"[" + host()->address()->toString() + "]" ); + + if ( host()->name().startsWith("incoming_world") ) { + setText( 2,"" + i18n("%1 -> Localhost").arg( host()->guiName() ) ); + } + if ( host()->name().startsWith("outgoing_world") ) { + setText( 2, i18n("Localhost -> %1").arg( host()->guiName() ) ); + } +} + + + +void KMFListViewItem::setupZoneView() { + kdDebug() << "void KMFListViewItem::setupZoneView()" << endl; + if ( type() != NetfilterObject::NETZONE ) { + return; + } + KIconLoader *loader = KGlobal:: iconLoader(); + + setText( 0,m_zone->guiName() ); + if ( m_zone->name() == "incoming_world" || m_zone->name() == "outgoing_world" ) { + setPixmap(0, loader->loadIcon("network", KIcon::Small ) ); + } else { + setPixmap(0, loader->loadIcon("network_local", KIcon::Small ) ); + } + + // if ( m_zone->name().startsWith("incoming_world") || m_zone->name().startsWith("outgoing_world") ) + setText( 1, "[" + m_zone->address()->toString() + i18n("/%1]").arg( m_zone->maskLength() ) ); + +/* setText( 2,"" + i18n("%1 -> Localhost").arg( m_zone->guiName() ) );*/ + setText( 4,"" + m_zone->description() ); + + if ( m_zone->name().startsWith("incoming_world") ) { + setText( 2,"" + i18n("%1 -> Localhost").arg( m_zone->guiName() ) ); + + } + if ( m_zone->name().startsWith("outgoing_world") ) { + setText( 2, i18n("Localhost -> %1").arg( m_zone->guiName() ) ); + + } + + QPtrListIterator<KMFNetZone> it ( m_zone->zones() ); + while ( it.current() ) { + KMFListViewItem *item = new KMFListViewItem( this, 0, it.current() ); + item->loadNetfilterObject( it.current() ); + item->setupZoneView(); + // item->setRenameEnabled( 0, true ); + setOpen(true); + ++it; + } + + QPtrListIterator<KMFTarget> it2 ( m_zone->hosts() ); + while ( it2.current() ) { + if ( it2.current()->type() == NetfilterObject::NETHOST ) { + KMFNetHost *host = dynamic_cast<KMFNetHost*>( it2.current() ); + KMFListViewItem *item = new KMFListViewItem( this, 0, host ); + item->loadNetfilterObject( host ); + item->setupNetHostView(); + setOpen(true); + } else if ( it2.current()->type() == NetfilterObject::KMFTARGET ) { + KMFTarget* target = dynamic_cast<KMFTarget*>( it2.current() ); + kdDebug() << "Added KMFTarget" << endl; + KMFListViewItem *item = new KMFListViewItem( this, 0, target ); + item->loadNetfilterObject( target ); + item->setupTargetView(); + // item->setRenameEnabled( 0, true ); + setOpen(true); + } + + + + /* + if ( KMFTarget* target = dynamic_cast<KMFTarget*>( it2.current() ) ){ + kdDebug() << "Added KMFTarget" << endl; + KMFListViewItem *item = new KMFListViewItem( this, 0, target ); + item->loadNetfilterObject( target ); + item->setupTargetView(); + // item->setRenameEnabled( 0, true ); + setOpen(true); + } else if ( KMFNetHost *host = dynamic_cast<KMFNetHost*>( it2.current() ) ) { + kdDebug() << "Added KMFNetHost" << endl; + KMFListViewItem *item = new KMFListViewItem( this, 0, host ); + item->loadNetfilterObject( host ); + // item->setRenameEnabled( 0, true ); + item->setupNetHostView();*/ + +/* item->setPixmap(0, loader->loadIcon("home_white", KIcon::Small ) ); + item->setText( 0, host->guiName() ); + item->setText( 1,"[" + host->address()->toString() + "]" ); + + if ( host->name().startsWith("incoming_world") ) { + item->setText( 2,"" + i18n("%1 -> Localhost").arg( host->guiName() ) ); + } + if ( host->name().startsWith("outgoing_world") ) { + item->setText( 2, i18n("Localhost -> %1").arg( host->guiName() ) ); + }*/ +// setOpen(true); +// // ++it2; +// } + + + + + +// KMFListViewItem *item = new KMFListViewItem( this, 0, it2.current() ); +// item->loadNetfilterObject( it2.current() ); +// item->setPixmap(0, loader->loadIcon("home_white", KIcon::Small ) ); +// item->setText( 0, it2.current()->guiName() ); +// item->setText( 1,"[" + it2.current()->address()->toString() + "]" ); +// +// if ( it2.current()->name().startsWith("incoming_world") ) { +// item->setText( 2,"" + i18n("%1 -> Localhost").arg( it2.current()->guiName() ) ); +// } +// if ( it2.current()->name().startsWith("outgoing_world") ) { +// item->setText( 2, i18n("Localhost -> %1").arg( it2.current()->guiName() ) ); +// } +// setOpen(true); + ++it2; + + } +} + +QString KMFListViewItem::key( int column, bool ascending ) const { +// kdDebug() << "QString KMFListViewItem::key( int column, bool ascending )" << endl; + if ( ! m_object ) { + return QListViewItem::key( column, ascending ); + } + + if ( m_object->type() == NetfilterObject::TABLE ) { + if ( text(0) == i18n("Documentation:") ) { + return "0000"; + } + } else if ( m_object->type() == NetfilterObject::CHAIN ) { + if ( text(0) == i18n("Documentation:") || text(2) == Constants::InputChain_Name ) { + return "0000"; + } else if ( text(0) == i18n("Chain logging:") || text(2) == Constants::OutputChain_Name ) { + return "1111"; + } else if ( text(0) == i18n("Chain Feeds:") || text(2) == Constants::ForwardChain_Name ) { + return "2222"; + } else if ( text(0) == i18n("Chain forwards:") || text(2) == Constants::PreRoutingChain_Name ) { + return "3333"; + } else if ( text(0) == i18n("Rule(s):") || text(2) == Constants::PostRoutingChain_Name ) { + return "4444"; + } else if ( text(0) == i18n("Cmd:") ) { + return "9999"; + } else if (text(0).contains( i18n("Chain (User-Defined):") ) ) { + int index = m_chain->table()->chains().find( m_chain ); + QString ret = ""; + return ret.setNum( 5555 + index ); + } + } else if ( m_object->type() == NetfilterObject::RULE ) { + if ( text(0) == i18n("Documentation:") ) { + return "0000"; + } else if ( text(0) == i18n("Cmd:") ) { + return "8888"; + } else if ( text(0) == i18n("Target:") ) { + return "9999"; + } else { + QString ret = ""; + ret = ret.setNum( m_rule->ruleNum() ); + while ( ret.length() < 5 ) { + ret.prepend("0"); + } + return ret; + } + } else if ( m_object->type() == NetfilterObject::RULEOPTION ) { + QPtrList<QString>* types = IPTRuleOption::getAvailableOptionTypes(); + QPtrListIterator< QString > it ( *types ); + int i = 0; + int index = -1; + bool finished = false; + while ( it.current() && ! finished ) { + QString type = *it.current(); + ++it; +// kdDebug() << "Checking type: " << type << endl; + if ( type == m_option->getOptionType() ) { + index = i; + finished = true; + } + i++; + } + QString ret = ""; +// kdDebug() << "QString KMFListViewItem::key(...) returnd: " << ret << " for ruleoption type: " << m_option->getOptionType() << endl; + return ret.setNum( 5555 + index ); + } else if ( m_object->type() == NetfilterObject::NETZONE ) { + if ( m_zone ) { + //return "0000"; + return "0000" + m_zone->guiName(); + } + } else if ( m_object->type() == NetfilterObject::NETHOST ) { + if ( m_host ) { + // return "1111"; + return "1111" + m_host->guiName(); + } + } else if ( m_object->type() == NetfilterObject::KMFTARGET ) { + if ( m_host ) { + // return "1111"; + return "1111" + m_target->guiName(); + } + } + + + return QListViewItem::key( column, ascending ); +} + +} diff --git a/kmyfirewall/kmfwidgets/kmflistviewitem.h b/kmyfirewall/kmfwidgets/kmflistviewitem.h new file mode 100644 index 0000000..6181794 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmflistviewitem.h @@ -0,0 +1,144 @@ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +/* +Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2001-2004 +*/ + +#ifndef KMFLISTVIEWITEM_H +#define KMFLISTVIEWITEM_H + +#include "kmflistview.h" + +// QT includes +#include <qstring.h> +#include <quuid.h> +#include <qguardedptr.h> + +// KDE includes + +// Project includes + +/** +@author Christian Hubinger +*/ + +namespace KMF { +class IPTable; +class IPTChain; +class IPTRule; +class IPTRuleOption; +class NetfilterObject; +class KMFNetZone; +class KMFNetHost; +class KMFTarget; +class KMFProtocol; +class KMFProtocolCategory; + +class KDE_EXPORT KMFListViewItem : public KListViewItem { +public: + KMFListViewItem( KListView *parent, NetfilterObject* ); + KMFListViewItem( KListViewItem *parent, NetfilterObject* ); + KMFListViewItem( KListView *parent, KListViewItem *after, NetfilterObject* ); + KMFListViewItem( KListViewItem *parent, KListViewItem *after, NetfilterObject* ); + + virtual ~KMFListViewItem(); + + NetfilterObject* netfilterObject() const; + + IPTable* table() const { + return m_table; + }; + IPTChain* chain() const { + return m_chain; + }; + IPTRule* rule() const { + return m_rule; + }; + IPTRuleOption* ruleOption() const { + return m_option; + }; + + KMFNetZone* zone() const { + return m_zone; + }; + + KMFNetHost* host() const { + return m_host; + }; + + KMFTarget* target() const { + return m_target; + }; + + KMFProtocol* protocol() const { + return m_protocol; + }; + + KMFProtocolCategory* protocolCategory() const { + return m_protocolCategory; + }; + + + bool isTopItem() const { + return m_top; + }; + + int type(); + + const QUuid& uuid() const { + return m_obj_id; + } + + void setupZoneView(); + void setupTargetView(); + void setupNetHostView(); + void setupProtocolView(); + void setupProtocolCategoryView(); + + void deleteChildren(); + void setChildrenInUse( bool ); + void setTopItem( bool ); + void setInUse( bool ); + bool inUse(); + // enum { TABLE = 0, CHAIN = 1, RULE = 2, RULEOPTION = 3 , NETZONE = 4, NETHOST = 5, KMFTARGET = 6 }; + + void loadNetfilterObject( NetfilterObject* ); + virtual QString key( int column, bool ascending ) const; + +private: +/* IPTable *m_table; + IPTChain *m_chain; + IPTRule *m_rule; + IPTRuleOption *m_option; + KMFNetZone* m_zone; + KMFNetHost* m_host; + KMFTarget* m_target; + KMFProtocol* m_protocol; + KMFProtocolCategory* m_protocolCategory; + NetfilterObject* m_object;*/ + + QGuardedPtr<IPTable> m_table; + QGuardedPtr<IPTChain> m_chain; + QGuardedPtr<IPTRule> m_rule; + QGuardedPtr<IPTRuleOption> m_option; + QGuardedPtr<KMFNetZone> m_zone; + QGuardedPtr<KMFNetHost> m_host; + QGuardedPtr<KMFTarget> m_target; + QGuardedPtr<KMFProtocol> m_protocol; + QGuardedPtr<KMFProtocolCategory> m_protocolCategory; + QGuardedPtr<NetfilterObject> m_object; + + + // int m_type; + QUuid m_obj_id; + bool m_top; + bool m_inUse; +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfmainwindow.cpp b/kmyfirewall/kmfwidgets/kmfmainwindow.cpp new file mode 100644 index 0000000..c8bc0ed --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfmainwindow.cpp @@ -0,0 +1,30 @@ +// +// C++ Implementation: kmfmainwindow +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#include "kmfmainwindow.h" +namespace KMF { +KMFMainWindow::KMFMainWindow( QWidget* parent, const char *name ) : KMyFirewallInterface(), KParts::MainWindow( parent, name ) {} + +KMFMainWindow::~KMFMainWindow() {} + +} + +#include "kmfmainwindow.moc" diff --git a/kmyfirewall/kmfwidgets/kmfmainwindow.h b/kmyfirewall/kmfwidgets/kmfmainwindow.h new file mode 100644 index 0000000..9c0f3f5 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfmainwindow.h @@ -0,0 +1,46 @@ +// +// C++ Interface: kmfmainwindow +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#ifndef KMFMAINWINDOW_H +#define KMFMAINWINDOW_H + +#include <kparts/mainwindow.h> +#include "../core/kmyfirewallinterface.h" +#include "../core/netfilterobject.h" + +/** +@author Christian Hubinger +*/ + +namespace KMF { +class KDE_EXPORT KMFMainWindow : public KParts::MainWindow, virtual public KMyFirewallInterface { + Q_OBJECT +public: + + KMFMainWindow( QWidget* parent, const char *name ); + virtual ~KMFMainWindow(); +signals: + void sigUpdateView(); + void sigUpdateView( NetfilterObject*); + void sigEnableActions( bool ); +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfmultiportwidget.cpp b/kmyfirewall/kmfwidgets/kmfmultiportwidget.cpp new file mode 100644 index 0000000..fa89a85 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfmultiportwidget.cpp @@ -0,0 +1,134 @@ +/*************************************************************************** + begin : Fri Nov 1 2002 + copyright : (C) 2002 by Christian Hubinger + email : chubinger@irrsinnig.org +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kmfmultiportwidget.h" + + +#include <qstring.h> +#include <qspinbox.h> +#include <qlistbox.h> +#include <qcheckbox.h> +#include <qradiobutton.h> + +#include <kpushbutton.h> + +#include "../core/kmferror.h" +namespace KMF { +KMFMultiPortWidget::KMFMultiPortWidget( QWidget *parent, const char *name ) : KMyFirewallMultiPortWidget( parent, name ) { + m_err = new KMFError(); + m_err->setErrType( KMFError::OK ); + lb_ports->clear(); + connect( b_add, SIGNAL( clicked() ), this, SLOT( addPort() ) ); + connect( b_remove, SIGNAL( clicked() ), this, SLOT( removePort() ) ); + connect( c_use_multiport, SIGNAL( toggled( bool ) ), this, SIGNAL( sigMultiPortChanged( bool ) ) ); +} +KMFMultiPortWidget::~KMFMultiPortWidget() {} + +void KMFMultiPortWidget::addPort() { + QString port = ""; + port.setNum( sb_port->value() ); + if ( port.isEmpty() ) + return ; + if ( lb_ports->count() > 14 ) + return ; + + for ( uint i = 0; i < lb_ports->count(); i++ ) + if ( lb_ports->text( i ) == port ) + return ; + + lb_ports->insertItem( port ); +} + +void KMFMultiPortWidget::addPort( QString& port ) { + lb_ports->insertItem( port ); +} + +void KMFMultiPortWidget::removePort() { + int index = -1; + index = lb_ports->currentItem(); + if ( index > -1 ) + lb_ports->removeItem( index ); +} + +void KMFMultiPortWidget::removePort( int index ) { + lb_ports->removeItem( index ); +} + +KMFError* KMFMultiPortWidget::getPortString( QString* value ) { + for ( uint i = 0; i < lb_ports->count(); i++ ) { + if ( !(*value).isEmpty() ) + value->append( "," ); + value->append( lb_ports->text( i ) ); + } + if ( value->isEmpty() ) + return m_err; + + value->stripWhiteSpace(); + return m_err; +} + +void KMFMultiPortWidget::setType( const QString& type ) { + setEnabled( true ); + c_use_multiport->setChecked( true ); + if ( type == "src" ) + rb_src->setChecked( true ); + if ( type == "dest" ) + rb_dest->setChecked( true ); + if ( type == "equ" ) + rb_equ->setChecked( true ); + +} + +void KMFMultiPortWidget::loadPortString( QString& str ) { + if ( str.isEmpty() ) + return ; + lb_ports->clear(); + int pos = -1; + pos = str.find( "," ); + while ( pos > -1 ) { + QString port = str.left( pos ); + lb_ports->insertItem( port ); + str = str.right( str.length() - pos - 1 ); + pos = str.find( "," ); + } + if ( !str.isEmpty() ) { + lb_ports->insertItem( str ); + } +} + +void KMFMultiPortWidget::reset() { + c_use_multiport->setChecked( false ); + rb_src->setChecked( false ); + rb_dest->setChecked( false ); + rb_equ->setChecked( false ); + lb_ports->clear(); +} + + +QString& KMFMultiPortWidget::type() const { + QString ret = "src"; + if ( rb_src->isChecked() ) + ret = "src"; + else if ( rb_dest->isChecked() ) + ret = "dest"; + else if ( rb_equ->isChecked() ) + ret = "equ"; + QString *val = new QString( ret ); + return *val; +} + +} + +#include "kmfmultiportwidget.moc" diff --git a/kmyfirewall/kmfwidgets/kmfmultiportwidget.h b/kmyfirewall/kmfwidgets/kmfmultiportwidget.h new file mode 100644 index 0000000..8b1d042 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfmultiportwidget.h @@ -0,0 +1,56 @@ +/*************************************************************************** + begin : Fri Nov 1 2002 + copyright : (C) 2002 by Christian Hubinger + email : chubinger@irrsinnig.org +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KMFMULTIPORTWIDGET_H +#define KMFMULTIPORTWIDGET_H + +#include <qwidget.h> +#include <kdemacros.h> +#include "kmyfirewallmultiportwidget.h" + + +class QString; + +namespace KMF { +class KMFError; + +/** + *@author Christian Hubinger + */ + +class KDE_EXPORT KMFMultiPortWidget : public KMyFirewallMultiPortWidget { + Q_OBJECT +public: + KMFMultiPortWidget( QWidget *parent = 0, const char *name = 0 ); + ~KMFMultiPortWidget(); + + KMFError* getPortString( QString* value ); + void setType( const QString& type ); + QString& type() const; + void loadPortString( QString& ); + void reset(); + +private slots: + void addPort(); + void addPort( QString& port ); + void removePort(); + void removePort( int index ); + +private: + KMFError *m_err; + +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfmynetworkwidget.cpp b/kmyfirewall/kmfwidgets/kmfmynetworkwidget.cpp new file mode 100644 index 0000000..d9d7a2c --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfmynetworkwidget.cpp @@ -0,0 +1,585 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#include "kmfmynetworkwidget.h" + +// QT includes +#include <qstring.h> +#include <qframe.h> +#include <qpixmap.h> +#include <qwidgetstack.h> +#include <qtextedit.h> +#include <qlabel.h> +#include <qlayout.h> + +// KDe Includes +#include <ktabwidget.h> +#include <kiconloader.h> +#include <klocale.h> +#include <kglobal.h> +#include <kmessagebox.h> +#include <kdebug.h> +#include <kpopupmenu.h> +#include <kinputdialog.h> + +// Project includes +#include "kmfhostwidget.h" +#include "kmfinterfacewidget.h" +#include "kmfsystemsettingslinux.h" +#include "kmfnetworkwidget.h" + +#include "../core/kmfnetzone.h" +#include "../core/kmfdoc.h" +#include "../core/kmfnetwork.h" +#include "../core/kmftarget.h" +#include "../core/kmftargetconfig.h" +#include "../core/kmferror.h" +#include "../kmfwidgets/kmflistviewitem.h" + +namespace KMF { +KMFMyNetworkWidget::KMFMyNetworkWidget(QWidget* parent, const char* name, WFlags fl) +: KMyFirewallMyNetworkWidget(parent,name,fl) +{ + kdDebug() << "Contructor: KMFMyNetworkWidget::KMFMyNetworkWidget(QWidget* parent, const char* name, WFlags fl)" << endl; + m_network = 0; + m_contextMenu = new KPopupMenu( this, "m_contextMenu" ); + + connect( m_lv_zones, SIGNAL( contextMenuRequested ( QListViewItem*, const QPoint&, int ) ), + this, SLOT( slotZoneRBM( QListViewItem*, const QPoint&, int ) ) ); + + connect( m_lv_zones, SIGNAL( pressed( QListViewItem* ) ) , + this, SLOT( slotNewItemSelected( QListViewItem* ) ) ); + + connect( m_lv_zones, SIGNAL( itemRenamed ( QListViewItem *, int, const QString & ) ) , + this, SLOT( slotRenameItem( QListViewItem *, int, const QString & ) ) ); + + + + loadIcons(); + setupPropertiesView(); +} + +void KMFMyNetworkWidget::saveConfig() { + kdDebug() << "KMFMyNetworkWidget::saveConfig()" << endl; + m_network->exportXMLRuleset( false, false ); + // m_network->saveConfig(); +} + +void KMFMyNetworkWidget::setNetwork( KMFNetwork* net ) { +// if ( ! m_network ) { +// m_network = net; +// +// } else { + m_network = net; + m_lv_zones->clear(); + KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() ); + it->setupZoneView(); +// } +// m_lv_zones->clear(); +// KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() ); +// it->setupZoneView(); +} + +void KMFMyNetworkWidget::setupPropertiesView() { + kdDebug() << "void KMFMyNetworkWidget::setupPropertiesView()" << endl; + m_hostProperties = new KMFHostWidget( this, "host widget" ); + kt_hostProperties->addTab( m_hostProperties, i18n( "General" ) ); + connect( m_hostProperties, SIGNAL( sigTargetChanged() ), + this, SLOT( slotTargetChanged() ) ); + + m_hostProperties->InitGUI(); + + m_hostInterfaces = new KMFInterfaceWidget( this, "interface widget" ); + kt_hostProperties->addTab( m_hostInterfaces, i18n( "Interfaces" ) ); + + m_hostSettingsLinux = new KMFSystemSettingsLinux( this, "system settings widget" ); + kt_hostProperties->addTab( m_hostSettingsLinux, i18n( "System Settings" ) ); + + +// QWidget *zonePropsWidget = new QWidget( this, "ads" ); + + +// QLabel *desc = new QLabel( i18n("<qt>Define your network zone here by defining the Networks IP and netmask.</qt>") , zonePropsWidget, "ad" ); +// +// QLabel *desc2 = new QLabel( i18n("Zone Documentation:") , zonePropsWidget, "ad" ); +// +// m_zone_desc = new QTextEdit( zonePropsWidget, "adf" ); +// m_zone_desc->setReadOnly( false ); +// QGridLayout *grid = new QGridLayout( zonePropsWidget, 3,2); + + m_network_widget = new KMFNetworkWidget( this, "m_network_widget" ); + + connect( m_network_widget,SIGNAL( sigZoneChanged( KMFNetZone* ) ), + this,SLOT( slotZoneChanged( KMFNetZone* ) ) ); + +// grid->addWidget( m_network_widget, 0,0 ); +// grid->addWidget( m_network_widget, 1,0 ); +// grid->addWidget( desc2,0,1 ); +// grid->addMultiCellWidget( m_zone_desc, 1,2,1,1); + + kt_zoneProperties->addTab( m_network_widget, i18n( "General" ) ); + + +} + +KMFMyNetworkWidget::~KMFMyNetworkWidget() { +} + + +void KMFMyNetworkWidget::slotNewItemSelected( QListViewItem* item ) { + kdDebug() << "void KMFMyNetworkWidget::slotNewItemSelected( QListViewItem* item )" << endl; + if ( ! item ) + return ; + m_zone = 0; + m_target = 0; + + m_lv_zones->blockSignals( true ); + m_lv_zones->clearSelection(); + m_lv_zones->setSelected( item, true ); + m_lv_zones->blockSignals( false ); + + KMFListViewItem* kmfitem = dynamic_cast<KMFListViewItem*> ( item ); + + if ( ! kmfitem ) { + kdDebug() << "No Item Selected!" << endl; + return; + } + + m_hostProperties->setEnabled( false ); + if ( kmfitem != 0 && kmfitem->netfilterObject()->type() == NetfilterObject::NETZONE ) { + kdDebug() << "Selected NETZONE" << endl; + m_wsEdit->raiseWidget( ws_pageZoneProperties ); + // kt_hostProperties->showPage( m_hostProperties ); + m_zone = kmfitem->zone(); + if ( m_zone ) { +// kdDebug() << "kmfitem->zone() pointer is valid" << endl; + kmfitem->setText( 0,m_zone->guiName() ); + kmfitem->setText( 1, "[" + m_zone->address()->toString() + i18n("/%1]").arg( m_zone->maskLength() ) ); + + m_network_widget->loadZone( m_zone ); + if ( m_zone->readOnly() ) { + m_network_widget->allowEdit( false ); + } else { + m_network_widget->allowEdit( true ); + } + + } + } else if ( kmfitem != 0 && kmfitem->netfilterObject()->type() == NetfilterObject::KMFTARGET ) { + kdDebug() << "Selected KMFTARGET" << endl; + m_wsEdit->raiseWidget( ws_pageHostProperties ); + // kt_hostProperties->showPage( m_hostProperties ); + m_target = kmfitem->target(); + if ( m_target ) { +// kdDebug() << "kmfitem->target() pointer is valid" << endl; + m_zone = m_target->zone(); + m_hostProperties->loadHost( m_target ); + m_hostProperties->setEnabled( true ); + + m_hostInterfaces->loadTarget( m_target ); + + if ( m_target->config()->oS() == "linux" ) { + kt_hostProperties->setTabEnabled( m_hostSettingsLinux, true ); + m_hostSettingsLinux->loadTarget( m_target ); + } else { + kt_hostProperties->setTabEnabled( m_hostSettingsLinux, false ); + } + + kmfitem->setupTargetView(); + } + } else if ( kmfitem != 0 && kmfitem->netfilterObject()->type() == NetfilterObject::NETHOST ) { + kdDebug() << "Selected NETHOST" << endl; + } + kdDebug() << "Laving slotNewItemSelected()" << endl; +} + +void KMFMyNetworkWidget::slotZoneChanged( KMFNetZone* z ) { + kdDebug() << "void KMFMyNetworkWidget::slotZoneChanged( KMFNetZone* z )" << endl; + if ( KMFListViewItem *item = findItem( z->uuid() ) ) { + kdDebug() << "Updating item" << endl; + item->setText( 1, "[" + z->address()->toString() + i18n("/%1]").arg( z->maskLength() ) ); + item->setText( 4, z->description() ); + } + + + m_lv_zones->clear(); + KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() ); + it->setupZoneView(); + + if ( KMFListViewItem *item = findItem( m_zone->uuid() ) ) { + slotNewItemSelected( item ); + } +} + + + +void KMFMyNetworkWidget::slotZoneRBM( QListViewItem* item, const QPoint& point, int ) { + if ( ! item ) + return ; + KMFListViewItem* kmfitem = dynamic_cast<KMFListViewItem*> ( item ); + if ( kmfitem != 0 && kmfitem->type() == NetfilterObject::NETZONE ) { + kdDebug() << "Setting up Zone RBM:" << endl; + m_target = 0; + m_zone = 0; + m_zone = kmfitem->zone(); + if ( m_zone ) { + m_contextMenu->clear(); + QString name = m_zone->name(); + QString lab_str = i18n("Zone: %1").arg( m_zone->guiName() ); + m_contextMenu->insertTitle( icon_chain, lab_str ); + m_contextMenu->insertItem( icon_new, i18n( "Add Host..." ), this, SLOT( slotAddHost() ) ); + + + m_contextMenu->insertSeparator(); + m_contextMenu->insertItem( icon_new, i18n( "Add Zone..." ), this, SLOT( slotAddZone() ) ); + if ( m_zone->name() != "incoming_world" && m_zone->name() != "outgoing_world" && ! m_zone->readOnly() ) { + m_contextMenu->insertItem( icon_rename, i18n( "Rename Zone..." ), this, SLOT( slotRenameZone() ) ); + m_contextMenu->insertSeparator(); + m_contextMenu->insertItem( icon_del, i18n( "Delete Zone" ), this, SLOT( slotDelZone() ) ); + } + + m_contextMenu->popup( point ); + } + } else if ( kmfitem != 0 && kmfitem->type() == NetfilterObject::KMFTARGET ) { + kdDebug() << "Setting up Host RBM:" << endl; + m_target = 0; + m_target = kmfitem->target(); + if ( m_target ) { + m_contextMenu->clear(); + QString name = m_target->name(); + QString lab_str = i18n("Host: %1").arg( m_target->guiName() ); + m_contextMenu->insertTitle( icon_chain, lab_str ); + if ( ! m_target->readOnly() ) { + m_contextMenu->insertItem( icon_rename, i18n( "Rename Host..." ), this, SLOT( slotRenameHost() ) ); + m_contextMenu->insertSeparator(); + m_contextMenu->insertItem( icon_del, i18n( "Delete Host..." ), this, SLOT( slotDelHost() ) ); + } + if ( ! m_target->isCurrentTarget() ) { + m_contextMenu->insertSeparator(); + m_contextMenu->insertItem( KGlobal::iconLoader()->loadIcon( "kmyfirewall", KIcon::Small ), i18n( "Make Active Target..." ), this, SLOT( slotSetActiveTarget() ) ); + } + + m_contextMenu->popup( point ); + } + } +} + +void KMFMyNetworkWidget::slotSetActiveTarget() { + if( ! m_target ) { + return; + } + m_network->setCurrentTarget( m_target ); + slotUpdateView(); + emit sigActiveTargetChanged(); +} + +void KMFMyNetworkWidget::slotAddHost() { + kdDebug() << "void KMFMyNetworkWidget::slotAddHost()" << endl; + bool ok; + QString name = KInputDialog::getText( i18n("New Host"), i18n("Host Name"),i18n("New Host"), &ok, this ); + if ( !ok ) + return; + + if ( m_zone ) { + KMFUndoEngine::instance()->startTransaction( + m_network->netzone(), + i18n("Add Target: %1 to Zone: %2").arg( name ).arg( m_zone->guiName() ) + ); + QString s = ""; + s = s.setNum( m_zone->hosts().count() ); + KMFTarget * host = m_zone->addTarget( "" + m_zone->name() + "_h_" + s, * (new QDomDocument() ) ); + if ( host ) { + host->setGuiName( name ); + m_target = host; + m_network->netzone()->refreshNetworkTree(); + // m_network->netzone()->changed(); + KMFUndoEngine::instance()->endTransaction(); + } else { + KMFUndoEngine::instance()->abortTransaction(); + } + + } + slotUpdateView(); +} + +void KMFMyNetworkWidget::slotDelHost() { + kdDebug() << "void KMFMyNetworkWidget::slotDelHost()" << endl; + if ( ! m_zone || ! m_target ) + return; + KMFUndoEngine::instance()->startTransaction( + m_zone, + i18n("Delete Target: %1 from Zone: %2").arg( m_target->guiName() ).arg( m_zone->guiName() ) + ); + m_zone->delHost( m_target ); + KMFUndoEngine::instance()->endTransaction(); + m_target = 0; + slotUpdateView(); +} + + +void KMFMyNetworkWidget::slotAddZone() { + kdDebug() << "void KMFMyNetworkWidget::slotAddZone()" << endl; + bool ok; + QString name = KInputDialog::getText(i18n("New Zone"), i18n("Zone Name"),i18n("NewZone"), &ok, this ); + if ( !ok ) + return; + + QString s = ""; + s = s.setNum( m_network->netzone()->zones().count() ); + + KMFUndoEngine::instance()->startTransaction( + m_network->netzone(), + i18n("Add Zone: %1 to Zone: %2").arg( name ).arg( m_network->netzone()->guiName() ) + ); + + KMFNetZone * zone = m_network->netzone()->addZone( "", new KMFError() ); + if ( zone ) { + zone->setGuiName( name ); + + m_zone = zone; + m_target = 0; + m_network->netzone()->refreshNetworkTree(); + slotUpdateView(); + KMFUndoEngine::instance()->endTransaction(); + } else { + KMFUndoEngine::instance()->abortTransaction(); + } +} + +void KMFMyNetworkWidget::slotDelZone() { + kdDebug() << "void KMFMyNetworkWidget::slotDelZone()" << endl; + if ( ! m_zone ) + return; + if ( m_zone->name() != i18n("world") ) { + KMFUndoEngine::instance()->startTransaction( + m_zone->zone(), + i18n("Delete Zone: %1 from Zone: %2").arg( m_zone->guiName() ).arg( m_zone->zone()->guiName() ) + ); + m_zone->zone()->delZone( m_zone ); + m_zone = 0; + slotUpdateView(); + KMFUndoEngine::instance()->endTransaction(); + } +} + +void KMFMyNetworkWidget::slotRenameItem( QListViewItem* item, int, const QString& name ) { + kdDebug() << "void KMFMyNetworkWidget::slotRenameItem( QListViewItem* item, int, const QString& name )" << endl; + if ( ! item ) + return; + + if ( name.isEmpty() ) { + slotUpdateView(); + return; + } + + if ( KMFListViewItem *kmfitem = dynamic_cast<KMFListViewItem*> (item) ) { + if ( kmfitem->type() == NetfilterObject::NETZONE ) { + KMFUndoEngine::instance()->startTransaction( + kmfitem->zone(), + i18n("Rename Zone: %1 to %3").arg( m_zone->guiName() ).arg( name ) + ); + + kmfitem->zone()->setGuiName( name ); + kdDebug() << "Renaming Zone: " << kmfitem->zone()->name() << endl; + slotUpdateView(); + KMFUndoEngine::instance()->endTransaction(); + return; + } + if ( kmfitem->type() == NetfilterObject::KMFTARGET ) { + KMFUndoEngine::instance()->startTransaction( + kmfitem->target(), + i18n("Rename Host: %1 to %3").arg( m_zone->guiName() ).arg( name ) + ); + kmfitem->target()->setGuiName( name ); + kdDebug() << "Renaming Host: " << kmfitem->target()->name() << endl; + slotUpdateView(); + KMFUndoEngine::instance()->endTransaction(); + return; + } + } +} + +void KMFMyNetworkWidget::slotRenameZone() { + kdDebug() << "void KMFMyNetworkWidget::slotRenameZone()" << endl; + if ( ! m_zone ) + return; + if ( KMFListViewItem* item = findItem( m_zone->uuid() ) ) { + item->setRenameEnabled( 0 ,true ); + item->startRename(0); + } +} + +void KMFMyNetworkWidget::slotRenameHost() { + kdDebug() << "void KMFMyNetworkWidget::slotRenameHost()" << endl; + if ( ! m_target ) + return; + if ( KMFListViewItem* item = findItem( m_target->uuid() ) ) { + item->setRenameEnabled( 0 ,true ); + item->startRename(0); + } +} + +void KMFMyNetworkWidget::slotUpdateView( NetfilterObject* ) { + kdDebug() << "void KMFMyNetworkWidget::slotUpdateView()" << endl; + if ( ! m_network ) { + kdDebug() << "WARNING: m_network == 0" << endl; + return; + } + slotUpdateView(); +} + +void KMFMyNetworkWidget::slotUpdateView() { + kdDebug() << "void KMFMyNetworkWidget::slotUpdateView()" << endl; + if ( ! m_network ) { + kdDebug() << "WARNING: m_network == 0" << endl; + return; + } + + + m_lv_zones->clear(); + KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() ); + it->setupZoneView(); + + m_lv_zones->setEnabled( true ); + if ( m_target ) { + if ( KMFListViewItem *item = findItem( m_target->uuid() ) ) { + m_lv_zones->setSelected( item, true ); + slotNewItemSelected( item ); + } + + + } else if ( m_zone ) { + if ( KMFListViewItem *item = findItem( m_zone->uuid() ) ) { + + m_lv_zones->setSelected( item, true ); + slotNewItemSelected( item ); + } + } + m_lv_zones->setSorting( 0 , false ); +} + +void KMFMyNetworkWidget::slotTargetChanged() { + kdDebug() << "KMFMyNetworkWidget::slotTargetChanged()" << endl; + if ( ! m_target ) { + kdDebug() << "m_target == 0" << endl; + return; + } + // m_network->netzone()->placeHostInZone( m_target ); + + m_network->netzone()->refreshNetworkTree(); + + m_lv_zones->clear(); + KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() ); + it->setupZoneView(); + + if ( KMFListViewItem *item = findItem( m_target->uuid() ) ) { + slotNewItemSelected( item ); + } + emit sigActiveTargetChanged(); +} + +KMFListViewItem* KMFMyNetworkWidget::findItem( const QUuid& obj_id ) { + // kdDebug() << "KMFListViewItem* KMFMyNetworkWidget::findItem( int obj_id )" << endl; + QListViewItem* root = m_lv_zones->firstChild(); + if ( ! root ) + return 0; + QListViewItem* item = root->firstChild(); + while ( item ) { + if ( KMFListViewItem* kmfitem = dynamic_cast<KMFListViewItem*> ( item ) ) { + // kdDebug() << "\nkmfitem->uuid(): " << kmfitem->uuid() << + // " obj_id: " << obj_id << endl; + + if ( kmfitem->uuid() == obj_id ) { + // kdDebug() << "MATCHED" << endl; + return kmfitem; + } + } + item = item->itemBelow(); + } + return 0; +} + + + +/*$SPECIALIZATION$*/ +void KMFMyNetworkWidget::loadIcons() { + kdDebug() << "void KMFGenericInterfa::loadIcons()" << endl; + KIconLoader *loader = KGlobal:: iconLoader(); + QString icon_name; + + icon_name = "up"; + icon_up = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "down"; + icon_down = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "editdelete"; + icon_del = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "filenew"; + icon_new = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "edit"; + icon_edit = loader->loadIcon( icon_name, KIcon::Small ); + + + icon_name = "filter"; + icon_filter = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "text"; + icon_rename = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "rule-22"; + icon_rule = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "view_tree"; + icon_chain = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "reject"; + icon_reject = loader->loadIcon( icon_name, KIcon::User ); + + icon_name = "target"; + icon_target = loader->loadIcon( icon_name, KIcon::User ); + + icon_name = "stop"; + icon_drop = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "button_ok"; + icon_accept = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "filesaveas"; + icon_log = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "undo"; + icon_return = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "editclear"; + icon_cmd = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "filter"; + icon_filter = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "pipe"; + icon_queue = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "editcopy"; + icon_copy = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "forward"; + icon_move = loader->loadIcon( icon_name, KIcon::Small ); + +} + +} + +#include "kmfmynetworkwidget.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfmynetworkwidget.h b/kmyfirewall/kmfwidgets/kmfmynetworkwidget.h new file mode 100644 index 0000000..97d25f4 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfmynetworkwidget.h @@ -0,0 +1,107 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef KMFMYNETWORKWIDGET_H +#define KMFMYNETWORKWIDGET_H + +#include "kmyfirewallmynetworkwidget.h" + +#include <qwidget.h> +#include <kdialogbase.h> +#include <kconfig.h> +#include <kglobal.h> +#include <kprocess.h> +#include <qstring.h> +#include <qpixmap.h> +#include <qguardedptr.h> +#include <quuid.h> +class KPopupMenu; +class QTextEdit; + + +namespace KMF { +class KMFHostWidget; +class KMFInterfaceWidget; +class KMFSystemSettingsLinux; +class KMFNetworkWidget; +class KMFNetZone; +class KMFNetwork; +class KMFTarget; +class KMFListViewItem; +class NetfilterObject; + +class KMFMyNetworkWidget : public KMyFirewallMyNetworkWidget +{ + Q_OBJECT + +public: + KMFMyNetworkWidget(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~KMFMyNetworkWidget(); + /*$PUBLIC_FUNCTIONS$*/ + void saveConfig(); + void setNetwork( KMFNetwork* ); + +public slots: + /*$PUBLIC_SLOTS$*/ + void slotUpdateView(); + void slotUpdateView( NetfilterObject* ); +signals: + void sigActiveTargetChanged(); + +protected: + /*$PROTECTED_FUNCTIONS$*/ + +protected slots: + /*$PROTECTED_SLOTS$*/ + void slotZoneRBM( QListViewItem*, const QPoint&, int ); + void slotNewItemSelected( QListViewItem* ); + void slotAddHost(); + void slotDelHost(); + void slotAddZone(); + void slotDelZone(); + void slotRenameItem( QListViewItem* item, int, const QString& name ); + void slotRenameZone(); + void slotRenameHost(); + void slotZoneChanged( KMFNetZone* ); + void slotTargetChanged(); + void slotSetActiveTarget(); + + private: + void setupPropertiesView(); + void loadIcons(); + KMFListViewItem* findItem( const QUuid& obj_id ); + + private: + KMFHostWidget *m_hostProperties; + KMFInterfaceWidget *m_hostInterfaces; + KMFSystemSettingsLinux *m_hostSettingsLinux; + + QPixmap icon_up, icon_down, icon_del, icon_edit, icon_rule, icon_filter, icon_rename, + icon_chain, icon_log, icon_accept, icon_drop, icon_cmd, icon_reject, icon_return, + icon_target, icon_queue, icon_new, icon_copy, icon_move; + + + // KMFNetZone *m_globalzone; + // KMFTarget *m_localhost; + + QGuardedPtr<KMFNetwork> m_network; + QGuardedPtr<KMFNetZone> m_zone; + QGuardedPtr<KMFTarget> m_target; + + // QTextEdit* m_zone_desc; + KMFNetworkWidget* m_network_widget; + // QWidget *ws_pageZoneProperties; + KPopupMenu* m_contextMenu; +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.cpp b/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.cpp new file mode 100644 index 0000000..c6efc1a --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.cpp @@ -0,0 +1,293 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#include "kmfnethostpropertieswidget.h" + +// QT includes +#include <qlistview.h> +#include <qcheckbox.h> +#include <qspinbox.h> +#include <qcombobox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qgroupbox.h> +#include <qwidgetstack.h> +#include <qtextedit.h> +#include <qframe.h> + +// KDE includes +#include <kdebug.h> +#include <klocale.h> +#include <klistview.h> +#include <kcombobox.h> +#include <kpopupmenu.h> +#include <kiconloader.h> +#include <kinputdialog.h> +#include <knuminput.h> + +// Project Includes +#include "../core/kmftarget.h" +#include "../core/ipaddress.h" +#include "../core/kmfnethost.h" +#include "../core/kmfnetzone.h" +#include "../core/kmfundoengine.h" + +#include "kmfipv4addresswidget.h" +namespace KMF { +KMFNetHostPropertiesWidget::KMFNetHostPropertiesWidget ( QWidget* parent, const char* name, WFlags fl ) + : KMyFirewallNetHostProperties ( parent,name,fl ) { + + m_address_widget = new KMFIPv4AddressWidget( m_frameAddress, "m_address_widget" ); + + connect( m_address_widget, SIGNAL( sigAddressChanged( int, int, int, int ) ), + this,SLOT( slotAddressChanged( int, int, int, int ) ) ); + + connect( m_cb_host_limit, SIGNAL( toggled( bool ) ), + this, SLOT( slotHostLimitToggled( bool ) ) ); + + connect( m_sb_host_rate, SIGNAL( valueChanged( int ) ), + this, SLOT( slotHostLimitValueChanged( int ) ) ); + + connect( m_cb_limit_host_interval, SIGNAL( activated( int ) ), + this, SLOT( slotHostLimitScaleChanged( int ) ) ); + + connect( m_cb_host_log, SIGNAL( toggled( bool ) ), + this, SLOT( slotHostLogToggled( bool ) ) ); + + connect( m_host_desc, SIGNAL( textChanged() ), + this, SLOT( slotDescriptionChanged() ) ); + + QGridLayout *grid = new QGridLayout( m_frameAddress, 1, 1 ); + grid->addWidget( m_address_widget, 0, 0 ); + m_frameAddress->adjustSize(); + adjustSize(); +} + +KMFNetHostPropertiesWidget::~KMFNetHostPropertiesWidget() {} + +void KMFNetHostPropertiesWidget::blockAllSignals( bool onoff ) { + m_cb_limit_host_interval->blockSignals( onoff ); + m_cb_host_limit->blockSignals( onoff ); + m_sb_host_rate->blockSignals( onoff ); + m_host_desc->blockSignals( onoff ); +} + +void KMFNetHostPropertiesWidget::slotHostDeleted() { + setEnabled( false ); + m_host = 0; +} + +void KMFNetHostPropertiesWidget::loadHost( KMFNetHost* host ) { + kdDebug() << "KMFNetHostPropertiesWidget::loadTarget( KMFNetHost* host " << endl; + if ( ! host ) { + return; + } + + if ( m_host ) { + disconnect( m_host, SIGNAL( destroyed() ), + this,SLOT( slotHostDeleted() ) ); + } + + m_host = host; + connect( m_host, SIGNAL( destroyed() ), + this,SLOT( slotHostDeleted() ) ); + blockAllSignals( true ); + setEnabled( true ); + m_address_widget->loadIPAddress( + m_host->address()->getDigit( 0 ), + m_host->address()->getDigit( 1 ), + m_host->address()->getDigit( 2 ), + m_host->address()->getDigit( 3 ) + ); + if ( m_host->limit() ) { + m_cb_host_limit->setChecked( true ); + m_sb_host_rate->setEnabled( true ); + m_cb_limit_host_interval->setEnabled( true ); + m_sb_host_rate->setValue( m_host->limitRate() ); + kdDebug() << "Found host log scale: " << m_host->limitScale() << endl; + + m_cb_limit_host_interval->blockSignals( true ); + if ( m_host->limitScale() == "second" ) { + m_cb_limit_host_interval->setCurrentItem( 0 ); + } else if ( m_host->limitScale() == "minute" ) { + m_cb_limit_host_interval->setCurrentItem( 1 ); + } else if ( m_host->limitScale() == "hour" ) { + m_cb_limit_host_interval->setCurrentItem( 2 ); + } else { + kdDebug() << "Found illefal value: " << m_host->limitScale() << endl; + } + m_cb_limit_host_interval->blockSignals( false ); + + } else { + m_cb_host_limit->setChecked( false ); + m_sb_host_rate->setEnabled( false ); + m_cb_limit_host_interval->setEnabled( false ); + } + + KMFNetZone* parentZone = m_host->zone()->rootZone(); + if ( parentZone->name() == "incoming_world" ) { + m_cb_host_log->setChecked( m_host->logIncoming() ); + } else if ( parentZone->name() == "outgoing_world" ) { + m_cb_host_log->setChecked( m_host->logOutgoing() ); + } + + if ( m_host_desc->text().simplifyWhiteSpace() != m_host->description() ) { + m_host_desc->blockSignals( true ); + m_host_desc->setText( m_host->description() ); + m_host_desc->blockSignals( false ); + } + m_host_desc->setReadOnly( false ); + blockAllSignals( false ); +} + +void KMFNetHostPropertiesWidget::slotAddressChanged( int d0, int d1, int d2, int d3 ) { + kdDebug() << "KMFNetHostPropertiesWidget::slotAddressChanged( " + << d0 << "." + << d1 << "." + << d2 << "." + << d3 << ")" << endl; + KMFUndoEngine::instance()->startTransaction( + m_host, + i18n("Change address of Host: %1.").arg( m_host->guiName() ) + ); + m_host->address()->setAddress( d0, d1, d2, d3 ); + m_host->zone()->rootZone()->placeHostInZone( m_host ); + m_host->zone()->rootZone()->refreshNetworkTree(); + KMFUndoEngine::instance()->endTransaction(); + + emit sigHostAddressChanged( m_host->address()->toString() ); + // emit sigHostChanged( m_host ); +} + + +void KMFNetHostPropertiesWidget::slotHostLogToggled( bool ) { + kdDebug() << "void KMFNetHostPropertiesWidget::slotHostLogToggled( bool )" << endl; + if ( ! m_host ) + return; + kdDebug() << "Changing host: " << m_host->guiName() << endl; + + KMFNetZone* parentZone = m_host->zone()->rootZone(); + if ( parentZone->name() == "incoming_world" ) { + if ( m_host->logIncoming() == m_cb_host_log->isChecked() ) { + return; + } + KMFUndoEngine::instance()->startTransaction( + m_host, + i18n( "%1 logging of incoming packets for host %2." ).arg( m_cb_host_log->isChecked() ? i18n( "Enable" ) : i18n( "Disable" ) ).arg( m_host->guiName() ) + ); + m_host->setLogIncoming( m_cb_host_log->isChecked() ); + KMFUndoEngine::instance()->endTransaction(); + } else if ( parentZone->name() == "outgoing_world" ) { + if ( m_host->logOutgoing() == m_cb_host_log->isChecked() ) { + return; + } + KMFUndoEngine::instance()->startTransaction( + m_host, + i18n( "%1 logging of outgoing packets for host %2." ).arg( m_cb_host_log->isChecked() ? i18n( "Enable" ) : i18n( "Disable" ) ).arg( m_host->guiName() ) + ); + m_host->setLogOutgoing( m_cb_host_log->isChecked() ); + KMFUndoEngine::instance()->endTransaction(); + } + emit sigHostChanged( m_host ); +} + +void KMFNetHostPropertiesWidget::slotHostLimitToggled( bool on ){ + kdDebug() << "void KMFNetHostPropertiesWidget::slotHostLimitToggled( bool " << on << " )" << endl; + if ( ! m_host ) + return; + kdDebug() << "Changing host: " << m_host->guiName() << endl; + if ( on ) { + KMFUndoEngine::instance()->startTransaction( + m_host, + i18n( "Enable package limit for host %1." ).arg( m_host->guiName() ) + ); + m_host->setLimit( m_sb_host_rate->value(), m_cb_limit_host_interval->currentText() ); + KMFUndoEngine::instance()->endTransaction(); + } else { + KMFUndoEngine::instance()->startTransaction( + m_host, + i18n( "Disable package limit for host %1." ).arg( m_host->guiName() ) + ); + m_host->setLimit( -1, m_cb_limit_host_interval->currentText() ); + KMFUndoEngine::instance()->endTransaction(); + } + emit sigHostChanged( m_host ); +} + +void KMFNetHostPropertiesWidget::slotHostLimitValueChanged( int ) { + kdDebug() << "void KMFNetHostPropertiesWidget::slotHostLimitValueChanged( int )" << endl; + if ( ! m_host ) + return; + kdDebug() << "Changing host: " << m_host->guiName() << endl; + if ( m_cb_host_limit->isChecked() ) { + KMFUndoEngine::instance()->startTransaction( + m_host, + i18n( "Change package limit for host %1 to %2/%3." ).arg( m_host->guiName() ).arg( m_sb_host_rate->value() ).arg( m_cb_limit_host_interval->currentText() ) + ); + m_host->setLimit( m_sb_host_rate->value(), m_cb_limit_host_interval->currentText() ); + KMFUndoEngine::instance()->endTransaction(); + } else { + KMFUndoEngine::instance()->startTransaction( + m_host, + i18n( "Disable package limit for host %1." ).arg( m_host->guiName() ) + ); + m_host->setLimit( -1, m_cb_limit_host_interval->currentText() ); + KMFUndoEngine::instance()->endTransaction(); + } + emit sigHostChanged( m_host ); +} + +void KMFNetHostPropertiesWidget::slotHostLimitScaleChanged( int ) { + kdDebug() << "void KMFGenericInterfaceProtocol::slotHostLimitValueChanged( int )" << endl; + if ( ! m_host ) + return; + kdDebug() << "Changing host: " << m_host->guiName() << endl; + if ( m_cb_host_limit->isChecked() ) { + KMFUndoEngine::instance()->startTransaction( + m_host, + i18n( "Change package limit for host %1 to %2/%3." ).arg( m_host->guiName() ).arg( m_sb_host_rate->value() ).arg( m_cb_limit_host_interval->currentText() ) + ); + m_host->setLimit( m_sb_host_rate->value(), m_cb_limit_host_interval->currentText() ); + KMFUndoEngine::instance()->endTransaction(); + } else { + KMFUndoEngine::instance()->startTransaction( + m_host, + i18n( "Disable package limit for host %1." ).arg( m_host->guiName() ) + ); + m_host->setLimit( -1, "" ); + KMFUndoEngine::instance()->endTransaction(); + } + emit sigHostChanged( m_host ); +} + +void KMFNetHostPropertiesWidget::slotDescriptionChanged() { + kdDebug() << "void KMFNetHostPropertiesWidget::slotDescriptionChanged( const QString& )" << endl; + if ( ! m_host ) { + return; + } + QString newTxt = m_host_desc->text().simplifyWhiteSpace(); + if ( newTxt != m_host->description() ) { + KMFUndoEngine::instance()->startTransaction( + m_host, + i18n( "Change documentation of host: %1" ).arg( m_host->guiName() ) + ); + m_host->setDescription( newTxt ); + KMFUndoEngine::instance()->endTransaction(); + } + emit sigHostChanged( m_host ); +} + +} + +#include "kmfnethostpropertieswidget.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.h b/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.h new file mode 100644 index 0000000..6eb76d2 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.h @@ -0,0 +1,63 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef KMFNETHOSTPROPERTIESWIDGET_H +#define KMFNETHOSTPROPERTIESWIDGET_H + +#include "kmyfirewallnethostproperties.h" + +// QT include +#include <qguardedptr.h> + +namespace KMF { +class KMFNetHost; +class KMFIPv4AddressWidget; + +class KMFNetHostPropertiesWidget : public KMyFirewallNetHostProperties { + Q_OBJECT + + public: + KMFNetHostPropertiesWidget ( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~KMFNetHostPropertiesWidget(); + /*$PUBLIC_FUNCTIONS$*/ + + void loadHost( KMFNetHost* ); + public slots: + /*$PUBLIC_SLOTS$*/ + + protected: + /*$PROTECTED_FUNCTIONS$*/ + + protected slots: + /*$PROTECTED_SLOTS$*/ + void slotAddressChanged( int, int, int, int ); + void slotHostLimitToggled( bool ); + void slotHostLogToggled( bool ); + void slotHostLimitValueChanged( int ); + void slotHostLimitScaleChanged( int ); + void slotDescriptionChanged(); + void slotHostDeleted(); + + private: + void blockAllSignals( bool ); + + private: + QGuardedPtr<KMFNetHost> m_host; + KMFIPv4AddressWidget *m_address_widget; + + signals: + void sigHostAddressChanged( const QString& ); + void sigHostChanged( KMFNetHost* ); +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmfnetworkwidget.cpp b/kmyfirewall/kmfwidgets/kmfnetworkwidget.cpp new file mode 100644 index 0000000..627d48f --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfnetworkwidget.cpp @@ -0,0 +1,180 @@ +// +// C++ Implementation: kmfnetworkwidget +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "kmfnetworkwidget.h" + +// QT includes +#include <qlabel.h> +#include <qtextedit.h> +#include <qevent.h> + +// KDE includes +#include <kdebug.h> +#include <knuminput.h> +#include <klocale.h> + +// project includes +#include "../core/kmfundoengine.h" + + +namespace KMF { +KMFNetworkWidget::KMFNetworkWidget(QWidget *parent, const char *name) + : KMyFirewallNetworkWidget(parent, name) { + m_allowEdit = true; + connect( m_sb_from_1,SIGNAL( valueChanged( const QString& ) ), + this,SLOT( slotAddressChanged( const QString& ) ) ); + connect( m_sb_from_2,SIGNAL( valueChanged( const QString& ) ), + this,SLOT( slotAddressChanged( const QString& ) ) ); + connect( m_sb_from_3,SIGNAL( valueChanged( const QString& ) ), + this,SLOT( slotAddressChanged( const QString& ) ) ); + connect( m_sb_from_4,SIGNAL( valueChanged( const QString& ) ), + this,SLOT( slotAddressChanged( const QString& ) ) ); + + connect( m_sb_mask,SIGNAL( valueChanged( int ) ), + this,SLOT( slotShortMaskChanged( int ) ) ); + + connect( m_txt_desc,SIGNAL( textChanged() ), + this,SLOT( slotDescriptionChanged() ) ); + +} + + +KMFNetworkWidget::~KMFNetworkWidget() {} + +void KMFNetworkWidget::slotZoneDeleted() { + setEnabled( false ); +} + +void KMFNetworkWidget::loadZone( KMFNetZone* zone ) { + setEnabled( true ); + blockAllSignals( true ); + m_zone = zone; + connect( m_zone, SIGNAL( destroyed() ), this, SLOT ( slotZoneDeleted() ) ); + + m_sb_from_1->setEnabled( true ); + m_sb_from_2->setEnabled( true ); + m_sb_from_3->setEnabled( true ); + m_sb_from_4->setEnabled( true ); + m_sb_mask->setEnabled( true ); + + m_sb_from_1->setValue( zone->address()->getDigit( 0 ) ); + m_sb_from_2->setValue( zone->address()->getDigit( 1 ) ); + m_sb_from_3->setValue( zone->address()->getDigit( 2 ) ); + m_sb_from_4->setValue( zone->address()->getDigit( 3 ) ); + + lbl_mask->setText( zone->mask()->toString() ); + if ( zone->description() != m_txt_desc->text().simplifyWhiteSpace() ) { + m_txt_desc->setText( zone->description() ); + } + m_sb_mask->setValue( IPAddress::calcLenthToMask( *zone->mask() ) ); + blockAllSignals( false ); +} + +void KMFNetworkWidget::slotAddressChanged( const QString& ) { + kdDebug() << "void KMFNetworkWidget::slotAddressChanged( const QString& )" << endl; + if ( ! m_zone ) { + return; + } + + blockAllSignals( true ); + if ( m_allowEdit ) { + + const QString& newAddr = m_sb_from_1->text() +"."+ + m_sb_from_2->text() +"."+ + m_sb_from_3->text() +"."+ + m_sb_from_4->text(); + + if ( newAddr == m_zone->address()->toString() ) { + return; + } + KMFUndoEngine::instance()->startTransaction( + m_zone->rootZone(), + i18n( "Change address of Zone: %1" ).arg( m_zone->guiName() ) + ); + + m_zone->address()->setAddress( m_sb_from_1->value(), m_sb_from_2->value(), m_sb_from_3->value(), m_sb_from_4->value() ); + m_zone->rootZone()->refreshNetworkTree(); + KMFUndoEngine::instance()->endTransaction(); + emit sigZoneChanged( m_zone ); + } + blockAllSignals( false ); + +} + +void KMFNetworkWidget::slotShortMaskChanged( int len ) { + kdDebug() << "void KMFNetworkWidget::slotShortMaskChanged( const QString& )" << endl; + IPAddress addr = IPAddress::calcNetworkMaskFromLength( len ); + blockAllSignals( true ); + lbl_mask->setText( addr.toString() ); + if ( m_allowEdit && m_zone->maskLength() != len ) { + KMFUndoEngine::instance()->startTransaction( + m_zone->rootZone(), + i18n( "Change mask length of Zone: %1" ).arg( m_zone->guiName() ) + ); + m_zone->setMaskLength( len ); + m_zone->rootZone()->refreshNetworkTree(); + KMFUndoEngine::instance()->endTransaction(); + emit sigZoneChanged( m_zone ); + } + blockAllSignals( false ); +} + +void KMFNetworkWidget::slotDescriptionChanged() { + kdDebug() << "void KMFNetworkWidget::slotDescriptionChanged( const QString& )" << endl; + if ( ! m_zone ) { + return; + } + QString newTxt = m_txt_desc->text().simplifyWhiteSpace(); + if ( m_allowEdit && newTxt != m_zone->description() ) { + blockAllSignals( true ); + KMFUndoEngine::instance()->startTransaction( + m_zone, + i18n( "Change documentation of Zone: %1" ).arg( m_zone->guiName() ) + ); + m_zone->setDescription( newTxt ); + KMFUndoEngine::instance()->endTransaction(); + emit sigZoneChanged( m_zone ); + blockAllSignals( false ); + } +} + +void KMFNetworkWidget::focusOutEvent( QFocusEvent * e ) { + kdDebug() << "void KMFNetworkWidget::focusOutEvent( QFocusEvent * e )" << endl; + if ( e->lostFocus() && m_txt_desc->text().simplifyWhiteSpace() != m_zone->description() ) { + slotDescriptionChanged(); + } +} + +void KMFNetworkWidget::blockAllSignals( bool onOff ) { + m_sb_from_1->blockSignals( onOff ); + m_sb_from_2->blockSignals( onOff ); + m_sb_from_3->blockSignals( onOff ); + m_sb_from_4->blockSignals( onOff ); + m_txt_desc->blockSignals( onOff ); + m_sb_mask->blockSignals( onOff ); +} + +void KMFNetworkWidget::allowEdit( bool allow ) { + m_allowEdit = allow; + m_sb_from_1->setEnabled( allow ); + m_sb_from_2->setEnabled( allow ); + m_sb_from_3->setEnabled( allow ); + m_sb_from_4->setEnabled( allow ); + m_txt_desc->setEnabled( allow ); + m_sb_mask->setEnabled( allow ); +} + +} + + + + +#include "kmfnetworkwidget.moc" diff --git a/kmyfirewall/kmfwidgets/kmfnetworkwidget.h b/kmyfirewall/kmfwidgets/kmfnetworkwidget.h new file mode 100644 index 0000000..81357a4 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfnetworkwidget.h @@ -0,0 +1,65 @@ +// +// C++ Interface: kmfnetworkwidget +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef KMFNETWORKWIDGET_H +#define KMFNETWORKWIDGET_H + +#include "kmyfirewallnetworkwidget.h" + +// QT includes +#include <qwidget.h> +#include <qguardedptr.h> + +// KDE includes +#include <kdemacros.h> + +// project includes +#include "../core/kmfnetzone.h" +#include "../core/ipaddress.h" + +class QFocusEvent; + +/** +@author Christian Hubinger +*/ + +namespace KMF { +class KDE_EXPORT KMFNetworkWidget : public KMyFirewallNetworkWidget { + Q_OBJECT +public: + KMFNetworkWidget(QWidget *parent = 0, const char *name = 0); + ~KMFNetworkWidget(); + + void loadZone( KMFNetZone* ); + void allowEdit( bool ); +private slots: + void slotAddressChanged( const QString& ); + void slotDescriptionChanged(); + void slotShortMaskChanged( int ); + void slotZoneDeleted(); + +protected: + void focusOutEvent( QFocusEvent * ); + +private: + void blockAllSignals( bool ); + +private: + QGuardedPtr<KMFNetZone> m_zone; + bool m_allowEdit; + + + +signals: + void sigZoneChanged( KMFNetZone* ); +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfnewdocdlg.cpp b/kmyfirewall/kmfwidgets/kmfnewdocdlg.cpp new file mode 100644 index 0000000..bf313a2 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfnewdocdlg.cpp @@ -0,0 +1,96 @@ +/*************************************************************************** + begin : Thu Apr 17 2003 + copyright : (C) 2003 by Christian Hubinger + email : chubinger@irrsinnig.org +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kapplication.h" +#include "kmfnewdocdlg.h" +#include "../version.h" +#include "kmfnewdocdlg.moc" + +// QT includes +#include "qpixmap.h" +#include "qpainter.h" +#include "qlabel.h" +#include "qstring.h" +#include "qpushbutton.h" +#include "qrect.h" + + +// KDE includes +#include "kstandarddirs.h" +#include "kdebug.h" +namespace KMF { +KMFNewDocDlg::KMFNewDocDlg( QWidget *parent, const char *name, WFlags fl ) : KMyFirewallNewDocument( parent, name, fl ) { + KStandardDirs std_dir; + QString dir = std_dir.findResource( "data", "kmyfirewall/pics/splash_cut.png" ); + kdDebug() << "Found Splashscreen at: " << dir << endl; + + QPixmap pic = QPixmap::fromMimeSource( dir ); + QFont f( "helvetica", 8, QFont::Bold ); + if ( pic.isNull() ) + return ; + QPainter p( &pic ); + p.setFont( f ); + p.setPen( Qt::white ); + p.drawText( 165, 45, QString( "Version %1" ).arg( KMYFIREWALL_VERSION ) ); + p.drawText( 93, 215, QString( "%1" ).arg( COPYRIGHT_DATE ) ); + p.drawText( 70, 230, QString( "%1" ).arg( COPYRIGHT_OWNER ) ); + if ( pic.isNull() ) + return ; + l_pic->setPixmap( pic ); + connect( b_cancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); + connect( b_close, SIGNAL( clicked() ), this, SLOT( reject() ) ); + connect( b_empty, SIGNAL( clicked() ), this, SLOT( loadEmpty() ) ); + connect( b_template, SIGNAL( clicked() ), this, SLOT( loadTemplate() ) ); + connect( b_load_saved, SIGNAL( clicked() ), this, SLOT( loadSaved() ) ); + connect( b_help, SIGNAL( clicked() ), this, SLOT( slotHelp() ) ); + QRect screen = QApplication::desktop() ->screenGeometry(); + QRect mainRect; + screen = QApplication::desktop() ->screenGeometry( QApplication::desktop() ->screenNumber( mainRect.center() ) ); + move( screen.center() - QPoint( width() / 2, height() / 2 ) ); +} + +KMFNewDocDlg::~KMFNewDocDlg() {} + + + +void KMFNewDocDlg::reject() { + close(); +} + +void KMFNewDocDlg::loadEmpty() { + hide(); + emit sigNewDocLoadEmpty(); + close(); +} +void KMFNewDocDlg::loadWizard() { + hide(); + emit sigNewDocLoadWizard(); + close(); +} +void KMFNewDocDlg::loadTemplate() { + hide(); + emit sigNewDocLoadTemplate(); + close(); +} +void KMFNewDocDlg::loadSaved() { + hide(); + emit sigNewDocLoadSaved(); + close(); +} +void KMFNewDocDlg::slotHelp() { + kapp->invokeHelp(); +} + +} diff --git a/kmyfirewall/kmfwidgets/kmfnewdocdlg.h b/kmyfirewall/kmfwidgets/kmfnewdocdlg.h new file mode 100644 index 0000000..a473a72 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfnewdocdlg.h @@ -0,0 +1,52 @@ +/*************************************************************************** + begin : Thu Apr 17 2003 + copyright : (C) 2003 by Christian Hubinger + email : chubinger@irrsinnig.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KMFNEWDOCDLG_H +#define KMFNEWDOCDLG_H + +#include <qwidget.h> +#include <kdemacros.h> +#include "kmyfirewallnewdocument.h" + + +/** + *@author Christian Hubinger + */ + +class QKeyEvent; +namespace KMF { +class KDE_EXPORT KMFNewDocDlg : public KMyFirewallNewDocument { + Q_OBJECT +public: + KMFNewDocDlg(QWidget *parent=0, const char *name=0, WFlags fl = 0); + ~KMFNewDocDlg(); + + + +private slots: + void reject(); + void loadEmpty(); + void loadWizard(); + void loadTemplate(); + void loadSaved(); + void slotHelp(); +signals: + void sigNewDocLoadWizard(); + void sigNewDocLoadTemplate(); + void sigNewDocLoadSaved(); + void sigNewDocLoadEmpty(); +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfobjectinfo.cpp b/kmyfirewall/kmfwidgets/kmfobjectinfo.cpp new file mode 100644 index 0000000..5ab4b5c --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfobjectinfo.cpp @@ -0,0 +1,110 @@ +/*************************************************************************** + begin : Thu Apr 24 2003 + copyright : (C) 2003 by Christian Hubinger + email : chubinger@irrsinnig.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kmfobjectinfo.h" + +// KDE Includes +#include <kdebug.h> +#include <kapplication.h> +#include <klocale.h> + +// QT includes +#include <qstring.h> +#include <qlabel.h> +#include <qpushbutton.h> +#include <qtextedit.h> + +// Project includes +#include "../core/iptrule.h" +#include "../core/iptchain.h" +#include "../core/iptable.h" +#include "../core/kmfdoc.h" +#include "../core/kmfiptdoc.h" +#include "../core/kmfnetwork.h" +#include "../core/kmfundoengine.h" +namespace KMF { +KMFObjectInfo::KMFObjectInfo(QWidget *parent, const char *name, bool modal ) : KMyFirewallObjectInfo(parent, name, modal) { +} + +KMFObjectInfo::~KMFObjectInfo(){ +} + +void KMFObjectInfo::loadNetfilterObject( NetfilterObject* obj ) { + if ( ! obj ) + return; + m_netfilter_object = obj; + m_doc = 0; + switch( m_netfilter_object->type() ) { + case NetfilterObject::RULE: + m_header->setText( i18n("Rule Documentation") ); + break; + case NetfilterObject::CHAIN: + m_header->setText( i18n("Chain Documentation") ); + break; + default: + m_header->setText( i18n("Object Documentation") ); + break; + } + te_desc->setText( m_netfilter_object->description() ); +} + +void KMFObjectInfo::loadKMFDoc( KMFDoc* obj ){ + if ( ! obj ) + return; + m_doc = obj; + m_netfilter_object = 0; + m_header->setText( i18n("Firewall Documentation") ); + te_desc->setText( m_doc->description() ); +} + +void KMFObjectInfo::accept() { + if ( m_netfilter_object ) { + if ( m_netfilter_object->description() != te_desc->text() ) { + KMFUndoEngine::instance()->startTransaction( + m_netfilter_object, + i18n("Edit Documentaion for: %1").arg( m_netfilter_object->name() ) + ); + m_netfilter_object->setDescription( te_desc->text() ); + kdDebug() << "Description Changed: " << te_desc->text() << endl; + KMFUndoEngine::instance()->endTransaction(); + } + } else if ( m_doc ) { + if ( m_doc->description() != te_desc->text() ) { + KMFUndoEngine::instance()->startTransaction( + m_doc, + i18n("Edit Documentaion for: %1").arg( m_netfilter_object->name() ) + ); + m_doc->setDescription( te_desc->text() ); + KMFUndoEngine::instance()->endTransaction(); + kdDebug() << "Description Changed: " << te_desc->text() << endl; + } + } + + emit sigDocumentChanged(); + emit sigHideMe(); +} + +void KMFObjectInfo::reject() { + emit sigHideMe(); +} + +void KMFObjectInfo::slotHelp() { + kapp->invokeHelp( "rule_documentation" ); +} + +} + +#include "kmfobjectinfo.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfobjectinfo.h b/kmyfirewall/kmfwidgets/kmfobjectinfo.h new file mode 100644 index 0000000..0ef0327 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfobjectinfo.h @@ -0,0 +1,53 @@ +/*************************************************************************** + begin : Thu Apr 24 2003 + copyright : (C) 2003 by Christian Hubinger + email : chubinger@irrsinnig.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KMFOBJECTINFO_H +#define KMFOBJECTINFO_H + +#include <qwidget.h> +#include "kmyfirewallobjectinfo.h" + +#include <kdemacros.h> + +/** + *@author Christian Hubinger + */ +namespace KMF { +class NetfilterObject; +class KMFDoc; + +class KDE_EXPORT KMFObjectInfo : public KMyFirewallObjectInfo { + Q_OBJECT +public: + KMFObjectInfo(QWidget *parent=0, const char *name=0, bool modal=false); + ~KMFObjectInfo(); + + void loadNetfilterObject( NetfilterObject* ); + void loadKMFDoc( KMFDoc* ); + +private slots: + void accept(); + void reject(); + void slotHelp(); + +private: // data + NetfilterObject* m_netfilter_object; + KMFDoc* m_doc; +signals: + void sigDocumentChanged(); + void sigHideMe(); +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfportwidget.cpp b/kmyfirewall/kmfwidgets/kmfportwidget.cpp new file mode 100644 index 0000000..a27bfd3 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfportwidget.cpp @@ -0,0 +1,294 @@ +/*************************************************************************** + begin : Fri Nov 1 2002 + copyright : (C) 2002 by Christian Hubinger + email : chubinger@irrsinnig.org +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kmfportwidget.h" + +#include <qstring.h> +#include <qcheckbox.h> +#include <qspinbox.h> +#include <qlabel.h> + +#include <kcombobox.h> +#include <klocale.h> +#include <kdebug.h> + +#include "../core/kmferror.h" + +namespace KMF { +KMFPortWidget::KMFPortWidget( QWidget *parent, const char *name ) : KMyFirewallPortWidget( parent, name ) { + m_err = new KMFError(); + m_err->setErrType( KMFError::OK ); + m_err->setErrMsg( "" ); + QStringList *l = new QStringList(); + + cb_port_name->clear(); + l->append( "tcpmux" ); + l->append( "tcpmux" ); + l->append( "echo" ); + l->append( "discard" ); + l->append( "systat" ); + l->append( "daytime" ); + l->append( "netstat" ); + l->append( "qotd" ); + l->append( "msp" ); + l->append( "chargen" ); + l->append( "ftp-data" ); + l->append( "ftp" ); + l->append( "fsp" ); + l->append( "ssh" ); + l->append( "telnet" ); + l->append( "smtp" ); + l->append( "time" ); + l->append( "rlp" ); + l->append( "nameserver" ); + l->append( "whois" ); + l->append( "re-mail-ck" ); + l->append( "domain" ); + l->append( "mtp" ); + l->append( "bootps" ); + l->append( "bootpc" ); + l->append( "tftp" ); + l->append( "gopher" ); + l->append( "rje" ); + l->append( "finger" ); + l->append( "www" ); + l->append( "link" ); + l->append( "kerberos" ); + l->append( "supdup" ); + l->append( "hostnames" ); + l->append( "iso-tsap" ); + l->append( "csnet-ns" ); + l->append( "rtelnet" ); + l->append( "pop2" ); + l->append( "pop3" ); + l->append( "sunrpc" ); + l->append( "auth" ); + l->append( "sftp" ); + l->append( "uucp-path" ); + l->append( "nntp" ); + l->append( "ntp" ); + l->append( "pwdgen" ); + l->append( "netbios-ns" ); + l->append( "netbios-dgm" ); + l->append( "netbios-ssn" ); + l->append( "imap2" ); + l->append( "snmp" ); + l->append( "snmp-trap" ); + l->append( "cmip-man" ); + l->append( "cmip-agent" ); + l->append( "mailq" ); + l->append( "xdmcp" ); + l->append( "nextstep" ); + l->append( "bgp" ); + l->append( "prospero" ); + l->append( "irc" ); + l->append( "smux" ); + l->append( "at-rtmp" ); + l->append( "at-rtmp" ); + l->append( "at-nbp" ); + l->append( "at-echo" ); + l->append( "at-zis" ); + l->append( "qmtp" ); + l->append( "z3950" ); + l->append( "ipx" ); + l->append( "imap3" ); + l->append( "pawserv" ); + l->append( "zserv" ); + l->append( "fatserv" ); + l->append( "rpc2portmap" ); + l->append( "codaauth2" ); + l->append( "ulistserv" ); + l->append( "ldap" ); + l->append( "https" ); + l->append( "snpp" ); + l->append( "saft" ); + l->append( "npmp-local" ); + l->append( "npmp-gui" ); + l->append( "hmmp-ind" ); + l->append( "ipp" ); + l->append( "exec" ); + l->append( "biff" ); + l->append( "login" ); + l->append( "who" ); + l->append( "shell" ); + l->append( "syslog" ); + l->append( "printer" ); + l->append( "talk" ); + l->append( "ntalk" ); + l->append( "route" ); + l->append( "timed" ); + l->append( "tempo" ); + l->append( "courier" ); + l->append( "conference" ); + l->append( "netnews" ); + l->append( "netwall" ); + l->append( "gdomap" ); + l->append( "gdomap" ); + l->append( "uucp" ); + l->append( "klogin" ); + l->append( "kshell" ); + l->append( "afpovertcp" ); + l->append( "remotefs" ); + l->append( "nntps" ); + l->append( "submission" ); + l->append( "ldaps" ); + l->append( "tinc" ); + l->append( "silc" ); + l->append( "kerberos-adm" ); + l->append( "webster" ); + l->append( "rsync" ); + l->append( "ftps-data" ); + l->append( "ftps" ); + l->append( "telnets" ); + l->append( "imaps" ); + l->append( "ircs" ); + l->append( "pop3s" ); + l->append( "socks" ); + l->append( "mysql" ); + l->append( "jabber-client" ); + l->append( "jabber-server" ); + l->append( "postgres" ); + l->append( "x11" ); + l->append( "x11-1" ); + l->append( "x11-2" ); + l->append( "x11-3" ); + l->append( "x11-4" ); + l->append( "x11-5" ); + l->append( "x11-6" ); + l->append( "x11-7" ); + l->append( "font-service" ); + l->append( "kerberos4" ); + l->append( "kerberos_master" ); + l->append( "passwd_server" ); + l->append( "krb_prop" ); + l->append( "krbupdate" ); + l->append( "kpasswd" ); + l->append( "swat" ); + l->append( "kpop" ); + l->append( "knetd" ); + l->append( "zephyr-srv" ); + l->append( "zephyr-clt" ); + l->append( "zephyr-hm" ); + l->append( "eklogin" ); + l->append( "linuxconf" ); + l->append( "poppassd" ); + l->sort(); + cb_port_name-> insertStringList( *l ); + sb_port1->setMaxValue( 65535 ); + sb_port2->setMaxValue( 65535 ); + sb_port1->setMinValue( 1 ); + sb_port2->setMinValue( 1 ); +} + +KMFPortWidget::~KMFPortWidget() {} + +KMFError* KMFPortWidget::getPortString( QString* value ) { + QString port1 = ""; + QString port2 = ""; + QString portname = ""; + QString ddot = ":"; + if ( c_port_name->isChecked() ) { + portname = cb_port_name->currentText(); + kdDebug() << "Found portname: " << portname << endl; + value->append( portname ); + kdDebug() << "Return portname: " << *value << endl; + m_err->setErrType( KMFError::OK ); + m_err->setErrMsg( "" ); + return m_err; + } else { + port1 = port1.setNum( sb_port1->value() ); + value->append( port1 ); + if ( c_portrange->isChecked() ) { + port2 = port2.setNum( sb_port2->value() ); + value->append( ddot ); + value->append( port2 ); + } + + if ( c_inv->isChecked() ) { + value->prepend( "! " ); + } + m_err->setErrType( KMFError::OK ); + m_err->setErrMsg( "" ); + return m_err; + } + return m_err; +} + +void KMFPortWidget::loadPortString( QString& port ) { + kdDebug() << "void KMFPortWidget::loadPortString(QString&)" << endl; + kdDebug() << "Try to load PortString: " << port << endl; + setEnabled( true ); + if ( port.startsWith( "! " ) ) { + port = port.right( port.length() - 2 ); + c_inv->setChecked( true ); + } + + int pos = -1; + pos = port.find( ":" ); + if ( pos > -1 ) { + c_port_name->setChecked( false ); + c_portrange->setChecked( true ); + sb_port2->setEnabled( true ); + l_to->setEnabled( true ); + c_port_name->setEnabled( false ); + + QString port1 = port.left( pos ); + QString port2 = port.right( port.length() - pos - 1 ); + kdDebug() << "Found Ports: " << port1 << " and " << port2 << endl; + int p1, p2; + bool bp1, bp2; + p1 = port1.toInt( &bp1, 10 ); + p2 = port2.toInt( &bp2, 10 ); + if ( p1 ) + sb_port1->setValue( p1 ); + if ( p2 ) + sb_port2->setValue( p2 ); + } else { + kdDebug() << "Found Port: " << port << endl; + int p; + bool ok; + p = port.toInt( &ok, 10 ); + if ( ok ) { + sb_port1->setValue( p ); + } else { + c_port_name->setChecked( true ); + +// for ( uint i = 0; i < c_port_name->count(); i++ ) { +// QString tmp_item = c_port_name->text( i ); +// if ( tmp_item == port ) { +// c_port_name->setCurrentItem( i ); +// } +// } + + + cb_port_name->setCurrentText( port ); + + } + } +} + +void KMFPortWidget::reset() { + c_portrange->setChecked( false ); + c_inv->setChecked( false ); + l_to->setEnabled( false ); + c_port_name->setChecked( false ); + cb_port_name->setCurrentItem( 0 ); + sb_port1->setValue( 0 ); + sb_port2->setValue( 0 ); +} + +} + +#include "kmfportwidget.moc" diff --git a/kmyfirewall/kmfwidgets/kmfportwidget.h b/kmyfirewall/kmfwidgets/kmfportwidget.h new file mode 100644 index 0000000..f4a3965 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfportwidget.h @@ -0,0 +1,45 @@ +/*************************************************************************** + begin : Fri Nov 1 2002 + copyright : (C) 2002 by Christian Hubinger + email : chubinger@irrsinnig.org +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KMFPORTWIDGET_H +#define KMFPORTWIDGET_H + +#include <qwidget.h> +#include <kdemacros.h> +#include "kmyfirewallportwidget.h" + +/**Widget for input of portnumbers, portranges or names + *@author Christian Hubinger + */ + +namespace KMF { +class KMFError; + +class KDE_EXPORT KMFPortWidget : public KMyFirewallPortWidget { + Q_OBJECT +public: + KMFPortWidget( QWidget *parent = 0, const char *name = 0 ); + ~KMFPortWidget(); + KMFError* getPortString( QString* value ); + void loadPortString( QString& ); + void reset(); +private: + KMFError *m_err; + +signals: + void sigMultiPortChanged( bool ); +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfprocout.cpp b/kmyfirewall/kmfwidgets/kmfprocout.cpp new file mode 100644 index 0000000..7112468 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfprocout.cpp @@ -0,0 +1,208 @@ +/*************************************************************************** + begin : Thu Sep 5 2002 + copyright : (C) 2002 by Christian Hubinger + email : chubinger@irrsinnig.org +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kmfprocout.h" + +// KDE includes +#include <klocale.h> +#include <kdebug.h> +#include <kiconloader.h> +#include <kstandarddirs.h> +#include <kpushbutton.h> + + +// QT includes +#include <qtextbrowser.h> +#include <qlayout.h> +#include <qlabel.h> +#include <qpixmap.h> +#include <qfont.h> + +// Project Includes +#include "../core/xmlnames.h" +namespace KMF { +KMFProcOut::KMFProcOut( QWidget *parent, const char *name, WFlags fl ) : QWidget( parent, name, fl ) { + stderrbuf = new QString( "" ); + stdoutbuf = new QString( "" ); + m_job_name = XML::Undefined_Value; + childproc = new KProcess(); + + connect( childproc, SIGNAL( receivedStdout( KProcess*, char*, int ) ), this, SLOT( slotReceivedOutput( KProcess*, char*, int ) ) ); + connect( childproc, SIGNAL( receivedStderr( KProcess*, char*, int ) ), this, SLOT( slotReceivedError( KProcess*, char*, int ) ) ); + connect( childproc, SIGNAL( processExited( KProcess* ) ), this, SLOT( slotProcessExited( KProcess* ) ) ) ; + initGUI(); + hide(); + kdDebug() << "KMFProcOut: Finished initialisation." << endl; +} + +KMFProcOut::~KMFProcOut() { + delete childproc; +} + +void KMFProcOut::initGUI() { + KIconLoader * loader = KGlobal:: iconLoader(); + QString icon_name; + + icon_name = "stop"; + icon_stop = loader->loadIcon( icon_name, KIcon::Small ); + + icon_name = "quit"; + icon_close = loader->loadIcon( icon_name, KIcon::Small ); + + m_layout = new QGridLayout( this, 0, 0, 2, 2, "layout" ); + + m_lbview = new QTextBrowser( this, "m_lbview" ); + m_lbview->setTextFormat( RichText ); + + + m_lbview->setFont( QFont( "Nimbus Mono L", 9 ) ); + + m_ljob_name = new QLabel( this, "m_ljob_name" ); + QFont ljob_name_font( m_ljob_name->font() ); + ljob_name_font.setBold( TRUE ); + m_ljob_name->setFont( ljob_name_font ); + m_ljob_name->setFrameShape( QLabel::StyledPanel ); + m_ljob_name->setFrameShadow( QLabel::Sunken ); + m_ljob_name->setText( i18n( "Nothing to do yet..." ) ); + + m_bkill = new KPushButton( icon_stop, i18n( "Kill Process" ) , this, "m_bkill" ); + m_bkill->setEnabled( false ); + connect( m_bkill, SIGNAL( clicked() ), this, SLOT( slotKillJob() ) ); + + m_layout->addMultiCellWidget( m_ljob_name, 0, 0, 0, 9 ); + m_layout->addMultiCellWidget( m_bkill, 0, 0, 9, 10 ); + m_layout->addMultiCellWidget( m_lbview, 1, 1, 0, 10 ); +} + + +void KMFProcOut::runCmd( const QString& cmd, const QString& job_name, const QString& job_description, bool useKdeSu ) { + kdDebug() << "KMFProcOut::runCmd(QString& cmd)"/* << cmd */<< endl; + show(); + m_lbview->clear(); + m_lbview->setTextFormat( RichText ); + m_ljob_name->setText( job_description ); + m_job_name = job_name; + startJob( cmd, useKdeSu ); +} + +void KMFProcOut::startJob( const QString &cmd, bool useKdeSu ) { + m_bkill->setEnabled( true ); + + childproc->clearArguments(); + if( useKdeSu ) { + *childproc << "kdesu" << "-t" << "-i" << "kmyfirewall" << "--noignorebutton" << "-d" << "-c" << cmd; + } else { + *childproc << "bash" << cmd; + } + + childproc->start( KProcess::NotifyOnExit, KProcess::AllOutput ); +} + +void KMFProcOut::slotKillJob() { + kdDebug() << "void KMFProcOut::killJob()" << endl; + childproc->kill(); +} + +bool KMFProcOut::isRunning() { + return childproc->isRunning(); +} + +void KMFProcOut::slotReceivedOutput( KProcess *, char *buffer, int buflen ) { + // Flush stderr buffer + if ( !stderrbuf->isEmpty() ) { + insertStderrLine( *stderrbuf ); + stderrbuf = new QString( "" ); + } + + *stdoutbuf += QString::fromLatin1( buffer, buflen ); + int pos; + while ( ( pos = stdoutbuf->find( '\n' ) ) != -1 ) { + QString line = stdoutbuf->left( pos ); + insertStdoutLine( line ); + stdoutbuf->remove + ( 0, pos + 1 ); + } +} + +void KMFProcOut::slotReceivedError( KProcess *, char *buffer, int buflen ) { + // Flush stdout buffer + if ( !stdoutbuf->isEmpty() ) { + insertStdoutLine( *stdoutbuf ); + stdoutbuf = new QString( "" ); + } + + *stderrbuf += QString::fromLatin1( buffer, buflen ); + int pos; + while ( ( pos = stderrbuf->find( '\n' ) ) != -1 ) { + QString line = stderrbuf->left( pos ); + insertStderrLine( line ); + stderrbuf->remove + ( 0, pos + 1 ); + } +} + +void KMFProcOut::slotProcessExited( KProcess * ) { + kdDebug() << "KMFProcOut::slotProcessExited()" << endl; + emit processExited( childproc ); + childFinished( childproc->normalExit(), childproc->exitStatus() ); + return ; +} + +void KMFProcOut::insertStdoutLine( const QString &line ) { + m_lbview->append( line + "" ); +} + +void KMFProcOut::insertStderrLine( const QString &line ) { + const QString & line2 = i18n( "<b>Error:</b> %1" ).arg( line ); + m_lbview->append( "<font color=\"red\">" + line2 + "</font>" ); +} + +void KMFProcOut::childFinished( bool , int status ) { + QString stat; + stat.setNum( status ); + const QString& job_name = m_job_name; + if ( status != 0 ) { + m_lbview->append( i18n( "<br><font color=\"red\"><b>Execution failed</b></font>" ) ); + m_lbview->append( i18n( "<font color=\"red\"><b>Exit(Code): %1</b></font>" ).arg( stat ) ); + emit sigJobFinished( false, job_name ); + } else { + m_lbview->append( i18n( "<br><b>Finished successfully</b>" ) ); + emit sigJobFinished( true, job_name ); + } + m_bkill->setEnabled( false ); + kdDebug() << "childFinished" << endl; + return ; +} + +void KMFProcOut::setText( const QString& str, const QString& commandName ) { + kdDebug() << "void KMFProcOut::setText(const QString& text)" << endl; +// kdDebug() << "Text: " << str << endl; + m_ljob_name->setText( commandName ); + m_lbview->clear(); + m_lbview->setTextFormat( PlainText ); + m_lbview->append( str ); +/* + QString *text = new QString( str ); + int pos; + while ( ( pos = text->find( '\n' ) ) != -1 && !text->isEmpty() ) { + QString line = text->left( pos ); + insertStdoutLine( line ); + text->remove( 0, pos + 1 ); + }*/ +} + +} + +#include "kmfprocout.moc" diff --git a/kmyfirewall/kmfwidgets/kmfprocout.h b/kmyfirewall/kmfwidgets/kmfprocout.h new file mode 100644 index 0000000..64553af --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfprocout.h @@ -0,0 +1,82 @@ +/*************************************************************************** + begin : Thu Sep 5 2002 + copyright : (C) 2002 by Christian Hubinger + email : chubinger@irrsinnig.org +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KMFPROCOUT_H +#define KMFPROCOUT_H + +// QT includes +#include <qwidget.h> +#include <qstring.h> +#include <qpixmap.h> + +// KDE includes +#include <kprocess.h> + +/** + *@author Christian Hubinger + */ + +class QLabel; +class QGridLayout; +class KPushButton; +class QTextBrowser; +namespace KMF { +class KDE_EXPORT KMFProcOut : public QWidget { + Q_OBJECT +public: + KMFProcOut( QWidget *parent = 0, const char *name = 0, WFlags fl = 0 ); + ~KMFProcOut(); + + bool isRunning(); + void runCmd( const QString& cmd, const QString& job_name, const QString& job_description, bool useKdeSu ); + void setText( const QString&, const QString& coomandName); + +public slots: + void slotKillJob(); + +protected slots: + void slotReceivedOutput( KProcess*, char*, int ); + void slotReceivedError( KProcess*, char*, int ); + void slotProcessExited( KProcess* ); + +private: + + void startJob( const QString &dir, bool useKdeSu ); + // void prepareJob( const QString &dir ); + void childFinished( bool normal, int status ); + void insertStderrLine( const QString &line ); + void insertStdoutLine( const QString &line ); + void slotSetButtons(); + void initGUI(); + +private: // data + QString* stderrbuf; + QString* stdoutbuf; + KProcess* childproc; + + QPixmap icon_stop, icon_close; + QString m_job_name; + QTextBrowser *m_lbview; + QLabel *m_ljob_name; + QGridLayout *m_layout; + KPushButton *m_bkill; + +signals: + void processExited( KProcess * ); + void rowSelected( int row ); + void sigJobFinished( bool, const QString& ); +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfprotocollistview.cpp b/kmyfirewall/kmfwidgets/kmfprotocollistview.cpp new file mode 100644 index 0000000..fba225d --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfprotocollistview.cpp @@ -0,0 +1,197 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#include "kmfprotocollistview.h" + +// QT includes +#include <qlistview.h> +#include <qcheckbox.h> +#include <qspinbox.h> +#include <qcombobox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qgroupbox.h> +#include <qwidgetstack.h> +#include <qtextedit.h> +#include <qtimer.h> + + +// KDE includes +#include <kdebug.h> +#include <klocale.h> +#include <klistview.h> +#include <kcombobox.h> +#include <kpopupmenu.h> +#include <kiconloader.h> +#include <kinputdialog.h> +#include <knuminput.h> + +// Project includes +#include "../core/kmfprotocolcategory.h" +#include "../core/kmfprotocol.h" +#include "../core/kmfprotocollibrary.h" +#include "../core/kmfprotocolusage.h" +#include "../core/kmfnetzone.h" +#include "../core/kmfnethost.h" +#include "../kmfwidgets/kmflistviewitem.h" +#include "../kmfwidgets/kmfchecklistitem.h" +namespace KMF { +KMFProtocolListView::KMFProtocolListView ( QWidget* parent, const char* name, WFlags fl ) + : KMyFirewallProtocolListView ( parent,name,fl ) { + m_reloading = false; + loadProtocols(); + connect( m_lv_protocols, SIGNAL( pressed( QListViewItem* ) ), + this, SLOT( slotNewProtocolSelected( QListViewItem* ) ) ); + +} + +KMFProtocolListView::~KMFProtocolListView() {} + +/*$SPECIALIZATION$*/ +void KMFProtocolListView::setHost( KMFNetHost* host ) { + setEnabled( true ); + + QValueList<KMFProtocol*>& allProts = KMFProtocolLibrary::instance()->allProtocols(); + QValueList<KMFProtocol*>::iterator it; + for( it = allProts.begin(); it != allProts.end(); ++it ) { +/* QPtrListIterator<KMFProtocol> it( *KMFProtocol::protocolLibrary() ); + while ( it.current() ) {*/ + KMFProtocol * prot = *it; + QListViewItem *qitem = m_lv_protocols->findItem( prot->name(), 0 ); + if ( ! qitem ) { + kdDebug() << "No item found for protocol: " << prot->name() << endl; + } + + KMFCheckListItem *item = dynamic_cast<KMFCheckListItem*>( qitem ); + if ( ! item ) { + kdDebug() << "Item is no KMFCheckListItem" << endl; + } + + if ( host->findProtocolUsageByProtocolUuid( prot->uuid() ) ) { + item->setOn( true ); + item->setEnabled( true ); + } + if ( host->protocolInherited( prot->uuid() ) ) { + item->setOn( true ); + item->setEnabled( false ); + } + if ( ! host->findProtocolUsageByProtocolUuid( prot->uuid() ) && ! host->protocolInherited( prot->uuid() ) ) { + item->setOn( false ); + item->setEnabled( true ); + } + } +} +void KMFProtocolListView::setZone( KMFNetZone* zone ) { + setEnabled( true ); + QValueList<KMFProtocol*>& allProts = KMFProtocolLibrary::instance()->allProtocols(); + QValueList<KMFProtocol*>::iterator it; + for( it = allProts.begin(); it != allProts.end(); ++it ) { + KMFProtocol * prot = *it; + QListViewItem *qitem = m_lv_protocols->findItem( prot->name(), 0 ); + if ( ! qitem ) { + kdDebug() << "No item found for protocol: " << prot->name() << endl; + } + + KMFCheckListItem *item = dynamic_cast<KMFCheckListItem*>( qitem ); + if ( ! item ) { + kdDebug() << "Item is no KMFCheckListItem" << endl; + } + + if ( zone->findProtocolUsageByProtocolUuid( prot->uuid() ) ) { + item->setOn( true ); + item->setEnabled( true ); + } + if ( zone->protocolInherited( prot->uuid() ) ) { + item->setOn( true ); + item->setEnabled( false ); + } + if ( ! zone->findProtocolUsageByProtocolUuid( prot->uuid() ) && + ! zone->protocolInherited( prot->uuid() ) ) { + item->setOn( false ); + item->setEnabled( true ); + } + } +} + +void KMFProtocolListView::loadProtocols() { + kdDebug() << "KMFProtocolListView::loadProtocols(" << endl; + + m_reloading = true; + QListViewItemIterator listViewIt( m_lv_protocols ); + while ( listViewIt.current() ) { + QListViewItem * qitem = listViewIt.current(); + ++listViewIt; + KMFCheckListItem * item = 0; + item = dynamic_cast<KMFCheckListItem*> ( qitem ); + if( item && item->protocolUsage() ) { + item->protocolUsage()->deleteLater(); + } + + } + m_lv_protocols->clear(); + + + setEnabled( false ); + QValueList<KMFProtocol*>& allProts = KMFProtocolLibrary::instance()->allProtocols(); + QValueList<KMFProtocol*>::iterator it; + for( it = allProts.begin(); it != allProts.end(); ++it ) { + KMFProtocol * prot = *it; +/* disconnect( prot, SIGNAL( destroyed( QObject* ) ), + this, SLOT( slotOnProtocolDeleted( QObject* ) ) ); + connect( prot, SIGNAL( destroyed( QObject* ) ), + this, SLOT( slotOnProtocolDeleted( QObject* ) ) );*/ + + KMFProtocolUsage *protUsage = prot->createUsage(); + protUsage->setProtocol( prot ); + + + + + QString cat = prot->category()->name(); + QListViewItem *parentItem = m_lv_protocols->findItem( cat, 0 ); + + if ( ! parentItem ) { + KMFListViewItem *newParentItem = new KMFListViewItem( m_lv_protocols, 0, prot->category() ); + newParentItem->setText( 0, cat ); + newParentItem->loadNetfilterObject( prot->category() ); + newParentItem->setOpen( true ); + parentItem = newParentItem; + } + + KMFCheckListItem *item = new KMFCheckListItem( parentItem, 0 , prot->name() , QCheckListItem::CheckBox, protUsage ); + item->setText( 0, prot->name() ); + // item->setText( 1, prot->uuid().toString() ); + } + m_reloading = false; +} + +void KMFProtocolListView::slotOnProtocolDeleted( QObject* ) { + if ( m_reloading ) { + return; + } + // loadProtocols(); +} + +void KMFProtocolListView::slotNewProtocolSelected( QListViewItem* qitem ) { + if ( KMFCheckListItem * item = dynamic_cast<KMFCheckListItem*> ( qitem ) ) { + emit sigProtocolClicked( item->protocolUsage(), item->isOn() ); + } else if ( KMFListViewItem * item = dynamic_cast<KMFListViewItem*> ( qitem ) ){ + emit sigProtocolCategoryClicked( item->protocolCategory() ); + } +} + +} + + +#include "kmfprotocollistview.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfprotocollistview.h b/kmyfirewall/kmfwidgets/kmfprotocollistview.h new file mode 100644 index 0000000..9a21510 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfprotocollistview.h @@ -0,0 +1,66 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef KMFPROTOCOLLISTVIEW_H +#define KMFPROTOCOLLISTVIEW_H + +#include "kmyfirewallprotocollistview.h" + +#include <qptrlist.h> +#include <qstring.h> +#include <qguardedptr.h> +#include <qpixmap.h> +#include <quuid.h> + + + +class QListViewItem; + +namespace KMF { +class KMFProtocolUsage; +class KMFProtocolCategory; +class KMFNetZone; +class KMFNetHost; + +class KMFProtocolListView : public KMyFirewallProtocolListView { + Q_OBJECT + + public: + KMFProtocolListView ( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~KMFProtocolListView(); + /*$PUBLIC_FUNCTIONS$*/ + void setHost( KMFNetHost* host ); + void setZone( KMFNetZone* zone ); + void loadProtocols(); + public slots: + /*$PUBLIC_SLOTS$*/ + + protected: + /*$PROTECTED_FUNCTIONS$*/ + + protected slots: + /*$PROTECTED_SLOTS$*/ + void slotNewProtocolSelected( QListViewItem* ); + void slotOnProtocolDeleted( QObject* ); + + private: + QGuardedPtr<KMFNetHost> *m_host; + QGuardedPtr<KMFNetZone> *m_zone; + bool m_reloading; + + signals: + void sigProtocolClicked( KMFProtocolUsage*, bool ); + void sigProtocolCategoryClicked( KMFProtocolCategory* ); +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.cpp b/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.cpp new file mode 100644 index 0000000..b79e346 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.cpp @@ -0,0 +1,230 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#include "kmfprotocolpropertieswidget.h" + +// QT includes +#include <qlistview.h> +#include <qcheckbox.h> +#include <qspinbox.h> +#include <qcombobox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qgroupbox.h> +#include <qwidgetstack.h> +#include <qtextedit.h> +#include <qframe.h> + +// KDE includes +#include <kdebug.h> +#include <klocale.h> +#include <klistview.h> +#include <kcombobox.h> +#include <kpopupmenu.h> +#include <kiconloader.h> +#include <kinputdialog.h> +#include <knuminput.h> + +// Project Includes +#include "../core/kmfnethost.h" +#include "../core/kmfnetzone.h" +#include "../core/kmfundoengine.h" +#include "../core/kmfprotocol.h" +#include "../core/kmfprotocolusage.h" +#include "../core/kmfprotocolcategory.h" +namespace KMF { +KMFProtocolPropertiesWidget::KMFProtocolPropertiesWidget ( QWidget* parent, const char* name, WFlags fl ) + : KMyFirewallProtocolPropertiesWidget ( parent,name,fl ) { + + connect( m_cb_limit, SIGNAL( toggled( bool ) ), + this, SLOT( slotEnableProtocolLimit( bool ) ) ); + + connect( m_sb_limit_rate, SIGNAL( valueChanged( int ) ), + this, SLOT( slotSetProtocolLimitRate( int ) ) ); + + connect( m_cb_limit_interval, SIGNAL( highlighted( const QString& ) ), this, SLOT( slotSetProtocolLimitInterval( const QString& ) ) ); + + connect( m_cb_log, SIGNAL( toggled( bool ) ), + this, SLOT( slotEnableProtocolLogging( bool ) ) ); + +} + +KMFProtocolPropertiesWidget::~KMFProtocolPropertiesWidget() {} + +/*$SPECIALIZATION$*/ + +void KMFProtocolPropertiesWidget::slotProtocolDeleted() { + m_gb_protocol_option->setEnabled( false ); + m_gb_protocol_description->setEnabled( true ); + m_protocolUsage = 0; +} + +void KMFProtocolPropertiesWidget::blockAllSignals( bool onoff ) { + m_cb_limit->blockSignals( onoff ); + m_sb_limit_rate->blockSignals( onoff ); + m_cb_limit_interval->blockSignals( onoff ); + m_cb_log->blockSignals( onoff ); +} + +void KMFProtocolPropertiesWidget::loadProtocolCategory( KMFProtocolCategory* protCat ) { + blockAllSignals( true ); + m_gb_protocol_option->setEnabled( false ); + m_gb_protocol_description->setEnabled( true ); + m_l_protocol_desc->setEnabled( true ); + QString text = i18n( "<qt><b>Description: </b>%1<br>" ).arg( protCat ->description() ); + text += "</qt>"; + + m_l_protocol_desc->setText( text ); + blockAllSignals( false ); +} + +void KMFProtocolPropertiesWidget::loadProtocol( KMFProtocol* prot ) { + blockAllSignals( true ); + m_gb_protocol_option->setEnabled( false ); + m_gb_protocol_description->setEnabled( true ); + m_l_protocol_desc->setEnabled( true ); + QString text = i18n( "<qt><b>Description: </b>%1<br>" ).arg( prot ->description() ); + const QString& tcpports = prot->tcpPortsList(); + + if ( ! tcpports.isEmpty() ) { + text += i18n( "<b>Affected TCP ports: </b>" ); + text += tcpports; + text +="<br>"; + } + const QString& udpports = prot->udpPortsList(); + if ( ! udpports.isEmpty() ) { + text += i18n( "<b>Affected UDP ports: </b>" ); + text += udpports; + } + text += "</qt>"; + + m_l_protocol_desc->setText( text ); + blockAllSignals( false ); +} + +void KMFProtocolPropertiesWidget::loadProtocolUsage( KMFProtocolUsage* prot ) { + + kdDebug() << "KMFNetHostPropertiesWidget::loadTarget( KMFNetHost* host " << endl; + if ( ! prot ) { + return; + } + + if ( m_protocolUsage ) { + disconnect( m_protocolUsage, SIGNAL( destroyed() ), + this,SLOT( slotProtocolDeleted() ) ); + } + + m_protocolUsage = prot; + connect( m_protocolUsage, SIGNAL( destroyed() ), + this,SLOT( slotProtocolDeleted() ) ); + setEnabled( true ); + + blockAllSignals( true ); + loadProtocol( m_protocolUsage->protocol() ); + + m_gb_protocol_option->setEnabled( true ); + m_gb_protocol_description->setEnabled( true ); + m_cb_log->setChecked( m_protocolUsage->logging() ); + if ( m_protocolUsage ->limit() > 0 ) { + m_cb_limit->setChecked( true ); + m_sb_limit_rate->setValue( m_protocolUsage ->limit() ); + if ( m_protocolUsage ->limitInterval() == "second" ) + m_cb_limit_interval->setCurrentItem( 0 ); + if ( m_protocolUsage ->limitInterval() == "minute" ) + m_cb_limit_interval->setCurrentItem( 1 ); + if ( m_protocolUsage ->limitInterval() == "hour" ) + m_cb_limit_interval->setCurrentItem( 2 ); + } else { + m_cb_limit->setChecked( false ); + } + + blockAllSignals( false ); +} + +void KMFProtocolPropertiesWidget::slotEnableProtocolLimit( bool onoff ) { + kdDebug() << "void KMFProtocolPropertiesWidget::slotEnableProtocolLimit( bool )" << endl; + if ( ! m_protocolUsage ) { + kdDebug() << "WARNING: No Current Protocol activated" << endl; + return; + } + if ( onoff ) { + KMFUndoEngine::instance()->startTransaction( + m_protocolUsage, + i18n("Enable package limit for protocol %1.").arg( m_protocolUsage->name() ) + ); + m_protocolUsage->setLimit( m_sb_limit_rate->value() ); + m_protocolUsage->setLimitInterval( m_cb_limit_interval->currentText() ); + KMFUndoEngine::instance()->endTransaction(); + } else { + KMFUndoEngine::instance()->startTransaction( + m_protocolUsage, + i18n("Sisable package limit for protocol %1.").arg( m_protocolUsage->name() ) + ); + m_protocolUsage->setLimit( -1 ); + KMFUndoEngine::instance()->endTransaction(); + } +} +void KMFProtocolPropertiesWidget::slotSetProtocolLimitRate( int rate ){ + kdDebug() << "void KMFProtocolPropertiesWidget::slotSetProtocolLimitRate( int )" << endl; + if ( ! m_protocolUsage ) { + kdDebug() << "WARNING: No Current Protocol activated" << endl; + return; + } + + + KMFUndoEngine::instance()->startTransaction( + m_protocolUsage, + i18n("Set package limit for protocol %1 to %2/%3.").arg( m_protocolUsage->name() ).arg( rate ).arg( m_protocolUsage->limitInterval() ) + ); + m_protocolUsage->setLimit( rate ); + KMFUndoEngine::instance()->endTransaction(); +} + +void KMFProtocolPropertiesWidget::slotSetProtocolLimitInterval( const QString& interval ){ + kdDebug() << "void KMFProtocolPropertiesWidget::slotSetProtocolLimitInterval( const QString& )" << endl; + if ( ! m_protocolUsage ) { + kdDebug() << "WARNING: No Current Protocol activated" << endl; + return; + } + if ( interval.isEmpty() ) { + return; + } + + KMFUndoEngine::instance()->startTransaction( + m_protocolUsage, + i18n("Set package limit for protocol %1 to %2/%3.").arg( m_protocolUsage->name() ).arg( m_protocolUsage->limit() ).arg( interval ) + ); + m_protocolUsage->setLimitInterval( interval ); + KMFUndoEngine::instance()->endTransaction(); +} + +void KMFProtocolPropertiesWidget::slotEnableProtocolLogging( bool onoff ){ + kdDebug() << "void KMFGenericInterfaceProtocol::slotEnableProtocolLogging( bool )" << endl; + if ( ! m_protocolUsage ) { + kdDebug() << "WARNING: No Current Protocol activated" << endl; + return; + } + + KMFUndoEngine::instance()->startTransaction( + m_protocolUsage, + i18n( "%1 logging of dropped packets for protocol %2." ).arg( onoff ? i18n( "Enable" ) : i18n( "Disable" ) ).arg( m_protocolUsage->name() ) + ); + + m_protocolUsage->setLogging( onoff ); + KMFUndoEngine::instance()->endTransaction(); +} + +} + +#include "kmfprotocolpropertieswidget.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.h b/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.h new file mode 100644 index 0000000..d72063b --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.h @@ -0,0 +1,63 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef KMFPROTOCOLPROPERTIESWIDGET_H +#define KMFPROTOCOLPROPERTIESWIDGET_H + +#include "kmyfirewallprotocolpropertieswidget.h" + + +#include <qptrlist.h> +#include <qstring.h> +#include <qguardedptr.h> +#include <qpixmap.h> +#include <quuid.h> + +namespace KMF { +class KMFProtocol; +class KMFProtocolUsage; +class KMFProtocolCategory; + +class KMFProtocolPropertiesWidget : public KMyFirewallProtocolPropertiesWidget { + Q_OBJECT + + public: + KMFProtocolPropertiesWidget ( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~KMFProtocolPropertiesWidget(); + /*$PUBLIC_FUNCTIONS$*/ + + void loadProtocolUsage( KMFProtocolUsage* ); + void loadProtocol( KMFProtocol* ); + void loadProtocolCategory( KMFProtocolCategory* ); + + public slots: + /*$PUBLIC_SLOTS$*/ + + protected: + /*$PROTECTED_FUNCTIONS$*/ + void blockAllSignals( bool ); + + protected slots: + /*$PROTECTED_SLOTS$*/ + void slotEnableProtocolLimit( bool ); + void slotSetProtocolLimitRate( int ); + void slotSetProtocolLimitInterval( const QString& ); + void slotEnableProtocolLogging( bool ); + void slotProtocolDeleted(); + + private: + QGuardedPtr<KMFProtocolUsage> m_protocolUsage; + // QGuardedPtr<KMFProtocolUsage> m_protocol; +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.cpp b/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.cpp new file mode 100644 index 0000000..df65455 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.cpp @@ -0,0 +1,73 @@ +// +// C++ Implementation: kmfqtdesignerplugin +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "kmfqtdesignerplugin.h" + +// Qt includes + + +// Prokject includes +#include "kmfipv4addresswidget.h" +namespace KMF { +Q_EXPORT_PLUGIN( KMFQTDesignerPlugin ) + +KMFQTDesignerPlugin::KMFQTDesignerPlugin() + : QWidgetPlugin() {} + + +KMFQTDesignerPlugin::~KMFQTDesignerPlugin() {} + +QStringList KMFQTDesignerPlugin::keys() const { + QStringList list; + list << "KMFIPv4AddressWidget"; + return list; +} + +QWidget* KMFQTDesignerPlugin::create ( const QString &key, QWidget* parent, const char* name ) { + if ( key == "KMFIPv4AddressWidget" ) + return new KMFIPv4AddressWidget ( parent, name ); + return 0; +} + + +QString KMFQTDesignerPlugin::group ( const QString& feature ) const { + if ( feature == "KMFIPv4AddressWidget" ) + return "Input"; + return QString::null; +} + +QIconSet KMFQTDesignerPlugin::iconSet ( const QString& ) const { + return QIconSet ( QPixmap ( "filechooser_pixmap" ) ); +} + +QString KMFQTDesignerPlugin::includeFile ( const QString& feature ) const { + if ( feature == "KMFIPv4AddressWidget" ) + return "kmfipv4addresswidget.h"; + return QString::null; +} + +QString KMFQTDesignerPlugin::toolTip ( const QString& feature ) const { + if ( feature == "KMFIPv4AddressWidget" ) + return "File Chooser Widget"; + return QString::null; +} + +QString KMFQTDesignerPlugin::whatsThis ( const QString& feature ) const { + if ( feature == "KMFIPv4AddressWidget" ) + return "A widget to change an IPv4 Address"; + return QString::null; +} + +bool KMFQTDesignerPlugin::isContainer ( const QString& ) const { + return FALSE; +} + +} diff --git a/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.h b/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.h new file mode 100644 index 0000000..5a2f0ed --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.h @@ -0,0 +1,44 @@ +// +// C++ Interface: kmfqtdesignerplugin +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef KMFQTDESIGNERPLUGIN_H +#define KMFQTDESIGNERPLUGIN_H + +#include <qwidgetplugin.h> + +// Qt includes +#include <qstringlist.h> +#include <qstring.h> +#include <qiconset.h> +#include <qpixmap.h> + +// Prokject includes +/** + @author Christian Hubinger <chubinger@irrsinnig.org> +*/ +namespace KMF { +class KMFQTDesignerPlugin : public QWidgetPlugin +{ +public: + KMFQTDesignerPlugin(); + ~KMFQTDesignerPlugin(); + QStringList keys() const; + QWidget* create( const QString &classname, QWidget* parent = 0, const char* name = 0 ); + QString group( const QString& ) const; + QIconSet iconSet( const QString& ) const; + QString includeFile( const QString& ) const; + QString toolTip( const QString& ) const; + QString whatsThis( const QString& ) const; + bool isContainer( const QString& ) const; + +}; +} +#endif diff --git a/kmyfirewall/kmfwidgets/kmfselectactivetarget.cpp b/kmyfirewall/kmfwidgets/kmfselectactivetarget.cpp new file mode 100644 index 0000000..7802541 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfselectactivetarget.cpp @@ -0,0 +1,190 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <e9806056@student.tuwien.ac.at>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#include "kmfselectactivetarget.h" + +// QT includes +#include <qstring.h> +#include <qcheckbox.h> +#include <qfile.h> +#include <qdir.h> +#include <qdom.h> +#include <qstring.h> +#include <qstringlist.h> +#include <qlistview.h> +#include <qradiobutton.h> +#include <qpushbutton.h> +#include <qlineedit.h> +#include <qtextedit.h> +#include <qlabel.h> +#include <qbuttongroup.h> +#include <qgroupbox.h> +#include <qspinbox.h> + +// KDE includes +#include <klocale.h> +#include <kdebug.h> +#include <kstandarddirs.h> +#include <klocale.h> +#include <kio/netaccess.h> +#include <kio/job.h> +#include <ktrader.h> +#include <klibloader.h> +#include <klistview.h> +#include <klistbox.h> +#include <knuminput.h> +#include <kpushbutton.h> +#include <kmessagebox.h> +#include <ktempfile.h> + +// Project includes +#include "kmflistviewitem.h" +#include "../version.h" +#include "../core/kmfnetwork.h" +#include "../core/kmfdoc.h" +#include "../core/kmftarget.h" + + +//##### static stuff +namespace KMF { +KMFTarget * KMFSelectActiveTarget::selectTarget( KMFNetwork* network, const QString& msg ) { + kdDebug() << "KMFTarget * KMFSelectActiveTarget::selectTarget( KMFNetwork* network, const QString& " << msg << " )" << endl; + QPtrList<KMFTarget> *list = new QPtrList<KMFTarget>; + network->netzone()->getAllTargets( network->netzone(), list ); + if ( list->count() == 1 ) { + return network->currentTarget(); + } + + + + KMFSelectActiveTarget *selTG = new KMFSelectActiveTarget( 0, "KMFSelectActiveTarget", + QWidget::WType_Dialog | QWidget::WShowModal + ); + selTG->setMessage( msg ); + selTG->loadNetwork( network ); + selTG->exec(); + KMFTarget *tg = selTG->selectedTarget(); + if ( tg ) { + kdDebug() << "Selected Target: " << tg->guiName() << endl; + return tg; + } + return 0; + +} + +//##### end static + +KMFSelectActiveTarget::KMFSelectActiveTarget ( QWidget* parent, const char* name, bool modal, WFlags fl ) + : KMyFirewallSelectActiveTarget ( parent,name,modal,fl ) +{ + m_cmd_ok->setEnabled( false ); + + connect( m_lv_zones, SIGNAL( pressed( QListViewItem* ) ) , + this, SLOT( slotNewItemSelected( QListViewItem* ) ) ); + + connect( m_lv_zones, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, int ) ) , + this, SLOT( slotNewItemDBLClicked( QListViewItem*, const QPoint &, int ) ) ); + + connect( m_cmd_cancel, SIGNAL( clicked() ) , + this, SLOT( slotCancel() ) ); + connect( m_cmd_ok, SIGNAL( clicked() ) , + this, SLOT( slotOk() ) ); + + adjustSize(); +} + +KMFSelectActiveTarget::~KMFSelectActiveTarget() +{} + +/*$SPECIALIZATION$*/ + + +void KMFSelectActiveTarget::loadNetwork( KMFNetwork* net ) { + kdDebug() << "KMFSelectActiveTarget::loadNetwork( KMFNetwork* )" << endl; + if ( ! net ) { + return; + } + m_network = net; + m_lv_zones->clear(); + KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() ); + it->setupZoneView(); +} +void KMFSelectActiveTarget::setMessage( const QString& msg ) { + kdDebug() << "KMFSelectActiveTarget::setMessage( const QString& )" << endl; + m_lbl_message->setText( msg ); +} +void KMFSelectActiveTarget::slotTargetSelected() { + kdDebug() << "KMFSelectActiveTarget::slotTargetSelected()" << endl; + + +} + +void KMFSelectActiveTarget::slotNewItemDBLClicked( QListViewItem* item, const QPoint &, int ) { + slotNewItemSelected( item ); + if ( m_target ) { + slotOk(); + } +} + +void KMFSelectActiveTarget::slotNewItemSelected( QListViewItem* item ) { + kdDebug() << "void KMFMyNetworkWidget::slotNewItemSelected( QListViewItem* item )" << endl; + if ( ! item ) + return ; + m_target = 0; + + m_lv_zones->blockSignals( true ); + m_lv_zones->clearSelection(); + m_lv_zones->setSelected( item, true ); + m_lv_zones->blockSignals( false ); + + m_cmd_ok->setEnabled( false ); + + KMFListViewItem* kmfitem = dynamic_cast<KMFListViewItem*> ( item ); + + if ( ! kmfitem ) { + kdDebug() << "No Item Selected!" << endl; + return; + } + + if ( kmfitem != 0 && kmfitem->netfilterObject()->type() == NetfilterObject::KMFTARGET ) { + m_target = kmfitem->target(); + m_lbl_currentTarget->setText( m_target->guiName() ); + kdDebug() << "Selected Target: " << m_target->guiName() << endl; + m_cmd_ok->setEnabled( true ); + } else { + m_lbl_currentTarget->setText( i18n( "No Target Selected" ) ); + kdDebug() << "No Target Selected" << endl; + m_cmd_ok->setEnabled( false ); + } + kdDebug() << "Laving slotNewItemSelected()" << endl; +} + +void KMFSelectActiveTarget::slotCancel() { + kdDebug() << "KMFSelectActiveTarget::slotCancel()" << endl; + m_target = 0; + QDialog::reject(); +} +void KMFSelectActiveTarget::slotOk() { + kdDebug() << "KMFSelectActiveTarget::slotOk()" << endl; + QDialog::accept(); +} + +KMFTarget *KMFSelectActiveTarget::selectedTarget() { + kdDebug() << "KMFSelectActiveTarget::slectedTarget()" << endl; + return m_target; +} + +} + +#include "kmfselectactivetarget.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfselectactivetarget.h b/kmyfirewall/kmfwidgets/kmfselectactivetarget.h new file mode 100644 index 0000000..426e17f --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfselectactivetarget.h @@ -0,0 +1,61 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <e9806056@student.tuwien.ac.at>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef KMFSELECTACTIVETARGET_H +#define KMFSELECTACTIVETARGET_H + +#include "kmyfirewallselectactivetarget.h" + +// QT Includes +#include <qstring.h> +#include <qguardedptr.h> +#include <qpoint.h> +class QListViewItem; + +namespace KMF { +class KMFNetwork; +class KMFTarget; + +class KMFSelectActiveTarget : public KMyFirewallSelectActiveTarget +{ + Q_OBJECT + public: static KMFTarget* selectTarget( KMFNetwork* network, const QString& msg ); + + public: + KMFSelectActiveTarget ( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~KMFSelectActiveTarget(); + /*$PUBLIC_FUNCTIONS$*/ + void loadNetwork( KMFNetwork* ); + void setMessage( const QString& ); + KMFTarget *selectedTarget(); + + public slots: + /*$PUBLIC_SLOTS$*/ + void slotTargetSelected(); + void slotNewItemSelected( QListViewItem* item ); + void slotNewItemDBLClicked( QListViewItem*, const QPoint &, int ); + void slotCancel(); + void slotOk(); + + protected: + /*$PROTECTED_FUNCTIONS$*/ + + protected slots: + /*$PROTECTED_SLOTS$*/ + + private: // DATA + KMFNetwork *m_network; + QGuardedPtr<KMFTarget> m_target; +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmfselectinterface.cpp b/kmyfirewall/kmfwidgets/kmfselectinterface.cpp new file mode 100644 index 0000000..96bb3d1 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfselectinterface.cpp @@ -0,0 +1,117 @@ +// +// C++ Implementation: %{MODULE} +// +// Description: +// +// +// Author: %{AUTHOR} <%{EMAIL}>, (C) %{YEAR} +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "kmfselectinterface.h" + +// QT includes +#include <qlabel.h> +#include <qcheckbox.h> +#include <qcolor.h> + +// KDE includes +#include <kdebug.h> +#include <kcombobox.h> +#include <kpushbutton.h> +#include <kapplication.h> +#include <klocale.h> +#include <kstandarddirs.h> +#include <kglobal.h> +#include <kapplication.h> + +// Project Includes +#include "../core/kmfconfig.h" +namespace KMF { +KMFSelectInterface::KMFSelectInterface( QWidget *parent, const char *name, bool modal, WFlags fl ) + : KMyFirewallSelectInterface( parent, name, modal, fl ) { + m_cob_interface->setBackgroundMode( PaletteBase, PaletteBase ); +// m_opt_showOnStartup->setBackgroundMode( PaletteButton ); + m_cob_interface->setBackgroundColor( QColor( 204, 0, 49 ) ); + m_descs << i18n("<qt><p>The generic interface provides an easy-to-use tool for setting up common personal firewalls or simple network routers.</p></qt>"); + m_cob_interface->insertItem( i18n("Generic Interface") ); + m_lbl_descripton->setText( *m_descs.at( 0 ) ); + + m_descs << i18n("<qt><p>The IPTable interface is meant to be used by advanced users who like to have full control over the rules generated; as such, the IPTables interface provides an almost 1-1 view on your iptables configuration.</p></qt>"); + m_cob_interface->insertItem( i18n("IPTables Interface") ); + KStandardDirs dir; + QString filename = dir.findResource( "data", "kmyfirewall/pics/kmf_snapshot_generic_interface.png" ); + QPixmap *p = new QPixmap( filename ); + m_pic_screenshot->setPixmap( *p ); + + + + + + + connect( m_cob_interface, SIGNAL( activated( int ) ), this, SLOT( slotInterfaceChanged( int ) ) ); + connect( m_cmd_ok, SIGNAL( clicked() ) , this, SLOT( accept() ) ); + connect( m_cmd_help, SIGNAL( clicked() ) , this, SLOT( help() ) ); + connect( b_close, SIGNAL( clicked() ) , this, SLOT( reject() ) ); + + adjustSize(); +} + +KMFSelectInterface::~KMFSelectInterface() {} + +/*$SPECIALIZATION$*/ +void KMFSelectInterface::slotInterfaceChanged( int index ) { + kdDebug() << "KMFSelectInterface::slotInterfaceChanged( int index )" << endl; + m_lbl_descripton->setText( *m_descs.at( index ) ); + + KStandardDirs dir; + QString filename = ""; + switch ( index ) { + case 0: + filename = dir.findResource( "data", "kmyfirewall/pics/kmf_snapshot_generic_interface.png" ); + break; + case 1: + filename = dir.findResource( "data", "kmyfirewall/pics/kmf_snapshot_iptables_interface.png" ); + break; + } + QPixmap *p = new QPixmap( filename ); + m_pic_screenshot->setPixmap( *p ); +} + +void KMFSelectInterface::accept() { + kdDebug() << "KMFSelectInterface::accept()" << endl; + kdDebug() << "Found item: " << m_cob_interface->currentItem() << endl; + switch ( m_cob_interface->currentItem() ) { + case 0: + KMFConfig::setUseGenericInterface( true ); +// Config().m_useGenericInterface = true; + break; + case 1: + KMFConfig::setUseGenericInterface( false ); +// Config().m_useGenericInterface = false; + break; + default: + KMFConfig::setUseGenericInterface( true ); +// Config().m_useGenericInterface = true; + } + KMFConfig::setShowSelInterface( ! m_opt_showOnStartup->isChecked() ); +// Config().m_show_selInterface = ! m_opt_showOnStartup->isChecked(); +// Config().write(); + KMFConfig::self()->writeConfig(); + QDialog::accept(); +} + +void KMFSelectInterface::help() { + kapp->invokeHelp( "gui_interfaces" ); +} + +void KMFSelectInterface::reject(){ + QDialog::reject(); +} + +} + +#include "kmfselectinterface.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfselectinterface.h b/kmyfirewall/kmfwidgets/kmfselectinterface.h new file mode 100644 index 0000000..b275ac5 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfselectinterface.h @@ -0,0 +1,53 @@ +// +// C++ Interface: %{MODULE} +// +// Description: +// +// +// Author: %{AUTHOR} <%{EMAIL}>, (C) %{YEAR} +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef KMFSELECTINTERFACE_H +#define KMFSELECTINTERFACE_H + +#include "kmyfirewallselectinterface.h" + +// QT Includes +#include <qstringlist.h> + +// KDE Includes +#include <kdemacros.h> + +// Project Includes + + +namespace KMF { +class KDE_EXPORT KMFSelectInterface : public KMyFirewallSelectInterface { + Q_OBJECT + +public: + KMFSelectInterface( QWidget *parent = 0, const char *name = 0, bool modal = true, WFlags fl = 0 ); + ~KMFSelectInterface(); + /*$PUBLIC_FUNCTIONS$*/ + +public slots: + /*$PUBLIC_SLOTS$*/ +protected: + /*$PROTECTED_FUNCTIONS$*/ + +protected slots: + /*$PROTECTED_SLOTS$*/ + void slotInterfaceChanged( int ); + void accept(); + void help(); + void reject(); +private: // DATA + QStringList m_descs; + +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.cpp b/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.cpp new file mode 100644 index 0000000..2eab94b --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.cpp @@ -0,0 +1,189 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#include "kmfsystemsettingslinux.h" + + +// QT Includes +#include <qlabel.h> + +// KDE includes +#include <klocale.h> +#include <kcombobox.h> +#include <kapplication.h> +#include <kdebug.h> +#include <klocale.h> +#include <kurlrequester.h> +#include <kguiitem.h> +#include <kpushbutton.h> +#include <knuminput.h> +#include <klistbox.h> +#include <kcombobox.h> +#include <kiconloader.h> +#include <kglobal.h> +#include <kmessagebox.h> +#include <klistview.h> + +// Prokject includes +#include "../core/kmftarget.h" +#include "../core/kmftargetconfig.h" +#include "../core/kmfundoengine.h" +namespace KMF { +KMFSystemSettingsLinux::KMFSystemSettingsLinux(QWidget* parent, const char* name, WFlags fl) +: KMyFirewallSystemSettingsLinux(parent,name,fl) +{ + m_url_ipt_path->setMode( KFile::Files | KFile::LocalOnly ); + m_url_mod_path->setMode( KFile::Files | KFile::LocalOnly ); + m_url_init_path->setMode( KFile::Directory | KFile::LocalOnly ); + m_url_runlevel_path->setMode( KFile::Directory | KFile::LocalOnly ); + + connect( m_url_ipt_path, SIGNAL( textChanged( const QString& ) ), + this, SLOT( slotSettingChanged() ) ); + connect( m_url_mod_path, SIGNAL( textChanged( const QString& ) ), + this, SLOT( slotSettingChanged() ) ); + connect( m_url_init_path, SIGNAL( textChanged( const QString& ) ), + this, SLOT( slotSettingChanged() ) ); + connect( m_url_runlevel_path, SIGNAL( textChanged( const QString& ) ), + this, SLOT( slotSettingChanged() ) ); + connect( m_cob_distribution, SIGNAL( activated( const QString& ) ), + this, SLOT( slotDistributionChanged() ) ); +} + +KMFSystemSettingsLinux::~KMFSystemSettingsLinux() +{ +} + + +/*$SPECIALIZATION$*/ +void KMFSystemSettingsLinux::loadTarget( KMFTarget* target ) { + kdDebug() << "KMFInterfaceWidget::loadTarget( KMFTarget* target )" << endl; + m_target = target; + updateView(); +} + +void KMFSystemSettingsLinux::updateView(){ + kdDebug() << "KMFInterfaceWidget::updateView()" << endl; + if ( ! m_target ) { + kdDebug() << "KMFInterfaceWidget::updateView() - ERROR: m_target == 0 " << endl; + return; + } + KMFTargetConfig *conf = m_target->config(); + + kdDebug() << "KMFInterfaceWidget::updateView() - config: " << endl; + kdDebug() << conf->toString() << endl; + + m_url_ipt_path->blockSignals( true ); + m_url_mod_path->blockSignals( true ); + m_url_init_path->blockSignals( true ); + m_url_runlevel_path->blockSignals( true ); + + if ( conf->distribution() == "sysv" ) { + m_cob_distribution->setCurrentItem( 0 ); + } else if ( conf->distribution() == "gentoo" ) { + m_cob_distribution->setCurrentItem( 1 ); + } else if ( conf->distribution() == "slackware" ) { + m_cob_distribution->setCurrentItem( 2 ); + } + slotDistributionChanged(); + + + + kdDebug() << "set conf->IPTPath()" << conf->IPTPath() << endl; + m_url_ipt_path->setURL( conf->IPTPath() ); + + kdDebug() << "set conf->modprobePath()" << conf->modprobePath() << endl; + m_url_mod_path->setURL( conf->modprobePath() ); + + kdDebug() << "set conf->initPath()" << conf->initPath() << endl; + m_url_init_path->setURL( conf->initPath() ); + + kdDebug() << "set conf->rcDefaultPath()" << conf->rcDefaultPath() << endl; + m_url_runlevel_path->setURL( conf->rcDefaultPath() ); + + m_url_ipt_path->blockSignals( false ); + m_url_mod_path->blockSignals( false ); + m_url_init_path->blockSignals( false ); + m_url_runlevel_path->blockSignals( false ); +} + +void KMFSystemSettingsLinux::slotDistributionChanged() { + KMFTargetConfig *conf = m_target->config(); + switch ( m_cob_distribution->currentItem() ) { + case 0: + conf->setDistribution( "sysv" ); + m_url_init_path->setShown( true ); + m_lab_init_path->setShown( true ); + return; + break; + + case 1: + conf->setDistribution( "gentoo" ); + m_url_runlevel_path->setURL( "/etc/runlevels/default/" ); + m_url_ipt_path->setURL( "/sbin/iptables" ); + m_url_mod_path->setURL( "/sbin/modprobe" ); + m_url_init_path->setURL( "/etc/init.d/" ); + m_url_init_path->setShown( true ); + m_lab_init_path->setShown( true ); + break; + + case 2: + conf->setDistribution( "slackware" ); + m_url_runlevel_path->setURL( "/etc/rc.d/" ); + m_url_ipt_path->setURL( "/usr/sbin/iptables" ); + m_url_mod_path->setURL( "/usr/sbin/modprobe" ); + m_url_init_path->setShown( false ); + m_lab_init_path->setShown( false ); + break; + } + KMFUndoEngine::instance()->startTransaction( + conf, + i18n( "Change system settings of target: %1" ).arg( conf->target()->guiName() ) + ); + conf->setIPTPath( m_url_ipt_path->url() ); + conf->setModprobePath( m_url_mod_path->url() ); + conf->setInitPath( m_url_init_path->url() ); + conf->setRcDefaultPath( m_url_runlevel_path->url() ); + KMFUndoEngine::instance()->endTransaction(); +} + +void KMFSystemSettingsLinux::slotSettingChanged() { + kdDebug() << "KMFInterfaceWidget::slotSettingChanged()" << endl; + KMFTargetConfig *conf = m_target->config(); + switch ( m_cob_distribution->currentItem() ) { + case 0: + conf->setDistribution( "sysv" ); + break; + + case 1: + conf->setDistribution( "gentoo" ); + break; + + case 2: + conf->setDistribution( "slackware" ); + break; + } + KMFUndoEngine::instance()->startTransaction( + conf, + i18n( "Change system settings of target: %1" ).arg( conf->target()->guiName() ) + ); + conf->setIPTPath( m_url_ipt_path->url() ); + conf->setModprobePath( m_url_mod_path->url() ); + conf->setInitPath( m_url_init_path->url() ); + conf->setRcDefaultPath( m_url_runlevel_path->url() ); + KMFUndoEngine::instance()->endTransaction(); +} + +} + +#include "kmfsystemsettingslinux.moc" + diff --git a/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.h b/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.h new file mode 100644 index 0000000..ed8331a --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.h @@ -0,0 +1,57 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef KMFSYSTEMSETTINGSLINUX_H +#define KMFSYSTEMSETTINGSLINUX_H + +#include "kmyfirewallsystemsettingslinux.h" + +#include <qstring.h> + +#include <qguardedptr.h> + +namespace KMF { +class KMFTarget; + +class KMFSystemSettingsLinux : public KMyFirewallSystemSettingsLinux +{ + Q_OBJECT + +public: + KMFSystemSettingsLinux(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~KMFSystemSettingsLinux(); + /*$PUBLIC_FUNCTIONS$*/ + + void loadTarget( KMFTarget* target ); + +public slots: + /*$PUBLIC_SLOTS$*/ + +protected: + /*$PROTECTED_FUNCTIONS$*/ + void updateView(); + +protected slots: + /*$PROTECTED_SLOTS$*/ + void slotSettingChanged(); + void slotDistributionChanged(); + + signals: + void sigTargetChanged(); + +private: + QGuardedPtr<KMFTarget> m_target; + +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmftemplatechooser.cpp b/kmyfirewall/kmfwidgets/kmftemplatechooser.cpp new file mode 100644 index 0000000..2d989bb --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmftemplatechooser.cpp @@ -0,0 +1,154 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004 +// +// Copyright: See COPYING file that comes with this distribution +// +// License: GPL +// + +// Qt includes +#include <qlistbox.h> +#include <qfile.h> +#include <qdom.h> +#include <qlabel.h> +#include <qdir.h> +#include <qpushbutton.h> + +// KDE includes +#include <kstandarddirs.h> +#include <kglobal.h> +#include <kdebug.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kapplication.h> + +// project includes +#include "../core/kmfconfig.h" +#include "xmlnames.h" + +#include "kmftemplatechooser.h" +namespace KMF { +KMFTemplateChooser::KMFTemplateChooser(QWidget* parent, const char* name, bool modal, WFlags fl) : KMyFirewallTemplateChooser(parent,name, modal,fl) { + connect( lb_templates, SIGNAL( highlighted ( int ) ), + this, SLOT( slotNewTemplateSelected( int ) ) ); + connect( lb_templates, SIGNAL( doubleClicked( QListBoxItem* ) ), + this, SLOT( slotNewTemplateSelected( QListBoxItem* ) ) ); + connect( b_help, SIGNAL( clicked() ), + this, SLOT( slotHelp() ) ); + + parseTemplates(); + b_accept->setEnabled( false ); +} + +KMFTemplateChooser::~KMFTemplateChooser() {} + +/*$SPECIALIZATION$*/ +void KMFTemplateChooser::reject() { + QDialog::reject(); +} + +void KMFTemplateChooser::accept() { + if ( lb_templates->currentItem() == -1 ) { + KMessageBox::error( this, i18n("No Template selected.") ); + return; + } + if ( *m_templateFilePaths.at( lb_templates->currentItem() ) == "-1" ) { + // emit sigLoadEmptyDocument(); + } else { + emit sigLoadTemplate( *m_templateFilePaths.at( lb_templates->currentItem() ) ); + } + QDialog::accept(); +} + +void KMFTemplateChooser::slotHelp() { + // kdDebug() << "void KMFTemplateChooser::slotHelp()" << endl; + kapp->invokeHelp(); +} + +void KMFTemplateChooser::slotNewTemplateSelected( QListBoxItem* i ){ + // kdDebug() << "void KMFTemplateChooser::slotNewTemplateSelected( " << index << " )" << endl; + slotNewTemplateSelected( lb_templates->index( i ) ); + accept(); +} + +void KMFTemplateChooser::slotNewTemplateSelected( int index ){ + // kdDebug() << "void KMFTemplateChooser::slotNewTemplateSelected( " << index << " )" << endl; + b_accept->setEnabled( true ); + lbl_description->setText( *m_templateDescriptions.at( index ) ); +} + + + +void KMFTemplateChooser::parseTemplates(){ + lb_templates->clear(); + lbl_description->clear(); + + // Add Empty template + lb_templates->insertItem( i18n("Empty Ruleset") ); + m_templateFilePaths.append( "-1" ); + if ( KMFConfig::useGenericInterface() ) { + m_templateDescriptions.append( i18n("Clean Ruleset that does only setup connection tracking e.g block everything not related to connections you initialised.") ); + } else { + m_templateDescriptions.append( i18n("Clean Ruleset that does not do anything. Use this if you like to setup your firewall from scratch.") ); + } + + KStandardDirs std_dir; + QString tmp_dir = std_dir.findResourceDir( "data", "kmyfirewall/templates/" ); + + QDir dir( tmp_dir + "/kmyfirewall/templates/" ); + kdDebug() << "Found Data dir at: " << dir.path() << endl; + QString type; + if ( KMFConfig::useGenericInterface() ) { + type = "*.tkmfgrs"; + } else { + type = "*.tkmfrs"; + } + QStringList templates = dir.entryList( type ); + if ( templates.isEmpty() ) { + KMessageBox::information( this, i18n("No templates (%1) could be found; please check your installation.").arg( type ) ); + return; + } + for ( QStringList::Iterator it = templates.begin(); it != templates.end(); ++it ) { + parseFile( dir.path() + "/" + *it ); + } +} + +void KMFTemplateChooser::parseFile( const QString& file ) { + // kdDebug() << "Parsing Template: " << file << endl; + QFile f( file ); + + if ( !f.open( IO_ReadOnly ) ) { + KMessageBox::information( this, i18n("Template %1 could not be opened.").arg( file ) ); + return; + } + + QDomDocument doc; + if ( !doc.setContent( &f ) ) { + f.close(); + KMessageBox::information( this, i18n("Template %1 is not a valid XML document.").arg( file ) ); + return; + } + + QDomElement root = doc.documentElement(); + QDomNodeList list = root.elementsByTagName ( XML::Abstract_Element ); + if ( list.count() == 0 ) { + KMessageBox::information( this, i18n("Template %1 does not contain the \"abstract\" tag.").arg( file ) ); + return; + } + QDomNode node = list.item( 0 ); + QString desc = node.toElement().attribute( XML::Description_Attribute ); + QString name = node.toElement().attribute( XML::Name_Attribute ); + lb_templates->insertItem( name ); + m_templateFilePaths.append( file ); + m_templateDescriptions.append( desc ); +} + +} + +#include "kmftemplatechooser.moc" + diff --git a/kmyfirewall/kmfwidgets/kmftemplatechooser.h b/kmyfirewall/kmfwidgets/kmftemplatechooser.h new file mode 100644 index 0000000..7a25ef0 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmftemplatechooser.h @@ -0,0 +1,72 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004 +// +// Copyright: See COPYING file that comes with this distribution +// License: GPL +// + +#ifndef KMFTEMPLATECHOOSER_H +#define KMFTEMPLATECHOOSER_H + +#include "kmyfirewalltemplatechooser.h" + +// Qt includes +#include <qstring.h> +#include <qstringlist.h> +#include <qptrlist.h> + +// KDE includes +#include <kdemacros.h> + +// project includes + + +class QListBoxItem; +namespace KMF { +class KDE_EXPORT KMFTemplateChooser : public KMyFirewallTemplateChooser { + Q_OBJECT + +public: + KMFTemplateChooser(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~KMFTemplateChooser(); + /*$PUBLIC_FUNCTIONS$*/ + + void setFileExtention( const QString& = "kmfrs" ); + + +public slots: + /*$PUBLIC_SLOTS$*/ + void parseTemplates(); + +protected: + /*$PROTECTED_FUNCTIONS$*/ + +protected slots: + /*$PROTECTED_SLOTS$*/ + virtual void reject(); + virtual void accept(); + void slotHelp(); + void slotNewTemplateSelected( int ); + void slotNewTemplateSelected( QListBoxItem* ); + +private: + + void parseFile( const QString& ); + +private: // data + QStringList m_templateDescriptions; + QStringList m_templateFilePaths; + +signals: + void sigLoadTemplate( const QString& ); + void sigLoadEmptyDocument(); + +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmftransactionlog.cpp b/kmyfirewall/kmfwidgets/kmftransactionlog.cpp new file mode 100644 index 0000000..79f9e4b --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmftransactionlog.cpp @@ -0,0 +1,278 @@ +// +// C++ Implementation: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#include "kmftransactionlog.h" + +// QT includes +#include <qstring.h> +#include <qvaluelist.h> +#include <qlistview.h> +#include <qptrlist.h> +#include <qtimer.h> +#include <qtextedit.h> +#include <qtextstream.h> +#include <qtextbrowser.h> + +// KDE includes +#include <klistview.h> +#include <klocale.h> +#include <kdebug.h> +#include <kpushbutton.h> +#include <kpopupmenu.h> +#include <kprocess.h> +#include <ktempfile.h> + +// project includes +#include "../core/netfilterobject.h" +#include "../core/kmfundoengine.h" +#include "../core/kmftransaction.h" +namespace KMF { +KMFTransactionLog* KMFTransactionLog::s_instance = 0; +KMFTransactionLog* KMFTransactionLog::instance() { + if ( ! s_instance ) { + s_instance = new KMFTransactionLog( 0, "", 0 ); + + } + + return s_instance; +} + +KMFTransactionLog::KMFTransactionLog ( QWidget* parent, const char* name, WFlags fl ) : KMyFirewallTransactionLog ( parent,name,fl ) { + m_contextMenu = new KPopupMenu( this, "m_contextMenu" ); + m_currentTransaction = 0; + m_undoXMLFile = new KTempFile(); + m_undoXMLFile->setAutoDelete( true ); + m_redoXMLFile = new KTempFile(); + m_redoXMLFile->setAutoDelete( true ); + + connect( m_cmd_clearStacks, SIGNAL( clicked() ), + this, SLOT( slotClearStacks() ) ); + connect( m_cmd_clearLog, SIGNAL( clicked() ), + this, SLOT( slotClearLog() ) ); + + connect( KMFUndoEngine::instance(), SIGNAL( sigStackChanged() ), + this, SLOT( slotUpdateView() ) ); + + connect( KMFUndoEngine::instance(), SIGNAL( sigLog( const QString& ) ), + this, SLOT( slotLog( const QString& ) ) ); + + connect( m_lvUndoTransactions, SIGNAL( contextMenuRequested ( QListViewItem*, const QPoint&, int ) ), + this, SLOT( slotZoneRBM( QListViewItem*, const QPoint&, int ) ) ); + + connect( m_lvRedoTransactions, SIGNAL( contextMenuRequested ( QListViewItem*, const QPoint&, int ) ), + this, SLOT( slotZoneRBM( QListViewItem*, const QPoint&, int ) ) ); + + connect( m_cmd_update, SIGNAL( clicked() ), + this, SLOT( slotUpdateStatistics() ) ); + + m_lvUndoTransactions->setSorting(-1); + m_lvUndoTransactions->setSortColumn(-1); + + m_lvRedoTransactions->setSorting(-1); + m_lvRedoTransactions->setSortColumn(-1); +} + +KMFTransactionLog::~KMFTransactionLog() {} + +void KMFTransactionLog::slotUpdateStatistics() { + kdDebug() << "KMFTransactionLog::slotUpdateStatistics()" << endl; + m_txt_stats->setText( "" ); + + m_txt_stats->append ( "Object count: " + QString::number( NetfilterObject::objectCount( -1 ) ) ); + m_txt_stats->append ( "\n" ); + + m_txt_stats->append ( "KMFNETWORKs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::KMFNETWORK ) ) ); + + m_txt_stats->append ( "IPTABLES_RULESETs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::IPTABLES_RULESET ) ) ); + m_txt_stats->append ( "GENERIC_RULESETs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::GENERIC_RULESET ) ) ); + + m_txt_stats->append ( "TABLEs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::TABLE ) ) ); + m_txt_stats->append ( "CHAINs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::CHAIN ) ) ); + m_txt_stats->append ( "RULEs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::RULE ) ) ); + m_txt_stats->append ( "RULEOPTIONs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::RULEOPTION ) ) ); + m_txt_stats->append ( "PROTOCOLs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::PROTOCOL ) ) ); + m_txt_stats->append ( "NETZONEs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::NETZONE ) ) ); + m_txt_stats->append ( "NETHOSTs: " +QString::number( NetfilterObject::objectCount( NetfilterObject::NETHOST ) ) ); + m_txt_stats->append ( "KMFTARGETs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::KMFTARGET ) ) ); + m_txt_stats->append ( "KMFTARGETCONFIGs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::KMFTARGETCONFIG ) ) ); + m_txt_stats->append ( "PROTOCOLUSAGEs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::PROTOCOLUSAGE ) ) ); + + + m_txt_stats->append ( "PROTOCOLCATEGORYs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::PROTOCOLCATEGORY ) ) ); +} + +void KMFTransactionLog::slotZoneRBM( QListViewItem* item, const QPoint& point, int ) { + if ( ! item ) { + kdDebug() << "No item Setelcted" << endl; + m_currentTransaction = 0; + return; + } + + + QUuid uid( item->text( 1 ) ); + KMFTransaction *t = KMFUndoEngine::instance()->findTransction( uid ); + if ( ! t ) { + m_currentTransaction = 0; + return; + } + + m_currentTransaction = t; + m_contextMenu->clear(); + QString name = i18n("Transaction: %1").arg( m_currentTransaction->uuid().toString() ); + // QString lab_str = i18n("Zone: %1").arg( m_zone->guiName() ); + m_contextMenu->insertTitle( name ); + m_contextMenu->insertItem( i18n( "Show XML diff using Kompare" ), this, SLOT( slotShowDiff() ) ); + m_contextMenu->popup( point ); + + if ( m_undoXMLFile ) { + m_undoXMLFile->unlink(); + delete m_undoXMLFile; + m_undoXMLFile = 0; + } + if ( m_redoXMLFile ) { + m_redoXMLFile->unlink(); + delete m_redoXMLFile; + m_redoXMLFile = 0; + } + m_undoXMLFile = new KTempFile(); + m_undoXMLFile->setAutoDelete( true ); + m_redoXMLFile = new KTempFile(); + m_redoXMLFile->setAutoDelete( true ); + + QTextStream& sUndo = *m_undoXMLFile->textStream(); + sUndo << m_currentTransaction->undoXML(); + m_undoXMLFile->sync(); + + QTextStream& sRedo = *m_redoXMLFile->textStream(); + sRedo << m_currentTransaction->redoXML(); + m_redoXMLFile->sync(); +} + +void KMFTransactionLog::slotShowDiff() { + kdDebug() << "KMFTransactionLog::slotShowDiff()" << endl; + if ( ! m_currentTransaction ) { + return; + } + + KProcess* childproc = new KProcess(); + kdDebug() << "kompare " << m_undoXMLFile->name() << m_redoXMLFile->name() << endl; + *childproc << "kompare" << m_undoXMLFile->name() << m_redoXMLFile->name(); + childproc->start( KProcess::NotifyOnExit, KProcess::NoCommunication ); +} + +void KMFTransactionLog::slotKompareExited( KProcess* ) { +} + +void KMFTransactionLog::slotClearStacks() { + KMFUndoEngine::instance()->clearStacks(); + slotUpdateView(); +} + +void KMFTransactionLog::slotClearLog() { + m_txt_transactionLog->clear(); +} +void KMFTransactionLog::slotLog( const QString& msg ) { + m_txt_transactionLog->append( msg ); +} + +void KMFTransactionLog::slotUpdateView() { +// kdDebug() << "KMFTransactionLog::updateView()" << endl; + KListViewItem* last = 0; + QValueList< KMFTransaction* > undos = KMFUndoEngine::instance()->undoTransactions(); + QValueList< KMFTransaction* >::iterator itUndo; + for ( itUndo = undos.begin(); itUndo != undos.end(); ++itUndo ) { + KMFTransaction* trans = *itUndo; + last = setupListItem( trans, m_lvUndoTransactions, last ); + } + + QPtrList<QListViewItem>* del = new QPtrList<QListViewItem>; + del->setAutoDelete( true ); + QListViewItem* item = m_lvUndoTransactions->firstChild(); + while( item ) { + bool found = false; + for ( itUndo = undos.begin(); itUndo != undos.end(); ++itUndo ) { + KMFTransaction* trans = *itUndo; + if ( trans->uuid().toString() == item->text( 1 ) ) { + found = true; + } + } + if ( ! found ) { + del->append( item ); + } + item = item->nextSibling(); + } + del->clear(); + + last = 0; + QValueList< KMFTransaction* > redos = KMFUndoEngine::instance()->redoTransactions(); + QValueList< KMFTransaction* >::iterator itRedo; + for ( itRedo = redos.begin(); itRedo != redos.end(); ++itRedo ) { + KMFTransaction* trans = *itRedo; + last = setupListItem( trans, m_lvRedoTransactions,last ); + } + + item = m_lvRedoTransactions->firstChild(); + while( item ) { + bool found = false; + for ( itRedo = redos.begin(); itRedo != redos.end(); ++itRedo ) { + KMFTransaction* trans = *itRedo; + if ( trans->uuid().toString() == item->text( 1 ) ) { + found = true; + } + } + if ( ! found ) { + del->append( item ); + } + item = item->nextSibling(); + } + del->clear(); +} + +KListViewItem* KMFTransactionLog::setupListItem( KMFTransaction* trans, KListView* list, KListViewItem* after ) { + // kdDebug() << "Search transaction: " << trans->uuid().toString() << endl; + QListViewItem* found = 0; + + found = list->findItem ( trans->uuid().toString(), 1 ); + if ( found ) { + return (KListViewItem*) found; + } + // kdDebug() << "No Item Found" << endl; + + + KListViewItem* item = new KListViewItem( list, after ); + item->setText( 0, trans->name() ); + item->setText( 1, trans->uuid().toString() ); + + KListViewItem* last = 0; +/* QValueList<int>& objectIds = trans->objectIDs(); + QValueList<int>::iterator it; + + for ( it = objectIds.begin(); it != objectIds.end(); ++it ) {*/ + QString obj_uuid = trans->objectUuid().toString(); + KListViewItem* itemID = new KListViewItem( item, last, "", obj_uuid ); + last = itemID; + NetfilterObject *obj = 0; + obj = NetfilterObject::findObject ( obj_uuid ); + if ( obj ) { + itemID->setText( 0, i18n("Object: %1").arg( obj->name() ) ); + // itemID->setText( 2, obj->name() ); + // itemID->setText( 3, obj->getXMLSniplet() ); + } +// } + return item; +} + +} + +#include "kmftransactionlog.moc" + diff --git a/kmyfirewall/kmfwidgets/kmftransactionlog.h b/kmyfirewall/kmfwidgets/kmftransactionlog.h new file mode 100644 index 0000000..fe8b432 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmftransactionlog.h @@ -0,0 +1,72 @@ +// +// C++ Interface: +// +// Description: +// +// +// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef KMFTRANSACTIONLOG_H +#define KMFTRANSACTIONLOG_H + +#include "kmyfirewalltransactionlog.h" + +class KPopupMenu; +class KProcess; +class KTempFile; +class KListView; +class KListViewItem; + +namespace KMF { +class KMFTransaction; + + +class KMFTransactionLog : public KMyFirewallTransactionLog +{ + Q_OBJECT + + public: static KMFTransactionLog* instance(); + + public: + + ~KMFTransactionLog(); + /*$PUBLIC_FUNCTIONS$*/ + + public slots: + /*$PUBLIC_SLOTS$*/ + void slotUpdateView(); + + protected: + /*$PROTECTED_FUNCTIONS$*/ + + protected slots: + /*$PROTECTED_SLOTS$*/ + void slotUpdateStatistics(); + void slotClearStacks(); + void slotClearLog(); + void slotLog( const QString& ); + void slotZoneRBM( QListViewItem*, const QPoint&, int ); + void slotShowDiff(); + void slotKompareExited( KProcess* ); + private: + KMFTransactionLog ( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + KListViewItem* setupListItem( KMFTransaction*, KListView*, KListViewItem*); + + // DATA + private: + KPopupMenu *m_contextMenu; + KMFTransaction* m_currentTransaction; + KTempFile *m_undoXMLFile; + KTempFile *m_redoXMLFile; + + static KMFTransactionLog* s_instance; + + +}; +} +#endif + diff --git a/kmyfirewall/kmfwidgets/kmyfirewalldocumentinfo.ui b/kmyfirewall/kmfwidgets/kmyfirewalldocumentinfo.ui new file mode 100644 index 0000000..58d4a79 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewalldocumentinfo.ui @@ -0,0 +1,184 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>KMyFirewallDocumentInfo</class> +<widget class="QDialog"> + <property name="name"> + <cstring>KMyFirewallDocumentInfo</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>681</width> + <height>491</height> + </rect> + </property> + <property name="caption"> + <string>Document Info</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="1" column="0"> + <property name="name"> + <cstring>lbl_description</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><b>Ruleset&nbsp;Description:</b></string> + </property> + <property name="alignment"> + <set>WordBreak|AlignTop</set> + </property> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>lbl_name</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><b>Ruleset&nbsp;Name:</b></string> + </property> + </widget> + <widget class="QLineEdit" row="0" column="1"> + <property name="name"> + <cstring>txt_name</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="QTextEdit" row="1" column="1"> + <property name="name"> + <cstring>txt_description</cstring> + </property> + <property name="wordWrap"> + <enum>WidgetWidth</enum> + </property> + <property name="readOnly"> + <bool>false</bool> + </property> + </widget> + <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_help</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="accel"> + <string>F1</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>300</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_saveAsTemplate</cstring> + </property> + <property name="text"> + <string>Save as &Template</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&Save</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="accel"> + <string></string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>KMyFirewallDocumentInfo</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>KMyFirewallDocumentInfo</receiver> + <slot>reject()</slot> + </connection> +</connections> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallgenericinterfaceeditprotocolwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallgenericinterfaceeditprotocolwidget.ui new file mode 100644 index 0000000..a3ccecc --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallgenericinterfaceeditprotocolwidget.ui @@ -0,0 +1,351 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallGenericInterfaceEditProtocolWidget</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallGenericInterfaceEditProtocolWidget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>732</width> + <height>436</height> + </rect> + </property> + <property name="caption"> + <string>KMyFirewallGenericInterfaceEditProtocolWidget</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel6</cstring> + </property> + <property name="text"> + <string><qt>Here you can define custom protocols for the <b>Generic Interface</b>.<br> +This required if you like to use a protocol not directely suppotred by KMyFirewall.</qt></string> + </property> + </widget> + <widget class="QSplitter"> + <property name="name"> + <cstring>splitter4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout13</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>m_cb_showAll</cstring> + </property> + <property name="text"> + <string>Show All</string> + </property> + <property name="toolTip" stdset="0"> + <string>If checked the list view also contains all protocols that are available by default, not only the ones you defined</string> + </property> + </widget> + <widget class="KListView"> + <column> + <property name="text"> + <string>Protocol</string> + </property> + <property name="clickable"> + <bool>false</bool> + </property> + <property name="resizable"> + <bool>false</bool> + </property> + </column> + <column> + <property name="text"> + <string>Properties</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>m_lv_protocols</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>3</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="showSortIndicator"> + <bool>true</bool> + </property> + <property name="rootIsDecorated"> + <bool>true</bool> + </property> + <property name="resizeMode"> + <enum>AllColumns</enum> + </property> + <property name="fullWidth"> + <bool>true</bool> + </property> + <property name="itemsMovable"> + <bool>false</bool> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout15</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout14</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KPushButton"> + <property name="name"> + <cstring>m_b_new_protocol</cstring> + </property> + <property name="text"> + <string>&New Protocol</string> + </property> + <property name="accel"> + <string>Alt+N</string> + </property> + </widget> + <widget class="KPushButton"> + <property name="name"> + <cstring>m_b_del_protocol</cstring> + </property> + <property name="text"> + <string>&Delete Protocol</string> + </property> + <property name="accel"> + <string>Alt+D</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QGroupBox"> + <property name="name"> + <cstring>m_gb_edit</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="title"> + <string>Edit Protocol</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout33</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KListBox" row="1" column="1"> + <property name="name"> + <cstring>m_lb_udpPorts</cstring> + </property> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel1_2</cstring> + </property> + <property name="text"> + <string>TCP Ports</string> + </property> + </widget> + <widget class="QLabel" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>Protocol Description</string> + </property> + </widget> + <widget class="QLabel" row="0" column="1"> + <property name="name"> + <cstring>textLabel1_2_2</cstring> + </property> + <property name="text"> + <string>UDP Ports</string> + </property> + </widget> + <widget class="KListBox" row="1" column="0"> + <property name="name"> + <cstring>m_lb_tcpPorts</cstring> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>80</height> + </size> + </property> + </widget> + <widget class="QTextEdit" row="3" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>m_te_desc</cstring> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>150</height> + </size> + </property> + </widget> + </grid> + </widget> + <widget class="QButtonGroup" row="2" column="0"> + <property name="name"> + <cstring>m_bg_protocol</cstring> + </property> + <property name="lineWidth"> + <number>0</number> + </property> + <property name="title"> + <string></string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QRadioButton" row="0" column="0"> + <property name="name"> + <cstring>m_rb_tcp</cstring> + </property> + <property name="text"> + <string>TCP</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QRadioButton" row="0" column="1"> + <property name="name"> + <cstring>m_rb_udp</cstring> + </property> + <property name="text"> + <string>UDP</string> + </property> + </widget> + </grid> + </widget> + <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout27</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLineEdit" row="0" column="1"> + <property name="name"> + <cstring>m_le_protocolName</cstring> + </property> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel2_2</cstring> + </property> + <property name="text"> + <string>Name:</string> + </property> + </widget> + </grid> + </widget> + <widget class="QLayoutWidget" row="1" column="1" rowspan="2" colspan="1"> + <property name="name"> + <cstring>layout37</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KPushButton"> + <property name="name"> + <cstring>m_b_add_port</cstring> + </property> + <property name="text"> + <string>&Add Port</string> + </property> + <property name="accel"> + <string>Alt+A</string> + </property> + </widget> + <widget class="KPushButton"> + <property name="name"> + <cstring>m_b_del_port</cstring> + </property> + <property name="text"> + <string>D&elete Port</string> + </property> + <property name="accel"> + <string>Alt+E</string> + </property> + </widget> + </vbox> + </widget> + <widget class="QSpinBox" row="1" column="0"> + <property name="name"> + <cstring>m_sb_port_num</cstring> + </property> + <property name="maxValue"> + <number>65535</number> + </property> + <property name="minValue"> + <number>1</number> + </property> + </widget> + </grid> + </widget> + </vbox> + </widget> + </widget> + </vbox> +</widget> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>klistview.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>klistbox.h</includehint> + <includehint>klistbox.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kpushbutton.h</includehint> +</includehints> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallhostwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallhostwidget.ui new file mode 100644 index 0000000..36603ce --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallhostwidget.ui @@ -0,0 +1,437 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallHostWidget</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallHostWidget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>416</width> + <height>246</height> + </rect> + </property> + <property name="caption"> + <string>KMyFirewallHostWidget</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QLayoutWidget" row="0" column="3" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout19_3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_host_0</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4_5</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>.</string> + </property> + <property name="alignment"> + <set>AlignBottom</set> + </property> + </widget> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_host_1</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4_4_3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>.</string> + </property> + <property name="alignment"> + <set>AlignBottom</set> + </property> + </widget> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_host_2</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4_3_3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>.</string> + </property> + <property name="alignment"> + <set>AlignBottom</set> + </property> + </widget> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_host_3</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + </hbox> + </widget> + <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>textLabel3_3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>IP Address:</string> + </property> + </widget> + <widget class="QLayoutWidget" row="1" column="3" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_host_sshPort</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>65535</number> + </property> + <property name="minValue"> + <number>1</number> + </property> + <property name="value"> + <number>22</number> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>m_cmd_testSSH</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Test SSH Connection</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QLabel" row="1" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>textLabel3_3_2_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>SSH Port:</string> + </property> + </widget> + <widget class="KComboBox" row="2" column="4"> + <item> + <property name="text"> + <string>Linux</string> + </property> + </item> + <property name="name"> + <cstring>m_cb_os</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="3" column="4"> + <item> + <property name="text"> + <string>IPTables</string> + </property> + </item> + <property name="name"> + <cstring>m_cb_backend</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QLabel" row="2" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>textLabel3_3_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Operating System:</string> + </property> + </widget> + <widget class="QLabel" row="3" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>textLabel3_3_3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Backend:</string> + </property> + </widget> + <widget class="QTextEdit" row="4" column="4" rowspan="2" colspan="1"> + <property name="name"> + <cstring>m_host_desc</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="wordWrap"> + <enum>NoWrap</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + <widget class="QLabel" row="4" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>textLabel1_2_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Notes:</string> + </property> + </widget> + <spacer row="5" column="1"> + <property name="name"> + <cstring>spacer12</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>71</height> + </size> + </property> + </spacer> + <widget class="QLabel" row="7" column="1"> + <property name="name"> + <cstring>m_lbl_configStatus</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Config Invalid!</string> + </property> + </widget> + <widget class="QPushButton" row="7" column="4"> + <property name="name"> + <cstring>m_cmd_autoConf</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Try Auto Configuration</string> + </property> + </widget> + <spacer row="7" column="2" rowspan="1" colspan="2"> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>241</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="KLed" row="7" column="0"> + <property name="name"> + <cstring>m_led_configStatus</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>4</hsizetype> + <vsizetype>4</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="state"> + <enum>Off</enum> + </property> + <property name="shape"> + <enum>Circular</enum> + </property> + <property name="look"> + <enum>Flat</enum> + </property> + <property name="darkFactor"> + <number>300</number> + </property> + </widget> + <widget class="Line" row="6" column="0" rowspan="1" colspan="5"> + <property name="name"> + <cstring>line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + </grid> +</widget> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>knuminput.h</includehint> + <includehint>knuminput.h</includehint> + <includehint>knuminput.h</includehint> + <includehint>knuminput.h</includehint> + <includehint>knuminput.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kled.h</includehint> +</includehints> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallinterfacewidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallinterfacewidget.ui new file mode 100644 index 0000000..094a5f9 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallinterfacewidget.ui @@ -0,0 +1,152 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallInterfaceWidget</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallInterfaceWidget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>327</width> + <height>192</height> + </rect> + </property> + <property name="caption"> + <string>KMyFirewallInterfaceWidget</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>l_int</cstring> + </property> + <property name="text"> + <string>Please add your available network Interfaces here:</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignVCenter</set> + </property> + <property name="wordwrap" stdset="0"> + </property> + </widget> + <widget class="QLayoutWidget" row="1" column="0"> + <property name="name"> + <cstring>layout10</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer row="3" column="0"> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>41</height> + </size> + </property> + </spacer> + <widget class="QListBox" row="0" column="2" rowspan="4" colspan="1"> + <property name="name"> + <cstring>m_lb_int</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="whatsThis" stdset="0"> + <string>Here you can see the currently entered network interfaces</string> + </property> + </widget> + <widget class="QPushButton" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>m_b_del_int</cstring> + </property> + <property name="text"> + <string>Remove Interface</string> + </property> + </widget> + <widget class="QPushButton" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>m_b_add_int</cstring> + </property> + <property name="text"> + <string>Add Interface</string> + </property> + </widget> + <widget class="KComboBox" row="0" column="0"> + <item> + <property name="text"> + <string>eth</string> + </property> + </item> + <item> + <property name="text"> + <string>ippp</string> + </property> + </item> + <item> + <property name="text"> + <string>ppp</string> + </property> + </item> + <item> + <property name="text"> + <string>ppoe</string> + </property> + </item> + <item> + <property name="text"> + <string>lo</string> + </property> + </item> + <property name="name"> + <cstring>m_cb_int_name</cstring> + </property> + <property name="editable"> + <bool>true</bool> + </property> + <property name="duplicatesEnabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KIntSpinBox" row="0" column="1"> + <property name="name"> + <cstring>m_sb_int_num</cstring> + </property> + <property name="maxValue"> + <number>10</number> + </property> + </widget> + </grid> + </widget> + </grid> +</widget> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>kcombobox.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>knuminput.h</includehint> +</includehints> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewalliptdocoptions.ui b/kmyfirewall/kmfwidgets/kmyfirewalliptdocoptions.ui new file mode 100644 index 0000000..ff040cf --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewalliptdocoptions.ui @@ -0,0 +1,402 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>KMyFirewallIPTDocOptions</class> +<widget class="QDialog"> + <property name="name"> + <cstring>KMyFirewallIPTDocOptions</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>673</width> + <height>649</height> + </rect> + </property> + <property name="caption"> + <string>Document Options</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel7</cstring> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>40</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>40</height> + </size> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="lineWidth"> + <number>2</number> + </property> + <property name="text"> + <string>Here you can configure several general options that your firewall has.</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignCenter</set> + </property> + </widget> + <widget class="QGroupBox" row="1" column="0"> + <property name="name"> + <cstring>GroupBox58</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>IPTables</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>Enable the iptables you like to use in your firewall.</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignVCenter</set> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>Layout8</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>Use tables:</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>c_use_filter</cstring> + </property> + <property name="text"> + <string>Filter</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>c_use_nat</cstring> + </property> + <property name="text"> + <string>Nat</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>c_use_mangle</cstring> + </property> + <property name="text"> + <string>Mangle</string> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget" row="3" column="0"> + <property name="name"> + <cstring>Layout65</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_cancel</cstring> + </property> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer45</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>51</width> + <height>0</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_help</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Help</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer46</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>21</width> + <height>0</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_ok</cstring> + </property> + <property name="text"> + <string>OK</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QGroupBox" row="2" column="0"> + <property name="name"> + <cstring>GroupBox59</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>3</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Misc Kernel Settings</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="QCheckBox" row="0" column="0"> + <property name="name"> + <cstring>c_use_modules</cstring> + </property> + <property name="text"> + <string>Load modules</string> + </property> + </widget> + <widget class="QLabel" row="0" column="1"> + <property name="name"> + <cstring>TextLabel3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><b>Enable this if you compiled iptables as modules</b>. For details about the required modules, take a look at the iptables man page.</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignVCenter</set> + </property> + </widget> + <widget class="QCheckBox" row="1" column="0"> + <property name="name"> + <cstring>c_use_ipfwd</cstring> + </property> + <property name="text"> + <string>Use IP forward</string> + </property> + </widget> + <widget class="QLabel" row="1" column="1"> + <property name="name"> + <cstring>TextLabel4_2</cstring> + </property> + <property name="text"> + <string><b>Enable this if your host should act as a router</b>.</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignVCenter</set> + </property> + </widget> + <widget class="QLabel" row="2" column="1"> + <property name="name"> + <cstring>TextLabel6_2</cstring> + </property> + <property name="text"> + <string><b>Enable if you like to use Syn Cookies.</b> (needs support compiled in the kernel)</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignVCenter</set> + </property> + </widget> + <widget class="QCheckBox" row="2" column="0"> + <property name="name"> + <cstring>c_use_syn_cookies</cstring> + </property> + <property name="text"> + <string>Enable Syn cookies</string> + </property> + </widget> + <widget class="QLabel" row="3" column="1"> + <property name="name"> + <cstring>TextLabel5</cstring> + </property> + <property name="text"> + <string><b>Enable</b> if you like to use <b>Reverse Parse Filtering</b>.</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignVCenter</set> + </property> + </widget> + <widget class="QLayoutWidget" row="3" column="0"> + <property name="name"> + <cstring>Layout11</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>c_use_rp_filter</cstring> + </property> + <property name="text"> + <string>Use reverse path filter</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>c_use_martians</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Log dropped packets</string> + </property> + </widget> + </vbox> + </widget> + </grid> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>b_cancel</sender> + <signal>clicked()</signal> + <receiver>KMyFirewallIPTDocOptions</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>b_ok</sender> + <signal>clicked()</signal> + <receiver>KMyFirewallIPTDocOptions</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>b_help</sender> + <signal>clicked()</signal> + <receiver>KMyFirewallIPTDocOptions</receiver> + <slot>slotHelp()</slot> + </connection> + <connection> + <sender>c_use_rp_filter</sender> + <signal>toggled(bool)</signal> + <receiver>c_use_martians</receiver> + <slot>setEnabled(bool)</slot> + </connection> +</connections> +<tabstops> + <tabstop>b_ok</tabstop> + <tabstop>c_use_filter</tabstop> + <tabstop>c_use_nat</tabstop> + <tabstop>c_use_mangle</tabstop> + <tabstop>c_use_modules</tabstop> + <tabstop>c_use_ipfwd</tabstop> + <tabstop>c_use_syn_cookies</tabstop> + <tabstop>c_use_rp_filter</tabstop> + <tabstop>c_use_martians</tabstop> + <tabstop>b_cancel</tabstop> + <tabstop>b_help</tabstop> +</tabstops> +<slots> + <slot>slotHelp()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallipv4adddresswidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallipv4adddresswidget.ui new file mode 100644 index 0000000..5e1260f --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallipv4adddresswidget.ui @@ -0,0 +1,161 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallIPv4AdddressWidget</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallIPv4AdddressWidget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>371</width> + <height>31</height> + </rect> + </property> + <property name="caption"> + <string>Form2</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <widget class="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layout19</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_from_1</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>.</string> + </property> + <property name="alignment"> + <set>AlignBottom</set> + </property> + </widget> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_from_2</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4_4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>.</string> + </property> + <property name="alignment"> + <set>AlignBottom</set> + </property> + </widget> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_from_3</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4_3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>.</string> + </property> + <property name="alignment"> + <set>AlignBottom</set> + </property> + </widget> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_from_4</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + </hbox> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel3_3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>IP Address:</string> + </property> + </widget> + </grid> +</widget> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>knuminput.h</includehint> + <includehint>knuminput.h</includehint> + <includehint>knuminput.h</includehint> + <includehint>knuminput.h</includehint> +</includehints> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallmultiportwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallmultiportwidget.ui new file mode 100644 index 0000000..0c1ff9b --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallmultiportwidget.ui @@ -0,0 +1,229 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>KMyFirewallMultiPortWidget</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallMultiPortWidget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>625</width> + <height>190</height> + </rect> + </property> + <property name="caption"> + <string>MultiPortWidget</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QListBox" row="0" column="3" rowspan="4" colspan="1"> + <property name="name"> + <cstring>lb_ports</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>4</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="QPushButton" row="3" column="2"> + <property name="name"> + <cstring>b_remove</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>&Remove</string> + </property> + </widget> + <widget class="QPushButton" row="3" column="1"> + <property name="name"> + <cstring>b_add</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>&Add</string> + </property> + </widget> + <widget class="QSpinBox" row="2" column="2"> + <property name="name"> + <cstring>sb_port</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>65335</number> + </property> + <property name="minValue"> + <number>1</number> + </property> + </widget> + <widget class="QLabel" row="2" column="1"> + <property name="name"> + <cstring>TextLabel3</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Port:</string> + </property> + </widget> + <widget class="QButtonGroup" row="0" column="1" rowspan="2" colspan="2"> + <property name="name"> + <cstring>ButtonGroup1</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="lineWidth"> + <number>1</number> + </property> + <property name="title"> + <string></string> + </property> + <property name="exclusive"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="QRadioButton" row="2" column="0"> + <property name="name"> + <cstring>rb_equ</cstring> + </property> + <property name="text"> + <string>Equal ports</string> + </property> + </widget> + <widget class="QRadioButton" row="1" column="0"> + <property name="name"> + <cstring>rb_dest</cstring> + </property> + <property name="text"> + <string>Destination ports</string> + </property> + </widget> + <widget class="QRadioButton" row="0" column="0"> + <property name="name"> + <cstring>rb_src</cstring> + </property> + <property name="text"> + <string>Source ports</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </grid> + </widget> + <widget class="QLabel" row="1" column="0" rowspan="3" colspan="1"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><p>You may filter for up to 15 ports within one rule if you are using the multiport extention.<br> +Use this to avoid too large (slow) rulesets.</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignTop</set> + </property> + </widget> + <widget class="QCheckBox" row="0" column="0"> + <property name="name"> + <cstring>c_use_multiport</cstring> + </property> + <property name="text"> + <string>Use multiport extention</string> + </property> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>c_use_multiport</sender> + <signal>toggled(bool)</signal> + <receiver>ButtonGroup1</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>c_use_multiport</sender> + <signal>toggled(bool)</signal> + <receiver>lb_ports</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>c_use_multiport</sender> + <signal>toggled(bool)</signal> + <receiver>TextLabel3</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>c_use_multiport</sender> + <signal>toggled(bool)</signal> + <receiver>sb_port</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>c_use_multiport</sender> + <signal>toggled(bool)</signal> + <receiver>b_add</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>c_use_multiport</sender> + <signal>toggled(bool)</signal> + <receiver>b_remove</receiver> + <slot>setEnabled(bool)</slot> + </connection> +</connections> +<signals> + <signal>sigMultiPortChanged(bool)</signal> +</signals> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>qwidget.h</includehint> +</includehints> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallmynetworkwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallmynetworkwidget.ui new file mode 100644 index 0000000..cd639d9 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallmynetworkwidget.ui @@ -0,0 +1,189 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallMyNetworkWidget</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallMyNetworkWidget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>686</width> + <height>571</height> + </rect> + </property> + <property name="caption"> + <string>Protocols</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QSplitter" row="0" column="0"> + <property name="name"> + <cstring>splitter1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="childrenCollapsible"> + <bool>false</bool> + </property> + <widget class="KListView"> + <column> + <property name="text"> + <string>Network/Target</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Address/Mask</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>System</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Backend</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Description</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>m_lv_zones</cstring> + </property> + <property name="resizePolicy"> + <enum>AutoOneFit</enum> + </property> + <property name="resizeMode"> + <enum>AllColumns</enum> + </property> + <property name="fullWidth"> + <bool>true</bool> + </property> + <property name="itemsMovable"> + <bool>false</bool> + </property> + </widget> + <widget class="QWidgetStack"> + <property name="name"> + <cstring>m_wsEdit</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>ws_pageHostProperties</cstring> + </property> + <attribute name="id"> + <number>0</number> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>5</number> + </property> + <property name="spacing"> + <number>4</number> + </property> + <widget class="KTabWidget" row="0" column="0"> + <property name="name"> + <cstring>kt_hostProperties</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="currentPage"> + <number>-1</number> + </property> + </widget> + </grid> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>ws_pageZoneProperties</cstring> + </property> + <attribute name="id"> + <number>1</number> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>5</number> + </property> + <property name="spacing"> + <number>4</number> + </property> + <widget class="KTabWidget" row="0" column="0"> + <property name="name"> + <cstring>kt_zoneProperties</cstring> + </property> + <property name="currentPage"> + <number>-1</number> + </property> + </widget> + </grid> + </widget> + </widget> + </widget> + </grid> +</widget> +<slots> + <slot>m_lv_zones_itemRenamed( QListViewItem *, int, const QString & )</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>klistview.h</includehint> + <includehint>ktabwidget.h</includehint> + <includehint>ktabwidget.h</includehint> +</includehints> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallnethostproperties.ui b/kmyfirewall/kmfwidgets/kmyfirewallnethostproperties.ui new file mode 100644 index 0000000..bf025a8 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallnethostproperties.ui @@ -0,0 +1,234 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallNetHostProperties</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallNetHostProperties</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>642</width> + <height>209</height> + </rect> + </property> + <property name="caption"> + <string>Form1</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <widget class="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layout16</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_2_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Host Documentation:</string> + </property> + </widget> + <widget class="QTextEdit"> + <property name="name"> + <cstring>m_host_desc</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="wordWrap"> + <enum>NoWrap</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>layout10</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QFrame"> + <property name="name"> + <cstring>m_frameAddress</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>Plain</enum> + </property> + </widget> + <widget class="QGroupBox"> + <property name="name"> + <cstring>m_gb_host_protocol_option</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>3</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Host Options</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" row="2" column="0"> + <property name="name"> + <cstring>m_cb_host_log</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Log packets from/for this host</string> + </property> + </widget> + <widget class="QLayoutWidget" row="1" column="0"> + <property name="name"> + <cstring>layout9_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>m_cb_host_limit</cstring> + </property> + <property name="text"> + <string>Limit matches</string> + </property> + </widget> + <widget class="QSpinBox"> + <property name="name"> + <cstring>m_sb_host_rate</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minValue"> + <number>1</number> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>m_lbl_slash</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>/</string> + </property> + </widget> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>second</string> + </property> + </item> + <item> + <property name="text"> + <string>minute</string> + </property> + </item> + <item> + <property name="text"> + <string>hour</string> + </property> + </item> + <property name="name"> + <cstring>m_cb_limit_host_interval</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="editable"> + <bool>false</bool> + </property> + <property name="insertionPolicy"> + <enum>NoInsertion</enum> + </property> + <property name="duplicatesEnabled"> + <bool>false</bool> + </property> + </widget> + </hbox> + </widget> + </grid> + </widget> + </vbox> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>m_cb_host_limit</sender> + <signal>toggled(bool)</signal> + <receiver>m_sb_host_rate</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>m_cb_host_limit</sender> + <signal>toggled(bool)</signal> + <receiver>m_cb_limit_host_interval</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>m_cb_host_limit</sender> + <signal>toggled(bool)</signal> + <receiver>m_lbl_slash</receiver> + <slot>setEnabled(bool)</slot> + </connection> +</connections> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallnetworkwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallnetworkwidget.ui new file mode 100644 index 0000000..0926fbd --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallnetworkwidget.ui @@ -0,0 +1,330 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallNetworkWidget</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallNetworkWidget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>633</width> + <height>128</height> + </rect> + </property> + <property name="caption"> + <string>KMyFirewallNetworkWidget</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <widget class="QLayoutWidget" row="1" column="0"> + <property name="name"> + <cstring>layout7</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout27</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Network:</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel3_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Mask Length:</string> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout22</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout19</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_from_1</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>.</string> + </property> + <property name="alignment"> + <set>AlignBottom</set> + </property> + </widget> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_from_2</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4_4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>.</string> + </property> + <property name="alignment"> + <set>AlignBottom</set> + </property> + </widget> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_from_3</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4_3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>.</string> + </property> + <property name="alignment"> + <set>AlignBottom</set> + </property> + </widget> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_from_4</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>255</number> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout21</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KIntSpinBox"> + <property name="name"> + <cstring>m_sb_mask</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maxValue"> + <number>32</number> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>19</width> + <height>2</height> + </size> + </property> + </spacer> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel3_2_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Mask:</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>lbl_mask</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>255.255.255.0</string> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + </hbox> + </widget> + <spacer row="2" column="0"> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>45</height> + </size> + </property> + </spacer> + <widget class="QTextEdit" row="1" column="1" rowspan="2" colspan="1"> + <property name="name"> + <cstring>m_txt_desc</cstring> + </property> + </widget> + <widget class="QLabel" row="0" column="1"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>Zone Documentation:</string> + </property> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string>Zone Properties:</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + </widget> + </grid> +</widget> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>knuminput.h</includehint> + <includehint>knuminput.h</includehint> + <includehint>knuminput.h</includehint> + <includehint>knuminput.h</includehint> + <includehint>knuminput.h</includehint> +</includehints> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallnewdocument.ui b/kmyfirewall/kmfwidgets/kmyfirewallnewdocument.ui new file mode 100644 index 0000000..3da2b6c --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallnewdocument.ui @@ -0,0 +1,409 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallNewDocument</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallNewDocument</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>580</width> + <height>330</height> + </rect> + </property> + <property name="minimumSize"> + <size> + <width>580</width> + <height>330</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>580</width> + <height>330</height> + </size> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="caption"> + <string>New Document - KMyFirewall</string> + </property> + <property name="icon"> + <pixmap>image0</pixmap> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QFrame" row="0" column="0"> + <property name="name"> + <cstring>frame3</cstring> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="frameShape"> + <enum>Box</enum> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <property name="lineWidth"> + <number>2</number> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>l_pic</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout20</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QSplitter"> + <property name="name"> + <cstring>splitter3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="font"> + <font> + </font> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="text"> + <string><h3>New/Open Document</h3></string> + </property> + <property name="alignment"> + <set>WordBreak|AlignTop</set> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_close</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>25</width> + <height>25</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>x</string> + </property> + </widget> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="text"> + <string>Please choose how you would like to start your new firewall configuration. +</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignTop</set> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer2_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>50</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_empty</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>&New Empty Configuration</string> + </property> + <property name="accel"> + <string>Alt+N</string> + </property> + <property name="toolTip" stdset="0"> + <string><b>Empty Ruleset</b> lets you start with an completely empty ruleset.</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_load_saved</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>Load &Saved Configuration...</string> + </property> + <property name="accel"> + <string>Alt+S</string> + </property> + <property name="toolTip" stdset="0"> + <string>Open a save KMyFirewall Ruleset</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_template</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>Load Configuration &Template...</string> + </property> + <property name="accel"> + <string>Alt+T</string> + </property> + <property name="toolTip" stdset="0"> + <string><b>Loading a Template</b> will load a Template configuration that may be adopted to the requirements.</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout6</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_help</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>&Help</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_cancel</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + </hbox> + </widget> + </grid> +</widget> +<images> + <image name="image0"> + <data format="PNG" length="685">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000027449444154388d6d93bf4b5b5114c73fef47f2a2491c02050d0551323445ec5014151497d2c176f0f7e41fd0a1438538bb75b385824eede4a654688b8a8b62a0b4521d148594686930d568f0477c7d2f2fcdbbb7439e62ad072e9c7beef77c0fe77bee51b8c504c40ea1cb80a8099603db0256ef817d13ab5cbf5cf8fd71b7b7f795d6d6f628108fab6a2482741c9cfd7dce37368ef717175fe6b6b6de3c85f27f045978ec1f1b9bad191808a9800a28aa8a140209b8807372c2b7d1d14fdb3b3b83cfa18887a300f11ccceacdcda17226839bc92032190887110707b85e0cd3241a8b3d09c3e465610d6004a64db8af99269aeb22b359945008bdbd1d717646697d1d676f0f3b9de664610169590fa2b0f2197e6a0262dfe115a088dd5d443a8d383cc4e8e8c0dfda8a1a8950cee7399d9ae26c799962a18004c584aa2578af66a1cbf15a118093cba1363541305811291ca6babf1f6118b8c522977dd74027e0532d88ea97627824d53d3d0407072b01d745f1f9a84f26919eea1ae0875ac0a72a60f9019ff750ddd242cdf0f0d568f3e3e3159e7c1ecdc3f92b056d40d155d8aef2923540334d144da3984c224e4fb16666b8686c24383444b8b5156b6d0d1db0210508bd08ab061c1b704701820d0d0014120910022595c29a9c243c3282717e0e547ed126cc032500bec08b5f208f40e60301595a5a92662221f3208f41dad3d3d29e9890471ee603641ba0feaacf39d0bfc2c70b90bf415a9a269dee6e6981b40c43da7575151fe426147ba10fd0ff598ad71098877747e0ba20c5b5e3822c815c866c5f25d9b8759900c6a0eb213cbb0b9d5550fb07ec1ca456607e0edefe802cb72dd30d53bc89f93c5f7882956f02ff02854c0fcf287a72340000000049454e44ae426082</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="189236">789cecbd47931cb9b2b6b9bfbfe2d8c5eeda587ca9c5621625b25496cad25563b300104068953a73fefc20f07a80d54d9eee668bc34bb20c46b21e028140b83b1c0e1151ffe77ffef5727bf5affff93fffb558f26524ff25433effd7fff8ab2cdbfd3fffeffffdfffdd77f77069d7f755bbd7fb587e3cebf3afffd7ffdd77f6fefff25ffc5e4b0d5e9b66a5e4e2c8f5aad8eaa79b774ac6df96be24eb75b73501177713d1f3a6edbeba5e5b1b95ed6ecbd38b6f57b278e51ff53c3b85e4c89dbc8f79e1bc6fdf663c7f679762be26eb757f3e68cb887fa9273c778fea6fe3e9e27b9211e75873567b165deb45f8e1ca3fd9ff2d1bea46192e7b1637b7fcf776cef2f9afc76c7b7f9dab1ad8f2962d20f678e6d7dfaceb16dbf7743dc47fd6cedd8e66fcf890790cfaae578609f3f271ea2fec594788cfc8d472cc07b9417e6f985bddf89633c0f730cf98886f13cdeab63e8e3c1b16d9f1711b7497e99633ccf237107fae1678ea19fa061dc4f0c88c93e79e9d8de7fd9736cefbf7e26eea1fdcb4be23e9e5fde120fd01e5938b6d78b8478d8eddbfe72ead8dad7aeb9ff08f7cf0f1de3faa63e8efb89a5637bfd2a743cb6f52d8825f2e5d4f1a866857ce9ecf7d4b17dbed9b261b2afc8319eef86b84dd7870d933e73e20ed9f7ad633ccf3d7197ecfbae61dc4f4a62ea9fcc776cefbfe28ead3c9743e23ef58f27e2019e7f7be3d8ca67d9251ea27ece1dc3de668e6dfdfe23f108f25f0e1c5b796e5f88c7e43f0e1ddbeb852016289f4e1d73eb5f18b1ecdafe239be7f5d1de0cfe4db6db5d6bdf7edfb1953fd3c4ddae95a7b8b0ecbbfec71da3ffa50d435eace7d8cac35b13933fddae1c5bf92c8f883b545f733df9a355ec18f63724ee92fe4e1d5bf9c890b847f673e518fadf1093ff6213c7b63d32716cf5b33d211e90fd5e120f21ffd59b632b7fddd43f42fdfcdeb16d1ffbc4b67e56108f697c908eadbeb6b7c49cec69e518feb3d107f54771e9d85e2f94636b0f614eec43ff79233f85f2e5ab63fb3cf99e58e37aaf036e77bad61e02d25fbb0756f43ced410ffde18e78d8b3fa5090976afc4572e118fa970d93fe94632bffb0706cebf7a78e315e2d8869fc5a9e38867d30628a2fbc37c7b6be95766ce5c932e21ef99b23c756fe79d3de3ef99bc0b1bdbf6eea23ffcdb863f4e73bc756ffeb7362f227cb267f44f670e1d8ea43cc88c7a85fef1ddbf685c2b1ad9f37f2e2783eefd2b1d5b7d72216689fd7756caf0f1b7d903fd1678eedf572ec18f159d31e05fb5831c7f02f43628deb79db31c6ff0370bb85fae427b6f69347c46d942f97c45de47bd70dc3fe9207e23eeebf6b37dcb3faf32be261cfea2f5f118f7b886fe8f9da1ce5b790bf76e35fd530d9d7dcb12d1f3c3946bc71e718f57bc414aff9470d53bc72e018f6714adcc4175dc788a746c414af46178eedfd3743c7569f4a10f7693c3c730cff941337f1deb363abbf2424a6f18e3f3bb6ed89c78e31de35f9e42f9309f118f5ad1f1d5bfd474b628a5724770cffb72216789ee4d5b1b58fb4797ef2972b9f98fc9d908e6df9e5c631fc5bf3fc9aec0bf6a38d3d62bc7d736cdbab9afc36ae9713c7b0ff3e7107e5454cdc43be1f340c7bcb7ac47ddcdf27fb33fe16e3af746ced432e8847b05f4ef669ecd9e687642fc69e31ff0a1c5bfdad5f88650ff1a926563df847d28f09c7303ed8f1ca0cff64efdb81638cff878e31fee5c414dfe51bc7e87f5b628acff627c47de86bd927a6f9c626756cdbb71c13933d7a67c434fe46478ead3d2d478eadfde48298fc6bf44acca1eff99098ec4df58825dae74bc756bfbb6bc7567f9b3db14ff1fb8163d8ef9258e3fa79e2d85e1fb4c0c6deacbdec0b628aef58df31e237aacfd89bbd5ef186613ff915719fc66bed18faa1f635e3b978716cf5cdba8e311e93be8dbd61be32706c9f77bf778c7885f4d7d8a32c8905ecd79b38c6f8dbb44fe3fa5c813bed9e7d7e5d11f7c009c9afc3fb789e9de57663afeb1e31c597db4b629a5f6507c4643fdb98b8195f2f1dc31fb51d5b7bd85e1173d8e3362716148f6f897d8ab74ac7d05f414cfe6a49f7370db6f95c3bb6f6c04f89dba4af8898f41f86c414efaba786a14f79e9d8ca637748dc23ff37261e90fe4f1d23fe9a120fa12fe1138f604f22708cf8a8a99fa37cba718cf926c9dfd9439f58c2bef8deb1d5c7e29858a13e35746ceb93b0b776a7d583ff1f39c67843f230f664cbf3257107fece27fd18fbb2f2cbe9f93a7de4abb563ab9facc91ff4ad3e3637c4a33ed693489e1d01f6d1be4e331fe70362097d472362b297f48458c19ec2c8b1d597e81037f115fc5ba7b10fb925ee50ff6bf2bb905f7c46dc43797eecd8ea73f3e018fef28a7848e351ee18f1f40df108fada35f7a7f129b8748cf9d4b963ab6f352516b8dedf11933da8e6fe3eb5ff135b7dc6af8eadfed98a58417f3226d6a89f7f62f82bf8bb8e79605b3e5939b6fa5924c41d940f67c45db2b7ad63f8a737e23eeca3aa88073df8fb8c7844f6d6f018fe2cde137394f76dbce3771b7d899098e2ddb8e718fe7ae3d8ca6fb7271e927c8f8947a48f1131a7fecb1c5b79eb01b184bcf3d031c6c7e6fea49f684bac20aff49158433ec533d8f44ff45fe518f30f8fb883f232720cf9913c1af9eb07e21ef5d79163ab3f963ab6f22e24f100fd337b718cf91ec9a73344791e108fa09ff496780cfd464dfd1cf5c999635b5fc5897d62d85fd728c83eff9aeaef0efbf6f938c6879ee91f569ec19c58507f38710c7dae887dc83b5b38867f98116bc88b53be91b7958fe81193fd8b317117f9fa9998e41b5d12f7a11f71ee18f1c87dc3904f7c4d3c84fc78877884f27cd730caab47e231e495d3f39afe60f5113f350c79e74d7b04ea0f4ac7984f37f529f07ce4d8ca77d1c843f7ad3c4bd85bafdbea637eff4adc417e1239c67cbe4bdcef5bf9c4d077bf991f2c113ff48dbc6d79ffc931ca33c7d0075d6ff461e5233362ea0f814fdc437eee110f201f6fd430e4b33d261e23bfec378c7c7e40cc219ffc8858401f61c7b1956f71472ca9bf5c39b6f22ad6c41a2c5b8e215f7a7e235f6bff61e2d8da6749cf63fa07e2c333e22eca07b163ac6f4d887b285f96c47de827f51c63bc1f13eb01d62fe14ffabdde00f30bb46fd0c87f9d1277c85f33629a2fe9a963abbf7d42dc837fab02e221e4992e1c5b796615f118f22f3bc414dffa2d6201796677c424ff7244ece3fa6ceed8caa3c0f30d8c7cc153c798ff95c46dc8aba0fb35f69e1f13f790afee1c637e7deed83e7f48f232f2b6f25b1c110fa0af4a3a863d6f8987b83eed3ab6f2d6d7c423dc6fdeb497237fd7b4970fb03e52100bd417e4c47280f1b329af07582fc4f831e88d07d80f803d0f3b5df2471b62ea6fe18498e2bdfc9a98e43fcf8815f455cd1d239e85be8646de96d983637b7fd6e47720afa8efd8ca6bd922ee429f72e018e3f398b88febf5c4b1bd3e65c403c86fbe241e92ff3a778cf948423c823ee5a661c873a189c7a83fd9130be46f468e315fbb2396a82f29887db427520d439fcb43c7f03788afccec155c45c46df4e7f0dc31d627ce1cc39ea7c41db427bc24eea2ff2f85635b7ef34cdc877d6c489ebd01f2d7f43cbde1c0ca7b754fccc14bc44b23e3ff6c7bfc07c7d8ff41ff1819fda23f1e1377a18f458f78000eb863cc4742c7567ee1887808f9af72e211f4a3268e115fbe128fc91e7c628efaf30eb1843e9213c756fef31b62d2dfb229af70ffe2c631fc59db31c667e87b64f4097fdf25267d66197107fac973c756fed1a363ac17ed887ba8af62c403e863231d5b79166fc4435cbf4b8847d07774e3d896df917e8cbf407f5e128b8195d7e68258e2fabc2256032b9f0dfc85f11ee012f63936fe18e355424cfa5f6e897bd4ff2531f56ffe424cf1e3aea96f047ded7bc463e853bd3ac6fdc7c41cfa5a4f1d63bcef13fbe0dddcb1d54fd1dc5fc31efc9163ec9751fb9bfe570862d2a7ba20ee425f7ee818ebbb4be21eee1755c47dd4173e3bc6f8754b3c84be962f8eb1fe9613937e977be231ec233d708cf5be805882a343c78877493e46bf98cf6bc78817e8f9fa9d21f61376c4a321d67331def0ee98e47b4fcca1cff4a1611abf0e8905e977edd8ca3f7e2156e005e4c94dff823e4f1ddbfbab1631f59fa24b4cfad0e7c43dd2df89632bbfd58163acf753fb8d3ee04f3f31fa5b877880fbf9d78eb1ffed118f20ef7d9b788cf2d5d8b12d3f97c41cf5e703c788c74ac7e81f97c402cf5336f2f1513e4b1d239e6e9e5f0de1ffe6c41af549c7d0ef1afd8ff75b28bfbf25a6febe7824ee0ead7ef60f8e317ed1f3f787432bff1de251d1e85bc0be44a3cf4d46dc853eaa1631e98b3f10f749bf03c7567e3bdf31e67f3be201f4bfca1cc3ff34f50da97ecfb1bd7f30766cebcbdac463c8d7bb23267df10b6281fa45eed8ca37db3bb6f24b9be757c8d74d7b15e4bf518e21ff39b11e5a7995983f98d90dea2b560da37cf446dc46f9fdc4b1d5d77aed18ebe187c4d4bfcb7be21ee9f3847880eb179fd85e5f0ae2d110ebe99963cc6f305f9046dfb6fce28eb803fd6cde88a9ffad12c7188f5e89fb28bf78718cf1f2807800fd2dee1d5bfdec0f8949dfeb63e211aecfcf1d23bed78ead3e170531f5bfb2691fe95b758925da5b3d3ab6fa49bc8621df4544eca37d8b9858a3bc281b863e7dc85336fa1413e20ef4b15939b6fa5a28e22ed9c390b88ff2e9c031e663c231d6bfa8bd46bf9097768cf97f933fc4fd22e618fbbd3ef16868e5513e138f8756de8b8e63f477d27f5f80c59a58e2fab0c9f78758df84bff5cdf880f5258cd77e13ff6e1b267b488e8829bedd6e1c5bfdc57de231f421ef1cc3ff56c4d47fd71362d2f77c4dec43bf399ed737fd11ebd333c7f077747fa34fccb73ce20ef4959e3ab6fa0ab7c4e45f37c78eedf36eae887ba87fb1231ea07cda778cf585ca31e2cf7be221f4b364c423d4bfa81c63beb724e6d057de3c9f40febcb99f44ff4fcf1d637ef648acc00bf8377fd01adafeb5bc216e43ffdb367187f2af1de37c2dc63bd5f88fbd20e634febe3ac67ea74fdcf4c74b621ff9fb0531f9df70e818fac378a81a7fca2a62d20f7b22ee417ef13331f53fbe251e425efea163f48f73e211e41bbf1153ff29dbc402f255678ee1ef481ea6bf60bd7fe518fd67e018fb93a7c41abc0c1ce3bc00f4ad8c3e20ef56c323accf917c1bfdec22e2ee08eba54df901788bfeaf8d7d235ecc88bbb0cff4d231ce071d13933cd33131f9abc5b563cc770f89c9fee75be211ca7b53c7d8cf6bee37863c8b3931d977b02726fbd5078eadbc364d7d8dbc8f8815ea2bef1c237ed78e31bed1fd8cfd23be7c726cf30bed18f17a53be33c2fcb424ee423f7392efa087fcfcdeb1d5d786e43118421f79db31f64b3de2d1c8ca6fc71dc3df5e11f311c6ffa63d7284f5fb01b11ec11fd8eb55abd15770464cfe273e25a6f120e93ab6f28be7c464eff37362b2dff9b3638cbf1e31d96fb5758cf59a17b0b167cc4f5a8e114f6d88bb90d74212f7503e7b6c18f25d1c12f7513ef21dc3de2be211e58f1dc3bf6bc7988fee89c790afbc770cfbee1073d4bfd78eedf5494c2ca02fdeb4cf1f61fdac699f1a59fbdf33f0b033b2f6b71e1077c7f6f9b654ff7030b2f25cb78947232baf9520e6638c3f767c54edc6bef3377063bfaba963ccdf5f88c99ffb9b8621dff91d710fcfbbe81393bcbd2d31f9177fef18e7054e894724bfe6fa31caeb9163c8ffc831fc779798439ebaef18fee39658a03c3f2196b89f6aead3e81f3ee50f5bd0c74e3bc67c6045dc1e597b0fe97ec32ecaafce88fbd0c7bee518f1669b7888fa3605b118637fcfce5754a7e90f21ecbb336891bdbe11b721ff3422ee923e2ac7181f036292ff2e26267f922c1ce37cf3a163ac970c88c99f646bc7c87f21169067d8b0447ede23f691cffb8ead7e929d63ecafef8935e4b9a5eb8dfce18f2e1c231ebd768ceba9bd463f884f268eb15e724bdc41f968e6d8f6af6a49dcc3f5d5b563ec0f660d435fbb31711fedcd6f88a93fce778ee1dfb60da3ff0643e221ea5b0862eabf7e42cc919f29c7982fb61c5bfd24642f4389fe1ea1bf761bfbf17d621a6f5627c4640fe28198fcddfede31e2cd3362d277794c2ca1cf558798fc17578eadbee4ab632bef15fa77d7e80ffee889b88dfc441377203fe61177912f98632bff7241dc47f960d730e4bd3e728cf70f1a267dedaf1a867c25c9a7e9affeb963e8e7ae61e86739271ea1fe153dff708cf2cb55c3e4bf97c47c8cfdca925890fe4e1de3fcee9858e27e15b57fd422fd93be469c63bd02e361cff863bc0f31271e429f69c363e8cb17c402fd63be21267fc9e68e6df9f91931e93b888835ae973bc7563f199eaf67f48b78f4a161c8a3f0883b281f1f117721bf6dd4309e7f1310f770bfed27b6d7574f8eb13e7d4d3c407d55bb61d4a7d78eb19ee21393fed7ab86a10fd521a6fe2a160de379a2a9639c1f58128f51ffe6de31d6ab1931f5f7a8b99f44f9f2c631d6bfcf89d518fb11747f630f982f52fb476de4f3b1632b8ff880b833c6fa7642dc1fe37ce1a3635b7e97120fc7d027fc69dff45f9c07591077208f7d9798fae7fcc531cecf5c11f720af521353ff8dce8987c89fdf3ac67876e2d8ea238e89491ffb3762ea6ffebd632bdf62e618f3bf9c98a3be4a10537fac7c629feed7728cf595e6f914ea4bce8835f455dc3bc67806ff69a225c87f991077905f0d88bb63acd7cd897bd06fbe261e20dfd78e11bfbc128fa0bf34241e8fad7c2b7ade9184bf504d7b14873f83bc07a6ff623c85fd0c8cff44fe9a98fa130b8847d43f0f1c633fef9498f491c7c464ef3c728cf9cf8b632befe09858409ed19c98fac7624bac903f178eb15ef6e0d8ca7b0e790c4c7fc1facbca31c62fbadee803fbad297197e44ff5197d60fd4438467f1911f7a97f15c443e4473bc7b0d725f108fa081b267d2d9e8839cab30eb10ff66f1b26fde58ead7c32c477c3a63f6d12629267f54c2cc99e778e218f0931d97fb521d6c8df9c3b86ff477b87469ef00f17c46de8237a718cf9e9037117e5d7078e71de6241dc877d8b37c7563ec59898fa83bc261ea17cbc756ccbc7ab8621efed9a780c792d3c628efbfb13c7d82f382616b87e31768cf56092a7e94f38afb9776cf3e733c7b0ef461e9a431fc4e316dac3a8be7107f9d9d231ce1f14c43d0e7b267d8f47dcca7383f174d4f4cfd531b10f7d2c3531f51f0ef98c8cfee08f66c4d41fc21e710ff29d9f10f7c91f5d120f20bfc58563acd74ae221f45d36f58f911fac8939e4b57a728cfdfda63e92bfbc2296b07f76eb18f6df27a6fe520c8935f2ab07c7185fa14f339a439e21e58fdbb8ff9c9ebfded0b6cf7be518eb85b78eb15e3225ee435f11271ea2fc1afe6cdc8cb765403c84bd46cfc464cf724f4cf11e4b8805d9cb1131c92368f27dc893cf1d63fe87f9a3f1cee045ee18e7bba83de6f9e14faf1c23be5f137770ff60e318f3f588b887eb8b9d63ace7a5c403dc2f7f748cf9fca163ac071e10937d8ba63ce7789f70e718e7b9487e632130df62c49a63be70dbb0c0fc1af1eab8fe00817dbe63e236ea4b113f72236f5bdf7c404cf21519b1823ccaad632b8f10f18419fd90efcf1d63fc3a728cfe971277208fe0de31ce6b34e5bb64ef8563d8e79ab88febc303c758af568e11dfcd8887d08f5e3ac67af605f108f28bee88c7a49f9e639cdf0a8805caaf160d431f1ec96fec43befeb061e4cfe97e461f98ff1c13b78595b77a768cf3e97d622eb0de80e717c6bf5bfdea7b621ff2ce4b620dfb0f29dfc817f69f1277210f1510933d0721f100f229ae89479047b5728cfd8f88788ce7cd6e8839aecf53c7382fb7219628bf7c6c18f2582a621fe583e67e0af6cc305e1a6f29b03f48ed37f242fc77ea18f12ed5c73bb0ff72ea18eb019cb88bfb6f48bebc87fa572bc7905f4c3c12785f85e4630cc0ca2f85bdc946fe29f2a5f13fb8df8ab80779a677c47de867b9748cf7ab9e88c790c72e27e678def5a963ac97c5c402fa29a563c40b3b621fd7eb8c58215fbf106be847cd1a46fdbba163f44ff863d9d86b7546dc4179ffd9b12daf06c45dc8b7ba728cefa96c887bd0df7ee018e34be118f37b922fef937e5b8e71bea6700cffd3b47708fd6db78e31bed1f319fd229e581053ffe329b144f9f2c431d64f23621fe5638f5809cc3f48fea285f23ef467665fe88feb8898437f6b4edcf8fb36b1843d94a78eb1debd235628af3cc738ff74e318fde78198f4bd837ff24dff827d1c39b6fa58ef1cc3be03e20ef4b7ce88bb289f078eb17f3925ee51ff7b758cefb3ac89499ff3827880fac3b9639c77ea128fa00fd9f098e4dfd4c705be0f714d2c70bf403846fcfe46eca3bc7c768cfdb4e6f915d90fe9876bdc7fcb1c63fda6e318e305c95f7425fc4d49dc97f0577de2a1c47e3cf46b667ff017912016d07f7ae518e75b33621ffdd93f20d6d0470cfb518d7e2b2a6ffa2fec23778cfdff057117f25a9f10f7a8ff0f1da3ffef88fb640f33e201e49305c443d4b7281d633cda138f21ffadef18fd6149cc71bd5c3946fcd52716282f1f1d63bde89258d278da738cf589576285ebf92786fe36c4a4efd5a46189780be3ad19ad703f79e618e7e5485ea28df23be118fe95117770bfa443dc43f9f2c031fae385639c973b26ee93fd54c403d45f70c7d8bf22fb112389f5d49858903d623eac1b7f12623ea14d7fc77c66e018f176403c20ff5939c679e113e211ec23fec478dfaded18f19722e6d047d09417c8e7b7c412f2de4bc7589f5d13fbb87fba778cf95a9758e37a3d730c7f88fe6aa269945fbe350c792e39711bf7f39bf2a45f3d24eea03cbb26eea2feea82b88ffcbce518ebddd231d6cf499e467f565fab57e221f4b5c91d637c2d89c712fe13fa36d62a719edbf68ffaf312e8bf3a27a678466c1c63bd69e518feb44d4cfd6bcd8825e9bbe518f25e13fb90d7e6c431f67b0b6205fdfa6f8e313f8fc0461f582f796d18f28e5c3ee439bf226ee3fae494b883fbb1e67ad24f7c47dc25796ac7983ff589a93feea8bd463ff08fc231cefff68807a84f3d38c6fcffc931be4771433c84be364d7d23dc3fed38c6fb77cdf371dc7fbe778cf3aca45fd39fb11ef0422c915fe68e319e2d881598d3f5b22d719e6a48dc97d80fb6f1906e37f3cbd596d887fe36036245fd2924d6b087c59b63ec571e808dbe70dee4be61e84754c41df25f77c45df2cffd86a19f7ce418dfc71a1293bfdccc1ce33ccaad63ccdf97c47db427dc348cf6f85de221ea53378eb1bedbd437827e524e3cc6fd58cb31de57ea100be8479c39c6f7ea368e713e784dec23bfba748c78f68158e1fe624eac51bf668e114f1f828dbe713e92f26547e2bc2ab5577625f693ca867d9c47f48907b00f3f271efa18dfa03f331b207f9613f720cf543a463c72484cfe6f1538c67ee101f100face9e1de3fcc50df188fcdf9a788ce7cf3831477dde8563c487e7c4d43fe2c231e2bdbd63ac3774897d5ccf2e8915c937758cf5873e31e963b7738cf9980736fe1adf3f281ce3fb2754dee807e72d48be463f38dfb520ee215f3e38467fec100f7cd82f3dafd117e20dee18e7c5ef88473ef6d76dbca0bb8d7f9c4f88299e5da4c4e4df36978e111f36d70fa1ffc58c9843de598758a07c31728cf5a38298ecddef38c6fb6007c41a1ce58e715e09f665bc05ee270e1c433ed386f1fce90d711bd7abc431e663197117d7cf9f887b641fd78eb1ded423267f5a3e360cf9ab17e201ea4f14f188fa176b18ed8b278ef13ecb31f118facd9af670e4a74b6281fce2cc31fc21e9434ad4ef93bea4f2a1cf31d86ff9382f79e518ef83f7893b3ed6df30def78cfef0fee59658a2bff84bc7f0771eb1c6f34ac8abd7d8ff5e11b751df86ae37fd01fe31748cf7c7f78eadfcb782b88bfbe95be21ee45f35d7937e424e3c407e913b867feb128f209ff89e780c79cb17c758af98107392f79b639c4f6813937eb2a63e89fab7678e71feac918f22791f126be887bf3946bc42f235fa42bcd8738cf58d6be236da1357c45de4e7dc31e65b47c43ddc3f69110b1ff283fdf51bfd0b8fd8477f5e613ce99bfe067fde22a6fe150d1c23de8e88bbb0876ae218fe70e018fb254df93ef49527c403944f470de3fee12b31f9bfe4d831d6a7668e313eed8939ca2f6e1c43df578e6d799f130be873bd708cefb10e8925ee97dc12fbd0e78aea6bfa9b3c778cf767491e467f984f937c4d7fc47ad68d63ec7f9c12f7507e593a467cffea18fbbd8fc47dd843f1403c803dacae89476076e318f1de2131477d8b35b152e80fa43f5f2bcc9fd01fcce801795437c4a49f4c1393ff5b468e313e3d120be42f0e1ce3bcf11bb1a4fe22897de4a78a58917ea463cc2fd11f8df5407e3e956ffa4f36728cf8ba4bdc817ca26bc758af6dca77a97ce618eb29afc47d5cbfc81c233e6bee3f207d3e110fe97eb163cc9f0f1c63fc0a88470afef094788cfa83a6fd02f9d1b1639c6f792196a86f5535ace0bf3c621ffaad0a628dfc3dec7f507f50d33eef86b803fb88d1ff864d7f5efbc402f2ae6e89499ff339b10ffd852d6245f98c98fc63de778cfda68563acffe0f94cb404fbc822e236e4bb691353ff4a32c758cf3b23ee42fef363e21ef9dfbd63c42f21f100e5fd33c7e88f2b62ea5f51d731f4f5d030f455d2f3fa63c83f11c4d41f75492c919fee1c63be7744eca3be55f3bc0ae5a303c7e8aff78e719e1cfe6b68f48b78f092b80bfd2753e2a182bc1f8985c2793ae86764f4077926c41acf9fc37e46463f56fefb1bc7e89f0be22ec93723ee415ede3d31f5aff0827888fc64d4309e7f774e4cf2f71e88c7906799360cf9a81531877c02e918eb775d621a3f59dc30eea75bc43e5def3946ff081c637f85116be82f7c748cf51fd8d748b515cec752fb4d7f837fdc107715f66342c7b0d71e710ff75b34d7f715bebf7c443c52f81e15c9438d15ce4b1f107394cf9af252e1fcd0a0618ddf6740f2560af650c15ec68d7f9d2f88a9bf2443e211e4194b624ef29c3bc67acd9658405e8122a6fe50dd112be4a7c231fc5b46ac51df863986bca83e63ff580fea3886be2ae20ee42d4e88bbc8cf1aee91bcce1c637e1912f7a1cf70473c407dd995639c3f0f1de37dad67e231f2e3d431c69b0d315738afd0e40bdc7ff94aec233ff11da3ffce1bd6985f92fe9486bee7b007def4b734251e439ee12db1803e828e639c7f3a259690ef6ae618ef5bf8c4d47ff697c41ae5a3b6637c5f513a46fc047be7cdf8b47f768cfd8809711bf6103c3bc6f9c9057117e593269ffa8faa88fb907f76ea18e7c114f110d7c7b78ef13da0a9638cef241fa33f8cc74d798ef2d9ca31f6dfdf8805f411270d6bc457244fd33ff1be5f40acd03fcbc231e2ad3db1d68887d17fb96e41ff9b27e236cac7a163c483478e61ff3be21e5835dcd7587f85bf16a63f63fe5a1093ff0cef8825f43fef12fbd0d7bc454cfdbb82ff3057437ff337e20ef4550e1ca37f5d12f7a0bff0d431d6b31f88fb547e4a3c803e76ca31f4171093beb7470d43de5b7a3ee35fd19f23c758efa81c231e68eec7717db4708cf7759af60a5c1f5c3bc6fcea8c58c29ea275c3d0e736718cf8bb9107f983f59e5869cc977d628debe3a5638c57d45e632f583fdc3a46fc7048dcc6f304778ef13e4287b883fa54e818f32f6aafeee2fe45535f1ff96ae918ef5f8d8987b87fba758cf97b933fd6787f18f62d1bff12c03f9a6818fa2e18f110f25e751dc31f36e549bf7187788ceb839963ec57b71ce33ce20db1c0f3ad0e8925ca877bc7781fe094d8873c933bc790e7de31f441cf67c663e8f7da31d6e7a1fffa03e3583f693b863f3f748cf7137ce236e9e7cd31d6d39f893b789ea8748cf3eb240fa34fc8fbd131c6d7d231de573c22eea13de98a7880f27ae118eb15778ee19f2f88871ae3ef867884f696178e719e7a42cc51be5a139b64ef87f1c537fa863e5f88693cde868ef13ed2393187fd14978eb1de281b86fcd3a63e9ffcfba061d24f53bf827cab91638c779e639c579b106bd8cf06fec7d486e75f6f88dba82f79748cef97a58ee10f347187faf7d031d6cb493e467ff87e89ef18e7df6e887ba82f683bc6f8bb710c7d90fc8cfe70beb3728cf19c118fa09ff489788cf6a8d831ce77e5c482f4d9e44be4af868e711e3323f6610fc5d631ce7bbc126bd4579d38c67a26c60bd5e87ff14c4cfa2b7c624de371d731e61bb067531acfb3ee1377507eae1ce3fccfda31fac72b7117f2dbc4c43df2dfc78ea10f4ddcc7f541cf31c6c363c7f09f9c7880fb9797c42394d763c7287fed18ebef5be231e4a9e9f94dffc37a29770cf92f8925954f88493fcb8c58a1fee4c931dee73e778cf9b424d66085ebcd6c00fa598f8835f93bf8775dff42062bcf9098e49bf68829fe89268ea1bf5be23ee4a50bc7d84fa1fb1b79a23f948e315f3e730cfff44a4ce39b6e3b86bd0f89c7b83eb9740c7fb8758cf3894dfb38e967e218fb5f8258a0fe843bc6faff29b144fde5d031d65362629ffaeb9b639c1fb82226fda9d231f4131193be66cb8ff491903eece123bd4f1ff6f091dea70f7bf848efd3873d7ca4f7e9c31e3ed2fbf4610f1fe97dfab0878ff43e7dd8c3477a9f3eece123bd4fbf650f1ef3b827ec4fd2f3cddfc2244579c2d3e67f559d6ffe0dcc1f69fe2ff0185d199abcc88bed3591f963fec7fcbfb9da4bcc1f6ed8d465feaeafad4bb3af6d795d33b509ff26688dfd3935b50ad46aef9f9a9fb9f99b7999977b85577af9179eb64961fd349fe5872605e6a9439bbebabddf47faf7f660f5a68c0c1323a1cafcdbc85a7cb20c2bbb5aaff3ba14646a7399b7f096decac88fdb1a542d43d803d512d0ffa726ad6bcbfbda96db7624f6a7d4d4636cc1dc4bc2b66cab22d3aad8fcbfb5519baf4c89c8db785b6fe7edbf5867dd1e7ac2cff298b55e69ebb7d6fd23a6dfb00765f4554bb591b168acc1e5e37f9a72ccfccb6dbf54de8177e81d79c7dec4fcc4a8f7864d79f4595bc789f51d69ed2fbeb6e5b69ec85a434aed39a5bbfbd696eb5e9e5bdbe464ddf5939c79e7de8537f52e3fabaff1348949d1bfbd6bfda4d197ece5c748bf610fc2e8921be94aefcabbf66e20af4f3eda784e8c0581776bbdb1b4ba096cfeccbbf3eebd07efd17b325733abf3d0f64e617b6a5d4b60fbdb33d5a2bfbeedf6cadabf4456872fc6cfbc9adadfbc96d7f63a5ed7eb91b52a3b6224d657f4bd8137f446dec1e7b591a7497f4bd7f67eeaa7b40769c7dbbadf8f8d8364755fb3ff6fb5606380d04b18678249e69b72a1d5b4e9954c31cd0216b288c52c61a9d110b3f99c7c85bd9e652cb79e1716f6a7fc2fe926b175302f608577c84a56b1395bb0255bb1b5b55a655b1b788a6dd896edd89e1d7c7ebf77d103fbf2f805cf616d4cfd84f6a0eb78affe971db22376cc26e4a3d1c31376e2bdb15376c6ced90593d63aa8ef1b691eb229bb6457ec9addb05b366377f67fa5fd63ed81ddb307f6c8b8bd8eff19f9dabba5b006dbabdf4c3b9fd8337b61afec8db5589b7558d7d6ff6c470fc67aaccf066cc846ccff427da14b751cfd993dd8c882ece1a7f40fa119ddd1af0fd9d874edfb77f61073c6b937e2824bee73c5b58de5226b0fb9c779c0431ef198273ce519cf79c14bdbf3ea31dd460abce273d6e10b1b9f5074f2b5c96a884620b6e64bbee26bbee15bbee37b7ec00ff911abed4f9b72075693313fe6137ec24fcdd8a2be505f133f4475ad5fc845f45bdf33f9d67afba7d26fc60faf753ccdcff8b9b1870b3ead476192cb9a5ff22b7ecd6ff82d9ff13b7667c7174402a7fc9e3ff047b6e54ffc99bff057fec65bbc6db51e581f61467cdee15ddee37d3e30fad2cdbcf66b12b5a68e0a241ff2111f9bdb33c185b09e2a1752f86c62f2d1e6b08e6d84125a04c662e517f49df292b745fd15aab07ed62f4984f92232f9b1f809edc18ea8757f09452a32918bc28d073d6f294a5189b958f04090ac6aef508fd3b3a55889b5d8886d1d81b042ecc45e1c884371248e6d39e9293e151371224ec59938af3d477d2f7151ebccce134231ad6317eb01223b6e7da9bf66762ca8733371c92a7125aec58db86d669c9f954f4c64732766750943af4ddce245e2ceb4e7de44a387e2413c8a27f1cc9ec44b338bb09e4fd74fc79fc42b8f4c8937d1126d1b2fbd5a0f9a8b8ee88a9ee88b81a7c4ad188a91189b21f45832f32491e462643a9690d2461eba96a9f465fd01452d03db3f427b3765738c3f96918c25e2dfd48edcf50c29e4461f6c235399c95c16ff697bf0d0cfccb82f4b59c9b9e933d23c1d67777221977225d77223b71c737266e3b6b59d5526ac2f7772cfcf6b59cd96f2401eca2379ccd25a5a884be4449ec8537926cfe5859c5acfb29697a22fa59d7724769e50d18a4168e7069faf0f2116d1b5eec58bbc92d752d9f9653dfee49f7b74c4bbf2c6d4ddcc50ed5a9abc95337967e6c71d792f1fe4a37c92cff245beca371a3f989d33a53290f51776eaaf76d45f1a18c8a1cdedc9911cfb9ecfeacfcfc9034ff9d2f7e50b8bebe3d9bed1a7b8f3433ff2633f11917d7a3327f6533ff373bf6043bf346d8dc88679fd9c7ee5cffd85bff457f6ff11a3733b9332d2e3b169c1a93f67a7dfc01e98edf5c63ff86b7fe36fe5c8b4eccadff97bffc03fe47b56aff531ffc83e23b76b4ea2b664ffd89ff82766c6677bb5f1c2b17fea9ff9e7fe85c99bd69a62d2bff4affc6bffc6bff567a6874e45ecdff9f7fe83ff68f4794033dac87a07c4aa9fad4fd8354e1317d6adf29ff8ab77c79fbd1ebcda17eda7b62b615aebdb5ecaedf3bd9a98e28c1ff8cffe8bffeabfb123bf255efcb6dff1bb7e8f64001fa4fcfafdf9a13f12f57ba266aaa2b88d254ccb94f0eb77217da55877b6545a052a54918a55c217c62349ff45a52af3cf55eea5e6fee66954e15f99f2a5aad45cac38530bfb34b57d2b7628576aa956aaee5d92ec81d939b5b17db5515bb5537b6ff20decc1aee398d61fa84375c4fae6e72ba9e44e1dab8989070e783d2feb59cd619d505bfd25ea449daa3371697d9db16319f8af2a51e7eac2cc276a6d3035554a5daa2b75ad6e78c78e116d75cb866aa6ee8c95d959a82959cf3ee6f59cd668fab3f1bc5921ad230975af1ed4a399c530bb8250dbd1e7f6204dfbd7c67a6a4b50626adb6b57a9d413bb923df5ac5ed4abbc556fe252b5e452b5c957534d22541dd5553d7f2a56aaaf066ae8a2d950d5ef0a8f8d8bec7a89186b663f5d27ebf3cd5a1b4b9fe84087c65e9feaf23af27afc40bee858273ad5193bacdbe5d672381fe95c17bad4157c24e646d6328d6761a99eeb85198dd36f600f217a083bd44bbd323ebe10e762a1d7fe83de7c5aaf746bc5b51ddba8dd1be9addee9bd9d7184b5d713521fe8437d24785da718e863ff861dfb8f7aa24ff4a93e3333c13b11eb73bed1177aeadd58395b49cf96fa525fe96b3efd621b131b8bc66aad6f7860ec4123ae859d7c660fb5df60eacdc835b66becccabcc08a8a45477fa96857ac6665eaaef4cd77f563d13d7a476f492368a11460af7fac18c79267ed28ffa493f5beb13b577e3957ed1af2c960376afdfeaf72aeb77a1eaf72d78bb3ee5af5f7dae8f75642512894b3d62911e075ec0d84dc0cdc8a3b11286d97d20f422309d08ebeb33da0d428cc6d240053a10ec1fda3ff9ddf1c2f4e62008c220127e100749900699d6b4ce0fbb4eac358434f20bc6833c2882d250642ddb3c695005f360c1bbc1d29ff9472251ad6025e37a6409d6c12608bcda272856045bff2ad8a9a9d1acb2fd3931d18a6217c1defb2c7eb27b4ba9bd8354a3e02038345e047b28b585069f3f0f5372a8b477859534371aa5fc2c380a8e834970625a52d908446275dd78937a54b77d511fab1b3f0c4e3da5f2e02c380f2eac3fb43116eb07cb60aa2af6145c0657c1757013dc06b3e02eb8f7c6ea3178081e65db9b044f36ceeaf1bd3e5261f01cbc04afc19b58042d1b81d5ebc126daf40e4d3bda41478d4c1b6de442eb78f6dfc00fba412fe807836f600f218d9f13bd0c86c1487655128c8d6f48cdb8ab6daf61b44f441ecdc65d3cf442a646e6e767f3043d783c396423751372390f85bf3541b4ef1f7b66980d8d71e989e921f5bd24bb0f387b0e83b05ea9a8472b1146fa348cc3447eaedf10b354af947998f29b30f35b616ea2f2032f0a8b2fcc47e61e0f2ec3d2f8800831bdf519f57370b661c76115cebd89dd67ab9f25a35892fc209bb06db80897fe93d886ab701d6e74ed29b4991599f1c43cf336dc85fbb0d4c7e14178a85be151c8c363f5104ec293f0343c0b4b33fef8b59db12c3c0f2fc2a93c0e2fc32b9d861bc1edda7dbd27f86c6470185e8737e1adb1878856fa2524cb143b0967e19db116e11dfec7ed21b21ad1e60918df84f7e143f8183e85cfa17922f207c2ee1f09ac175be9999f783b7c095fc598223e663567a4aecfc2b7b015b6c34ed80d7b615f9808896df4241cf80331ac7b06333ec1445717fa251cea33a357cd36e1281c479e577ebebf61bd522a2e2316994960b88f6420223f52669e3b3656f1f97eb6192bc456df44dabbc4fccd485f21def784f0f93c0a646962dd9eddd70e69459e6196a1daea9a4551182ea3288aa324ec9b5e9dd4f31566bd51944659f02836917140fa35caa342cda252ada22a9a478be035dc46b6cd3ae23a5a45ebe035da44db6817eda383e8303a727b43524debf1223a1663fb846b4f34b3e77aadc5afeb9cc8d537b00769c7336315bcf206d149742a7bd199b88aced59d6a471774c2012b4c18196dec65f2a6ac1d7dbe7fd88bae8265741d24d14d741bcde45bad93686bb478a70ec8d744667c3888eea387e831145e1e3d45cfd18b89dc22efb3f8c99e4448a3d7e82d6af93c6a4765d4d161d48d7a721ff5d917e36f358a06d150f2663471fb7351348ac6b117333be60534ea088a6252ce621e8b58c67eacd84d38e75b81f32009f6d64d4c94ca55ace5b99ac7411cc6517419c77112a77116e7ca37d7748cc7a9ec1e4b1a17711957c1969fc7f378112fe395774d6735541dadc5ebd8cc228c3d987e54cfc7bccaae97d452566a5d8f177265a2cec8fa65ec13fc89fde1afb68766ef49b2d3781befe2bd188b3c3e880ff5303e0a6233dfca29fe0d3eed601a5ac6c7f1a41e2f7e9dc42ddfc527ba151c44ddf8d4cc3f8ce5c767c607b3f8bc1e31663865732082f8229e065b3de0fdf832d8da9599cfe34365f72ed7fa2cbe8aaf4d507913dfc6b3f82ebe8f1fe247affcacbc994bc44f6c173ff3292255670fa61efe1cbf989860ebbd19bf1d34bbf3339cad31f9b2885fe337b5e799dcc948d8ebedba08f4919aa76e05d3f02c6e9b3f9db81bf7e2be0ee3413c8c4751c986f11574168feba028e18908976610dc24bef959f13a82aae325a1de824bb9d245d055236b6bafe46703ebabe6fa41fb41dbcc480ff8196217dbc6f597d6dfff667b0869a788cb49a293c0f4619584e2258992383e61afc12e498c64035ab56c4e4a097590a449f6b93d18ffff9ae449211f9232a992392bea7e17aa649164fe5d62d70f6985e92a5925eb64936ca33cd99979ae30f381cfe387d49eafe2582f0a45b24f0e9285384f567c21a27a05fd57e54572981c25c7be974cf4bbfd756a7fa48f830313cd9cd1fe1a471ee5d7250271999c24a7c959b44dce930b672d767f8e4ff569324d2e932b15eb32b94e6e4c4b6ef5abf790cc92bbe43e79a857544d3bc3f02179d43c9cc60b1daa2a68274fc973f292bcd2ea2c63ccae3f6c93b7662cb673636e7768c3c04f5a414fed83809dd0f9018155cc7fdc1e523a2115cab1bfe7b7666e5d4be7d4686ba91e9376d2895a4937be62138abc229c589365d24bfa9fdb8389d5d7c945b24c06c9301925882f84f7961a0388a7f5aa147615ad4fcd5296f2d43861d3f319b7e7b33e6b5f8fa293147a132ffe39afa312667c2cfb82fd48de4efd54a59a3febe8d3fe65b30aafa6699086acebe1440d4ebda4b3e69445ed9b5395a7511af3be1fbcb3955a67a91ca6499aa6599a27976921ba6220d2b48cb5e62a4aab746eecccf8505ea68b7499aea203f6aaf3e0446cf4537297aebd41ba3172ae63f024ddc4eb749beef415bf8c96a6c7758dad5de2b481893fa6ba0c7ae95e8df854f2fa4fb4f4ce8c457cf6bc7fbb3d289a7306b2480fd2c3f4480ea957c4de3a0c55cb1b887d7a1cc4ecde5ac21c32aaed3bfdc27851fb435dcfbe7d759df4646ce77546d6e9497aaa5ad2b7a320e2ecd88bfc59bc4acfd2f3f4a28e1dd897e68f8cd60ee123c2749a5ea65766767ac77ad0e4afca0bd64dafd39bf4d6eebee37cd6bbb37fe2259da577a2d674ddcec4f985a4d1bbf93737b3c6617a9f3e30ffdd692f1b4fa78fea217d32da7f8e236f6cfaf98129f992bea66fbae58f8c519f784cf5d256bc10a7693b19ab03d3c70fa37eda49b7519c7679e9adedfa03139bb417dffa2f69dfa4413a604faacff77258b7586c63990ed391b7353963f654e7675ef627ce1b7ead3d50ffb52b28e96dc6339149336669ec18ce96fc29f33395e92cc8426311a1f11c56cab53d64d117ec21c46aa0d15757dd795d2fcae2da8332c52f33ec95d7da9ddb5327077e2f4be29d4cedffd45ee3f3f308d2136e8c379e341499e9de5996e56680565f928f08b222abe77d36ee7d7f1ab7fe89df67556666c376ed41d1692fd5acbddafbd5b692d7a72cb285187cb2245a9d1d67cb7a0d3a5b656bdef6d2249477d94645d936bd919e1d7d0f8241b0ca76e163b6cf0e687438c80eb3a370efdfc949bd32cf5410f0343bce26719a9d64a7d999aab2137d2872ef4c4cbd6796aa6d769e5d6453f3ff97f6efabec5a8cd053ff497ba0f54956afe50597d94d761bb4664b5ab37fb1f3e13b59f27e709ecd642eea7e8c08d4cc8678579c7f561fb311426d63666a68bdf1ad9509c64d496b1df5aa6d65a2b7177699bc18af7160774dc417ec41e3ec5a3307f0c2ec2ebbcf1e3c3b27fa3cbe3273974cdc18a9affd23cc1e7e690fa6674eecfe78e84e050b27099c0fac6c0479c5a7a61c6bce83d21f1309658fd953741c56c9de9bd9ddf56ef6cc62339348ec6868468bec453d64afd99b8970eee9d4f995bacb5a71154722b096c85937d8c4955aa955786bfede069de838ea656d332ac87a3f2beb042add2933a244c7ba34f92aeba68f7fe6bce157da83b212afd72279d60b8eb3be5c60c785f456cf2972a5b9970dfc00eb49b51c459a0db3d117fc833d63cd993d0b2febfd66ab957ad6f86a679baf763e66f720b331dbcbe7dcb3a53956033eab0f6799b85d2de0753d39cb79d06787b6d59fef6f4adc6f462b6d9f228777166b773f1a1b98d12928ec2cda318437e7f8b13249b6a0ecb3e4f24d2afd2c552e708a944df4a0def7f6c6b9acc73071c1ee79aca722b57b34a19d1f85de8cad64c447ccb7fb9b420e652ea3dc0f7c35ca7dfd105cb03457e985ae473921031eabb532f215e3c0176335d2d35c9bfafeed09e0bfcd1e129a37304ff381b7cd83bce939763d9f63353b0a4d04508fa6465ef6447d1e4553ee4bef6b5b427bdbf664b408f4451eab27acc434a3f7ef5c1f1a292679cacf8daf7afebbe65f3f5bfacdf102c978b14c865efc9067788b827cb5987d3a538811d4f69824ccf3bc509f9d5ffebde4fc4ebde27198977965cf9ce0fd9e3f707aca537291cffdbd3cc0baeab796ecf7997e339e844fada3f759bec897c95e3527a434ed1aa1046665497261cfa304667c3d659baf6f8bf5c5f52c85e5ab7c1d5fe71bda0f137fc81ea27ccb6b6b58dbf77b3edbeffe487f24fdde79393b5a9ad1d00fc484ce1f45362e74b1776d172ec616760f4b627fe3eb9287d304f3daa2148fe7fcd4da5d68a3c6e00f8c17754b7bb685b597fa9be2ed9f2dfdcefe262ca23eb9b38e5e4d9410d2089f7e8ab85c54657566f4a9e4c844f05f1ddfb8f774cc3df28d5f99bb3571be6c568f7ff37a6ddfbac1a9fe1ff6bceb3f9d7ec73f346fe732bb5ba53d7af316eba8bf98ad89e64c22f5eaaf3f2fcddc5b3eda7a9c146fd5d2298adfad8fd6caf0d66de07de10d8b8ff4fbe977cec330775e2bb22b8775ffd3765df5935fa877179ab3ca12b3927cf7f53d94def4833d24f5db54b47e1d591dff81f985fd1b3bd9bc8e433ed2d7a7df3e3f496753998d17423a7d1ee0a4f227fff0694dc6fa8f97e65ce3d7250f2708ed2e9e3dcb96d0789536b39adfb93eb4d61ad2153fe8fbf8ff74faf81ec8477a9f3eece123bd4f1ff6f091dea70f7bf848efd3873d7ca4f7e9c31e3ed2fbf4610f1fe97dfab0878ff43e7dd8c3477a9f3eece123bd4f1ff6f091dea70f7bf848efd3873d7ca4f7e9c31e3ed2fbf4610f1fe97dfab0878ff43efd3cf6604f5945ee4dcce6eb58782bdd7d9ff48f9de5fe71d34f650fcc9d0166cdf929bcc78d77727ffd1b1d7ec6f4b3d903fd54a7b51cb28c4d985fbf39fdfefcdfcf9c7e227b60f6dd1e9cf10cbd37ce59212ec5a5b7e2f7ded5fb777b7f662ff113d983b0df30acbd444f0ea3a37c2f5ebcbed7cf0fbc767e2806f8d68a2bfb610f3f78a2d3e17514b960f7acafaef2a3fc389fe427b2cc4fe56dfd45ba776f937cd8c34f90f0857596f1b61ae667f97978925fe4d3fc32bf0a851c365fd1ff79ade167b2077af330afc70ad6cdaff94518e437f96d3ecbef78accc18f2fe37427debd67eabf413d903879ed9c4df8a9e7ecbeff387fc513ce74f599bef549b719a79e00b613fe9fb3c3f913de05db3dc9b856176973fe72f7c93bf269b7c1ebfb1d21bfb8f262ff09a2fc7fda4df13f989eca18e24233934b3cc544df2373ef76f4296b7f2226fe79df84aacf005b7f76f27ff7ce9e7b2873a9614973ccebb79cf1b0407793fbbf69f835de6e963d667f5d7a2c30f7bf8d66df8cf24bc8f5ccf2dc4793e100bd9f5398bf3613e8ab7f13c1ff3bdf4d984ddc122be756bbf55fa89ecc1ae562ba1daf1939f71919cf22ca9b49f5d07abc2cbda61879d4ace32fb55d09f7686f173d98397f36711cb56c4fc89bef11eb255c1b2d782f379de2e4421f9b158b1496d113f6bfa89ecc1fe564e762f5ed8283d97155feb56bc2cfca4f279a1c45bf292657c275ec4257cc4cf997e1c7bf8c59745c5bf49b57f785177852e02d90b9e951fb48b307c2ca2222e12355717612732330d6f51ff9661bbf7a5e81bba3fc97ac48f640fef7f7ebf13f1eee7da3ff87a92b68a346449153caab8c874a0fd228f4ffccbec515da4b7fe2c1466d4089b6f657dd8c3f79d3e7dc7e897a71a1a7b08b8bf090fb26b134dbe26f5af18df8ad3f0319e14aa288a52bfa911eb7b33fb7b52f10dad9f68c6f1e3d9c32f47884ffff3c91ef4a4b687b0823da46f695e54e23415c9717cc245318fcfe32b7d663c444ea726d8cf33dff8d1ece1df460e9fe207e31fd43c3c281666bc68a779f2943c15cba28afdc0cbaef551745eac8ab5f0f9540eed37ee3eece1bb4dbf7de6adb687e828b88ccf8b8d3accaee3857e2db6c993962aaa2d223c8bbae2aad8157b7521c6f24d16f57ae5a728e267483f8e3dfcfa04a419fd73333ef8ccafff3554af33e5a150073c89fce240df5a7b58a66f2a5291f112bc388c6fb3919e050bb60c62ef5008fb7b413fece1bb4cbfb60736619cdd87c2cc15eecd4ff5ef7ccdd944acd455de298ef8a638ceae825eb1853d6899be1593a8d41de33776e2ba38116376606719acf9ed293f43fa81ec41599f80c871edcdc4a59cb0ae4845ca4ea5b10363151bb6513da98a53aed4697156b0b8d449ed1bea114395c622ce8337ef9e5de76bbe2d2ebc7128c4e0d36f35a4fbb0e6abcd3f62fa71eca14ef68be6f52c221397de587ad93c3fcec7c5541feb81b71497ac906f62abcfe3a32ce06fc5a51e1757b577404a9ed23c780c9eb3ebe2da1f14373c36b38c4db356f9eeb7e1a4f8a6ff8f987e1c7ba0b9a5d1931c9a7e1d8bf364af776c19aed24171ab27e25cf822caaf822c1f14b342f12c3c5371f244d650d67fd75165b6e237818856a98e9fc2d09bc11ee837b5c053b8df00f3e3a51fc81ef02d7e630fcc1797fe2e1fb327bde222dec6c7e2da9b16a2b88bb6d1563f9af9e4bd7f533c885315237a207b302386e6e1a12e8b4791154ff1b99a9a7126aba3517657ff9e956ffd8cff7cfaf1ecc15b9ba85116cfc58bb74d8fd9b4780dfa791abd149be2ad6865776a12bf15857af01e8ab6e64d34893fb58708dad9557caf4ef3dba223ce4d4c796f7fefdeac4ef5db5cf84df13f6a7cf903d943d8ac2bb349b29459d1e5fda2c75a3ecfee358b87f1366f9b91a25f0c8ab21816a3c0537ef2993d98d8722c4ea390bd16e3b45f7ac2573db1125244ea4971f9c6a7c62afce664fe8f977e287be076d619b1ccce225eb275d1ab7f77bcee94ace472152ee36e29d852b0528683e039784cf34ff6d0c494092ffd52f1309b85ba78115b762a021ea7b7fc80efa4e71daadccc60b36ffdb4ff54fa81ec8135f62087a6174fd444cdfd2bbe6671303349853c3ed117eabad4652057c9adaaf4a258fe329eac533deb8cd3e4363ef1efcbb08cc4d8d8425274cab84c8ad3d293a91fd46bd9dffa79ff99f4e3d8c3bb1961ceeebd312be3377f121f96697856b4c3333d2fb342e9a57fa54ecb3c0acb428f5d34f92ed53165ec972cdcf893c4cc3acbd2fca9ca79342d1779dbcf7862bcc4323ab2ef7335bf35ea87997ffe38f6f0ee77f5448c974bf5e867e5aa5ccbd3f02c68ebd7e03a1121570fec5576f85bb951bee6ce3b44cd4fc953bddf59faf52a8478e44a9445873d155eb9d547e52e2fcb453a5613a98464dcee7faa4ff7fe11d20f6a0f137610f8715f2cb2409e076f45a5b99937ac748b67a92af7ba234e8baa587eee1dec1c635b9c0733735d9f0b3537b391bdbe08fada0b5979501e063b3f63253b149776355be237d3fe28e947b2076713517daa5e7afa5cb03cc8eee3b4a8d2dc58444f07e55176924dc569d04bde79875f2633c73023462c8b915e8a0557718b6fd8a5771fcb6c94768a5d799c9fc74ffe8c1566cc0870ef1fc5267e247b70e75f7296e9b35ce75d75a466e524bead2347d3eb972a56cb6416de18df30f977de01ab10fa35bbf479d02f86f9031b9727e6e7e7609654fc4d9e85cbe42552a227dfea31a37e63fcc7797fe787b207f2dcb57f1097d1b678e1fd78571cc7b74555c705aa34f3096ea2065eef72ffda3b7c9a73da98722c4ebd07ed654179caa6e22a0a83eba853b483e778c2a6d13cdc9667fc5cf27a2dc2ae607fd8c3ffb2d4d843fd85b0da3fd87dccbe9ad5f6604687a75afff5df9f5b824b6ece59af42243355f11b7619dfb156711c3e96e7e585b1ab3bb5e26b7fcd4ff479f226eb75cbfcc31efe7726fa926062fd83145d75913f95d3ec9e4571d9ac3bfd7abda1662dc937949fbc44fa565e16a10e79565e25b751379b86c7f5d9db6812a7e5b5ff963dd4e72cd5545cda5375a25efbf811d2f76b0f9f9d8db4a756ec79a69e7d4b735cdcfa77e19cbf65abf4e94b2b0dbf9dcc98b212a7e244b7c2c7ec2a5ea64ff528a3b94e7527acbc41d8cf077c677740f31fe7bcccf76e0fef984e31d5a75558c60ef82e4bcb1b3367ccc2b366dfea6b52adfb40177eb837e930e895b7b53dd467b1b355b967afe5acbcd313be371ea268be62f9fda7efd71e9ae4fc4348f610ce9626ee5f1677e57df6c05ea36eec1793afb7877af73bcd55ac17667652d973f96f766d621275ca87f231de4533ff5a9cab767d46e247390ff1e3d9433ddfe4cfdeb87c2a9ffd096ba5bba2ddec5b7d9d3de024beb9d6a44fe76eeb3333c135cffc9bfc21edb332ba0ac58f7332e2fbb587cfc60b670f7228b93a5093f225d80407ba13eb3f650f346a9828b344f48958d3cc4f2e93c7a8ad3dbdac7740a52a5fcdac33f8d6f2f87bd2f76e0fefced7874d4ebdfaa086fec87f296591672741afe9dd5f9fccfca3fc340fad7faa4f59ea058bcab72c0896591a3f954be38f3eece11ba75ff80613cf7dd2089bf0b61a15b7e5a26c25b776b5fa4f5ac3e76308f98c38f6bd0775a32fcab6baf30e25f77adf5a1e7f4ffadeedc14472b9fd2e79e65dd53fdb3f336f5976a2b7725576b357716afcfbbf5b81fa5dddfffaffea31c3cc3c44e997bdecba9471d71fc954c81fe584ccf7630fef7f1b01ed5bf5ea776e241797bccda7ec5e06c626ecf7464510c4c9203d662d3d0fa7f53b9a7f937fa0547b887a0754ae782ef2b22f226383d1bb13d8efde2effd4faef217dcff6507f3b50bec93cbee2316379fd4ef63df3ed3b58c3bce3efb35938280741bb1cda28e06fb507cd8b3011eaa19cd55faf143e2b9aef5fd3fe56f84b7bf85ed2f7680fce1aee559bc7e528d8966375173fa9a97cb3efe7f5d5883f08a606c92d8bec3987f2efb687348fb50e79a897919fecf99e4fbd45d3cefae49e271d7d5716f1fdda83f503d3f2291897cf95c7b7156365b4657d7de68d2bee67c57dfe5a9f8dfa336b93bf9f8a65d08b6f7dee3f47337d2e334410f69d417c43847d6af7f7e427be1f7ba853335ad46b4ede8cf5c5792192974a048bb855d46f6395f1953f8bb6950cf62cf12e7459b471a6fefd6ef6dfe321541c9e95fb745ff97a173f794bec74523b034fbf8f1d3eece19f49bfb487fa3bd47a572ef4320b2ac592b85be96c2eba5550886c9da7559854b1b6a3c53f600fc5a4689b39e743bc8ddf8a0bf1627f63c2dace6f727ac7ef239efc87d37b7b60f7f9557191f6b9905d76a93db52f8ab45545c60426c52a585649bdb3f9f7ad3dfc728e529f9088752ad86595aab9aaf7b556de8c3f87a29ee99859cf90be3ff5610fff6072b38ba8feb2477ec54ab63411fe5df9968dd8aeca7864fa6a27ee179b2a67c37a27cbad3dfcadf1a4f50fcba252553c0956bc5f9c8a6d18ca376f995f095fc4c9d25805be3f25decf8bfef7a7efc71edef9863a6acba3236fcc46655b5eb156f65a15e5be2ad561b9904b35cf54bc930f3a4c66e52dbef5f1f75a439d8aa55e04b35485f3649bb5f9811ec45755a5afaab99c89aea8bf15c079e97ee74ef8d79efe3f95be1f7b40c2db2ff8f28ff0d55d79570c83f340c5b78971dcc5ab0aa297e8451db2619215976eb4f89bbd03ec41c5e2d4bbd7b36a116ef524ec944f79d7c4b495c8f30edf8900df3ea63734be93ef877cbff66066fc87f179fd4e9ef674273c3333cb4e393163478b4dcddf93e0392addb9877fc01eec9a543b96eac69f18ab147927f3d25669663ad5b26633e718d727f26985ea3b394ff73dd9c3a755e07a354aacf83eef248b6a552cb293a80cdae1592ae479f95866a90a3c331bbca8d6ffc44841a92c96a51f3ed6116571244a33d379a936e2291b96327aa9b6c58dd8be3f91ffada5f7c7d2f76b0ff509eabc5b9fa8972ff16d78a3c77a214e55153e065ebc08cf829eddb7f8073c03527d32462dcb4df9c837d5325c252ffe7d29f54d9989fa0dd19bb41fc4f5897cfcdebe0f7bf8fbd3fb130ff5373fa4e75fc7476c9aaa6c1597092f264555fac19d99553cea85f1e6cb7f66a4f8640f412f9b9657d52e3e36730cafda5707fcad3ae499ec04a1ffe287629c2cad87f86edef6fd3eeda17e4353bee9e32ce5399d981dd7e71b4dcc5fbf6f73995cda37f9ff315bb0a9feba50bbb8cc46c56bf8501d1545755c4d742b4eebb7b8f86d7c9c8962ca64283eece19f49efbf3bcc78bd3a196eb960af511cfbc61b6cab137b9aed09a7a1d2d75f6aefefb607fb2e47ac83ea3438afcefc75755e5d54d358991873a0cbead2cc74fcbca386e292f9f55b21df5a7a7f2c7d3ff6d0cce33d5dff5655ffd11bcb015bcaabaad465f298e6ffa82ff837f69070e597039fa71dfe9ab7b2a78419cb5c8437aa2a27d555755ddc5695892927dfcffb19df973dd8bd435d47937c5a9f9855f3224d6f82e7d2ffcfdb439dd23ce805d76a9baaeaa6ba6571b60ab419b1c6e13e7b2d5eab19abca9188bdd9b796dd1f4fdf8f3d20e1b7a2b1cccc36e3e226eef28dcf54559f98fd16f650c72be14d70adc3ea2ea982eb645647b19a0777d5bd19451e2aaf9222adbf2ec4eebeb5e4fe58faeeec816617fa4c8c8b4eb564d3e4b6deb5fa36f650c72ab545c4be380da7e94a77ebf3f9e530d0d949d4cbd36c5ddc445b33331e7e2fef6f7d3ff6f06eff62cdb86a5741f518b7f82d6617ff797b68be4f68bf2130ae53fdd64e3daba9bf48c6a2ec5e0daa277d2e3d13417c37a76dbf277b707bc7eb7aaf3b9bb3a7a26043efa19e5dfc83eb907fc04b18abd8d6f35d3303b5bf4b237d0af7e59edf56cfd563f3bbe2bf8ff4fdd8c3a7355f33db2c82cb7a2fab7a09ce032feafcf9f7af7e9d6a9dfe95d3d8741e9fc77ed48deff287709bcdfd80dd7f2f6ff47d5ff6d0bc8f272ef520d97bdb6c564d924a2ddf7d47f22ff5f3628984af877c552af13b13605349fd558092b5f44531670faccbee3fe2c9bf9a3eade0d04c13df23565ec47c7dc6977e28aefde7e22cbe3573bce4eff00fc5b68e04d2a7f4c98c3f7963139ff4fcc7ed2ae1c1a3eea445b6944b3de1e77c5adbc3fbb331ff5bd723fef7dac3bbd350bffc6d79b9125ce75ed68ecec5261b05d7d5ebdfe11fec3cb1973c16ede451bfd6112a56bc610f5f73fe327932338c765295995ee6ed725c7f25dfee7b7fd8c35f4abffafe4b84df86250bc9f9717117bdb10bff260afff4fb78bf4ae5d0cc5adb665e70a2aae03ad676cee2fcc2d79dc7adcf4e6557f225def92f453fbeaabf2af4610f7f2dd56f38d97fe9fc0bcb94088558e933d657d3b2acdeeaaf3be8322aeb33717f35d9afc1b48359ba93a7d96be0056fe14dc23fe57f9d3d981967c5229feb23de2f5ea2ed873dfcf5f48b775a7236e153f9e68dfd1d8f452fec5491bfcf8ae020b94a66eff5f617ec615c7f4d30ef9759384855f8284ecb3fed776a7b88d3da1ed451716a7fef52f6610f7f2d35bf29b94ecce753118b6eb18ecff34ed1af5a69bf6a97bb228a17f5b997bfc31eeabdca4464d7f15df11a9cf34c55e1f19f7d13b8b10735abfd83b1e0cb0f7bf8abc97e29ceda03bd8bd55313390ff6f97de4278beaa9da571d791eccfe96b5eafaecdb45f0264f59ab52e569d50d2bb52dc23fbbce85f8219ef04ddcb5f1c3473cf99753630fdebadecd14ff7f7befd5dc38ae858bbe9fbf817796952ca9ce9365cbb692956ccbd21b0022308351a1eafef7bb0052dd6a77983d3d3d7bdba758abba258b09043eac8c0549af8862b7b24d63b1a771b0a43066c8250fd598fdb3fc0655aec7543bbc0d323767037b1eb7cb3ac77f9f437c6f5fe089b5abf1f04fa9d4202c870a92875cf5d59b7b88bdb883aed0157954d891c14434fe44e442d70062999b7a77f626be164795aba33f8f576265f644f80fb1f61539d101ec93a6b811fbd8e2436b80a2f3eaef8f4e1f1a0fd254517028656dd20a02df0e7d11e1408e9d9647f85584bc973f13b9d0785076dc651e3ce118aef1bd3db4ba38a8d6fbfd8778f85adbd60fe54058d698ce508694f64f7e96fd743e071e08d5f5a0d8537c54332ea3a97ce4428de49cb9bf5f29ec5b3c78d87bf1092e04487cf41a252a158b58aa6b977bff31e2bed8a4cac371cf7a46dd73fce272edf7c7a68f8b872f1e6abdbb49071f492895e804bd20977751cc5ce69ee3cbdf8cc5ef118ca0a3fc2399d199f7168ee27ea4fcbb60633d475263ee3fbf4fc91f38d6b50054e15ef1a3ea583ac7bace7ff88764f0808cef01134736fd07f7ce9e3b6015f27eb963c13f8b445e52199114cfea46a4511275543fb1a40a4482825c8dff06073aeff26b7664439338c316eb990cca1a0fff90ca3a2b251ea48c560916a9ce76881a3a9bfebb31fa47f685f63e900775c2db84f80f613f1af351d896aec4c17d34f81b364685079d1f25b1ae3ea7bd0f757ed49fa00b3cac198f0abd5b5eac84057cfd5fa817a76b10d3914cd85342550f1f133bb6688ca68a29fbe73b2b7d4f65d675c27c2246ea90703e14535d5baad61ffe399de585b5645cbdb2477b81de7ce228a3e1a96a3efe917515ba9683bb5033b6140e1b83aed2f66ff1813ef94dd1d2bb3aff4d3c4cc94322d0d6256a1d15c4d5d930357ff8a7f465b5a6a90483946a44dd78ea939fced75f23c31c2dab0f5f64bb54a8d2bb767b713c0c96f6296c9216768395182432711ca96b8af8bbc42dd7fa987d977eaebdaaaa36e553d8d1fbb95a2b324abc6a870cef2266ff61d7737e0e3ce8dd55651e7513df69fc6778d023f7ed59e5ca2dd5555d9d0175d63fcaec063fe4beb068333ea9155be19335c0473cc68eb8d7d9ba669d78a077e8bbac74ff333c685fb5bba06fea88590486b24dcbfdbe2f57237f5cfac87838472fd01ab5d82ab622e147bca9e3d0bfe6df7a0e97796f5f7d49ba468cce785163bd9b05c7e751d5fc5d57ac77afe5186de36bf49a04c4b6fa30af439526915e2b2cda70dd1446992b9ba75a9bfdd5b3755d29b1f1e7d1d1b113c5baa62a4858ca8b8f5f7bf033e041123c7247492c6fd0d18bff120f0a78c082f761d4fb95a6517a0542de67920bf2009665a35afd5d490bbdff6a92c447f61434f41e48c42507b0305e4361e308c1f836a2469007d3602a1f5dcedc9f3f5fefdd2907c8455774264e61dfeab03623a5b7fa7d45fe8f481f1b0f1a11666ddec43b45b7a11f856e2af8afe7277081becb5d9b0b66eb5d57cb3c78b019a7de0b72781334906b7912fcac95eaec576fa9a34f66fdcc1b65a8c31ae4105f85af81a7862c7633f9e8c54e2be8a9937c114f5565899ff107e035498ab6da939164d4721f599b0383f9160f1f15131f1a0fa8c403c94de50fa6f7560d267efe133c987d4b74552747053997bcc962bd2b735915c454ff7a422edec13d7abcc9858e93eb512d7d51f1c06ffa77e5ee0584a20ee98bbe779049b0567b8da2b0cb2dbf890bbc833bfb3f8d9a80aeaaa6e229e885db78294e1189ae580fc7b8a12318ef2b9e7f44faf878d0d9d4a4a5f75ed6f5a8c5321afd5c9f2bb3de90e3529fa95d92baa98e7895fbe2394d2ed58ecc50578ce8c84d9959c55356f5408ecf921c8749219b202b722bc3c7f845dc890edc87693458e3a08bf7f1114d9d56596de2c7cf07d913e81d19c3ad12c93e3990309ac7d83eda8772fff73adefdbb74f647956b35eda7e4984478279ed4f4c76351ad84e947d23fd2b7e484aed48b78164f9a0f80c478250f722ca224b2ae65124f931ba770f57ebd20ef1de53492419cbbade881b4d00d99dacb2440afe1b33d0f3bc053026b2c72996192dcdaf3a06772700e3fc743902777c9d05925f7c943f2988ca25db4b2face6db597ef9775871f913e381ecab5dc945aa21f37dc7b9d5dfff3b59a5ab7e75b16e31d7bf6851b863d1b07f73a42191d340fd07b6f4742a4f189366ca4ebcf99bd9b63f164a7f451b6ad09bd2636c9c9148ff830e1f6c25d790bc060948c9d377587ef3171bbc13a99f0f4c72bc2b4a6a2a6c9d4a5d84e66c913de075142d42a99531737ce3952264a57e3e16fd27b3c240bbdda429e7e8e076d374652308ed00e2d92a59af891b0b47fd10fc58b1747a1bd89d6ec561c23115ee9ec86e0085664a6583cc47bf204988b590345fcd19d79a76445e3644d4eb41974e36bc7f6af55c35edb1b350b0c1e7eec03010ed57254f29ca4c94bf2ea0f682798c7594245803aa61a658d87dfa4eff140733cff397f3096458a1c3ac25bb4881bce04f5dd55b0958f6aca5bcaf690b89137e409b4fe8d33718fcce34aecbc55708f77f62e7c8e123e44035d855a6d756d09c7a6b3245205bf956dc78e5f224254f2c696f44de3e17d8cebfc97ceac8946919d6c935d72653d278d60878975a77a529aca62e54ec21fd6e6fc3c787026b4a5f1f0d37c04ed77b0bd59005cda99b0c44b310104edc45270ff15b8844257f12969263468c48730a12d778ddca4e5057e3369bb5a631d1147d722676d77666fbd6b278fba51178dd45bdc8f690cd745167bd0fbc3ebaca91ff187cabb85a391b774946b23c77175bd52bd8a339ca1b5c103fbc8b56affdfc143292d9c167ba633fb8462774752900f777a7da7de9bdda5eec03d249d68ce8670b77e72ed9ffc792cd99cbca8942865113fe9a221b229462dd50b1ae14edd45b7ee2e6a45e3d04a7a204f5ed9b58dbfee0fff1e0d251eb456e987493f8a5dbbf4828b93e758fdaf78f8a8dce133e101e445eba7f242d7e0386869013a63cbbdc2073e0a7cdc097dfaecc57c1bc571cf23a86b4fad893b524dd4c363fb2db55294e2a49d12bf23b073c00dcdd169176fd00d65a817b692908ddd113e02bf38baaf81153792c85b00c2da605fbc8b9f81a542abb5bfaaf46b989c2b2246f1493590fa8207bf9617bf437fc3be507a3eea6ad2bc193c7902336b656ff92859c9359afac47b896239102dbfe91eac095b91160da22be5a534b559932d529672d2067d6f6dcd4cb59100450cbb33d6f31764e4ce80d3dfd84bf81e3a9354689b455b26efe35aefe587ceaaf596a0cff6ec85ceaafd222f6a3cfc16bdc7833806828e7e848772df75ef052ccd20bca2b38847736579302bf9185d21d7d4001c709bccf8d84dc2477c0a67ce41f552993aa94b8ef43af5ac4c9ac754f58886146b2f257b65217fa4184fb4872a688823bf0d9e908b1cedcdfa59de54153335fc81e5a92f330725a6cedc173c7cd8faa41f170f653e8c258d7fb21db508d2b5c3b42fa8d2e5d4d79ed7fa228bad35d7fade920c85cbef500fbdba77f4310d3c5b704729b04369acd743a001dda10ef1f92658452bb0316fe0ef48ef68f3e5c97a8f578c30480e0c1ac59078b8410e11896ed3902fbd3bc098afca2a453fcdba3051533b7e705758e7e04dadb272b1acb2be6afef0b7a9cc8fd2fbe881fdf7863b3a7e51ae99ba9c8966b5c3dcf54193f7dc2ecc45db96fe82327c9346c0df95cf5c5fce1d95ec646c17c10bf6d8843fa2884c512704596065ac8d3756bbda37f31c5f70f43e5866d7a350d71920b93b8ba983ec953dc3db2864b97cd4b1919ffbcecb3ca960cb97d19a1ffd056be8acda1a0fbf4f251ecef14d2fade29bef5664e99dcd409e4bfa16313ec6f7f14b347167c466bd88e07bbc8f422f56b69c0753ef4ed1e8e4305d8f41cf7a6b09d6e51a78c010adf4eedfefb3972ef7fa94c47de477d13c8de3d7d847dbb0a36bea7f5d49fcbde4d07890271c88fb98e83c297cc683acfd51bf4365bebdce8f2af31fecbdce7f50d77a142e7b5f67b944921dd094bcc6af641853caa4640dd6c55e9a445d6bac57793acd6012aced4df8cac6a40dbac1b0dc070ff842db8cd10ff31b2fea650f599b087c8c3aee4edcb16b77a851f6b525df67d081bdd1d791ce40b0276c510bf010d478f87d2af31fca7c391a0a37e1a89ff8bca9eb3d5ce2a1dc3b9927b18a9f935544e258472881033ca81e19466bbc087a11d2955ff03c6e45cba04146604be0ea1914e8cbf8bccf57f95a9b062384f9231e81bed10f16d6b57ae1f2020f3fa827a473b6831cefd0447674154a5d03a292171f782fad8f8b87b236f1399f56bd46099d818560ebfceaf7d6056893073253878863cf9dc1b86d00433bd26763ed83c0325e8b9d586a59ae72bc94cd4ab7732a4de19bbc84f7fbe17dd527c05eccc8888f84e31ebd3b5d1fe25799393a8ecee2e8ced48078a0acaa1153e3e1b7a9d4bbcaf538fcc5ef47117b76a98e4fbdc783a3e40bb7ec59b8d6da22c951005a2841033e8c1291f2a5ce7708ee1da93d52f890a6e10c34c8f09b2a65ef2ad05be52edcb8dc7b5913b9466b86fd459ab12799780bd7d755b34b7df247766794e93c4a2cd33c59556bfe538371cdf56a7bf33708387951aecfb232c7b703b35e4fba3673cf7d5eee7851ae878a42bcc7f7ba5a93dee910d9f68b958596fd8419cf70116c53f8e737d1ad6a089708e7166c07ed0b60e739fb9e3f949640357ef03fa514d3102907c936da46cf55568cfa291e8620a35c3ee763d5081f898d22f336e5fdfc5a7ff8bb548d8c672a89856444427b2d4819c1d0b3f26b3e3d202248f77897aa641134425d2f1ad32e7088a93510ae7f0dfadf0398261d6fc19e010fabb08f6327bbacd8f223fdcef0068d1852ad2a0ebc8cb4a2b7e8c4336e7988c9cb753aa547a4f2583be56e8ce2090778e15ed94138ada29b5f76d2aaf1f077e9cb4c8591b04ea08f8d42134d02dd30fed633e8bdfa5d2e747de0e0d9bfa657e8c1eca59de20d8c603b6c7ad7ae464413bd796db5d47820b63ee32ff020cfedd0d204f01591b7a467076aeede7b0b75ab7375bfe70b673ce80a316eaab0c885a3b549fffe4bb4bbc6c36fd1c558a564eacea2b9e4a1af022fd61e884b7d5ee745690dc209633f5cab3ebfd6f59ad00a018f262ebf0b5b114f0fd1912ded2226e931bad2bbaf5feea6fc433cf8df56d4a73b6a8134b223419b2c4f4fde4ff2f6ca9c6db0796c9683cd738ab83b6237ba45678f57bd3eeb77a8ac3f598d4644444cf55ebcb459aee87dafbbf97930496f421167310f2d5d511ead40031c8216d7c7c7e8cddd61161392a683b82f9b656ce91b7fe4cff1e0e8780699b21b7a8d5edd2bb76b63bd03cb4f5781a873668ecfe2969adb41b422ae37387bc33ff60a8c8f8d876aac0ab4963248508cc9b9226d1953fe6a63e8f5fa603f6ca3c8dd21457c42acd48c6440f270c67a4926faf2805ee37e7aab5758584ba3ddfd45febb392ab47792b8f8889fd59dbcc1857367f66ffba9ad097818329b5f718b0da2dbe8a1f47f5dac40acf1f01b0478f0be7807b1d95dd1b257dad27b9f8fa26587ded98c37fd799c0745d8a2969781d6119ac854a4a393e91d3e2a8b5ec35c6db98f6091dae619bfe20fa2fc34f9101d6a85cd741845780bb6eb42347e5ef3d2d83b6de4a827ba71effceb68e2ccf4aeac97feef1a0f7f9f2a6f946f747b13d30a9b92f32c19f0e6b73520ca3d48ca6c18d189d6641815565f926acc4d860b7fb4321c23446c2b0334e04b69f1133c942b2e436b891bd88d697a1f9398a917ded415497e5c8fe4bcfb4564a70fe28667e96310e8fa30c08d2a7f788d87dfa5caded3fe0161ead3da48a5a374ecae1ce95efbddf751ce6828075ce1223a4a1ebd9116a1e5be76c647bc437b98e511a06a924ed01074bbe2aff060ae05cd416dd1009e3c25287ac28578d671cd1fd4183be34179583482593aa3799ca64fa5ec2a575e983bd678f80774114f0a4c468aa552769dce592ce7679bb3cc5a8cef5557afb3f7193bb95764a87a4418abb3e2fa96b00aa0d450f1437e408ddfc9ffeaa1d639106a6b0d8224bc5677e9823d8760edf2ad5ecf71c911befaa3cc7a9c583e3aad74e93ad16dba227d7453ea2a9f833e3e1e4a9fb55ec5a9b39eed3d8d75c4920ba3d1a9af75623487706de446bd2072fa9a4368bfd417ad9e7f7fdf77cf42a5be72c68a9632c06306d12a5d47b7c9b53df759faec726e5608ff280fa6dc6d4f67edf145e04995bea8579ae20970870feb9f7e4f9f030fc66bbd0e67a00daa9804425b7c555ecc190fa51ed760b1dad196f7a8d6d1151e9575a3b5ed7879c79fc806ff1227c01bd684b249d28b16f6297d0d766a283662a5b3bb7fbeb69b6365eb163857368f2def4459b59ffb87f54fbfa78f8c876f638ea00134a81fcdf195d85b63e593079d497951e745af8deac73d76c0855dd86f5193df818cd9545e627979cf1ff2876a0e97562ac53a8302a47f18ddd2935bb8c3a4956e785f752f76517a6757e8d58260579c5097c66296bee94a1267cba2c6c33fa5ef62d03b49ac3e7fb1031ca65bfae6c555b562c5be5487f243d021fca097eeeca96a888373d0963f56a03d88efeffbddf33c13fb367b6d10975a317576e429eaaa82bef944eb91d1e147f92f3aaa66f6cc6a4753f14c9b714e50e047054d751ed66742c3c7c6c337d14662ac4e4a59d86449b20cafe8835846836fed4eb3de7fc59bb1640fec891f55cfeaeb19aad393fe6a4c4acf97d621591b3d8496eaa3d7388b7cb4b5b17c017de572cda67a173fd13918a047b2437a15df890cbdf2a13bd3164e65d7d6f2e21fd3a537cf7c377ec27016acd24876d286b8910bcf7e17db52aaeb2a79725ab18a04d89d84f5ccba8ae21ccffe8be7cdf00637d040a88878d738242f6c4e475eecda958df9557ffd060d6a21daf2c455f0a4aedc3bd5507d1ab006de1859c14c76c527d1283f301e8c0e788107b4cc18d16baff9306d264426de9d7c495bd54e7817525c34b4dd293aee9dfb90b6dd995e7755faa6bebde3bbe785c8960475d2bb681c586927be8e035ca8138b4b2df2d2db71c683d65eca1a24e93572d36e20c267ff2a7a8b63294d06bfd0b90ecbecabfef2d1e9e3e2e17b02d9de06332e23604deabd30fc537a23366e065a6451ee94fca55a9c1d47e82872718cf2b4671f09c5ba5ecf57ff825e43e957dff51a8f151c5d92dc5e522bec13a5eed2be5b60e9b490e328defa5a8deecc13ce1aac5e09245ec4d27a8e874924d248452d7c442d9d1d77cec8336dafe5c51f26adef698e4e08e37419a3ccb217f63c5873e9da6a7cd6fbcf355ac4138ce5151398b15674e5cee8ae8c6856fcc1bfe03b0e05398f27a82312f7359a6748a54c6458cdb82d1fe55c67bd9cd7ff7cab419a95dcb11ce895404e180af7866619612fe84167ec9535063f7abec37bfa7478284c2c63142474953ed2d89edbb8ac0ef6d587aced0c3957b7410f6d698c3bfc285cecb20648035309d2dcc73b8f94f634a82dcce87e46139a34333b637e533d71c9857fa8f654f8aefa6de97b62997c141b9fb139de673c13614b750c1a866585e28f9ffff29e3e111eaa55f266ff038a4f99541ebe8f4f789b39fe513cf1edb9ee3d8cd54157697153b543db48384bff810fa30dea7cc98a62157f28b48e9ab9ee4cf5c296bb939da84bf3e02a49830958b3fd725785af354d4b249c3903b35d9fe5f4cd9ebb8ebd7277e48adf9137e034dac2fd060d351efe3c9d2d46d0d16608e3063e456312ba2d3e4e72d0159edd45d4387309d0263cbd9fa617879df02aba51a93c847dad597edda906f00577f224ddb159f888c7d621f3ac6bf66c63618927617655f8ea6df88a05bd96dc9bca3bb027240ed0144d6466bf45b93b220729351abe64f27f93b5ffbfeebfff8c3e111ecefc41e727cf4c46c47534091af649a481870b3c57cfe441579e3d572065aed279f63dbf29a4c77d4eaf4a0f519917013c22d4d932c457bd84b2051f07c29f07dbe05eaf07f7f0b7f5af4d8ec5abae81cc7134200f6eeab80a03f769ab39cd445fbd629738462239e738fd67a4cf84878a039739f0055a7b993b034458d1de7913399bab9dd390a7b2266da9573297fbc114cfdd55fceca5e8c0d6b68019bcd66bb711b65f74a54972089b6a95f9492463a7a5f76853dfefb7a2be78a4fb8e428e5cd898ccd0849ec257bf13cddd5734c00de7d69a7dcdcafc9cf499f050497d6d353aba4e29c5baceb438d841fa184581678d839eb63fb5d4d035698d1ed1f75e827b35a30d34b626d8630511e10cae03b297c48e36ca723bf69bd8bb2bbc537bd78e46dcf3b7df72064d590032088356e2233773d40dde63e2a5fcc886ac07779c626cedcab536c60385befad23e133a3e0f1e2ec948e7b6593fd7c79eb3735bf192bc445befcea5417eb611cbeab3ba42a95ce0227a22c8ba8bdec2c7681c155191a6d1846c531e3555c3f68239baf282e0fe5ccff6fbe86574d03aa4abb3f21858b20f51843b76005a43df7d049e139c5bf6f93070499f090f5f7313ca35f83a674af5b0e53b38a431035d90be2542dd3a4a738868566a11808d65f2ec337b8efa71c3b1938ebb4b6377870fd6244ad4cae9b3a72c545789af4ec1bdd649a3a1d624df93f13c3540d3b4d41075458e89e441835ea1017fa4d1b7d9d3351efe7dfa26b645b41f023728537dd57092f085b6407f08e8881d90e3daf28e37d49437781fb8c3c8698aa54bd50bdee23deadb437b2a52fd4fff6f0fa32ecfb2087523c7915eec5e2b5bb4799fb9def45b8a748efd8b58a60f80ad2c5538095f892ab32c905dedcdf0a9b1a0e973e2a1f44ba18e5e6d1d9de8ccbdb7c67c11ac33c5722e8359908b9da7bd8b9a4eae1fdcf3c467fe1c38c863c4dcfb400482b6340912ec80735cd1b61ad287781ddc23473c5557be23f1e42eb864391d054fbc4b5ed4dcdd25997dd4fea7cfcf194afabc78b09674c77ad17d74425e16a7be13aac0bb53336f01e3d5039b22c601d01cb4821e688ab3281591df8cb0bb425bb4f51ed093fe445bf8bb0b16e9c88fd44b748777e6eae07bf280e8c8d33b21056486b7a18f871a0ff864f883f3ff021a3e2b1e4a79a1b321bc53bccb92f8d9bab6374994aa54cffb9ce682b885b8d79ffaaf2c8d3d75150af6908c452e72eb5affef1e4b1279320ebc98a14912d1967bafaff89eca3bb9f7f1915dbbc72c13a9baf3b9b2888d275f2a957f72347c263cfc509f14c12a08f0c14b9da54a53425267445286ec3543e5f72c2769f9bf3dca0ac5551abfc619d0abf97c726f15d79fe2a8d2ac604ffa2a7dddf794e50ce9bbb2a7e4283bea8e2578a9faac27a5ce73286de16fdbfa19e933e1e12b9519b6d632dbeb9df0b243d4c98ed80a80621ef7e37e38127dfd3db0b25338d2fb710756b4d0e53d9250f4a385fe9edd94df44df7e127dfd3d5dc7dcbfd1d7ff88cafb6073d7248c5ad9003d933e7933d12bf16dbecde7e5149f130f25e99c6bfe485c34c02e69c1d8fcab44ad6f89cdc4f462add727f54fbfa7cf8b079891ba6ae810ad416ee4800bfa5fa6299ee8784595d1ff816bd6ff1dfac478282bef143a660db808a8f877c99a7d4b7acd5fb9eecab444fcd3f7f918f489f1f025bfa9a4ff592baa1a53ffebfef833f4d9f1709971f2dfa6324fd6a001d5f2e27f4d9768d031c5af9501ff3b649e5bd59eabf9c3c723ebbd01f06f132e33b63e763da8bf4b9f170fd53c25157760bfcbf5ffa1bcf846667d7efabc78a8e9dfa01a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd474493fc78325e11fb13c0b5914be7956603e1df8cdb7843d815fa8b5b57c7d2690f7df6e39b40271c74264624fbcb1692b39ff6f8e3374cf756b856923f9c7cfc3f0ee18ded903da5ae82fcf67d0739a24b4a1f8fe7cf85ddfad3c03fad8b4d47c9ab7a0df9d0fc7586ace35f4eff4ea2ff080a17da2ec49f81e5b948ca19d88cef548c037fdbe655f338b5bf8df69df2ffadb83bea1d00209eda1553b2b34e84fd4ce6e4debb069e93fc703601e7a8158d2d3fdf097efabdb004fd6ff4bcbd5b3ebdd718d03417bf00e6ff08dc35b9457a0f2e88fcf87f3c4ff060fa6c791990f7a16dee91619ae607801b4ca336f212cb79c0bff4efb7ed9dfbc9a59ba87d8790cce9f7c85eecbdfadcdf7b3ed379ee7433f08d3176378aef397e773cbc9eecc751ab7dfe3e1ccc734067c208d9dc0e0ce07be267e7047b73cf3f2ea3f4d3fc7036a1b649f671e32dc8058c9791e9af6333303371a11ff4efb7ed1dfd2b4a2e44fa4ecefafd2c2fcaae5d8067ebbd173ef0f3c51f3c544e3507fffcbb385e929695af883d9625aed55f2b74403323c489abfbec3c397ded647dd7fab577f212f84e14fc860d28cbf4145292768a95f00669c72eefd0ff843a9dfb4a1357e8907d3ca2f1c02e45a29e930f0e4bf9ccdffc1f33c23f1cfb361f397e7b32fda01c13f9057e7796ef9faa86e219d439b9db38cf9c1fdcef8d16df897f4b55fe0819632d27089526b80b1cf86c007dbc8d61a9225000fa063649a2f7fd7fe7f9bcc5cd1989d19d9452e79a8ee5f6b576a71b46be4da3fc62b5a01c6bc4a5fc17f2d81b47e08cf4ef51c92d1f7fcd3a0c070ff9207c378877076a9afca1fe0877ce110dfbceb9fa55fe0019e08fa824fae2d943d04144528b25f18c18fe4e0de92bec500235b4bd2149db2c7ff017f00be8956d908c5800872eea38a3b782820281bc3f109cfb3e99fc0ab25b35964911160cbcc90bf6e1feddafbec09e68eb4ec1fd80b1586e133d4df5040b36c8e02f3dbdb0feee719943be62af7df92cfbfd427351e25dbd1285b644b7927ef2229eeb355b6968fd9b315187b6ee68edd05bac3eadf69df2ffa1bc6443c642fd92b9f6a9df2ab85a1fbcdb9958ff6c893ec36dba09e9edbfff87961f6966da3054828fd9cbfd627255adbf36ce7f641af25e8fe87bd0b3c1705d915562035b03db7e764a579596975be3b1f3803b1b30620424b98877fa7577f8907667406df0a499fb582d780c72f7c48bb81e5a8f8c59a32c27616f08dac49811f92055af3131a6a196bb82ac3af9c672d49a880f7731046d89364a1bd06682f09c2591b9e80b1ca3a9eb496d013308bd110adb36b9831c25af213e7dec8e8853bb4262b49b22e9f66d7703fcda5c65a86b21bd5b342749f3d642b6f400520d4876b71d693936849bb4ee6dd677d3d1a34c21b69e434b2d1daca916ea74436dee08d3740437b42eed0caed03271cea3eb766f0bc55105a9e8c724b3c58d3345276388256834e02b3b5b0f2ec1ed9ce2d052d817625e15cb7d86833f0379fe6c81db82b6b69e11c7b03bc4601f05b1e526b995da300de16380d59e5449e5803de7199539fe6ba3daad2879601252bc0b2633892b49478ca19596a3b87dcf2a9270defc1688d867c8a56cb2ceb0521bccb9a523886b1b60068ceed172bd73ce8d243f3b3f9f16b79a1f5443db7ac30a0b97007b9a45d728d2d9ee60ebf0a0bb4cedddccbfd3ca0dd3cc4d26d268446e5b5702ccad25ce5719ed008ade3669eda38cfb042833c8fa67991b60169eb949313deb9dd7ceff6c5437ec88ff929bfb1f6fc361f60193460b4b1c7e9333cfd36bfcb87fc2abfa75d8d567b923fe48ff908186d97f7e8281fe7134ab54eb6ccf8299fba2e5e3b713ec8d6c89644a4f92c7f420f80b722ec082b2c00bd7b8282a77cce6df20c2859610f1df385f708fdcbe3061fe4cb28b21e2d9e4d92483eca225fe56bc081c6d10aee3cca9fc351fe92df20ecc4f2317f15739be760d1a06166e56f3613ad7c9beff22b92e25dde500246ce7696b9f01ef2a695923bab88af22db7bcd5b7a16e46deb39eff001dd83eec3dcd7fc5aec685bf52d47cb6dbca19bbcebf2bc8782bc6f4f053444721404b440054e1aec8a907c91bd70bb204e225a5e534c2d8778054c9fc2463dabf8aa715fda61ff311eb0d166352e41af4458ddc83d863915eeb1150db0433672e0234ac36b65c3a992df16ace085007e6af421b47607859479e190076b8870e1165e3a2e7cb42e02dbf11f924111128ff3222a94ffa0a037d2095915b15f14098f3927cf9957a4f9d2014ecd9acaf6ed0033294e45e634bc81b11f10b28b9cd930ae6b963b5745c1ef2c01b382228627cc7626c4f36fbc65cc31ce8ab8c73bd9337e8d79b177efe87d71f03bc423a9bcf38eb2e0cdac8786c5d191e8551c909d84c5a9b8c98a6210107e2a6e23197167c5b2ec595b55c0b917c59d9c1443b7c364dc47c037f8968fc946acdc915588a9d3885bfcc665b900f9fae6daf1d25ea951fa64bfd8a37c55dc3b312efd4efde241ce59cb0af13a174e503c060fbe28467c5a8c3d968eac316d03e784b98e51318906a11f5ad6cc191553fb54cc8a273c821e9c7b2ff4898c50542cd83379f2f362191fbc97e21638d1c8b3e36b7f642dbff7e0fe4d3cd0cabad7de14443cb90f7b9eb19d024bd9f10bc80ebf58a121b69c6638a20b6ba54e62e84c342724637b8231edf84d2b92ddc22bd678a26e72416d0b7ad729e20d6e14cfd9b67891a478c5432f0391d8b596ce6d84e18da6c5a678a3cfc5961de43c9d84d45e173bd429aebc97cc954a0ef004dab58591d9178da209fdd04a1ed473a69c75d1d69e543a97c495c0a87aa25f74e2be37cc87d6183750e08c8beb68e8aaa22befe25749a0677be8a6e81787bd0592b081e77b142dadc738f3b07f50b668206b8fe92330924efce217715f6b2aa011ccf6d4510edfdb5a86502f0999bd67f18bd3147dd0239f94cd8fd97e4ff63c407be17779cab77b3033d209bccb0137cc6cc5f6040d19da3baccd1dbcf141a4b110755117f0bb929360b87783317990daf3a6add72b47edbdbd0fb366ec6179171ce5601f90cc6bee436f6b39fc2407527959d4d84774e7a86441453820afc500db7268f8da176fdd6ff007aff43299380570abbdda73d02c6fad59123a4d67a03cee3b7346e23ef45a9f46d1b55acb8673e7dc9231cc51c4a7fb3898ee9338f709c5f835a7ee0a458074bc4ff7d93ec7725f0057e1ce35b6f7fbe09ebf5acbbd1f5ec93df0cefbbcc7fdfd617f947318cb0724a0b74ffb1b66d3be03331fe42135f64d3b5aba929f6004acfdc0011e059a8cb1deb2155c01f323e64e335a10cf755d9b77f8086136746df76e7f977440f253923acd6c9f25c53eeb59edfd501ef6f71ec153d973edcc970794811631152997fc61ff20dad969ff68fc30c0e8c46a3fc24e3488166828fafe663f0e4e8e8a16f983358864e8ef27c5740f521e7be989beee676e82d754b02797830cda1abdc8b3667196307f4441fbf49aee8a3fc6639fe2753808057d0b5ef64f0af005f609581714bb997cdacfd1de5e898decec17240461b024f17e89d6f81145fb5596d07edadaaf259313f82ef6cf6cba7fd9bf4696955e7288bf8f872fd2a6b48b96f99e3e6ad998ddef37fbb7c0ca4ed966bf45fbfd6e7f15dde38dcac564dfd837d15e6b897015c8c97d0be65b7bdfd1fae0fe3a8ff65d8b926bbfa5aef211bbc6a0fd91eb7d6fdfc7f260c563ad171dd001f32958e7e2400ef4601f9824e4f6c0dda64de327b1a4fd833848498cef01858783839c838b5fc9e3c1639ebdd55a951580603df176fe985dcb4dbe38f8568163d73904ca67a071d17b2cc51c4dc5186137709b8750a5870866e1dc79134f077588914d17bc60de2139a47c0212104647b043964cf7c121d7f202faa12f5238bb9027b9a18bf42dc80ffbb81fe4fbc00a431add7a0b7775381c8e0c58ab389a7b9d588182f8f570634db515417b8701468e1f760eb79ef4e67c196ed5366ec620bbb873b8b3378ab10358f35d3d232dd0d1480a4f191eee89ed1cf9e0f020161c64a12a5c0b3464c04b84e20cd4f7e5c151db202788f3f0eef0a8a27d8150c91ffecacefa057ff02b4454366fd63f8caa58c10ee6f90c2bb01140f7052d6c62cde0edc40146d4190316807759a027ef797895eded97c344eb13e101346da43577da051b0b3477b8bf0d76499fb4f99d1707cf30b725689e3a8e862dcaa7640942330264312b756e2d277fc06be0d5c0554a6f8ff694665de756c4968730cce39e89406adb867027eb655de020bb6c45a9b15c026d9b809e8d299ced807ece1db074023cd1dc1f2421b26fc92dc59c837de173075ab93e4c8ddc85e761b01082103891c886a03de8370ad030a06041adccdb77c12e59596d4055a8bde4cef8300359bac13a9a0682c05ac29b2cc9daf2911ddce84890897048102181b670ac2dc88e3dbc7b4cb44dc32d7a786204eeb6b4e62001b760898ce13ed4b90574c8430ef239776e0f73cdabc006c1c64a25560b9e440e0b786366ac0f90ee60f7ece12ee25b69f11bf2421a3b879a9851e943c55594003e0dbff3bfc4fca8f94ddb375b63297907e060e1166f813fef403b2eed2769a8e41ea645305eb3601180b616afd88b194d1d95d8ea780e9c9354d162f33fcca69541670cc702dd3b70b60d1ab4fea6650731914ca7f25b6ae44933933ded3b3256a07fe17fd7def67b7315aa3cc1c2f4a8968edcb495014e7ccb2e3d1da8ad7d89587f6a74612333b8b9da336f6fda6e4f0e6b6facf5a7c3b391b77ee53ff2ab6becaacf988e0c0377bc33d732edcb29910c9f9ef1a5488b8335ef579123c7b4acec7556459585b9d2f4a9f670680c55d19c327aee194fbee9bf4af25fd816bf232ffe1e95c88191a4a68ddace87b9a6637665a456cf07da33d8219577f1def43a967e4c2936f385550894065d76153111e68db87d6b7c38c67a319fd88c85d6771d7dc661591d9355ee81f1539b6b89f18ad825daa09f6589890a37be19ab077336337d4e4d6f1233f6655c9f94311a33ca041b1d425b81704d51a1e38c3e52e6282c3398fb129e5522507bfc3df32e1a43d88c9f3e22cf11816a4e99734c9e03d79a107eacda4f4d5601aa720da4e92b597dffa1ffeaf7e80fe281ebf7d7fdc84baeed1b4983a8841ea3a6af1e6044f538f98717e0d3caa018c12ced028fa57a66c0ecd358e755f48878633a87df0c2fd2c74086f6ccb3b6067f1446d8f87f50bb8a0f42af1c5ee99ca586c380d4d012a91c4bed3bd36d82df1e8c4c91a66f752b35263077cca8eabfb9f94dbf4b01baa189f29a6b0beb1efe692ec3c46b356ba91e37969a77d0c802790452ecdedae9a8780e7c832c0eafda776646d0379c441a0fb646a36e09018b4c98fbd806a5257f323c4d7bd7400ae112b7cb4cf31e5ce2907ec1aba3a5c99fca3ff993fcc1e041639fb19de160800cd974966108d614d29204b4b0d2db3b931d36b642c3dd44c913e06a613216bc2af217134f7b3cf909fa18f4f0c3f8b0d11135bcb6607e538a22aafbb59dadc8b54191f642c1588206b3248dc39b3503393f663bc38b841965ac51577225f85b73001d2d2867b7a8629755b682f6bad0ee617bd81a4fa29991600e4ef9c9935480fe204a8fb3f65c5b5ef670d8c199fb32ae0e5af1d5a101327c76681e5a56db604993679e12821e20b56fb344149cdd26b69103411977d39eb632a255493a5ccaa24aa7f34a09aaf98df9ed019ec0ff543ce30fe201e61c4babf67a2653cdc79343c706c30f0d35b2ad0d8ce1b5f658932579c80ad0db98b5317d5a6655181bec706db9d0836d845c47a66e76e8f26730d1632ef0dcba426bb18c9f002723d0b47bc83ef8d9266a6a5b4a4b603a071dab7fb454c4d57e8f6c782a459afbfb557c9699b944e0a9894185aff9963736d840206f086206c9941b797744a0486e8c2605765dd2966047aaa723c84118315c4921907ca0a776d116b4368d2517ad8fe4087a9c731b3df30001de8e95442b3373ace2688b251f695e42d6313db22307ed15f81f191becdd00def4273ebc542895959ea2bfb74d2f23830a83034004fd53f1ef3f88073d03b56f7fa7e30454bfc1ec28c02abfb3f2ca9f323d4adaa17de07993b4c5903f262be813841f31c26b6d4d800c396758b49241d8755b313f3ab96bb59d396fc4dba39bede50009fc1af7997d043b41c752b293e1ff5a431f1e7d4ffb9356c780f53412906dbfe0b5f6ab8234029bc7b9456b2acaf8a4b62dc403707a9dc9d4437be03cfe21c7afceadfd02a8d51ed6157b3656118c0d9fbaabcc51ee315491980247d22ec37b720bdc688cd761ef18695b4a7bd28f4aee8f7176cd1dfb0a9fe09d64768b5fa14fb4971db46facd2b5f69a1a1ee358e93139a6463e15f8956beb125b376e5f92801ae926c10ed7f610371209e73824560eed4b00371ebc1d0890e31fcb3ff98378d05c99528f77f67d4ce30659d92f62128c9c42f48eb985b5e75eb4997b2cdc3e89dcfd714f4779e778802b7774753c8a793c3b9e405ade5b31edaa386ac084888e37640a12c011fd28e60a07c7c1f1364bf0e678e76fb0954d93d051d0b3a999391ca1e390219015396bc3c8df5bcbe3fd81f2ab02aec81e0892717895df1e1f608c045d7afb201737c747720d739926cbe3285bd9cbe3f8901c27c72958d26b02e78365af257d0ca3d23dcec46d7c881a6ce5f631584fc7a7707b9cc3f7d7e3e2b8f41ee4e2e802ae36c5f8b8d2d13bbedc5f8b072b3cc29ddc66de433a6bc4c1ca99177b676e624c124fc53279a3022b7b1bf6c4f2f84c3dc73fbec8478e8eaf68055c667adc1cdff20e1e693fd071eb93e38e5e63e5beaa2b3177c2e395d66a3e1a1e340fc3ca47c593b8c3a16b8b3e8ac2b762116f8e8d320b53758ecd63cbdec268e4c7f6b193379da638c22c8d8fd7c7aee4f9d3b107d21a742414b02766f347e7d65d70ffd83f8cb293b26360042774c2c120bb8efbc51efeb58a3b47614beb0e20097631929313f127271ac97467e579a0bd8c87be58d983ace34cfc1cdf07d8690037c0e8c91d9e6cda3cb170e0dcc2346edb234ab3871377ded4305e010e96daa70afca13096c0326f9f44318f7b329604aff77cbfa4fdf04a9fe1dceec393e43727279258c0dddcbddafbd6321e93186f08e12abc226151e5b2a055dcf7378087b691581193ce0878d7246fc4e3a338799a2fb94336b5c6fe9c4fad5ccefd26dd7a4aa5d0c12a1f84c9c9cfafa03d1db93d05d6184bb23a851f0d0f1aebb41b67de0b6b9ca2e290bc114f798e3a29cd9f752695739bb7e3319e584412391099741ce54c2c90a4c138defa8568273390c48ef622850db13ac5787d4afcdc19e1b5f63b9fd25376ca61362df0c606bc3803b466ade2e08ed0aab469dd57261972b2536123feea6de38cf74f7b6547030212497bbd5968af99b45a2872e5e9e02d05270fde10c6c43e1db30e56a7532c8bad607ccb4f3a8607b3526760ea98c5ba884f37457e1a58ad32da80bab91d5e853d9d2514613ec70d7e3cddeeb7013dddb9c01dd15a7bdff929bf719472ada5e64a46df28a205b32ded272b74d4c1515a02ee0368c3f0748f56a6350fa7dbd3e36924c9e12d6d856fe886d924a51ec6a771dae28bf01e458ef2f0b10d674db2d59fc818fec378008d06242307ce00fc21926c98758f1ef7e3beb6b08c06b42471c1347fc05339c9994dbd1767029c72e213bc40afa98b8fda9ad79a38bb394d0327e9d801206a86d75a2eb81d7eaddaa7a72c4101c5a739ea9e16fb25de515c8e18f095b5f7c02549c5e0b4745721c9c3e310137960c069d0305a729fd02ce7bece7e90fdd32a59d941083a8c73ab7b1bd968e8dec2f3d678e1c26d603c7bb4037c427bd0909eb5f1d8db9af8bf44c3a09ba4a7e7d3cb5eeb3d1bfeaaf6c9e8343ebd52accfdc738cddbef9dc5883d3863de331f2cb0c3e8ce23edf9ede4edb48a31f034fdba1a1987a33f69c46a18dd6beb051da3925de497b81c50a90d0e77ece80ed4994a50309f886e74ce4365911a5fa6586d507c383f6a85234d4790378c79ed010ade426c89db86c2d1cbfb607f15a7440038af2857b4bfb6279baca1fc8f5a9c1bb8724589f9e33eda783b94eaed936143e210f45acde108eee4fcda889d659523c9d5ab48b5562a3ad784293531b46c82fed6fb41253bbc0f3644a9f3181f1c5f6ea6889dda943fa681f3fa57bfea8f8a9099a63e0bec6330fb143ded3b92c41eede86d462fe024b9fc52db1b35a74c197dac36ade0ef447be84bf5fab1cfe30e5fbb6cf0a3843ebabf6cebd8753765e0af87e0db7e136bb265eb83dc02c40c3e42063b18cd66051698f58981d23e9bdc881ba95c4930e8d5fb50f3f8d258aa6c533c2fe42bf7bfa40c1da054ed68457a1f9227e650420957271ba263e5a61e1ed4f5d60394f20653f1c1e8c2fc18591bcb51e81667aed94350349bd32b62835de9b19cc3a6df3a3c306f47a8137a79ee1f421dee87965b58de7adcc400fb5566d3dc2d8cd40fba3fc049f1c64cf23d5be1bc71b59cb6cc5f50a1093bb567912db6808d288e08d898f389462ac73b1cab849d6b16fad19de94b103fc8a3787a9f6f2a355a6a3882643914f81d3636d6b680cb0d29b68ec3d4682b05a7da26dc730eb588f30c2cb65c64187c8fa688d37f0b7a7a32926a25030c28ce702f421827464061b8f172bdb4831bc1387a3e60d2d026ddd642b1ac12f2b34d49e173434ed3477057d56fbaddada7ad31885b616547803381afcb96cca3fc81f4a4bd92be7b7f1c2959663b95ec1e462ea2844151df0cac84275b4f4331baf6135b6654ebf5fad563adf497ba9cb9537a57fa77c2635ab2248e5ada1a5bf7af9757500ab7cf8674ff739b2432b8b1e559ea872ecf54896791fb88ada88ea6d64e9ebac5a54c62d4ab4d0ea89cc2a57e1913283d7f403374785b9de645eea27e87b68efbdfe048cfa95f7995577d856eb08fccaf7ae331359e5b9965fa234c878e01c4bfc27f9bdff753c94bef732b685ab3954be43e9a32fbdc3b4f413979a76d567bee96fdf7805a9b947b9f28a5cdc551f753506aab1f0ab0886f1899b3b94b9eba5af9c182e63627aa697bdca7f2ecd9dceb9d8f8bcfaace2304e19ef3091d3739481991693cafb745e05563ec9e8b02cadc6de8cb1f14096d83923925bb1b1c5cb989e6feec3ab1e2bf3094accf36ade08e3874725faaaf7708c3f8d635445a99c924b01a729574dc93fb5dee14fea0f55dc656b56f1698c238b6b6fa489c4d0121db89cb3b88c08590ee01e9bbe76ccc8e0b2afca1eafe25060fb9b3ee6663ee30a3565343ed0337459ae55311ae5976859197160e63ac73cf31ca3e555cc099ffa5fda6cd65354ebe10283b67295458996725d0d3133b17c1aae305afeeac3bb7a2592cd51ffcb3cd6d75333a6e5318c58b5e2c6af3040abd819af625bb6e985b641825856ab60acf36a385efd45aa99212b64fd21ef03e0e1fffbbfffe7ff07835e35f2</data> + </image> +</images> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallobjectinfo.ui b/kmyfirewall/kmfwidgets/kmyfirewallobjectinfo.ui new file mode 100644 index 0000000..a39c64a --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallobjectinfo.ui @@ -0,0 +1,166 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>KMyFirewallObjectInfo</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallObjectInfo</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>496</width> + <height>383</height> + </rect> + </property> + <property name="caption"> + <string>Documentation</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>m_header</cstring> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>40</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>40</height> + </size> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="frameShape"> + <enum>Box</enum> + </property> + <property name="lineWidth"> + <number>2</number> + </property> + <property name="text"> + <string>Rule Documentation</string> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + </widget> + <widget class="QTextEdit"> + <property name="name"> + <cstring>te_desc</cstring> + </property> + <property name="wordWrap"> + <enum>NoWrap</enum> + </property> + <property name="wrapColumnOrWidth"> + <number>50</number> + </property> + <property name="readOnly"> + <bool>false</bool> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_cancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>21</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_help</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>21</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_apply</cstring> + </property> + <property name="text"> + <string>&Apply</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>b_apply</sender> + <signal>clicked()</signal> + <receiver>KMyFirewallObjectInfo</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>b_help</sender> + <signal>clicked()</signal> + <receiver>KMyFirewallObjectInfo</receiver> + <slot>slotHelp()</slot> + </connection> + <connection> + <sender>b_cancel</sender> + <signal>clicked()</signal> + <receiver>KMyFirewallObjectInfo</receiver> + <slot>reject()</slot> + </connection> +</connections> +<slots> + <slot>reject()</slot> + <slot>accept()</slot> + <slot>slotHelp()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallportwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallportwidget.ui new file mode 100644 index 0000000..cb76884 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallportwidget.ui @@ -0,0 +1,177 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>KMyFirewallPortWidget</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallPortWidget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>444</width> + <height>72</height> + </rect> + </property> + <property name="caption"> + <string>PortWidget</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Port:</string> + </property> + </widget> + <widget class="QSpinBox" row="0" column="1"> + <property name="name"> + <cstring>sb_port1</cstring> + </property> + <property name="maxValue"> + <number>65535</number> + </property> + <property name="minValue"> + <number>1</number> + </property> + </widget> + <widget class="QLabel" row="1" column="0"> + <property name="name"> + <cstring>l_to</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>to:</string> + </property> + </widget> + <widget class="QCheckBox" row="0" column="2"> + <property name="name"> + <cstring>c_port_name</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Service name:</string> + </property> + </widget> + <widget class="QComboBox" row="0" column="3" rowspan="1" colspan="2"> + <property name="name"> + <cstring>cb_port_name</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QSpinBox" row="1" column="1"> + <property name="name"> + <cstring>sb_port2</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxValue"> + <number>65535</number> + </property> + <property name="minValue"> + <number>1</number> + </property> + </widget> + <widget class="QCheckBox" row="1" column="2" rowspan="1" colspan="2"> + <property name="name"> + <cstring>c_portrange</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Use port range</string> + </property> + </widget> + <widget class="QCheckBox" row="1" column="4"> + <property name="name"> + <cstring>c_inv</cstring> + </property> + <property name="text"> + <string>Invert</string> + </property> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>c_portrange</sender> + <signal>toggled(bool)</signal> + <receiver>c_port_name</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>c_port_name</sender> + <signal>toggled(bool)</signal> + <receiver>c_portrange</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>c_portrange</sender> + <signal>toggled(bool)</signal> + <receiver>l_to</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>c_portrange</sender> + <signal>toggled(bool)</signal> + <receiver>sb_port2</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>c_port_name</sender> + <signal>toggled(bool)</signal> + <receiver>sb_port1</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>c_port_name</sender> + <signal>toggled(bool)</signal> + <receiver>cb_port_name</receiver> + <slot>setEnabled(bool)</slot> + </connection> +</connections> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallprotocollistview.ui b/kmyfirewall/kmfwidgets/kmyfirewallprotocollistview.ui new file mode 100644 index 0000000..c83583d --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallprotocollistview.ui @@ -0,0 +1,70 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallProtocolListView</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallProtocolListView</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>480</height> + </rect> + </property> + <property name="caption"> + <string>Form3</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="KListView" row="0" column="0"> + <column> + <property name="text"> + <string>Accept Protocol</string> + </property> + <property name="clickable"> + <bool>false</bool> + </property> + <property name="resizable"> + <bool>false</bool> + </property> + </column> + <property name="name"> + <cstring>m_lv_protocols</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>3</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>150</width> + <height>0</height> + </size> + </property> + <property name="rootIsDecorated"> + <bool>true</bool> + </property> + <property name="fullWidth"> + <bool>true</bool> + </property> + </widget> + </grid> +</widget> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>klistview.h</includehint> +</includehints> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallprotocolpropertieswidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallprotocolpropertieswidget.ui new file mode 100644 index 0000000..55dc297 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallprotocolpropertieswidget.ui @@ -0,0 +1,173 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallProtocolPropertiesWidget</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallProtocolPropertiesWidget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>557</width> + <height>95</height> + </rect> + </property> + <property name="caption"> + <string>Form2</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <widget class="QGroupBox" row="0" column="1"> + <property name="name"> + <cstring>m_gb_protocol_option</cstring> + </property> + <property name="title"> + <string>Protocol Options</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" row="2" column="0"> + <property name="name"> + <cstring>m_cb_log</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Log packets maching this protocol</string> + </property> + </widget> + <widget class="QLayoutWidget" row="1" column="0"> + <property name="name"> + <cstring>layout9</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>m_cb_limit</cstring> + </property> + <property name="text"> + <string>Limit matches</string> + </property> + </widget> + <widget class="QSpinBox"> + <property name="name"> + <cstring>m_sb_limit_rate</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minValue"> + <number>1</number> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>m_lbl_slash</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>/</string> + </property> + </widget> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>second</string> + </property> + </item> + <item> + <property name="text"> + <string>minute</string> + </property> + </item> + <item> + <property name="text"> + <string>hour</string> + </property> + </item> + <property name="name"> + <cstring>m_cb_limit_interval</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="editable"> + <bool>false</bool> + </property> + <property name="insertionPolicy"> + <enum>NoInsertion</enum> + </property> + <property name="duplicatesEnabled"> + <bool>false</bool> + </property> + </widget> + </hbox> + </widget> + </grid> + </widget> + <widget class="QGroupBox" row="0" column="0"> + <property name="name"> + <cstring>m_gb_protocol_description</cstring> + </property> + <property name="title"> + <string>Protocol Documentation</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>m_l_protocol_desc</cstring> + </property> + <property name="alignment"> + <set>WordBreak|AlignTop</set> + </property> + </widget> + </grid> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>m_cb_limit</sender> + <signal>toggled(bool)</signal> + <receiver>m_sb_limit_rate</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>m_cb_limit</sender> + <signal>toggled(bool)</signal> + <receiver>m_lbl_slash</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>m_cb_limit</sender> + <signal>toggled(bool)</signal> + <receiver>m_cb_limit_interval</receiver> + <slot>setEnabled(bool)</slot> + </connection> +</connections> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallselectactivetarget.ui b/kmyfirewall/kmfwidgets/kmyfirewallselectactivetarget.ui new file mode 100644 index 0000000..622bf93 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallselectactivetarget.ui @@ -0,0 +1,181 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallSelectActiveTarget</class> +<widget class="QDialog"> + <property name="name"> + <cstring>KMyFirewallSelectActiveTarget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>560</width> + <height>282</height> + </rect> + </property> + <property name="caption"> + <string>Select Target</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer row="4" column="1" rowspan="1" colspan="3"> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Preferred</enum> + </property> + <property name="sizeHint"> + <size> + <width>339</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QLabel" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>Current Selected Target:</string> + </property> + </widget> + <widget class="QLabel" row="1" column="0" rowspan="1" colspan="5"> + <property name="name"> + <cstring>m_lbl_message</cstring> + </property> + <property name="text"> + <string>NO Message loaded!</string> + </property> + <property name="textFormat"> + <enum>RichText</enum> + </property> + </widget> + <widget class="KPushButton" row="4" column="4"> + <property name="name"> + <cstring>m_cmd_ok</cstring> + </property> + <property name="text"> + <string>&Ok</string> + </property> + <property name="accel"> + <string>Alt+O</string> + </property> + </widget> + <widget class="KPushButton" row="4" column="0"> + <property name="name"> + <cstring>m_cmd_cancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="accel"> + <string>Alt+C</string> + </property> + </widget> + <spacer row="2" column="3" rowspan="1" colspan="2"> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Preferred</enum> + </property> + <property name="sizeHint"> + <size> + <width>178</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QLabel" row="2" column="2"> + <property name="name"> + <cstring>m_lbl_currentTarget</cstring> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>NO Target Selected</string> + </property> + </widget> + <widget class="KListView" row="3" column="0" rowspan="1" colspan="5"> + <column> + <property name="text"> + <string>Network/Target</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Address/Mask</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>System</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Backend</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Description</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>m_lv_zones</cstring> + </property> + <property name="fullWidth"> + <bool>true</bool> + </property> + </widget> + </grid> +</widget> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>kpushbutton.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>klistview.h</includehint> +</includehints> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallselectinterface.ui b/kmyfirewall/kmfwidgets/kmyfirewallselectinterface.ui new file mode 100644 index 0000000..ac46984 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallselectinterface.ui @@ -0,0 +1,392 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>KMyFirewallSelectInterface</class> +<widget class="QDialog"> + <property name="name"> + <cstring>KMyFirewallSelectInterface</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>545</width> + <height>443</height> + </rect> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="caption"> + <string>Select Interface</string> + </property> + <property name="icon"> + <pixmap>image0</pixmap> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QFrame" row="0" column="0"> + <property name="name"> + <cstring>frame5</cstring> + </property> + <property name="font"> + <font> + </font> + </property> + <property name="frameShape"> + <enum>Box</enum> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <property name="lineWidth"> + <number>2</number> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="1" column="1"> + <property name="name"> + <cstring>m_pic_screenshot</cstring> + </property> + <property name="minimumSize"> + <size> + <width>400</width> + <height>300</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>400</width> + <height>300</height> + </size> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <widget class="QLayoutWidget" row="1" column="0"> + <property name="name"> + <cstring>layout6</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KComboBox"> + <property name="name"> + <cstring>m_cob_interface</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>m_lbl_descripton</cstring> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>Description</string> + </property> + <property name="alignment"> + <set>AlignTop</set> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>m_cmd_help</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>&Help</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>101</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout9</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>m_lbl_header</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <pointsize>11</pointsize> + </font> + </property> + <property name="text"> + <string><b>Welcome to KMyFirewall</b> + +<p>KMyFirewall provides two different inerfaces for setting up your firewall. Please select the Interface you like to use.</p></string> + </property> + <property name="alignment"> + <set>WordBreak|AlignTop</set> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout8</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_close</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>25</width> + <height>25</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>x</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </vbox> + </widget> + </hbox> + </widget> + <spacer row="2" column="1"> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>m_opt_showOnStartup</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>Never show this dialog again</string> + </property> + <property name="accel"> + <string></string> + </property> + </widget> + <widget class="KPushButton"> + <property name="name"> + <cstring>m_cmd_ok</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>&Start KMyFirewall</string> + </property> + </widget> + </hbox> + </widget> + </grid> + </widget> + </grid> +</widget> +<images> + <image name="image0"> + <data format="PNG" length="685">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000027449444154388d6d93bf4b5b5114c73fef47f2a2491c02050d0551323445ec5014151497d2c176f0f7e41fd0a1438538bb75b385824eede4a654688b8a8b62a0b4521d148594686930d568f0477c7d2f2fcdbbb7439e62ad072e9c7beef77c0fe77bee51b8c504c40ea1cb80a8099603db0256ef817d13ab5cbf5cf8fd71b7b7f795d6d6f628108fab6a2482741c9cfd7dce37368ef717175fe6b6b6de3c85f27f045978ec1f1b9bad191808a9800a28aa8a140209b8807372c2b7d1d14fdb3b3b83cfa18887a300f11ccceacdcda17226839bc92032190887110707b85e0cd3241a8b3d09c3e465610d6004a64db8af99269aeb22b359945008bdbd1d717646697d1d676f0f3b9de664610169590fa2b0f2197e6a0262dfe115a088dd5d443a8d383cc4e8e8c0dfda8a1a8950cee7399d9ae26c799962a18004c584aa2578af66a1cbf15a118093cba1363541305811291ca6babf1f6118b8c522977dd74027e0532d88ea97627824d53d3d0407072b01d745f1f9a84f26919eea1ae0875ac0a72a60f9019ff750ddd242cdf0f0d568f3e3e3159e7c1ecdc3f92b056d40d155d8aef2923540334d144da3984c224e4fb16666b8686c24383444b8b5156b6d0d1db0210508bd08ab061c1b704701820d0d0014120910022595c29a9c243c3282717e0e547ed126cc032500bec08b5f208f40e60301595a5a92662221f3208f41dad3d3d29e9890471ee603641ba0feaacf39d0bfc2c70b90bf415a9a269dee6e6981b40c43da7575151fe426147ba10fd0ff598ad71098877747e0ba20c5b5e3822c815c866c5f25d9b8759900c6a0eb213cbb0b9d5550fb07ec1ca456607e0edefe802cb72dd30d53bc89f93c5f7882956f02ff02854c0fcf287a72340000000049454e44ae426082</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="55092">789cccbd47b7eb38b2ef397f9fa2d6e5ecae5e7cf266d0035266cb6da7ed77af1ed07b2f1aa9bf7c83883f704c56d5cd7c75bb5f95d6c9ca5f8a22114044202200f0fccffffcdbe7d3fddffef37ffe8fea625c02eb6f966f947ffb4fbb4e92ebfff57fff9fffcffff88fe160f0b7fecf68389bfe6df41fffc7fff80febf96fd6df9401ff5fcff64232ffde36244f7a762ac953fefd56f29cf35cf2a267f3072ff9f733c906e7836493f35eb2c59fd74ab6797b1f243bfcfb46b2cb7fef0a1e72799c5af2907f7f94cce5732cc963fefd483297cf3a8387d43f992999ffde0c25f3dfb79a64de5f662099dfcfe924cf386f24f3fe4a44ff0fd17e5b327f9e772799dfcfb8078fa87d662499cbebbb9249de6fc9bcbd9d2f99dab795ccc7b31a48e6e3b71a4ae6e315ed25f3f1b04f82a93f0dc1636a9ff32999daf32599f757a54ae6fde17e48e6fae23892b97e78a2bd63ea1f438cef849e97e892f9f7652b99b76f3d91cce53763f0947e6f08fd9c1137b664de5e43c83fc7f53bf0022cf475499c8be719c4f113d824de5cc01671fd0eb6895dbaff50d8ab174ae6f2ad3ac9a47f63c924df4832d73f732a99f777f324998fb73993ccfb5f7f96ccc7df3a49e6e3514592b9bd3aa664ae1fd6bd646eaf9a2b98f4ddf52573fdb58e60d89f6d49e6df9b13c97c3c1d45326fbf634826ffb2934cfee40086fdf88164de7ff65232d9eb9b646e1fa607867e9bbe641a8f816092cf14f2423f4d070c7d8b9f25f3e7bbaf60e89fb791ccfb3b15df43ffe22f30f42f13f240ffea1b18fab716bf877ee967b043dc92bf1f0ea16fdd9af3a8f740bc3dbe64f2f70bc9bcbfcd2fc9bcbfbd4432f90b4730f5cff55e3297bfc9c0187f732899f4772099c6e35b321f7f6b0fc6f8daa6649aff7692f9f3724d32d7f7cb4932ef6ffb4e32e9b302c6f86723c9dcdefc50326f9ff32e99f7975382a10fd75c32d7e795906742fdd3bd49e6df67a2bdd09ff20886beb89164fefcd54932ef9ffa2c98fca72bda0b7d6a9f25f3feb0c4f842bf9a07b0d02fd13fd0afe2090cffd6c660e85b24ae87be05a40f63e1df8277c9bc7debab643e5e575732efef6e2799cb1bfcf89ecbdbed2573fd5cfd781e1fcf952d98fa3b91cf277f74cd24f3fe0f3ec08807ba8d64ae9fc54232e98f27993faff9f13df787ae680ff4d57995cce57103c95c7fac3bc97c7c7c5f308d67b8028bf9f72299cbd3dc49e6f2981f92797fd69664de5f7e2499dbb33b92ccdb6f2dc1d067772099fca72e99b7ff6a49a6f946f437f4b9bd48267934b0d0ef77c9bc7dad68df9cee9fee25f3fe69447fcc31df88f1843eaf6e92f9f3da89649a0fee25f3f1cb85be41ff0331bed07f5f8ca7f0a7d43f13a1df9d2a99f777f32899dfffea80111faeae92b93cee41f090f7effa0c463ce77f48a6f9ee51321fafeb4930f547bb01433fecb164fe7cff5b321f2f2f92ccfb3f93d793bd745b30f421ae2593bfd94be6fd1b2692b93cde4e32b79fda164ced8ddec1d017e74332f9dbb564de5e772899e299140c7dcaa692b93db8df92797fe61d18fe3117e303fd59b792e979b164de3f8918ff05f5cf46f40ff4c715e301fdb9bd80e13f57f792797fad4a30fce906bf17f3f51ae331c4fc19a13d43f89780e693a9f0a7ed028cebfd4e321fafe6198c7cc00b2473f9bc77c95cdf4a4ff0908fc75a5c8f78bfb52553fcf02999ebbfdf08a6f10e5ec1c2bfdc49a6f97c2b99e6ff27c9642f3fbee7fab416f2407fc299643efe912f99ec692099cbd3b492b9bc9ab8ff94c63711fd0bfdb2a792c93e2ac9140f689229df5125f3feed5660e85ffd2a99fce34432efdfee00867e5e14c9941f8ec0d0bfcc904cf9572a99b7a76e25f3fe73c760a1afaa646ebf99e85fe86f2ec61bfaea0b79e11f0ba12f2eda8bfb4b7d267b98897c64dd81a1cfeb503297afbd934cf1d45e30fc93f81ef363b896ccefbf3a4a26793dc1149fae7d30f247ff2a99ea1d3fbee7fed68b05a31eb1924cf9c2083ca5f6076bc9542fd948e6fa900e2473fdbbbc09463d630246be1a6692f9f84481643edef95532b73f5df01cfd7993ccdb7be92453beb5924cf3c14432efbf5cfc7e01fffa2999e6bfb1646e5f9b022ce2cba364de3e37114cfec132c0d047f74d32f9e37b30f26b2f05431f5763c9bc7f42c1d04797e6cf99d0c71be41fc21fa52a18fe24207d9f0bfd5a1d04d3f8570fe009d573dca3642e7fbb054f697ca237c1246f3a944cf53a5b32c5a72f60f81bd796ccaf4f2bc994af2d2593be6f2453bea682e7345eed4e32d5ff14c9bcbf2f57c95cff7dd15ef8a35097ccdb93cd25537e2bfa6b3124fffd055ec2bfcc24537c548045fe518331decda7647ebd2eda6ba37fc478c01f6d44ffb8d43e1ded17e3af3960cc97f5022cf481e257a6dd149fd96bf08cc6ffe64aa6f92604c35eec4032b7efab2799e2375b30e94b2aae5f50ff58aa642e6fe148a67ce1065e927fb80d2553bd2494cc9fdf3e49a6fc45c863c07e1dc97cfcd3a3606a5f7d05633e887682497faf4bb08df8e2030cfb2bc9de17a2ff4bf49f886762f4cf10f666bd80618f3e8dff92f5177f5e914be6ed2f36e005c91b5f24533cf22598ecafeec04be467ae64f28757b041bfaf5f040f29fe68c0268d9726da63917e14a2bdd0c7f424998f5f44fdb314fd91bf83a18f8105467fdc4660e86783e789fee94a30e215e3118c78a3a0f9dc60fd45fa34072f491fc329d8a0f685a964aae7dfc0265d5f2f05537f568f60d86bb091ccfbe36248e6fad988dfbba85f8e24533e48f66f88fe892b30fa67634ba6f97508467f6d1cb0a827435ed11f35fa6388f9c9a7f8c814f157fd065e92fe5f6e6083e42f5cb0897ac417d8227dca3fc036f55fb305431fba77c1747f3b02bba4df3ad9ab29e42f669229df46fb647fe460d8d3aa0243fecd2758d4bbefc0a21eb403a33f2a8a772c263f6fff35055ba827d1f85aa2bf2f1a58f4f70a8cfb252a18febdf1c0f02701f58f2dda7f5d48a6fe9b8071fff21d2cfc83603caf51c1b87fb106433f4b1a1f87fd17eebf1b17ec903efbd43e46b0f71a0c79cb2d58c4e72d18cf2f1bb078be0dc6f3339abf5cd11f8906c6f5de1a8cf846e3f6c1cbe724df068cf6548964ae3f1b130c7f9096608c7f7603a3bde90e8ce7bb2f60b4d77e00c39f075c9f98f639e47fa34832d7e7f84c2c9eb7ba80216ffb08c6f3cc042cd64f1a30e42f9760d88fe382d19e1ced19c11e42aebf0cf17cd306435ecb04a33d610e16f20b16f1470a16ed3981457cf9443c82bdae2660e19f79bc341c8be7d70e18cfd71ec022df8ac178feaa05e379d72bf108e3df70ff369cc8fe1d8345bc9c81d1fe60452cfaeb7a03c3be74ba7e2adbd382f1fbcb3b18e3910dc1689f4df24e657fd4603cafb2c168bffb0cc6f32b1ebf0c67e2fe01e9d34cdcef1283e12faa6f30ee67f860e1ffe660a1efdc7f0ee7e2fed58c58b6e70cc6ef8d002cd6173db0a83f2dc0d0b78edbf77021e5bd078bf6aec1f87d41fabd14f2155bb0f8fd108cdfeb2330da93de83f1fc8ac6d310f2ac1a309ed772ff3734c5fdb48d64ee0fb72e58d4e75ec0f87d7202a33f0d713df4a5237bb7e4782a60b11ee681d15eed112cee1782a1cf158f4f86b6b8bf6581c5fa2af5a733823f762d30eed7d2efdd11f2efcd1d18d76bdc5e468311f2a3c007e379f5082cea75f760e8fbfa8d782cf49dfba3d150fcbebc030b7bdc83a17f099faf472371ffe64c2ceed73460e883cefb6b3416f7ab4fc463e10f2c30e46b8927e279b94b2cee6f6cc1d087ec092cec4930c6f342f24f85fc46442caef75660e8cf85fb93d18cfd9ec783f1162ceaa37cfe19cdc5fd3ceabfb990d79d80d13eeb152cd64fe9fa85f8de7c05a33df9188cf66cbec0d0c7f50d0c7df3b8ff1f2d85bcce002ce227078ceb1d0f2cfca54e3c41fb6f74bd21ef5780f17c5d058bf53beeaf46e618ebd77a2299c77f5bba9f25c6b7f4c1c2bfbd80d19eeb07f104fda1933cb678de2603e37eba01c6ef6f57b0a8ff71ff3d72c6a8b7e8d47faee88fb507c6effd188cdf3bdc1ec67d38c739e2e3c5a63393e21723269e60fde4f22c99d677b93e307577285eb7b8fd8f27ecfe9cf50e0c7d8a79ff8ca7ec7bfefb6b412cc627db81c57e823730ead9eb1158d43fb8bce399b8fe7a0716eb5d7330c663c3fb733c67eda1fa484d2cc6c39a83a11fed193ca57a651282b13e16f3f96ebc9860bdc8d880c5fe810c2cf21bae8fe3e544d4cb23c93c5ed30a30ea071b170cff92d0f81813d443d71730eaed9a07c6f53eb7b7b1c9bee7fa117c49a6f5024b30c5b3760cb6b19ec9e3adb13331e8face93ccfbaf3883f13c23013ba8a72e05d3fd0d1b8c7c734df23b53d8df86facf9da03e7e1b80f1fc82f7e76430813e6d63e229fa3be5e333194e4cd40b52b04ded31b8fe4e4653110ff2fa0a73a736f28d9a788afd67fa180cfd6a1db0588fe3fe7f32610accfb77c3f59721f2c77c493cc5fe0aaf00e37eb731788afa4e059ed1f8361f60d48f6dde1f93d914ebc7460a46bd2fe4fd37994fc7940f6cbec1e89f98cf5f93a578def5013c433d86da6f4c51bf09b9bd4dcce982f2b39cebcbc49a22fff6b83e4dec29ea15d95932adb704c433acffebf43c776ad1fd039d7886f5d315bf3f5356f09acf77d3d1d4a5fa65734f3cc3fe035d134cf7372c30ec355b824dc413dc3fb0e9906574dcdf79c4e2f74501c6fa5b74104cdfb73c3e9d4ea6d6887f7fdb10b3e791bef1f9940ddf1ceb078fe005f5b7c5e7e3e96c86f58f8d0246fd3a76c1f311f9b377b043e31bf07c693a9fa1de19df816dec07f804bb584fa3fe5accc47a86069e517b82002cd6f775b043f39bc6e3dde9923d8eeb7332035bd47f3705ec60ff824d3cc7fecf84ebefd498c19e2faf609bfa2be6f9f0d49c2d51cff5c016e5fb2b176c8f78fb8b15d8a5fa99c9e7d7a93543fdab1b831dfafde6287844f5d10e8cf1af49bfac39c63bff024f499e98ee6fb3fb937f7d023bd4fed407bb435aafb124d37e2d5d30b53f03cf87d43eeb0d8cf5dd7803c67cb7e1f63d75587f707df1e9fece7c30a2fd5d7b30f6b3469f9269fdc792cce5594dc1587fba52ffb84c1edebecd5e326f7f41faebceb19f2cda8271bfa6133ca2e727e0118d4fb2164cfa9c2892f978af4c30eca1f1c19321d7bf2bff7e3660e34ff5e53bb043cfaf5dc174bf6c0076a97fdb929805acfcfb6d0446bdbee4ed9f0d857eddd660f89b6e2298da5f05c4ac3f687e6bc0c311ad87e07a263f9f0fda77f094da537f8067245fc5f569369a1963d29f2b31eb5fdabfe20ba6e7a777e0d188ff3eb9815906c29fa78227d04f053ca3f6b65c3f6663260fd553a93d2cfca4fec91bc95cfeea041e517f5fb8fece2662fcdd023c86ff33c1d31167cd06cf21cf5c308d679d8017d41f0df72fb3e9cc1ef3ebab14ec8c69bfc05432ed47d38885fe5d4cc9b4fe37028fc8fecb37c9649f25784cf6ebbf82e7f47dbc042fe87e05f5cf4ce8936b82e7f4fb36113ca6f17a002fe8f986b8de80fe8bef4dd28fc292cce52fa68269fc4d1effb0db2f49decd0c0c7fdc92fe2ce6131a3f6d2d98fcb7bf02cf49bf370330d68fea5a30fdde38831dfabea3fe59b2fea178b0009bd41e4f03db23aeff37713decb5f00593fc2df5a7c1ee47eb6f2330eadd17156c8ea87ff7609bfc45590b267f78d5c02e714bfa6ab2f1207ff80136c87ef22918f34dfe06c67cd186c48b018dafcee3cd99c5ee47faa48217647f99609bf4c7a0f1b2160392afa3f6da6cfc68bcd69279ff949f6093daef4ec1f067f5817831a4e76de8f70ebb9ece177c806d6abfb3235ec0dfba2bc9b4df9bc6d7ed1376ae5f5c3fe703263f6f4f520a1e53fc99102f66d4be8cf7cf7cc8e4e3d7673e784c7cdd82a7d4de5a03c3fe751e9f3265c2fca09be009d94fc2e397394b87c99f186bf08cfa4fe3fd3b9fb0e7717dacc792e97c0b8f5f58f8bb20d6793d613e5f2cc7b49fc5005bd49e35b56fb1c4fcecf1fe9e2fd9f7743dfdde582ca83f8267b049ed59f3f9686eb2eb69fd782699d62fa83de67244f67de1fa3eb79643b237ef2698f4ab9e8347d4feb0008fc99e1c6a8fbd70d05f4762261e6f9f46e3e730a6f3160618fdbbe6f9c6dc5d0ea8bd0df5bf6b88f89aebdfa25f00a5f8ff4e32edd749c0636aff66019ee17939780e7de2f92a73f643e8bb031e537b7c133c237bf5dec073ba7f44f71f1a225ea3e78f447f79dfe011ddcfe3f22dc68c29feff06e379ba0e9ed2ef0b1effb1747d44f3b1fd0d5ed2f78d0236c65cdf367c7e5fb0009858bf07cfd15f7bf082f4a3492473f96f19d8257b6df8f82e66cb05f55fbe223630ff6f797cbc98b3f67079527afe82319d17e1f6b7581a03fafdc693ccc7d7a0fb194b97da7bbb111b63f2af1bae9f0bd31810eb7cbd61612d1dd2bf94da671943c8cfe7af856d8c69be6e0563be594f2573fdd7b8bd2c1c763ded0f53c01392c7bb4ae6fdd3717d5db8c684fa4bbb134cdfa767f094e28180fba3e5c080fff15fc0b309f5ef9764d24ff13dfc43cae7a3e5d0807d6cf8782d47acbdfcfeed0b783ea1fad50ebca0ef6f3ed82079a32f30f2c5644f6c627f5acce7df655fd0e1e3930460a662dc3f1cc14beaaf40133ca178a8069bf47cdf90ccc74ff3c10e8de78dfa676c8afd09b564daff5982b1ff36a6f64c58ffd2fed40b7836a1fac504bc9c50fd6101c6fc97abc426e2b3700fc67911f3018cf33ac99d643e1edd198cf3176e07463da4fa0063bf8826be47bd53e7fe773965e345fded806db217eb1d8c78f29612b3f6923ea9603cbffb0663bf4949d7b38083c663b3022f68fceb7bb043f6118682a9ff8c02ec92bfcbe9fe7dba49f5c30d18fb636c9e2f2ce7ecf7144f2a6097e4bbe5c4ecf7140fcdc0b0b734018bfde03a784af3c53504cfb15f47dc0ffb0bbb8160ecbffc002fa95e58edc1d8bf1a4dc1163d2f36c1a8575495609c5f1a4aa6f3a134febd83e2ed2f376093faafa3e72fcc01f1f50b3c217ddd5660ac37ad63f00cfe5407cf69beef5230ea35c6026c60bfe55532e55b39d8a4eb6f73b0d8df20ee6f637fe04a32cdff03b043fd757b904cf9d9168c7ae7ed2299ce7b3692697fc898d8c2f99ddb128cf3b317f49f85fa6348f75f1a06d9afb604c37ff817b04dfa1c0ec10ee9bb4ef22ecd015d7fdd8047345eb5079e907e598e60d2d7b40363ffe3762598e2d5750e16e703d692297ffc128cf35768af897afb36108cfaee5c32d56b0f9269fe2e24f3f61731d880ff5125d37ed80558ac974c25d37ec09d64de7fe64132f73fea27d8a2f15732c9b4bea008a6f655a23fb1dfb28c24d3fe470d8c7ae1ed5132e95b2099cf8fa6e82fd4e3c32fc9b4bee3125b38ef7723ff641816d99b7d03dbe48fc22bd8a1f9f95a825d9adf4af28706eb1ede5eaf060fe97aaf133ca1fc5605237e6d8ee009e5bbd5198cf58b4efc1efb6fb71730f67bae66e025c5df8a09c6fecae020998fafd248a6f3ba909fd93b6f4f71025bb0af52329ddf9849e6cf533fc036e993924ba6f96726993f2fcec00ef57ff12e99e2c34a32ed7f0cc1f017d5bb649aef7cc9bc3f22f13c97fa4fc3f859388f5a6d25f3f69443c1d86f3b06e37c4be54ae6edd354c9bc7dd791643aefdc4aa67acf2b18e7f134f13dced325a4ef26d3379affc95f9826e2cb952a99c6f7153ca57835fd0463ff691108267fb579028b78c2001b34dee14532bf7f62814df88b4832d52f2ab085f59d0118eba3752899ecff2699eae307c9b43fb405431f9454329d2fbb97ccdb938cc02ee95b2adaebd2f8b590dfc279e448974ce3f12998e67b4d30ce074713c934ff403e0be72d2dba9fc5e607defeca014fc85f5413f094e2313b954cfea0114cfe467901233fd41792a99e6a49a6f527c198afd71bc9549fb9822dea8fba944cf9502799dad782b17e6d7592c9be6782495fea42321fdff8c7f77cbcb477b043fa1deb9229ff4904e37cc697641a7f0decd27828aa647abfc45032ade7b982495f13b25fcbc2fb0c944032d9cb93606abf5949a6f314cf60bc4fc00a24f3f6b79960d29f5a914cf11dfa53d87bf82999d6df303e16ceb755a4cf369b3fc8ff7660ec3f57de04933ff0f760ac5f665bc114df2b67c1a44f57156c507f5f1cc9b49ff3198cfdc69bab60aac7ac4f601be7fd22c1781fc95132ddaf95ccdbabd492b93e794f60e883229e87fd9ef959326fbf3a964cf9e00318fe5d9d4be6fda192fed916ce83a92f92a93dbe64ca8fd11f229e4c6f92f9f3938164ca1f4f82b1fe994ae6df871f60acf79a6bc9bc7f62f49785f3b1b75230d95775914cf30bfacfc279b22df90f47c413a621995f9f7be011f99b6d2b98e2136d021e4f683d63059e4cb83e7ae2fa19dd4f3b83e734df943118f581f22099cba33c8397549f592dc026d69b8f9279fb6f9f60e453d6156c537f5a63c9644f8160aa47695330fc8dee0aa6e7c5b964f28791648a6fe692297e580aa6fa6628da8bf8c3bc974cf9642118fa38954cf58f89649acf1692e93c27e9936361ffbdd149e6df2b9e609c1f7d96ccf549ad24d37974e887d0676721998f8fba924cf1fa9364b247713df687754f92e9fc672399ea45a23d581f35af92f9f7b9f81eef13885ac1181f4b32d5dfa10f16f6a3044bc974dee9158cfd3f892399fcbb2d993fff26fa6786fd3ba23f711ef146d7bbcc7e283f7b944ce7995ec0639aafab25784af671db0a9e52feb200cfc9fe320f2cec650f5e52beae7d49a6f319e2fe4bd457766083f453bf80b11fa878154cf6b2adc1585f37c4fde0af235530f251717fc45b9e90d7c17ca848a67add5530ad1f74a160aa8f76e279c8e7c34630f97f3b174cf2379a645abf247fe35a781f90ff2818f3c1443297571d49a67cfd4930cd87da1b58e8ff5630ece74b32cd1fa564aaef7982697dc87900633f73694ae6faa0be4aa6fd789a648aa724637fd25a32ed3f79924ceb3d3330f6f325ad64de1fd98364927f2598facbd42553fd3594ccafcf311e16cecbdf22c95c5e652a99de7f267e8ff3c9e1bb641a6f4732bf3efb008bfd812f92297eb32473794b31bec87fa30a2ccea3ee0493ff30f79269bfe23718f53e6b2099ea0377609c7f34be2453fc7b914cf91c1f2f63c0e6478a0fb6e019d58be207c1538aff8fe039e503712b99e6eb5c3297a750c04b1afff22618fb1922c1347fc73bc9b47f4630f2f9eda360b2efab2e98fcd1ea158cfd83452598f47f6b48e6cf8feec1a8b7a40bc1f05f3bc9bcffb61918f596f85d32d5e3447fbaa48ff94030f6ffdc24737bf267c416f6a7ac3f2453fe580bc67e99122cceeb9c24533d6b2299f4ad108cfce30773fd500cc9341f7792a9fe6b0ba6f5da6b2399ce372ec1d85f1d9d25f3efd59b60f89f3bc9bc3fd4a364f22f6f60ec97543792797fa8a960d8c74d32f9932918f61ed49269ff832d99e44d24f3f61a23c1d43f96fc1ef1fe1c8cf763448e645a3f16cfc3fe3d632899e2955832cdafd01f0be7d5ad4a32ad9f3792b9fcc64030ced3d792b93e9723c9b41feb02c6fe67732b99f68b7c4aa6faa3180f9c17f6499ffa032dc46bf098ec5d8f24d3fe08133ca1f530ed049e527eb7f50593ffb83c48a6fd570a7846f7d36b30e6fff25b32d5ab73c1145f28ef82299ed1e660d473b64f92a9def92698fcdd5a3cdf46fd24914cfbcd74c9b43e21e445fda611f7437cb1fe124cf65edcc02edd3f7225d3fb001e05d3fc5ebd108b7879bb93ccfbc72f05937e66a9605abf538e92493f56e021d99f6249a6fa5b2b98fc9f72914cedc3785a789f52f12698e42943c964ef17c9e40fe792697e1849e6f2648e60ac470660bc9f243b4aa6fd3fa1647ebda20826f9d24c32ef0ff55e32d5d7447f60fe2f9f25933f5a4aa6f8e62c18f9502299f40ffa61e1fd4b4a2899f6279492495ed19e29e297028cf795048d64dedef05530e29137c9e47fe4efb19f740cc6fed152134ced0f55c9fcfb488c17dedf74b9934cf64dfa3c326754ffab0cc1643f510ac67a78ba04633e77466083ecb309c026cdffa921998f476582b19fa7ba0aa6f93e5e0ba6fca6188051bf4b447bb1bf4aff00237ff60f92e9fd41f792e9bc7d2599e6f717c1d8cf247e8f7a5d160ba6fecf23c1b4bf21a0f86264e13c72f82499f2fd57c1f06727c954bfcec098df755b30d9ef7a2e98ecdf78974cf54cb447d47b3d5330e2cb0fc9b4df47dc0ffbd12ea9647a9fec1e2cde07f92e99f60b1c05239e3e4ba6f9df974cf9d74932ed9ffff17b2e5f70014f90ef288261df8664b25f5332bd6f0ae36be1fc4ef92499f22d4b3297ff593c0fefb7525dc9e4df3c30de5fa53a9229feb12553bc2ec66f46f2565f92c97f37609ca7b4df25d37e825a32adff89fba39eaafb92293fea24f3ebb7627cb13ebbfd944cfbadbf2453fe37154cf287a664d257d15e715e80fa6fcce673f2af117846f94076075e503d2188c1d88f9a9b82c91f2457c954cf38832df2279ba9647adfe70a8cfaecf62098e2ef6e2699ce27ed04533cb2d5c0d8efaa3c09a6fa46f12199ec5d3c0feba51dcd9f63517f5dbd0886bd3f4be6d76f7f30d59b62c164afde5432d5271f2453bdf0118c7abd77124ced4f1ac914afae2553bd5edc0ff3b9f32498ec6d1308a6f66c55c9341fdd83313f9ba23da8ef46a564dabf664aa6fd21f27b8a37e291643abfe249a6f9ce174cfb13a2028cf78b25b9647a1fd4a364f20fdf92c97f0c25d37a512599d607a03f22bf375ac994ffa49229ff78944cf94a2618fe48fe1ef59e4632bd3f270163becf2ac994bf8beb71fe4b0d2453bd27964cf552d13fa807da2f9269ff612499e627d13ed40f424330b55f13d763bfc6ed4332c50f37c1f0f78a64daff3d964cfb43c578637daf7a138cfd39429f719e6745fa30314df21f590ec6fedd32134cfbb10c5d30f98bcb8b64da2f3c01dbd87fbc174cf5c92001e37c4d25eee760fff1b7605a0fc8b792e9fc81b8bf43f149740263ff68fe2a989eb722fb9c8878201849a6f75f9e25d3f37cc974fee15532bdaf752898ecdd0904d37a475080512faf7e30e9432e18e7f56e82914f5482c91e0bf13ce4ff7e2698c627fb924cebcfe2f7d8ff1b3e80719eaa934cfaee3992491e717ff80f6f2699f22ff13dcecfa753c9e4bf0e92293f394aa6fd139660b2cfc8904cf9df4230e68b4a32add78bf1c0feda740ec6fbebcab3648a8f2792c95fd492299e1848a67ccd164cf25b2d58f887ab64f2379d64de3fea4132bd6f4efc7e8e7827944cfb7f1e2553bd4f134cfa6c799269ffb6781eea8df14432b57f2718ebe591645a2f8b05231f15bfc77e0f652699e229f13cbc7faa9a4ba6f361427fb03f5013fa8cf5e2c495ccbfd73dc924af180fec0fd33e24737922f17c9c6f6cc91ea626f69b5e13f082fccfe64d32d547bfc0385f565ec0886fba1cecd07a663394ccfb237b05633d627b144cf6779949a6f75fd682c93f06349f4dc5fa433d154cfaace982697d721b4aa6f3c11918f585742299fce5bd64aa67958229be5ac560ac27ac12c178bfd79b64da0ff1e37b7adf95fc3dcef70592a95ebb174cfe3a10cf47fda01c08c67e1b5f32bdcfb0134cfde12a92493ed17f585fc81f25d378dc49a6f8e253308d57249e3f417c7a904cfbcd7e30c5d382b11e982592797f24df82b1de954ba67aa6907f4af69baec138af6c8d24533d692f99ea733bc1e4ff3c0b2cde37be944cfe712499f2b1b964b2675732c52bd0670bfb45d54832e58fba64da0fb301e3fd8d4a2499d67f857ee0fc72f82d99be5f81713e3e194aa6fd49e27e588fb89ec1884fae13c9d4ffa27fb0bff0229e67537fae481f66e612fb2d776083ec3debc026eaa53618f18a3b0323fe580f04d3f5c98b64da7f63825df217852e99ce77907c33113f6c4dc134df6f1f24d37c9982b17ee04f05537b9a77c9148f88dfa3deb07a92ccfb7f73168cf365778229be48bf25537d19f28bf501e55e309d4fc94f92c97fcec158cf2b12c1e41fbb4fc9b43e3d104cf3f7f6158cf87ebb170cffe448267942c1e47fba05187f1f455049a6f5614330f4ff0d8cf3b88ab83fde3770d94ba6fafc12bca0f6a557c1c80f6dc9644fb964aa7f1492a99eb1934cf3f718bc44fd632199f2ab67c914bfd782518f16e389f78346a23dd8bfa58c25d379ba4030c95b5f2453fc5c824deacfec2299f6eb6c25d37ae74630e2b94632ad170bf9b13fb87b964cf514713df61bd4aa643a9f0f7bb31cecbf10fa28f6e3f89269bd83e2adb9399f52bd33032fa6fcfef9086cd07e8d95f81eeb1b97a964b2bf0dd8a2f958ff02dbb41fbbbb825d9a3f2eb5608a3fe28560caafb6141fcd45fdb11a83b11e180f05d37e5c5f114cfe669d8051ef6f3dc1a40fab108cf3d9e55a30ce3b1a60d4d78bab649a5fe5f7645f978364dededbb360f247452899ea616730d6e7d6779269fdfb4330f9bbd4148cf8e7058cf5b8e44932bdffe25e30f6835c24d3f9d1b964b27f713decdd16ed9b937fd2f792a99ed2082679a247b0380f33964cf3ab18af05c52f57d1df381f5baf2453bcff0046fcacfe60daaf6a4aa6f9ed4b30ce7fce25d3fedd1918f65f8af1c37e6d4f954cf9cf5a32c927fa17fbede254326faf22aec77c1bd582a9fd971d58ecef3524d3fe5ea1bfd84f97d1f82ec47a83be124cf5c8ca07dba4efbab8de9df2dffba44f0b51afeb5cc1747d32154cf61eecc043ccf74f9269ffd3098cf7495c1e25d3f9c14a30ad9f281f92693de2001ee3bcf34430e94f71114cfe259883f17ef6b52599de2f36144cfaa23c4aa6fafd188cfa79d60a267de832c1345f1786649a3f7e30cd97a2bdc86ff55232c54fb9648a6fc4f367e44fbaa1649a5f669269ffb7f87e4ef6915f2453beaf4ba6f9443c1feb655a2c99e47b944cfb532493ff6bef25d3f86ec1e2bc532318ef1712fa82f3cdc55e32b5ff1b0c7b5acd25d3df9fa04ba67ac25e32bd0f44b4cfc0f95ad13f787f759c08c6fb8f34c9141f6e2453fee80b46fe22fac7c2fbafef24933f17fa8efdf9590dc6fb8d4a8a079626ceb3d513b04bfa5a527cb664f645eb65067848f359fd8369bfec063cc27ae45532d5e31f25f3f15c3d83315f5d12c9544f740553fe1e6592a93f3dc158bfb88127145ffb9560b2873a96cce5d75f25537ce90ba6fa62f283a95e2ae49bd2f82b0f82c93ef385645a6f17ed453d39984aa6fac04c32fdfd5607c1a42ff14a30cdb7b74232e5a76f60e483fe5132cdafb960c4fb5f60c4aba52218ebaf7b30d69fb6e27b9c1f0ceec1d82f962b92c95f1d24537da7148cf93d05239f534f92e9bc8bb81fcefb1547c9544fabc1383fe68af1c67e92f807d3fe43213ff6af7662fcb19fdaa37cc410f5ebfc5e30cd1f6b07ecd2f85a347e06332faa8f1cc0d0efdb17784cf6e91a82499ff44ff004eb318f92693fdebd649adf5f05937efa67c1347fe91618e7bb6e7782112faa60ac8736a1601a8fac00a31ee98c05e37d155bc1347ff8aa647a1fc009bca0f1f21682c99f9ae2fe0b6acf360763fd62bb168cfcb0148cf7790879f1be9ad4954cf53cd17fd8bfe49f24533db1164cfdbd7d07e33cd346fc1efb17b789643a4f300423bf303760bcdfec42f669b27885ee47f38169e1bc977e124cf18d3706e3fd11fa163c22fdda9482a7b43e7805c3ff058660ba9f2b9e87f364d14632d5fb4792e9ef37fe02e33cd926028bf364efe039c9b712f747fdd9ad24d3f58231fee58b601affdb9b648a6f7230dedfe12d25d3fa760a467d3817f218145fd99f9269bda1924cefdf93df23fe7e009b349f98623c2c1a5ffb2298ee97d8609c3f32e6609c3f8b2cc9646f0bc914cf3f4aa6786607c6fe958ee20f8bcdafb43f81e20b165e93fe5c3e25d37e30f13dea3ddd093cc27ede2d18f5983804e3fd1d9a25989ed7168269ff61fa089e223f9e8167d47f862699d6f39e25d3fe68152ce2b70318e7c9ec67c9f4fe12138cf70f252918f1932b9e67507caf08f9f1be9938069b648fc15e308dbf32108cf7df88e7637f627c150cff7a0163ff42f000c6f99c88ec9b4d37a867d1fc62b3f1a3fd3c743f5b8c5ff102463cb2da82117fb4df9269bde12498ec510f25d3fef01c8cfcb8b425d37eaa5232bd5f2506235ed85a9269bda4154ce31d89f6cef17ea8037841f76b447b17d84fb6012fa9fd6b211fea49978b608a4f0c156c423f3bc9b49f3602c31e6f7bc1d0bf4a32c50fe44f6c1bfb3be22918e7e93a6287d907adb70ec063eacfd51b784afdb3d1c0c85f8a5232cd97afe0398ddf652d99fcf75130e5879d09c67c961482c97eae7bb049f74b3ac9349e86649a4f2692b93cb978be8df749b88229be509660eca7f39f24d3f922713dd6afaedf8269bcd690c7c6f9d755001e52bc5b533ceb5a63d29fab2199ce63edc1139a9f82083c25f9f5068cf745dd2cf082c6238d25d3fb1d378229bf503ec178dfce6a0946fce9bd0aa6fe5ccf04e37d0af27aca77ac1bd8a2e747df9229fe2dc136f98ffc4530e9f34a934cf9f10fa6e78be739387f48fde9daa8f7273c3e310716f67b260f9269ffde1318efefb91e24537dcd06e3fd79f6156ca0deb1904cf6a080d1fe6a2199e67b5f303d4fbb801dd8fb0a8cf8f9a611db78ff5dac8211df745f60d413133e7e2c389be17ccc183c27ff97459279ffac4b30de27947e0826f94c4532bd7f5d032fa9fd6d2a784af58e21d8a0f9e1aa48a6f53f5b30d58ffd6730de5f94ad89ed01d9ef86eb2b0b2eb0feac6fc04b92af7525d3fbcd8f6093fccde64532d9cb4d30c57fe1128cfd33eb77c1a41feb028cf7355a1f82e9f9ee1cec62ffea9b60f227892918e785f0bd8dfdafe9b3601a4f270463fda81980f17ea59adbbf3966fd41ef472dc14bf2075b1b6c60fdec4132d50f0bc9944f1cc126c693dad7bf5e9ff2075c6f63bd6b45fd33b1e6549fb8adc0580fdc7682c97fdd5ab035a5f74309c67961e50bec523c1de2f736eaf7f11c3ca4feaba8bfa6d664467fffdc080c7f53b492a97e6f08a6f686776013fab4964cf69982717ed224ff30b5b15fe81608c6fbd3ce60c48b2d8dd78cdd8ff2eb5430c5839b5730f2dff60086be74a4af33d6ff148fdd8391ff6a74bf390b30693de808b6917f64c436ce8fdf1230f6bfb7345e0b6b3a27fbe9c0f319bdaf8bfcc782a5f7e43f0f60cc4705f99f256b3fedf71c826d92ef3625b627349f68dcdf9b2c9f9b927f237d3458ffd1fc5b8327f007241f530f1aaf6b00467cad51ffb2f8674efd41fed5b6711ed0e4fac192cf39b57733022fe97ecf977feda32abf7d8c9f3e26ffa7827fa74fcf0afb9da5daaac3fe58ff6a0be8f3df21cb2f72b9ecf3bb5c0afe9b90afff77f7df5116d62247f5d81ffad87ddba87590cbfd87bfb3f1f9779605f20899fa6be8cfffb79fff167b71e9f393743ffadc1663f4e33aa96fbdedf8eccf3f18b9ffff65e16dfbc90e6009240d1fa9bf2b3bc9439ee0df4d1661eb3f64f9313a3f24f3e4e717cbfa7791e5379fecfefa91d758f05a8e94457a8a7f2b590235542335561335553335570b364ea55aa917b5669f86e951ab76ec7365b2de544dd5d99f15ff9dc67eb1fe379365a3aed827652391a85bf6b963d2ecd43dfbec982c07464726dd91fdfb4e3da9f74cce7bf5817d0c76e53ff4daff5b6479e43dfdc446e699fddb597d515fb94ebda9efea87faa906ec9a9449f8c524f85607ea501da96375a24ed5993a67d2fc1bc9c25a7a5637ec9f91ba607f02d8fd92c9f2cafe6929aafaa4284cc7be15431d2ba662b18fad380af31a8aa7f8ff3d92fcf7cc954aa0844aa4c44aa2a44aa6e44ccf5ca63d2dfbf4b6622a059b45064aa954ca45a9954669954eb92a3745537465a5acffe8b5ff37cab251b6ca9db253cf8aa2ec95036bf1513929f7ca83f2a83c29cfca5979515e9537e55df9503e952ff6dfbf9581325446ca589928d37f23596c65a6cc9505d3b393b26413cd83f261288661b044c0b00dc7700dcff08dc0088dc8888dc4488dccc88dc2288dcab8a87746fddf23c99f9345b58ca6ff23a390df6677a3353ae36adc0ccdd08d95b13636c6d6b83376c69efd391847e364dcb3cf897d8e8c1fd8e7d178329e8db3f162bc1a6fc6bbf1c1b4b0cf02685e757f9b797f9aadfe999ff8af6561527c1a5feccfb7313086c6c818315fd4186363624c8d194b9916c6b2370ad3304dd3326de3683aa68b8fc73ebe19b04f684666c465eaa53a9a31936a6726666a66666e16666956e6c5accdc66ccdcebc9a375333757365aecdcd2f33b1f2eb1cfcd764311a736bde3169becd9db9e7b21ccc8379344fe6bdf9603e9a4fe6b379365fcc57f3cd7c373fcc4ff38b7dbecd8139c467648ed967c23e63736aceccb9b960992a3334e3de322cd3b22cdb722cd7f22cdf0aacd08aacd84aacd4caacdc2aac12b9dc2f91c5ffaa2c56655dac4b3f2e566d0cad5a3d5b8dd55a9d75b56e9666e9d6ca5a5b1bd6d3f7ccd96ead3bd6522689b5b3f61677bfd6019f2393666a9dac7beb817d1ead27ebd93ab351da592fd6abf566bd5b1fd6274b98bf5884b0601e3d61b3e9c0faeea3cf1fd1d1bfa2634cb31a8bfe82f001fff74a89aca135b2c6d6c49a5a336b6e2d7acdb196cc74fa4a9ed18f85b5b34d48f2439643bf4c614e6ddb766cd77ab03ddbb7033bb42326cfc178b4633bb1533bb37336abda766197ea935dd997de92fecce74fc932307756cdc6646055aa67d77663b776675fed9badd9ba71303fec95bdb6376c249ef9676fed9924625414662bcc5e602bf766681bf6d6beb377f6de3eb0cfde3eda27fb9e8debde7eb01fed27fbd93eb319d7b35fec57656fbfb1d1b07efffcafc9f27cb16a66274cb78cc6f8b4df992c1ff6a7fd657fdb037bc8faf3c47a7864bbe6dc1edb137b6a2db924bb7e64fab161ff9cb1f6ce85fd9b91bdb0972c485698ddcc1dc3311d662c8eed384cd2bde33a9ee33b8113b218f5dd89545df17fcdecfe155954d7183ab113333bb1edda499cd4c9ec2f27778a5e0ea7640ff0ed3d6b55653d3b17361acf4cc706cc6216dc6ed8ff3b356b6be3b44ca6b9d3998173756e8e66f7938feeac9cb5b3b1b7ecf78eb365d21c8d9d73e7ec9cbd73708ecec9b9771e7ec9107ecb7a7eb6a03f234b2f09f3c683fe7ecea3f3e43c3b67e7c58cadb33db1ced6b33d6656cc3ece2b6b5dc5dab5c0a7f765ec63cfe9e374f8bc39efbd24f6d20e9d0f66fd47e7d3f9ea7fe954ce379366dffff5f6cec8e9ff5acca933b3eb9fe4f8576599ab9db3b05f9c25fba1e21a6ce2b08c23f34accd3bab6ebb8aebd702a73e17ab66b1f5d9ff9a8931b981fccdacfaca5f76ec86c2ae673e6d18ddcd84d98bde0e3746e6a7acc73b02b594fbcd93336be67377373b7704bb7722f6e6d176e63356e6b358ae67656f3afe8987a70afaaeddeecd6d55cdd5db96b3626cfeec6dd9a43f7ceddb97b3622dbde86dd837bb4576e6031ed331df7e4debb0feea3fbe43e1b817b765fdc472195fbeabeb9efec5707f7c3f9703fdd2ff7db1db84377c474f1c0fe7dec4edca93b73e7eec25daabd2f6091b8a7aa81f70fbdda9f91c533d8f46d79b6e778ae937b9e71b2179eef055ec8e4601fdbf0222ff612e6030eb6d1eb8c977a99977b85577a9577f16aaff15aaff3aedecdd33cdd5b796b36e7c7c6c9db785befce7a70471ebb0b1b5d9dfd3ff36fde8e59cec1db7b07efe89dbc7bb5f01e58467af31ebcc71f5af5bb1ff853b23c79cfded97bf15ebd37a730637362dbde3bd32f2e099368cbe6f229b39ae7de76bd0fefd3fbf2bebd8137f446ded89b78536fe6cdbd85b76441d7a3aff8866ffa966ffb8e71f45ddfb31e7c9ff9e8ad6df8811ff663e547ee8069e4831ffb899ffa198bd6be51bffd523c9189fe75599e2f7eee177ee957fec5af0d6603e6d46f7a49fc967d3aff6acead27ffd6cf77bee6ebfeca5ffb1b7febdff93b7fef1ffca37f62f966a2bef8f78aea3ff88ffe93ffec9ffd17ffd57ff3df8da3bdf03ffc4fff8bf9f485bd30c74ee57ffb037fe88f8cbd3ff627fed49ff9737fa1382c27fd6679f70f597ea97dfc99d8d25f066aa004060b112da65f6aff97c0f7fae5b7811d38fe3570cd0fe31478811f04411844411c24411a64411e14411954c14509839a7d1afb3d68838ee59af3e06a3f07b7400bf460c5fc48ef0d9560ddeb99ad30d906f6c27a0e36ecaedbe02ed8057ba50e0e4a191c8353708f0af54f35ab3f2d8b1d3c048fc153f01c9ccdd829ad73f012bcf6da15bc05ef81137c049fccf38c83afe03b1804c360148c8309fb330d66c19c49b47016c1325443253442d3188416fbc39c71e8865ee88741188651c86cc73a8709f3cb4698f29881c50f61d6fbfc300f8bb00cabf012d661e32fd421d3b41fb2387f94e5e77af6cf63d25f1db661175ec39b19875aa8b3bbafac636f27e13a5c33795e8c7b2f0d37e136bc0b77e13e3c84c7f014de870fe163f8143e8767f52d7c095fc337ab08dfc38ff033fc62d2982c22f6d97ff90e07e1301c8563e3184ed82cb40dd6e1943d63e6ee99fd7c9b53f6dfe7e1225c466aa428456444e68fcacdaf5a46b288ff862c28f1d4c8525fd5d7c88e1c7f19b9e673e41987c8376751c02375a61351c8e2f7cf88e524511c25511a65c62dca8347ab65f369cafe3c4645f01895aa1255d125aaa3266a5910d345d7e8166966678ccc75d4467ab48ad6d126da4677c629da452c82f0039ef778d68ecdb40bf6bc7d74888ed129ba77d2e8217aecefcdabed866af4d1eeaff6f2932c068fb043b77516ca2e7a8a9ea373f4629ea357f6a437e6750d16a79ca37773c2e6e8aad7eae823fa8cbea2ef68a0ce153f1a2aea8f2a2c7f9e1b8da27134096d2b8ca6d1cc8aa379b48896b11a2b56111b319bac629b85166eccbc3d9f73962c7f93b29843e33ef6e3200ea3fb388ae3f081f554cadbcafc5a1f25fe2c0b7ff68f7131d4f8f9e22cd4f73889d3388bf3b888cbb86277bcb0f87111d7d6dedd5b4f7c2639b959dcc46ddcc557ff515dfdb4f662cb3bbaca5875e25bacc5ba3f8b57f13adec4dbf82edec57ba5890fea323ec6a7f83e7e881fe327e3143fb3d866c9bc7380b86e689de373fc120ce2d76011bfc5effd88736b3055a38fdeff992c0ad34726cb6b9cb8adba8a3f4c23fe649db7641ec6b09ee3da665ed3fc0c33f6dcaff83b1ec4c378a456eaca7e51ee94713c862c3c1eecff9dfdb7493c55f57816cfe345bc4c54e3c17e4894c448ccc44aecc449dcc44bfc24484263efde9b3e8bd8d887e7a42c3b65f3d6d17c4da2244e92244db2a84872b1baf07765b1c886f8155b36bbb2fe65914fa2b8499194e69b71f26fd69e8dc9d9b998dff6c13ad953e39054c925a99326d6d5f7beea9db4ccca52f40d55c1d97d95bb385332bb4abae49adc12cd38252ceb4956c93ad924dbe42eba26bb641f1c9243724cd82c657a8ec272014364d94c9b4b2f4dee9387e4d158264f09b34ab146d2e722ff4c96e499f5e198e50e2bf6efe7e4257935dfad3e3f3f276f56ff8afa7df26ece8dfb709c7c249fc957f29d0c143d192a8b64c4abe3bdc7b4fbac8dc9c264b2df93713231de9269324be6c63159d8c76469c6a99a2aa9919aa995daa9e3dfa76eeaa5bef1603a2cbfe1b2f45910cb54b769601cd3308dd2384dd294cbc2d76dfa7cc4180aaff6932c96b0fe3453466e6b97cc8e9d344f8bb4343fd22a4c98f75a5afdfe8687f4621becee75daa46ddaa5d7d451f4a04b6fa996ea91c9fd3f978549c3644957e93adda4dbf42eddb15fedd3837d4c8fe9c9d8a7f7e943fa18fae953642b7a344c9fd373fa92bed2c8902c2ca7db4681719fbea5efe947fa997ef5feb197a56f7f9f5bfd2acb8f91e17a78607dbb5412ff2139a7dfce9069eb673ae86da5f7c54ee5fa696f8f553a4ac7e9249da6b3a4b50b65c3f42c5177fe23ef31361a7d0edad724d379ba4897999a29c63163f971b4efb3e3ccecb3e2649559999d39ea57ea0475e6665ee66781e9fa81a3a06ab0eb675096e1c5599845599c25ce23b3172e8b6af5b9d52fb2889a9add3f99d14efd4a064ccf952c553eb2cc74cc2fe61b077dcecbf477613d982316e37efaeb2ccf8aaccc2a61e7e45b98b34db24b56678d5dc763f53b6bb32ebb662c62f343d6df6ff6c2fd66de9c652c99661ce3a74ccf56d93adb306bd3b36d76e74efa5999c53363a603cf76bfcd8445369691edb23d93e5901db313d31d85db7491ddff268bf28b2ca67a973d3032b24743c99eb82ccc37f67d642ebcc4661146f69c9db397ec357bcbde852c1855577d4bdaec23fb8c9e93419a655fd97736c8d8e866a36cec8eb24936355da7cc66d9bcf7ebacbf17d93257734509552b377233b7723b77d8377d3d6dc29edad74398b7cedddccbfdec900779a828ff4496be024a7dabf8bd36f63edacc23c330ee982cbd97efed70c024619219f7799c27fe364ff32c3c30597eac4172bf95e779919779a556f925aff3266f8d63dee5d75eb7dc613f1ef9cdfdeeb3e25cb316f153aee7ab7cad9eed32dfe4dbfcced67396c1b09879c8729a4bafd9feb7719f29f93e3fe4c73cc88e4c9b1392c52afe812cbd0f559209d332db2ed5263f1926f32baed05ca6678eed5877ecbfbce6f7fe5dfe104cf347a3fd690d92d97afe943f671725cecff94bfe9abfe5ef7dd4937ff49909af719cddaf6cca73628dcd8871fe997fe5dff9404d9cc833f3613ecac7f1579ff1997dbc4c51b4cfee30c9a7f92cc9988e1d59a699f47e377c0bdffe200bb75792259fab7b854d65ea77be302c63cfd2fb1dd5bc481673943bf9b2500b8545f5b3e8814547b6dcabc0575793b1fa919f0ba33059b7d9ac557d2cbfe8f312ebaeb7e4c2e96b1785cb62ad53e1157e111461112923d52ee22229d22233f67d5ec365611ac6aecdd98cb92f8aa22caa3c2459faf6b398f5f597f9e5375958c6b34f6fcc62be8b0b7be4ce74a97227646177ae8ba6688b2e288a6b714bf25f7684303d53fc645268855eac8ab5710835e7b597a5d8b06cabaf6a7ef4d5be60cd243916dbe2aed815fbe2a0d8c5317b284ec57df1503c16cc3efa1a279764614e0b268f7128cec54bf15abcfd248b1aaa7f57164fcab22bde59fe742a3ed894b5efa33c5420875c9645f1597c15dfc5a01806398ba2c90bffd8555114a3625c4c8a692f4931ebd72c989ea8c5bc8f467b5b6677e03163b12cd5ecbb544287c540d7d250c2d22cadd22e9dd2354ebc22c2ae36c7f6a1f498cdc6a55f06e1ae64290dd731f7efc822d654c40cf3adb665c472b053191b2ecbef852cfb5e16f3cb3a9749999659996749745f163f564a7824669465599597b22e9b5e92b2cd34661b565f3b6371dc985bb4e10ffaaca7ecca6b79b3be4acd0a4a9d8d67c4a45995eb72536e992cbabdeda326368e5bebbecf64cabb7257ee7b591425cd7a6d28b552fb45961fd13ef773ea8dcd103b75c56439183e1bebc81c5b7d3d2cb0674e63cfcb63792aefcb87f2b17c6271ce86e527a398c594ca9d5d97cfe5b97c295fcbb7f29d79d12eef32adafee9bb3bebec13f337b5f7eb079bc2c3fcbaff2bb1c985d392c47e5b89c94d3c42d67e5bc5c944be3c45c7d156a7c4c0f665f1939564a655466d06746a7e0d4ef2ab2aadf62fedefb3059d8b7663f36c8d834bbaa2c26cbbd19b2deec97483a264b6b06c6a1b22bc79bc5e3a00996e5c4dc562e538ba86236cfa29545e5574115329fca66bb3ea736471513d73a313946fd9a4515dbdb2aa9d22aabf2aaa84a2bacaaea52d55553b5556745c1b1ba062b362e5ba7a355b57ebda3aff254b74aabf42467b21c83a36ad9f51f641151a5cf6571d488e9e246bd315559556b264bc4662c268b193269f64c96a37bf65a6fae2e2387e9eb5bb5a9b6d55db5abf6cab53a54c7ea54f575e17be6c717d681c5d5233e26a3fe2ebd3d570f4c96c7eaa97af646d5b97ab1aaead5dc556fd57bf5517d565ff128afabef5e966ac07ac2e5f5cf678bddb11a56a36a9ce4ce23c6c5339adf627e4bca6270efba60d1ee539ac5a36a524db98e912c51af654c965335f33a8f656bca3c34ccae9a87af9eaac6ac3f17d5f2a26637f7f5a25cb81fb615f38349d17f26b406c3ee7570377d7e75312fd6c5be38e1cbc5bd78179f8d897f092e6134b8449798c9d2b91fccbadefb159cde673059946a7449823e47f6d9c7fea32ca859283c96225912f549bdbfa4ec9e593fc6fdfa9c6df523d4af3d18a774e75d2fb9925e8ad0c8eefbbcfd525eaacbe5525f9a4b6b9c2edde56a6fcdd1e5165f98bd93244764f10773e445d68e5da55df4cbeab2b6c2cbe6b2bddc5d7655a7b697fde57039ba2fbd2c173633b1d8cde27fd5d684fde2fef27079e4b2a0adfd5add3f95256071f24d29c2faf27479eeb585d61bfb95a07ecd81e9d8a377f35545b3df7975c88ca6feec72bebc5c5ecdc4383afae58daf136d8235f75dbd7e8db92c7c3d96f5f196c5dd5333bebc5f3e2e9f97afcb777cbcf06a13d388e16578195dc66c869ddb6c66cd466c967db5ee7adbbf4c2ed3cb8ccba2f0bcc2fe5d16392f4096545373b5cdcf97f9657159f6eb90bdcdb2d8b85fd50accc08d8c83a7298f8a1fb4c620fca8d55a49b6b5519bc98ac9f9565bb56def1cc38bfaf99ecd8d336ef74cc7b8341e9b3146e6dcdef82cdeac9ddaadbddaaf83484b46e9ad0eeba88eeb84e5ca9fcce3796c6e9db008f4c9dd32590e755a67756e325990875bfd0aeaeff9cbcfb2287eaa2b6e5dd4a5f25557c68149c0bc0fb3dfa8978569716cc69eee2b6aa9cc422bfc8caa9a4590ec7f0d6b5beb7eb84347cdaf2c63af9cd73063f67faa22f6ebdeaff7d27875c746f9cbfc626d5cd6d7fa566bb55eafea35d36ca77c8af27a536fcdd8b9b23cdceb6318d6239bdec2eabb7a57efcb3d932515759e3fe695d8112074cc55efd44370523ae5b13e184cb3597e7f6fdbbc12cfda581f599b4ff57dfde0b6a1556d13b77eac9fea67e3549feb17a65b8bfab59f159cd728b02d1691ceeb37bfb1b7fe376fd994b220ca89acbdfb5abfd71ff56738a8bfeaef7a500fcba01e992ed3c27db17077aec3f29881cb324b63578feb493de5b2507ef20f7264f6a797a59ffb13f6ff0d9bfda7f5ac9ed70b9657b2fc8bc52e5b7b592f9d779bcdc98dda288de13f5a35f3ca1f8dd958c64363db47f6d9374e3f438693be6ed3fbb2c665ff34a2d0def09a9af1cb1ae0d074eb5be3357e1334a1f3d4444ddc244dcafae291e54977eeaec9ac2dfb158b429bbc299ab2a9b8bdd09ca8f42b763fcb42732397c5e4b364aa8cd2cc99c77a7369eaa6316377c3eefb7039352d0b8359d6e186c6aee99a6b738badd0b48a466b74fbc18c9b557aecc7c57c6fd64cdfc76c2c3efa5cbdd9345bebdcdcb9dbbe8283d53fac9c9b5ebfb3a4d935fbe6604d9a63736aee9b0726c363f3d43c3799bbeb6be64c2fe3e6dcbc34afcd9b948559c51f65a1d95ecaa2f1959bb5faa138cd7bf3c1a22ac7ff609e89d973bfa6686f9b4fe3e0dbcd57f31dbae167ad3483669828d60b7bde283359ae356bc66c961b46611f41369366dacc9ab971b296eeb6e1e3815566167d9b9ed3354b63efad5bb5555aa3355bcbe8ebd581396efb15c45d9f2b87ba71689dd66dbdd6ef63181e7719aadfaf09ff365752a5cfa4bdc2fdfa937a8bc76de03dc65d1b1afd4afdb658703fbbed6dba8d8c531bb7499b865ef5de666d9e9fdaa22ddbcad8370fed85595585fce4beaddba66ddbaebd5e5876dfded8bcf3ddd70ee4eabfefed5aaddf1de36baddeaeda755bb35f6dda6df0dede056f5ec89eb7734a63d7eedb437b6c4f52163f38fd41161bd97abff39945bc2c951e313ddbe5b9a2b7f7ed43fbc8b4f7686ffa9d05b5d53ef55adf326fdf9edb97f6d518861f4e5c44ed5bb269df59ccb3cf3b7bc9645ef5f949fbd17eb65fed773b6887eda865b3068b697aed123b19f67e906bf6b69db0acf8d44edb593b6751cb397875ed76d12e3bb59fdbeace38754a67746667c571922779af472c8e39fe4116e75759d84c99a94967770e93e6dab99d67192cd770d89cb063be56ef7c7b5b9f7d3753baa00bbba8da767197746997b1b0b8e8ca7e6dc8db75157bfea5abbbc6df756dd775d7eed6699ddeadfaac8e723b5ec95b326b687b8fe2fb4e65dce75db7ee36eeaedb76776c02d875fbe6397aef0eddb13b75f7dd43f7f8ab2cbfc563b40fdae2fbb87b59fabdb76ef7d43de7cfddb97be95e6bc738b9ae7de8ff1a4166c38eb3eddeba77964f9cba8feeb3fbeabe9d85fad80dba6137eac6d19d195b0b33f6b56ed24dbb5937ef16ddf2aa5e95ab71358d9dfbca7763f9bd1ce6d00ffa99fd6ad97bc7bada4cbe73b7bb322bb18ee1cadd5d5deffdea3109dfaffe35b886d7280fa302b66ffe1d1d13eb0b72bf196a7fdcef5de36b52b2d65d53ebe19ab119ef6c9dddcf7eb5f79ab3ff5a5ccb6bc5e29897ebe55a5bfeb5b9b6d7ee7acd27d7db55bb321d5533b30bdf8da69c5c57d7f57573dde6937efe655aa8f4750ce623a2be06c6f7638dd87c74ecfd38d515ade7de5aaa8171bcde5d77d7bdda3847b5edab2c5993353c07367f9c07f8afd7f89ca7ebe17a8cd953afa7eb3d3dddbf998b6641d1eef5e1fa787dba3e5fcfd797eb6bad3069deaeefd78febe7f5ebfa5d75d74139bc0eafa3eb987d26d7e975769d7b6bd60b8bcccccceb92dba2f5f327f2dd7d73c7fc1c27ebcc52c3a79b7263f955348c4c36f3b9aa6dbf33591cbebef31764b99937eb66df1cd6379ecb66877edf8bad140b2fb9b139d0b8f7b51b0b346f8152ddc25b748bd5db2db9a5b7ec96df8a68d025e15755df4a7377ab6e97f0e3c626c65b5bac6e9db1ef772df0fd16d6af1f5eafb0d86cc4246aee7236b3dcaeb7db4d4bc6d133cb2d44fefb87ddf3ffb52ce6e34dbfad6eeb86c5860d1b0d663515f3f8ecff6d8fc5eecc9fe593dbe6b6bdddd5a5fa62d7cae2b65386b7fdeda0d4ea58dd869f55773bde4eb7fbcbddede1f6787bba3ddfce51623f180fb71733643e7af24759983454afa4fbbfdede54f7f67efb48068a226ac97f7d7d3f2a6e9fb7afdbf76dc02b565f2cb35c58776c86d89a73162f6d6e43e3741bddc6b7c96d9abab759eadce6f1241ef77bf56f8bc80a5fa2eab6d4d4a8d394a85202f5ac199aa9599aadb1b16e5acdedade4e78fbbef3396c82759cc58f3345f0bb4508bf242d1d20ce3f287d3597fc25e1eb5584bb454cbfad981dd7b617e7a119385f624cdedad96f733a75668a5566917ad564325615ed0b65fe289b25322add15aadd3aedacdf84c1dd573979aa6e9da4a5b6b1b7ba16da99af0ebc8b03f2a8bb1ad7667dada9db653bba0b9bddbef2c7f37642dcfa1f8f22fc8926a7beda01db59376af3db008efce9cfa1f2c3bda71eb6451633568f92e43ed517bd29eb5b3f6a2bd46b935d2de8c85f61e4fb40f36269f2c216e94246ccb2767e999da97f6ad0d3436a6edeeefd98bf5dcee2c35f2b59136d6260a8bd955d72eed525db37111f562ef2fcbf2a84db59936d716da52578d7da8318f79673d9993b86e6fecb363518056b6bac26c79a71bbad92a9dab5bc64db77527327457c97596ee844e7fe622ce597e32d4033dd4233dd6133dedc7e0d74f98f5b2447e2f95bbd7333dcfebb2d20bf6fbfe0c84266b797c86ff2b3a16157aa957fa45aff5466ff5aedf11c3f2de39af8f322fa45ffb798faffbfaa6ebbe66817ed3355dd757fa5adfe85bfdcef850bff59dbe77c6d5413fe847fda4dfeb0ffaa3fe14bd07aece722db28dde4ef86e0bf3e78fe9e8e764adbfe8af4aa36ead86cdca34abf4f6eff075c43fbd8724c9f537fdbdb8ea1ffaa7fea57febcc07588affed6ed3ca56a3f7beea637afd3a561f4733895c33d687fa888dd0589fe8537da6cff585be5ca92b6565accc95e5eddd3c7ded778d38d5ca5e39b6e1eec90f0b0ff68b2cae7170dc95bbf2567e3c535f56415f310a4e2cdeea57df6a5a7bfb73b2048fab701505b355bc4a56e92a5be5ed78555807166b6efa5ccb3afe248bc9b28265dee5ceed8565b4b755b9aa5697555dcd568d3e5ab5b1c7f7c23129dcddaaeb76abab395e752c5bbbe3f66e626ef955166f7533e3b261f9d270a5b1f178e335567efeafaf2afd9571311f57fa6ab55a6bb362b8daacb6abbbcbc76ad75767d2a05f79b0b67d0ecf64796372ec983c0adfc570cff7819ef85efea3d8cf6bdcbbdf76e87ff8cd6abf3aac8ead1d7cb84edffa7e9e679aa6b63b6627bfcae2af4eab7b9643ad570fcdfbea919fce727f3a052c4f69fca971795a3dafceab176db67ad5ebd5dbea7df5b1fa8cbff26ef595f615a31fbbddf98749f7c177bc0f9d57f6795b7daf06d17e35147b2cfbbdbccd9339ee7739b58bd5a8d72e173b9358e3acdf65b1ceab717d67ec5693d574355bcd51c3b7708ec1fdf3314c92af16abe55a5d2b6b439badcdb5b5b6d7ceda5d7bc69e45cffb1f7bdefb489eaffb32097a7b62b3105fc7e3fba9f9beea7e36627e6318266b7f1dacc3c0091cbecb91452c6431bd17f85d967e7473dbd8d7efeb681dab77e20c2d9745f9b16be9cff8b1f03198af933c5d5bc1789daeb375be2ed6e5ba5a5fd6b5b5b437741601fbf7fbd5b30fbe57a25f6bb15a16fc34ceba757416dfb3e83e9ce9d77ecd807df6ebceefd6cc62bc50c8d2eeb411f366bfd90bd7d26374b7beadb53573e4b2fee5fed5793f628aba5eaf37ebedfa6ebd5befd787f5717d5adfaf1fd68feba790c5fdd69eef5ac1b8b04fbf9ef76a7e704b3e584bbedb9f5950bffba8f7e2eb7e97fcb1df83b63eaf5f02d736cc28effa73246c8e1feb193f73d2e7373edfafe4b23c69bb7e5dbf35cafa7dfdc1e617c8f2f7f78ffdf38ff3283f69566595d196e7f5e7fa6bfdbd1eac87eb11d335bea38c568b980e4db0afbf8fa6c6acc7cffc04c6b2dfadd7cbe90f7a7bea77569a43967505d5e0a69a713e6171d79d36d1f3f5b8f776eb49bfa3b61f93cb389f38de7aba9eade7eabdd8d32b674be7afc8f2d3d9621ecf798f6a11dcaf179774bdcc5f36ea46d9181bb37faead164ebf368979c230a77db5439cb4602336661ab91436d3dc39174ba1fd0a2caa7f6511e4ae0f0b36569fdfacc6cce59f8ce3c6c9271b77e36dfc4d607da94f56f35b9bfed2b8fc7eb6381a2a9ee2da55972acd26dc449b78936cd24db6c9f9aa0bcb6eac27ffdbf68bbc782effdf76ae6549552488eee733a6f615fdba7dbb6356a899203e5a6db51f3b4444f0c14b1489987f9faa8202a4bd37b457331113b9d010943a661645669d93b6d9e37b5a6207f5ce54d90a7b630ee6244ed8f3c2d4532060d9afca32ad349d280e4d481246103617866ae8b10a11c3b2b36c86248e1fe983506f36cb7bd7f59cde1344592e9dd23decc91c0e90c0115250a0014d680104cf80a691efb672cf7c667bc1191af13a6a6c8d2ed758790ea8a041fba8a546ca6681e23a2c67047dffd9b4a1130fb9e20cbad0833e2ce34747a706bc2c0e85fef98baee722bfd4f4404187dc51957668dcd0c2d0b660004318c12b8c61025378f3347fb13bb0acbe5df0f8ab3a31cdd0e01d3ee0136ee036e9c2ddb1ed7437f7e95459c13d7169c0bcfd003fe0117eb2bb700a4ff08c94def1b9eef5e9337dca1557dfc052a8ea8aefae6ed98c216b9d45ef4ffa485524aebeeaa181333471eeaa5edbb7f71bff47100423b4421517519a70a1686ff7106f632dbe471b97ebe0a027b3a4874ec8a276354cdffc603e255ca59dee228325a4b8c2354b719e8d29bbca113774bcb961e319c8f15c1f6327bd3884873ca043ee1bdcda7dce35430f7d0c30740718e10e636fed2f7ddd7f0cc2861b3aa1161991827b3cecfa8d66ec6112bce2115354f693204dfadb96d559cd6ccab25f967cd21655d61b3627a2d61336b0892d72a03dc20e53978ef868d8fa229f5faee75a7fe935c07eb745b764495b08ec7d0311d5f514356ca3bffd70224ff774bfb3f1822818bb5ad8461d3bd8c5de6e837df6fe0507fb088787258ef015c7d68bd0fa1a7cc79ef3f0a8623d21573237714a0f6bb636061dba66de58d0211dac1b76bfe293ef6039b59ad281736c393795d713791dceebf80ee712f96e3009ddd07544a5d179e13613e6e4967d435ca3ec245389a0cad56bfd58aad7bf7aee9fc122ff178e852391e3f3ba9c7d9399eff23a234758aeb7d96b869def6fe7fb0f468e60216ac18678a2378b9890bd31a42ee18c42f1d27b720dcf09969c1fb0909d7904e76ec356026184f0baafc89d66956e3da5fecbf6f6f369d67545d6b5c5d924df135a7ec542cb5e26e49a7cbfc201afa191da8093df3604f79408ae9ab0ad576031ca9ca3caca1635c83935653d22cfb448ce3bcf6adc752c32e62a9eb9443352aa19aaaae7e288acea1ab4729f2cb50e052bf5d4871cf952b02732ae47d9db635ea9689b453c57bc2062244752ad5f5e84c592fcc3e1ee4c949995795bc152fdbea830d827ffc84c20e9088f91d2fb395e4b665b520152c3422492ebf27dce3a1163b10a2cc60916c11710bad85b6ed69a7320cdc09db863ceee0a1533e20c1ccef6c814cd995eb334f9fc9ecf4b7ebda988b5c23b67b1108e04dff03d63da7fc32f8b9a5f4caeec2fc7c9c7e6f5bc5e154b795ce2e596e3679fca7dd222b624e3bc58134fe3a1e0bbcd199677fcb81c4b3d6a7ea7d6aeb0fb7e71ceb9a3f5738b7cbeda2ba7de3ba79caf57e52fff15fb1fcbbfd3fefcfbaf3ffe0193cc32fd</data> + </image> +</images> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>kcombobox.h</includehint> + <includehint>kpushbutton.h</includehint> +</includehints> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewallsystemsettingslinux.ui b/kmyfirewall/kmfwidgets/kmyfirewallsystemsettingslinux.ui new file mode 100644 index 0000000..4c45d9a --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewallsystemsettingslinux.ui @@ -0,0 +1,202 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallSystemSettingsLinux</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallSystemSettingsLinux</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>560</width> + <height>262</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>KMyFirewallSystemSettingsLinux</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="KComboBox" row="1" column="0" rowspan="1" colspan="2"> + <item> + <property name="text"> + <string>LSB Distribution</string> + </property> + </item> + <item> + <property name="text"> + <string>Gentoo</string> + </property> + </item> + <item> + <property name="text"> + <string>Slackware</string> + </property> + </item> + <property name="name"> + <cstring>m_cob_distribution</cstring> + </property> + </widget> + <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string>As Gentoo and Slackware are using non-standard SysV init system it is required to select your distibution in order to make the firewall install properly into your boot setup.</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignVCenter</set> + </property> + </widget> + <widget class="QLabel" row="5" column="0"> + <property name="name"> + <cstring>TextLabel1_2</cstring> + </property> + <property name="text"> + <string>Path to the defaul <b> runlevel</b> directoy:</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + </widget> + <widget class="QLabel" row="4" column="0"> + <property name="name"> + <cstring>m_lab_init_path</cstring> + </property> + <property name="text"> + <string>Path to the <b>init</b> directory:</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + </widget> + <widget class="QLabel" row="3" column="0"> + <property name="name"> + <cstring>l_path_ipt_2_2_2</cstring> + </property> + <property name="text"> + <string>Path to the <b>modprobe</b> program:</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + </widget> + <widget class="QLabel" row="2" column="0"> + <property name="name"> + <cstring>l_path_ipt_2_3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Path to the <b>iptables</b> binary:</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + </widget> + <widget class="KURLRequester" row="3" column="1"> + <property name="name"> + <cstring>m_url_mod_path</cstring> + </property> + </widget> + <widget class="KURLRequester" row="2" column="1"> + <property name="name"> + <cstring>m_url_ipt_path</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="KURLRequester" row="4" column="1"> + <property name="name"> + <cstring>m_url_init_path</cstring> + </property> + <property name="mode"> + <number>25</number> + </property> + </widget> + <widget class="KURLRequester" row="5" column="1"> + <property name="name"> + <cstring>m_url_runlevel_path</cstring> + </property> + </widget> + <spacer row="6" column="0"> + <property name="name"> + <cstring>spacer16</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Preferred</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>51</height> + </size> + </property> + </spacer> + <spacer row="6" column="1"> + <property name="name"> + <cstring>spacer17</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>41</height> + </size> + </property> + </spacer> + </grid> +</widget> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>kcombobox.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> +</includehints> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewalltemplatechooser.ui b/kmyfirewall/kmfwidgets/kmyfirewalltemplatechooser.ui new file mode 100644 index 0000000..778a705 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewalltemplatechooser.ui @@ -0,0 +1,474 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>KMyFirewallTemplateChooser</class> +<widget class="QDialog"> + <property name="name"> + <cstring>KMyFirewallTemplateChooser</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>580</width> + <height>401</height> + </rect> + </property> + <property name="minimumSize"> + <size> + <width>580</width> + <height>400</height> + </size> + </property> + <property name="baseSize"> + <size> + <width>500</width> + <height>600</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="caption"> + <string>Select a Ruleset Template</string> + </property> + <property name="icon"> + <pixmap>image0</pixmap> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QFrame" row="0" column="0"> + <property name="name"> + <cstring>frame5</cstring> + </property> + <property name="frameShape"> + <enum>Box</enum> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <property name="lineWidth"> + <number>2</number> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_help</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="accel"> + <string>F1</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_accept</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>&Load Template</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_cancel</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="accel"> + <string></string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget" row="1" column="1"> + <property name="name"> + <cstring>layout8</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>4</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><h3>Description:</h3></string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>lbl_description</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Template docu</string> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="alignment"> + <set>WordBreak|AlignTop</set> + </property> + <property name="indent"> + <number>1</number> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout10</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string><h3>Template Chooser</h3> +<p>Select a ruleset template you like to use as the starting point for your firewall setup.</p></string> + </property> + <property name="alignment"> + <set>WordBreak|AlignTop</set> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout9</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_close</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>25</width> + <height>25</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>25</width> + <height>25</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>x</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer5</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Preferred</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>31</height> + </size> + </property> + </spacer> + </vbox> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget" row="1" column="0"> + <property name="name"> + <cstring>layout14</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><h3>Available&nbsp;Templates</h3></string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + </widget> + <widget class="QListBox"> + <property name="name"> + <cstring>lb_templates</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>2</verstretch> + </sizepolicy> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>204</red> + <green>0</green> + <blue>49</blue> + </color> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + </widget> + </vbox> + </widget> + </grid> + </widget> + </grid> +</widget> +<images> + <image name="image0"> + <data format="PNG" length="685">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000027449444154388d6d93bf4b5b5114c73fef47f2a2491c02050d0551323445ec5014151497d2c176f0f7e41fd0a1438538bb75b385824eede4a654688b8a8b62a0b4521d148594686930d568f0477c7d2f2fcdbbb7439e62ad072e9c7beef77c0fe77bee51b8c504c40ea1cb80a8099603db0256ef817d13ab5cbf5cf8fd71b7b7f795d6d6f628108fab6a2482741c9cfd7dce37368ef717175fe6b6b6de3c85f27f045978ec1f1b9bad191808a9800a28aa8a140209b8807372c2b7d1d14fdb3b3b83cfa18887a300f11ccceacdcda17226839bc92032190887110707b85e0cd3241a8b3d09c3e465610d6004a64db8af99269aeb22b359945008bdbd1d717646697d1d676f0f3b9de664610169590fa2b0f2197e6a0262dfe115a088dd5d443a8d383cc4e8e8c0dfda8a1a8950cee7399d9ae26c799962a18004c584aa2578af66a1cbf15a118093cba1363541305811291ca6babf1f6118b8c522977dd74027e0532d88ea97627824d53d3d0407072b01d745f1f9a84f26919eea1ae0875ac0a72a60f9019ff750ddd242cdf0f0d568f3e3e3159e7c1ecdc3f92b056d40d155d8aef2923540334d144da3984c224e4fb16666b8686c24383444b8b5156b6d0d1db0210508bd08ab061c1b704701820d0d0014120910022595c29a9c243c3282717e0e547ed126cc032500bec08b5f208f40e60301595a5a92662221f3208f41dad3d3d29e9890471ee603641ba0feaacf39d0bfc2c70b90bf415a9a269dee6e6981b40c43da7575151fe426147ba10fd0ff598ad71098877747e0ba20c5b5e3822c815c866c5f25d9b8759900c6a0eb213cbb0b9d5550fb07ec1ca456607e0edefe802cb72dd30d53bc89f93c5f7882956f02ff02854c0fcf287a72340000000049454e44ae426082</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="20489">789cb5db5753643bb627f0f7fe1415adb78e09ddf4266ecc0390786f920426e641de6c208134904ccc77bf4aadff1670ea949be91b44f539bfd24eada59df29cfe8f7f7dbb393bfef6affff8c76c2ee6417d535ebc7cfb975e3c3cacfed7fffe9fffe71fffec36bef5dbdf068df6b7d63fffc73ffec9f437f58d29d968b4ecda5cd66e37b25571736d7d0637f1bca88de797c5f979df805b64fe08b7db14ff3d5b95f8ac36d5773e2fa6cf1bb88e372aa6f26931d5af60c4671bc5b93c6818f9f0d7e2f6da6a0177c866bfb8b3b698c15db279807b644ef5ebf23e8f8ae9fd9cc1688faa8aa93d9d62ca6f0c237f7e589cf3e316467be47d31950718ed91c3626acf098cf60853dccdf93dc2681f9b16e772760af7c9dc15f7b23d3cc0f347c5b93ccee121d94f8afb397efd3e05395e649b3a7fd581917f382bcef1fc068cfced4b712e8f23b8ce7f519cf311cf30f215f362caaf0d235f715c3cc8f5d51664656049162fc5c3fc7c5d9f82af8a45f616acc946c3a62df3f7db806d5be5e7a97f9a6683cac339dc6ceb6c1abfb66e8f3d87d11edb2fcef9fa4718edf1bde29cafba87d11e2be0ba3d4fc5397fb905a33d6a599cf3e5d730dac7bb30dac7e87ddad4be6c7d5a9cdba711af6eaf7a28366b3b07b7da793e0ab7709bcafd41712e67b9be343c11cf3c16e7fa7984eb78d3e25c9f3d825b54ceee8a7379181753bc4d18f9a8589ccbfd4bed4e9e4fe20ceee0f3abda546e167097ac5ac579fe317b708f2c1f8a69fedc85fb28af8a73b9bf84079d3cdf04fa7cb3cecf5dc3c8c7eec1881f0c8c78761346fdecac98e6b70318f1eca098e6877778d8a1f9a08205958b5e712ed7135892c551711effecb898c6ff06aca83cd6edd39d3c3e0ce5d7aaf3f1a730e2b12e8c786aaf38d767cf60d4afdbc5393e3b29cef1e40046fc70011be4b3846d278f47795e9cc71f6b905b0d94378ba9bc0737c9feae388f4f5b97b7c9f1ae98e6a37bb8439fe76fd9edbabd6e00237f358791afa0f7d52ef93cc2c84768b845f1c541718eefebf23a9f0aee20dfdbe25cee3e4cf3e50bdca572cd8af3f8e4c8b7d5238756711e8ff101ee9315b5a793eaa7f9a80da33ecd8b697eeac1a8dff0e25cae4770bf4bfb8f5631ede76a0fa8dcf3e25c5e4de1219533599ccbe356711e8faafebc20fbd7e23c1e75fd79496687c5b45fda861595c71bd874f37830545fb7ce57d5aee35d17e7cfbb3718f1ec1446fdeaa898e6875d5893c5a298f607e7c5d43f8730f2f30eb6545ea1be76a39bc767407eed7697c60bf5ff5e2aa7f9c516d37ee9b2387f9e3fc34db2fe30adbf0f708bca952aa6f16e8a69fc1cc21dca47ade06e37f77fd328a6f1b209f7bbb9fffb263cec52ffccebbbeed7ed8b0bb843f1e466712eaf4630e205569ce3c506dcc3f35bc534bfc4e2fcbcadcbfb64658b69bc1ec103e43b85913f3f814597c6e304d63d1a0fd43f0775bed54e718e27228c78b1f680cc3ac5395edc8305593c15d3f8aeeb57143f1c17d378bb80919fbc2bcee5a2011bb299c2b647eb7120771abddcdf2bc4ef34c996c6ebb0ae8f6fc2863eafde608be7693d19a6fa68bcdfc3cd5eeedfb60bb7c8e6b098f6fbb5db647d524cfd7f02777bb49eddc13db2a1fe2e527c8ab701a3fed88651bfad8a69bc1c16e7fa22833b54eece8a73b9ebc05d948f8b29bf3a3ef25337c5b41f9e15e7feadcfe13e95876e31ad6f6ff080ac9ee0618fd6a70758f472ff7434bfcbfaf3cec2f8bc8cc5b4de1d15d37efa161e52b95d15d3783b8511cfef14d37ada2ba6f1577f5e52b9b92fa6f20fd3fab7092bb80f1b7a9e356bf7693f897cba0d329fc1fd3e9d57a9fdaaae8f3d17e7f1263ab021ab666daa8fd1fca252fd79bcd95db84916cd625a8fdee11659edc3ed3edd27bcc15dcacfd3f7adebcfdb05dcc2f317709b9e3773b843d63770b79ffb7f65e05e3ff7f7302aa6f1b40ff7c9f2111ed0f362bf98d6afba7cd8cffd336ec2a69fbfcf403675fba286bb549fd985fb64fd504cf14730e2991e3cecd3faf6564ce7c7152cc8f602966456d7affa347edac5747e7c8135954b7cbed7e8d37989c6a34df9507c034b3c7f066b6abfda84f13ef47571eeafb20f5bb23f29a6fe48eba74df1e9bcc98ae97eac0937c962036e91e3126e937df120f7df90fba369d4f1dd63318daf8362aabf4f4ef1f3f316cfa7f8f9796961d4cffac5b4bfecc0dd01f5ff5931edc7eacf0fc8a15f4cf3377dbe59c7735b30ea3747708feab737c5b4ffdb8707833c3edc0c1e9259ab38c70b6fb01850ffdc2aa6fb1c054b2af7cfb0a27275594ce7afba7e4d0ef47cabfebc9bc0f8bc7e2ca6fe760beb41eecf7e0b36e4f05a4ce79d53d892e35971eeef6a40eeb706f9fb1415dc1ed0fe4e1553ffc8f38b69d79fb786dc6f90e30bdc2457cfc534bf5fc22db27b8551bfeac19d01edc72ab83ba0fdcfacf690e6f72edca3cf1b06f7e9f9b85b9b9e8f437830ccfda3cae713d3a9f30b0a467c7f0323be3a867b549fba86513f3b28a6f9ff0e1e90d54131c567f090ec7ab0c0e71d2c87b47f52c534dfdfc26a48e7917dd890459edfd2745ad7bf010baa8f5fc0a84fd6e58a2c5ac574ffb9036bd41f6033a4fe7b0e5bb25816d378c0e7070db2cbfb51d3abebf3fbb0a1f248fdab979ea7fddc31dc24c70fd3fda2845b43eaffef709bac0fe0ee90e6fb0d7830ccdf7ff5569cbfffaafefc7098bf7f97f723a69feaa7f5e51046fd610fee517dfaa598faa785517f382ca6fe7a090fa95cbf17e7f26a031682e6bb3e2c05f5efaa98f6ffb7b022bb2b580bfa7d4080ada0fd7e5e3fcda0cec79fc382eab7c7c574de7f84115f0f8be97c72052b2a37cd622ae7c5345f0718f9552fb011b9bf8a296cc94e1553fe349f0c860d780937e14531ed874431cdeff47e87757bc4268c7c7dab98f2abcb91af1dc1c8b79ac1c8376c17d378a3fc8625df398c7cbd2dcef9a95bb82568ff3585db647b5b4ceb451fee50b9b929cee59af211f5f3fc14c6f3ec15ee0adadf0d8ae9bc710ef7a89cbfc37d2ad7c7c5b45e287820e83ccf6129e8fcdb82b5a0f1503f6f24ed5768be90757d6e050fc8c117d37af3040fa9dc1f15d3fa53c112f9bc16d37895c5b4bf31c5b41fba8235e5e7eaf8c8d7e962ea3f785e34c8eea998f63ff77053d2f8443ea225a97f507f50297fba4fd880919f6dc30a66c5395f7b02e3fdba266c910fca533e749fff04231f7603b7c87abf98faf75631eda7105fb491ff23dc9574de9ec33d72a4fd8faee3f94571aedf4f61d4cf6f60d46f4e8be9fefc1eee906d03467cf75c9cfbbb8f30f231153c90b97f9b2b5848ba9fde832539d0f3a6aecf31386df072b985fb541ec7c5b9dc3ec103b21f1553fc3b7848e566554ce3af5f4ce3b301d7f9d69692cef30e56e42ac25ae6f1c25e8a693ddb848dccfdafaadb6b25edc769fcdb3a9e7b81ebfa038cfa7ca798ce43a7b0413c574cf7016d18f1ec7e319dcfe87d59d920fb19dc54b4fe9cc32db218c35d45f763f9fbb48df479ba7ff3c5747f7e0be3f366564ce79b43b84de5eaaa98d6e329dca17871a798cef36318f9c8ed62ba5ffb28a7df670fe01e95c7d3623adfd4ede953b9bd2ca6fb8171318d970b7840e586f26bd6f1e3338cfa4313467d5114e7fa5c8407f4792f8ae9f7595bf050d1f9e9021664e98a693cd5e592cac5a098d6bf87623a6f5dc28a6caee134e5e5f879bf625bf5f3b6369e7777b0268bcb62eadf5318f5c983623a6f1d16d3ef9b56b0a572be5b4ceb137ddfa97791d9a0388f07e9e1265948b8450e1fa6f1f40e7714cdf71cee6adacfd1fb6dd7edad3e9cf3b36fb0a6f6854b18f9eb2eb9cecf2d61e4e72e8b69bdda2ea6f5fe0a46be4e14d3feb7fe7c9bec3d8cf6c84318ed916db8a7697f3a85fb9ac65b80879af667797db69d3a5eb881db547fb470972cce6a533cb60ff7c8fea998ce7b7db88f7c6a0f281f7b5d4cfbdb7b18f9994d58681a6f02969aee27eaf84ad37dde02d6e4f8061b7255d76f35edf7f27c68bb753e66ab98ce9b11463ee216463ee2159664bf574ce3fb045664dd84919f0b30f233dd62daaf9ec1c8d753ffeed5ed8def30ead3f47da66f43d3f866701316c5b43e6ec32db269c16d4dfbd583621a7f377087caf5aa98caebfabb9aeef3e6f040e7fe63683cf7ebcf8bad621abfb198fefb140ba33e7e06f750ee8b693dbc83fb643d83ebf80e1e92dd516d43ebe1232cc8ac2aa6fbed3a9e845bb031741ea3f96c90f2a5fdf7a498f6cf6f30f2611c467c3d80112f9cc088a71cac0cdd1fdec19a5c3dc0c847ee17d37a56d767c97e504cfd93d6bb816990ad869b86fadb4131ddcf1dc12d2a97d43f87291f9a5f3c5ce7a38b69fcbcc188afe8fb1dd6f1f56b31c547fd753e7a09b7281f5b3fdf26f3db625abfaee18ec9e3c12de02e3938b867687da3f7917a03e5eb4c31dd07ddc175fcf7625a4fc730f2619362babf3929a6fb140e233f1560e4a7ef8a69bc8e60e42b4f8ae97ef3b998c62783fbf8fc73319d1f87f0802c57c5f4f923784836efc5745e8cc5341eebfa053d1f9bc5b43ef760490ea7c5345e3bb0a2fae25331ed6fe9fdcad43efafdfd4531ed27028cf6987631e5bf01237f3e28a6f5761746befaa298dab7534ceb63fdbca472e68b69bccf6a5b5a2f8f61b4c7c9da541e57b0a6726d6a53b979818da5f3eba898cea70dd8d2f3f2a998ceb3b45ea56cc866bb98d6bb21dc247b7a7faa6eaf5fc168afbe82d11eb65d1bed71c5741e58c09a2cce61b447ee14d3797c025b2ab71fa6fd04e2d7ed51a3623a3fbcc0688f5e14d37d54fdf916da2f8ae9bcd02ba6fbe60edca672362ca6f344843b96e6c73a7e97ac03dcb3b4ded7f1fa96f6df37f0c0d2efef683f987a03e5e7e8fdeaba3d952ca6f68c61e46fb78b697e6fc2c8970f8b29df6b18f957aa987eff7303a33d6c594cf7dda730da2767c5741e0930da2b79319d278e61b45f8c8ae97c710f0ff17c9d5f3a10e7720fa70d7b2eefc28aacdf8a69fea1efd3d4efc71dc2687f98c3685f3828a6efeb18467bf5bc98da3b84ebf6edc1689ffe30cdcf1e46fbf46e31ddef3f14d37eac0f0b2a97cfc5b41ef862baffb88625958b4931bdaf3a7fbc2fd929a6ffdea02ed7f04e31cd7f0bd890e56e31cd0f63d8923dbd1f5bb72f7661b427f68a29ff00d7f94e60e4277660e4275831e577051b94f362baffd82ea67c7761e47b3effd50f675ca43f92b3f4ef8a6b2ed33fe5af3ff7f1f3db71520c6eb8e58e7b1e92fe28ca1fc4d1e94fe09157fc9e3ff0476ad1ba7dffce38b9ce297fe2cffc85cff89c2ff8f2cfdedc1fbcb757fec657fc9d6ff04dbec547e9e7dfde9efcfd3bbecd77f82edfe3fbfc801fe6361efd37c439e627fc949ff1737ec12ff9151fffb7bcb711bfe6137ec36ff91d6ff0266ff136effcbbe2acfb2f7e46bccb7bbccf077cc838634c30c98f99627afdee7efd3dfd2cce4794f4ef236698658e7916586415bb670fec914df992ad7bfcff479c4f6dc9ed614fec99bdb0199bb3055bf233f6caded88a8fd9fbeff4bb1fc5412ba63cb0f59f8df4b3c9b6d8886db31db69b62edb17d76c00ed9519a257ea377ff308e4a913abccd8e79c54e78979db23376ce2ed825bb62e314e99a4dd80dbb65774cd17b5bffef8f23fe7d9cfcb9a354778335598bb5598775598ff5d9800dd384bacb760513eb6b7625d261793d6629b73f6d0fc5e1c7698171c23327029f88282a71cf961427457a108f622a9ef8b578162fe9d91945fbb338e94789b95888a578156f6225dec586d8145b6224b6116747ec8a3db1cf7ae2401cf24b71248e7f1ce987df4f9ad1c449aae1549c897371212ec595188b6b31a128290e1737e256dc8986688a96688b8ee8aee7d7bfff8e7ed21ec65f454ff4c5400c53e763524899c6e8a28ec376a5927a7dd811413ae96590515669edd07f17e9877152af96f7f2413ecaa97c6273f92c5fe44cce3fa2ac5b24177c572ee5ab7c932bf92e37e4a6dc621b7f379e7ef2de14db90951cc96db9c3167297edd43de0538bf6e4be3c9087f2481ecb13792acfe479ea0f7fd3bfff1aa78cffbc4a8b9ebc9097f2eafb08681193637e27aee5b59ca4d6dec85b79271b6ce3f7de5b8ec2f27b6bca966ccb971fc6d9969d9cd624fd5b57f6d23beecb811c7e3f92be6f0fbdb5fcbf8b34296ca83431ff280e46ec36bead995aff4a4c29fd7dfffe1a278fcf119fa6b9248df1f5c1514c9553fec7513e5a96fe4c54482b544f4555fd2a0e0fea5e3dc82df5c85fd5543db17bf52c3bbf8e432d522ff240cdd45c2d300fb37acda538182f926da8a57a556f6aa5def9b1da509b6a4b8d04fbcd38db92ab6db5a376f9625d775a3158fd4d7c6e0f976aa1f6d4be785707ea30453952c7ea449dd633cd6f449aa83375ae2ed27e689abf0159ef5ceb381439cd345a5daa2b3556d76aa26ed4adba93cfbf1b258da70e1fa8866aaa966af376fa13d23c94dfdf477bd6bb24b5fe1d444ff5c5a36a8853355057a2f4a7dffad9512335e44dcd35d3eb5fbf467142adf81a874d99d44a6b6dd291c1a51fafc3cffaf4dff4baa58ebad2f7fa41b4f4a39eea273efe1c87e60031d7cffa45cff45c2ff452bfaa917efb83d6a43862a457fa9d09bd210ff4a6ded2a334878f3e7d3feb384b65f889ded63bcacb8eded57bb2f32751d63fe9935aefeb037da88f52bec7fa449faef7791fef4d9fadf768fa9c31c9d81c6fe18f62504fd0173af524792384bed2637dad27f2fe739cd49eb16ae91b7d2b17794ff3fff6b390337d27de7423f5f153dd6407ba95764ca32fe327e8b6eee8aeeefdc977ffddcf8ede4d33629a59f5fa371043b9c98f3f7f3f69fc4e0d374c378df8759cf48db3cf6beb77a579bee3b7461a6534b5a7de79a9b631e948eb8cff8d3813138cff793f9113134d65ee559a97739cd4d3f8ab79308f666a9ef432eda07f1585f1a1be33cf6997f593b94f30f3626666ce566c23c71989b95998a579356f6665de7f3d6fa6d66c984db36546695ffa93776bb6cd8ed9357b7c9cef5df6cd8139947d73648ef9ae1afdbab749654ef4a6393567f2fac7ef58f0d49e7373b1deede7fb85e7b43dba3457666caea5947bbf6ccdb63c361373636ed9c8fc6c75dae1037397be9f074eff3fbeb66998a66999b6e9881b36ff751c3d375db1343dd3370333fc515f9013cb2dd3f7a9bf4df37de2fa3f445156a77edff99d119a7aed8d6ce7fb266b9d18fee8cdc967eb6db0319d6ca95f5fdbcadefff40dfce5bdeb857db08f762a3af6c93effe00d8cd7ad56693eb02f14272d02333b376d39f959dde9edd4e37287cde4a95dc8a65d9a27fb9ac63e4f7fb7f8ee13c2be49abdb6a41f3013376652a7df1d7f6a49d5287cdf3c8e6eb712968a7301613fb9eb6d51b76d36ed9515a71b90936ed0dfef2cee7768739bb6bf7e43da7ff3f46144dbbafaffe326e76f45c3ef161da03a62872a15f538bf7d6ed4ab51ed843fd6c8fe4a63dd633f322f7451a4bfaebb733e777f6c49eda337b4ee35456f6c25eda2fbbdb54dbd08eb54e278219db497bda37e9ec35f3eb9e6227e2d2deb01eef8a277b6befd21679661bba699b1f35ac67d1f5bdbcedac6f9be97ed50ef4b51dcaf197383b72e1b84b47392765c74ea477ca69edd35cbfeb8cb8725645e76474de05732e3778da87dbc9478f4863ecd98e5d7495bb770f664171dca39bcaf1e76f523c48e99e44cb3deb659a2f8fdc8b9bb9b939770b3e704bf7eadef8b1d9635b6ee5dedd86db745b72db8d3ef73cd971db6ec7edba3db7afe6887360ae85f8dc6a7728eef98ee989a93b72c72ab81377eacedcb9bb7097eeca8dddb5385153bee9266edf2ec522bd91d49e4f6f24bd1d397737eac56caa9ebb2dedb913a26e4fea0fd7e63dbd8dbebe778df51ca6ef5cd3b55cdb755cd7f55cdf0dd8299fa6f9aaed869ecb8a353cf322edc1265fe78634c3052fbdf2741f7ce6cd7a7f5bdedbb5362e78cb27dee947efc5d0071fed4a3ef8cadffb07d615cf2c9d3cd2c96de11fc59c9dfa8aeffba919a4efb1f3358eb8f14ffed92cf3bdf18b5df89936d4ffd36efcd4cffdc22ffdab6cfab7f55ed1af84f7efaac54ed319e2de6fac77b47947b1beed5bb20df3e837fd961fa559f8f8cbd858d8a6df4e637592e78347bf632abf8b5d0e97d77ecfefeba98afec01ffa2329fdb17df027fe348db8913f4b273df5716bb95e25c5093bb34b7fae57267c6d8f1af90bf6e02ff3f8d93287feca8f05da2367a6ab95bf566d3f716ffe465fea3beffdadbf4b27359c373e9dfcd2dff8865afaa66f8947fd7537b6e3dbbee3bb6c95df5b8f9ff8be1fe4bb8131dbf54356051e9878497daac57bec35a4a37b507c9e6644dce4d4e725ba150b3a18b6156c70e2cb1cb93e3f041f02bfceebdcdc3bf11ea218d53d5fb25085fbf0904ec2cf698bfd18a6e1293c871736fdbb5b5e55a5b3d26e98f9a7b423fb347789ed300f0badec34e47eb0bef708afe9bc7b5d9f34d3eeba1bdebc4efbfa0d75ef6ec32abc870dd635fbdfc749df8ed193b019b6acfe7a86d16fe6ddeef3953f55793ee0af76338cd848a027a43136d2b3b01d76f8f5fae64dccc3aed07aa2eef9f4e38631c7483b74b5602b330d7b61df6e7f99b9783850dbe1301cc92d5a7f98925be1382d7d279871c76c1e4ee5366f9ad49372dfb5e12cfddbf8d339162742791fce03f337f6810f3e8f52b19d06e79dde9467e142cc68fde18a4dddad9b844bf9c476f27a93e67eb115aed48579ac6f1d3eff4ea13edfca611887ebd41367fc36f5b44fad919d300969a7924ebacbf5e91bfbc471b80d77a1a1d7bb0a4ecf311f9a6e3fb4524f6870f3354ebe6f1cd917bbc94fcc6568a7d5837f99db76424731b90c5df9b01e0b258ee08bd00bfd300843ba2d48f3fa9e7291bbcd5457f8febe269d2ddaec2432731b4594eb35eae31c23277c68efa28a3adf941d7d3e6ff3b13e154fd1441b5df4f9dd31bd88412c63e4711da9de85af671bb5e05beed67763e5966614ef3fcdf469edd50b7ea6f7653f3eac6fb869c495fb8374d6b683d08d8f711a9fe433edf7e5517c8e2fcac659ee0f79ecf3699cb3b3b888cbf81adfe22af5e58f752b9d49988fef71236ec62dfe94665af5f9bc4df72d71a4db7e47bfc76d792267eb7387f17a1977e26edc0b63feba6e0b53e97d3d8655dcf733c6d3eea33e31a45532ed4f9af1201e9abedad7693609fa63b47dba0f49db16be708378148fede5faee30ed40983c8e27f1349ec573be254ee20577b272e37819afd279217c8c7e39497be1b6e9c6b1ea99c378bdde7b7cee375fef43d6bfad70437ded6d3ad5dda59d763a419aa1d471a21fe24dbc8d777c1e1bd2fac82a79fd69955ec8e7d814b7b1c55acada3dbc65f611e9e33e24bffb43b68a6dd7f0511e46193bb11b7b7a37ae623f0ee230bec4978a57ac12512857c9b49f9bd08f7cae543ca9741cc833d76647eb79e2eb38f8720e963c885e652a5b39b3a9576977dc3227954fb37d530cfcac0a55642f5595761c97d5bd78ac1ecc09fd48ad9c3df0be7a0ccf555acff36dfe9779f02f71c66c553d55cff1b27aa966d5bc5ac865b5ac5eab17bd91feee6dfdabdc6a55bd571bd5663593cbfa273d33b723fd2eda69ad69ac578fbfceb67fbd4f6447fed25f8bc3c06cacb6423a42565beb7f56a36a641ad5f6fa6ff2dfeeaccbcbcf68fda356d5aee8e61bdfefef61ffef7ffee3bf00ce86dc04</data> + </image> +</images> +<connections> + <connection> + <sender>b_accept</sender> + <signal>clicked()</signal> + <receiver>KMyFirewallTemplateChooser</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>b_cancel</sender> + <signal>clicked()</signal> + <receiver>KMyFirewallTemplateChooser</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>b_close</sender> + <signal>clicked()</signal> + <receiver>KMyFirewallTemplateChooser</receiver> + <slot>reject()</slot> + </connection> +</connections> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kmyfirewall/kmfwidgets/kmyfirewalltransactionlog.ui b/kmyfirewall/kmfwidgets/kmyfirewalltransactionlog.ui new file mode 100644 index 0000000..7f50160 --- /dev/null +++ b/kmyfirewall/kmfwidgets/kmyfirewalltransactionlog.ui @@ -0,0 +1,344 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KMyFirewallTransactionLog</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KMyFirewallTransactionLog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>520</width> + <height>467</height> + </rect> + </property> + <property name="caption"> + <string>Transaction Log</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QTabWidget" row="0" column="0"> + <property name="name"> + <cstring>tabWidget2</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>tab</cstring> + </property> + <attribute name="title"> + <string>Undo/Redo Stacks</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QSplitter" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>splitter4</cstring> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="opaqueResize"> + <bool>false</bool> + </property> + <property name="childrenCollapsible"> + <bool>false</bool> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout3</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>m_lbl_lvUndoTransactions</cstring> + </property> + <property name="text"> + <string>Undo stack</string> + </property> + </widget> + <widget class="KListView"> + <column> + <property name="text"> + <string>Name</string> + </property> + <property name="clickable"> + <bool>false</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>ID</string> + </property> + <property name="clickable"> + <bool>false</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>m_lvUndoTransactions</cstring> + </property> + <property name="rootIsDecorated"> + <bool>true</bool> + </property> + <property name="fullWidth"> + <bool>true</bool> + </property> + <property name="shadeSortColumn"> + <bool>true</bool> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout2</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>m_lbl_lvRedoTransactions</cstring> + </property> + <property name="text"> + <string>Redo stack</string> + </property> + </widget> + <widget class="KListView"> + <column> + <property name="text"> + <string>Name</string> + </property> + <property name="clickable"> + <bool>false</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>ID</string> + </property> + <property name="clickable"> + <bool>false</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>m_lvRedoTransactions</cstring> + </property> + <property name="rootIsDecorated"> + <bool>true</bool> + </property> + <property name="fullWidth"> + <bool>true</bool> + </property> + <property name="itemsMovable"> + <bool>false</bool> + </property> + </widget> + </vbox> + </widget> + </widget> + <widget class="KPushButton" row="1" column="1"> + <property name="name"> + <cstring>m_cmd_clearStacks</cstring> + </property> + <property name="text"> + <string>Clear stacks</string> + </property> + </widget> + <spacer row="1" column="0"> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>225</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>tab</cstring> + </property> + <attribute name="title"> + <string>Application Log</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout4</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>m_lbl__transactionLog</cstring> + </property> + <property name="text"> + <string>Transaction Log</string> + </property> + </widget> + <widget class="QTextEdit"> + <property name="name"> + <cstring>m_txt_transactionLog</cstring> + </property> + <property name="textFormat"> + <enum>LogText</enum> + </property> + <property name="undoRedoEnabled"> + <bool>false</bool> + </property> + </widget> + </vbox> + </widget> + <widget class="KPushButton" row="1" column="1"> + <property name="name"> + <cstring>m_cmd_clearLog</cstring> + </property> + <property name="text"> + <string>Clear log</string> + </property> + </widget> + <spacer row="1" column="0"> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>201</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>TabPage</cstring> + </property> + <attribute name="title"> + <string>Statistics</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QTextBrowser" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>m_txt_stats</cstring> + </property> + <property name="font"> + <font> + <family>Nimbus Mono L</family> + </font> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string>Object statistics:</string> + </property> + </widget> + <widget class="KPushButton" row="0" column="1"> + <property name="name"> + <cstring>m_cmd_update</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Update</string> + </property> + </widget> + </grid> + </widget> + </widget> + </grid> +</widget> +<includes> + <include location="local" impldecl="in implementation">kmyfirewalltransactionlog.ui.h</include> +</includes> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>klistview.h</includehint> + <includehint>klistview.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kpushbutton.h</includehint> +</includehints> +</UI> |