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.
280 lines
7.8 KiB
280 lines
7.8 KiB
15 years ago
|
/**
|
||
|
* 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 <qlayout.h>
|
||
|
#include <qlabel.h>
|
||
|
#include <qvbuttongroup.h>
|
||
|
#include <qcheckbox.h>
|
||
|
|
||
|
#include <kfiledialog.h>
|
||
|
#include <klistview.h>
|
||
|
#include <kmessagebox.h>
|
||
|
#include <ksocks.h>
|
||
|
#include <kapplication.h>
|
||
|
|
||
|
#include "socks.h"
|
||
|
#include <kaboutdata.h>
|
||
|
|
||
|
KSocksConfig::KSocksConfig(QWidget *parent)
|
||
|
: KCModule(parent, "kcmkio")
|
||
|
{
|
||
|
|
||
|
KAboutData *about =
|
||
|
new KAboutData(I18N_NOOP("kcmsocks"), I18N_NOOP("KDE SOCKS Control Module"),
|
||
|
0, 0, KAboutData::License_GPL,
|
||
|
I18N_NOOP("(c) 2001 George Staikos"));
|
||
|
|
||
|
about->addAuthor("George Staikos", 0, "staikos@kde.org");
|
||
|
|
||
|
setAboutData( about );
|
||
|
|
||
|
|
||
|
QVBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
|
||
|
base = new SocksBase(this);
|
||
|
layout->add(base);
|
||
|
|
||
|
connect(base->_c_enableSocks, SIGNAL(clicked()), this, SLOT(enableChanged()));
|
||
|
connect(base->bg, SIGNAL(clicked(int)), this, SLOT(methodChanged(int)));
|
||
|
|
||
|
// The custom library
|
||
|
connect(base->_c_customPath, SIGNAL(openFileDialog(KURLRequester *)), this, SLOT(chooseCustomLib(KURLRequester *)));
|
||
|
connect(base->_c_customPath, SIGNAL(textChanged(const QString&)),
|
||
|
this, SLOT(customPathChanged(const QString&)));
|
||
|
|
||
|
// Additional libpaths
|
||
|
connect(base->_c_newPath, SIGNAL(openFileDialog(KURLRequester *)), this, SLOT(chooseCustomLib(KURLRequester *)));
|
||
|
connect(base->_c_newPath, SIGNAL(returnPressed(const QString&)),
|
||
|
this, SLOT(addThisLibrary(const QString&)));
|
||
|
connect(base->_c_newPath, SIGNAL(textChanged(const QString&)),
|
||
|
this, SLOT(libTextChanged(const QString&)));
|
||
|
connect(base->_c_add, SIGNAL(clicked()), this, SLOT(addLibrary()));
|
||
|
connect(base->_c_remove, SIGNAL(clicked()), this, SLOT(removeLibrary()));
|
||
|
connect(base->_c_libs, SIGNAL(selectionChanged()), this, SLOT(libSelection()));
|
||
|
|
||
|
// The "Test" button
|
||
|
connect(base->_c_test, SIGNAL(clicked()), this, 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 QString&)
|
||
|
{
|
||
|
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 );
|
||
|
/* QString newFile = KFileDialog::getOpenFileName();
|
||
|
if (newFile.length() > 0) {
|
||
|
base->_c_customPath->setURL(newFile);
|
||
|
emit changed(true);
|
||
|
}*/
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void KSocksConfig::libTextChanged(const QString& lib)
|
||
|
{
|
||
|
if (lib.length() > 0)
|
||
|
base-> _c_add->setEnabled(true);
|
||
|
else base->_c_add->setEnabled(false);
|
||
|
}
|
||
|
|
||
|
|
||
|
void KSocksConfig::addThisLibrary(const QString& lib)
|
||
|
{
|
||
|
if (lib.length() > 0) {
|
||
|
new QListViewItem(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()
|
||
|
{
|
||
|
QListViewItem *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"));
|
||
|
|
||
|
QListViewItem *thisitem;
|
||
|
while ((thisitem = base->_c_libs->firstChild())) {
|
||
|
base->_c_libs->takeItem(thisitem);
|
||
|
delete thisitem;
|
||
|
}
|
||
|
|
||
|
QStringList libs = config.readPathListEntry("SOCKS_lib_path");
|
||
|
for(QStringList::Iterator it = libs.begin();
|
||
|
it != libs.end();
|
||
|
++it ) {
|
||
|
new QListViewItem(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);
|
||
|
QListViewItem *thisitem = base->_c_libs->firstChild();
|
||
|
|
||
|
QStringList 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("");
|
||
|
QListViewItem *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);
|
||
|
}
|
||
|
|
||
|
QString 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"
|
||
|
|