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.
195 lines
7.2 KiB
195 lines
7.2 KiB
/***************************************************************************
|
|
* Copyright (C) 2004,2005 by Jakub Stachowski *
|
|
* qbast@go2.pl *
|
|
* *
|
|
* 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 <sys/stat.h>
|
|
#include <config.h>
|
|
|
|
#include <tqlayout.h>
|
|
#include <tqfile.h>
|
|
#include <tqgroupbox.h>
|
|
#include <tqradiobutton.h>
|
|
#include <tqtimer.h>
|
|
#include <tqtabwidget.h>
|
|
#include <tqcheckbox.h>
|
|
#include <tqprocess.h>
|
|
#include <tqcursor.h>
|
|
#include <tqbuttongroup.h>
|
|
|
|
#include <klocale.h>
|
|
#include <kglobal.h>
|
|
#include <kparts/genericfactory.h>
|
|
#include <kprocess.h>
|
|
#include <klineedit.h>
|
|
#include <kpassdlg.h>
|
|
#include <ksimpleconfig.h>
|
|
#include <kapplication.h>
|
|
#include <kmessagebox.h>
|
|
|
|
#include "kcmdnssd.h"
|
|
#include <dnssd/settings.h>
|
|
#include <dnssd/domainbrowser.h>
|
|
#include <kipc.h>
|
|
|
|
#define MDNSD_CONF "/etc/mdnsd.conf"
|
|
#define MDNSD_PID "/var/run/mdnsd.pid"
|
|
|
|
typedef KGenericFactory<KCMDnssd, TQWidget> KCMDnssdFactory;
|
|
K_EXPORT_COMPONENT_FACTORY( kcm_kdnssd, KCMDnssdFactory("kcmkdnssd"))
|
|
|
|
KCMDnssd::KCMDnssd(TQWidget *parent, const char *name, const TQStringList&)
|
|
: ConfigDialog(parent, name), m_wdchanged(false)
|
|
{
|
|
setAboutData(new KAboutData(I18N_NOOP("kcm_kdnssd"),
|
|
I18N_NOOP("ZeroConf configuration"),0,0,KAboutData::License_GPL,
|
|
I18N_NOOP("(C) 2004,2005 Jakub Stachowski")));
|
|
setQuickHelp(i18n("Setup services browsing with ZeroConf"));
|
|
if (geteuid()!=0) tabs->removePage(tab_2); // normal user cannot change wide-area settings
|
|
// show only global things in 'administrator mode' to prevent confusion
|
|
else if (getenv("KDESU_USER")!=0) tabs->removePage(tab);
|
|
addConfig(DNSSD::Configuration::self(),this);
|
|
// it is host-wide setting so it has to be in global config file
|
|
domain = new KSimpleConfig( TQString::tqfromLatin1( KDE_CONFDIR "/kdnssdrc" ));
|
|
domain->setGroup("publishing");
|
|
load();
|
|
connect(hostedit,TQT_SIGNAL(textChanged(const TQString&)),this,TQT_SLOT(wdchanged()));
|
|
connect(secretedit,TQT_SIGNAL(textChanged(const TQString&)),this,TQT_SLOT(wdchanged()));
|
|
connect(domainedit,TQT_SIGNAL(textChanged(const TQString&)),this,TQT_SLOT(wdchanged()));
|
|
connect(enableZeroconf,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(enableZeroconfChanged(bool)));
|
|
m_enableZeroconfChanged=false;
|
|
if (DNSSD::Configuration::self()->publishDomain().isEmpty()) WANButton->setEnabled(false);
|
|
kcfg_PublishType->hide(); //unused with Avahi
|
|
}
|
|
|
|
KCMDnssd::~KCMDnssd()
|
|
{
|
|
delete domain;
|
|
}
|
|
|
|
void KCMDnssd::save()
|
|
{
|
|
setCursor(TQCursor(Qt::BusyCursor));
|
|
KCModule::save();
|
|
if (geteuid()==0 && m_wdchanged) saveMdnsd();
|
|
domain->setFileWriteMode(0644); // this should be readable for everyone
|
|
domain->writeEntry("PublishDomain",domainedit->text());
|
|
domain->sync();
|
|
KIPC::sendMessageAll((KIPC::Message)KIPCDomainsChanged);
|
|
if (m_enableZeroconfChanged) {
|
|
|
|
TQString scaryMessage = i18n("Enabling local network browsing will open a network port (5353) on your computer. If security problems are discovered in the zeroconf server, remote attackers could access your computer as the \"avahi\" user.");
|
|
|
|
KProcess *proc = new KProcess;
|
|
|
|
*proc << "tdesu";
|
|
|
|
if (enableZeroconf->isChecked()) {
|
|
if (KMessageBox::warningYesNo( this, scaryMessage, i18n("Enable Zeroconf Network Browsing"), KGuiItem(i18n("Enable Browsing")), KGuiItem(i18n("Don't Enable Browsing")) ) == KMessageBox::Yes) {
|
|
|
|
*proc << "/usr/share/avahi/enable_avahi 1";
|
|
proc->start(KProcess::Block);
|
|
} else {
|
|
enableZeroconf->setChecked(false);
|
|
}
|
|
} else {
|
|
*proc << "/usr/share/avahi/enable_avahi 0";
|
|
proc->start(KProcess::Block);
|
|
}
|
|
}
|
|
setCursor(TQCursor(Qt::ArrowCursor));
|
|
}
|
|
|
|
void KCMDnssd::load()
|
|
{
|
|
if (geteuid()==0) loadMdnsd();
|
|
enableZeroconf->setChecked(false);
|
|
TQProcess avahiStatus(TQString("/usr/share/avahi/avahi_status"), TQT_TQOBJECT(this), "avahiStatus");
|
|
avahiStatus.start();
|
|
while (avahiStatus.isRunning()) {
|
|
kapp->processEvents();
|
|
}
|
|
int exitStatus = avahiStatus.exitqStatus();
|
|
if (exitStatus == 0) { // disabled
|
|
enableZeroconf->setChecked(false);
|
|
} else if (exitStatus == 1) { // enabled
|
|
enableZeroconf->setChecked(true);
|
|
} else if (exitStatus == 2) { // custom setup
|
|
enableZeroconf->setEnabled(false);
|
|
}
|
|
KCModule::load();
|
|
}
|
|
|
|
// hack to work around not working isModified() for KPasswordEdit
|
|
void KCMDnssd::wdchanged()
|
|
{
|
|
WANButton->setEnabled(!domainedit->text().isEmpty() && !hostedit->text().isEmpty());
|
|
changed();
|
|
m_wdchanged=true;
|
|
}
|
|
|
|
void KCMDnssd::enableZeroconfChanged(bool)
|
|
{
|
|
changed();
|
|
m_enableZeroconfChanged=true;
|
|
}
|
|
|
|
void KCMDnssd::loadMdnsd()
|
|
{
|
|
TQFile f(MDNSD_CONF);
|
|
if (!f.open(IO_ReadWrite)) return;
|
|
TQTextStream stream(&f);
|
|
TQString line;
|
|
while (!stream.atEnd()) {
|
|
line = stream.readLine();
|
|
mdnsdLines.insert(line.section(' ',0,0,TQString::SectionSkipEmpty),
|
|
line.section(' ',1,-1,TQString::SectionSkipEmpty));
|
|
}
|
|
if (!mdnsdLines["zone"].isNull()) domainedit->setText(mdnsdLines["zone"]);
|
|
if (!mdnsdLines["hostname"].isNull()) hostedit->setText(mdnsdLines["hostname"]);
|
|
if (!mdnsdLines["secret-64"].isNull()) secretedit->setText(mdnsdLines["secret-64"]);
|
|
}
|
|
|
|
bool KCMDnssd::saveMdnsd()
|
|
{
|
|
mdnsdLines["zone"]=domainedit->text();
|
|
mdnsdLines["hostname"]=hostedit->text();
|
|
if (!secretedit->text().isEmpty()) mdnsdLines["secret-64"]=TQString(secretedit->password());
|
|
else mdnsdLines.remove("secret-64");
|
|
TQFile f(MDNSD_CONF);
|
|
bool newfile=!f.exists();
|
|
if (!f.open(IO_WriteOnly)) return false;
|
|
TQTextStream stream(&f);
|
|
for (TQMap<TQString,TQString>::ConstIterator it=mdnsdLines.begin();it!=mdnsdLines.end();
|
|
++it) stream << it.key() << " " << (*it) << "\n";
|
|
f.close();
|
|
// if it is new file, then make it only accessible for root as it can contain shared
|
|
// secret for dns server.
|
|
if (newfile) chmod(MDNSD_CONF,0600);
|
|
f.setName(MDNSD_PID);
|
|
if (!f.open(IO_ReadOnly)) return true; // it is not running so no need to signal
|
|
TQString line;
|
|
if (f.readLine(line,16)<1) return true;
|
|
unsigned int pid = line.toUInt();
|
|
if (pid==0) return true; // not a pid
|
|
kill(pid,SIGHUP);
|
|
return true;
|
|
}
|
|
|
|
#include "kcmdnssd.moc"
|