diff --git a/lxqt-sudo-0.13.0-locale-env.patch b/lxqt-sudo-0.13.0-locale-env.patch deleted file mode 100644 index 5bb9255..0000000 --- a/lxqt-sudo-0.13.0-locale-env.patch +++ /dev/null @@ -1,240 +0,0 @@ -Two patches which fix: -https://github.com/lxqt/lxqt-sudo/pull/42 -Started at bsc#1100871 - -From 07ec9ec14e5d8ff2fe5aba33d9f0a1cd07a4db60 Mon Sep 17 00:00:00 2001 -From: Palo Kisa -Date: Mon, 12 Sep 2016 11:48:18 +0200 -Subject: [PATCH] Sudo: Strip environment - -Leave only required environment variables (for X & locale) to get into -the elevated child process. ---- - sudo.cpp | 39 ++++++++++++++++++++++++++++++++++++--- - 1 file changed, 36 insertions(+), 3 deletions(-) - -diff --git a/sudo.cpp b/sudo.cpp -index 1530801..a98b75d 100644 ---- a/sudo.cpp -+++ b/sudo.cpp -@@ -36,12 +36,14 @@ - #include - #include - #include -+#include - #include - #include - #include - #include - #include - #include -+#include - - namespace - { -@@ -80,11 +82,42 @@ namespace - << QObject::tr("%1 version %2\n").arg(app_master).arg(app_version); - } - -+ //Note: array must be sorted to allow usage of binary search -+ static constexpr char const * const ALLOWED_VARS[] = { -+ "DISPLAY" -+ , "LANG", "LANGUAGE", "LC_ADDRESS", "LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_IDENTIFICATION", "LC_MEASUREMENT" -+ , "LC_MESSAGES", "LC_MONETARY", "LC_NAME", "LC_NUMERIC", "LC_PAPER", "LC_TELEPHONE", "LC_TIME" -+ , "PATH", "QT_PLATFORM_PLUGIN", "QT_QPA_PLATFORMTHEME", "WAYLAND_DISPLAY", "XAUTHORITY" -+ }; -+ static constexpr char const * const * const ALLOWED_END = ALLOWED_VARS + sizeof (ALLOWED_VARS) / sizeof (ALLOWED_VARS[0]); -+ struct assert_helper -+ { -+ assert_helper() -+ { -+ Q_ASSERT(std::is_sorted(ALLOWED_VARS, ALLOWED_END -+ , [] (char const * const a, char const * const b) { return strcmp(a, b) < 0; })); -+ } -+ }; -+ assert_helper h; -+ - inline void env_workarounds() - { -- //cleanup environment -- //pcmanfm-qt will not start if the DBUS_SESSION_BUS_ADDRESS is preserved -- unsetenv("DBUS_SESSION_BUS_ADDRESS"); -+ std::cerr << LXQTSUDO << ": Stripping child environment except for: "; -+ std::copy(ALLOWED_VARS, ALLOWED_END - 1, std::ostream_iterator{std::cerr, ", "}); -+ std::cerr << *(ALLOWED_END - 1) << '\n'; // printing the last separately to avoid trailing comma -+ // cleanup environment, because e.g.: -+ // - pcmanfm-qt will not start if the DBUS_SESSION_BUS_ADDRESS is preserved -+ // - Qt apps may change user's config files permissions if the XDG_* are preserved -+ for (auto const & key : QProcessEnvironment::systemEnvironment().keys()) -+ { -+ auto const & i = std::lower_bound(ALLOWED_VARS, ALLOWED_END, key, [] (char const * const a, QString const & b) { -+ return b > a; -+ }); -+ if (i == ALLOWED_END || key != *i) -+ { -+ unsetenv(key.toStdString().c_str()); -+ } -+ } - } - } - -From 406a20279e24539e04cab1c96ff808b3e4e2d163 Mon Sep 17 00:00:00 2001 -From: Palo Kisa -Date: Tue, 24 Jul 2018 13:13:20 +0200 -Subject: [PATCH] sudo: Force "C" locale for su/sudo - -We force the su/sudo to communicate with us in the simplest locale and -then set the locale back for the command (by using the magic of shell -interpretation). ---- - passworddialog.cpp | 9 +++------ - passworddialog.h | 2 +- - sudo.cpp | 44 ++++++++++++++++++++++++++------------------ - sudo.h | 1 + - 4 files changed, 31 insertions(+), 25 deletions(-) - -diff --git a/passworddialog.cpp b/passworddialog.cpp -index fcd2208..6377752 100644 ---- a/passworddialog.cpp -+++ b/passworddialog.cpp -@@ -4,7 +4,7 @@ - * LXQt - a lightweight, Qt based, desktop toolset - * https://lxqt.org - * -- * Copyright: 2015 LXQt team -+ * Copyright: 2015-2018 LXQt team - * Authors: - * Palo Kisa - * -@@ -29,7 +29,7 @@ - #include "ui_passworddialog.h" - #include - --PasswordDialog::PasswordDialog(QStringList argv -+PasswordDialog::PasswordDialog(const QString & cmd - , QWidget * parent/* = 0*/ - , Qt::WindowFlags f/* = 0*/) - : QDialog(parent, f) -@@ -37,10 +37,7 @@ PasswordDialog::PasswordDialog(QStringList argv - { - ui->setupUi(this); - -- ui->commandL->setText(argv.join(QStringLiteral(" "))); -- QString cmd; -- if (0 < argv.size()) -- cmd = argv[0]; -+ ui->commandL->setText(cmd); - ui->descriptionL->setText(tr("%1 needs administrative privileges.\nPlease enter your password.").arg(cmd)); - ui->iconL->setPixmap(QIcon::fromTheme("dialog-password").pixmap(64, 64)); - setWindowIcon(QIcon::fromTheme("security-high")); -diff --git a/passworddialog.h b/passworddialog.h -index 063b81a..d742a52 100644 ---- a/passworddialog.h -+++ b/passworddialog.h -@@ -39,7 +39,7 @@ class PasswordDialog : public QDialog - Q_OBJECT - - public: -- PasswordDialog(QStringList argv -+ PasswordDialog(const QString & cmd - , QWidget * parent = 0 - , Qt::WindowFlags f = 0); - ~PasswordDialog(); -diff --git a/sudo.cpp b/sudo.cpp -index f6002e1..1530801 100644 ---- a/sudo.cpp -+++ b/sudo.cpp -@@ -4,7 +4,7 @@ - * LXQt - a lightweight, Qt based, desktop toolset - * https://lxqt.org - * -- * Copyright: 2015 LXQt team -+ * Copyright: 2015-2018 LXQt team - * Authors: - * Palo Kisa - * -@@ -141,16 +141,12 @@ int Sudo::main() - //we were invoked through unknown link (or renamed binary) - usage(tr("%1: no backend chosen!").arg(app_master)); - return 1; -- } else if (BACK_SU == mBackend && 1 < mArgs.size()) -- { -- QString cmd = mArgs.replaceInStrings(QRegExp(QStringLiteral("^(.*)$")), "'\\1'").join(QStringLiteral(" ")); -- QTextStream(stderr) << tr("%1: warning - got multiple arguments for %2 backend, squashing into one: %3") -- .arg(app_master).arg(su_prog).arg(cmd); -- mArgs.erase(++mArgs.begin(), mArgs.end()); -- mArgs[0] = std::move(cmd); - } - -- mDlg.reset(new PasswordDialog{mArgs}); -+ mArgs.replaceInStrings(QStringLiteral("'"), QStringLiteral("'\\''")); -+ mSquashedArgs = mArgs.replaceInStrings(QRegExp(QStringLiteral("^(.*)$")), "'\\1'").join(QStringLiteral(" ")); -+ -+ mDlg.reset(new PasswordDialog{mSquashedArgs}); - mDlg->setModal(true); - lxqtApp->setActiveWindow(mDlg.data()); - -@@ -169,9 +165,8 @@ int Sudo::main() - - void Sudo::child() - { -- int params_cnt = 2 //1. su/sudo & last nullptr -- + 1 //-c for su | -E for sudo -- + mArgs.size(); -+ int params_cnt = 3 //1. su/sudo & "shell command" & last nullptr -+ + (BACK_SU == mBackend ? 1 : 3); //-c for su | -E /bin/sh -c for sudo - std::unique_ptr params{new char const *[params_cnt]}; - const char ** param_arg = params.get() + 1; - -@@ -179,20 +174,33 @@ void Sudo::child() - if (BACK_SU == mBackend) - { - program = su_prog.toStdString(); -- *(param_arg++) = "-c"; //run command - } else - { - program = sudo_prog.toStdString(); - *(param_arg++) = "-E"; //preserve environment -+ *(param_arg++) = "/bin/sh"; - } -+ *(param_arg++) = "-c"; //run command - - params[0] = program.c_str(); - -- std::vector arguments; -- for (const auto & a : mArgs) -- arguments.push_back(a.toStdString()); -- for (const auto & a : arguments) -- *(param_arg++) = a.c_str(); -+ // Note: we force the su/sudo to communicate with us in the simplest -+ // locale and then set the locale back for the command -+ char const * const env_lc_all = getenv("LC_ALL"); -+ setenv("LC_ALL", "C", 1); -+ std::string command; -+ if (env_lc_all == nullptr) -+ { -+ command = "unset LC_ALL; "; -+ } else -+ { -+ command = "LC_ALL='"; -+ command += env_lc_all; -+ command += "' "; -+ } -+ command += "exec "; -+ command += mSquashedArgs.toStdString(); -+ *(param_arg++) = command.c_str(); - - *param_arg = nullptr; - -diff --git a/sudo.h b/sudo.h -index c3eab94..d7a8c21 100644 ---- a/sudo.h -+++ b/sudo.h -@@ -62,6 +62,7 @@ class Sudo : public QObject - QScopedPointer mDlg; - QStringList mArgs; - backend_t mBackend; -+ QString mSquashedArgs; - - int mChildPid; - int mPwdFd; diff --git a/lxqt-sudo-0.13.0.tar.xz b/lxqt-sudo-0.13.0.tar.xz deleted file mode 100644 index 80b49a9..0000000 --- a/lxqt-sudo-0.13.0.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e05adf4926eead9fa3015be54a76f67ebf3f7c40e1dea0bcafbcf4c38e548c8 -size 16208 diff --git a/lxqt-sudo-0.13.0.tar.xz.asc b/lxqt-sudo-0.13.0.tar.xz.asc deleted file mode 100644 index b3eb58e..0000000 --- a/lxqt-sudo-0.13.0.tar.xz.asc +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQIzBAABCgAdFiEEfHM7pfWFqtZp5NI6QsnI069epeMFAlsDGaUACgkQQsnI069e -peM9FxAAlTHDGNlAJ8OaV9kbzytXcyg/2xyHCrCXzN8XiWDD8zb+khXYFnVgZ2YN -hBGompRv1RqgMqoRiuawHnppKYN/IEGpDllab111LwZZn16qFwgZ0mEE0WY1qdxK -l+o3Y4F+9Y70boxDwevYQv9IAGLl+pFIrShJVyRkwa72P0XfVyzZCcJjPoPCsHM0 -ITFNvuFWgUIHddO2kUPDjDx0yOi1lII/pq7fKxb8AZoh1v32t1Dif9LFjBQmvK8I -vw1FWuTi4Enh09GDXa5s0sh0j2h34a4py0lb0+lbIJonyKR3Dx0pTFc47PiW9JOd -H28qBWrFfhcTC+bwcXx+LwozUxD+TpGI7ElC+0K+6Iyeu7dD8jECFay+SO+wTMEZ -xgXhImft0VpVRwh88RaJ9Li6dSNfSsCPGWZmkjVwVHuJ7km9NaMDYgokpscXEf1f -5aaSFgYbpzVP66hCet7aJ9in2JLl/5kse/zaGYaFGIdq+gopaDxg5kXlUwN8aYco -Fok/FRecoSUUA7VVOMKRdRBMFQptJq0NkjxWCuwNQ0jhM7stpndRdMovHzbbkp7V -6Glb8kKqdS26rbkDT/n2kYaM4JnS9opFSiqw7lwfE4pBzCIyY5NSQxMudi6AKB9d -8C1Zb4QA7+bN5C039EIyi7vPad+EzOf/l9RBn1GXygWf4nNL5X8= -=5wrl ------END PGP SIGNATURE----- diff --git a/lxqt-sudo-0.14.0.tar.xz b/lxqt-sudo-0.14.0.tar.xz new file mode 100644 index 0000000..8d69938 --- /dev/null +++ b/lxqt-sudo-0.14.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a322e169a5b6c5decbabe837fad428ac9013d9173723f6e0525a62b11bd1a123 +size 27684 diff --git a/lxqt-sudo-0.14.0.tar.xz.asc b/lxqt-sudo-0.14.0.tar.xz.asc new file mode 100644 index 0000000..0e7a7c0 --- /dev/null +++ b/lxqt-sudo-0.14.0.tar.xz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEfHM7pfWFqtZp5NI6QsnI069epeMFAlxLq2cACgkQQsnI069e +peNN5BAAlJDzMxfb+mBazBXf5omfHmHGAOwAKazJWJY7gfn9U2rBVMmTswIvKEVh +0LcyWG9j5NSTltAl1As+Yi5q8qhOZOizOtif7reyvtxi+juTWyLdyc4kBcRcZcrM +DuL9RD+Oa5ML8/JcBekmrPMyGZTjI0Czi25hW5BLyCmnmGI2/aYF45FdO9ePu6Ma +r8tUi0QOGEOsIi8H+Dzrl64YhlMKsA7kD9X5cihMwNzBkhKszzpQBA3upTTi6POv +vkTSj+y7ZTqYVyym2zhSOfENJBO/CJn04lCz7h7qmZqH1JRq2vAVxkJsonh6mE1e +9un6UBF1CiB1mzYSMT35Aai14tcAmOdYZiVOSESMDjF+kgPPIEh+PAtAZfK4N1cL +IwODjagmRqOF8T2rsYG0tUF5qqWRoOA/GJUfIHwhhcUki75+/VAYrH5xGvPm2Pwy +4iD3qOQtNvuTjwt1JNro4QNeAlxi2wLXofoULhJi6m3Fa5geHbwUx4ALLFdjpOmz +bUq3yLAWORfI7sOReH8aoSjnViK1/iQ9X+zlnvMBAMrzi2r3ShBW4w7dLxv2ry2B +A99AtGXyRWeBpvRK+IN64rsAZJUDuRc7YWzTxR3csxjvFNG7pYevWqe6DunIzk/K +vKaW+LioCATsK6Py4GsO2borFRN0221tGWee0y8vCFd50F3T4Ac= +=y5Ao +-----END PGP SIGNATURE----- diff --git a/lxqt-sudo.changes b/lxqt-sudo.changes index 6bd5db5..c18c1df 100644 --- a/lxqt-sudo.changes +++ b/lxqt-sudo.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Thu Jan 31 10:29:34 UTC 2019 - Michael Vetter + +- Update to 0.14.0: + * Force ā€œCā€ locale for su/sudo + * Security: Prevent malicious attempts for command injection + * Strip environment - Leave only required environment variables (for X & locale) to get into the elevated child process. + * Make critical error messages less obscure + * Fixed the layout and line-break +- Remove lxqt-sudo-0.13.0-locale-env.patch: upstreamed +- Move translation from lxqt-l10n into package + ------------------------------------------------------------------- Thu Jul 26 13:05:35 UTC 2018 - mvetter@suse.com diff --git a/lxqt-sudo.spec b/lxqt-sudo.spec index 2fbed03..005ed39 100644 --- a/lxqt-sudo.spec +++ b/lxqt-sudo.spec @@ -1,7 +1,7 @@ # # spec file for package lxqt-sudo # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -12,12 +12,12 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # Name: lxqt-sudo -Version: 0.13.0 +Version: 0.14.0 Release: 0 Summary: GUI frontend for sudo License: LGPL-2.1-only @@ -26,8 +26,7 @@ URL: http://lxqt.org Source: https://github.com/lxqt/%{name}/releases/download/%{version}/%{name}-%{version}.tar.xz Source1: https://github.com/lxqt/%{name}/releases/download/%{version}/%{name}-%{version}.tar.xz.asc Source2: %{name}.keyring -Patch1: lxqt-sudo-0.13.0-locale-env.patch -BuildRequires: cmake >= 3.0.2 +BuildRequires: cmake >= 3.1.0 BuildRequires: gcc-c++ BuildRequires: lxqt-build-tools-devel >= 0.5.0 BuildRequires: pkgconfig @@ -44,9 +43,10 @@ When invoked it simply spawns child sudo process with requested command (and arguments). If sudo requests user's password, the GUI password dialog is shown and (after submit) the password is provided to sudo. +%lang_package + %prep %setup -q -%patch1 -p1 %build %cmake -DPULL_TRANSLATIONS=No @@ -55,6 +55,8 @@ make %{?_smp_mflags} %install %cmake_install +%find_lang %{name} --with-qt + %files %license LICENSE %doc AUTHORS @@ -63,4 +65,9 @@ make %{?_smp_mflags} %{_mandir}/man?/%{name}.* %{_mandir}/man?/lxsu*.* +%files lang -f %{name}.lang +%dir %{_datadir}/lxqt +%dir %{_datadir}/lxqt/translations +%{_datadir}/lxqt/translations/lxqt-sudo + %changelog