diff options
Diffstat (limited to 'kcontrol/dnssd/kcmdnssd.cpp')
-rw-r--r-- | kcontrol/dnssd/kcmdnssd.cpp | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/kcontrol/dnssd/kcmdnssd.cpp b/kcontrol/dnssd/kcmdnssd.cpp new file mode 100644 index 000000000..65992bb09 --- /dev/null +++ b/kcontrol/dnssd/kcmdnssd.cpp @@ -0,0 +1,208 @@ +/*************************************************************************** + * 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 <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 <tdelocale.h> +#include <tdeglobal.h> +#include <tdeparts/genericfactory.h> +#include <kprocess.h> +#include <klineedit.h> +#include <kpassdlg.h> +#include <ksimpleconfig.h> +#include <tdeapplication.h> +#include <tdemessagebox.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_tdednssd, KCMDnssdFactory("kcmtdednssd")) + +KCMDnssd::KCMDnssd(TQWidget *parent, const char *name, const TQStringList&) + : ConfigDialog(parent, name), m_wdchanged(false) +{ + setAboutData(new TDEAboutData(I18N_NOOP("kcm_tdednssd"), + I18N_NOOP("ZeroConf configuration"),0,0,TDEAboutData::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::fromLatin1( KDE_CONFDIR "/tdednssdrc" )); + 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)); + TDECModule::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."); + + TDEProcess *proc = new TDEProcess; + + *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(TDEProcess::Block); + } else { + enableZeroconf->setChecked(false); + } + } else { + *proc << "/usr/share/avahi/enable_avahi 0"; + proc->start(TDEProcess::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.exitStatus(); + if (exitStatus == 0) { // disabled + enableZeroconf->setChecked(false); + } else if (exitStatus == 1) { // enabled + enableZeroconf->setChecked(true); + } else if (exitStatus == 2) { // custom setup + enableZeroconf->setEnabled(false); + } + TDECModule::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; +} + +TQString KCMDnssd::handbookSection() const +{ + // FIXME + // No context-sensitive help documentation currently exists for this module! + int index = tabs->currentPageIndex(); + if (index == 0) { + //return ""; + return TQString::null; + } + else { + return TQString::null; + } +} + +#include "kcmdnssd.moc" |