From 3b1701f8b529d500bc491f009fd1f2a1253abe1d Mon Sep 17 00:00:00 2001 From: arcan1s Date: Tue, 12 Aug 2014 22:58:13 +0400 Subject: [PATCH] some fixes including adding double quotes --- sources/3rdparty/task/taskadds.cpp | 2 + sources/3rdparty/task/taskadds.h | 1 + sources/dataengine/netctl.conf | 6 +- sources/gui/docs/CMakeLists.txt | 3 + sources/gui/docs/architecture.png | Bin 0 -> 41423 bytes .../gui/docs/netctl-gui-security-notes.html | 57 ++++++++++++ .../gui/docs/netctl-gui-security-notes.html~ | 88 ++++++++++++++++++ sources/gui/src/mainpublicslots.cpp | 19 +++- sources/gui/src/mainwindow.cpp | 3 + sources/helper/netctlgui-helper.service | 1 + .../include/netctlgui/wpasupinteract.h | 1 + sources/netctlgui/src/netctlinteract.cpp | 8 +- sources/netctlgui/src/netctlprofile.cpp | 40 ++++---- sources/netctlgui/src/wpasupinteract.cpp | 6 ++ sources/plasmoid/netctl.cpp | 1 - 15 files changed, 207 insertions(+), 29 deletions(-) create mode 100644 sources/gui/docs/architecture.png create mode 100644 sources/gui/docs/netctl-gui-security-notes.html~ diff --git a/sources/3rdparty/task/taskadds.cpp b/sources/3rdparty/task/taskadds.cpp index 7629c05..0116def 100644 --- a/sources/3rdparty/task/taskadds.cpp +++ b/sources/3rdparty/task/taskadds.cpp @@ -29,12 +29,14 @@ TaskResult runTask(const QString cmd, const bool useSuid) command.waitForFinished(-1); r.exitCode = command.exitCode(); r.output = command.readAllStandardOutput(); + r.error = command.readAllStandardError(); } else { QProcess command; command.start(cmd); command.waitForFinished(-1); r.exitCode = command.exitCode(); r.output = command.readAllStandardOutput(); + r.error = command.readAllStandardError(); } return r; diff --git a/sources/3rdparty/task/taskadds.h b/sources/3rdparty/task/taskadds.h index 8a49b1e..609fcba 100644 --- a/sources/3rdparty/task/taskadds.h +++ b/sources/3rdparty/task/taskadds.h @@ -38,6 +38,7 @@ protected: struct TaskResult { int exitCode; + QByteArray error; QByteArray output; }; TaskResult runTask(const QString cmd, const bool useSuid = true); diff --git a/sources/dataengine/netctl.conf b/sources/dataengine/netctl.conf index c744ea0..40aa930 100644 --- a/sources/dataengine/netctl.conf +++ b/sources/dataengine/netctl.conf @@ -2,15 +2,15 @@ ## Commands # command -CMD=/usr/bin/netctl +NETCTLCMD=/usr/bin/netctl # netctl-auto command NETCTLAUTOCMD=/usr/bin/netctl-auto ## External IP # external IPv4 check command -EXTIPCMD=curl ip4.telize.com +EXTIP4CMD=curl ip4.telize.com # 'true' - check external IPv4 -EXTIP=false +EXTIP4=false # external IPv6 check command EXTIP6CMD=curl ip6.telize.com # 'true' - check external IPv6 diff --git a/sources/gui/docs/CMakeLists.txt b/sources/gui/docs/CMakeLists.txt index 1569b7f..d9ec0f8 100644 --- a/sources/gui/docs/CMakeLists.txt +++ b/sources/gui/docs/CMakeLists.txt @@ -1,9 +1,12 @@ # build pages file (GLOB SUBPROJECT_DOCS_IN *.html) +file (GLOB SUBPROJECT_IMGS *.png) foreach (DOC_IN ${SUBPROJECT_DOCS_IN}) file (RELATIVE_PATH ONE_DOC ${CMAKE_SOURCE_DIR} ${DOC_IN}) configure_file (${DOC_IN} ${CMAKE_CURRENT_BINARY_DIR}/${ONE_DOC}) set (SUBPROJECT_DOCS ${SUBPROJECT_DOCS} ${CMAKE_CURRENT_BINARY_DIR}/${ONE_DOC}) endforeach () + install (FILES ${SUBPROJECT_DOCS} DESTINATION share/doc/${PROJECT_NAME}) +install (FILES ${SUBPROJECT_IMGS} DESTINATION share/doc/${PROJECT_NAME}) diff --git a/sources/gui/docs/architecture.png b/sources/gui/docs/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..ef2424a733543f89825a586ba92dc7183b916893 GIT binary patch literal 41423 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°jH9N?3-HuYKv8j&44q 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 literal 0 HcmV?d00001 diff --git a/sources/gui/docs/netctl-gui-security-notes.html b/sources/gui/docs/netctl-gui-security-notes.html index a715704..a76781e 100644 --- a/sources/gui/docs/netctl-gui-security-notes.html +++ b/sources/gui/docs/netctl-gui-security-notes.html @@ -8,11 +8,68 @@

netctl-gui security notes

Project version : @PROJECT_VERSION@

    +
  1. Description
  2. +
  3. Architecture
  4. +
  5. KDE components security
  6. +
  7. Graphical interface security
  8. +
  9. Library security
  10. +
  11. Helper security
  12. +
  13. External links
+

Description

+

+ +

Architecture

+architecture + +

KDE components security

+

There are two netctl-based commands which are run from the DataEngine

+
    +
  • <cmd> list
  • +
  • netctl is-enabled <profile>
  • +
+

Both of them do not require any additional privileges normally. Also DataEngine has two other command which will be run from; they should define external IP. According to the idea that user can set any command to run, this module is not secure. But running commands will not do more than user can do from console himself.

+ +

The widget gets information from DataEngine, thus it does not require any additional permissions to show information. But netctl calls with root privileges are used to control netctl. In this case used commands are

+
    +
  • netctl enable <profile>
  • +
  • netctl disable <profile>
  • +
  • netctl restart <profile>
  • +
  • netctl start <profile>
  • +
  • netctl stop <profile>
  • +
  • netctl switch-to <profile>
  • +
  • netctl-auto switch-to <profile>
  • +
+

All netctl-based commands requires root privileges and sudo (and any other alternatives) is used normally as prefix to the commands. The netctl-auto command does not require additional permissions.

+ +

The other way is to use DBus communication with the helper. In this case user should have rights to start the helper.

+ +

Graphical interface security

+

Graphical interface may interact with netctl over DBus (the helper) and over the library. Please refer to their notes to any additional information. If user uses helper he should have permissions to run it.

+ +

Library security

+

According to the scheme library gets information from netctl and can control it. Also it provides some additional functions such as a profile creation and removal and access to wpa_supplicant functions. Some function does not require additional permissions, but other ones do it. All dynamic arguments including profile names and paths are in double quotes to avoid white spaces problem. The functions which requires root privileges are:

+
    +
  • Netctl control module
  • +
      +
    • netctl start|stop|restart|switch-to|enable|disable <profile>. They are commands which provide a general control to netctl.
    • +
    • systemctl start|restart|enable <netctl-auto@service>. They are commands which provide ability to control netctl-auto systemd service.
    • +
    +
  • Netctl profiles module
  • +
      +
    • Copying of a temporary profile from home directory to netctl profiles directory. cp command is used for it.
    • +
    • Removal of a profile. rm command is used for it.
    • +
    +
  • WiFi module
  • +
      +
    • This module require root privileges to start wpa_supplicant only. For the futher interaction user must be in CTRL_GROUP.
    • +
    +
+

External links

  • Homepage
  • diff --git a/sources/gui/docs/netctl-gui-security-notes.html~ b/sources/gui/docs/netctl-gui-security-notes.html~ new file mode 100644 index 0000000..866453a --- /dev/null +++ b/sources/gui/docs/netctl-gui-security-notes.html~ @@ -0,0 +1,88 @@ + + + + netctl-gui secutiry notes + +

    netctl-gui security notes

    +

    Project version : @PROJECT_VERSION@

    +
      +
    1. Description
    2. +
    3. Architecture
    4. +
    5. KDE components security
    6. +
    7. Graphical interface security
    8. +
    9. Library security
    10. +
    11. Helper security
    12. + +
    13. External links
    14. +
    + + + +

    Description

    +

    + +

    Architecture

    +architecture + +

    KDE components security

    +

    There are two netctl-based commands which are run from the DataEngine

    +
      +
    • <cmd> list
    • +
    • netctl is-enabled <profile>
    • +
    +

    Both of them do not require any additional privileges normally. Also DataEngine has two other command which will be run from; they should define external IP. According to the idea that user can set any command to run, this module is not secure. But running commands will not do more than user can do from console himself.

    + +

    The widget gets information from DataEngine, thus it does not require any additional permissions to show information. But netctl calls with root privileges are used to control netctl. In this case used commands are

    +
      +
    • netctl enable <profile>
    • +
    • netctl disable <profile>
    • +
    • netctl restart <profile>
    • +
    • netctl start <profile>
    • +
    • netctl stop <profile>
    • +
    • netctl switch-to <profile>
    • +
    • netctl-auto switch-to <profile>
    • +
    +

    All netctl-based commands requires root privileges and sudo (and any other alternatives) is used normally as prefix to the commands. The netctl-auto command does not require additional permissions.

    + +

    The other way is to use DBus communication with the helper. In this case user should have rights to start the helper.

    + +

    Graphical interface security

    +

    Graphical interface may interact with netctl over DBus (the helper) and over the library. Please refer to their notes to any additional information. If user uses helper he should have permissions to run it.

    + +

    Library security

    +

    According to the scheme library gets information from netctl and can control it. Also it provides some additional functions such as a profile creation and removal and access to wpa_supplicant functions. Some function does not require additional permissions, but other ones do it. All dynamic arguments including profile names and paths are in double quotes to avoid white spaces problem. The functions which requires root privileges are:

    +
      +
    • Netctl control module
    • +
        +
      • netctl start|stop|restart|switch-to|enable|disable <profile>. They are commands which provide a general control to netctl.
      • +
      • systemctl start|restart|enable <netctl-auto@service>. They are commands which provide ability to control netctl-auto systemd service.
      • +
      +
    • Netctl profiles module
    • +
        +
      • Copying of a temporary profile from home directory to netctl profiles directory. cp command is used for it.
      • +
      • Removal of a profile. rm command is used for it.
      • +
      +
    • WiFi module
    • +
        +
      • This module require root privileges to start wpa_supplicant only. For the futher interaction user must be in CTRL_GROUP.
      • +
      +
    + +

    + +

    External links

    + + +

    + © 2014-@CURRENT_YEAR@ @PROJECT_AUTHOR@
    + This software is licensed under @PROJECT_LICENSE@ +

    + + + \ No newline at end of file diff --git a/sources/gui/src/mainpublicslots.cpp b/sources/gui/src/mainpublicslots.cpp index 973a427..fe4e8e8 100644 --- a/sources/gui/src/mainpublicslots.cpp +++ b/sources/gui/src/mainpublicslots.cpp @@ -137,14 +137,24 @@ bool MainWindow::startProfileSlot(const QString profile) if (useHelper) { QList args; args.append(profile); - sendDBusRequest(DBUS_HELPER_SERVICE, DBUS_CTRL_PATH, - DBUS_HELPER_INTERFACE, QString("Start"), - args, true, debug); + if (sendDBusRequest(DBUS_HELPER_SERVICE, DBUS_LIB_PATH, + DBUS_HELPER_INTERFACE, QString("ActiveProfile"), + QList(), true, debug)[0].toString().isEmpty()) + sendDBusRequest(DBUS_HELPER_SERVICE, DBUS_CTRL_PATH, + DBUS_HELPER_INTERFACE, QString("Start"), + args, true, debug); + else + sendDBusRequest(DBUS_HELPER_SERVICE, DBUS_CTRL_PATH, + DBUS_HELPER_INTERFACE, QString("SwitchTo"), + args, true, debug); current = sendDBusRequest(DBUS_HELPER_SERVICE, DBUS_LIB_PATH, DBUS_HELPER_INTERFACE, QString("isProfileActive"), args, true, debug)[0].toBool(); } else { - netctlCommand->startProfile(profile); + if (netctlCommand->getActiveProfile().isEmpty()) + netctlCommand->startProfile(profile); + else + netctlCommand->switchToProfile(profile); current = netctlCommand->isProfileActive(profile); } @@ -328,7 +338,6 @@ void MainWindow::updateConfiguration(const QMap args) qApp->installTranslator(translator); createObjects(); - checkHelperStatus(); createActions(); // tray diff --git a/sources/gui/src/mainwindow.cpp b/sources/gui/src/mainwindow.cpp index 88b480f..99c7b09 100644 --- a/sources/gui/src/mainwindow.cpp +++ b/sources/gui/src/mainwindow.cpp @@ -294,6 +294,8 @@ bool MainWindow::checkHelperStatus() sendDBusRequest(DBUS_HELPER_SERVICE, DBUS_CTRL_PATH, DBUS_HELPER_INTERFACE, QString("Update"), QList(), true, debug); + else + configuration[QString("FORCE_SUDO")] = QString("true"); if (isHelperServiceActive()) configuration[QString("CLOSE_HELPER")] = QString("false"); @@ -401,6 +403,7 @@ void MainWindow::createObjects() errorWin->showWindow(19, QString("[MainWindow] : [createObjects]")); useHelper = false; } + checkHelperStatus(); netctlCommand = new Netctl(debug, configuration); netctlProfile = new NetctlProfile(debug, configuration); diff --git a/sources/helper/netctlgui-helper.service b/sources/helper/netctlgui-helper.service index 2f79121..99b16a8 100644 --- a/sources/helper/netctlgui-helper.service +++ b/sources/helper/netctlgui-helper.service @@ -2,6 +2,7 @@ Description=netctlgui-helper daemon [Service] +Type=forking ExecStart=/usr/bin/netctlgui-helper [Install] diff --git a/sources/netctlgui/include/netctlgui/wpasupinteract.h b/sources/netctlgui/include/netctlgui/wpasupinteract.h index 5b28027..256f291 100644 --- a/sources/netctlgui/include/netctlgui/wpasupinteract.h +++ b/sources/netctlgui/include/netctlgui/wpasupinteract.h @@ -71,6 +71,7 @@ public: * @param settings default settings. Needed keys are * CTRL_DIR (path to ctrl_directory), * CTRL_GROUP (group which is owner of CTRL_DIR), + * FORCE_SUDO (force to use sudo), * PID_FILE (wpa_supplicant PID file), * SUDO_PATH (path to sudo command), * WPACLI_PATH (path to wpa_cli command), diff --git a/sources/netctlgui/src/netctlinteract.cpp b/sources/netctlgui/src/netctlinteract.cpp index e2ef7ca..bea09c4 100644 --- a/sources/netctlgui/src/netctlinteract.cpp +++ b/sources/netctlgui/src/netctlinteract.cpp @@ -97,10 +97,12 @@ bool Netctl::cmdCall(const bool sudo, const QString command, const QString comma cmd = sudoCommand + QString(" "); cmd += command + QString(" ") + commandLine; if (argument != 0) - cmd += QString(" ") + argument; + cmd += QString(" \"") + argument + QString("\""); if (debug) qDebug() << "[Netctl]" << "[cmdCall]" << ":" << "Run cmd" << cmd; TaskResult process = runTask(cmd, (useSuid && sudo)); if (debug) qDebug() << "[Netctl]" << "[cmdCall]" << ":" << "Cmd returns" << process.exitCode; + if (process.exitCode != 0) + if (debug) qDebug() << "[Netctl]" << "[cmdCall]" << ":" << "Error" << process.error; if (process.exitCode == 0) return true; @@ -128,10 +130,12 @@ QString Netctl::getCmdOutput(const bool sudo, const QString command, const QStri cmd = sudoCommand + QString(" "); cmd += command + QString(" ") + commandLine; if (argument != 0) - cmd += QString(" ") + argument; + cmd += QString(" \"") + argument + QString("\""); if (debug) qDebug() << "[Netctl]" << "[getCmdOutput]" << ":" << "Run cmd" << cmd; TaskResult process = runTask(cmd, (useSuid && sudo)); if (debug) qDebug() << "[Netctl]" << "[getCmdOutput]" << ":" << "Cmd returns" << process.exitCode; + if (process.exitCode != 0) + if (debug) qDebug() << "[Netctl]" << "[getCmdOutput]" << ":" << "Error" << process.error; return process.output; } diff --git a/sources/netctlgui/src/netctlprofile.cpp b/sources/netctlgui/src/netctlprofile.cpp index c307862..3e5f820 100644 --- a/sources/netctlgui/src/netctlprofile.cpp +++ b/sources/netctlgui/src/netctlprofile.cpp @@ -80,10 +80,12 @@ bool NetctlProfile::copyProfile(const QString oldPath) } QString newPath = profileDirectory->absolutePath() + QDir::separator() + QFileInfo(oldPath).fileName(); - QString cmd = sudoCommand + QString(" /usr/bin/mv ") + oldPath + QString(" ") + newPath; + QString cmd = sudoCommand + QString(" /usr/bin/mv \"") + oldPath + QString("\" \"") + newPath + QString("\""); if (debug) qDebug() << "[NetctlProfile]" << "[copyProfile]" << ":" << "Run cmd" << cmd; TaskResult process = runTask(cmd, useSuid); if (debug) qDebug() << "[NetctlProfile]" << "[copyProfile]" << ":" << "Cmd returns" << process.exitCode; + if (process.exitCode != 0) + if (debug) qDebug() << "[NetctlProfile]" << "[copyProfile]" << ":" << "Error" << process.error; if (process.exitCode == 0) return true; @@ -143,13 +145,13 @@ QMap NetctlProfile::getSettingsFromProfile(const QString profi // getting variables list // system variables - QProcess shell; QString cmd = QString("env -i bash -c \"set\""); if (debug) qDebug() << "[NetctlProfile]" << "[getSettingsFromProfile]" << ":" << "Run cmd" << cmd; - shell.start(cmd); - shell.waitForFinished(-1); - if (debug) qDebug() << "[NetctlProfile]" << "[getSettingsFromProfile]" << ":" << "Cmd returns" << shell.exitCode(); - QStringList output = QString(shell.readAllStandardOutput()).trimmed().split(QChar('\n')); + TaskResult process = runTask(cmd, false); + if (debug) qDebug() << "[NetctlProfile]" << "[getSettingsFromProfile]" << ":" << "Cmd returns" << process.exitCode; + if (process.exitCode != 0) + if (debug) qDebug() << "[NetctlProfile]" << "[getSettingsFromProfile]" << ":" << "Error" << process.error; + QStringList output = QString(process.output).trimmed().split(QChar('\n')); QStringList systemVariables; systemVariables.append(QString("PIPESTATUS")); for (int i=0; i NetctlProfile::getSettingsFromProfile(const QString profi // profile variables QMap settings; QString profileUrl = profileDirectory->absolutePath() + QDir::separator() + QFileInfo(profile).fileName(); - cmd = QString("env -i bash -c \"source ") + profileUrl + QString("; set\""); + cmd = QString("env -i bash -c \"source '") + profileUrl + QString("'; set\""); if (debug) qDebug() << "[NetctlProfile]" << "[getSettingsFromProfile]" << ":" << "Run cmd" << cmd; - shell.start(cmd); - shell.waitForFinished(-1); - if (debug) qDebug() << "[NetctlProfile]" << "[getSettingsFromProfile]" << ":" << "Cmd returns" << shell.exitCode(); - output = QString(shell.readAllStandardOutput()).trimmed().split(QChar('\n')); + process = runTask(cmd, false); + if (debug) qDebug() << "[NetctlProfile]" << "[getSettingsFromProfile]" << ":" << "Cmd returns" << process.exitCode; + if (process.exitCode != 0) + if (debug) qDebug() << "[NetctlProfile]" << "[getSettingsFromProfile]" << ":" << "Error" << process.error; + output = QString(process.output).trimmed().split(QChar('\n')); // gettings variables QStringList keys; @@ -170,12 +173,11 @@ QMap NetctlProfile::getSettingsFromProfile(const QString profi if (!systemVariables.contains(output[i].split(QChar('='))[0])) keys.append(output[i].split(QChar('='))[0]); for (int i=0; iabsolutePath() + QDir::separator() + QFileInfo(profile).fileName(); - QString cmd = sudoCommand + QString(" /usr/bin/rm ") + profilePath; + QString cmd = sudoCommand + QString(" /usr/bin/rm \"") + profilePath + QString("\""); if (debug) qDebug() << "[NetctlProfile]" << "[removeProfile]" << ":" << "Run cmd" << cmd; TaskResult process = runTask(cmd, useSuid); if (debug) qDebug() << "[NetctlProfile]" << "[removeProfile]" << ":" << "Cmd returns" << process.exitCode; + if (process.exitCode != 0) + if (debug) qDebug() << "[NetctlProfile]" << "[removeProfile]" << ":" << "Error" << process.error; if (process.exitCode == 0) return true; diff --git a/sources/netctlgui/src/wpasupinteract.cpp b/sources/netctlgui/src/wpasupinteract.cpp index 21401bf..63171db 100644 --- a/sources/netctlgui/src/wpasupinteract.cpp +++ b/sources/netctlgui/src/wpasupinteract.cpp @@ -269,6 +269,8 @@ bool WpaSup::startWpaSupplicant() TaskResult process = runTask(cmd, useSuid); waitForProcess(1); if (debug) qDebug() << "[WpaSup]" << "[startWpaSupplicant]" << ":" << "Cmd returns" << process.exitCode; + if (process.exitCode != 0) + if (debug) qDebug() << "[WpaSup]" << "[startWpaSupplicant]" << ":" << "Error" << process.error; if (process.exitCode == 0) return true; @@ -324,6 +326,8 @@ QString WpaSup::getWpaCliOutput(const QString commandLine) if (debug) qDebug() << "[WpaSup]" << "[getWpaCliOutput]" << ":" << "Run cmd" << cmd; TaskResult process = runTask(cmd); if (debug) qDebug() << "[WpaSup]" << "[getWpaCliOutput]" << ":" << "Cmd returns" << process.exitCode; + if (process.exitCode != 0) + if (debug) qDebug() << "[WpaSup]" << "[getWpaCliOutput]" << ":" << "Error" << process.error; return process.output; } @@ -380,6 +384,8 @@ bool WpaSup::wpaCliCall(const QString commandLine) TaskResult process = runTask(cmd); waitForProcess(1); if (debug) qDebug() << "[WpaSup]" << "[getWpaCliOutput]" << ":" << "Cmd returns" << process.exitCode; + if (process.exitCode != 0) + if (debug) qDebug() << "[NetctlProfile]" << "[getWpaCliOutput]" << ":" << "Error" << process.error; if (process.exitCode == 0) return true; diff --git a/sources/plasmoid/netctl.cpp b/sources/plasmoid/netctl.cpp index 444be38..0b5aa73 100644 --- a/sources/plasmoid/netctl.cpp +++ b/sources/plasmoid/netctl.cpp @@ -907,7 +907,6 @@ void Netctl::configChanged() if (useHelper) startHelper(); checkHelperStatus(); connectToEngine(); - setAssociatedApplication(paths[QString("gui")]); }