New Upstream Release - lxqt-sudo

Ready changes

Summary

Merged new upstream version: 1.3.0 (was: 1.2.0).

Diff

diff --git a/CHANGELOG b/CHANGELOG
index f9e3c9e..4e41c68 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+lxqt-sudo-1.3.0 / 2023-04-15
+=============================
+ * Added support for doas(1) backend.
+
 lxqt-sudo-1.2.0 / 2022-11-05
 =============================
  * Updated translations and bumped the version.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 02d68f7..9740a99 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -15,7 +15,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
 option(UPDATE_TRANSLATIONS "Update source translation translations/*.ts files" OFF)
 
 # Minimum Versions
-set(LXQT_MINIMUM_VERSION "1.2.0")
+set(LXQT_MINIMUM_VERSION "1.3.0")
 set(QT_MINIMUM_VERSION "5.15.0")
 
 find_package(Qt5Widgets ${QT_MINIMUM_VERSION} REQUIRED)
@@ -29,6 +29,7 @@ include(LXQtCompilerSettings NO_POLICY_SCOPE)
 
 set ( LINK_LXSU "lxsu")
 set ( LINK_LXSUDO "lxsudo")
+set ( LINK_LXDOAS "lxdoas")
 
 set ( HDRS
     passworddialog.h
@@ -81,41 +82,44 @@ target_link_libraries(lxqt-sudo
 target_compile_definitions(lxqt-sudo
     PRIVATE "LXQTSUDO_SUDO=\"sudo\""
     PRIVATE "LXQTSUDO_SU=\"su\""
+    PRIVATE "LXQTSUDO_DOAS=\"doas\""
     PRIVATE "LXQTSUDO=\"lxqt-sudo\""
     PRIVATE "LXQTSUDO_LXSU=\"${LINK_LXSU}\""
     PRIVATE "LXQTSUDO_LXSUDO=\"${LINK_LXSUDO}\""
+    PRIVATE "LXQTSUDO_LXDOAS=\"${LINK_LXDOAS}\""
     PRIVATE "LXQT_VERSION=\"${LXQT_VERSION}\""
 )
 
-add_custom_command(TARGET lxqt-sudo POST_BUILD
-    COMMAND ln -f -s lxqt-sudo "${LINK_LXSU}"
-    WORKING_DIRECTORY .
-    COMMENT "Creating ${LINK_LXSU} symlink"
-)
-
-add_custom_command(TARGET lxqt-sudo POST_BUILD
-    COMMAND ln -f -s lxqt-sudo "${LINK_LXSUDO}"
-    WORKING_DIRECTORY .
-    COMMENT "Creating ${LINK_LXSUDO} symlink"
-)
+foreach(LINK IN ITEMS ${LINK_LXSU} ${LINK_LXSUDO} ${LINK_LXDOAS})
+    add_custom_command(TARGET lxqt-sudo POST_BUILD
+        COMMAND ln -f -s lxqt-sudo "${LINK}"
+        WORKING_DIRECTORY .
+        COMMENT "Creating ${LINK} symlink"
+    )
+    install(FILES
+        "${CMAKE_CURRENT_BINARY_DIR}/${LINK}"
+        DESTINATION "${CMAKE_INSTALL_BINDIR}"
+        COMPONENT Runtime
+    )
+    install(FILES
+        "man/${LINK}.1"
+        DESTINATION "${CMAKE_INSTALL_MANDIR}/man1"
+        COMPONENT Runtime
+    )
+endforeach()
 
 install(TARGETS
     lxqt-sudo
     RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
     COMPONENT Runtime
 )
-install(FILES
-    "${CMAKE_CURRENT_BINARY_DIR}/${LINK_LXSU}" "${CMAKE_CURRENT_BINARY_DIR}/${LINK_LXSUDO}"
-    DESTINATION "${CMAKE_INSTALL_BINDIR}"
-    COMPONENT Runtime
-)
 install(FILES
     ${DESKTOP_FILES}
     DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications"
     COMPONENT Runtime
 )
 install(FILES
-    man/lxqt-sudo.1 "man/${LINK_LXSU}.1" "man/${LINK_LXSUDO}.1"
+    man/lxqt-sudo.1
     DESTINATION "${CMAKE_INSTALL_MANDIR}/man1"
     COMPONENT Runtime
 )
diff --git a/debian/changelog b/debian/changelog
index 9b73aa7..3d72c85 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+lxqt-sudo (1.3.0-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Sun, 06 Aug 2023 22:28:39 -0000
+
 lxqt-sudo (1.2.0-1) unstable; urgency=medium
 
   * New upstream release.
diff --git a/man/lxdoas.1 b/man/lxdoas.1
new file mode 120000
index 0000000..3a0b09d
--- /dev/null
+++ b/man/lxdoas.1
@@ -0,0 +1 @@
+lxqt-sudo.1
\ No newline at end of file
diff --git a/man/lxqt-sudo.1 b/man/lxqt-sudo.1
index 0671e66..d4f797f 100644
--- a/man/lxqt-sudo.1
+++ b/man/lxqt-sudo.1
@@ -1,16 +1,18 @@
 .TH lxqt-sudo 1 "" "" "LXQt\ Module"
 .SH NAME
-\fBlxqt-sudo\fR, \fBlxsu\fR \- execute a command as privileged user
+\fBlxqt-sudo\fR, \fBlxsu\fR, \fBlxdoas\fR \- execute a command as privileged user
 .SH SYNOPSIS
 \fBlxqt-sudo\fR \fIoption\fR [\fIcommand\fR [\fIarguments\fR]]
 .br
 \fBlxsu\fR [\fIoption\fR] [\fIcommand\fR [\fIarguments\fR]]
 .br
 \fBlxsudo\fR [\fIoption\fR] [\fIcommand\fR [\fIarguments\fR]]
+.br
+\fBlxdoas\fR [\fIoption\fR] [\fIcommand\fR [\fIarguments\fR]]
 .SH DESCRIPTION
-\fBlxqt-sudo\fR (and symlinks \fBlxsu\fR, \fBlxsudo\fR) is a graphical QT frontend for plain \fBsudo(8)\fR or \fBsu(1)\fR (for requesting optional password in GUI fashion).
+\fBlxqt-sudo\fR (and symlinks \fBlxsu\fR, \fBlxsudo\fR, \fBlxdoas\fR) is a graphical QT frontend for plain \fBsudo(8)\fR, \fBsu(1)\fR or \fBdoas(1)\fR (for requesting optional password in GUI fashion).
 .br
-When invoked it simply spawns child \fIsudo\fR or \fIsu\fR process with requested \fIcommand\fR (and optional \fIarguments\fR). If \fIsudo\fR/\fIsu\fR requests user's password,
+When invoked it simply spawns child \fIsudo\fR, \fIsu\fR or \fIdoas\fR process with requested \fIcommand\fR (and optional \fIarguments\fR). If \fIsudo\fR/\fIsu\fR/\fIdoas\fR requests user's password,
 the GUI password dialog is shown and (after submit) the password is provided to backend.
 .br
 .SH OPTIONS
@@ -20,13 +22,15 @@ the GUI password dialog is shown and (after submit) the password is provided to
 .br
   -v|--version   Print version information.
 .br
-  -s|--su        Use \fIsu\fR as backend (default for \fBlxqt-sudo\fR & \fBlxsudo\fR is \fIsudo\fR, for \fBlxsu\fR is \fIsu\fR).
+  -s|--su        Use \fIsu\fR as backend (default for \fBlxqt-sudo\fR & \fBlxsudo\fR is \fIsudo\fR, for \fBlxsu\fR \fIsu\fR, for \fBlxdoas\fR \fIdoas\fR).
+.br
+  -d|--sudo      Use \fIsudo\fR as backend (default for \fBlxqt-sudo\fR & \fBlxsudo\fR is \fIsudo\fR, for \fBlxsu\fR \fIsu\fR, for \fBlxdoas\fR \fIdoas\fR).
 .br
-  -d|--sudo      Use \fIsudo\fR as backend (default for \fBlxqt-sudo\fR & \fBlxsudo\fR is \fIsudo\fR, for \fBlxsu\fR is \fIsu\fR).
+  -a|--doas      Use \fIdoas\fR as backend (default for \fBlxqt-sudo\fR & \fBlxsudo\fR is \fIsudo\fR, for \fBlxsu\fR \fIsu\fR, for \fBlxdoas\fR \fIdoas\fR).
 .SH "REPORTING BUGS"
 Report bugs to https://github.com/lxqt/lxqt/issues
 .SH "SEE ALSO"
-\fBsudo(8)\fR \fBsu(1)\fR
+\fBsudo(8)\fR \fBsu(1)\fR \fBdoas(1)\fR
 .SH AUTHOR
 This manual page was created by \fBPalo Kisa\fR \fI<palo.kisa@gmail.com>\fR
 for \fBLXQt\fR project.
diff --git a/sudo.cpp b/sudo.cpp
index a70db32..d12f77c 100644
--- a/sudo.cpp
+++ b/sudo.cpp
@@ -61,9 +61,11 @@ namespace
     const QString app_version{QStringLiteral(LXQT_VERSION)};
     const QString app_lxsu{QStringLiteral(LXQTSUDO_LXSU)};
     const QString app_lxsudo{QStringLiteral(LXQTSUDO_LXSUDO)};
+    const QString app_lxdoas{QStringLiteral(LXQTSUDO_LXDOAS)};
 
     const QString su_prog{QStringLiteral(LXQTSUDO_SU)};
     const QString sudo_prog{QStringLiteral(LXQTSUDO_SUDO)};
+    const QString doas_prog{QStringLiteral(LXQTSUDO_DOAS)};
     const QString pwd_prompt_end{QStringLiteral(": ")};
     const QChar nl{QLatin1Char('\n')};
 
@@ -73,15 +75,16 @@ namespace
             QTextStream(stderr) << err << '\n';
         QTextStream(stdout)
             << QObject::tr("Usage: %1 option [command [arguments...]]\n\n"
-                    "GUI frontend for %2/%3\n\n"
+                    "GUI frontend for %2/%3/%4\n\n"
                     "Arguments:\n"
                     "  option:\n"
                     "    -h|--help      Print this help.\n"
                     "    -v|--version   Print version information.\n"
                     "    -s|--su        Use %3(1) as backend.\n"
                     "    -d|--sudo      Use %2(8) as backend.\n"
+                    "    -a|--doas      Use %4(1) as backend.\n"
                     "  command          Command to run.\n"
-                    "  arguments        Optional arguments for command.\n\n").arg(app_master).arg(sudo_prog).arg(su_prog);
+                    "  arguments        Optional arguments for command.\n\n").arg(app_master).arg(sudo_prog).arg(su_prog).arg(doas_prog);
         if (!err.isEmpty())
             QMessageBox(QMessageBox::Critical, app_master, err, QMessageBox::Ok).exec();
     }
@@ -155,6 +158,8 @@ Sudo::Sudo()
     mArgs.removeAt(0);
     if (app_lxsu == cmd)
         mBackend = BACK_SU;
+    else if (app_lxdoas == cmd)
+        mBackend = BACK_DOAS;
     else if (app_lxsudo == cmd || app_master == cmd)
         mBackend = BACK_SUDO;
     mRet = mPwdFd = mChildPid = 0;
@@ -186,6 +191,10 @@ int Sudo::main()
         {
             mBackend = BACK_SUDO;
             mArgs.removeAt(0);
+        } else if (QStringLiteral("-a") == arg1 || QStringLiteral("--doas") == arg1)
+        {
+            mBackend = BACK_DOAS;
+            mArgs.removeAt(0);
         }
     }
     //any other arguments we simply forward to su/sudo
@@ -242,6 +251,7 @@ QString Sudo::backendName (backend_t backEnd)
     switch (backEnd) {
         case BACK_SU   : rv = su_prog;   break;
         case BACK_SUDO : rv = sudo_prog; break;
+        case BACK_DOAS : rv = doas_prog; break;
         //: shouldn't be actually used but keep as short as possible in translations just in case.
         case BACK_NONE : rv = tr("unset");
     }
@@ -251,8 +261,22 @@ QString Sudo::backendName (backend_t backEnd)
 
 void Sudo::child()
 {
-    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
+    int params_cnt = 3; //su/sudo & "shell command" & last nullptr
+    switch (mBackend)
+    {
+        case BACK_SU:
+            params_cnt += 1; // -c for su
+            break;
+        case BACK_SUDO:
+            params_cnt += 3; // --preserve-env=... /bin/sh -c for sudo
+            break;
+        case BACK_DOAS:
+            params_cnt += 2; // /bin/sh -c for sudo
+            break;
+        case BACK_NONE:
+            break;
+    }
+
     std::unique_ptr<char const *[]> params{new char const *[params_cnt]};
     const char ** param_arg = params.get() + 1;
 
@@ -269,6 +293,9 @@ void Sudo::child()
             *(param_arg++) = preserve_env_param.c_str(); //preserve environment
             *(param_arg++) = "/bin/sh";
             break;
+        case BACK_DOAS:
+            *(param_arg++) = "/bin/sh";
+            [[fallthrough]];
         case BACK_SU:
         case BACK_NONE:
             env_workarounds();
diff --git a/sudo.h b/sudo.h
index 21905ee..d81f8ab 100644
--- a/sudo.h
+++ b/sudo.h
@@ -44,6 +44,7 @@ public:
         BACK_NONE
             , BACK_SUDO
             , BACK_SU
+            , BACK_DOAS
     };
 
 public:
diff --git a/translations/lxqt-sudo_ca.ts b/translations/lxqt-sudo_ca.ts
index 967e75e..4600a50 100644
--- a/translations/lxqt-sudo_ca.ts
+++ b/translations/lxqt-sudo_ca.ts
@@ -31,7 +31,7 @@
     <message>
         <location filename="../passworddialog.ui" line="109"/>
         <source>A program LXQt sudo calls in background to elevate privileges.</source>
-        <translation type="unfinished">Un programa LXQt sudo demana en segon pla elevar privilegis.</translation>
+        <translation>Un programa LXQt sudo demana en segon pla elevar privilegis.</translation>
     </message>
     <message>
         <location filename="../passworddialog.ui" line="119"/>
diff --git a/translations/lxqt-sudo_it.ts b/translations/lxqt-sudo_it.ts
index 20700a6..0f883db 100644
--- a/translations/lxqt-sudo_it.ts
+++ b/translations/lxqt-sudo_it.ts
@@ -31,7 +31,7 @@
     <message>
         <location filename="../passworddialog.ui" line="109"/>
         <source>A program LXQt sudo calls in background to elevate privileges.</source>
-        <translation>Chiamata in background da un programma LXQt sudo  per elevare i privilegi.</translation>
+        <translation type="unfinished">Chiamata in background da un programma LXQt sudo per elevare i privilegi.</translation>
     </message>
     <message>
         <location filename="../passworddialog.ui" line="119"/>
diff --git a/translations/lxqt-sudo_oc.ts b/translations/lxqt-sudo_oc.ts
new file mode 100644
index 0000000..4c9e6c0
--- /dev/null
+++ b/translations/lxqt-sudo_oc.ts
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="oc">
+<context>
+    <name>PasswordDialog</name>
+    <message>
+        <location filename="../passworddialog.ui" line="6"/>
+        <source>LXQt sudo</source>
+        <translation>sudo de LXQt</translation>
+    </message>
+    <message>
+        <location filename="../passworddialog.ui" line="42"/>
+        <source>Copy command to clipboard</source>
+        <translation>Copiar la comanda al quichapapièrs</translation>
+    </message>
+    <message>
+        <location filename="../passworddialog.ui" line="45"/>
+        <source>&amp;Copy</source>
+        <translation>&amp;Copiar</translation>
+    </message>
+    <message>
+        <location filename="../passworddialog.ui" line="83"/>
+        <source>The requested action needs administrative privileges.&lt;br&gt;Please enter your password.</source>
+        <translation>L’accion demandada requerís los privilègis administratius.&lt;br&gt;Picatz lo senhal.</translation>
+    </message>
+    <message>
+        <location filename="../passworddialog.ui" line="106"/>
+        <source>LXQt sudo backend</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../passworddialog.ui" line="109"/>
+        <source>A program LXQt sudo calls in background to elevate privileges.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../passworddialog.ui" line="119"/>
+        <source>Command:</source>
+        <translation>Comanda&#xa0;:</translation>
+    </message>
+    <message>
+        <location filename="../passworddialog.ui" line="126"/>
+        <source>Password:</source>
+        <translation>Senhal&#xa0;:</translation>
+    </message>
+    <message>
+        <location filename="../passworddialog.ui" line="133"/>
+        <source>Enter password</source>
+        <translation>Picar lo senhal</translation>
+    </message>
+    <message>
+        <location filename="../passworddialog.cpp" line="60"/>
+        <source>Attempt #%1</source>
+        <translation>Ensag #%1</translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../sudo.cpp" line="75"/>
+        <source>Usage: %1 option [command [arguments...]]
+
+GUI frontend for %2/%3
+
+Arguments:
+  option:
+    -h|--help      Print this help.
+    -v|--version   Print version information.
+    -s|--su        Use %3(1) as backend.
+    -d|--sudo      Use %2(8) as backend.
+  command          Command to run.
+  arguments        Optional arguments for command.
+
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sudo.cpp" line="92"/>
+        <source>%1 version %2
+</source>
+        <translation>%1 version %2
+</translation>
+    </message>
+</context>
+<context>
+    <name>Sudo</name>
+    <message>
+        <location filename="../sudo.cpp" line="195"/>
+        <source>%1: no command to run provided!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sudo.cpp" line="202"/>
+        <source>%1: no backend chosen!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sudo.cpp" line="219"/>
+        <source>Syscall error, failed to fork: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sudo.cpp" line="246"/>
+        <source>unset</source>
+        <extracomment>shouldn&apos;t be actually used but keep as short as possible in translations just in case.</extracomment>
+        <translation>pas definit</translation>
+    </message>
+    <message>
+        <location filename="../sudo.cpp" line="295"/>
+        <source>%1: Detected attempt to inject privileged command via LC_ALL env(%2). Exiting!
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sudo.cpp" line="337"/>
+        <source>Syscall error, failed to bring pty to non-block mode: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sudo.cpp" line="345"/>
+        <source>Syscall error, failed to fdopen pty: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sudo.cpp" line="314"/>
+        <source>%1: Failed to exec &apos;%2&apos;: %3
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sudo.cpp" line="376"/>
+        <source>Child &apos;%1&apos; process failed!
+%2</source>
+        <translation>Fracàs del processús filh «&#xa0;%1&#xa0;»&#xa0;!
+%2</translation>
+    </message>
+</context>
+</TS>

More details

Full run details

Historical runs