From b909222db906221778ff9f541432877a2a3841c8 Mon Sep 17 00:00:00 2001 From: arcan1s Date: Wed, 27 Aug 2014 17:23:12 +0400 Subject: [PATCH] better submodules integration (hope =)) add --session support to the helper --- .gitmodules | 12 +++++----- sources/gui/src/settingswindow.ui | 22 +++++++++---------- sources/helper/bash-completions | 1 + sources/helper/netctlgui-helper.1 | 2 ++ sources/helper/netctlgui-helper.service | 7 ++++-- sources/helper/src/CMakeLists.txt | 10 ++++----- sources/helper/src/main.cpp | 4 ++++ sources/helper/src/messages.cpp | 3 +++ sources/helper/src/netctlhelper.cpp | 28 ++++++++++++++++++++++++ sources/helper/src/netctlhelper.h | 1 + sources/helper/zsh-completions | 1 + sources/resources/icon-helper.png | Bin 0 -> 12485 bytes sources/resources/resources.qrc | 1 + 13 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 sources/resources/icon-helper.png diff --git a/.gitmodules b/.gitmodules index 48cbb3b..93bd87e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,12 @@ -[submodule "sources/3rdparty/task"] - path = sources/3rdparty/task - url = https://github.com/arcan1s/qtadds-task.git [submodule "sources/3rdparty/tasks"] path = sources/3rdparty/tasks url = https://github.com/mhogomchungu/tasks.git -[submodule "sources/3rdparty/language"] - path = sources/3rdparty/language - url = https://github.com/arcan1s/qtadds-language.git [submodule "sources/3rdparty/pdebug"] path = sources/3rdparty/pdebug url = https://github.com/arcan1s/qtadds-pdebug.git +[submodule "sources/3rdparty/language"] + path = sources/3rdparty/language + url = https://github.com/arcan1s/qtadds-language.git +[submodule "sources/3rdparty/task"] + path = sources/3rdparty/task + url = https://github.com/arcan1s/qtadds-taskadds-qprocess.git diff --git a/sources/gui/src/settingswindow.ui b/sources/gui/src/settingswindow.ui index 51ac9cf..2f19661 100644 --- a/sources/gui/src/settingswindow.ui +++ b/sources/gui/src/settingswindow.ui @@ -6,8 +6,8 @@ 0 0 - 680 - 397 + 678 + 395 @@ -73,7 +73,7 @@ - :/icon.png:/icon.png + :/icon-helper.png:/icon-helper.png @@ -136,8 +136,8 @@ 0 0 - 464 - 336 + 462 + 330 @@ -218,8 +218,8 @@ 0 0 - 397 - 256 + 462 + 330 @@ -389,7 +389,7 @@ 0 0 436 - 165 + 173 @@ -576,7 +576,7 @@ 0 0 436 - 43 + 45 @@ -646,7 +646,7 @@ 0 0 277 - 190 + 194 @@ -843,7 +843,7 @@ 0 0 436 - 103 + 107 diff --git a/sources/helper/bash-completions b/sources/helper/bash-completions index 19b06d8..2b12a9d 100644 --- a/sources/helper/bash-completions +++ b/sources/helper/bash-completions @@ -25,6 +25,7 @@ _netctlgui_helper_arglist=( '--nodaemon' '--replace' '--restore' + '--session' '--system' '-v' '--version' diff --git a/sources/helper/netctlgui-helper.1 b/sources/helper/netctlgui-helper.1 index 8052ec8..653dabe 100644 --- a/sources/helper/netctlgui-helper.1 +++ b/sources/helper/netctlgui-helper.1 @@ -23,6 +23,8 @@ do not run as daemon force replace the existing session .IP "--restore" force restore the existing session +.IP "--session" +force create user DBus session .IP "--system" do not read user configuration .IP "-v, --version" diff --git a/sources/helper/netctlgui-helper.service b/sources/helper/netctlgui-helper.service index 454b01b..daa4c0b 100644 --- a/sources/helper/netctlgui-helper.service +++ b/sources/helper/netctlgui-helper.service @@ -1,9 +1,12 @@ [Unit] Description=netctlgui-helper daemon +Documentation=man:netctlgui-helper(1) man:netctl-gui.conf(5) [Service] -Type=forking -ExecStart=/usr/bin/netctlgui-helper --system +Type=dbus +BusName=org.netctlgui.helper +ExecStart=/usr/bin/netctlgui-helper --nodaemon --system +Capabilities=CAP_SETUID [Install] WantedBy=multi-user.target diff --git a/sources/helper/src/CMakeLists.txt b/sources/helper/src/CMakeLists.txt index c5ca85c..41180e6 100644 --- a/sources/helper/src/CMakeLists.txt +++ b/sources/helper/src/CMakeLists.txt @@ -47,14 +47,14 @@ else () set (TRANSLATIONS_BINARY ${TRANSLATIONS_BINARY} ${QM}) add_custom_command (OUTPUT ${QM} COMMAND ${QT_LRELEASE_EXECUTABLE} ${TS} MAIN_DEPENDENCY ${TS}) endforeach () - add_custom_target (translations-header COMMAND ${QT_LUPDATE_EXECUTABLE} ${HEADERS} ${SOURCES} -ts ${TRANSLATIONS}) - add_custom_command (TARGET translations-header COMMAND ${QT_LRELEASE_EXECUTABLE} ${TRANSLATIONS}) + add_custom_target (translations-helper COMMAND ${QT_LUPDATE_EXECUTABLE} ${HEADERS} ${SOURCES} -ts ${TRANSLATIONS}) + add_custom_command (TARGET translations-helper COMMAND ${QT_LRELEASE_EXECUTABLE} ${TRANSLATIONS}) endif() add_executable (${SUBPROJECT} ${SOURCES} ${HEADERS} ${MOC_SOURCES} ${QRC_SOURCES} ${TRANSLATIONS}) target_link_libraries (${SUBPROJECT} ${PROJECT_LIBRARY} ${QT_NEEDED_LIBS}) # install properties install (TARGETS ${SUBPROJECT} DESTINATION bin) -if (USE_CAPABILITIES) - install (CODE "exec_program (setcap ARGS \"cap_setuid=ep\" \"$ENV{DESTDIR}/bin/${SUBPROJECT}\")") -endif () +# if (USE_CAPABILITIES) +# install (CODE "exec_program (setcap ARGS \"cap_setuid=ep\" \"$ENV{DESTDIR}/bin/${SUBPROJECT}\")") +# endif () diff --git a/sources/helper/src/main.cpp b/sources/helper/src/main.cpp index ff7c9f2..861b518 100644 --- a/sources/helper/src/main.cpp +++ b/sources/helper/src/main.cpp @@ -68,6 +68,9 @@ int main(int argc, char *argv[]) } else if (QString(argv[i]) == QString("--restore")) { // restore args[QString("state")] = (int) 2; + } else if (QString(argv[i]) == QString("--session")) { + // session + args[QString("session")] = true; } else if (QString(argv[i]) == QString("--system")) { // system args[QString("system")] = true; @@ -96,6 +99,7 @@ int main(int argc, char *argv[]) .arg(QString::number(geteuid())).toUtf8().data() << endl; cout << QCoreApplication::translate("NetctlHelper", "See security notes for more details.") .toUtf8().data() << endl; + args[QString("session")] = true; } #if QT_VERSION >= 0x050000 diff --git a/sources/helper/src/messages.cpp b/sources/helper/src/messages.cpp index 8b0b9dc..e56aaf8 100644 --- a/sources/helper/src/messages.cpp +++ b/sources/helper/src/messages.cpp @@ -37,6 +37,7 @@ QMap getArgs() args[QString("config")] = QString(QDir::homePath() + QString("/.config/netctl-gui.conf")); args[QString("debug")] = false; args[QString("nodaemon")] = false; + args[QString("session")] = false; args[QString("state")] = (int) 0; args[QString("system")] = false; args[QString("help")] = false; @@ -65,6 +66,8 @@ QString helpMessage() .arg(QCoreApplication::translate("NetctlHelper", "force replace the existing session")); helpMessage += QString(" --restore - %1\n") .arg(QCoreApplication::translate("NetctlHelper", "force restore the existing session")); + helpMessage += QString(" --session - %1\n") + .arg(QCoreApplication::translate("NetctlHelper", "force create user DBus session")); helpMessage += QString(" --system - %1\n") .arg(QCoreApplication::translate("NetctlHelper", "do not read user configuration, system-wide only")); helpMessage += QString(" %1\n").arg(QCoreApplication::translate("NetctlHelper", "Show messages:")); diff --git a/sources/helper/src/netctlhelper.cpp b/sources/helper/src/netctlhelper.cpp index eecd3c6..e905815 100644 --- a/sources/helper/src/netctlhelper.cpp +++ b/sources/helper/src/netctlhelper.cpp @@ -35,6 +35,7 @@ NetctlHelper::NetctlHelper(QObject *parent, QMap args) : QObject(parent), configPath(args[QString("config")].toString()), debug(args[QString("debug")].toBool()), + session(args[QString("session")].toBool()), system(args[QString("system")].toBool()) { updateConfiguration(); @@ -88,6 +89,28 @@ void NetctlHelper::createInterface() if (debug) qDebug() << PDEBUG << ":" << bus.lastError().message(); return quitHelper(); } + // session bus + if (!session) return; + QDBusConnection sessionBus = QDBusConnection::sessionBus(); + if (!sessionBus.registerService(DBUS_HELPER_SERVICE)) { + if (debug) qDebug() << PDEBUG << ":" << "Could not register session service"; + if (debug) qDebug() << PDEBUG << ":" << sessionBus.lastError().message(); + return quitHelper(); + } + if (!sessionBus.registerObject(DBUS_LIB_PATH, + new NetctlAdaptor(this, debug, configuration), + QDBusConnection::ExportAllContents)) { + if (debug) qDebug() << PDEBUG << ":" << "Could not register session library object"; + if (debug) qDebug() << PDEBUG << ":" << sessionBus.lastError().message(); + return quitHelper(); + } + if (!sessionBus.registerObject(DBUS_CTRL_PATH, + new ControlAdaptor(this, debug, configuration), + QDBusConnection::ExportAllContents)) { + if (debug) qDebug() << PDEBUG << ":" << "Could not register session control object"; + if (debug) qDebug() << PDEBUG << ":" << sessionBus.lastError().message(); + return quitHelper(); + } } @@ -98,6 +121,11 @@ void NetctlHelper::deleteInterface() QDBusConnection::systemBus().unregisterObject(DBUS_LIB_PATH); QDBusConnection::systemBus().unregisterObject(DBUS_CTRL_PATH); QDBusConnection::systemBus().unregisterService(DBUS_HELPER_SERVICE); + // session bus + if (!session) return; + QDBusConnection::sessionBus().unregisterObject(DBUS_LIB_PATH); + QDBusConnection::sessionBus().unregisterObject(DBUS_CTRL_PATH); + QDBusConnection::sessionBus().unregisterService(DBUS_HELPER_SERVICE); } diff --git a/sources/helper/src/netctlhelper.h b/sources/helper/src/netctlhelper.h index 17af67c..e9dc0ba 100644 --- a/sources/helper/src/netctlhelper.h +++ b/sources/helper/src/netctlhelper.h @@ -41,6 +41,7 @@ private: QString configPath; QMap configuration; bool debug; + bool session; bool system; void createInterface(); void deleteInterface(); diff --git a/sources/helper/zsh-completions b/sources/helper/zsh-completions index f97df91..427ec87 100644 --- a/sources/helper/zsh-completions +++ b/sources/helper/zsh-completions @@ -24,6 +24,7 @@ _netctlgui_helper_arglist=( {'--nodaemon','--nodaemon'}'[do not start as daemon]' {'--replace','--replace'}'[force replace the existing session]' {'--restore','--restore'}'[force restore the existing session]' + {'--session','--session'}'[force create user DBus session]' {'--system','--system'}'[do not read user configuration]' {'(--version)-v','(-v)--version'}'[show version and exit]' {'(--info)-i','(-i)--info'}'[show build information and exit]' diff --git a/sources/resources/icon-helper.png b/sources/resources/icon-helper.png new file mode 100644 index 0000000000000000000000000000000000000000..3fbfb61de3e9d61728d20533418e9bb93613cecd GIT binary patch literal 12485 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 a_9f_v?0r;OxDyzH03N literal 0 HcmV?d00001 diff --git a/sources/resources/resources.qrc b/sources/resources/resources.qrc index 3b01b52..567331d 100644 --- a/sources/resources/resources.qrc +++ b/sources/resources/resources.qrc @@ -5,6 +5,7 @@ translations/ru.qm icon.png + icon-helper.png wifi.png network-idle-64x64.png network-offline-64x64.png