|
|
|
/**
|
|
|
|
* socks.cpp
|
|
|
|
*
|
|
|
|
* Copyright (c) 2001 George Staikos <staikos@kde.org>
|
|
|
|
* Copyright (c) 2001 Daniel Molkentin <molkentin@kde.org> (designer port)
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include <tqlayout.h>
|
|
|
|
#include <tqlabel.h>
|
|
|
|
#include <tqvbuttongroup.h>
|
|
|
|
#include <tqcheckbox.h>
|
|
|
|
|
|
|
|
#include <kfiledialog.h>
|
|
|
|
#include <klistview.h>
|
|
|
|
#include <kmessagebox.h>
|
|
|
|
#include <ksocks.h>
|
|
|
|
#include <kapplication.h>
|
|
|
|
|
|
|
|
#include "socks.h"
|
|
|
|
#include <kaboutdata.h>
|
|
|
|
|
|
|
|
KSocksConfig::KSocksConfig(TQWidget *parent)
|
|
|
|
: KCModule(parent, "kcmkio")
|
|
|
|
{
|
|
|
|
|
|
|
|
KAboutData *about =
|
|
|
|
new KAboutData(I18N_NOOP("kcmsocks"), I18N_NOOP("TDE SOCKS Control Module"),
|
|
|
|
0, 0, KAboutData::License_GPL,
|
|
|
|
I18N_NOOP("(c) 2001 George Staikos"));
|
|
|
|
|
|
|
|
about->addAuthor("George Staikos", 0, "staikos@kde.org");
|
|
|
|
|
|
|
|
setAboutData( about );
|
|
|
|
|
|
|
|
|
|
|
|
TQVBoxLayout *layout = new TQVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
|
|
|
|
base = new SocksBase(this);
|
|
|
|
layout->add(base);
|
|
|
|
|
|
|
|
connect(base->_c_enableSocks, TQT_SIGNAL(clicked()), this, TQT_SLOT(enableChanged()));
|
|
|
|
connect(base->bg, TQT_SIGNAL(clicked(int)), this, TQT_SLOT(methodChanged(int)));
|
|
|
|
|
|
|
|
// The custom library
|
|
|
|
connect(base->_c_customPath, TQT_SIGNAL(openFileDialog(KURLRequester *)), this, TQT_SLOT(chooseCustomLib(KURLRequester *)));
|
|
|
|
connect(base->_c_customPath, TQT_SIGNAL(textChanged(const TQString&)),
|
|
|
|
this, TQT_SLOT(customPathChanged(const TQString&)));
|
|
|
|
|
|
|
|
// Additional libpaths
|
|
|
|
connect(base->_c_newPath, TQT_SIGNAL(openFileDialog(KURLRequester *)), this, TQT_SLOT(chooseCustomLib(KURLRequester *)));
|
|
|
|
connect(base->_c_newPath, TQT_SIGNAL(returnPressed(const TQString&)),
|
|
|
|
this, TQT_SLOT(addThisLibrary(const TQString&)));
|
|
|
|
connect(base->_c_newPath, TQT_SIGNAL(textChanged(const TQString&)),
|
|
|
|
this, TQT_SLOT(libTextChanged(const TQString&)));
|
|
|
|
connect(base->_c_add, TQT_SIGNAL(clicked()), this, TQT_SLOT(addLibrary()));
|
|
|
|
connect(base->_c_remove, TQT_SIGNAL(clicked()), this, TQT_SLOT(removeLibrary()));
|
|
|
|
connect(base->_c_libs, TQT_SIGNAL(selectionChanged()), this, TQT_SLOT(libSelection()));
|
|
|
|
|
|
|
|
// The "Test" button
|
|
|
|
connect(base->_c_test, TQT_SIGNAL(clicked()), this, TQT_SLOT(testClicked()));
|
|
|
|
|
|
|
|
// The config backend
|
|
|
|
load();
|
|
|
|
}
|
|
|
|
|
|
|
|
KSocksConfig::~KSocksConfig()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void KSocksConfig::configChanged()
|
|
|
|
{
|
|
|
|
emit changed(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KSocksConfig::enableChanged()
|
|
|
|
{
|
|
|
|
KMessageBox::information(NULL,
|
|
|
|
i18n("These changes will only apply to newly "
|
|
|
|
"started applications."),
|
|
|
|
i18n("SOCKS Support"),
|
|
|
|
"SOCKSdontshowagain");
|
|
|
|
emit changed(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KSocksConfig::methodChanged(int id)
|
|
|
|
{
|
|
|
|
if (id == 4) {
|
|
|
|
base->_c_customLabel->setEnabled(true);
|
|
|
|
base->_c_customPath->setEnabled(true);
|
|
|
|
} else {
|
|
|
|
base->_c_customLabel->setEnabled(false);
|
|
|
|
base->_c_customPath->setEnabled(false);
|
|
|
|
}
|
|
|
|
emit changed(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KSocksConfig::customPathChanged(const TQString&)
|
|
|
|
{
|
|
|
|
emit changed(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KSocksConfig::testClicked()
|
|
|
|
{
|
|
|
|
save(); // we have to save before we can test! Perhaps
|
|
|
|
// it would be best to warn, though.
|
|
|
|
|
|
|
|
if (KSocks::self()->hasSocks()) {
|
|
|
|
KMessageBox::information(NULL,
|
|
|
|
i18n("Success: SOCKS was found and initialized."),
|
|
|
|
i18n("SOCKS Support"));
|
|
|
|
// Eventually we could actually attempt to connect to a site here.
|
|
|
|
} else {
|
|
|
|
KMessageBox::information(NULL,
|
|
|
|
i18n("SOCKS could not be loaded."),
|
|
|
|
i18n("SOCKS Support"));
|
|
|
|
}
|
|
|
|
|
|
|
|
KSocks::self()->die();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KSocksConfig::chooseCustomLib(KURLRequester * url)
|
|
|
|
{
|
|
|
|
url->setMode( KFile::Directory );
|
|
|
|
/* TQString newFile = KFileDialog::getOpenFileName();
|
|
|
|
if (newFile.length() > 0) {
|
|
|
|
base->_c_customPath->setURL(newFile);
|
|
|
|
emit changed(true);
|
|
|
|
}*/
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void KSocksConfig::libTextChanged(const TQString& lib)
|
|
|
|
{
|
|
|
|
if (lib.length() > 0)
|
|
|
|
base-> _c_add->setEnabled(true);
|
|
|
|
else base->_c_add->setEnabled(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KSocksConfig::addThisLibrary(const TQString& lib)
|
|
|
|
{
|
|
|
|
if (lib.length() > 0) {
|
|
|
|
new TQListViewItem(base->_c_libs, lib);
|
|
|
|
base->_c_newPath->clear();
|
|
|
|
base->_c_add->setEnabled(false);
|
|
|
|
base->_c_newPath->setFocus();
|
|
|
|
emit changed(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KSocksConfig::addLibrary()
|
|
|
|
{
|
|
|
|
addThisLibrary(base->_c_newPath->url());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KSocksConfig::removeLibrary()
|
|
|
|
{
|
|
|
|
TQListViewItem *thisitem = base->_c_libs->selectedItem();
|
|
|
|
base->_c_libs->takeItem(thisitem);
|
|
|
|
delete thisitem;
|
|
|
|
base->_c_libs->clearSelection();
|
|
|
|
base->_c_remove->setEnabled(false);
|
|
|
|
emit changed(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KSocksConfig::libSelection()
|
|
|
|
{
|
|
|
|
base->_c_remove->setEnabled(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KSocksConfig::load()
|
|
|
|
{
|
|
|
|
KConfigGroup config(kapp->config(), "Socks");
|
|
|
|
base->_c_enableSocks->setChecked(config.readBoolEntry("SOCKS_enable", false));
|
|
|
|
int id = config.readNumEntry("SOCKS_method", 1);
|
|
|
|
base->bg->setButton(id);
|
|
|
|
if (id == 4) {
|
|
|
|
base->_c_customLabel->setEnabled(true);
|
|
|
|
base->_c_customPath->setEnabled(true);
|
|
|
|
} else {
|
|
|
|
base->_c_customLabel->setEnabled(false);
|
|
|
|
base->_c_customPath->setEnabled(false);
|
|
|
|
}
|
|
|
|
base->_c_customPath->setURL(config.readPathEntry("SOCKS_lib"));
|
|
|
|
|
|
|
|
TQListViewItem *thisitem;
|
|
|
|
while ((thisitem = base->_c_libs->firstChild())) {
|
|
|
|
base->_c_libs->takeItem(thisitem);
|
|
|
|
delete thisitem;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQStringList libs = config.readPathListEntry("SOCKS_lib_path");
|
|
|
|
for(TQStringList::Iterator it = libs.begin();
|
|
|
|
it != libs.end();
|
|
|
|
++it ) {
|
|
|
|
new TQListViewItem(base->_c_libs, *it);
|
|
|
|
}
|
|
|
|
base->_c_libs->clearSelection();
|
|
|
|
base->_c_remove->setEnabled(false);
|
|
|
|
base->_c_add->setEnabled(false);
|
|
|
|
base->_c_newPath->clear();
|
|
|
|
emit changed(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KSocksConfig::save()
|
|
|
|
{
|
|
|
|
KConfigGroup config(kapp->config(), "Socks");
|
|
|
|
config.writeEntry("SOCKS_enable",base-> _c_enableSocks->isChecked(), true, true);
|
|
|
|
config.writeEntry("SOCKS_method", base->bg->id(base->bg->selected()), true, true);
|
|
|
|
config.writePathEntry("SOCKS_lib", base->_c_customPath->url(), true, true);
|
|
|
|
TQListViewItem *thisitem = base->_c_libs->firstChild();
|
|
|
|
|
|
|
|
TQStringList libs;
|
|
|
|
while (thisitem) {
|
|
|
|
libs << thisitem->text(0);
|
|
|
|
thisitem = thisitem->itemBelow();
|
|
|
|
}
|
|
|
|
config.writePathEntry("SOCKS_lib_path", libs, ',', true, true);
|
|
|
|
|
|
|
|
kapp->config()->sync();
|
|
|
|
|
|
|
|
emit changed(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KSocksConfig::defaults()
|
|
|
|
{
|
|
|
|
|
|
|
|
base->_c_enableSocks->setChecked(false);
|
|
|
|
base->bg->setButton(1);
|
|
|
|
base->_c_customLabel->setEnabled(false);
|
|
|
|
base->_c_customPath->setEnabled(false);
|
|
|
|
base->_c_customPath->setURL("");
|
|
|
|
TQListViewItem *thisitem;
|
|
|
|
while ((thisitem = base->_c_libs->firstChild())) {
|
|
|
|
base->_c_libs->takeItem(thisitem);
|
|
|
|
delete thisitem;
|
|
|
|
}
|
|
|
|
base->_c_newPath->clear();
|
|
|
|
base->_c_add->setEnabled(false);
|
|
|
|
base->_c_remove->setEnabled(false);
|
|
|
|
emit changed(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString KSocksConfig::quickHelp() const
|
|
|
|
{
|
|
|
|
return i18n("<h1>SOCKS</h1><p>This module allows you to configure KDE support"
|
|
|
|
" for a SOCKS server or proxy.</p><p>SOCKS is a protocol to traverse firewalls"
|
|
|
|
" as described in <a href=\"http://rfc.net/rfc1928.html\">RFC 1928</a>."
|
|
|
|
" <p>If you have no idea what this is and if your system administrator does not"
|
|
|
|
" tell you to use it, leave it disabled.</p>");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#include "socks.moc"
|
|
|
|
|