You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmyfirewall/KMFSysTray/kmfiptwatcher.cpp

307 lines
10 KiB

/***************************************************************************
* Copyright (C) 2005 by Christian Hubinger *
* e9806056@student.tuwien.ac.at *
* *
* 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. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "kmfiptwatcher.h"
// QT includes
#include <tqtimer.h>
// KDE includes
#include <kdebug.h>
#include <klocale.h>
#include <kapp.h>
#include <kapplication.h>
#include <kmessagebox.h>
#include <kapplication.h>
#include <kmessagebox.h>
#include <dcopclient.h>
// Project includes
#include "../core/kmfiptdoc.h"
#include "../core/kmferror.h"
#include "../core/iptable.h"
#include "../core/iptchain.h"
#include "../core/iptrule.h"
#include "../core/iptruleoption.h"
KMFIPTWatcher::KMFIPTWatcher( TQObject *tqparent, const char *name )
: TQObject( tqparent, name ) {
m_queryExtendedInfo = true;
m_doc = new KMFIPTDoc( 0, "iptdoc" );
go();
}
KMFIPTWatcher::~KMFIPTWatcher() {}
void KMFIPTWatcher::go() {
// KMessageBox::information( 0, i18n( "go()" ) );
m_timer = new TQTimer();
TQObject::connect( m_timer, TQT_SIGNAL( timeout() ), this, TQT_SLOT( timeout() ) );
m_timer->start( 3000, false );
}
void KMFIPTWatcher::timeout() {
// kdDebug() << "timeout()" << endl;
DCOPClient *client = kapp->dcopClient();
TQCString reply_type;
TQByteArray params;
TQDataStream stream( params, IO_WriteOnly );
TQString arg = "filter";
stream << arg;
TQByteArray reply_data;
if ( ! client->call( *( new TQCString( "kmfiptinterface" ) ),
*( new TQCString( "KMFIPTInterface" ) ),
*( new TQCString( "numChainsInTable(TQString)" ) ), params,
reply_type, reply_data, false, 10000 ) ) {
// KMessageBox::information( 0, i18n( "Error with DCOP: %1" ).tqarg( kapp->dcopClient() ->appId() ) );
emit sigUpdateActive( false );
} else {
TQDataStream answer( reply_data, IO_ReadOnly );
if ( reply_type == "int" ) {
int result;
answer >> result;
// KMessageBox::information( 0, i18n( "Got answer %1" ).tqarg(result) );
emit sigUpdateActive( result > 0 );
} else
KMessageBox::information( 0, i18n( "Calling over DCOP succeeded, but the answer had wrong type!" ) );
}
if ( m_queryExtendedInfo ) {
queryExtendedInfo();
}
}
void KMFIPTWatcher::queryExtendedInfo() {
queryChainsInTable( "filter", m_doc );
queryChainsInTable( "nat", m_doc );
queryChainsInTable( "mangle", m_doc );
kdDebug() << "emit sigUpdateIPTDoc( m_doc )" << endl;
emit sigUpdateIPTDoc( m_doc );
}
void KMFIPTWatcher::queryChainsInTable( const TQString& table, KMFIPTDoc* iptdoc ) {
kdDebug() << "queryNumRulesInChain( const TQString& table, const TQString& chain )" << endl;
DCOPClient *client = kapp->dcopClient();
TQCString reply_type;
TQByteArray params;
TQDataStream stream( params, IO_WriteOnly );
stream << table;
TQByteArray reply_data;
if ( ! client->call( *( new TQCString( "kmfiptinterface" ) ),
*( new TQCString( "KMFIPTInterface" ) ),
*( new TQCString( "getChainsInTable(TQString)" ) ), params,
reply_type, reply_data, false, 10000 ) ) {
emit sigUpdateActive( false );
} else {
TQDataStream answer( reply_data, IO_ReadOnly );
if ( reply_type == TQSTRINGLIST_OBJECT_NAME_STRING ) {
TQStringList result;
answer >> result;
IPTable *tableObj = iptdoc->table( table );
kdDebug() << "Filling Table: " << tableObj->name() << endl;
TQPtrList<IPTChain> *used = new TQPtrList<IPTChain>;
for ( TQStringList::Iterator it = result.begin(); it != result.end(); ++it ) {
kdDebug() << "Found Chain" << *it << endl;
IPTChain *chain = tableObj->chainForName( *it );
if ( ! chain ) {
TQString tg = "ACCEPT";
tableObj->addChain( *it, tg, false, new KMFError() );
}
fetchChainPolicy( tableObj->chainForName( *it ) );
fetchRulesInChain( tableObj->chainForName( *it ) );
used->append( tableObj->chainForName( *it ) );
}
TQPtrListIterator<IPTChain> it_chains( tableObj->chains() );
IPTChain* found_chain = 0;
while ( it_chains.current() ) {
found_chain = it_chains.current();
bool found = false;
for ( TQStringList::Iterator it_all = result.begin(); it_all != result.end(); ++it_all ) {
if ( *it_all == found_chain->name() ) {
found = true;
}
}
kdDebug() << "Found chain: " << found_chain->name() << " " << found << endl;
if ( ! found ) {
tableObj->delChain( found_chain );
}
++it_chains;
}
} else {
KMessageBox::information( 0, i18n( "Calling over DCOP succeeded, but the answer had wrong type!" ) );
}
}
}
void KMFIPTWatcher::fetchChainPolicy( IPTChain* chain ) {
DCOPClient *client = kapp->dcopClient();
TQCString reply_type;
TQByteArray params;
TQDataStream stream( params, IO_WriteOnly );
stream << chain->table()->name() << chain->name();
TQByteArray reply_data;
if ( ! client->call( *( new TQCString( "kmfiptinterface" ) ),
*( new TQCString( "KMFIPTInterface" ) ),
*( new TQCString( "getChainPolicy(TQString,TQString)" ) ), params,
reply_type, reply_data, false, 10000 ) ) {
emit sigUpdateActive( false );
} else {
TQDataStream answer( reply_data, IO_ReadOnly );
if ( reply_type == TQSTRING_OBJECT_NAME_STRING ) {
TQString result;
answer >> result;
kdDebug() << "Found Chain Policy: " << chain->table()->name() << " " << chain->name() << " " << result << endl;
chain->setDefaultTarget( result );
}
}
}
void KMFIPTWatcher::fetchRulesInChain( IPTChain* chain ) {
kdDebug() << "fetchRulesInChain( const TQString& table, const TQString& chain )" << endl;
DCOPClient *client = kapp->dcopClient();
TQCString reply_type;
TQByteArray params;
TQDataStream stream( params, IO_WriteOnly );
stream << chain->table()->name() << chain->name();
TQByteArray reply_data;
if ( ! client->call( *( new TQCString( "kmfiptinterface" ) ),
*( new TQCString( "KMFIPTInterface" ) ),
*( new TQCString( "numRulesInChain(TQString,TQString)" ) ), params,
reply_type, reply_data, false, 10000 ) ) {
emit sigUpdateActive( false );
} else {
TQDataStream answer( reply_data, IO_ReadOnly );
if ( reply_type == "int" ) {
int result;
answer >> result;
TQPtrList<IPTRule> *used = new TQPtrList<IPTRule>;
for ( int i = 0; i < result; i++ ) {
TQString rn = TQString("rule_%1").tqarg( i );
IPTRule *rule = 0;
rule = chain->ruleForName( rn );
if ( ! rule ) {
rule = chain->addRule( rn , new KMFError() );
}
fetchRulesProperties( rule, i );
used->append( rule );
}
TQPtrListIterator<IPTRule> it_rules( chain->chainRuleset() );
IPTRule* found_rule = 0;
while ( it_rules.current() ) {
found_rule = it_rules.current();
bool found = false;
for ( int i = 0; i < result; i++ ) {
TQString rn = TQString("rule_%1").tqarg( i );
if ( rn == found_rule->name() ) {
found = true;
}
}
if ( ! found ) {
chain->delRule( found_rule );
}
++it_rules;
}
} else {
KMessageBox::information( 0, i18n( "Calling over DCOP succeeded, but the answer had wrong type!" ) );
}
}
}
void KMFIPTWatcher::fetchRulesProperties( IPTRule* rule, int index ) {
kdDebug() << "queryNumRulesInChain( const TQString& table, const TQString& chain )" << endl;
DCOPClient *client = kapp->dcopClient();
TQCString reply_type;
TQByteArray params;
TQDataStream stream( params, IO_WriteOnly );
stream << rule->chain()->table()->name() << rule->chain()->name() << index;
TQByteArray reply_data;
if ( ! client->call( *( new TQCString( "kmfiptinterface" ) ),
*( new TQCString( "KMFIPTInterface" ) ),
*( new TQCString( "getRuleProperties(TQString,TQString,int)" ) ), params,
reply_type, reply_data, false, 10000 ) ) {
emit sigUpdateActive( false );
} else {
TQDataStream answer( reply_data, IO_ReadOnly );
if ( reply_type == TQSTRINGLIST_OBJECT_NAME_STRING ) {
TQStringList result;
answer >> result;
if ( *result.at( 0 ) == "ERROR" ) {
return;
}
rule->setTarget( *result.at( 0 ) );
} else {
KMessageBox::information( 0, i18n( "Calling over DCOP succeeded, but the answer had wrong type!" ) );
}
}
}
void KMFIPTWatcher::queryNumRulesInChain( const TQString& table, const TQString& chain, KMFIPTDoc* doc ) {
kdDebug() << "queryNumRulesInChain( const TQString& table, const TQString& chain )" << endl;
DCOPClient *client = kapp->dcopClient();
TQCString reply_type;
TQByteArray params;
TQDataStream stream( params, IO_WriteOnly );
stream << table << chain;
TQByteArray reply_data;
if ( ! client->call( *( new TQCString( "kmfiptinterface" ) ),
*( new TQCString( "KMFIPTInterface" ) ),
*( new TQCString( "numRulesInChain(TQString,TQString)" ) ), params,
reply_type, reply_data, false, 10000 ) ) {
emit sigUpdateActive( false );
} else {
TQDataStream answer( reply_data, IO_ReadOnly );
if ( reply_type == "int" ) {
int result;
answer >> result;
} else
KMessageBox::information( 0, i18n( "Calling over DCOP succeeded, but the answer had wrong type!" ) );
}
}
void KMFIPTWatcher::worked() {
KMessageBox::information( 0, i18n( "Callback Worked" ) );
}
void KMFIPTWatcher::slotQueryDetails( bool on ) {
kdDebug() << "slotQueryDetails( bool " << on << " )" << endl;
m_queryExtendedInfo = on;
}
#include "kmfiptwatcher.moc"