]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
varlinkctl: add support for polkit interactive auth
authorLuca Boccassi <luca.boccassi@gmail.com>
Wed, 19 Nov 2025 01:43:33 +0000 (01:43 +0000)
committerLuca Boccassi <bluca@debian.org>
Wed, 17 Dec 2025 23:22:05 +0000 (23:22 +0000)
man/varlinkctl.xml
shell-completion/bash/varlinkctl
src/varlinkctl/varlinkctl.c

index 556d2535f878b4d4c3e17d08211b48da9400ce46..f8185f71cac0440d5c6120d8fed174420b9eef9b 100644 (file)
         </listitem>
       </varlistentry>
 
+      <xi:include href="standard-options.xml" xpointer="no-ask-password" />
       <xi:include href="standard-options.xml" xpointer="no-pager" />
       <xi:include href="standard-options.xml" xpointer="help" />
       <xi:include href="standard-options.xml" xpointer="version" />
index 7d2c850a221d880acd13972bd088a68b99c2c695..f7d880b46461afb20c4df7a31dccc583215fd763 100644 (file)
@@ -42,7 +42,7 @@ _varlinkctl() {
     local i n verb comps
     local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
     local -A OPTS=(
-        [STANDALONE]='-h --help --version --no-pager -q --quiet
+        [STANDALONE]='-h --help --version --no-pager -q --quiet --no-ask-password
                       --oneway --collect --more --exec -j -E'
         [ARG]='--graceful --timeout --push-fd --json'
     )
index 865235bb30c0b727cc44c0cd7339a4fe2daa6d25..1c28005647040040ddcb7acae0cfb3a2ca287b02 100644 (file)
@@ -9,6 +9,7 @@
 #include "sd-varlink.h"
 
 #include "build.h"
+#include "bus-util.h"
 #include "env-util.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -21,6 +22,7 @@
 #include "parse-argument.h"
 #include "parse-util.h"
 #include "pidfd-util.h"
+#include "polkit-agent.h"
 #include "pretty-print.h"
 #include "process-util.h"
 #include "string-util.h"
@@ -46,6 +48,7 @@ static char **arg_graceful = NULL;
 static usec_t arg_timeout = 0;
 static bool arg_exec = false;
 static PushFds arg_push_fds = {};
+static bool arg_ask_password = true;
 
 static void push_fds_done(PushFds *p) {
         assert(p);
@@ -87,6 +90,7 @@ static int help(void) {
                "\n%3$sOptions:%4$s\n"
                "  -h --help              Show this help\n"
                "     --version           Show package version\n"
+               "     --no-ask-password   Do not prompt for password\n"
                "     --no-pager          Do not pipe output into a pager\n"
                "     --more              Request multiple responses\n"
                "     --collect           Collect multiple responses in a JSON array\n"
@@ -126,21 +130,23 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_TIMEOUT,
                 ARG_EXEC,
                 ARG_PUSH_FD,
+                ARG_NO_ASK_PASSWORD,
         };
 
         static const struct option options[] = {
-                { "help",     no_argument,       NULL, 'h'          },
-                { "version",  no_argument,       NULL, ARG_VERSION  },
-                { "no-pager", no_argument,       NULL, ARG_NO_PAGER },
-                { "more",     no_argument,       NULL, ARG_MORE     },
-                { "oneway",   no_argument,       NULL, ARG_ONEWAY   },
-                { "json",     required_argument, NULL, ARG_JSON     },
-                { "collect",  no_argument,       NULL, ARG_COLLECT  },
-                { "quiet",    no_argument,       NULL, 'q'          },
-                { "graceful", required_argument, NULL, ARG_GRACEFUL },
-                { "timeout",  required_argument, NULL, ARG_TIMEOUT  },
-                { "exec",     no_argument,       NULL, ARG_EXEC     },
-                { "push-fd",  required_argument, NULL, ARG_PUSH_FD  },
+                { "help",            no_argument,       NULL, 'h'                },
+                { "version",         no_argument,       NULL, ARG_VERSION         },
+                { "no-pager",        no_argument,       NULL, ARG_NO_PAGER        },
+                { "more",            no_argument,       NULL, ARG_MORE            },
+                { "oneway",          no_argument,       NULL, ARG_ONEWAY          },
+                { "json",            required_argument, NULL, ARG_JSON            },
+                { "collect",         no_argument,       NULL, ARG_COLLECT         },
+                { "quiet",           no_argument,       NULL, 'q'                 },
+                { "graceful",        required_argument, NULL, ARG_GRACEFUL        },
+                { "timeout",         required_argument, NULL, ARG_TIMEOUT         },
+                { "exec",            no_argument,       NULL, ARG_EXEC            },
+                { "push-fd",         required_argument, NULL, ARG_PUSH_FD         },
+                { "no-ask-password", no_argument,       NULL, ARG_NO_ASK_PASSWORD },
                 {},
         };
 
@@ -253,6 +259,10 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
                 }
 
+                case ARG_NO_ASK_PASSWORD:
+                        arg_ask_password = false;
+                        break;
+
                 case '?':
                         return -EINVAL;
 
@@ -619,6 +629,8 @@ static int verb_call(int argc, char *argv[], void *userdata) {
         if (arg_exec && (arg_collect || (arg_method_flags & (SD_VARLINK_METHOD_ONEWAY|SD_VARLINK_METHOD_MORE))) != 0)
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--exec and --collect/--more/--oneway may not be combined.");
 
+        (void) polkit_agent_open_if_enabled(BUS_TRANSPORT_LOCAL, arg_ask_password);
+
         url = argv[1];
         method = argv[2];
         parameter = argc > 3 && !streq(argv[3], "-") ? argv[3] : NULL;