/*************************************************************************** * $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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef EXTERNAL_GEOIP # include "GeoIP-1.4.0/libGeoIP/GeoIP.h" #else # include #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 serverCondition(9); QValueVector logType(5); QValueVector torkifyApp(5); QValueVector torTrafficType(9); QValueVector nonTorTrafficType(9); QValueVector subnetType(256); QValueVector 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("You are now in " "FailSafe Mode.
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
in another country." ) ); m_IdentityButton->setToolTip( i18n( "Reset all Tor's open channels (i.e. 'circuits') and
" "enter the internet " "from a new set of channels." ) ); m_UnCensorButton->setToolTip( i18n( "Evade a state or service provider's attempts
to block" " your use of Tor." ) ); m_ModeButton->setToolTip( i18n( "Show/hide TorK's advanced features
and configuration options." ) ); enableTormon->setToolTip( i18n( "Show/hide TorK's on-screen display (OSD)
of your active " "connections." ) ); m_SecurityButton->setToolTip( i18n( "Ensure selected traffic is
forced through Tor." ) ); m_ServerButton->setToolTip( i18n( "Run a Server on the Tor Network.
'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("Status Not Known"), QStringList("Status Not Known"), 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 tmplist = m_view->countryList(); qHeapSort( tmplist ); for ( QValueList::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 tmplist = m_view->countryList(); qHeapSort( tmplist ); for ( QValueList::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::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(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
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.
'Relay Tor Traffic' " "is Recommended for Home Use." ) ); else m_ServerButton->setToolTip( i18n( "You Can't Run a Server While
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<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 Normal Mode.
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 DNS FailSafe Mode.
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 System FailSafe Mode.
Tor will use new routes for every new connection as often as possible.
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::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(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(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::Iterator menu = continentMapList.begin(); menu != continentMapList.end(); ++menu ){ QListView* tmp = dynamic_cast(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(m_view->serverList); filterViewServers(serverCondition, tmp, m_ServerFilterMenu, id, 3); } void tork::filterView( QValueVector &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 &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(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("","") .replace("","")); }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("","") .replace("","")); 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("You are now in FailSafe Mode.
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::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::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("Status Not Known"), QStringList("Status Not Known"), 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<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<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 Konqueror Sessions Are Now Safe for Anonymous Use.
Amarok, Akregator, KTorrent should be treated with caution!
This is because they may have javascript/java/plugins/flash enabled.")); else KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", i18n("Konqueror is Now Back to " "Non-Anonymous Use!
Close Konqueror completely and do not use it non-anonymously for a while.
" "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 Konqueror Sessions Are Now Safe for Anonymous Use.
Amarok, Akregator, KTorrent should be treated with caution!
This is because they may have javascript/java/plugins/flash enabled.")); else KNotifyClient::event(kmain->_tray->winId(),"TorDisabled", i18n("Konqueror is Now Back to " "Non-Anonymous Use!
Close Konqueror completely and do not use it non-anonymously for a while.
" "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(""+ i18n("Anonymous Browsing is now enabled. " "Click the icon to disable it.
" "- You can toggle this setting at any time " "using the konqueror icon in the toolbar or " "the miniview.
" )+"
"); 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(""+ i18n("Click the icon to launch an anonymous " "browsing session.
" )+"
"); m_view->konqitem->setPropertiesText(""+i18n( "- Konqueror uses Privoxy in combination with Tor to " "anonymize your browsing.
" "- This will also make any other Konqueror sessions you " "use anonymous.
" "- It will partially anonymize applications " "such as KTorrent (tracker/search only) and " "Amarok.
" "  This is because they may still " "have java/javascript enabled, which can compromise " "anonymity.
" "- You can toggle this setting at any time using " "the Konqueror icon in the toolbar or the miniview.
" )+"
"); 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( "%1").arg(headline); text += QString( "
" ) + i18n( "Message: %1" ).arg(torsaid); text += QString( "
" ) + i18n( "This means: %1" ).arg(thismeans); text += QString( "
" ); //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( "%1").arg(headline); text += QString( "
" ) + i18n( "Message: %1" ).arg(torsaid); text += QString( "
" ) + i18n( "Reason: %1" ).arg(body); text += QString( "
" ) + 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("You are still in" " FailSafe Mode.
If Tor is still running its capacity to route FailSafe traffic
will" " remain enabled. Enter your password to return
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 %2 bypassed Tor to turn a domain name to an IP address. Traffic to %3 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. Passwords 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. Passwords 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 -" " %1 KB/s." " Max Burst - %2 KB/s. Max Advertised - %3 KB/s." " 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<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("",string)[1]; QString extport = QStringList::split("",tmpports)[0]; tmpports = QStringList::split("",string)[1]; QString intport = QStringList::split("",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 " "%1 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 " "%1 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("",string)[1]; QString extport = QStringList::split("",tmpports)[0]; tmpports = QStringList::split("",string)[1]; QString intport = QStringList::split("",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 %1 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 %1 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"