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.
tork/src/tork.cpp

4494 lines
148 KiB

/***************************************************************************
* $Id: tork.cpp,v 1.202 2010/07/24 12:18:36 hoganrobert Exp $
* Copyright (C) 2006 - 2008 Robert Hogan *
* robert@roberthogan.net *
* *
* 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 St, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include <qdragobject.h>
#include <kprinter.h>
#include <qpainter.h>
#include <qpaintdevicemetrics.h>
#include <qtimer.h>
#include <qgroupbox.h>
#include <kconfigdialog.h>
#include <kglobal.h>
#include <klocale.h>
#include <kiconloader.h>
#include <kdeversion.h>
#include <kmenubar.h>
#include <kstatusbar.h>
#include <kkeydialog.h>
#include <ksqueezedtextlabel.h>
#include <kedittoolbar.h>
#include <ktoolbarbutton.h>
#include <krun.h>
#include <kstdaccel.h>
#include <kaction.h>
#include <kstdaction.h>
#include <kpopupmenu.h>
#include <kprocio.h>
#include <kmessagebox.h>
#include <dcopref.h>
#include <kconfig.h>
#include <kmessagebox.h>
#include <klocale.h>
#include <kpassivepopup.h>
#include <kio/netaccess.h>
#include <khtml_part.h>
#include <dom/html_misc.h>
#include <kurl.h>
#include <khtmlview.h>
#include <kstandarddirs.h>
#include <ktip.h>
#include <kwin.h>
#include <knotifyclient.h>
#include <klistviewsearchline.h>
#include <qtooltip.h>
#include <qlabel.h>
#include <qfile.h>
#include <qdir.h>
#include <qtabwidget.h>
#include <qhostaddress.h>
#include <dcopref.h>
#include <dcopclient.h>
#include <kcmdlineargs.h>
#ifndef EXTERNAL_GEOIP
# include "GeoIP-1.4.0/libGeoIP/GeoIP.h"
#else
# include <GeoIP.h>
#endif
#include "tork.h"
#include "crypto.h"
#include "configdialog.h"
#include "quickconfig.h"
#include "torkconfig.h"
#include "functions.h"
#include "dndlistview.h"
#include "newfirstrunwizard.h"
#include "introwizard.h"
#include "serverwizard.h"
#include "warnings.h"
#include "questions.h"
#include "portsandicons.h"
#include "likeback.h"
#include "version.h"
#include "hiddensrvs.h"
#include "../config.h"
tork *kmain = 0L;
using namespace tk;
const char *dayweekmonth[] = {
"day",
"week",
"month"
};
QValueVector<QString> serverCondition(9);
QValueVector<QString> logType(5);
QValueVector<QString> torkifyApp(5);
QValueVector<QString> torTrafficType(9);
QValueVector<QString> nonTorTrafficType(9);
QValueVector<QString> subnetType(256);
QValueVector<QString> countryType(256);
tork::tork()
: DCOPObject( "DCOPTork" ),
KMainWindow( 0, "TorK" ),
m_view(new torkView(this)),
m_printer(0),
m_servererrornag(true),
m_contactinfonag(true),
m_serverworking(true),
m_toolTipShowing(false),
waitingForServers(false),
stillStarting(false),
m_DNSTorified(false),
m_showstopperAlreadyDisplayed(false),
m_routerDiscovered(false),
m_ShutdownRequested(false),
m_CanApplyServerSettingsIfSet(false),
myHiddenDialog(0L),
privoxytest(0L)
{
// Register with DCOP
// if ( !kapp->dcopClient()->isRegistered() ) {
kapp->dcopClient()->registerAs( "tork", false );
kapp->dcopClient()->setDefaultObject( objId() );
// }
kmain = this;
client = 0L;
childproc = 0L;
privoxyproc = 0L;
netstatproc = 0L;
tfPrivoxy = 0L;
tfTor = 0L;
bwtimer = 0L;
bwLimitTimer = 0L;
updater=0L;
serverCondition[0] = "All";
serverCondition[1] = "Valid";
serverCondition[2] = "Fast";
serverCondition[3] = "Authority";
serverCondition[4] = "Named";
serverCondition[5] = "Exit";
serverCondition[6] = "Running";
serverCondition[7] = "Guard";
serverCondition[8] = "Stable";
logType[0] = "All";
logType[1] = "NOTICE";
logType[2] = "WARN";
logType[3] = "ERR";
logType[4] = "DEBUG";
torkifyApp[0] = "konversation";
torkifyApp[1] = "kopete";
torkifyApp[2] = "gaim";
torkifyApp[3] = "pidgin";
torkifyApp[4] = "konsole";
torTrafficType[0] = "All";
torTrafficType[1] = ":80";
torTrafficType[2] = ":443";
torTrafficType[3] = ":110";
torTrafficType[4] = ":25";
torTrafficType[5] = ":22";
torTrafficType[6] = ":23";
torTrafficType[7] = ":21";
torTrafficType[8] = ":53";
nonTorTrafficType[0] = "All";
nonTorTrafficType[1] = ":80";
nonTorTrafficType[2] = ":443";
nonTorTrafficType[3] = ":110";
nonTorTrafficType[4] = ":25";
nonTorTrafficType[5] = ":22";
nonTorTrafficType[6] = ":23";
nonTorTrafficType[7] = ":21";
nonTorTrafficType[8] = ":53";
for ( int country_id = 0; country_id != 250; ++country_id)
countryType[country_id] = GeoIP_country_code[country_id];
countryType[251] = "All";
// accept dnd
//setAcceptDrops(true);
// then, setup our actions
setupActions();
// Instanciate the LikeBack system, and show the first-use information dialog if the button-bar is shown:
LikeBack *likeBack = new LikeBack(LikeBack::AllButtons, LikeBack::isDevelopmentVersion(TORK_VERSION)); // Show button-bar only in beta-versions
likeBack->setServer("tork.sourceforge.net", "/likeback/send.php");
likeBack->setAcceptedLanguages(QStringList::split(";", "en;fr"), i18n("Please write in English or French."));
// Comment the following line once you are sure all your windows have a name:
likeBack->setWindowNamesListing(LikeBack::WarnUnnamedWindows);
// This line should be called early in your KMainWindow constructor because it references actionCollection().
// It should be called before createGUI() for the action to be plugged in the Help menu:
likeBack->sendACommentAction(actionCollection());
// and a status bar
statusBar()->show();
m_statusInfo = new QLabel(this);
m_statusTransfer = new QLabel(this);
statusBar()->addWidget(m_statusInfo,2);
statusBar()->addWidget(m_statusTransfer,2);
// apply the saved mainwindow settings, if any, and ask the mainwindow
// to automatically save settings if changed: window size, toolbar
// position, icon size, etc.
setAutoSaveSettings();
//currentChanged(0);
//applySettings(false);
// tell the KMainWindow that this is indeed the main widget
setCentralWidget(m_view);
setStandardToolBarMenuEnabled(true);
setUpnpDirPort(TorkConfig::dirListenAddress());
setUpnpORPort(TorkConfig::oRListenAddress());
// allow the view to change the statusbar and caption
connect(m_view, SIGNAL(updateTrayStats(const QString&, const QString&,
const QString&, const QString&)),
this, SLOT(updateTrayStats(const QString&,const QString&,
const QString&, const QString&)));
connect(m_view->m_osd, SIGNAL(requestHideMonitor()),
this, SLOT(toggleTorMon2()));
connect(m_view->m_osd, SIGNAL(requestToggleKDE()),
this, SLOT(toggleKDESetting()));
connect(m_view->m_osd, SIGNAL(requestChangeID()),
this, SLOT(useNewIdentity()));
connect(m_view, SIGNAL(showSecurityNotice(const QString&)),
this, SLOT(showSecurityNotice(const QString&)));
connect(m_view, SIGNAL(showScreamingNotice(const QString&)),
this, SLOT(showScreamingNotice(const QString&)));
connect(m_view, SIGNAL(newIdentity()),
this, SLOT(useNewIdentity()));
connect(m_view, SIGNAL(konqWithTor()),
this, SLOT(toggleKDESettingAndLaunchKonq()));
connect(m_view, SIGNAL(networkList()),
this, SLOT(networkList()));
connect(m_view, SIGNAL(hiddenServices()),
this, SLOT(hiddenServices()));
connect(m_view, SIGNAL(mixminionHome()),
this, SLOT(mixminionHome()));
connect(m_view, SIGNAL(showMyKonqueror()),
this, SLOT(showMyKonqueror()));
connect(m_view, SIGNAL(showMyHiddenServices()),
this, SLOT(showMyHiddenServices()));
connect(m_view, SIGNAL(riskySession()),
this, SLOT(readEavesdropping()));
connect(m_view, SIGNAL(aboutTorify()),
this, SLOT(aboutTorify()));
connect(m_view, SIGNAL(aboutTor()),
this, SLOT(aboutTor()));
connect(m_view, SIGNAL(configurePrivoxy()),
this, SLOT(configurePrivoxy()));
connect(m_view, SIGNAL(aboutParanoidMode()),
this, SLOT(aboutParanoidMode()));
connect(m_view, SIGNAL(startEverything()),
this, SLOT(startEverything()));
connect(m_view, SIGNAL(stopEverything()),
this, SLOT(stopTorGracefully()));
connect(m_view, SIGNAL(toggleTorTraffic(bool)),
this, SLOT(toggleTorTraffic(bool)));
connect(m_view, SIGNAL(toggleNonTorTraffic(bool)),
this, SLOT(toggleNonTorTraffic(bool)));
connect(m_view, SIGNAL(processWarning(const QString& , const QString& )),
this, SLOT(processWarning(const QString& , const QString& )));
connect(m_view, SIGNAL(copyOldConfig()),
this, SLOT(copyOldConfig()));
connect(UPnPManager::Manager(),SIGNAL(routerDiscovered( kt::UPnPRouter* )),
this,SLOT(routerDiscovered( kt::UPnPRouter* )));
connect(UPnPManager::Manager(),SIGNAL(forwardingOK(kt::UPnPRouter*, const QString &, bool )),
this,SLOT(upnpForwardingOK(kt::UPnPRouter*, const QString & , bool)));
connect(UPnPManager::Manager(),SIGNAL(forwardingError(kt::UPnPRouter*, const QString &, bool )),
this,SLOT(upnpForwardingError(kt::UPnPRouter*, const QString &, bool )));
/* if (!TorkConfig::clientOnly() && TorkConfig::forwardPorts()){
upnpmanager->discover();*/
QTimer::singleShot( 20000, this, SLOT(checkRouterDiscovered()) );
/* }*/
// setupGUI();
changeStatusbar("zero","zero");
sayWhatImDoing(i18n("To connect to Tor, press play."));
showTipOnStart();
turnOffKDE();
if ((KApplication::kApplication()->isRestored()))
startEverything();
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
if( args->isSet( "toggleKDE" ) ){
startEverything();
enableKDE(true);
}
if( args->isSet( "anonymousFirefox" ) ){
startEverything();
if (args->count() > 0)
m_view->anonymizedFirefox(args->arg(0));
else
m_view->anonymousFirefox();
}
if( args->isSet( "anonymousOpera" ) ){
startEverything();
if (args->count() > 0)
m_view->anonymizedOpera(args->arg(0));
else
m_view->anonymousOpera();
}
if( args->isSet( "anonymousKopete" ) ){
startEverything();
m_view->torify("kopete --caption 'Anonymous IM Session - Launched From TorK'");
}
if( args->isSet( "anonymousKonversation" ) ){
startEverything();
m_view->torify("konversation --caption 'Anonymous IM Session - Launched From TorK'");
}
if( args->isSet( "anonymousPidgin" ) ){
startEverything();
m_view->torify("pidgin --caption 'Anonymous IM Session - Launched From TorK'");
}
if( args->isSet( "anonymousGaim" ) ){
startEverything();
m_view->torify("gaim --caption 'Anonymous IM Session - Launched From TorK'");
}
if( args->isSet( "anonymousKonsole" ) ){
startEverything();
m_view->torify("konsole --caption 'Anonymous Shell Session - Launched From TorK'");
}
if( args->isSet( "anonymousEmail" ) ){
startEverything();
hide();
m_view->sendAnonymousEmail();
}
//Toggle 'advanced' toolbar if necessary
if (TorkConfig::advancedMode()){
m_ModeButton->plug( toolBar("TorToolBar") );
toolBar("TorToolBar")->setToggle(toolBar("TorToolBar")->idAt(2),true);
toolBar("TorToolBar")->toggleButton(toolBar("TorToolBar")->idAt(2));
toolBar("MoreToolBar")->show();
}else{
toolBar("TorToolBar")->setIconText( KToolBar::IconTextRight, false );
m_ModeButton->plug( toolBar("TorToolBar") );
toolBar("TorToolBar")->setToggle(toolBar("TorToolBar")->idAt(2),true);
toolBar("MoreToolBar")->hide();
toolBar("TorToolBar")->setIconText( KToolBar::IconOnly, false );
}
}
tork::~tork()
{
prepareToShut();
}
void tork::prepareToShut()
{
if (client != 0L){
client->cleanUp();
client->socketReadyRead();
client->deleteLater();
client = 0L;
}
KConfig* config = new KConfig("kioslaverc", false, false);
config->setGroup( "Proxy Settings" );
config->writeEntry( "httpProxy", TorkConfig::originalHttpProxy() );
config->writeEntry( "httpsProxy", TorkConfig::originalHttpsProxy() );
config->writeEntry( "ProxyType", TorkConfig::originalProxyType() );
config->sync();
//delete config;
// Inform all running io-slaves about the changes...
// if we cannot update, ioslaves inform the end user...
if (!DCOPRef("*", "KIO::Scheduler").send("reparseSlaveConfiguration", QString::null))
{
QString caption = i18n("Update Failed");
QString message = i18n("You have to restart the running applications "
"for these changes to take effect.");
KMessageBox::information (this, message, caption);
return;
}
if (childproc !=0L){
childproc->kill();
delete childproc;
childproc = 0L;
}
if (privoxyproc !=0L){
privoxyproc->kill();
delete privoxyproc;
privoxyproc = 0L;
}
if (tfPrivoxy !=0L){
delete tfPrivoxy;
tfPrivoxy = 0L;
}
if (tfTor !=0L){
delete tfTor;
tfTor = 0L;
}
if (privoxytest !=0L){
delete privoxytest;
privoxytest = 0L;
}
m_view->m_osd->saveSettings(KGlobal::config());
TorkConfig::writeConfig();
}
bool tork::queryClose()
{
if (client && !kapp->sessionSaving()) {
hide();
return false;
}
return true;
}
void tork::shuttingDown()
{
if (m_DNSTorified){
KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", i18n("<b>You are now in "
"FailSafe Mode</b>. <br> You need to be in Normal Mode before "
"you can close TorK."));
return;
}
KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", "TorK Has Closed And Returned "
"KDE To Its Non-Anonymous State! Goodbye!");
prepareToShut();
kapp->quit();
}
void tork::setupActions()
{
//Set up system tray
_tray = new TrayIcon(this);
_tray->setPixmap(KSystemTray::loadIcon("tork_pressplay"));
connect(_tray,SIGNAL(quitSelected()),SLOT(shuttingDown()));
KPopupMenu *conf_menu = _tray->contextMenu();
torkConfigure = new KAction(i18n("&Configure TorK"), "configure", 0,
this, SLOT(optionsPreferences()),actionCollection(),"configure_tor");
torkStart = new KAction(i18n("Connect To Tor"), "tork_play", 0,this,
SLOT(startEverything()),actionCollection(),"start_tor");
torkStop = new KAction(i18n("Disconnect From Tor"),"tork_stop", 0,this,
SLOT(stopTorGracefully()),actionCollection(),"stop_tor");
enableKonqi = new KAction(i18n("Enable/Disable Konqueror's use of Tor"),"konqueror", 0,this,
SLOT(toggleKDESetting()),actionCollection(),"enable_konqi");
enableTormon = new KAction(i18n("Toggle Tor Traffic OSD"),"tork_konsole", 0,this,
SLOT(toggleTorMon()),actionCollection(),"enable_tormon");
browseHiddenServices = new KAction(i18n("Browse Hidden Services"),"tork_tor", 0,this,
SLOT(hiddenServices()),actionCollection(),"hidden_services");
browseNetworkList = new KAction(i18n("Browse Tor Network Status"),"info", 0,this,
SLOT(networkList()),actionCollection(),"network_list");
#ifndef LIVECD
torkUpdateTork = new KAction(i18n("Download Tork"), "tork_green", 0,this,
SLOT(updateTork()),actionCollection(),"update_tork");
torkUpdateStable = new KAction(i18n("Download Tor (Stable Version)"), "tork_tor", 0,this,
SLOT(updateTorStable()),actionCollection(),"update_torstable");
torkUpdateUnstable = new KAction(i18n("Download Tor (Experimental Version)"), "tork_tor", 0,this,
SLOT(updateTorUnstable()),actionCollection(),"update_torunstable");
torkUpdatePrivoxy = new KAction(i18n("Download Privoxy (Proxy)"), "proxy", 0,this,
SLOT(updatePrivoxy()),actionCollection(),"update_privoxy");
#endif
torkFirstRunWizard = new KAction(i18n("First Run Wizard"), "wizard", 0,this,
SLOT(runWizard()),actionCollection(),"firstrun_wizard");
toggleTorbar = new KAction(i18n("Toggle Tor Bar"), "tork_tor", 0,this,
SLOT(toggleTorBar()),actionCollection(),"toggle_torbar");
connect(m_view->TorkTabs,SIGNAL(currentChanged( QWidget* )),SLOT(currentTabChanged( QWidget* )));
//Servers Filter
m_ServerFilterButton = new KActionMenu( i18n( "Servers" ), "filter", actionCollection() );
m_ServerFilterButton->setDelayed( false );
m_ServerFilterMenu = m_ServerFilterButton->popupMenu();
m_ServerFilterMenu->insertItem( i18n( "All" ), this, SLOT( filterServers( int ) ), 0, 0 );
m_ServerFilterMenu->insertItem( i18n( "Valid" ), this, SLOT( filterServers( int ) ), 0, 1 );
m_ServerFilterMenu->insertItem( i18n( "Fast" ), this, SLOT( filterServers( int ) ), 0, 2 );
m_ServerFilterMenu->insertItem( i18n( "Authority" ), this, SLOT( filterServers( int ) ), 0, 3 );
m_ServerFilterMenu->insertItem( i18n( "Named" ), this, SLOT( filterServers( int ) ), 0, 4 );
m_ServerFilterMenu->insertItem( i18n( "Exit" ), this, SLOT( filterServers( int ) ), 0, 5 );
m_ServerFilterMenu->insertItem( i18n( "Running" ), this, SLOT( filterServers( int ) ), 0, 6 );
m_ServerFilterMenu->insertItem( i18n( "Guard" ), this, SLOT( filterServers( int ) ), 0, 7 );
m_ServerFilterMenu->insertItem( i18n( "Stable" ), this, SLOT( filterServers( int ) ), 0, 8 );
m_ServerFilterMenu->insertSeparator();
m_ServerFilterMenu->insertItem( i18n( "Show IP" ), this,
SLOT( toggleIP( int ) ), 0, 10 );
m_ServerFilterMenu->insertSeparator();
m_ServerFilterMenu->insertItem( i18n( "Sort By Country" ), this, SLOT( sortByCountry( ) ), 0, 9 );
m_ServerFilterMenu->setItemChecked( 0, true );
m_CountryMenu = new KPopupMenu( this );
m_ServerFilterMenu->insertItem( i18n( "Show Countries" ), m_CountryMenu );
m_CountryMenuEU = new KPopupMenu( this );
m_CountryMenuAF = new KPopupMenu( this );
m_CountryMenuAS = new KPopupMenu( this );
m_CountryMenuNA = new KPopupMenu( this );
m_CountryMenuAN = new KPopupMenu( this );
m_CountryMenuSA = new KPopupMenu( this );
m_CountryMenuNN = new KPopupMenu( this );
m_CountryMenuOC = new KPopupMenu( this );
continentMapList["EU"] = m_CountryMenuEU;
continentMapList["AF"] = m_CountryMenuAF;
continentMapList["AS"] = m_CountryMenuAS;
continentMapList["NA"] = m_CountryMenuNA;
continentMapList["AN"] = m_CountryMenuAN;
continentMapList["SA"] = m_CountryMenuSA;
continentMapList["OC"] = m_CountryMenuOC;
continentMapList["--"] = m_CountryMenuNN;
m_CountryMenu->insertItem( i18n( "All" ), this, SLOT( filterCountries( int ) ), 0, 251 );
m_CountryMenu->insertItem( i18n( "Europe" ), m_CountryMenuEU );
m_CountryMenu->insertItem( i18n( "N America" ), m_CountryMenuNA );
m_CountryMenu->insertItem( i18n( "S America" ), m_CountryMenuSA );
m_CountryMenu->insertItem( i18n( "Africa" ), m_CountryMenuAF );
m_CountryMenu->insertItem( i18n( "Asia" ), m_CountryMenuAS );
m_CountryMenu->insertItem( i18n( "Oceania" ), m_CountryMenuOC );
m_CountryMenu->insertItem( i18n( "Satellite" ), m_CountryMenuNN );
m_CountryMenu->insertItem( i18n( "Antarctica" ), m_CountryMenuAN );
connect(m_CountryMenu,SIGNAL(aboutToShow()),SLOT(populateCountryMenu( )));
m_CountryMenu->setItemChecked( 251, true );
m_ServerFilterMenu->insertSeparator();
m_ServerFilterMenu->insertItem( i18n( "Text Filter" ), this,
SLOT( toggleTextFilter( int ) ), 0, 11 );
m_view->clearButton->setHidden(true);
m_view->serverFilter->setHidden(true);
// Launch Filter
m_LaunchMenuButton = new KActionMenu( i18n( "Launch" ), "tork_tor", actionCollection() );
m_LaunchMenuButton->setDelayed( false );
m_LaunchMenu = m_LaunchMenuButton->popupMenu();
m_LaunchMenu->insertItem( SmallIcon("tork_mail"), i18n( "Anonymous Email" ), m_view,
SLOT( sendAnonymousEmail( ) ) );
if (m_view->firefoxitem)
m_LaunchMenu->insertItem( SmallIcon("tork_firefox"), i18n( "Anonymous Firefox" ),
m_view, SLOT( anonymousFirefox( ) ) );
if (m_view->operaitem)
m_LaunchMenu->insertItem( SmallIcon("tork_opera"), i18n( "Anonymous Opera" ),
m_view, SLOT( anonymousOpera( ) ));
if (m_view->konversationitem)
m_LaunchMenu->insertItem( SmallIcon("konversation"), i18n( "Anonymous Konversation" ),
this,SLOT( torkify( int )), 0, 0 );
if (m_view->kopeteitem)
m_LaunchMenu->insertItem( SmallIcon("kopete"), i18n( "Anonymous Kopete" ),
this,SLOT( torkify( int )), 0, 1 );
if (m_view->gaimitem)
m_LaunchMenu->insertItem( SmallIcon("gaim"), i18n( "Anonymous Gaim" ),
this,SLOT( torkify( int )), 0, 2 );
if (m_view->pidginitem)
m_LaunchMenu->insertItem( SmallIcon("pidgin"), i18n( "Anonymous Pidgin" ),
this,SLOT( torkify( int )), 0, 3 );
if (m_view->sshitem)
m_LaunchMenu->insertItem( SmallIcon("tork_konsolessh"), i18n( "Anonymous SSH/Telnet" ),
this,SLOT( torkify( int )), 0, 4 );
// Log Filter
m_LogFilterButton = new KActionMenu( i18n( "Tor Log" ), "filter", actionCollection() );
m_LogFilterButton->setDelayed( false );
m_LogFilterMenu = m_LogFilterButton->popupMenu();
m_LogFilterMenu->insertItem( i18n( "All" ), this, SLOT( filterLog( int ) ), 0, 0 );
m_LogFilterMenu->insertItem( i18n( "NOTICE" ), this, SLOT( filterLog( int ) ), 0, 1 );
m_LogFilterMenu->insertItem( i18n( "WARNING" ), this, SLOT( filterLog( int ) ), 0, 2 );
m_LogFilterMenu->insertItem( i18n( "ERROR" ), this, SLOT( filterLog( int ) ), 0, 3 );
m_LogFilterMenu->insertItem( i18n( "DEBUG" ), this, SLOT( filterLog( int ) ), 0, 4 );
m_LogFilterMenu->setItemChecked( 0, true );
// Traffic Filter
m_TrafficFilterButton = new KActionMenu( i18n( "Traffic" ), "filter", actionCollection() );
m_TrafficFilterButton->setDelayed( false );
m_TrafficFilterMenu = m_TrafficFilterButton->popupMenu();
m_TorTrafficFilterMenu = new KPopupMenu( this );
m_NonTorTrafficFilterMenu = new KPopupMenu( this );
m_TrafficFilterMenu->insertItem( i18n( "Tor Traffic" ), m_TorTrafficFilterMenu );
m_TrafficFilterMenu->insertItem( i18n( "Non-Tor Traffic" ), m_NonTorTrafficFilterMenu );
m_TorTrafficFilterMenu->insertItem( i18n( "All" ), this, SLOT( filterTorTraffic( int ) ), 0, 0 );
m_TorTrafficFilterMenu->insertItem( SmallIcon("konqueror"), i18n( "Http" ), this,
SLOT( filterTorTraffic( int ) ), 0, 1 );
m_TorTrafficFilterMenu->insertItem( SmallIcon("tork_konqueror_https"),i18n( "Https" ), this,
SLOT( filterTorTraffic( int ) ), 0, 2 );
m_TorTrafficFilterMenu->insertItem( SmallIcon("tork_mail"),i18n( "Mail Receive" ), this,
SLOT( filterTorTraffic( int ) ), 0, 3 );
m_TorTrafficFilterMenu->insertItem( SmallIcon("tork_mail"),i18n( "Mail Send" ), this,
SLOT( filterTorTraffic( int ) ), 0, 4 );
m_TorTrafficFilterMenu->insertItem( SmallIcon("tork_konsolessh"),i18n( "SSH" ), this,
SLOT( filterTorTraffic( int ) ), 0, 5 );
m_TorTrafficFilterMenu->insertItem( SmallIcon("tork_konsole"),i18n( "Telnet" ), this,
SLOT( filterTorTraffic( int ) ), 0, 6 );
m_TorTrafficFilterMenu->insertItem( SmallIcon("konqueror"),i18n( "FTP" ), this,
SLOT( filterTorTraffic( int ) ), 0, 7 );
m_TorTrafficFilterMenu->insertItem( SmallIcon("network"),i18n( "DNS" ), this,
SLOT( filterTorTraffic( int ) ), 0, 8 );
m_TorTrafficFilterMenu->setItemChecked( 0, true );
m_NonTorTrafficFilterMenu->insertItem( i18n( "All" ), this,
SLOT( filterNonTorTraffic( int ) ), 0, 0 );
m_NonTorTrafficFilterMenu->insertItem( SmallIcon("konqueror"), i18n( "Http" ), this,
SLOT( filterNonTorTraffic( int ) ), 0, 1 );
m_NonTorTrafficFilterMenu->insertItem( SmallIcon("tork_konqueror_https"),i18n( "Https" ), this,
SLOT( filterNonTorTraffic( int ) ), 0, 2 );
m_NonTorTrafficFilterMenu->insertItem( SmallIcon("tork_mail"),i18n( "Mail Receive" ), this,
SLOT( filterNonTorTraffic( int ) ), 0, 3 );
m_NonTorTrafficFilterMenu->insertItem( SmallIcon("tork_mail"),i18n( "Mail Send" ), this,
SLOT( filterNonTorTraffic( int ) ), 0, 4 );
m_NonTorTrafficFilterMenu->insertItem( SmallIcon("tork_konsolessh"),i18n( "SSH" ), this,
SLOT( filterNonTorTraffic( int ) ), 0, 5 );
m_NonTorTrafficFilterMenu->insertItem( SmallIcon("tork_konsole"),i18n( "Telnet" ), this,
SLOT( filterNonTorTraffic( int ) ), 0, 6 );
m_NonTorTrafficFilterMenu->insertItem( SmallIcon("konqueror"),i18n( "FTP" ), this,
SLOT( filterNonTorTraffic( int ) ), 0, 7 );
m_NonTorTrafficFilterMenu->insertItem( SmallIcon("network"),i18n( "DNS" ), this,
SLOT( filterNonTorTraffic( int ) ), 0, 8 );
m_NonTorTrafficFilterMenu->setItemChecked( 0, true );
m_IdentityButton = new KAction(i18n("Change Identity"),"tork_identity", 0,this,
SLOT(useNewIdentity()),actionCollection());
//Pseudonymity Buttons
m_PseudoButton = new KActionMenu( i18n( "Be From.." ), "tork_internet",
actionCollection() );
m_PseudoButton->setDelayed( false );
m_PseudoMenu = m_PseudoButton->popupMenu();
m_PseudoMenuEU = new KPopupMenu( this );
m_PseudoMenuAF = new KPopupMenu( this );
m_PseudoMenuAS = new KPopupMenu( this );
m_PseudoMenuNA = new KPopupMenu( this );
m_PseudoMenuAN = new KPopupMenu( this );
m_PseudoMenuSA = new KPopupMenu( this );
m_PseudoMenuNN = new KPopupMenu( this );
m_PseudoMenuOC = new KPopupMenu( this );
continentMap["EU"] = m_PseudoMenuEU;
continentMap["AF"] = m_PseudoMenuAF;
continentMap["AS"] = m_PseudoMenuAS;
continentMap["NA"] = m_PseudoMenuNA;
continentMap["AN"] = m_PseudoMenuAN;
continentMap["SA"] = m_PseudoMenuSA;
continentMap["OC"] = m_PseudoMenuOC;
continentMap["--"] = m_PseudoMenuNN;
m_PseudoMenu->insertItem( i18n( "Anonymous" ), this, SLOT( applyPseudonymity( int ) ), 0, 999 );
m_PseudoMenu->insertItem( i18n( "Europe" ), m_PseudoMenuEU );
m_PseudoMenu->insertItem( i18n( "N America" ), m_PseudoMenuNA );
m_PseudoMenu->insertItem( i18n( "S America" ), m_PseudoMenuSA );
m_PseudoMenu->insertItem( i18n( "Africa" ), m_PseudoMenuAF );
m_PseudoMenu->insertItem( i18n( "Asia" ), m_PseudoMenuAS );
m_PseudoMenu->insertItem( i18n( "Oceania" ), m_PseudoMenuOC );
m_PseudoMenu->insertItem( i18n( "Satellite" ), m_PseudoMenuNN );
m_PseudoMenu->insertItem( i18n( "Antarctica" ), m_PseudoMenuAN );
connect(m_PseudoMenu,SIGNAL(aboutToShow()),SLOT(populatePseudoMenu( )));
m_PseudoMenu->setItemChecked(999,true);
// Server Button
m_ServerButton = new KActionMenu( i18n( "Run Server" ), "server", actionCollection() );
m_ServerButton->setDelayed( false );
m_ServerButtonMenu = m_ServerButton->popupMenu();
m_ServerButtonMenu->insertItem( i18n( "None" ), this, SLOT( configureServer( int ) ), 0, 0 );
m_ServerButtonMenu->insertItem( i18n( "To Exit Tor Traffic" ), this,
SLOT( configureServer( int ) ), 0, 1 );
m_ServerButtonMenu->insertItem( i18n( "To Relay Tor Traffic" ), this,
SLOT( configureServer( int ) ), 0, 2 );
m_ServerButtonMenu->insertItem( i18n( "To Defeat Censorship Of Tor" ), this,
SLOT( configureServer( int ) ), 0, 3 );
m_ServerButtonMenu->insertSeparator();
m_ServerButtonMenu->insertItem( KGlobal::iconLoader()->loadIconSet("configure", KIcon::Small),
i18n( "Configure Server" ), this, SLOT( configureServer( int ) ), 0, 4 );
m_ServerButtonMenu->insertItem( KGlobal::iconLoader()->loadIconSet("tork_agent", KIcon::Small),
i18n( "Manage Hidden Services" ), this, SLOT( configureServer( int ) ), 0, 5 );
m_ServerButtonMenu->setItemChecked( 0, true );
m_ServerButtonMenu->setItemEnabled( 4, !TorkConfig::clientOnly() );
// Server Button
m_SecurityButton = new KActionMenu( i18n( "Fail-Safe" ), "tork_penguin", actionCollection() );
m_SecurityButton->setDelayed( false );
m_SecurityButtonMenu = m_SecurityButton->popupMenu();
m_SecurityButtonMenu->insertItem( KGlobal::iconLoader()->loadIconSet("tork_penguin", KIcon::Small),
i18n( "None" ), this, SLOT( configureSecurity( int ) ), 0, 0 );
m_SecurityButtonMenu->insertItem(KGlobal::iconLoader()->loadIconSet("tork_agent", KIcon::Small),
i18n( "DNS FailSafe" ), this, SLOT( configureSecurity( int ) ), 0, 1 );
m_SecurityButtonMenu->insertItem( KGlobal::iconLoader()->loadIconSet("gv", KIcon::Small),
i18n( "System FailSafe" ),this, SLOT( configureSecurity( int ) ), 0, 2 );
m_SecurityButtonMenu->insertSeparator();
m_SecurityButtonMenu->insertItem( KGlobal::iconLoader()->loadIconSet("configure",
KIcon::Small),i18n( "Configure FailSafe" ), this, SLOT( configureSecurity( int ) ), 0, 3 );
m_SecurityButtonMenu->setItemChecked( 0, true );
m_UnCensorButton = new KAction(i18n("Un-Censor"),"tork_uncensor", 0,this,
SLOT(showFirewallEvasion()),actionCollection());
torkTip = new KAction(i18n("Tip of the Day"), "idea", 0,this,
SLOT(showTip()),actionCollection(),"help_show_tip");
//set up all other actions
KStdAction::quit(kapp, SLOT(quit()), actionCollection());
setStandardToolBarMenuEnabled(true);
m_statusbarAction = KStdAction::showStatusbar(this, SLOT(optionsShowStatusbar()),
actionCollection());
KStdAction::keyBindings(this, SLOT(optionsConfigureKeys()), actionCollection());
KStdAction::configureToolbars(this, SLOT(optionsConfigureToolbars()), actionCollection());
KStdAction::preferences(this, SLOT(optionsPreferences()), actionCollection());
createGUI();
m_ModeButton = new KAction(i18n("More Options"),"add", 0,this,
SLOT(switchMode()),actionCollection());
//Set Up Advanced Toolbar
toolBar("MoreToolBar")->setIconText( KToolBar::IconTextRight, false );
m_PseudoButton->plug( toolBar("MoreToolBar") );
m_ServerButton->plug( toolBar("MoreToolBar") );
#ifndef LIVECD
#ifdef USE_FAILSAFE
m_SecurityButton->plug( toolBar("MoreToolBar") );
#endif
#endif
toolBar("MoreToolBar")->setIconText( KToolBar::IconOnly, false );
//Set Up Core Toolbar
toolBar("TorToolBar")->setIconText( KToolBar::IconTextRight, false );
m_UnCensorButton->plug( toolBar("TorToolBar") );
#ifndef LIVECD
//m_IdentityButton->plug( toolBar("TorToolBar") );
#endif
toolBar("TorToolBar")->setIconText( KToolBar::IconOnly, false );
m_PseudoButton->setToolTip( i18n( "Pretend you're using the Internet <br> in another country." ) );
m_IdentityButton->setToolTip( i18n( "Reset all Tor's open channels (i.e. 'circuits') and <br>"
"enter the internet "
"from a new set of channels." ) );
m_UnCensorButton->setToolTip( i18n( "Evade a state or service provider's attempts <br> to block"
" your use of Tor." ) );
m_ModeButton->setToolTip( i18n( "Show/hide TorK's advanced features <br> and configuration options."
) );
enableTormon->setToolTip( i18n( "Show/hide TorK's on-screen display (OSD) <br> of your active "
"connections." ) );
m_SecurityButton->setToolTip( i18n( "Ensure selected traffic is <br> forced through Tor." ) );
m_ServerButton->setToolTip( i18n( "Run a Server on the Tor Network. <br> 'Relay Tor Traffic' "
"is Recommended for Home Use." ) );
m_ServerButton->setEnabled(false);
torkStart->setEnabled(true);
m_LaunchMenuButton->setEnabled(false);
m_IdentityButton->setEnabled(false);
m_PseudoButton->setEnabled(false);
m_ServerFilterButton->setEnabled(false);
m_SecurityButton->setEnabled(false);
torkStop->setEnabled(false);
enableKonqi->setEnabled(false);
browseHiddenServices->setEnabled(false);
torkStart->plug(conf_menu);
torkStop->plug(conf_menu);
m_IdentityButton->plug(conf_menu);
enableKonqi->plug(conf_menu);
torkConfigure->plug(conf_menu);
m_set_max_rate = new SetMaxRate(this);
_tray->contextMenu()->insertItem(i18n("Server Bandwidth"),m_set_max_rate);
_tray->updateStats(BytesPerSecToString(0),BytesPerSecToString(0),
BytesPerSecToString(0),BytesPerSecToString(0),
QStringList("<font color='#990000'>Status Not Known</font>"),
QStringList("<font color='#990000'>Status Not Known</font>"),
BytesPerSecToString(0));
_tray->show();
toolBar("TorToolBar")->setToggle(toolBar("TorToolBar")->idAt(0),true);
if (m_view->getShowTormon())
toolBar("TorToolBar")->toggleButton(toolBar("TorToolBar")->idAt(0));
}
void tork::populateCountryMenu()
{
//GeoIP_country_name
QValueList<int> tmplist = m_view->countryList();
qHeapSort( tmplist );
for ( QValueList<int>::Iterator it = tmplist.begin(); it != tmplist.end(); ++it )
{
if (!continentMapList.contains(GeoIP_country_continent[(*it)])) {
kdDebug() << "unknown continent" << GeoIP_country_continent[(*it)] << endl;
continue;
}
if ( continentMapList[GeoIP_country_continent[(*it)]]->findItem( (*it) ) ){
continue;
}
continentMapList[GeoIP_country_continent[(*it)]]->insertItem(
QString(GeoIP_country_code[(*it)]).contains("--") ? SmallIcon("help") :
SmallIcon(QString("tork_%1").arg(GeoIP_country_code[(*it)]).lower()),
GeoIP_country_name[(*it)],
this, SLOT( filterCountries( int ) ), 0, (*it) );
}
}
void tork::populatePseudoMenu()
{
//GeoIP_country_name
QValueList<int> tmplist = m_view->countryList();
qHeapSort( tmplist );
for ( QValueList<int>::Iterator it = tmplist.begin(); it != tmplist.end(); ++it )
{
if (!continentMap.contains(GeoIP_country_continent[(*it)])) {
kdDebug() << "unknown continent" << GeoIP_country_continent[(*it)] << endl;
continue;
}
if ( continentMap[GeoIP_country_continent[(*it)]]->findItem( (*it) ) )
continue;
continentMap[GeoIP_country_continent[(*it)]]->insertItem(
QString(GeoIP_country_code[(*it)]).contains("--") ? SmallIcon("help") :
SmallIcon(QString("tork_%1").arg(GeoIP_country_code[(*it)]).lower()),
GeoIP_country_name[(*it)],
this, SLOT( applyPseudonymity( int ) ), 0, (*it) );
}
}
void tork::applyPseudonymity( int country_id )
{
if (!continentMap.contains(GeoIP_country_continent[country_id])) {
kdDebug() << "unknown continent" << GeoIP_country_continent[country_id] << endl;
return;
}
// Update Menu
for ( QMap<QString, KPopupMenu*>::Iterator menu = continentMap.begin(); menu != continentMap.end(); ++menu )
{
for (unsigned int index = 0; index != menu.data()->count(); ++index){
menu.data()->setItemChecked( menu.data()->idAt(index),false);
}
}
if (country_id == 999){
TorkConfig::setCurrentExitNodes("");
if (client != 0L){
client->updateExitNodes();
client->strictExitNodes(false);
}
m_PseudoMenu->setItemChecked(999,true);
return;
}
// Select all exits in chosen country as our preferred exit nodes
continentMap[GeoIP_country_continent[country_id]]->setItemChecked( country_id,
!continentMap[GeoIP_country_continent[country_id]]->isItemChecked(country_id) ); //uncheck old item
QStringList currentList;
QString cc = QString("%1").arg(country_id);
QListViewItemIterator it(m_view->serverList);
while ( it.current() ) {
if ((*it)->text(4) == cc){
QString node = "$"+getFPFromFPDigest((*it)->text(2));
currentList.append(node);
}
++it;
}
TorkConfig::setCurrentExitNodes(currentList);
// Update Tor with new exit list and flush all existing circuits
if (client != 0L){
//Close all open circuits first
QListView* tmp = dynamic_cast<QListView*>(m_view->circuitList);
client->closeAllCircuits(tmp);
//Then apply new exit list
client->updateExitNodes();
}
// Then ensure a new circuit is chosen
useNewIdentity();
m_PseudoMenu->setItemChecked(999,false);
}
void tork::populateSubNetMenu()
{
if ( !m_IPFilterMenu->findItem( 0 ) ){
subnetType[0] = "All";
m_IPFilterMenu->insertItem( "All", this, SLOT( filterSubnets( int ) ), 0, 0);
}
QStringList tmplist = m_view->subnet16List();
tmplist.sort();
for ( QStringList::Iterator it = tmplist.begin(); it != tmplist.end(); ++it )
{
if ((*it).isEmpty())
continue;
QString tmpit = (*it);
int index = tmpit.replace(".","").toInt();
if ( m_IPFilterMenu->findItem( index ) )
continue;
subnetType[index] = (*it);
m_IPFilterMenu->insertItem( (*it)+"*", this, SLOT( filterSubnets( int ) ), 0, index );
}
}
void tork::torkify(int id)
{
m_view->torify(torkifyApp[id]);
}
void
tork::currentTabChanged(QWidget* cur ) //SLOT
{
toolBar()->setIconText( KToolBar::IconTextRight, false );
if (cur == prev)
return;
prev = m_view->TorkTabs->currentPage();
if (cur == m_view->TorkTabs->page(0)){
m_LaunchMenuButton->plug( toolBar() );
m_ServerFilterButton->unplug( toolBar() );
m_LogFilterButton->unplug( toolBar() );
m_TrafficFilterButton->unplug( toolBar() );
}else if (cur == m_view->TorkTabs->page(1)){
m_ServerFilterButton->plug( toolBar() );
m_LaunchMenuButton->unplug( toolBar() );
m_LogFilterButton->unplug( toolBar() );
m_TrafficFilterButton->unplug( toolBar() );
}else if (cur == m_view->TorkTabs->page(2)){
m_LogFilterButton->plug( toolBar() );
m_ServerFilterButton->unplug( toolBar() );
m_LaunchMenuButton->unplug( toolBar() );
m_TrafficFilterButton->unplug( toolBar() );
}else if (cur == m_view->TorkTabs->page(3)){
m_TrafficFilterButton->plug( toolBar() );
m_ServerFilterButton->unplug( toolBar() );
m_LaunchMenuButton->unplug( toolBar() );
m_LogFilterButton->unplug( toolBar() );
}
toolBar()->setIconText( KToolBar::IconOnly, false );
m_ServerFilterButton->setToolTip( i18n( "Filter the List of Servers." ) );
m_LaunchMenuButton->setToolTip( i18n( "Launch anonymized applications <br> with a single click." ) );
m_LogFilterButton->setToolTip( i18n( "Filter Log Messages by Type." ) );
m_TrafficFilterButton->setToolTip( i18n( "Filter displayed traffic by type." ) );
}
void
tork::toggleTextFilter( int id ) //SLOT
{
m_view->clearButton->setHidden(!m_view->clearButton->isHidden());
m_view->serverFilter->setHidden(!m_view->serverFilter->isHidden());
m_ServerFilterMenu->setItemChecked( id, !m_view->serverFilter->isHidden() );
m_view->serverFilter->setFocus();
if (m_view->clearButton->isHidden())
m_view->serverFilter->clear();
}
void
tork::sortByCountry( ) //SLOT
{
m_view->serverList->setSortColumn(4);
m_view->serverList->sort();
}
void
tork::filterSubnets( int ) //SLOT
{
//filterView(subnetType, (QListView*&)m_view->serverList, m_IPFilterMenu, id, 5);
}
void
tork::filterNonTorTraffic( int id ) //SLOT
{
QListViewItemIterator it(m_view->NonTorTraffic);
while ( it.current() ) {
it.current()->setVisible(false);
++it;
}
m_NonTorTrafficFilterMenu->setItemChecked( id, !m_NonTorTrafficFilterMenu->isItemChecked(id) ); // Toggle selected item
filterView(nonTorTrafficType, m_view->NonTorTraffic, m_NonTorTrafficFilterMenu, id, 1);
}
void
tork::filterTorTraffic( int id ) //SLOT
{
QListViewItemIterator it(m_view->TorTraffic);
while ( it.current() ) {
it.current()->setVisible(false);
++it;
}
m_TorTrafficFilterMenu->setItemChecked( id, !m_TorTrafficFilterMenu->isItemChecked(id) ); // Toggle selected item
filterView(torTrafficType, m_view->TorTraffic, m_TorTrafficFilterMenu, id, 2);
}
void
tork::toggleServerButton( bool on ) //SLOT
{
m_ServerButton->setEnabled(!on);
if (!on)
m_ServerButton->setToolTip( i18n( "Run a Server on the Tor Network. <br> 'Relay Tor Traffic' "
"is Recommended for Home Use." ) );
else
m_ServerButton->setToolTip( i18n( "You Can't Run a Server While <br> Using Tor's Un-Censor "
"Feature." ) );
}
void
tork::updateServerButton( ) //SLOT
{
//Set quick-select dropdown to reflect setting in config panel
m_view->welcomeitem->score->setCurrentItem(TorkConfig::quickConfigure());
for (unsigned int index = 0; index != 3; ++index){
m_ServerButtonMenu->setItemChecked( index, false ); //uncheck old item
}
if (TorkConfig::clientOnly()){
m_ServerButtonMenu->setItemChecked( 0, true );
return;
}
if (TorkConfig::middleMan()){
m_ServerButtonMenu->setItemChecked( 2, true );
return;
}
m_ServerButtonMenu->setItemChecked( 1, true );
}
void
tork::switchMode() //SLOT
{
TorkConfig::setAdvancedMode(!TorkConfig::advancedMode());
TorkConfig::writeConfig();
if (TorkConfig::advancedMode()){
m_ModeButton->unplug( toolBar("TorToolBar") );
toolBar("TorToolBar")->setIconText( KToolBar::IconOnly, false );
m_ModeButton->plug( toolBar("TorToolBar") );
toolBar("TorToolBar")->setToggle(toolBar("TorToolBar")->idAt(2),true);
toolBar("TorToolBar")->toggleButton(toolBar("TorToolBar")->idAt(2));
toolBar("MoreToolBar")->show();
}else{
m_ModeButton->unplug( toolBar("TorToolBar") );
toolBar("TorToolBar")->setIconText( KToolBar::IconTextRight, false );
m_ModeButton->plug( toolBar("TorToolBar") );
toolBar("MoreToolBar")->hide();
}
}
void
tork::configureServer( int id ) //SLOT
{
kdDebug() << "configuring server" << endl;
if ((TorkConfig::runFirstServerWizard()) && (id !=0 && id != 4)){
ServerWizard wizard;
wizard.setCaption( i18n( "Server Assistant" ));
wizard.setServerType(id);
connect( &wizard, SIGNAL(setUpServer(int)),this,
SLOT(configureServer(int )) );
wizard.exec();
return;
}
/* We need to let upnp configuration through now, even if settings
were not originally applied */
m_CanApplyServerSettingsIfSet=true;
if (id < 4){
for (unsigned int index = 0; index != 4; ++index){
m_ServerButtonMenu->setItemChecked( index, false ); //uncheck old item
}
m_ServerButtonMenu->setItemChecked( id, true );
}
switch(id)
{
case 0:
TorkConfig::setClientOnly(true);
if (client != 0L)
client->configureServer(upnpORPort(), upnpDirPort());
break;
case 1:
TorkConfig::setClientOnly(false);
TorkConfig::setBridgeRelay(false);
TorkConfig::setMiddleMan(false);
if (client != 0L)
client->configureServer(upnpORPort(), upnpDirPort());
break;
case 2:
TorkConfig::setClientOnly(false);
TorkConfig::setMiddleMan(true);
TorkConfig::setBridgeRelay(false);
if (client != 0L)
client->configureServer(upnpORPort(), upnpDirPort());
break;
case 3:
TorkConfig::setClientOnly(false);
TorkConfig::setMiddleMan(true);
TorkConfig::setBridgeRelay(true);
if (client != 0L)
client->configureServer(upnpORPort(), upnpDirPort());
break;
case 4:
openConfig("My Tor Server");return;
case 5:
showMyHiddenServices();return;
default:
break;
}
if ((!TorkConfig::clientOnly()) && (TorkConfig::forwardPorts())){
// Do we need to forward ports on the router?
if (UPnPManager::Manager()->routersDiscovered())
configureRouter(false);
}
m_ServerButtonMenu->setItemEnabled( 4, !TorkConfig::clientOnly() );
TorkConfig::writeConfig();
}
void
tork::configureSecurity( int id ) //SLOT
{
if (m_SecurityButtonMenu->isItemChecked( id))
return;
QString cmd;
QString iconstring;
QString filterRequest;
filterId = id;
cmd = createFailSafeCommand(TorkConfig::filterRules(), false);
cmd += createFailSafeCommand(TorkConfig::systemFilterRules(), false);
switch(id)
{
case 0:
iconstring = "tork_penguin";
filterRequest = "Normal Mode";
break;
case 1:
cmd += createFailSafeCommand(TorkConfig::filterRules(), true);
iconstring = "agent";
filterRequest = "DNS FailSafe";
break;
case 2:
cmd += createFailSafeCommand(TorkConfig::filterRules(), true);
cmd += createFailSafeCommand(TorkConfig::systemFilterRules(), true);
iconstring = "gv";
filterRequest = "System FailSafe";
break;
case 3:
openConfig("FailSafe");return;
default:
return;
}
filterError = "";
filterWasApplied = false;
cmd += "echo run";
filterproc = new KProcIO();
filterproc->setUseShell(TRUE);
QString filterCommand= QString("kdesu --noignorebutton --miniicon tork --caption '%1' -t -i %2 -d -c "
"'%3'").arg(filterRequest).arg(iconstring).arg(cmd);
connect( filterproc, SIGNAL(readReady(KProcIO * )),
SLOT(processFilter(KProcIO * )) );
connect( filterproc, SIGNAL(processExited(KProcess *)),
SLOT(filterExited()) );
*filterproc<<filterCommand;
filterproc->start(KProcIO::NotifyOnExit,TRUE);
}
void tork::processFilter(KProcIO *filterproc)
{
QString item = "";
int pos;
while ((pos = (filterproc->readln(item,true))) != -1) {
if (item.contains("No chain/target/match by that name"))
continue;
if (item == "run"){
filterWasApplied = true;
continue;
}
filterError += item;
}
filterproc->ackRead();
}
void tork::filterExited()
{
if (!filterError.isEmpty()){
processQuestion( "filterfailed", filterError );
return;
}
if (!filterWasApplied)
return;
m_view->toggleParanoidMode(filterId);
if (filterId < 3){
for (unsigned int index = 0; index != 3; ++index){
m_SecurityButtonMenu->setItemChecked( index, false ); //uncheck old item
}
m_SecurityButtonMenu->setItemChecked( filterId, true );
}
switch(filterId)
{
case 0:
m_DNSTorified = false;
if (client != 0L){
client->enableDNS(false);
client->enableTransPort(false);
}
m_SecurityButton->setIconSet(SmallIconSet("tork_penguin"));
KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", i18n("You are now in <b>Normal Mode</b>. <br> Tor and TorK will operate normally."));
break;
case 1:
m_DNSTorified = true;
if (client != 0L){
client->enableDNS(true);
client->enableTransPort(true);
}
m_SecurityButton->setIconSet(SmallIconSet("tork_agent"));
KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", i18n("You are now in <b>DNS FailSafe Mode</b>. <br> All DNS queries will be routed through Tor."));
break;
case 2:
m_DNSTorified = true;
if (client != 0L){
client->enableDNS(true);
client->enableTransPort(true);
}
m_SecurityButton->setIconSet(SmallIconSet("gv"));
KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", i18n("You are now in <b>System FailSafe Mode</b>. <br> Tor will use new routes for every new connection as often as possible. <br> All secure traffic will be routed through Tor."));
break;
default:
break;
}
delete filterproc;
filterproc = 0L;
}
QString tork::createFailSafeCommand( const QStringList &filterRules, bool set ) //SLOT
{
QString cmd;
QStringList rules = filterRules;
for ( QStringList::Iterator it = rules.begin(); it != rules.end(); ++it )
{
if ((*it).isEmpty())
continue;
QString active = (*it).section("%:%",0,0);
if (active.contains("button_cancel") && (set))
continue;
QString entry = (*it).section("%:%",2,2);
if (set){
cmd.append(QString("%1;").arg(entry));
}else{
cmd.append(QString("%1;").arg(entry.replace(" -I "," -D ")));
}
}
return cmd;
}
void
tork::filterLog( int id ) //SLOT
{
QListViewItemIterator it(m_view->infoList);
while ( it.current() ) {
it.current()->setVisible(false);
++it;
}
m_LogFilterMenu->setItemChecked( id, !m_LogFilterMenu->isItemChecked(id) ); // Toggle selected item
filterView(logType, m_view->infoList, m_LogFilterMenu, id, 1);
}
void
tork::filterCountries( int id ) //SLOT
{
// If 'All' is already selected, return
if (countryType[id] == "All"){
if (m_CountryMenu->isItemChecked(251))
return;
m_CountryMenu->setItemChecked( 251, true);
}else
m_CountryMenu->setItemChecked( 251, false);
// If 'All'is selected, display all entries; otherwise hide all entries
QListViewItemIterator it(m_view->serverList);
while ( it.current() ) {
it.current()->setVisible(m_CountryMenu->isItemChecked(251));
++it;
}
//Re-apply any text filter
if ((m_view->serverFilter->isShown()) &&
(!m_view->serverFilter->text().isEmpty()))
m_view->serverFilter->updateSearch();
// Display servers for each selected country
for ( QMap<QString, KPopupMenu*>::Iterator menu = continentMapList.begin();
menu != continentMapList.end(); ++menu ){
if (m_CountryMenu->isItemChecked(251)){ // If 'All' selected, deselect all items
for (unsigned int index = 0; index != menu.data()->count(); ++index){
menu.data()->setItemChecked( menu.data()->idAt(index), false );
}
continue;
}
menu.data()->setItemChecked( id, !menu.data()->isItemChecked(id) ); // Toggle selected item
QListView* tmp = dynamic_cast<QListView*>(m_view->serverList);
filterView(countryType, tmp, menu.data(), id, 4);
}
//If 'All' type-filter is selected, we are already displaying all servers, so return
if ( m_ServerFilterMenu->isItemChecked( 0 )){
return;
}
// Of servers displayed above, display only the ones with all selected criteria.
QListView* tmp = dynamic_cast<QListView*>(m_view->serverList);
filterViewServers(serverCondition, tmp, m_ServerFilterMenu, 99, 3);
}
void
tork::toggleIP( int id ) //SLOT
{
QListViewItemIterator it(m_view->serverList);
if (m_ServerFilterMenu->text( id ).contains("IP")) {
while ( it.current() ) {
it.current()->setText(1,it.current()->text(5));
++it;
}
m_ServerFilterMenu->changeItem( id, "Show Name" );
} else {
while ( it.current() ) {
it.current()->setText(1,getNickNameFromFPDigest(it.current()->text(2)));
++it;
}
m_ServerFilterMenu->changeItem( id, "Show IP" );
}
}
void
tork::filterServers( int id ) //SLOT
{
//If 'All' was clicked and is already selected, just return
if (serverCondition[id] == "All" && m_ServerFilterMenu->isItemChecked(id))
return;
//Uncheck/Check Selected Item
m_ServerFilterMenu->setItemChecked( id, !m_ServerFilterMenu->isItemChecked(id) );
//If nothing is selected any longer, check 'All'
bool somethingchecked = false;
for (unsigned int index = 1; index != serverCondition.count(); ++index){
if (m_ServerFilterMenu->isItemChecked( index))
somethingchecked = true;
}
if (!somethingchecked){
m_ServerFilterMenu->setItemChecked( 0, true );
id = 0;
}
//Re-apply any text filter
if ((m_view->serverFilter->isShown()) &&
(!m_view->serverFilter->text().isEmpty()))
m_view->serverFilter->updateSearch();
//We always need to get all servers for selected countries again
if (m_CountryMenu->isItemChecked( 251 )){ // If 'All' countries are selected
QListViewItemIterator it(m_view->serverList);
while ( it.current() ) {
it.current()->setVisible(true);
++it;
}
}else{
QListViewItemIterator it(m_view->serverList);
while ( it.current() ) {
it.current()->setVisible(false);
++it;
}
for ( QMap<QString,
KPopupMenu*>::Iterator menu = continentMapList.begin();
menu != continentMapList.end(); ++menu ){
QListView* tmp = dynamic_cast<QListView*>(m_view->serverList);
filterView(countryType, tmp, menu.data(), 255, 4);
}
}
//If 'All' is selected, just ensure all items are unchecked and return
if (serverCondition[id] == "All"){
for (unsigned int index = 1; index != serverCondition.count(); ++index){
m_ServerFilterMenu->setItemChecked( index, false ); //uncheck old item
}
m_ServerFilterMenu->setItemChecked( id, true );
return;
}
//Uncheck 'All' to be sure
m_ServerFilterMenu->setItemChecked( 0, false );
// Of servers displayed above, display only the ones with all selected
//criteria.
QListView* tmp = dynamic_cast<QListView*>(m_view->serverList);
filterViewServers(serverCondition, tmp, m_ServerFilterMenu, id, 3);
}
void
tork::filterView( QValueVector<QString> &possibleValues, QListView* &view,
KPopupMenu* &menu, int id, int column ){
if (possibleValues[id] == "All"){
QListViewItemIterator it(view);
while ( it.current() ) {
it.current()->setVisible(true);
++it;
}
for (unsigned int index = 1; index != possibleValues.count(); ++index){
menu->setItemChecked( menu->idAt(index), false );
}
if (menu->findItem(id))
menu->setItemChecked( id, true );
return;
}
if (continentMapList.values().contains(menu))
menu->setItemChecked( 251, false ); //Uncheck 'All' Item
else
menu->setItemChecked( 0, false ); //Uncheck 'All' Item
QString check;
for (unsigned int index = 0; index != possibleValues.count(); ++index){
if (menu->isItemChecked( menu->idAt(index) )){
QListViewItemIterator it(view);
while ( it.current() ) {
if (possibleValues == countryType)
check = GeoIP_country_code[it.current()->text(column).toInt()];
else
check = it.current()->text(column);
if (check.contains(possibleValues[menu->idAt(index)]))
it.current()->setVisible(true);
++it;
}
}
}
}
void
tork::filterViewServers( QValueVector<QString> &possibleValues,
QListView* &view, KPopupMenu* &menu, int ,
int column) //SLOT
{
for (unsigned int index = 0; index != possibleValues.count(); ++index){
if (menu->isItemChecked( menu->idAt(index) )){
QListViewItemIterator it(view,QListViewItemIterator::Visible);
while ( it.current() ) {
if (!it.current()->text(column)
.contains(possibleValues[index]))
it.current()->setVisible(false);
else
it.current()->setVisible(true);
++it;
}
}
}
}
void
tork::createSubnetList( ) //SLOT
{
QListViewItem *nextOne;
QListViewItem *tm;
for (QListViewItem *child = m_view->serverList->firstChild(); child;
child = nextOne) {
nextOne = child->nextSibling();
QRegExp rx("^[0-9]{1,3}\\.[0-9]{1,3}\\.");
rx.search(child->text(5));
QString tmp = rx.cap(0);
if (tmp.isEmpty()){
break;
}
if (!( tm = m_view->serverList->findItem((tmp),0))){
tm = new QListViewItem(m_view->serverList, tmp,
"a","a","a","a","a");
}
m_view->serverList->takeItem(child);
tm->insertItem(child);
child->moveItem(tm);
}
}
void tork::fileNew()
{
// this slot is called whenever the File->New menu is selected,
// the New shortcut is pressed (usually CTRL+N) or the New toolbar
// button is clicked
// create a new window
(new tork)->show();
}
void tork::optionsShowToolbar()
{
// this is all very cut and paste code for showing/hiding the
// toolbar
if (m_toolbarAction->isChecked())
toolBar()->show();
else
toolBar()->hide();
}
void tork::optionsShowStatusbar()
{
// show/hide the statusbar
if (m_statusbarAction->isChecked())
statusBar()->show();
else
statusBar()->hide();
}
void tork::optionsConfigureKeys()
{
KKeyDialog::configure(actionCollection());
}
void tork::optionsConfigureToolbars()
{
// use the standard toolbar editor
#if defined(KDE_MAKE_VERSION)
# if KDE_VERSION >= KDE_MAKE_VERSION(3,1,0)
saveMainWindowSettings(KGlobal::config(), autoSaveGroup());
# else
saveMainWindowSettings(KGlobal::config());
# endif
#else
saveMainWindowSettings(KGlobal::config());
#endif
KEditToolbar dlg(factory());
connect(&dlg,SIGNAL(newToolbarConfig()),this,SLOT(newToolbarConfig()));
dlg.exec();
}
void tork::newToolbarConfig()
{
// this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
// recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
createGUI();
#if defined(KDE_MAKE_VERSION)
# if KDE_VERSION >= KDE_MAKE_VERSION(3,1,0)
applyMainWindowSettings(KGlobal::config(), autoSaveGroup());
# else
applyMainWindowSettings(KGlobal::config());
# endif
#else
applyMainWindowSettings(KGlobal::config());
#endif
}
void tork::copyOldConfig()
{
TorkConfig::writeConfig();
KConfigSkeletonItem::List pitems(TorkConfig::self()->items());
KConfigSkeletonItem::List::ConstIterator it;
PrevConfig::PrevConfigList::iterator tp;
for( it = pitems.begin(); it != pitems.end(); ++it ) {
if (((TorkConfig::clientOnly())) && ((*it)->group() == "MyServer"))
continue;
for( tp = prevlist.begin(); tp != prevlist.end(); ++tp ) {
if ((*tp).name() == (*it)->name()){
(*tp).setProperty((*it)->property());
continue;
}
}
if ( tp == prevlist.end())
prevlist.append(PrevConfig((*it)->name(),(*it)->property()));
}
if (client != 0L)
client->updatePrevConfig(prevlist);
}
void tork::optionsPreferences()
{
// The preference dialog is derived from prefs-base.ui which is subclassed into Prefs
//
// compare the names of the widgets in the .ui file
// to the names of the variables in the .kcfg file
copyOldConfig();
TorkConfigDialog* dialog = (TorkConfigDialog*) KConfigDialog::exists( "settings" );
if( !dialog )
{
//KConfigDialog didn't find an instance of this dialog, so lets create it :
dialog = new TorkConfigDialog( this, "settings", TorkConfig::self() );
}
//FIXME it seems that if the dialog is on a different desktop it gets lost
// what do to? detect and move it?
if (client != 0L)
dialog->m_quickconfig->quickGroup->setEnabled(false);
dialog->show();
dialog->raise();
dialog->setActiveWindow();
}
void tork::openConfig(const QCString& page)
{
copyOldConfig();
// The preference dialog is derived from prefs-base.ui which is subclassed into Prefs
//
// compare the names of the widgets in the .ui file
// to the names of the variables in the .kcfg file
TorkConfigDialog* dialog = (TorkConfigDialog*) KConfigDialog::exists( "settings" );
if( !dialog )
{
//KConfigDialog didn't find an instance of this dialog, so lets create it :
dialog = new TorkConfigDialog( this, "settings", TorkConfig::self() );
}
//FIXME it seems that if the dialog is on a different desktop it gets lost
// what do to? detect and move it?
if (client != 0L)
dialog->m_quickconfig->quickGroup->setEnabled(false);
dialog->showPage(page);
dialog->show();
dialog->raise();
dialog->setActiveWindow();
}
void tork::updateTrayIcon(const QString& iconName)
{
kdDebug() << "show icon " << iconName << endl;
if (iconName.isEmpty())
_tray->setPixmap(KSystemTray::loadIcon("tork_little"));
else
_tray->setPixmap(KSystemTray::loadIcon(iconName));
if (TorkConfig::clientOnly())
return;
QPixmap icon = KSystemTray::loadIcon( iconName );
QPixmap overlay = KSystemTray::loadIcon( "tork_server" );
if ( !overlay.isNull() )
{
int x = icon.width() - overlay.width();
int y = icon.height() - overlay.height();
if ( icon.mask() )
{
QBitmap mask = *icon.mask();
bitBlt( &mask, x, y,
overlay.mask() ? const_cast<QBitmap *>(overlay.mask()) : &overlay,
0, 0, overlay.width(), overlay.height(),
overlay.mask() ? OrROP : SetROP );
icon.setMask(mask);
}
bitBlt( &icon, x, y, &overlay );
}
_tray->setPixmap(icon);
}
void tork::updateTrayStats(const QString& totin,const QString& totout, const QString& in,const QString& out)
{
if (client == 0L)
return;
QStringList cli = client->currentClientReport();
QStringList server = client->currentServerReport();
_tray->updateStats(totin, totout, in, out, server, cli,
BytesPerSecToString(client->getCurBandwidthRate()));
QString tmp1 = i18n("Transferred up: %1 / down: %2")
.arg(totout)
.arg(totin);
m_statusTransfer->setText(tmp1);
updateServerClientStatusBar(cli,server);
}
void tork::updateServerClientStatusBar(const QStringList &client, const QStringList &server)
{
static unsigned int iter = 0;
unsigned int serverCount = server.count();
if (iter > serverCount){
iter = 0;
QString tmp1 = i18n("Client: %1")
.arg(client[0]);
m_statusInfo->setText(tmp1.replace("<font color='#990000'>","")
.replace("</font>",""));
}else if (iter == serverCount){
m_statusInfo->setText(i18n("%1 servers on network").arg(m_view->serverList->childCount()));
iter++;
}else{
if (TorkConfig::clientOnly()){
iter = serverCount;
return;
}
m_statusInfo->setText(QString("Server: %1").arg(server[iter])
.replace("<font color='#990000'>","")
.replace("</font>",""));
iter++;
}
}
void tork::changeStatusbar(const QString& in,const QString& out)
{
if ((in == "zero") && (out =="zero")){
QString tmp1 = i18n("Transferred up: 0 B / down: 0 B");
m_statusTransfer->setText(tmp1);
}
}
void tork::sayWhatImDoing(const QString& text)
{
// display the text on the caption
m_statusInfo->setText(text);
}
void tork::changeCaption(const QString& text)
{
// display the text on the caption
setCaption(text);
}
void tork::startTor()
{
m_ShutdownRequested = false;
if (childproc !=0L)
return;
m_list.clear();
if (TorkConfig::torLocation().isEmpty() || (!QFile::exists(TorkConfig::torLocation()))){
processWarning( "notorexecutable",i18n("You can't find me.") );
return;
}
sayWhatImDoing("Starting Tor..");
childproc = new KProcIO();
childproc->setUseShell(TRUE);
QString torConfFile = writeConf();
*childproc << TorkConfig::torLocation() << " -f " + torConfFile;
connect( childproc, SIGNAL(processExited(KProcess *)),
SLOT(childExited()) );
connect( childproc, SIGNAL(readReady(KProcIO *)),
SLOT(receivedOutput(KProcIO *)) );
childproc->start(KProcIO::NotifyOnExit) ;
}
void tork::stopTorGracefully()
{
m_ShutdownRequested = true;
if (TorkConfig::clientOnly()){
stopTor();
return;
}
if ((childproc !=0L) && (client != 0L)){
client->terminateTor();
processQuestion("terminatetor",
i18n("Give me 30 seconds to close connections."));
}else
stopTor();
}
void tork::stopTor()
{
if (m_DNSTorified){
KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", i18n("<b>You are now in FailSafe Mode</b>. <br> You need to be in Normal Mode before you can stop Tor."));
return;
}
// start Tor
stopController();
stopNetStat();
if (privoxyproc !=0L){
privoxyproc->kill();
delete privoxyproc;
privoxyproc = 0L;
}
if (tfPrivoxy !=0L){
delete tfPrivoxy;
tfPrivoxy = 0L;
}
if (tfTor !=0L){
delete tfTor;
tfTor = 0L;
}
if (childproc !=0L){
childproc->kill();
delete childproc;
childproc = 0L;
}
torkStart->setEnabled(true);
m_LaunchMenuButton->setEnabled(false);
m_IdentityButton->setEnabled(false);
m_PseudoButton->setEnabled(false);
m_ServerFilterButton->setEnabled(false);
m_ServerButton->setEnabled(false);
m_SecurityButton->setEnabled(false);
//Reset Country filter menu to 'All' checked
for ( QMap<QString, KPopupMenu*>::Iterator menu = continentMapList.begin(); menu != continentMapList.end(); ++menu ){
for (unsigned int index = 0; index != menu.data()->count(); ++index){
menu.data()->setItemChecked( menu.data()->idAt(index), false );
}
}
m_CountryMenu->setItemChecked( 251, true );
//Reset server filter menu to 'All' checked
for (unsigned int index = 1; index != serverCondition.count(); ++index){
m_ServerFilterMenu->setItemChecked( index, false ); //uncheck old item
}
m_ServerFilterMenu->setItemChecked( 0, true );
//Reset Pseudonymity filter menu to 'All' checked
for ( QMap<QString, KPopupMenu*>::Iterator menu = continentMap.begin(); menu != continentMap.end(); ++menu )
{
for (unsigned int index = 0; index != menu.data()->count(); ++index){
menu.data()->setItemChecked( menu.data()->idAt(index),false);
}
}
m_PseudoMenu->setItemChecked(999,true);
torkStop->setEnabled(false);
enableKonqi->setEnabled(false);
browseHiddenServices->setEnabled(false);
//timer->stop();
_tray->setPixmap(KSystemTray::loadIcon("tork_pressplay"));
changeStatusbar("zero","zero");
turnOffKDE();
m_view->m_osd->infoList->clear();
m_view->m_osd->hide();
sayWhatImDoing(i18n("To connect to Tor, press play."));
m_view->toggleAnonymizerTork(false);
}
void tork::stopController()
{
m_view->resetBWHistory();
m_view->updateChart();
disconnect( client, SIGNAL(fatalError()),this, SLOT(cannotContactTor()));
disconnect( client, SIGNAL(torConnectionClosed()), this, SLOT(torClosedConnection()) );
disconnect( client, SIGNAL(streamStatusUpdate(const QString &, const QString &,
const QString &, const QString &, const QString &)),
m_view,SLOT(streamStatusUpdated(const QString &, const QString &,
const QString &, const QString &, const QString &)) );
disconnect( client, SIGNAL(ORStatusUpdate(const QString &, const QString &)),
m_view,SLOT(ORStatusUpdated(const QString &, const QString &)) );
disconnect( client, SIGNAL(guardStatusUpdate(const QString &, const QString &)),
m_view,SLOT(guardStatusUpdated(const QString &, const QString &)) );
disconnect( client, SIGNAL(circuitStatusUpdate(const QString &, const QString &,
const QString &, const QString &)),
m_view,SLOT(circuitStatusUpdated(const QString &, const QString &,
const QString &, const QString &)) );
disconnect( client, SIGNAL(infoUpdate(const QString &,const QString &, const QString &)),
this,SLOT(infoUpdated(const QString &,const QString &, const QString &)) );
disconnect( client, SIGNAL(bwUpdate(const QString &,const QString &)),
m_view,SLOT(bwUpdated(const QString &,const QString &)) );
disconnect( client, SIGNAL(streamBwUpdate(const QString &,const QString &,const QString &)),
m_view,SLOT(streamBwUpdated(const QString &,const QString &,const QString &)) );
disconnect( client, SIGNAL(updateActiveServers(const QStringList &)),
m_view,SLOT(activeServersUpdated(const QStringList &)) );
disconnect( client, SIGNAL(updateServerStatus(const QString &,const QString &,
const QString &,const QString &)),
m_view,SLOT(serverStatusUpdated(const QString &,const QString &,
const QString &,const QString &)) );
disconnect( client, SIGNAL(setTorCaption(const QString &)),
this,SLOT(setTorCaption(const QString &)) );
disconnect(m_view->circuitList, SIGNAL(attach(const QString &,const QString &)),
client, SLOT(attemptAttach(const QString &,const QString & )) );
disconnect(m_view->circuitList, SIGNAL(extendCircuit(const QString &, const QString &, bool)),
client, SLOT(attemptExtendCircuit(const QString &, const QString &, bool)) );
disconnect(m_view->circuitList, SIGNAL(createCircuit(const QString &, bool)),
client, SLOT(attemptCreateCircuit(const QString &, bool)) );
disconnect( m_view->serverList, SIGNAL(mouseButtonPressed (int, QListViewItem *,
const QPoint &, int)), this, SLOT(slotOnItem ( int, QListViewItem *,
const QPoint &, int )));
disconnect( m_view->ORList, SIGNAL(pressed ( QListViewItem * )), this,
SLOT(slotOnORItem ( QListViewItem * )));
disconnect(m_view->m_osd, SIGNAL(closeStream(const QString &)),
client, SLOT(attemptCloseStream(const QString & )) );
disconnect(m_view, SIGNAL(closeStream(const QString &)),
client, SLOT(attemptCloseStream(const QString & )) );
disconnect(m_view, SIGNAL(attachStreams(bool)),
client, SLOT(attemptAttachStreams( bool )) );
disconnect(m_view, SIGNAL(closeCircuit(const QString &)),
client, SLOT(attemptCloseCircuit(const QString & )) );
disconnect(m_view, SIGNAL(closeAllCircuits( QListView* &)),
client, SLOT(closeAllCircuits( QListView* & )) );
disconnect(client, SIGNAL(displayError(const QString &, const QString &)),
m_view, SLOT(displayError(const QString &,const QString & )) );
disconnect(client, SIGNAL(displayServer(const QString &, const QString &)),
m_view, SLOT(displayServer(const QString &,const QString & )) );
disconnect(client, SIGNAL(whatImDoing(const QString &)),
this, SLOT(sayWhatImDoing(const QString & )) );
disconnect(client, SIGNAL(copyOldConfig()),
this, SLOT(copyOldConfig()) );
disconnect(client, SIGNAL(shouldIApplySettings()),
this, SLOT(shouldIApplySettings()) );
disconnect(client, SIGNAL(makeTorkStoppable()),
this, SLOT(makeTorkStoppable()) );
disconnect(m_view->streamList, SIGNAL(attach(const QString &,const QString &)),
client, SLOT(attemptAttach(const QString &,const QString & )) );
disconnect(client, SIGNAL(warnNoServerInfo()),
this, SLOT(warnNoServerInfo()) );
disconnect(client, SIGNAL(needAlphaVersion()),
this, SLOT(needAlphaVersion()) );
disconnect(client, SIGNAL(connectedToTor()),
client, SLOT(authenticate()) );
disconnect(m_view, SIGNAL(updateExcludeNodes()),
client, SLOT(updateExcludeNodes()) );
disconnect(m_view, SIGNAL(updateEntryNodes()),
client, SLOT(updateEntryNodes()) );
disconnect(m_view, SIGNAL(updateExitNodes()),
client, SLOT(updateExitNodes()) );
disconnect(m_view, SIGNAL(clearNodes()),
client, SLOT(clearNodes()) );
disconnect(m_view, SIGNAL(updateStrictExitNodes(bool)),
client, SLOT(strictExitNodes(bool)) );
disconnect(m_view, SIGNAL(safeLogging(bool)),
client, SLOT(safeLogging(bool)) );
disconnect( m_view, SIGNAL(signalCheckTorNet()),
client, SLOT( slotCheckTorNet() ) );
disconnect( m_view, SIGNAL(signalCheckGuards()),
client, SLOT( slotCheckGuards() ) );
disconnect( m_view, SIGNAL(signalCheckBWSettings()),
this, SLOT( checkBandwidthSettings() ) );
disconnect(client, SIGNAL(processWarning(const QString& , const QString& )),
this, SLOT(processWarning(const QString& , const QString& )));
disconnect(client, SIGNAL(processQuestion(const QString& , const QString& )),
this, SLOT(processQuestion(const QString& , const QString& )));
disconnect(client, SIGNAL(updateTrayIcon(const QString&)),
this, SLOT(updateTrayIcon(const QString&)));
disconnect( client, SIGNAL(showServerBW(const QString&)),
m_view, SLOT( showServerBW(const QString&) ) );
disconnect( m_view, SIGNAL(resolveAddress(const QString&)),
client, SLOT( resolveAddress(const QString&) ) );
disconnect( client, SIGNAL(resolvedAddress(const QString&)),
m_view, SLOT( resolvedAddress(const QString&) ) );
if (bwtimer != 0L){
disconnect( bwtimer, SIGNAL( timeout() ), m_view, SLOT( reportBW() ) );
delete bwtimer;
bwtimer = 0L;
}
if (bwLimitTimer != 0L){
disconnect( bwLimitTimer, SIGNAL( timeout() ), this, SLOT( checkBandwidthSettings() ) );
delete bwLimitTimer;
bwLimitTimer = 0L;
}
if (client != 0L){
client->cleanUp();
client->socketReadyRead();
client->deleteLater();
client = 0L;
}
_tray->setPixmap(KSystemTray::loadIcon("tork_pressplay"));
m_view->circuitList->clear();
m_view->ORList->clear();
m_view->serverList->clear();
m_view->streamList->clear();
m_list.clear();
m_view->clearStreamMaps();
setCaption("");
TorkConfig::setCurrentExcludeNodes("");
TorkConfig::setCurrentEntryNodes("");
TorkConfig::setCurrentExitNodes("");
TorkConfig::writeConfig();
m_CanApplyServerSettingsIfSet=false;
_tray->updateStats(BytesPerSecToString(0),BytesPerSecToString(0),
BytesPerSecToString(0),BytesPerSecToString(0),
QStringList("<font color='#990000'>Status Not Known</font>"),
QStringList("<font color='#990000'>Status Not Known</font>"),
BytesPerSecToString(0));
}
QString tork::writeConf()
{
if (tfTor != 0L)
delete tfTor;
tfTor = new KTempFile();
tfTor->setAutoDelete(true);
if ( tfTor->status() != 0 ) {
tfTor->close();
KMessageBox::information (this,"KMFilterActionWithCommand: Could not create temp file!");
return QString();
}
QTextStream &ts = *(tfTor->textStream());
switch (TorkConfig::quickConfigure()) {
case 0 : //Tor client and server with default settings
configureServer(1);
ts << "ContactInfo " << TorkConfig::contactInfo() << "\n";
ts << "ControlPort " << TorkConfig::controlPort() << "\n";
ts << "NickName " << TorkConfig::nickName() << "\n";
ts << "ORPort " << upnpORPort() << "\n";
ts << "ORListenAddress 0.0.0.0:" << TorkConfig::oRListenAddress() << "\n";
ts << "DirPort " << upnpDirPort() << "\n";
ts << "DirListenAddress 0.0.0.0:" << TorkConfig::dirListenAddress() << "\n";
ts << "CookieAuthentication " << TorkConfig::cookieAuthentication() << "\n";
break;
case 1 : //Tor client and relay server with default settings
configureServer(2);
ts << "ContactInfo " << TorkConfig::contactInfo() << "\n";
ts << "ControlPort " << TorkConfig::controlPort() << "\n";
ts << "NickName " << TorkConfig::nickName() << "\n";
ts << "ORPort " << upnpORPort() << "\n";
ts << "ORListenAddress 0.0.0.0:" << TorkConfig::oRListenAddress() << "\n";
ts << "DirPort " << upnpDirPort() << "\n";
ts << "DirListenAddress 0.0.0.0:" << TorkConfig::dirListenAddress() << "\n";
if (TorkConfig::middleMan()){
ts << "ExitPolicy reject *:*\n";
}
ts << "CookieAuthentication " << TorkConfig::cookieAuthentication() << "\n";
break;
case 2 : //Tor server with default settings
configureServer(1);
ts << "ContactInfo " << TorkConfig::contactInfo() << "\n";
ts << "ControlPort " << TorkConfig::controlPort() << "\n";
ts << "NickName " << TorkConfig::nickName() << "\n";
ts << "ORPort " << upnpORPort() << "\n";
ts << "ORListenAddress 0.0.0.0:" << TorkConfig::oRListenAddress() << "\n";
ts << "DirPort " << upnpDirPort() << "\n";
ts << "DirListenAddress 0.0.0.0:" << TorkConfig::dirListenAddress() << "\n";
ts << "CookieAuthentication " << TorkConfig::cookieAuthentication() << "\n";
break;
case 3 : //Tor relay server with default settings
configureServer(2);
ts << "ContactInfo " << TorkConfig::contactInfo() << "\n";
ts << "ControlPort " << TorkConfig::controlPort() << "\n";
ts << "NickName " << TorkConfig::nickName() << "\n";
ts << "ORPort " << upnpORPort() << "\n";
ts << "ORListenAddress 0.0.0.0:" << TorkConfig::oRListenAddress() << "\n";
ts << "DirPort " << upnpDirPort() << "\n";
ts << "DirListenAddress 0.0.0.0:" << TorkConfig::dirListenAddress() << "\n";
if (TorkConfig::middleMan()){
ts << "ExitPolicy reject *:*\n";
}
ts << "CookieAuthentication " << TorkConfig::cookieAuthentication() << "\n";
break;
case 4 : //Tor client with default settings
configureServer(0);
ts << "ControlPort " << TorkConfig::controlPort() << "\n";
ts << "CookieAuthentication " << TorkConfig::cookieAuthentication() << "\n";
break;
case 5 : //Use custom settings
ts << "ContactInfo " << TorkConfig::contactInfo() << "\n";
ts << "NickName " << TorkConfig::nickName() << "\n";
ts << "ControlPort " << TorkConfig::controlPort() << "\n";
writeCustomOptions2(ts);
break;
}
if (TorkConfig::useProxy()){
if ((TorkConfig::httpProxyPort() > 0) && (!TorkConfig::httpProxyHost().isEmpty()))
( ts << "HttpProxy " << TorkConfig::httpProxyHost() << ":"
<< TorkConfig::httpProxyPort() << "\n") ;
if ((TorkConfig::httpsProxyPort() > 0) && (!TorkConfig::httpsProxyHost().isEmpty()))
( ts << "HttpsProxy " << TorkConfig::httpsProxyHost() << ":"
<< TorkConfig::httpsProxyPort() << "\n") ;
if ((!TorkConfig::httpProxyAuthenticatorUserName().isEmpty()) &&
(!TorkConfig::httpProxyAuthenticatorPassword().isEmpty()))
(ts << "HttpProxyAuthenticator " << TorkConfig::httpProxyAuthenticatorUserName()
<< ":" << TorkConfig::httpProxyAuthenticatorPassword() << "\n");
if ((!TorkConfig::httpsProxyAuthenticatorUserName().isEmpty()) &&
(!TorkConfig::httpsProxyAuthenticatorPassword().isEmpty()))
(ts << "HttpsProxyAuthenticator " << TorkConfig::httpsProxyAuthenticatorUserName()
<< ":" << TorkConfig::httpsProxyAuthenticatorPassword() << "\n");
}
tfTor->close();
return tfTor->name();
}
void tork::writeCustomOptions2(QTextStream &ts)
{
//Add any new servers to excludeNodes that we want excluded by Country
QStringList existingServers = TorkConfig::serversHistory();
QStringList currentExcludeNodes = TorkConfig::excludeNodes();
for ( QStringList::Iterator it = existingServers.begin(); it != existingServers.end(); ++it )
{
if ((*it).isEmpty())
continue;
int cc = (*it).section("-",0,0).toInt();
QString nick = (*it).section("-",1);
QString fp = getFPFromFPDigest(nick);
if (fp.isEmpty())
continue;
if ((!TorkConfig::excludeNodes().contains("$"+fp)) &&
(TorkConfig::excludeCountries().contains(GeoIP_country_code[cc])))
currentExcludeNodes.append("$"+fp);
}
if (!currentExcludeNodes.isEmpty()){
TorkConfig::setExcludeNodes(currentExcludeNodes);
}
KConfigSkeletonItem::List items = TorkConfig::self()->items();
KConfigSkeletonItem::List::ConstIterator it;
for( it = items.begin(); it != items.end(); ++it ) {
kdDebug() << (*it)->name() << endl;
if (elementShouldBeUsed((*it))){
if (noSpecialProcessing((*it), ts)){
if ( (*it)->property().type() == QVariant::String ) {
if (!((*it)->property().toString()).isEmpty()){
( ts << (*it)->name() << " " << (*it)->property().toString() << "\n");
kdDebug() << (*it)->name() << " " << (*it)->property().toString() << endl;
}
}else if ( (*it)->property().type() == QVariant::StringList ) {
if (!((*it)->property().toStringList()).isEmpty()){
( ts << (*it)->name() << " " << (*it)->property().toStringList().join(",")
<< "\n");
}
}else if ( (*it)->property().type() == QVariant::Int ) {
if (((*it)->property().toInt()) > 0){
( ts << (*it)->name() << " " << (*it)->property().toString() << "\n");
kdDebug() << (*it)->name() << " " << (*it)->property().toString() << endl;
}
}else if ( (*it)->property().type() == QVariant::Bool ) {
if (((*it)->property().toInt()) > 0){
( ts << (*it)->name() << " " << (*it)->property().toInt() << "\n");
kdDebug() << (*it)->name() << " " << (*it)->property().toInt() << endl;
}
}
}
}
//if ( p.type() == QVariant::Bool ) {
}
if ((!TorkConfig::sOCKSBindAddressHost().isEmpty()) && (TorkConfig::sOCKSBindAddressPort() > -1))
( ts << "SOCKSListenAddress " << TorkConfig::sOCKSBindAddressHost() << ":" << TorkConfig::sOCKSBindAddressPort() <<"\n") ;
if ((TorkConfig::sOCKSBindAddressHost().isEmpty()) && (TorkConfig::sOCKSBindAddressPort() > -1))
( ts << "SOCKSPort " << TorkConfig::sOCKSBindAddressPort() <<"\n") ;
}
bool tork::elementShouldBeUsed(const KConfigSkeletonItem* it)
{
if ((((!TorkConfig::defaultMaxMinOptions())) && ((*it).group() == "MaxMin")) ||
(((!TorkConfig::defaultRunningNormalOptions())) && ((*it).group() == "RunningNormal")) ||
((!(TorkConfig::clientOnly())) && ((*it).group() == "DefaultServerAddress")) ||
((TorkConfig::fascistFirewall()) && ((*it).group() == "FirewallEvasion")) ||
((TorkConfig::useBridges()) && ((*it).group() == "Censorship")) ||
(((*it).group() == "RunningSpecial")) ||
(((*it).group() == "Servers")) ||
((!(TorkConfig::clientOnly())) && ((*it).group() == "MyServer")) ||
(((*it).group() == "Usability")) ||
(((*it).group() == "UsingTor")) ||
(((*it).group() == "MyHiddenServices")) ||
((!(TorkConfig::defaultServerPerformance())) && ((*it).group() == "ServerPerformance")))
return true;
return false;
}
bool tork::noSpecialProcessing(const KConfigSkeletonItem* it, QTextStream &ts)
{
if (((*it).name() == "DirListenAddress") ||
((*it).name() == "ORListenAddress")){
( ts << (*it).name() << "0.0.0.0:" <<
(*it).property().toString() << "\n");
return false;
}
if (((*it).name() == "BandwidthBurst") ||
((*it).name() == "BandwidthRate")){
( ts << (*it).name() << " " << (*it).property().toString() << "KB\n");
return false;
}
if ((*it).name() == "MaxAdvertisedBandwidth"){
( ts << (*it).name() << " " << (*it).property().toString() << "KB\n");
return false;
}
if ((*it).name() == "AccountingMax"){
( ts << (*it).name() << " " << ((*it).property().toInt() * 1024 * 1024) << "bytes\n");
return false;
}
if ((*it).name() == "AccountingStart"){
if ((*it).property().toString() == "day")
( ts << (*it).name() << " " << (*it).property().toString() << " 00:00\n");
else
( ts << (*it).name() << " " << (*it).property().toString() << " 1 00:00\n");
return false;
}
if ((*it).name() == "KeepalivePeriod"){
if (!TorkConfig::reachableAddresses().isEmpty()){
( ts << (*it).name() << " " << ((*it).property().toInt() * 60) << "\n") ;
}
return false;
}
if ((*it).name() == "TrackHostExits"){
if (!TorkConfig::trackHostExits().isEmpty()){
( ts << (*it).name() << " " << ((*it).property().toStringList().join(",")) << "\n") ;
if (TorkConfig::trackHostExitsExpire() > 0)
( ts << "TrackHostExitsExpire " << (TorkConfig::trackHostExitsExpire() * 60) << "\n") ;
}
return false;
}
if ((*it).name() == "SOCKSBindAddressMany"){
if (!TorkConfig::sOCKSBindAddressMany().isEmpty()){
QStringList socksbind = TorkConfig::sOCKSBindAddressMany();
for ( QStringList::Iterator it = (socksbind).begin(); it != (socksbind).end(); it++ )
{
if ((*it).isEmpty())
continue;
ts << "SOCKSListenAddress " << (*it) << "\n" ;
}
}
return false;
}
if ((*it).name() == "HashedControlPassword"){
if (!TorkConfig::hashedControlPassword().isEmpty()){
QString hash = hashPassword(TorkConfig::hashedControlPassword());
if(!hash.isEmpty())
ts << "HashedControlPassword 16:" << hash << "\n" ;
}
return false;
}
if ((*it).name() == "ExitPolicy"){
if (TorkConfig::middleMan())
ts << "ExitPolicy " << "reject *:*" << "\n" ;
else
ts << "ExitPolicy " << (*it).property().toStringList().join(",") << "\n" ;
return false;
}
if ((*it).name() == "HiddenServices"){
QStringList hiddenServices = TorkConfig::hiddenServices();
for ( QStringList::Iterator it = (hiddenServices).begin(); it != (hiddenServices).end(); it++ )
{
if ((*it).isEmpty())
continue;
ts << "HiddenServiceDir " << (*it).section("\n",-1) << "\n" ;
ts << "HiddenServicePort " << (*it).section("\n",-4,-4) << " " << (*it).section("\n",-3,-3) << "\n";
}
return false;
}
if ((*it).name() == "Bridge"){
QStringList bridges = TorkConfig::bridge();
for ( QStringList::Iterator it = (bridges).begin(); it != (bridges).end(); it++ )
{
if ((*it).isEmpty())
continue;
ts << "Bridge " << (*it) << "\n";
}
return false;
}
if ((*it).name() == "MyFamily"){
QStringList family = TorkConfig::myFamily();
QStringList allfamily;
for ( QStringList::Iterator it = (family).begin(); it != (family).end(); it++ )
{
if ((*it).isEmpty())
continue;
QString node = "$"+getFPFromFPDigest((*it).section("-",1,1));
allfamily.append(node) ;
}
ts << "MyFamily " << allfamily.join(",") << "\n";
return false;
}
if ((*it).name() == "MapAddress"){
QStringList maps = TorkConfig::mapAddress();
for ( QStringList::Iterator it = (maps).begin();
it != (maps).end(); it++ )
{
if ((*it).isEmpty())
continue;
QString mapAddress = QString("\"%2\"").arg((*it));
ts << "MapAddress " << mapAddress << "\n";
}
return false;
}
return true;
}
QString tork::doHashPassword()
{
hashproc = new KProcIO();
hashproc->setUseShell(TRUE);
m_hashedpassword = "";
QString hashCommand=QString("tor --hash-password %1").arg(TorkConfig::hashedControlPassword());
*hashproc<<hashCommand;
connect( hashproc, SIGNAL(readReady(KProcIO * )),
SLOT(processHashProc(KProcIO * )) );
hashproc->start(KProcIO::NotifyOnExit,TRUE);
while (hashproc->isRunning() && m_hashedpassword.isEmpty())
kapp->processEvents();
return m_hashedpassword;
}
void tork::processHashProc(KProcIO *hashproc)
{
QString item = "";
int pos;
while ((pos = (hashproc->readln(item,true))) != -1) {
if (item.startsWith("16:"))
m_hashedpassword = item;
}
hashproc->ackRead();
}
void tork::childExited()
{
delete childproc;
childproc = 0L;
torkStart->setEnabled(true);
m_LaunchMenuButton->setEnabled(false);
m_IdentityButton->setEnabled(false);
m_PseudoButton->setEnabled(false);
m_ServerFilterButton->setEnabled(false);
m_ServerButton->setEnabled(false);
m_SecurityButton->setEnabled(false);
torkStop->setEnabled(false);
enableKonqi->setEnabled(false);
browseHiddenServices->setEnabled(false);
sayWhatImDoing(i18n("To connect to Tor, press play."));
turnOffKDE();
}
void tork::privoxyExited()
{
bool died = false;
if ((privoxyproc->normalExit()) || (privoxyproc->signalled()))
died = true;
if (privoxyproc != 0L){
disconnect( privoxyproc, SIGNAL(processExited(KProcess *)),
this,SLOT(privoxyExited()) );
delete privoxyproc;
privoxyproc = 0L;
}
QString question;
if (stillStarting)
question = "privoxycouldntstart";
else
question = "privoxydied";
if (died)
processQuestion( question, i18n("Nothing.") );
}
void tork::startEverything()
{
if (client != 0L)
return;
m_showstopperAlreadyDisplayed = false;
switch (TorkConfig::quickConfigure()) {
case 0 :
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
/* This allows upnp/server configuration if we are starting a
server */
m_CanApplyServerSettingsIfSet=true;
startNetStat();
startPrivoxy();
startTor();
break;
case 6 :
startNetStat();
startController();
break;
case 7 :
startNetStat();
startPrivoxy();
startController();
break;
default:
return;
}
}
void tork::checkForSystemManagedPrivoxy()
{
QString host;
int port;
host = TorkConfig::konqHttpProxy();
port = TorkConfig::konqHttpProxyPort();
host = host.replace("http://","");
if (privoxytest == 0L) {
privoxytest = new TestPrivoxy();
connect( privoxytest, SIGNAL(fatalError()),this, SLOT(cannotContactPrivoxy()));
connect( privoxytest, SIGNAL(connectedToPrivacyProxy()),
this, SLOT(privacyProxyPassed()) );
}
privoxytest->connectTo(host,port);
}
void tork::cannotContactPrivoxy()
{
processQuestion("privoxynotrunning",i18n("Is your privacy proxy running?"));
privoxytest->closeConnection();
}
void tork::privacyProxyPassed()
{
privoxytest->closeConnection();
}
void tork::letTorKManagePrivoxy()
{
TorkConfig::setSystemProxy(false);
TorkConfig::setTorkProxy(true);
TorkConfig::writeConfig();
startPrivoxy();
}
void tork::startPrivoxy()
{
stillStarting = true;
QTimer::singleShot( 20000, this, SLOT(startingPeriodOver()) );
if (TorkConfig::systemProxy()) {
checkForSystemManagedPrivoxy();
return;
}
if (TorkConfig::privoxyLocation().isEmpty()){
processWarning( "noprivoxyexecutable", i18n("You can't find Privoxy."));
return;
}
if (privoxyproc != 0L){
disconnect( privoxyproc, SIGNAL(processExited(KProcess *)),
this,SLOT(privoxyExited()) );
delete privoxyproc;
privoxyproc = 0L;
}
privoxyproc = new KProcIO();
privoxyproc->setUseShell(TRUE);
QString curpath = (QString) getenv("PATH");
privoxyproc->setEnvironment("PATH",curpath +
":/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin");
QString location = getenv("HOME");
location += "/.tork";
QDir torkdir(location);
if (!torkdir.exists() && !torkdir.mkdir(location))
location = getenv("HOME");
QString privoxypid = QString("%1/.tork/privoxypid").arg(location);
QString privoxyConfFile = writePrivoxyConf();
*privoxyproc << TorkConfig::privoxyLocation() << " --user " << getenv("USER")
<< " --no-daemon --pidfile " << privoxypid << " " << privoxyConfFile;
connect( privoxyproc, SIGNAL(processExited(KProcess *)),
SLOT(privoxyExited()) );
privoxyproc->start(KProcIO::NotifyOnExit) ;
}
void tork::startingPeriodOver()
{
stillStarting = false;
}
QString tork::writePrivoxyConf()
{
if (tfPrivoxy != 0L)
delete tfPrivoxy;
tfPrivoxy = new KTempFile();
tfPrivoxy->setAutoDelete(true);
if ( tfPrivoxy->status() != 0 ) {
tfPrivoxy->close();
KMessageBox::information (this,"KMFilterActionWithCommand: Could not create temp file!");
return "";
}
QTextStream &ts = *(tfPrivoxy->textStream());
ts << "forward-socks4a / " << TorkConfig::sOCKSBindAddressHost() << ":"
<< TorkConfig::sOCKSBindAddressPort() << " ." << "\n";
ts << "confdir " << locate("data","tork/privoxy/") << "\n";
ts << "logdir ." << "\n";
ts << "listen-address " << TorkConfig::konqHttpProxy().replace("http://","") << ":"
<< TorkConfig::konqHttpProxyPort() << "\n";
ts << "debug 1 # URLs" << "\n";
ts << "debug 4096 # Info" << "\n";
ts << "debug 8192 # Errors - *we highly recommended enabling this*" << "\n";
ts << "toggle 1" << "\n";
ts << "buffer-limit 4069" << "\n";
ts << "forward 192.168.*.*/ ." << "\n";
ts << "forward 10.*.*.*/ ." << "\n";
ts << "forward 127.*.*.*/ ." << "\n";
// Following two config lines removed because of:
// http://archives.seul.org/or/talk/Oct-2007/msg00291.html
// ts << "enable-edit-actions 1" << "\n";
// ts << "enable-remote-toggle 1" << "\n";
tfPrivoxy->close();
return tfPrivoxy->name();
}
void tork::startController()
{
QString host;
int port;
if (TorkConfig::quickConfigure() == 6){
host = TorkConfig::remoteTorAddress();
port = TorkConfig::remoteTorPort();
}else if (TorkConfig::quickConfigure() == 7){
host = "localhost";
port = TorkConfig::remoteTorPort();
}else{
host = "localhost";
port = TorkConfig::controlPort();
}
torCaption = QString("%1:%2").arg(host).arg(port);
client = new TorClient(host,port);
setCaption(torCaption);
connect( client, SIGNAL(fatalError()),this, SLOT(cannotContactTor()));
connect( client, SIGNAL(torConnectionClosed()), SLOT(torClosedConnection()) );
connect( client, SIGNAL(streamStatusUpdate(const QString &, const QString &,
const QString &, const QString &, const QString &)),
m_view,SLOT(streamStatusUpdated(const QString &, const QString &,
const QString &, const QString &, const QString &)) );
connect( client, SIGNAL(ORStatusUpdate(const QString &, const QString &)),
m_view,SLOT(ORStatusUpdated(const QString &, const QString &)) );
connect( client, SIGNAL(guardStatusUpdate(const QString &, const QString &)),
m_view,SLOT(guardStatusUpdated(const QString &, const QString &)) );
connect( client, SIGNAL(circuitStatusUpdate(const QString &, const QString &,
const QString &, const QString &)),
m_view,SLOT(circuitStatusUpdated(const QString &, const QString &,
const QString &, const QString &)) );
connect( client, SIGNAL(infoUpdate(const QString &,const QString &, const QString &)),
this,SLOT(infoUpdated(const QString &,const QString &, const QString &)) );
connect( client, SIGNAL(bwUpdate(const QString &,const QString &)),
m_view,SLOT(bwUpdated(const QString &,const QString &)) );
connect( client, SIGNAL(streamBwUpdate(const QString &,const QString &,const QString &)),
m_view,SLOT(streamBwUpdated(const QString &,const QString &,const QString &)) );
connect( client, SIGNAL(updateActiveServers(const QStringList &)),
m_view,SLOT(activeServersUpdated(const QStringList &)) );
connect( client, SIGNAL(updateServerStatus(const QString &,const QString &,
const QString &,const QString &)),
m_view,SLOT(serverStatusUpdated(const QString &,const QString &,
const QString &,const QString &)) );
connect( client, SIGNAL(setTorCaption(const QString &)),
this,SLOT(setTorCaption(const QString &)) );
connect(m_view->circuitList, SIGNAL(attach(const QString &,const QString &)),
client, SLOT(attemptAttach(const QString &,const QString & )) );
connect(m_view->circuitList, SIGNAL(extendCircuit(const QString &, const QString &, bool)),
client, SLOT(attemptExtendCircuit(const QString &, const QString &, bool)) );
connect(m_view->circuitList, SIGNAL(createCircuit(const QString &, bool)),
client, SLOT(attemptCreateCircuit(const QString &, bool)) );
connect( m_view->serverList, SIGNAL(mouseButtonPressed ( int, QListViewItem * ,
const QPoint &, int )),
SLOT(slotOnItem ( int, QListViewItem * , const QPoint &, int )));
connect( m_view->ORList, SIGNAL(pressed ( QListViewItem * )),
SLOT(slotOnORItem ( QListViewItem * )));
connect(m_view->m_osd, SIGNAL(closeStream(const QString &)),
client, SLOT(attemptCloseStream(const QString & )) );
connect(m_view, SIGNAL(closeStream(const QString &)),
client, SLOT(attemptCloseStream(const QString & )) );
connect(m_view, SIGNAL(attachStreams(bool)),
client, SLOT(attemptAttachStreams( bool )) );
connect(m_view, SIGNAL(closeCircuit(const QString &)),
client, SLOT(attemptCloseCircuit(const QString & )) );
connect(m_view, SIGNAL(closeAllCircuits( QListView* &)),
client, SLOT(closeAllCircuits( QListView* & )) );
connect(client, SIGNAL(displayError(const QString &, const QString &)),
m_view, SLOT(displayError(const QString &,const QString & )) );
connect(client, SIGNAL(displayServer(const QString &, const QString &)),
m_view, SLOT(displayServer(const QString &,const QString & )) );
connect(client, SIGNAL(whatImDoing(const QString &)),
this, SLOT(sayWhatImDoing(const QString & )) );
connect(client, SIGNAL(copyOldConfig()),
this, SLOT(copyOldConfig()) );
connect(client, SIGNAL(shouldIApplySettings()),
this, SLOT(shouldIApplySettings()) );
connect(client, SIGNAL(makeTorkStoppable()),
this, SLOT(makeTorkStoppable()) );
connect(m_view->streamList, SIGNAL(attach(const QString &,const QString &)),
client, SLOT(attemptAttach(const QString &,const QString & )) );
connect(client, SIGNAL(warnNoServerInfo()),
this, SLOT(warnNoServerInfo()) );
connect(client, SIGNAL(needAlphaVersion()),
this, SLOT(needAlphaVersion()) );
connect(client, SIGNAL(connectedToTor()),
client, SLOT(authenticate()) );
connect(m_view, SIGNAL(updateExcludeNodes()),
client, SLOT(updateExcludeNodes()) );
connect(m_view, SIGNAL(updateEntryNodes()),
client, SLOT(updateEntryNodes()) );
connect(m_view, SIGNAL(updateExitNodes()),
client, SLOT(updateExitNodes()) );
connect(m_view, SIGNAL(clearNodes()),
client, SLOT(clearNodes()) );
connect(m_view, SIGNAL(updateStrictExitNodes(bool)),
client, SLOT(strictExitNodes(bool)) );
connect(m_view, SIGNAL(safeLogging(bool)),
client, SLOT(safeLogging(bool)) );
connect( m_view, SIGNAL(signalCheckTorNet()),
client, SLOT( slotCheckTorNet() ) );
connect( m_view, SIGNAL(signalCheckGuards()),
client, SLOT( slotCheckGuards() ) );
connect( m_view, SIGNAL(signalCheckBWSettings()),
this, SLOT( checkBandwidthSettings() ) );
connect(client, SIGNAL(processWarning(const QString& , const QString& )),
this, SLOT(processWarning(const QString& , const QString& )));
connect(client, SIGNAL(processQuestion(const QString& , const QString& )),
this, SLOT(processQuestion(const QString& , const QString& )));
connect(client, SIGNAL(updateTrayIcon(const QString&)),
this, SLOT(updateTrayIcon(const QString&)));
connect( client, SIGNAL(showServerBW(const QString&)),
m_view, SLOT( showServerBW(const QString&) ) );
connect( m_view, SIGNAL(resolveAddress(const QString&)),
client, SLOT( resolveAddress(const QString&) ) );
connect( client, SIGNAL(resolvedAddress(const QString&)),
m_view, SLOT( resolvedAddress(const QString&) ) );
QTimer::singleShot( 10000, this, SLOT(isControllerWorking()) );
torkStart->setEnabled(false);
m_view->welcomeitem->setEnabled(false);
_tray->setPixmap(KSystemTray::loadIcon("tork_green"));
if( TorkConfig::alwaysAnonymizeKDE())
enableKDE(true);
else
TorkConfig::setKDEUsesTor(false);
TorkConfig::setCurrentExcludeNodes("");
TorkConfig::setCurrentEntryNodes("");
TorkConfig::setCurrentExitNodes("");
TorkConfig::writeConfig();
updateServerButton();
#ifndef EXTERNAL_GEOIP
geoip_db = !locate("data", "tork/geoip/GeoIP.dat").isNull();
#else
GeoIP * gi = 0;
gi = GeoIP_new(GEOIP_STANDARD);
if (gi)
geoip_db = true;
else
geoip_db = false;
#endif
client->setGeoIPAvailable(geoip_db);
m_view->setGeoIPAvailable(geoip_db);
if (!geoip_db)
processWarning("geoipmissing",i18n("Your GeoIP installation is broken."));
}
void tork::makeTorkStoppable()
{
torkStop->setEnabled(true);
m_LaunchMenuButton->setEnabled(true);
m_IdentityButton->setEnabled(true);
m_PseudoButton->setEnabled(true);
m_ServerFilterButton->setEnabled(true);
toggleServerButton(TorkConfig::useBridges());
m_SecurityButton->setEnabled(true);
enableKonqi->setEnabled(true);
browseHiddenServices->setEnabled(true);
sayWhatImDoing("Ready for use.");
m_view->toggleAnonymizerTork(true);
}
void tork::startFromBeginning()
{
stopController();
startTor();
}
void tork::receivedOutput(KProcIO *)
{
int pos;
QString item2;
if (!(childproc))
return;
while ((childproc) && ((pos = (childproc->readln(item2,true))) != -1)) {
if ((pos = (item2.find("Opening Control listener on"))) != -1){
QTimer::singleShot( 200, this, SLOT(startController()) );
}
int i;
for (i = 0; _tork_messages[i].logmessage; ++i) {
message_t *msg = &_tork_messages[i];
if (item2.contains(msg->logmessage)){
if ((*this.*(msg->pt2Member))()){
strncpy(msg->torsaid,item2,249);
showWarning(msg->state, msg->headline, item2, msg->body, msg->type,
msg->icon, msg->always, msg->showstopper);
}
}
}
for (i = 0; _tork_questions[i].logquestion; ++i) {
question_t *msg = &_tork_questions[i];
if (item2.contains(msg->logquestion)){
if ((*this.*(msg->pt2Member2))()){
(*this.*msg->silentAction)();
strncpy(msg->torsaid,item2,249);
askQuestion(msg->state, msg->headline, msg->torsaid, msg->body,
msg->question,msg->pt2Member, msg->type, msg->icon,
msg->persistent, msg->showstopper);
}
}
}
item2 = "";
}
}
void tork::infoUpdated(const QString &type, const QString &summary, const QString &data)
{
int i;
for (i = 0; _tork_messages[i].logmessage; ++i) {
message_t *msg = &_tork_messages[i];
if (summary.contains(msg->logmessage)){
if ((*this.*(msg->pt2Member))()){
strncpy(msg->torsaid,summary,249);
showWarning(msg->state, msg->headline, summary, msg->body,
msg->type,msg->icon, msg->always, msg->showstopper);
}
}
}
for (i = 0; _tork_questions[i].logquestion; ++i) {
question_t *msg = &_tork_questions[i];
if (summary.contains(msg->logquestion)){
if ((*this.*(msg->pt2Member2))()){
(*this.*msg->silentAction)();
strncpy(msg->torsaid,summary,249);
askQuestion(msg->state, msg->headline, msg->torsaid, msg->body,
msg->question,msg->pt2Member, msg->type,msg->icon,
msg->persistent, msg->showstopper);
}
}
}
m_view->infoUpdated(type,summary,data);
if (waitingForServers){
if (summary.contains("now have enough directory information")){
waitingForServers = false;
//QTimer::singleShot(20000, client, SLOT(slotCheckTorNet()) );
if (client != 0L)
client->slotCheckTorNet();
}
}
}
bool tork::showUsage()
{
return TorkConfig::showUsageWarnings();
}
bool tork::showSecurityWarnings()
{
return TorkConfig::showSecurityWarnings();
}
bool tork::showGuideQuestions()
{
return TorkConfig::showGuideQuestions();
}
bool tork::showApplySettingsQuestions()
{
return TorkConfig::showApplySettingsQuestions();
}
bool tork::showDNSLeaks()
{
return TorkConfig::showDNSLeaks();
}
bool tork::contactInfoSet()
{
if ((TorkConfig::showGuideQuestions()) && (TorkConfig::contactInfo().isEmpty()))
return true;
return false;
}
void tork::continueAsClient()
{
TorkConfig::setQuickConfigure(1);
startFromBeginning();
}
void tork::reconnectWithCookie()
{
TorkConfig::setCookieAuthentication(1);
startEverything();
}
void tork::copyCookie()
{
KProcIO *catproc = new KProcIO();
catproc->setUseShell(TRUE);
QString whichCommand= QString(
"kdesu -c '"
"mkdir -p -m 600 %1/.tor;"
"cp -u /var/lib/tor/control_auth_cookie %2/.tor/control_auth_cookie;"
"cp -u /usr/local/var/lib/tor/control_auth_cookie %3/.tor/control_auth_cookie;"
"chown -R %4 %5/.tor/;"
"chown %6 %7/.tor/control_auth_cookie"
"'").arg(getenv("HOME")).arg(getenv("HOME")).arg(getenv("HOME"))
.arg(getenv("USER")).arg(getenv("HOME"))
.arg(getenv("USER")).arg(getenv("HOME"));
*catproc<<whichCommand;
catproc->start(KProcIO::NotifyOnExit,TRUE);
}
void tork::shouldIApplySettings()
{
disconnect(client, SIGNAL(shouldIApplySettings()),
this, SLOT(shouldIApplySettings()) );
switch (TorkConfig::quickConfigure()) {
case 0 :
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
break;
case 6 :
case 7 :
if (!TorkConfig::showApplySettingsQuestions()){
applySettingsToRunningTor();
return;
}
processQuestion( "applysettings", i18n("Nothing.") );
break;
default:
break;
}
makeTorkStoppable();
}
void tork::applySettingsToRunningTor()
{
m_CanApplyServerSettingsIfSet=true;
kdDebug() << "applying settings" << endl;
if (client != 0L){
sayWhatImDoing("Applying settings to Tor..");
client->applySettingsToRunningTor();
}
if (client != 0L){
//We're setting the server config here. The server values aren't used if we're 'client only'.
//It needs to be called so that the sys tray icon reflects our choice of server vs client.
client->configureServer(upnpORPort(), upnpDirPort());
}
// Do we need to forward ports on the router?
if (m_routerDiscovered)
configureRouter(true,true);
}
void tork::updateTork()
{
if (!updater)
updater = new TorkUpdate(this);
updater->checkForNewTorkDirectly();
}
void tork::updateTorStable()
{
if (!updater)
updater = new TorkUpdate(this);
updater->checkForNewTorDirectly(false);
}
void tork::updateTorUnstable()
{
if (!updater)
updater = new TorkUpdate(this);
updater->checkForNewTorDirectly(true);
}
void tork::updatePrivoxy()
{
if (!updater)
updater = new TorkUpdate(this);
updater->checkForNewPrivoxyDirectly();
}
void tork::assignPortToRemove()
{
if (client != 0L)
client->assignPortToRemove();
}
void tork::allowPlainTextPorts()
{
if (client != 0L)
client->allowPlainTextPorts();
}
void tork::runWizard()
{
if (!client){
FirstRunWizard wizard;
wizard.setCaption( i18n( "First-Run Wizard" ));
wizard.exec();
m_view->welcomeitem->score->setCurrentItem(TorkConfig::quickConfigure());
}else{
processWarning( "torrunning",i18n("You should only run the set-up wizard while TorK is not connected.") );
}
}
void tork::turnOffKDE()
{
setKDE(false);
}
void tork::toggleTorBar()
{
TorkConfig::setShowTorBar(!TorkConfig::showTorBar());
if (TorkConfig::showTorBar())
m_view->frame4->show();
else
m_view->frame4->hide();
}
void tork::toggleTorMon()
{
m_view->setShowTormon(!m_view->getShowTormon());
bool tormon = m_view->getShowTormon();
TorkConfig::setShowTorMon(tormon);
if (tormon){
if (m_view->streamList->childCount() == 0)
m_view->m_osd->hide();
else
m_view->m_osd->show();
}else{
m_view->m_osd->hide();
}
}
void tork::toggleTorMon2()
{
toggleTorMon();
toolBar("TorToolBar")->toggleButton(toolBar("TorToolBar")->idAt(0));
}
void tork::mixminionHome()
{
KURL url = "http://www.mixminion.net";
kapp->invokeBrowser(url.url(), "0");
}
void tork::hiddenServices()
{
KURL url = "tor://nnqtnsoohprzqcke.onion";
kapp->invokeBrowser(url.url(), "0");
}
void tork::networkList()
{
KURL url = "http://torstatus.blutmagie.de/";
kapp->invokeBrowser(url.url(), "0");
}
void tork::toggleKDESetting()
{
TorkConfig::setKDEUsesTor(!TorkConfig::kDEUsesTor());
setKDE(TorkConfig::kDEUsesTor());
if (TorkConfig::kDEUsesTor())
KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", i18n("All <b>Konqueror</b> Sessions Are Now Safe for Anonymous Use. <br> <b>Amarok, Akregator, KTorrent should be treated with caution! </b><br> This is because they may have javascript/java/plugins/flash enabled."));
else
KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", i18n("<b>Konqueror</b> is Now Back to "
"Non-Anonymous Use! <br> Close Konqueror completely and do not use it non-anonymously for a while. <br>"
"This is because malicious websites could gain access to information from your anonymous "
"session."));
}
void tork::enableKDE(bool enable)
{
TorkConfig::setKDEUsesTor(enable);
setKDE(TorkConfig::kDEUsesTor());
if (TorkConfig::kDEUsesTor())
KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", i18n("All <b>Konqueror</b> Sessions Are Now Safe for Anonymous Use. <br> <b>Amarok, Akregator, KTorrent should be treated with caution! </b><br> This is because they may have javascript/java/plugins/flash enabled."));
else
KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", i18n("<b>Konqueror</b> is Now Back to "
"Non-Anonymous Use! <br>Close Konqueror completely and do not use it non-anonymously for a while. <br>"
"This is because malicious websites could gain access to information from your anonymous "
"session."));
}
void tork::toggleKDESettingAndLaunchKonq()
{
toggleKDESetting();
if (TorkConfig::kDEUsesTor()){
KRun::runCommand( "konqueror --caption \"Anonymous Browsing Session\" "
"http://healthcheck.anonymityanywhere.com/",
"konqueror", "konqueror" );
}
}
void tork::enableKDEAndLaunchKonqWithUrl(const QString &url)
{
if (!TorkConfig::kDEUsesTor())
toggleKDESetting();
if (TorkConfig::kDEUsesTor()){
KRun::runCommand( QString("konqueror --caption \"Anonymous Browsing Session\" "
"%1").arg(url),
"konqueror", "konqueror" );
}
}
bool tork::getKDESetting()
{
return TorkConfig::kDEUsesTor();
}
void tork::setKDE(bool set)
{
if (!m_view->konqitem)
return;
KConfig* config = new KConfig("kioslaverc", false, false);
config->setGroup( "Proxy Settings" );
if (set){
config->writeEntry( "httpProxy", QString("%1:%2")
.arg(TorkConfig::konqHttpProxy())
.arg(TorkConfig::konqHttpProxyPort()) );
config->writeEntry( "httpsProxy", QString("%1:%2")
.arg(TorkConfig::konqHttpsProxy())
.arg(TorkConfig::konqHttpsProxyPort()) );
config->writeEntry( "ftpProxy", QString("%1:%2")
.arg(TorkConfig::konqFtpProxy())
.arg(TorkConfig::konqFtpProxyPort()) );
config->writeEntry( "ProxyType", "1" );
config->sync();
config = new KConfig("kcookiejarrc", false, false);
config->setGroup( "Cookie Policy" );
//KConfig doesn't return a bool, just a text representation of the bool
TorkConfig::setOriginalCookies(config->readEntry( "Cookies" )
== "true" ? true : false);
config->writeEntry( "Cookies", !TorkConfig::disableCookies() );
TorkConfig::writeConfig();
config->sync();
config = new KConfig("kio_httprc", false, false);
TorkConfig::setOriginalUseCache(config->readEntry( "UseCache" )
== "true" ? true : false);
TorkConfig::setOriginalSendUserAgent(config->readEntry("SendUserAgent" )
== "true" ? true : false);
config->writeEntry( "UseCache", !TorkConfig::disableCaching() );
config->writeEntry( "SendUserAgent",
!TorkConfig::disableBrowserIdentification() );
TorkConfig::writeConfig();
config->sync();
config = new KConfig("konquerorrc", false, false);
config->setGroup( "Java/JavaScript Settings" );
TorkConfig::setOriginalEnableJavascript(config->readEntry( "EnableJavaScript" )
== "true" ? true : false);
TorkConfig::setOriginalEnableJava(config->readEntry( "EnableJava" )
== "true" ? true : false);
TorkConfig::setOriginalEnablePlugins(config->readEntry( "EnablePlugins" )
== "true" ? true : false);
TorkConfig::writeConfig();
config->writeEntry( "EnableJavaScript",!TorkConfig::disableJava());
config->writeEntry( "EnableJava", !TorkConfig::disableJava() );
config->writeEntry( "EnablePlugins", !TorkConfig::disableJava() );
config->sync();
}else{
config->writeEntry( "httpProxy", TorkConfig::originalHttpProxy() );
config->writeEntry( "httpsProxy", TorkConfig::originalHttpsProxy() );
config->writeEntry( "ftpProxy", TorkConfig::originalFtpProxy() );
config->writeEntry( "ProxyType", TorkConfig::originalProxyType() );
config->sync();
config = new KConfig("kcookiejarrc", false, false);
config->setGroup( "Cookie Policy" );
config->writeEntry( "Cookies", TorkConfig::originalCookies() );
config->sync();
config = new KConfig("kio_httprc", false, false);
config->writeEntry( "UseCache", TorkConfig::originalUseCache() );
config->writeEntry( "SendUserAgent", TorkConfig::originalSendUserAgent() );
config->sync();
kdDebug() << "UseCache" << config->readEntry( "UseCache" )
<< endl;
config = new KConfig("konquerorrc", false, false);
config->setGroup( "Java/JavaScript Settings" );
config->writeEntry( "EnableJavaScript", TorkConfig::originalEnableJavascript() );
config->writeEntry( "EnableJava", TorkConfig::originalEnableJava() );
config->writeEntry( "EnablePlugins", TorkConfig::originalEnablePlugins() );
}
config->sync();
// Inform all running io-slaves about the changes...
// if we cannot update, ioslaves inform the end user...
if (!DCOPRef("*", "KIO::Scheduler").send("reparseSlaveConfiguration", QString::null))
{
QString caption = i18n("Update Failed");
QString message = i18n("You have to restart the running applications "
"for these changes to take effect.");
KMessageBox::information (this, message, caption);
return;
}
DCOPRef("konqueror*", "KonquerorIface").send("reparseConfiguration");
if (set){
enableKonqi->setIcon("tork_konqueroroff");
m_view->m_osd->toggleKDE->setIconSet(SmallIconSet( "tork_konqueroroff"));
m_view->konqitem->setIcon("tork_konqueror_stop");
m_view->konqitem->icon->repaint();
m_view->konqitem->setDescriptionText("<qt>"+
i18n("<b>Anonymous Browsing is now enabled.</b> "
"Click the icon to disable it.<br>"
"- You can toggle this setting at any time "
"using the konqueror icon in the toolbar or "
"the miniview.<br>"
)+"</qt>");
if (TorkConfig::torkProxy()){
m_view->configurePriv->setEnabled(true);
m_view->configurePrivText->setEnabled(true);
}
}else{
enableKonqi->setIcon("tork_konqueroron");
m_view->m_osd->toggleKDE->setIconSet(SmallIconSet( "tork_konqueroron"));
m_view->konqitem->setIcon("tork_konqueror_play");
m_view->konqitem->setDescriptionText("<qt>"+
i18n("<b>Click the icon to launch an anonymous "
"browsing session. </b><br>"
)+"</qt>");
m_view->konqitem->setPropertiesText("<qt>"+i18n(
"- Konqueror uses Privoxy in combination with Tor to "
"anonymize your browsing. <br>"
"- This will also make any other Konqueror sessions you "
"use anonymous. <br>"
"- It will <b>partially</b> anonymize applications "
"such as <b>KTorrent (tracker/search only)</b> and "
"<b>Amarok</b>. <br>"
"&nbsp;&nbsp;This is because they may still "
"have java/javascript enabled, which can compromise "
"anonymity. <br>"
"- You can toggle this setting at any time using "
"the Konqueror icon in the toolbar or the miniview.<br>"
)+"</qt>");
if (TorkConfig::torkProxy()){
m_view->configurePriv->setEnabled(false);
m_view->configurePrivText->setEnabled(false);
}
}
}
void tork::checkForKonqWindow(WId id)
{
if (KWin::WindowInfo(id,0,0).name().contains("Anonymous Browsing Session"))
KWin::setIcons(id,SmallIcon("tork"),SmallIcon("tork"));
}
void tork::showWarning( display_status_t &msg, const QString &headline,const QString &torsaid,const QString &thismeans, const QString &type, const QString &icon, bool always, bool showstopper)
{
kdDebug() << "in showwarning" << endl;
if (m_showstopperAlreadyDisplayed)
return;
if (m_list.contains(thismeans) && !always)
return;
if (m_toolTipShowing){
msg = DISPLAY_QUEUED;
return;
}
m_showstopperAlreadyDisplayed = showstopper;
if (!headline.contains("You May Be Leaking DNS Requests!") &&
!headline.contains("TorK has reset the bandwidth rates on Tor as per your instructions!"))
m_body = thismeans;
else
m_body = "";
m_toolTipShowing = true;
m_msg = &msg;
m_tooltip = new KDE::PopupMessage(statusBar(), m_statusInfo, 40000, type );
QString text = i18n( "<b>%1</b>").arg(headline);
text += QString( "<br>" ) + i18n( "<b>Message: </b> %1" ).arg(torsaid);
text += QString( "<br>" ) + i18n( "<b>This means: </b> %1" ).arg(thismeans);
text += QString( "<br>" );
//connect(m_tooltip, SIGNAL(yesClicked()),this, SLOT(serverHelp()));
connect(m_tooltip, SIGNAL(noClicked( )), SLOT(noClicked( )));
connect(m_tooltip, SIGNAL(Closed( )), SLOT(popUpClosed( )));
m_tooltip->showOkButton( true );
m_tooltip->showCounter( true );
m_tooltip->setMaskEffect( KDE::PopupMessage::Slide );
m_tooltip->setText( text );
//QString icon = QString("tork_%1").arg(type).replace(" ","_");
m_tooltip->setImage( DesktopIcon( icon, 48 ) );
m_tooltip->move( x(), y() + m_tooltip->height() );
m_tooltip->display();
if (!kmain->isActiveWindow()){
KPassivePopup *pop;
QPoint pnt;
pop = new KPassivePopup( kmain->_tray );
pnt = kmain->_tray->pos();
pop->setTimeout(15000);
pop->setView( i18n("%1").arg(headline),i18n("See TorK window for details.") );
pop->show(QPoint(pnt));
}
}
void tork::askQuestion(display_status_t &msg, const QString &headline,const QString &torsaid,const QString &body,const QString &question,void (tork::*pt2Func)(), const QString &type, const QString &icon, bool persistent, bool showstopper)
{
kdDebug() << "in askqeustion" << endl;
if (m_showstopperAlreadyDisplayed)
return;
if (m_list.contains(body))
return;
if (m_toolTipShowing){
msg = DISPLAY_QUEUED;
return;
}
m_showstopperAlreadyDisplayed = showstopper;
m_body = body;
m_toolTipShowing = true;
m_msg = &msg;
m_persistent = persistent;
m_pt2Func = pt2Func;
m_tooltip = new KDE::PopupMessage(statusBar(), m_statusInfo, 40000, type );
QString text = i18n( "<b>%1</b>").arg(headline);
text += QString( "<br>" ) + i18n( "<b>Message: </b> %1" ).arg(torsaid);
text += QString( "<br>" ) + i18n( "<b>Reason: </b> %1" ).arg(body);
text += QString( "<br>" ) + i18n( "%1" ).arg(question);
//damn. functions pointers can't be used in slots. i don't have the heart to unroll it atm.
connect(m_tooltip, SIGNAL(yesClicked( )), SLOT(slotHandle( )));
connect(m_tooltip, SIGNAL(noClicked( )), SLOT(noClicked( )));
connect(m_tooltip, SIGNAL(Closed( )), SLOT(popUpClosed( )));
m_tooltip->showBothButton( true );
m_tooltip->showCounter( true );
m_tooltip->setMaskEffect( KDE::PopupMessage::Slide );
m_tooltip->setText( text );
//QString icon = QString("tork_%1").arg(type).replace(" ","_").replace("'","");
m_tooltip->setImage( DesktopIcon( icon, 48 ) );
m_tooltip->move( x(), y() + m_tooltip->height() );
m_tooltip->display();
if (!kmain->isActiveWindow()){
KPassivePopup *pop;
QPoint pnt;
pop = new KPassivePopup( kmain->_tray );
pnt = kmain->_tray->pos();
pop->setTimeout(15000);
pop->setView( i18n("%1").arg(headline),i18n("%1 See TorK window for details.").arg(body) );
pop->show(QPoint(pnt));
}
}
void tork::slotHandle()
{
kdDebug() << "in slothandle" << endl;
(*this.*m_pt2Func)();
if (!m_body.isEmpty() && !m_persistent)
m_list.append( m_body );
processQueue( );
}
void tork::noClicked()
{
kdDebug() << "innoclicked" << endl;
if (!m_body.isEmpty() && !m_persistent)
m_list.append( m_body );
processQueue( );
}
void tork::popUpClosed()
{
kdDebug() << "in popupclosed" << endl;
processQueue();
}
void tork::processQueue()
{
kdDebug() << "in processqueue" << endl;
m_toolTipShowing = false;
*m_msg = DISPLAY_NONE;
int i;
for (i = 0; _tork_questions[i].logquestion; ++i) {
question_t *msg = &_tork_questions[i];
if (msg->state == DISPLAY_QUEUED){
(*this.*msg->silentAction)();
askQuestion(msg->state, msg->headline, msg->torsaid, msg->body,
msg->question,msg->pt2Member, msg->type,msg->icon,
msg->persistent, msg->showstopper);
return;
}else
strcpy(msg->torsaid,"");
}
for (i = 0; _tork_messages[i].logmessage; ++i) {
message_t *msg = &_tork_messages[i];
if (msg->state == DISPLAY_QUEUED){
showWarning(msg->state, msg->headline, msg->torsaid, msg->body,
msg->type, msg->icon,msg->always, msg->showstopper);
return;
}else
strcpy(msg->torsaid,"");
}
}
void tork::serverHelp()
{
KURL url = "http://tork.sourceforge.net/wiki/index.php/FAQ#Tor.2FTorK_say_my_server_isn.27t_reachable._What_do_I_do.3F";
kapp->invokeBrowser(url.url(), "0");
}
void tork::readEavesdropping()
{
KURL url = "http://tork.sourceforge.net/wiki/index.php/FAQ#Is_Tor_more_secure_than_ordinary_internet_use.3F";
kapp->invokeBrowser(url.url(), "0");
}
void tork::aboutTorify()
{
KURL url = "http://tork.sourceforge.net/wiki/index.php/FAQ#How_do_I_use_TorK_to_anonymize_applications.3F";
kapp->invokeBrowser(url.url(), "0");
}
void tork::aboutTor()
{
IntroWizard wizard;
wizard.setCaption( i18n( "Introduction To TorK" ));
wizard.exec();
}
void tork::configurePrivoxy()
{
KURL url = "http://config.privoxy.org";
kapp->invokeBrowser(url.url(), "0");
}
void tork::aboutParanoidMode()
{
KURL url = "http://tork.sourceforge.net/wiki/index.php/FAQ#What_is_.27Paranoid_Mode.27.3F";
kapp->invokeBrowser(url.url(), "0");
}
void tork::enterContactInfo()
{
openConfig("My Tor Server");
}
void tork::cannotContactTor()
{
stopTor();
processQuestion( "cannotcontacttor", i18n("Nothing. TorK tried to connect to Tor and failed.") );
}
void tork::torClosedConnection()
{
if (m_DNSTorified){
KNotifyClient::event(kmain->_tray->winId(),"TorDisabled",
i18n("<b>You are still in"
" FailSafe Mode</b>. <br> If Tor is still running its capacity to route FailSafe traffic <br> will"
" remain enabled. Enter your password to return <br> the rest of your system to Normal Mode."));
configureSecurity(0);
m_DNSTorified = false;
}
stopTor();
if (!m_ShutdownRequested)
processWarning( "torclosedconnection",
i18n("Did something happen to me?") );
return;
}
void tork::quickConfig()
{
openConfig("Quick Configure");
}
void tork::fixAddressPort()
{
TorkConfig::setQuickConfigure(7);
TorkConfig::writeConfig();
startEverything();
}
void tork::slotOnItem( int button, QListViewItem * item, const QPoint &, int)
{
if ((item == NULL) || (button == 2))
return;
if (client != 0L)
client->fetchServerInfo(item->text(2));
m_prevItem = item;
}
void tork::slotOnORItem( QListViewItem * item)
{
if (item == NULL)
return;
if (client != 0L)
client->fetchServerInfoByNick(item->text(1));
m_prevItem = item;
}
void tork::slotOffItem( )
{
m_view->hidePopup( );
}
void tork::isControllerWorking( )
{
if (!client)
return;
if (!client->isControllerWorking()){
processQuestion( "jdsklajdkslajdskla", i18n("TorK can't communicate with Tor on the controller port %1. Do you have something limiting/blocking traffic on that port?").arg(TorkConfig::controlPort()) );
QTimer::singleShot( 10000, this, SLOT(isControllerWorking()) );
}
}
void tork::warnNoServerInfo( )
{
processWarning( "we have none",i18n("I don't have a list of any servers yet!") );
waitingForServers = true;
}
void tork::needAlphaVersion( )
{
processQuestion( "needalpha",i18n("The feature it needs is available in 0.1.2.6 alpha and forward!") );
waitingForServers = true;
}
void tork::showTip()
{
KTipDialog::showTip(this,QString::null,true);
}
void tork::showTipOnStart()
{
KTipDialog::showTip(this);
}
void tork::startNetStat()
{
// Don't log netstat traffic if the feature is disabled or we are running a relay
if (!TorkConfig::logNonTorTraffic()
|| !TorkConfig::clientOnly())
return;
netstatproc = new KProcIO();
netstatproc->setUseShell(TRUE);
QString netstatcmd = "netstat -ntucpe";
if (!TorkConfig::netstatLocation().isEmpty())
netstatcmd = QString("%1 -ntucpe").arg(TorkConfig::netstatLocation());
*netstatproc << netstatcmd;
connect( netstatproc, SIGNAL(processExited(KProcess *)),
SLOT(netStatExited()) );
connect( netstatproc, SIGNAL(readReady(KProcIO *)),
SLOT(receivedNetStatOutput(KProcIO *)) );
netstatproc->start(KProcIO::NotifyOnExit) ;
}
void tork::stopNetStat()
{
if (netstatproc !=0L){
netstatproc->kill();
delete netstatproc;
netstatproc = 0L;
}
}
void tork::netStatExited()
{
delete netstatproc;
netstatproc = 0L;
}
void tork::receivedNetStatOutput(KProcIO *)
{
int pos;
QString item2;
// Don't print netstat output if we are running a relay
if (!TorkConfig::clientOnly())
return;
if (!(netstatproc))
return;
while ((netstatproc) && ((pos = (netstatproc->readln(item2,true))) != -1)) {
QString foreignAddress = item2.mid(44,24);
QString state = item2.mid(68,11);
QString inode = item2.mid(90,11);
QString program = item2.mid(102,19).stripWhiteSpace();
QListViewItem* nonTorTrafficLine;
uint tmpents = TorkConfig::nonTorTrafficMaxEntries();
if (inodes.count() > tmpents){
inodes.clear();
m_view->NonTorTraffic->clear();
}
if (program.isEmpty())
program = "unknown";
if (foreignAddress.contains("*:*"))
continue;
if (foreignAddress.contains("127.0.0.1"))
continue;
if ((!item2.left(3).contains("tcp")) && (!item2.left(3).contains("udp")))
continue;
QListViewItem* ba = inodes.find( inode );
if (ba)
continue;
nonTorTrafficLine = new QListViewItem(m_view->NonTorTraffic,QDateTime::currentDateTime ().toString(Qt::ISODate).replace("T"," "), foreignAddress,program,inode);
inodes.insert( inode, nonTorTrafficLine );
QString cleanedTarget = foreignAddress.section(":",0,0).stripWhiteSpace();
QString cleanedPort = foreignAddress.section(":",1,1).stripWhiteSpace();
QString iconPath = locate("cache", KMimeType::favIconForURL("http://"+cleanedTarget)+".png");
if (!iconPath.isEmpty()){
nonTorTrafficLine->setPixmap( 1, QPixmap( iconPath ) );
}else{
int i;
for (i = 0; _port_icon[i].port; ++i) {
portsandicons_t *pics = &_port_icon[i];
if (cleanedPort == pics->port){
nonTorTrafficLine->setPixmap( 1, SmallIcon(pics->icon) );
}
}
}
if (program.endsWith("/tor"))
continue;
if ((foreignAddress.contains(":domain")) || (foreignAddress.contains(":53 "))){
m_program = program;
QTimer::singleShot( 3000, this, SLOT(torUsedAfterDNSRequest()) );
}
item2 = "";
}
}
void tork::torUsedAfterDNSRequest()
{
if (QTime::currentTime().secsTo(m_view->timeTorWasLastUsed()) > -6){
processWarning("dnsrequestsdetected",i18n("Shortly before traffic to %1 passed through Tor, the program <b>%2</b> bypassed Tor to turn a domain name to an IP address. Traffic to <b>%3</b> may therefore not be fully anonymous.").arg(m_view->addrTorWasLastUsed()).arg(m_program).arg(m_view->addrTorWasLastUsed()));
}
}
void tork::processWarning(const QString& type, const QString& text)
{
int i;
for (i = 0; _tork_messages[i].logmessage; ++i) {
message_t *msg = &_tork_messages[i];
if (QString(msg->logmessage).contains(type)){
if ((*this.*(msg->pt2Member))()){
strncpy(msg->torsaid,text,249);
showWarning(msg->state, msg->headline, msg->torsaid,
msg->body, msg->type, msg->icon, msg->always, msg->showstopper);
m_view->infoUpdated("TorK",msg->headline,msg->body);
}
}
}
}
void tork::processQuestion(const QString& type, const QString& text)
{
QString tmptext = text;
tmptext.replace(",",", ");
int i;
for (i = 0; _tork_questions[i].logquestion; ++i) {
question_t *msg = &_tork_questions[i];
if ((*this.*(msg->pt2Member2))()){
if (QString(msg->logquestion).contains(type)){
(*this.*msg->silentAction)();
strncpy(msg->torsaid,tmptext,249);
askQuestion(msg->state, msg->headline, msg->torsaid, msg->body,
msg->question,msg->pt2Member, msg->type, msg->icon,
msg->persistent, msg->showstopper);
m_view->infoUpdated("TorK",msg->headline,msg->body);
}
}
}
}
void tork::showSecurityNotice(const QString& port)
{
processQuestion("securitynotice",i18n("Traffic on port %1 is not "
"encrypted. <b> Passwords </b> transmitted on this "
"channel could be harvested by the owner of the exit "
"node.").arg(port));
}
void tork::showScreamingNotice(const QString& port)
{
if (TorkConfig::currentTorVersion().left(3) != "0.1")
return;
processQuestion("screamingnotice",i18n("Now that I have your attention: "
"Traffic on port %1 is not encrypted and usually involves "
"passwords. <b> Passwords </b> transmitted on this channel"
" could be harvested by the owner of the exit node.")
.arg(port));
}
void tork::showFirewallEvasion()
{
openConfig("Firewall/Censor Evasion");
}
void tork::showMyServer()
{
openConfig("My Tor Server");
}
void tork::showMyHiddenServices()
{
if (!myHiddenDialog)
myHiddenDialog = new MyHidden(this);
myHiddenDialog->show();
myHiddenDialog->raise();
myHiddenDialog->setActiveWindow();
}
void tork::showMyKonqueror()
{
openConfig("Konqueror");
}
void tork::useNewIdentity()
{
if (recentNewIdentityRequest)
return;
if (client != 0L){
recentNewIdentityRequest = true;
QTimer::singleShot( 20000, this, SLOT(allowNewIdentityRequests()) );
client->newIdentity();
}
}
void tork::allowNewIdentityRequests()
{
recentNewIdentityRequest = false;
}
void tork::createService(const QString& dir, const QString& port)
{
if (client != 0L)
client->createService(dir,port);
}
void tork::toggleNonTorTraffic(bool state)
{
if (state)
startNetStat();
else
stopNetStat();
}
void tork::toggleTorTraffic(bool )
{
}
void tork::checkBandwidthSettings( )
{
if (client == 0L)
return;
if (TorkConfig::bandwidthSlots().isEmpty() || !TorkConfig::useScheduledBandwidth())
return;
QString newBW, newLdBW, nextBW;
int largestCandidateSoFar = -86400, newCandidate = 0, bestCandidate = -86400;
int nextScheduledCandidate =0, nextCandidate = 0;
int BWDayAsInt = 0;
int TodayAsInt = QDate::currentDate().dayOfWeek();
// Get current date/time
QDateTime currentDateTime = QDateTime::currentDateTime();
QDate nextDate;
QTime nextTime;
QStringList bandwidthSlots = TorkConfig::bandwidthSlots();
for ( QStringList::Iterator it = bandwidthSlots.begin(); it != bandwidthSlots.end(); ++it )
{
if ((*it).isEmpty())
continue;
//Get the entry's day as an int between 1 and 7
if ((*it).section("\n",-4,-4) == "Day")
BWDayAsInt = TodayAsInt;
else{
for (int i=1; i<8;i++){
if ((*it).section("\n",-4,-4) == QDate::longDayName(i)){
BWDayAsInt = i;
break;
}
}
}
//Construct entry's date/time
QDateTime BWDateTime = QDateTime::currentDateTime();
BWDateTime.setTime(QTime::fromString((*it).section("\n",-5,-5)));
signed int daysFrom = BWDayAsInt - TodayAsInt;
newCandidate = currentDateTime.secsTo(BWDateTime.addDays(daysFrom));
// Find the next scheduled change of BW after this one, for reporting
// to user if we change the BW now.
if (newCandidate < 0){
daysFrom = ((*it).section("\n",-4,-4) != "Day")?daysFrom+7:1;
nextCandidate = currentDateTime.secsTo(BWDateTime.addDays(daysFrom));
}else{
nextCandidate = newCandidate;
}
if ((nextScheduledCandidate == 0) || (nextCandidate < nextScheduledCandidate)){
nextScheduledCandidate = nextCandidate;
nextDate = BWDateTime.addDays(daysFrom).date();
nextTime = BWDateTime.addDays(daysFrom).time();
}
//Remember the largest date/time combination because if there is no other
// date/time combination in the past, then the largest is the most recent
if (newCandidate > largestCandidateSoFar){
largestCandidateSoFar = newCandidate;
newLdBW = (*it);
}
//If the date/time combo is in the past and it is 'larger' than our current
//candidate then we have a new candidate
if ((newCandidate < 0) && (newCandidate > bestCandidate)){
bestCandidate = newCandidate;
newBW = (*it);
}
}
if (newBW.isEmpty())
newBW = newLdBW;
if (newBW.isEmpty())
return;
unsigned long int cndBWRate = (newBW.section("\n",-3,-3).toInt() * 1024);
unsigned long int cndBWBurst = (newBW.section("\n",-2,-2).toInt() * 1024);
unsigned long int cndBWMax = (newBW.section("\n",-1).toInt() * 1024 );
if ((cndBWRate != client->getCurBandwidthRate()) ||
(cndBWBurst != client->getCurBandwidthBurst()) ||
(cndBWMax != client->getCurMaxAdvertisedBandwidth())){
client->setBandwidth(newBW.section("\n",-3,-3),newBW.section("\n",-2,-2),
newBW.section("\n",-1));
QTime bwtime = QTime::fromString(nextBW.section("\n",-5,-5));
processWarning( "bwreset",i18n("Tor bandwidth has been reset to: Max Incoming -"
" <b>%1 KB/s</b>."
" Max Burst - <b>%2 KB/s</b>. Max Advertised - <b>%3 KB/s</b>."
" Your next scheduled bandwidth change is on %4 at %5.")
.arg(newBW.section("\n",-3,-3)).arg(newBW.section("\n",-2,-2))
.arg(newBW.section("\n",-1)).arg(nextDate.toString("dddd MMMM d"))
.arg(nextTime.toString("h:mm ap")));
client->getBandwidth();
}
}
void tork::setBandwidthFromSysTray(int rate )
{
if (client == 0L)
return;
client->setBandwidth(QString("%1").arg(rate),QString("%1").arg(rate*2),
"");
client->getBandwidth();
}
void tork::setTorCaption(const QString& caption)
{
setCaption(QString("%1 using Tor %2").arg(torCaption).arg(caption));
TorkConfig::setCurrentTorVersion(caption);
TorkConfig::writeConfig();
if (caption.left(3) == "0.1"){
m_view->streamList->hideColumn(1);
m_view->streamList->header()->setResizeEnabled(FALSE, 1);
m_view->streamList->setResizeMode( QListView::NoColumn );
m_UnCensorButton->unplug( toolBar("TorToolBar") );
m_SecurityButton->unplug( toolBar("MoreToolBar") );
m_ServerButtonMenu->setItemEnabled( 3, false );
emit processWarning("featuresdisabled",i18n("Nothing."));
}
}
void tork::resetTor()
{
KProcIO *catproc = new KProcIO();
catproc->setUseShell(TRUE);
QString whichCommand= "kdesu -c 'killall -s HUP tor'";
*catproc<<whichCommand;
catproc->start(KProcIO::NotifyOnExit,TRUE);
connect( catproc, SIGNAL(processExited(KProcess *)),
SLOT(resetExited()) );
}
void tork::resetExited()
{
startEverything();
}
void tork::upnpForwardingOK(kt::UPnPRouter* router,const QString& string, bool fwd)
{
kdDebug() << "UPNPforwardingok" << endl;
QString tmpports = QStringList::split("<NewExternalPort>",string)[1];
QString extport = QStringList::split("</NewExternalPort>",tmpports)[0];
tmpports = QStringList::split("<NewInternalPort>",string)[1];
QString intport = QStringList::split("</NewInternalPort>",tmpports)[0];
// if (!(router->forwardedPorts()->contains(net::ForwardPort(443,
// TorkConfig::oRListenAddress(),
// net::TCP,false))) ||
// (!router->forwardedPorts()->contains(net::ForwardPort(80,
// TorkConfig::dirListenAddress(),
// net::TCP,false))))
// return;
if (client != 0L)
client->configureServer(upnpORPort(), upnpDirPort());
if (UPnPManager::Manager()->silentUpdate())
return;
if (fwd)
processWarning("fwdok",i18n("Ports 80 and 443 on your router "
"<b>%1</b> successfully forwarded to the ports "
"%2 and %3 used by your Tor server.")
.arg(router->getDescription().friendlyName)
.arg(TorkConfig::dirListenAddress())
.arg(TorkConfig::oRListenAddress()));
else
processWarning("unfwok",i18n("Ports 80 and 443 on "
"<b>%1</b> have been successfully unmapped "
"from the ports "
"%2 and %3 used by your Tor server.")
.arg(router->getDescription().friendlyName)
.arg(TorkConfig::dirListenAddress())
.arg(TorkConfig::oRListenAddress()));
}
void tork::upnpForwardingError(kt::UPnPRouter* router,const QString& string, bool fwd)
{
QString tmpports = QStringList::split("<NewExternalPort>",string)[1];
QString extport = QStringList::split("</NewExternalPort>",tmpports)[0];
tmpports = QStringList::split("<NewInternalPort>",string)[1];
QString intport = QStringList::split("</NewInternalPort>",tmpports)[0];
//Reset the ORPort or DirPort to the non-forwarded value
if (extport == "80")
setUpnpDirPort(TorkConfig::dirListenAddress());
else
setUpnpORPort(TorkConfig::oRListenAddress());
if (client != 0L)
client->configureServer(upnpORPort(), upnpDirPort());
if (UPnPManager::Manager()->silentUpdate())
return;
if (fwd)
processWarning("fwderror",i18n("There was a problem forwarding port %1 "
" on your router <b>%1</b> to port %3 on Tor.")
.arg(extport).arg(router->getServer()).arg(intport));
else
processWarning("unfwerror",i18n("There was a problem un-forwarding port %1 "
" on your router <b>%1</b> to port %3 on Tor.")
.arg(extport).arg(router->getServer()).arg(intport));
}
void tork::routerDiscovered(kt::UPnPRouter* r)
{
kdDebug() << r->getServer() << endl;
kdDebug() << "routerdiscovered" << endl;
discoveredRouters.append(r->getDescription().friendlyName);
m_routerDiscovered = true;
configureRouter(false);
}
void tork::configureRouter(bool force, bool silent)
{
if (!m_CanApplyServerSettingsIfSet)
return;
if (TorkConfig::clientOnly())
return;
kdDebug() << "configuring router" << endl;
kdDebug() << TorkConfig::forwardPorts() << endl;
forwardPortList = new ForwardPortList();
if (TorkConfig::forwardPorts()){
setUpnpORPort(443);
setUpnpDirPort(80);
}else{
setUpnpORPort(TorkConfig::oRListenAddress());
setUpnpORPort(TorkConfig::dirListenAddress());
}
forwardPortList->addNewForwardPort(443,
TorkConfig::oRListenAddress(),net::TCP,false);
forwardPortList->addNewForwardPort(80,
TorkConfig::dirListenAddress(),net::TCP,false);
if (TorkConfig::forwardPorts())
UPnPManager::Manager()->forward(*forwardPortList, force, silent);
else
UPnPManager::Manager()->undoForward(*forwardPortList,silent);
}
void tork::checkRouterDiscovered()
{
if (!m_routerDiscovered)
processWarning("cantfindrouter",i18n("TorK can't contact your router to optimize "
" it's configuration for Tor."));
}
void tork::dummyAction()
{
}
void tork::retryUPnP()
{
//Force UPnP forwarding, even if we think it's already forwarded.
//Do not inform user of the result.
configureRouter(true,true);
}
#include "tork.moc"