diff options
Diffstat (limited to 'kcontrol/dnssd/kcmdnssd.cpp')
-rw-r--r-- | kcontrol/dnssd/kcmdnssd.cpp | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/kcontrol/dnssd/kcmdnssd.cpp b/kcontrol/dnssd/kcmdnssd.cpp new file mode 100644 index 000000000..d86cc2897 --- /dev/null +++ b/kcontrol/dnssd/kcmdnssd.cpp @@ -0,0 +1,142 @@ +/*************************************************************************** + * Copyright (C) 2004,2005 by Jakub Stachowski * + * [email protected] * + * * + * 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 <qlayout.h> +#include <qfile.h> +#include <qgroupbox.h> +#include <qradiobutton.h> +#include <qtimer.h> +#include <qtabwidget.h> + +#include <klocale.h> +#include <kglobal.h> +#include <kparts/genericfactory.h> +#include <kprocess.h> +#include <klineedit.h> +#include <kpassdlg.h> +#include <ksimpleconfig.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, QWidget> KCMDnssdFactory; +K_EXPORT_COMPONENT_FACTORY( kcm_kdnssd, KCMDnssdFactory("kcmkdnssd")) + +KCMDnssd::KCMDnssd(QWidget *parent, const char *name, const QStringList&) + : 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( QString::fromLatin1( KDE_CONFDIR "/kdnssdrc" )); + domain->setGroup("publishing"); + load(); + connect(hostedit,SIGNAL(textChanged(const QString&)),this,SLOT(wdchanged())); + connect(secretedit,SIGNAL(textChanged(const QString&)),this,SLOT(wdchanged())); + connect(domainedit,SIGNAL(textChanged(const QString&)),this,SLOT(wdchanged())); + if (DNSSD::Configuration::self()->publishDomain().isEmpty()) WANButton->setEnabled(false); +} + +KCMDnssd::~KCMDnssd() +{ + delete domain; +} + +void KCMDnssd::save() +{ + 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); +} + +void KCMDnssd::load() +{ + KCModule::load(); + if (geteuid()==0) loadMdnsd(); +} + +// 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::loadMdnsd() +{ + QFile f(MDNSD_CONF); + if (!f.open(IO_ReadWrite)) return; + QTextStream stream(&f); + QString line; + while (!stream.atEnd()) { + line = stream.readLine(); + mdnsdLines.insert(line.section(' ',0,0,QString::SectionSkipEmpty), + line.section(' ',1,-1,QString::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"]=QString(secretedit->password()); + else mdnsdLines.remove("secret-64"); + QFile f(MDNSD_CONF); + bool newfile=!f.exists(); + if (!f.open(IO_WriteOnly)) return false; + QTextStream stream(&f); + for (QMap<QString,QString>::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 + QString 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" |