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.
tdebase/kcontrol/dnssd/kcmdnssd.cpp

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("TDESU_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"