You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tork/src/newfirstrunwizard.ui.h

773 lines
25 KiB

/***************************************************************************
** $Id: newfirstrunwizard.ui.h,v 1.29 2008/12/08 19:39:02 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 <tqvaluevector.h>
#include <tqpushbutton.h>
#include <tqpixmap.h>
#include <tqtimer.h>
#include <tdeapplication.h>
#include <kstandarddirs.h>
#include <kurl.h>
#include <kprocio.h>
#include <kdebug.h>
#include <dcopref.h>
#include <tdeconfig.h>
#include <tdemessagebox.h>
#include <tdelocale.h>
#include <krun.h>
#include <stdlib.h>
#include "functions.h"
#include "torkconfig.h"
#include "update.h"
#include "crypto.h"
#include "torclient.h"
TorClient* client;
KProcIO *whichproc;
bool torRunning;
bool privoxyRunning;
TQString tor;
TQString privoxy;
TQString netstat;
TQString torknetstat;
TQString OriginalHttpProxy;
TQString OriginalHttpsProxy;
TQString OriginalFtpProxy;
TQString OriginalProxyType;
TQString KonqHttpProxy;
TQString KonqHttpsProxy;
TQString KonqFtpProxy;
uint KonqHttpProxyPort;
uint KonqHttpsProxyPort;
uint KonqFtpProxyPort;
TQString OriginalCookies;
TQString OriginalUseCache;
TQString OriginalSendUserAgent;
TQString OriginalEnableJavascript;
TQString OriginalEnableJava;
TQString OriginalEnablePlugins;
TQValueVector<TQString> descriptions(6);
void
FirstRunWizard::init()
{
torRunning = false;
privoxyRunning = false;
descriptions[0] = i18n("This will run a client and an exit server with Tor's default settings.<br>"
"An exit server carries the can for traffic leaving the Tor network.");
descriptions[1] = i18n("This will run a client and a relay server with Tor's default settings.<br>"
"A relay server carries traffic along the Tor network but does not transmit"
"tor traffic outside the network.");
descriptions[2] = i18n("This will run an exit server with Tor's default settings.<br>"
"An exit server carries the can for traffic leaving the Tor network.");
descriptions[3] = i18n("This will run a relay server with Tor's default settings.<br>"
"A relay server carries traffic along the Tor network but does not transmit"
"tor traffic outside the network.");
descriptions[4] = i18n("This will run a client with Tor's default settings.<br>");
descriptions[5] = i18n("You're too clever for your own good.<br>");
settingsDescription->setText(descriptions[0]);
setAppropriate ( CheckNotUsing, false );
setAppropriate ( CheckUsing, false );
setAppropriate ( NonPrivoxyConfirmation, false );
setAppropriate ( Remote_Tor, false );
setAppropriate ( Locate_Tor, false );
setAppropriate ( Locate_Privoxy, false );
setNextEnabled ( Locate_Tor,false );
setAppropriate ( TorServer, false );
TorkConfig::setUser(getenv("USER"));
const char *paths = ":/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin";
privoxy = getFullLocation(paths,"privoxy");
tor = getFullLocation(paths,"tor");
netstat = getFullLocation(paths,"netstat");
if (!tor)
setAppropriate ( Locate_Tor, true );
else
TorLocation_2->setURL(tor);
if (!privoxy){
setAppropriate ( Locate_Privoxy, true );
whichProxyText->setText(i18n("I did not find an installation of Privoxy on your system."));
}else{
PrivoxyLocation_2->setURL(privoxy);
whichProxyText->setText(i18n("I found an installation of Privoxy on your system."));
}
serverName->setText("TorKServer");
TDEConfig emailConf( TQString::fromLatin1("emaildefaults") );
emailConf.setGroup(TQString::fromLatin1("Defaults"));
TQString profile = TQString::fromLatin1("PROFILE_");
profile += emailConf.readEntry(TQString::fromLatin1("Profile"), TQString::fromLatin1("Default"));
emailConf.setGroup(profile);
contactMail->setText(emailConf.readEntry(TQString::fromLatin1("EmailAddress")));
guessDataDir();
//aesthetics
cancelButton()->setFixedSize( cancelButton()->sizeHint() );
helpButton()->hide();
whichproc = new KProcIO();
whichproc->setUseShell(TRUE);
TQString whichCommand="ps -C tor;ps -C privoxy";
*whichproc<<whichCommand;
connect( whichproc, SIGNAL(readReady(KProcIO * )),
SLOT(processWhich(KProcIO * )) );
whichproc->start(KProcIO::NotifyOnExit,TRUE);
}
void FirstRunWizard::monitorRemote_toggled( bool remoteTor)
{
if ((!tor) && (!remoteTor))
setAppropriate ( Locate_Tor, true );
else
setAppropriate ( Locate_Tor, false );
setAppropriate ( HowDoesTorStart, !remoteTor );
setAppropriate ( TorUsage, !remoteTor );
setAppropriate ( TorServer, !remoteTor );
setAppropriate ( Remote_Tor, remoteTor );
setAppropriate ( TestingTor, remoteTor );
}
void FirstRunWizard::usingAnotherProxy_toggled( bool state)
{
setAppropriate ( CheckNotUsing, state );
setAppropriate ( CheckUsing, state );
setAppropriate ( NonPrivoxyConfirmation, state );
setAppropriate ( PrivoxyConfirmation, !state );
if ((!privoxy) && (!state))
setAppropriate ( Locate_Privoxy, !state );
setAppropriate ( HowDoesPrivoxyStart, !state );
setAppropriate ( PrivoxyConfiguration, !state );
setAppropriate ( FinalPrivoxy, !state );
}
void FirstRunWizard::torStartsAutomatically_toggled( bool state)
{
setAppropriate ( TorUsage, !state );
setAppropriate ( TorServer, !state );
setAppropriate ( TestingTor , state );
}
void FirstRunWizard::torStartsManually_toggled( bool state)
{
setAppropriate ( TorUsage, state );
setAppropriate ( TorServer, state );
setAppropriate ( TestingTor , !state );
}
void FirstRunWizard::processWhich(KProcIO *whichproc)
{
TQString item = "";
int pos;
while ((pos = (whichproc->readln(item,true))) != -1) {
if (item.find("tor") != -1)
torRunning = true;
if (item.find("privoxy") != -1)
privoxyRunning = true;
}
whichproc->ackRead();
}
void
FirstRunWizard::showPage( TQWidget *w ) //virtual
{
TQWizard::showPage( w );
if (currentPage() == HowDoesTorStart){
torStartsAutomatically->setChecked(torRunning);
torStartsManually->setChecked(!torRunning);
}
if (currentPage() == LocalOrRemote){
torStartsAutomatically->setChecked(false);
torStartsManually->setChecked(false);
}
if (currentPage() == HowDoesPrivoxyStart){
privoxyStartsAutomatically->setChecked(privoxyRunning);
privoxyStartsManually->setChecked(!privoxyRunning);
if (privoxyRunning){
privoxyText->setText(i18n("<p>To be honest, I'm not that bright."
"It looks as if Privoxy is configured to start up by itself when "
"your computer boots up, but I can't be sure. So can you help me?"
"Does Privoxy start by itself at boot-time?</p>"));
}else{
privoxyText->setText(i18n("<p>To be honest, I'm not that bright."
"It looks as if Privoxy does not start up by itself when "
"your computer boots up, but I can't be sure. So can you help me?"
"Does Privoxy start by itself at boot-time?</p>"));
}
}
if (currentPage() == CheckUsing){
saveAnonymousProxySettings();
}
if (currentPage() == TestingTor){
testTor();
}
if (currentPage() == NonPrivoxyConfirmation){
saveNonAnonymousProxySettings();
}
if (currentPage() == PrivoxyConfirmation){
saveNonAnonymousProxySettings();
}
setFinishEnabled ( Final,true );
// cancelButton()->setText( w == WizardPage_0 ? i18n("&Skip") : i18n("&Cancel") );
}
void FirstRunWizard::downloadPrivoxy_clicked()
{
TorkUpdate* updater = new TorkUpdate(this);
updater->checkForNewPrivoxyDirectly();
}
void FirstRunWizard::downloadTor_clicked()
{
TorkUpdate* updater = new TorkUpdate(this);
updater->checkForNewTorDirectly(false);
}
void
FirstRunWizard::accept()
{
TQString paths;
paths = ":/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin";
paths.replace("::",":");
torknetstat = getFullLocation(paths.local8Bit(), "torknetstat");
if (!torknetstat.isEmpty())
TorkConfig::setNetstatLocation("torknetstat");
else
TorkConfig::setNetstatLocation("netstat");
if (torStartsAutomatically->isChecked())
TorkConfig::setQuickConfigure(7);
else if (monitorRemote->isChecked())
TorkConfig::setQuickConfigure(6);
else
TorkConfig::setQuickConfigure(WizardQuickConfigure->currentItem());
TorkConfig::setTorLocation(TorLocation_2->url());
TorkConfig::setPrivoxyLocation(PrivoxyLocation_2->url());
TorkConfig::setNickName(serverName->text());
TorkConfig::setContactInfo(contactMail->text());
if (monitorRemote->isChecked()){
TorkConfig::setRemoteTorAddress(RemoteTorAddress->text());
TorkConfig::setRemoteTorPort(RemoteTorPort->text().toInt());
}
if ((usingAnotherProxy->isChecked()) || (privoxyStartsAutomatically->isChecked())){
TorkConfig::setSystemProxy(true);
TorkConfig::setTorkProxy(false);
}else{
TorkConfig::setSystemProxy(false);
TorkConfig::setTorkProxy(true);
}
//Non-Anon Proxy Settings
TorkConfig::setOriginalHttpProxy(OriginalHttpProxy);
TorkConfig::setOriginalHttpsProxy(OriginalHttpsProxy);
TorkConfig::setOriginalProxyType(OriginalProxyType);
TorkConfig::setOriginalCookies(OriginalCookies == "true");
TorkConfig::setOriginalUseCache(OriginalUseCache == "true");
TorkConfig::setOriginalSendUserAgent(OriginalSendUserAgent == "true");
TorkConfig::setOriginalEnableJavascript(OriginalEnableJavascript == "true");
TorkConfig::setOriginalEnableJava(OriginalEnableJava == "true");
TorkConfig::setOriginalEnablePlugins(OriginalEnablePlugins == "true");
//Anon Proxy Settings
TorkConfig::setKonqHttpProxy(KonqHttpProxy);
TorkConfig::setKonqHttpProxyPort(KonqHttpProxyPort);
TorkConfig::setKonqHttpsProxy(KonqHttpsProxy);
TorkConfig::setKonqHttpsProxyPort(KonqHttpsProxyPort);
TorkConfig::setKonqFtpProxy(KonqFtpProxy);
TorkConfig::setKonqFtpProxyPort(KonqFtpProxyPort);
if (!usingAnotherProxy->isChecked()){
TorkConfig::setKonqHttpProxy("http://localhost");
TorkConfig::setKonqHttpProxyPort(8118);
TorkConfig::setKonqHttpsProxy("http://localhost");
TorkConfig::setKonqHttpsProxyPort(8118);
}
TorkConfig::writeConfig();
TQDialog::accept();
}
void
FirstRunWizard::reject()
{
TQDialog::reject();
}
void FirstRunWizard::WizardQuickConfigure_activated( int item)
{
if (item == 4)
setAppropriate ( TorServer, false );
else
setAppropriate ( TorServer, true );
settingsDescription->setText(descriptions[item]);
}
void
FirstRunWizard::saveNonAnonymousProxySettings()
{
TDEConfig* config = new TDEConfig("tdeioslaverc", false, false);
config->setGroup( "Proxy Settings" );
OriginalHttpProxy = config->readEntry( "httpProxy" );
OriginalHttpsProxy = config->readEntry( "httpsProxy" );
OriginalProxyType = config->readEntry( "ProxyType" );
config = new TDEConfig("kcookiejarrc", false, false);
config->setGroup( "Cookie Policy" );
OriginalCookies = config->readEntry( "Cookies" );
config = new TDEConfig("tdeio_httprc", false, false);
OriginalUseCache = config->readEntry( "UseCache" );
OriginalSendUserAgent = config->readEntry( "SendUserAgent" );
config = new TDEConfig("konquerorrc", false, false);
config->setGroup( "Java/JavaScript Settings" );
OriginalEnableJavascript = config->readEntry( "EnableJavaScript" );
OriginalEnableJava = config->readEntry( "EnableJava" );
OriginalEnablePlugins = config->readEntry( "EnablePlugins" );
if (currentPage() == PrivoxyConfirmation){
KonqHttpProxy = "http://localhost";
KonqHttpProxyPort = 8118;
KonqHttpsProxy = "http://localhost";
KonqHttpsProxyPort = 8118;
KonqFtpProxy = "http://localhost";
KonqFtpProxyPort = 8118;
}
}
void
FirstRunWizard::saveAnonymousProxySettings()
{
TDEConfig* config = new TDEConfig("tdeioslaverc", false, false);
config->setGroup( "Proxy Settings" );
KonqHttpProxy = config->readEntry( "httpProxy" ).section(":",0,1);
KonqHttpProxyPort = config->readEntry( "httpProxy" ).section(":",-1,-1).toInt();
KonqHttpsProxy = config->readEntry( "httpsProxy" ).section(":",0,1);
KonqHttpsProxyPort = config->readEntry( "httpsProxy" ).section(":",-1,-1).toInt();
KonqFtpProxy = config->readEntry( "ftpProxy" ).section(":",0,1);
KonqFtpProxyPort = config->readEntry( "ftpProxy" ).section(":",-1,-1).toInt();
}
void FirstRunWizard::TorLocation_textChanged( const TQString & text)
{
if (text.contains("tor"))
setNextEnabled ( Locate_Tor,true );
}
void FirstRunWizard::pushButton1_clicked()
{
KRun::runCommand( "tdecmshell proxy" );
}
void FirstRunWizard::pushButton1_2_clicked()
{
KRun::runCommand( "tdecmshell proxy" );
}
void FirstRunWizard::pushButton1_3_clicked()
{
KRun::runCommand( "tdecmshell proxy" );
}
void FirstRunWizard::testTorAgain_clicked()
{
testTor();
}
void FirstRunWizard::testTor()
{
kdDebug() << "testing tor" << endl;
TQString host;
int port;
if (monitorRemote->isChecked()){
host = RemoteTorAddress->text();
port = RemoteTorPort->text().toInt();
TorkConfig::setCookieAuthentication(false);
}else{
host = "localhost";
port = TorkConfig::controlPort();
TorkConfig::setCookieAuthentication(false);
}
if (!TorPassword->text().isEmpty() && TorPassword->isEnabled())
TorkConfig::setHashedControlPassword(TorPassword->text());
if (client)
delete client;
client = new TorClient(host,port);
connect( client, SIGNAL(fatalError()),this, SLOT(cannotContactTor()));
connect( client, SIGNAL(authenticationFailed()),this, SLOT(cannotContactTor()));
connect( client, SIGNAL(authenticated()),this, SLOT(contactedTor()) );
client->authenticate();
}
void FirstRunWizard::modifyConfs_clicked()
{
examineConfigFiles();
}
void FirstRunWizard::cannotContactTor()
{
disconnect( client, SIGNAL(fatalError()),this, SLOT(cannotContactTor()));
disconnect( client, SIGNAL(authenticationFailed()),this, SLOT(cannotContactTor()));
disconnect( client, SIGNAL(authenticated()),this, SLOT(contactedTor()) );
if (client != 0L){
client->socketReadyRead();
client->deleteLater();
client = 0L;
}
if (monitorRemote->isChecked()){
torControlStatus->setText(i18n("<p>I can't contact or authenticate to Tor.<br>"
"This means you will need to modify Tor's settings if it is to be usable by Tork in future.</p>"
"On the machine that your remote Tor installation runs on add the following to Tor's config file:<br>"
"<br>"
"<b>ControlPort %2</b><br>"
"<br>"
"Alternatively, you may have entered the wrong password in the previous page.<br>"
"When you've attempted to fix the problem, click <b>'Test Tor'</b> to try connecting again.")
.arg(RemoteTorPort->text()));
}else{
torControlStatus->setText(i18n("<p>I can't contact or authenticate to Tor.<br>"
"This means Tork will need to modify Tor's settings if it is to be usable by Tork in future.</p>"
"To the right is a list of the possible files that Tor may be using for it's configuration.<br>"
"If you click the <b>'Modify Tor's Control File'</b> button, I'll modify any that exist to make Tor controllable by TorK.<br>"
"Once that's done you can click <b>'Test Tor'</b> to re-test the connection."));
modifyConfigs->setEnabled(true);
}
testTorAgain->setEnabled(true);
}
void FirstRunWizard::contactedTor()
{
disconnect( client, SIGNAL(fatalError()),this, SLOT(cannotContactTor()));
disconnect( client, SIGNAL(authenticated()),this, SLOT(contactedTor()) );
if (client != 0L){
client->socketReadyRead();
client->deleteLater();
client = 0L;
}
if (!monitorRemote->isChecked())
torControlStatus->setText(i18n("<p>I contacted Tor successfully.<br>"
"This means TorK can contact and control Tor. That's a good thing.<br>"
"<b>By default, TorK will secure its session with Tor using a random "
"password.</b> However, you should consider using a security option on "
"Tor that will secure it even when you're not using TorK.<br>"
"See the 'My Tor Client' configuration section for more info"
" when you're finished the wizard. <br>"
"You can now click <b>'Next'</b>."));
else
torControlStatus->setText(i18n("<p>I contacted Tor successfully.<br>"
"This means TorK can contact and control Tor. That's a good thing. "
"As a security precaution, you should configure your remote instance "
"of Tor to require a password. You can inform TorK of the password "
"using the 'My Tor Client' configuration section. "
));
modifyConfigs->setEnabled(false);
testTorAgain->setEnabled(true);
TorkConfig::setGenerateRandomPassword(true);
// if (!monitorRemote->isChecked())
// TQTimer::singleShot( 3000, this, SLOT(examineConfigFiles()) );
}
void FirstRunWizard::examineConfigFiles()
{
bool foundone = false;
for (unsigned int index = 0; index != configCandidates->count(); ++index){
if (TQFile::exists(configCandidates->item(index)->text()))
{
appendControlDirective(configCandidates->item(index)->text());
foundone = true;
}
}
if (!foundone){
appendControlDirective("/usr/local/etc/tor/torrc");
appendControlDirective("/etc/tor/torrc");
appendControlDirective("/usr/etc/tor/torrc");
torControlStatus->setText(i18n("<p>OK, I didn't find any of the config files in the list.<br>"
"To make tor usable I'm creating config files in three locations: /usr/local/etc/tor/torrc, /usr/etc/tor/torrc and /etc/tor/torrc."
"I've also asked Tor to reload and it will catch and use one of these files. "
"<b> You'll be asked for your root password in a moment. "
"<b> This is to modify the file and necessary to get Tor working.</b> "
"When you've entered your password "
"click <b>'Test Tor'</b> to see if it worked. "));
}
}
void FirstRunWizard::pushButton6_clicked()
{
rootifyNetstat();
}
void FirstRunWizard::rootifyNetstat()
{
TQString newnetstat = TQString(netstat).replace("netstat","torknetstat");
KProcIO *catproc = new KProcIO();
catproc->setUseShell(TRUE);
TQString whichCommand= TQString("tdesu -t -c 'cp %1 %2;chmod u+s %3'").arg(netstat).arg(newnetstat).arg(newnetstat);
*catproc<<whichCommand;
catproc->start(KProcIO::NotifyOnExit,TRUE);
}
void FirstRunWizard::sighupTor(const TQString& text)
{
KProcIO *catproc = new KProcIO();
catproc->setUseShell(TRUE);
TQString whichCommand= TQString("killall -s HUP %1").arg(text);
*catproc<<whichCommand;
catproc->start(KProcIO::NotifyOnExit,TRUE);
}
void FirstRunWizard::appendControlDirective(const TQString& text)
{
int result = KMessageBox::questionYesNo(this,
i18n( "<p>I'm going to modify the Tor configuration file: <b>%1</b>.<br>"
"This is so that I can ensure"
"TorK can communicate with Tor.<br>"
" If you say Yes, I may have to ask for your <b>root password</b>.").arg(text));
switch (result) {
case KMessageBox::No :
return;
}
TQFile inf(text);
if ( inf.open(IO_WriteOnly | IO_Append) ) {
TQTextStream ts( &inf );
ts << "ControlPort 9051" << "\n";
inf.close();
sighupTor("tor");
}else{
TQString directory = KURL(text).directory();
KProcIO *catproc = new KProcIO();
catproc->setUseShell(TRUE);
TQString whichCommand= TQString("tdesu -c \"sh -c 'mkdir -p %1;printf \\\"ControlPort 9051\\n\\\""
" >> %2;killall -s HUP tor'\"").arg(directory).arg(text);
*catproc<<whichCommand;
catproc->start(KProcIO::NotifyOnExit,TRUE);
//-c "sh -c 'printf \"ControlPort 9051\n\" >> /etc/tor/torrc'"
}
}
void FirstRunWizard::guessDataDir( )
{
TQStringList dataDirCands;
dataDirCands << TQString("%1/.tor/").arg(getenv("HOME"));
dataDirCands << TQString("/var/lib/tor/");
for ( TQStringList::Iterator it = dataDirCands.begin(); it != dataDirCands.end(); ++it ) {
TQDir inf((*it));
if ( inf.exists() ) {
TorkConfig::setDataDirectory((*it));
return;
}
}
}
void FirstRunWizard::RemoteTorAddress_textChanged( const TQString & text)
{
if ((text == "127.0.0.1") || (text == "localhost"))
TorPassword->setEnabled(false);
else
TorPassword->setEnabled(true);
}
void FirstRunWizard::modifyConfPrivoxy_clicked()
{
examinePrivoxyConfigFiles();
}
void FirstRunWizard::examinePrivoxyConfigFiles()
{
bool foundone = false;
for (unsigned int index = 0; index != configCandidatesPrivoxy->count(); ++index){
if (TQFile::exists(configCandidatesPrivoxy->item(index)->text()))
{
appendPrivoxyConfig(configCandidatesPrivoxy->item(index)->text());
foundone = true;
}
}
if (!foundone){
appendPrivoxyConfig("/etc/privoxy/config");
privoxyStatus->setText(i18n("<p>OK, I didn't find any of the config files in the list.<br>"
"Tork has created a basic config in /etc/privoxy/config."
"This <i>may</i> get things working, but possibly not.<br>"
"You should:"
"- Check Privoxy is properly installed."
"- Re-install privoxy and try running the wizard again."
));
}
}
void FirstRunWizard::appendPrivoxyConfig(const TQString& text)
{
TQString privoxyConf = TQString(
"confdir %1\\n"
"logdir .\\n"
"listen-address %2:%3\\n"
"debug 1 # URLs\\n"
"debug 4096 # Info\\n"
"debug 8192 # Errors\\n"
"toggle 1\\n"
"buffer-limit 4069\\n"
"forward 192.168.*.*/ .\\n"
"forward 10.*.*.*/ .\\n"
"forward 127.*.*.*/ .\\n"
"forward-socks4a / %4:%5 .\\n")
.arg(locate("data","tork/privoxy/"))
.arg(TorkConfig::konqHttpProxy().replace("http://",""))
.arg(TorkConfig::konqHttpProxyPort())
.arg(TorkConfig::sOCKSBindAddressHost())
.arg(TorkConfig::sOCKSBindAddressPort());
int result = KMessageBox::questionYesNo(this,
i18n( "<p>I'm going to modify the Privoxy configuration file: <b>%1</b>.<br>"
"This is so that I can ensure"
"Privoxy can communicate with Tor.<br>"
" If you say Yes, I'll ask for your root password.").arg(text));
switch (result) {
case KMessageBox::No :
return;
}
TQFile inf(text);
if ( inf.open(IO_WriteOnly | IO_Append) ) {
TQTextStream ts( &inf );
ts << privoxyConf;
inf.close();
sighupTor("privoxy");
}else{
KProcIO *catproc = new KProcIO();
catproc->setUseShell(TRUE);
TQString whichCommand= TQString("tdesu -c \"sh -c 'printf \\\"%1\\\""
" >> %2;killall -s HUP privoxy'\"")
.arg(privoxyConf)
.arg(text);
*catproc<<whichCommand;
catproc->start(KProcIO::NotifyOnExit,TRUE);
}
}