summaryrefslogtreecommitdiff
path: root/src/login/loginctl.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-04-11 18:50:16 +0200
committerLennart Poettering <lennart@poettering.net>2012-04-11 20:39:03 +0200
commit6bb92a169e8a65e7def5545798001e0dbecc7d4f (patch)
tree5a7c6946959d62ee3bafb55f932a2e0f7e809c45 /src/login/loginctl.c
parentf25626edf4c39bb9409cb165e6ce9551dd130661 (diff)
polkit: temporarily spawn of a polkit agent in terminals for possibly authenticated operations
Diffstat (limited to 'src/login/loginctl.c')
-rw-r--r--src/login/loginctl.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/login/loginctl.c b/src/login/loginctl.c
index 30e97e352a..2633b47e1c 100644
--- a/src/login/loginctl.c
+++ b/src/login/loginctl.c
@@ -35,6 +35,7 @@
#include "strv.h"
#include "cgroup-show.h"
#include "sysfs-show.h"
+#include "spawn-polkit-agent.h"
static char **arg_property = NULL;
static bool arg_all = false;
@@ -46,6 +47,7 @@ static enum transport {
TRANSPORT_SSH,
TRANSPORT_POLKIT
} arg_transport = TRANSPORT_NORMAL;
+static bool arg_ask_password = true;
static const char *arg_host = NULL;
static bool on_tty(void) {
@@ -68,8 +70,20 @@ static void pager_open_if_enabled(void) {
/* Cache result before we open the pager */
on_tty();
- if (!arg_no_pager)
- pager_open();
+ if (arg_no_pager)
+ return;
+
+ pager_open();
+}
+
+static void polkit_agent_open_if_enabled(void) {
+
+ /* Open the polkit agent as a child process if necessary */
+
+ if (!arg_ask_password)
+ return;
+
+ polkit_agent_open();
}
static int list_sessions(DBusConnection *bus, char **args, unsigned n) {
@@ -1286,6 +1300,8 @@ static int enable_linger(DBusConnection *bus, char **args, unsigned n) {
dbus_error_init(&error);
+ polkit_agent_open_if_enabled();
+
b = streq(args[0], "enable-linger");
for (i = 1; i < n; i++) {
@@ -1490,6 +1506,8 @@ static int attach(DBusConnection *bus, char **args, unsigned n) {
dbus_error_init(&error);
+ polkit_agent_open_if_enabled();
+
for (i = 2; i < n; i++) {
DBusMessage *reply;
@@ -1546,6 +1564,8 @@ static int flush_devices(DBusConnection *bus, char **args, unsigned n) {
dbus_error_init(&error);
+ polkit_agent_open_if_enabled();
+
m = dbus_message_new_method_call(
"org.freedesktop.login1",
"/org/freedesktop/login1",
@@ -1684,7 +1704,8 @@ static int parse_argv(int argc, char *argv[]) {
enum {
ARG_VERSION = 0x100,
ARG_NO_PAGER,
- ARG_KILL_WHO
+ ARG_KILL_WHO,
+ ARG_NO_ASK_PASSWORD
};
static const struct option options[] = {
@@ -1697,6 +1718,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "signal", required_argument, NULL, 's' },
{ "host", required_argument, NULL, 'H' },
{ "privileged",no_argument, NULL, 'P' },
+ { "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD },
{ NULL, 0, NULL, 0 }
};
@@ -1744,6 +1766,9 @@ static int parse_argv(int argc, char *argv[]) {
arg_no_pager = true;
break;
+ case ARG_NO_ASK_PASSWORD:
+ arg_ask_password = false;
+
case ARG_KILL_WHO:
arg_kill_who = optarg;
break;