summaryrefslogtreecommitdiffstats
path: root/src/input
diff options
context:
space:
mode:
authorSebastien Braun2010-10-05 15:34:12 +0200
committerSebastien Braun2010-10-05 18:15:52 +0200
commit52585c14017d11c439d4962c1ec12f5b87cc93d6 (patch)
treef03b0754abee7694eb42817e6602ce5dc406a396 /src/input
parentBug fix: If there is no VNC thread, do not attempt to rescale mouse position. (diff)
downloadpvs-52585c14017d11c439d4962c1ec12f5b87cc93d6.tar.gz
pvs-52585c14017d11c439d4962c1ec12f5b87cc93d6.tar.xz
pvs-52585c14017d11c439d4962c1ec12f5b87cc93d6.zip
Implement RebootSystem and KillX11 handlers.
Diffstat (limited to 'src/input')
-rw-r--r--src/input/CMakeLists.txt2
-rw-r--r--src/input/inputHandlerChain.h7
-rw-r--r--src/input/killX11Handler.cpp89
-rw-r--r--src/input/killX11Handler.h34
-rw-r--r--src/input/rebootSystemHandler.cpp32
-rw-r--r--src/input/rebootSystemHandler.h34
6 files changed, 197 insertions, 1 deletions
diff --git a/src/input/CMakeLists.txt b/src/input/CMakeLists.txt
index 4aaa845..311d8ce 100644
--- a/src/input/CMakeLists.txt
+++ b/src/input/CMakeLists.txt
@@ -10,6 +10,8 @@ if(UNIX)
pvsprivinputd.cpp
pvsPrivInputHandler.cpp
pvsCheckPrivileges.cpp
+ rebootSystemHandler.cpp
+ killX11Handler.cpp
sayHelloHandler.cpp
)
diff --git a/src/input/inputHandlerChain.h b/src/input/inputHandlerChain.h
index 57168c2..8bcb1d8 100644
--- a/src/input/inputHandlerChain.h
+++ b/src/input/inputHandlerChain.h
@@ -23,7 +23,9 @@
#include "x11FakeKeyboardHandler.h"
#include "x11FakeMouseHandler.h"
#include "privilegedHandlerForwarder.h"
+#include "rebootSystemHandler.h"
#include "sayHelloHandler.h"
+#include "killX11Handler.h"
typedef boost::mpl::list<
Handler<X11FakeKeyboardHandler, policy::RequireSystem<policy::UnixLike> >,
@@ -35,8 +37,11 @@ typedef boost::mpl::list<
typedef InputEventHandlerChain<unprivileged_handler_list> unprivileged_handler_chain;
typedef boost::mpl::list<
- Handler<SayHelloHandler>
+ Handler<SayHelloHandler>,
+ Handler<KillX11Handler, policy::RequireSystem<policy::Linux>, policy::Security<policy::SEC_PHYSICAL_SEAT> >,
+ Handler<RebootLinuxSystemHandler, policy::RequireSystem<policy::Linux>, policy::Security<policy::SEC_PHYSICAL_SEAT> >
>::type privileged_handler_list;
typedef InputEventHandlerChain<privileged_handler_list> privileged_handler_chain;
+
#endif /* INPUTHANDLERCHAIN_H_ */
diff --git a/src/input/killX11Handler.cpp b/src/input/killX11Handler.cpp
new file mode 100644
index 0000000..7ac75a1
--- /dev/null
+++ b/src/input/killX11Handler.cpp
@@ -0,0 +1,89 @@
+/*
+ # Copyright (c) 2009 - OpenSLX Project, Computer Center University of Freiburg
+ #
+ # This program is free software distributed under the GPL version 2.
+ # See http://openslx.org/COPYING
+ #
+ # If you have any feedback please consult http://openslx.org/feedback and
+ # send your suggestions, praise, or complaints to feedback@openslx.org
+ #
+ # General information about OpenSLX can be found at http://openslx.org/
+ # --------------------------------------------------------------------------
+ # killX11Handler.h
+ # - Kill the X11 Server - implementation
+ # --------------------------------------------------------------------------
+ */
+
+#include <sys/types.h>
+#include <signal.h>
+#include <cerrno>
+#include <QDir>
+#include <QFileInfo>
+#include <QStringList>
+#include "pvsCheckPrivileges.h"
+#include "killX11Handler.h"
+
+using namespace std;
+
+void KillX11Handler::handle(InputEvent const&, InputEventContext const* ctx)
+{
+ // Find out which display device is used:
+ QString displayDevice = PVSCheckPrivileges::instance()->getX11DisplayDevice(ctx);
+ QString displayDeviceAbs = QFileInfo(displayDevice).canonicalFilePath();
+
+ if(displayDevice.isNull())
+ {
+ qWarning("Can not kill X server for %d,%d,%d: No Display Device", ctx->getSenderPid(), ctx->getSenderUid(), ctx->getSenderGid());
+ return;
+ }
+
+ QList<pid_t> pids;
+
+ // Find all processes that have it opened:
+ QDir proc("/proc");
+ QFileInfoList entries = proc.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
+ foreach(QFileInfo fi, entries)
+ {
+ // We are only interested in numerical ids:
+ bool ok;
+ pid_t pid = fi.fileName().toUInt(&ok);
+ if(!ok)
+ continue;
+
+ // We have a pid. Now check open files:
+ QDir fds(QString("/proc/%1/fd").arg(pid));
+ qDebug("Searching for X server in %s", fds.absolutePath().toLocal8Bit().constData());
+ QFileInfoList fdfiles = fds.entryInfoList(QDir::Files);
+ foreach(QFileInfo fdfile, fdfiles)
+ {
+ qDebug(" Looking for terminal in %s", fdfile.absoluteFilePath().toLocal8Bit().constData());
+ QFileInfo fdTarget(fdfile.readLink());
+ if(fdTarget.canonicalFilePath() == displayDeviceAbs)
+ {
+ qDebug(" ... found");
+ pids << pid;
+ }
+ }
+ }
+
+ // If everything is well, we have exactly one pid:
+ if(pids.size() != 1)
+ {
+ QStringList pidStrs;
+ foreach(pid_t pid, pids)
+ {
+ pidStrs << QString::number(pid);
+ }
+
+ qWarning("Display device %s is open by multiple or zero processes (%s). We don't know which is X. Aborting.",
+ displayDeviceAbs.toLocal8Bit().constData(),
+ pidStrs.join(", ").toLocal8Bit().constData());
+ return;
+ }
+
+ // We found the PID for the X server. Now kill it.
+ QString exe = QFileInfo(QString("/proc/%1/exe").arg(pids[0])).readLink();
+ qDebug("Killing X server, PID %d, exe name %s with SIGTERM", pids[0], exe.toLocal8Bit().constData());
+
+// kill(pids[0], SIGTERM);
+}
diff --git a/src/input/killX11Handler.h b/src/input/killX11Handler.h
new file mode 100644
index 0000000..2f3ef44
--- /dev/null
+++ b/src/input/killX11Handler.h
@@ -0,0 +1,34 @@
+/*
+ # Copyright (c) 2009 - OpenSLX Project, Computer Center University of Freiburg
+ #
+ # This program is free software distributed under the GPL version 2.
+ # See http://openslx.org/COPYING
+ #
+ # If you have any feedback please consult http://openslx.org/feedback and
+ # send your suggestions, praise, or complaints to feedback@openslx.org
+ #
+ # General information about OpenSLX can be found at http://openslx.org/
+ # --------------------------------------------------------------------------
+ # killX11Handler.h
+ # - Kill the X11 Server - interface
+ # --------------------------------------------------------------------------
+ */
+
+#ifndef KILLX11HANDLER_H_
+#define KILLX11HANDLER_H_
+
+#include <QCoreApplication>
+#include "inputEventHandler.h"
+
+class KillX11Handler : public DefaultInputEventHandler<InputEvent::ET_SPECIAL, InputEvent::EC_KILL_X>
+{
+public:
+ void handle(InputEvent const&, InputEventContext const*);
+
+ static void describeInto(QList<SpecialInputEventDescription>& list)
+ {
+ list << SpecialInputEventDescription(tr(QT_TRANSLATE_NOOP("InputEventHandler", "Kill X Server")), InputEvent::ET_SPECIAL, InputEvent::EC_KILL_X);
+ }
+};
+
+#endif /* KILLX11HANDLER_H_ */
diff --git a/src/input/rebootSystemHandler.cpp b/src/input/rebootSystemHandler.cpp
new file mode 100644
index 0000000..b5b8f8a
--- /dev/null
+++ b/src/input/rebootSystemHandler.cpp
@@ -0,0 +1,32 @@
+/*
+ # Copyright (c) 2009 - OpenSLX Project, Computer Center University of Freiburg
+ #
+ # This program is free software distributed under the GPL version 2.
+ # See http://openslx.org/COPYING
+ #
+ # If you have any feedback please consult http://openslx.org/feedback and
+ # send your suggestions, praise, or complaints to feedback@openslx.org
+ #
+ # General information about OpenSLX can be found at http://openslx.org/
+ # --------------------------------------------------------------------------
+ # rebootSystemHandler.cpp
+ # - Handle system reboot requests - implementation
+ # --------------------------------------------------------------------------
+ */
+
+#include <sys/types.h>
+#include <signal.h>
+#include <cerrno>
+#include <QtDebug>
+#include "rebootSystemHandler.h"
+
+using namespace std;
+
+void RebootLinuxSystemHandler::handle(InputEvent const& evt, InputEventContext const* ctx)
+{
+ // Rebooting a linux system is particulary easy:
+ if(kill(1, SIGINT) < 0)
+ {
+ qWarning("Could not kill /sbin/init: %s", strerror(errno));
+ }
+}
diff --git a/src/input/rebootSystemHandler.h b/src/input/rebootSystemHandler.h
new file mode 100644
index 0000000..34fa8ae
--- /dev/null
+++ b/src/input/rebootSystemHandler.h
@@ -0,0 +1,34 @@
+/*
+ # Copyright (c) 2009 - OpenSLX Project, Computer Center University of Freiburg
+ #
+ # This program is free software distributed under the GPL version 2.
+ # See http://openslx.org/COPYING
+ #
+ # If you have any feedback please consult http://openslx.org/feedback and
+ # send your suggestions, praise, or complaints to feedback@openslx.org
+ #
+ # General information about OpenSLX can be found at http://openslx.org/
+ # --------------------------------------------------------------------------
+ # rebootSystemHandler.h
+ # - Handle system reboot requests - interface
+ # --------------------------------------------------------------------------
+ */
+
+#ifndef REBOOTSYSTEMHANDLER_H_
+#define REBOOTSYSTEMHANDLER_H_
+
+#include <QCoreApplication>
+#include "inputEventHandler.h"
+
+class RebootLinuxSystemHandler : public DefaultInputEventHandler<InputEvent::ET_SPECIAL, InputEvent::EC_REBOOT>
+{
+public:
+ void handle(InputEvent const&, InputEventContext const*);
+
+ static void describeInto(QList<SpecialInputEventDescription>& list)
+ {
+ list << SpecialInputEventDescription(tr(QT_TRANSLATE_NOOP("InputEventHandler", "Reboot")), InputEvent::ET_SPECIAL, InputEvent::EC_REBOOT);
+ }
+};
+
+#endif /* REBOOTSYSTEMHANDLER_H_ */