summaryrefslogtreecommitdiffstats
path: root/kdesudo
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-03-15 17:26:15 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-03-15 17:26:15 +0000
commita491e15527238be045ea245a9f5b51e4b2a99b56 (patch)
treecfb71a1af3daf6afbac8fcf7083a104a5f9ee680 /kdesudo
downloadtdesudo-a491e15527238be045ea245a9f5b51e4b2a99b56.tar.gz
tdesudo-a491e15527238be045ea245a9f5b51e4b2a99b56.zip
Added KDE3 version of KDE Sudo wrapper
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kdesudo@1103680 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kdesudo')
-rw-r--r--kdesudo/Makefile.am64
-rw-r--r--kdesudo/kdesudo.cpp439
-rw-r--r--kdesudo/kdesudo.h96
-rw-r--r--kdesudo/main.cpp141
4 files changed, 740 insertions, 0 deletions
diff --git a/kdesudo/Makefile.am b/kdesudo/Makefile.am
new file mode 100644
index 0000000..7d156d6
--- /dev/null
+++ b/kdesudo/Makefile.am
@@ -0,0 +1,64 @@
+####### kdevelop will overwrite this part!!! (begin)##########
+bin_PROGRAMS = kdesudo
+
+## INCLUDES were found outside kdevelop specific part
+
+kdesudo_SOURCES = kdesudo.cpp main.cpp
+kdesudo_LDADD = $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) $(LIBSOCKET) -lkdesu
+
+
+EXTRA_DIST = main.cpp kdesudo.cpp kdesudo.h
+
+install-data-local:
+
+uninstall-local:
+
+####### kdevelop will overwrite this part!!! (end)############
+# These paths are KDE specific. Use them:
+# kde_appsdir Where your application's menu entry (.desktop) should go to.
+# kde_icondir Where your icon should go to - better use KDE_ICON.
+# kde_sounddir Where your sounds should go to.
+# kde_htmldir Where your docs should go to. (contains lang subdirs)
+# kde_datadir Where you install application data. (Use a subdir)
+# kde_locale Where translation files should go to. (contains lang subdirs)
+# kde_cgidir Where cgi-bin executables should go to.
+# kde_confdir Where config files should go to (system-wide ones with default values).
+# kde_mimedir Where mimetypes .desktop files should go to.
+# kde_servicesdir Where services .desktop files should go to.
+# kde_servicetypesdir Where servicetypes .desktop files should go to.
+# kde_toolbardir Where general toolbar icons should go to (deprecated, use KDE_ICON).
+# kde_wallpaperdir Where general wallpapers should go to.
+# kde_templatesdir Where templates for the "New" menu (Konqueror/KDesktop) should go to.
+# kde_bindir Where executables should go to. Use bin_PROGRAMS or bin_SCRIPTS.
+# kde_libdir Where shared libraries should go to. Use lib_LTLIBRARIES.
+# kde_moduledir Where modules (e.g. parts) should go to. Use kde_module_LTLIBRARIES.
+# kde_styledir Where Qt/KDE widget styles should go to (new in KDE 3).
+# kde_designerdir Where Qt Designer plugins should go to (new in KDE 3).
+
+# set the include path for X, qt and KDE
+INCLUDES= $(all_includes)
+
+METASOURCES = AUTO
+
+# the library search path.
+kdesudo_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+
+# Uncomment the following two lines if you add a ui.rc file for your application to make use of
+# KDE?s XML GUI builing
+#rcdir = $(kde_datadir)/kdesudo
+#rc_DATA = kdesudoui.rc
+
+#WARNING: if you use a ui.rc file above, use:
+
+# messages: rc.cpp
+
+# instead of
+
+# messages:
+
+messages:
+ LIST=`find . -name \*.h -o -name \*.hh -o -name \*.H -o -name \*.hxx -o -name \*.hpp -o -name \*.cpp -o -name \*.cc -o -name \*.cxx -o -name \*.ecpp -o -name \*.C`; \
+ if test -n "$$LIST"; then \
+ $(XGETTEXT) $$LIST -o $(podir)/kdesudo.pot; \
+ fi
+
diff --git a/kdesudo/kdesudo.cpp b/kdesudo/kdesudo.cpp
new file mode 100644
index 0000000..e746703
--- /dev/null
+++ b/kdesudo/kdesudo.cpp
@@ -0,0 +1,439 @@
+/***************************************************************************
+ kdesudo.cpp - description
+ -------------------
+ begin : Sam Feb 15 15:42:12 CET 2003
+ copyright : (C) 2003 by Robert Gruber <rgruber@users.sourceforge.net>
+ (C) 2007 by Martin Böhm <martin.bohm@kubuntu.org>
+ Anthony Mercatante <tonio@kubuntu.org>
+ Canonical Ltd (Jonathan Riddell <jriddell@ubuntu.com>)
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "kdesudo.h"
+
+#include <qfile.h>
+#include <qdir.h>
+#include <qdatastream.h>
+#include <qstring.h>
+
+#include <kcmdlineargs.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpushbutton.h>
+#include <kpassdlg.h>
+#include <kstandarddirs.h>
+#include <kdesu/kcookie.h>
+#include <kdebug.h>
+#include <kshell.h>
+#include <ktempfile.h>
+
+#include <iostream>
+#include <cstdio>
+#include <cstdlib>
+#include <signal.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+KdeSudo::KdeSudo(QWidget *parent, const char *name,const QString& icon, const QString& generic, bool withIgnoreButton)
+ : KPasswordDialog(KPasswordDialog::Password, false, (withIgnoreButton ? User1: false), icon, parent, name)
+{
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ QString defaultComment = i18n("<b>%1</b> needs administrative privileges. Please enter your password for verification.");
+ p=NULL;
+ bError=false;
+
+ m_pCookie = new KCookie;
+
+ // Set vars
+ bool newDcop = args->isSet("newdcop");
+ bool realtime = args->isSet("r");
+ bool priority = args->isSet("p");
+ bool showCommand = (!args->isSet("d"));
+ bool changeUID = true;
+ bool noExec = false;
+ keepPwd = (!args->isSet("n"));
+ emptyPwd = args->isSet("s");
+ QString runas = args->getOption("u");
+ QString cmd;
+
+ if (!args->isSet("c") && !args->count() && (!args->isSet("s")))
+ {
+ KMessageBox::information(NULL, i18n("No command arguments supplied!\nUsage: kdesudo [-u <runas>] <command>\nKdeSudo will now exit..."));
+ noExec = true;
+ }
+
+ p = new KProcess;
+ p->clearArguments();
+
+ // Parsins args
+
+ /* Get the comment out of cli args */
+ QByteArray commentBytes = args->getOption("comment");
+ QTextCodec* tCodecConv = QTextCodec::codecForLocale();
+ QString comment = tCodecConv->toUnicode(commentBytes, commentBytes.size());
+
+ if (args->isSet("f"))
+ {
+ // If file is writeable, do not change uid
+ QString filename = QFile::decodeName(args->getOption("f"));
+ QString file = filename;
+ if (!file.isEmpty())
+ {
+ if (file.at(0) != '/')
+ {
+ KStandardDirs dirs;
+ dirs.addKDEDefaults();
+ file = dirs.findResource("config", file);
+ if (file.isEmpty())
+ {
+ kdError(1206) << "Config file not found: " << file << "\n";
+ exit(1);
+ }
+ }
+ QFileInfo fi(file);
+ if (!fi.exists())
+ {
+ kdError(1206) << "File does not exist: " << file << "\n";
+ exit(1);
+ }
+ if (fi.isWritable())
+ {
+ changeUID = false;
+ }
+ }
+ }
+
+ if (withIgnoreButton)
+ {
+ setButtonText(User1, i18n("&Ignore"));
+ }
+
+ // Apologies for the C code, taken from kdelibs/kdesu/kdesu_stub.c
+ // KControl and other places need to use the user's existing DCOP server
+ // For that we set DCOPSERVER. Create a file in /tmp and use iceauth to add magic cookies
+ // from the existing server and set ICEAUTHORITY to point to the file
+ if (!newDcop) {
+ dcopServer = m_pCookie->dcopServer();
+ QCString dcopAuth = m_pCookie->dcopAuth();
+ QCString iceAuth = m_pCookie->iceAuth();
+
+ FILE *fout;
+ char iceauthority[200];
+ char *host, *auth;
+ host = qstrdup(dcopServer);
+ auth = qstrdup(iceAuth);
+ int tempfile;
+ int oldumask = umask(077);
+
+ strcpy(iceauthority, "/tmp/iceauth.XXXXXXXXXX");
+ tempfile = mkstemp(iceauthority);
+ umask(oldumask);
+ if (tempfile == -1) {
+ kdError() << "error in kdesudo mkstemp" << endl;
+ exit(1);
+ } else {
+ // close(tempfile); //FIXME why does this make the connect() call later crash?
+ }
+ iceauthorityFile = iceauthority;
+ //FIXME we should change owner of iceauthority file, but don't have permissions
+ setenv("ICEAUTHORITY", iceauthorityFile, 1);
+
+ fout = popen("iceauth >/dev/null 2>&1", "w");
+ if (!fout) {
+ kdError() << "error in kdesudo running iceauth" << endl;
+ exit(1);
+ }
+ fprintf(fout, "add ICE \"\" %s %s\n", host, auth);
+ auth = qstrdup(dcopAuth);
+ //auth = xstrsep(params[P_DCOP_AUTH].value);
+ fprintf(fout, "add DCOP \"\" %s %s\n", host, auth);
+ unsetenv("ICEAUTHORITY");
+ pclose(fout);
+
+ // Exporting the user's sycoca
+ kdeSycoca = QFile::encodeName(locateLocal("cache", "ksycoca"));
+ }
+
+ connect( p, SIGNAL(receivedStdout(KProcess*, char*, int)), this, SLOT(receivedOut(KProcess*, char*, int)) );
+ connect( p, SIGNAL(receivedStderr(KProcess*, char*, int)), this, SLOT(receivedOut(KProcess*, char*, int)) );
+ connect( p, SIGNAL(processExited (KProcess *)), this, SLOT(procExited(KProcess*)));
+
+ QString xauthenv = QString(getenv("HOME")) + "/.Xauthority";
+ p->setEnvironment("XAUTHORITY", xauthenv);
+
+ // Generate the xauth cookie and put it in a tempfile
+ // set the environment variables to reflect that.
+ // Default cookie-timeout is 60 sec. .
+ // 'man xauth' for more info on xauth cookies.
+
+ KTempFile temp = KTempFile("/tmp/kdesudo-","-xauth");
+ m_tmpname = temp.name();
+
+ FILE *f;
+ char buf[1024];
+
+ QCString disp = m_pCookie->display();
+ // command: xauth -q -f m_tmpname generate $DISPLAy . trusted timeout 60
+ QString c = "/usr/bin/xauth -q -f " + m_tmpname + " generate "
+ + QString::fromLocal8Bit(disp) + " . trusted timeout 60";
+ blockSigChild(); // pclose uses waitpid()
+
+ if (!(f = popen(c, "r"))) {
+ kdWarning() << k_lineinfo << "Cannot run: " << c << "\n";
+ unblockSigChild();
+ return;
+ }
+
+ // non root users need to be able to read the xauth file.
+ // the xauth file is deleted when kdesudo exits. security?
+ QFile tf(m_tmpname);
+ if (!runas.isEmpty() && runas != "root" && tf.exists())
+ chmod(m_tmpname.ascii(),0644);
+
+ QCStringList output;
+ while (fgets(buf, 1024, f) > 0)
+ output += buf;
+ if (pclose(f) < 0) {
+ kdError() << k_lineinfo << "Could not run xauth.\n";
+ unblockSigChild();
+ return;
+ }
+ unblockSigChild();
+
+ p->setEnvironment("DISPLAY", disp);
+ p->setEnvironment("XAUTHORITY", m_tmpname);
+
+ if (emptyPwd)
+ *p << "sudo" << "-k";
+ else
+ {
+ if (changeUID)
+ {
+ *p << "sudo" << "-H" << "-S" << "-p" << "passprompt";
+
+ if (!runas.isEmpty())
+ *p << "-u" << runas;
+ }
+
+ if (!dcopServer.isEmpty())
+ *p << "DCOPSERVER=" + dcopServer;
+
+ if (!iceauthorityFile.isEmpty())
+ *p << "ICEAUTHORITY=" + iceauthorityFile;
+
+ if (!kdeSycoca.isEmpty())
+ *p << "KDESYCOCA=" + kdeSycoca;
+
+ if (realtime)
+ {
+ *p << "nice" << "-n" << "10";
+ addLine(i18n("Priority:"), i18n("realtime:") + QChar(' ') + QString("50/100"));
+ }
+ else if (priority)
+ {
+ QString n = args->getOption("p");
+ int intn = atoi(n);
+ intn = (intn * 40 / 100) - (20 + 0.5);
+
+ QString strn;
+ strn.sprintf("%d",intn);
+
+ *p << "nice" << "-n" << strn;
+ addLine(i18n("Priority:"), n + QString("/100"));
+ }
+
+ *p << "--";
+
+ if (args->isSet("c"))
+ {
+ QString command = args->getOption("c");
+ QStringList commandSplit = KShell::splitArgs(command);
+
+ for (int i = 0; i < commandSplit.count(); i++)
+ {
+ QString arg = validArg(commandSplit[i]);
+ *p << arg;
+ if (i == 0)
+ cmd += validArg(commandSplit[i]) + QChar(' ');
+ else
+ cmd += KProcess::quote(validArg(commandSplit[i])) + QChar(' ');
+ }
+ }
+
+ if (args->count())
+ {
+ for (int i = 0; i < args->count(); i++)
+ {
+ if ((!args->isSet("c")) && (i == 0))
+ {
+ QStringList argsSplit = KShell::splitArgs(args->arg(i));
+ for (int j = 0; j < argsSplit.count(); j++)
+ {
+ *p << validArg(argsSplit[j]);
+ if (j == 0)
+ cmd += validArg(argsSplit[j]) + QChar(' ');
+ else
+ cmd += KProcess::quote(validArg(argsSplit[j])) + QChar(' ');
+ }
+ }
+ else
+ {
+ *p << validArg(args->arg(i));
+ cmd += validArg(args->arg(i)) + QChar(' ');
+ }
+ }
+ }
+
+ if (showCommand && !cmd.isEmpty())
+ addLine(i18n("Command:"), cmd);
+ }
+
+ if (comment.isEmpty())
+ {
+ if (!generic.isEmpty())
+ setPrompt(defaultComment.arg(generic));
+ else
+ setPrompt(defaultComment.arg(cmd));
+ }
+ else
+ setPrompt(comment);
+
+ if (noExec)
+ exit(0);
+ else
+ p->start( KProcess::NotifyOnExit, KProcess::All );
+}
+
+KdeSudo::~KdeSudo()
+{
+}
+
+void KdeSudo::receivedOut(KProcess*, char*buffer, int buflen)
+{
+ char *pcTmp= new char[buflen+1];
+ strncpy(pcTmp,buffer,buflen);
+ pcTmp[buflen]='\0';
+ QString strOut(pcTmp);
+
+ std::cout << strOut << std::endl;
+
+ static int badpass = 0;
+
+ if (strOut.find("Sorry, try again")!=-1)
+ {
+ badpass++;
+ if (badpass>2)
+ {
+ bError=true;
+ KMessageBox::error(this, i18n("Wrong password! Exiting..."));
+ kapp->quit();
+ }
+ }
+ if (strOut.find("command not found")!=-1)
+ {
+ bError=true;
+ KMessageBox::error(this, i18n("Command not found!"));
+ kapp->quit();
+ }
+ if (strOut.find("is not in the sudoers file")!=-1)
+ {
+ bError=true;
+ KMessageBox::error(this, i18n("Your username is unknown to sudo!"));
+ kapp->quit();
+ }
+ if (strOut.find("is not allowed to execute")!=-1)
+ {
+ bError=true;
+ KMessageBox::error(this, i18n("Your user is not allowed to run the specified command!"));
+ kapp->quit();
+ }
+ if (strOut.find("is not allowed to run sudo on")!=-1)
+ {
+ bError=true;
+ KMessageBox::error(this, i18n("Your user is not allowed to run sudo on this host!"));
+ kapp->quit();
+ }
+ if (strOut.find("may not run sudo on")!=-1)
+ {
+ bError=true;
+ KMessageBox::error(this, i18n("Your user is not allowed to run sudo on this host!"));
+ kapp->quit();
+ }
+ if ((strOut.find("passprompt")!=-1) || (strOut.find("PIN (CHV2)")!=-1))
+ {
+ this->clearPassword();
+ this->show();
+ }
+}
+
+void KdeSudo::procExited(KProcess*)
+{
+ if (!keepPwd && unCleaned)
+ {
+ unCleaned = false;
+ p->clearArguments();
+ *p << "sudo" << "-k";
+ p->start( KProcess::NotifyOnExit, KProcess::All );
+ }
+
+ if (!newDcop && !iceauthorityFile.isEmpty())
+ if (!iceauthorityFile.isEmpty())
+ QFile::remove(iceauthorityFile);
+
+ if (!bError) {
+ if (!m_tmpname.isEmpty())
+ QFile::remove(m_tmpname);
+ kapp->quit();
+ }
+}
+
+void KdeSudo::slotOk()
+{
+ QString strTmp(password());
+ strTmp+="\n";
+ p->writeStdin(strTmp.ascii(),(int)strTmp.length());
+ this->hide();
+}
+
+void KdeSudo::slotUser1()
+{
+ done(AsUser);
+}
+
+void KdeSudo::blockSigChild()
+{
+ sigset_t sset;
+ sigemptyset(&sset);
+ sigaddset(&sset, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &sset, 0L);
+}
+void KdeSudo::unblockSigChild()
+{
+ sigset_t sset;
+ sigemptyset(&sset);
+ sigaddset(&sset, SIGCHLD);
+ sigprocmask(SIG_UNBLOCK, &sset, 0L);
+}
+
+QString KdeSudo::validArg(QString arg)
+{
+ QChar firstChar = arg.at(0);
+ QChar lastChar = arg.at(arg.length() - 1);
+
+ if ( (firstChar == '"' && lastChar == '"') || (firstChar == '\'' && lastChar == '\'') )
+ {
+ arg = arg.remove(0, 1);
+ arg = arg.remove(arg.length() - 1, 1);
+ }
+ return arg;
+}
diff --git a/kdesudo/kdesudo.h b/kdesudo/kdesudo.h
new file mode 100644
index 0000000..0c59047
--- /dev/null
+++ b/kdesudo/kdesudo.h
@@ -0,0 +1,96 @@
+/***************************************************************************
+ kdesudo.cpp - description
+ -------------------
+ begin : Sam Feb 15 15:42:12 CET 2003
+ copyright : (C) 2003 by Robert Gruber <rgruber@users.sourceforge.net>
+ (C) 2007 by Martin Böhm <martin.bohm@kubuntu.org>
+ Anthony Mercatante <tonio@kubuntu.org>
+ Canonical Ltd (Jonathan Riddell <jriddell@ubuntu.com>)
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KDESUDO_H
+#define KDESUDO_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapp.h>
+#include <qwidget.h>
+#include <kpassdlg.h>
+#include <qstring.h>
+#include <qtextcodec.h>
+#include <kprocess.h>
+class KCookie;
+
+/*
+* KdeSudo is the base class of the project
+*
+* It inherits KPasswordDialog and overrrides the
+* slot slotOK()
+*
+* @author Robert Gruber <rgruber@users.sourceforge.net>
+* @version 2.4
+*/
+
+class KdeSudo : public KPasswordDialog
+{
+ Q_OBJECT
+ public:
+ /*
+ * Default construtor
+ */
+ KdeSudo(QWidget* parent=0, const char *name=0, const QString& icon=QString(), const QString& generic=QString(), bool withIgnoreButton=false);
+
+ /*
+ * Default destructor
+ */
+ ~KdeSudo();
+ enum ResultCodes { AsUser = 10 };
+
+public slots: // Public slots
+ /*
+ * This slot gets exectuted if sudo creates some output
+ */
+ void receivedOut(KProcess*proc, char*buffer, int buflen);
+ /*
+ * This slot gets exectuted when sudo exits
+ */
+ void procExited(KProcess *proc);
+ /*
+ * This slot overrides the slot from KPasswordDialog
+ * @see KPasswordDialog
+ */
+ void slotOk();
+ void slotUser1();
+ QString validArg(QString arg);
+
+private: // Private attributes
+ KProcess * p;
+ bool bError;
+ bool newDcop;
+ bool keepPwd;
+ bool emptyPwd;
+ bool useTerm;
+ bool noExec;
+ bool unCleaned;
+ QString m_tmpname;
+ QString iceauthorityFile;
+ QString dcopServer;
+ QString kdeSycoca;
+ KCookie* m_pCookie;
+ void blockSigChild();
+ void unblockSigChild();
+};
+
+#endif
diff --git a/kdesudo/main.cpp b/kdesudo/main.cpp
new file mode 100644
index 0000000..7306629
--- /dev/null
+++ b/kdesudo/main.cpp
@@ -0,0 +1,141 @@
+/***************************************************************************
+ kdesudo.cpp - description
+ -------------------
+ begin : Sam Feb 15 15:42:12 CET 2003
+ copyright : (C) 2003 by Robert Gruber <rgruber@users.sourceforge.net>
+ (C) 2007 by Martin Böhm <martin.bohm@kubuntu.org>
+ Anthony Mercatante <tonio@kubuntu.org>
+ Canonical Ltd (Jonathan Riddell <jriddell@ubuntu.com>)
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+
+#include "kdesudo.h"
+#include <kmessagebox.h>
+#include <kdesktopfile.h>
+#include <kiconloader.h>
+#include <kicontheme.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kprocess.h>
+#include <kdebug.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+
+static const char *description =
+ I18N_NOOP("KdeSudo");
+// INSERT A DESCRIPTION FOR YOUR APPLICATION HERE
+
+
+static KCmdLineOptions options[] =
+{
+ { "u <runas>", I18N_NOOP("sets a runas user"), 0 },
+ { "c <command>", I18N_NOOP("The command to execute"), 0 },
+ { "s", I18N_NOOP("Forget passwords"), 0 },
+ { "i <icon name>", I18N_NOOP("Specify icon to use in the password dialog"), 0},
+ { "d", I18N_NOOP("Do not show the command to be run in the dialog"), 0},
+ { "p <priority>", I18N_NOOP("Process priority, between 0 and 100, 0 the lowest [50]"), 0},
+ { "r", I18N_NOOP("Use realtime scheduling"), 0},
+ { "f <file>", I18N_NOOP("Use target UID if <file> is not writeable"), 0},
+ { "t", I18N_NOOP("Fake option for KDE's KdeSu compatibility"), 0 },
+ { "n", I18N_NOOP("Do not keep password"), 0},
+ { "nonewdcop", I18N_NOOP("Use existing DCOP server"), 0},
+ { "comment <dialog text>", I18N_NOOP("The comment that should be displayed in the dialog"), 0},
+ { "noignorebutton", I18N_NOOP("Do not display « ignore » button"), 0 },
+ { "+command", I18N_NOOP("The command to execute"), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData aboutData("kdesudo", I18N_NOOP("KdeSudo"),
+ VERSION, description, KAboutData::License_GPL,
+ "(c) 2007-2008, Anthony Mercatante", 0, 0, "tonio@ubuntu.com");
+ aboutData.addAuthor("Robert Gruber",0, "rgruber@users.sourceforge.net");
+ aboutData.addAuthor("Anthony Mercatante",0, "tonio@ubuntu.com");
+ KCmdLineArgs::init(argc, argv, &aboutData);
+ KCmdLineArgs::addCmdLineOptions(options); // Add our own options.
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ KApplication a;
+
+ QString executable;
+ QStringList executableList;
+ QString arg;
+ QString command;
+ QStringList commandlist;
+ QString icon;
+
+ bool withIgnoreButton = args->isSet("ignorebutton");
+
+ if (args->isSet("c"))
+ executable = args->getOption("c");
+
+ if (args->count())
+ {
+ if (executable.isEmpty())
+ {
+ command = args->arg(0);
+ commandlist = QStringList::split(QChar(' '), command);
+ executable = commandlist[0];
+ }
+ }
+
+ /* We have to make sure the executable is only the binary name */
+ executableList = QStringList::split(" ", executable);
+ executable = executableList[0];
+
+ executableList = QStringList::split("/", executable);
+ int i = executableList.count() - 1;
+ executable = executableList[i];
+
+ /* Kubuntu has a bug in it - this is a workaround for it */
+ KGlobal::dirs()->addResourceDir("apps","/usr/share/applications/kde");
+ KGlobal::dirs()->addResourceDir("apps","/usr/share/applications");
+
+ QString deskFilePath = KGlobal::dirs()->findResource("apps",executable + ".desktop");
+ KDesktopFile desktopFile(deskFilePath,true);
+
+ /* icon parsing */
+ if (args->isSet("i"))
+ icon = args->getOption("i");
+ else
+ {
+ QString iconName = desktopFile.readIcon();
+ icon = KGlobal::iconLoader()->iconPath(iconName, -1* KIcon::StdSizes(KIcon::SizeHuge), true);
+ }
+
+ /* generic name parsing */
+ QString name = desktopFile.readName();
+ QString genericName = desktopFile.readGenericName();
+
+ if (!name.isEmpty())
+ {
+ if (!genericName.isEmpty())
+ name += " - " + genericName;
+ }
+ else if (!genericName.isEmpty())
+ name = genericName;
+ else
+ name = executable;
+
+ KdeSudo *kdesudo = new KdeSudo(0,0,icon,name,withIgnoreButton);
+
+ a.setMainWidget(kdesudo);
+ args->clear();
+
+ return a.exec();
+}