about summary refs log tree commit diff
path: root/src/nm-auth-manager.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2021-02-11 18:11:46 +0100
committerMichael Biebl <biebl@debian.org>2021-02-11 18:11:46 +0100
commit80ec1decc49c72efec2a8b87c06245c92c0ab807 (patch)
treee3b229aa94e8dcf0590f2317664176e7b8f7607b /src/nm-auth-manager.c
parent65f86e8f56267192d42f2b629fc6b0c99fb9cd0c (diff)
New upstream version 1.29.90 upstream/1.29.90
Diffstat (limited to 'src/nm-auth-manager.c')
-rw-r--r--src/nm-auth-manager.c751
1 files changed, 0 insertions, 751 deletions
diff --git a/src/nm-auth-manager.c b/src/nm-auth-manager.c
deleted file mode 100644
index 1cb4834a..00000000
--- a/src/nm-auth-manager.c
+++ /dev/null
@@ -1,751 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2014 Red Hat, Inc.
- */
-
-#include "nm-default.h"
-
-#include "nm-auth-manager.h"
-
-#include "c-list/src/c-list.h"
-#include "nm-glib-aux/nm-dbus-aux.h"
-#include "nm-errors.h"
-#include "nm-core-internal.h"
-#include "nm-dbus-manager.h"
-#include "NetworkManagerUtils.h"
-
-#define POLKIT_SERVICE     "org.freedesktop.PolicyKit1"
-#define POLKIT_OBJECT_PATH "/org/freedesktop/PolicyKit1/Authority"
-#define POLKIT_INTERFACE   "org.freedesktop.PolicyKit1.Authority"
-
-#define CANCELLATION_ID_PREFIX  "cancellation-id-"
-#define CANCELLATION_TIMEOUT_MS 5000
-
-/*****************************************************************************/
-
-NM_GOBJECT_PROPERTIES_DEFINE_BASE(PROP_POLKIT_ENABLED, );
-
-enum {
-    CHANGED_SIGNAL,
-    LAST_SIGNAL,
-};
-
-static guint signals[LAST_SIGNAL] = {0};
-
-typedef struct {
-    CList            calls_lst_head;
-    GDBusConnection *dbus_connection;
-    GCancellable *   main_cancellable;
-    char *           name_owner;
-    guint64          call_numid_counter;
-    guint            changed_id;
-    guint            name_owner_changed_id;
-    bool             disposing : 1;
-    bool             shutting_down : 1;
-    bool             got_name_owner : 1;
-    NMAuthPolkitMode auth_polkit_mode : 3;
-} NMAuthManagerPrivate;
-
-struct _NMAuthManager {
-    GObject              parent;
-    NMAuthManagerPrivate _priv;
-};
-
-struct _NMAuthManagerClass {
-    GObjectClass parent;
-};
-
-G_DEFINE_TYPE(NMAuthManager, nm_auth_manager, G_TYPE_OBJECT)
-
-#define NM_AUTH_MANAGER_GET_PRIVATE(self) _NM_GET_PRIVATE(self, NMAuthManager, NM_IS_AUTH_MANAGER)
-
-NM_DEFINE_SINGLETON_REGISTER(NMAuthManager);
-
-/*****************************************************************************/
-
-#define _NMLOG_PREFIX_NAME "auth"
-#define _NMLOG_DOMAIN      LOGD_CORE
-#define _NMLOG(level, ...)                                       \
-    G_STMT_START                                                 \
-    {                                                            \
-        if (nm_logging_enabled((level), (_NMLOG_DOMAIN))) {      \
-            char __prefix[30] = _NMLOG_PREFIX_NAME;              \
-                                                                 \
-            if ((self) != singleton_instance)                    \
-                g_snprintf(__prefix,                             \
-                           sizeof(__prefix),                     \
-                           ""_NMLOG_PREFIX_NAME                  \
-                           "[%p]",                               \
-                           (self));                              \
-            _nm_log((level),                                     \
-                    (_NMLOG_DOMAIN),                             \
-                    0,                                           \
-                    NULL,                                        \
-                    NULL,                                        \
-                    "%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__),   \
-                    __prefix _NM_UTILS_MACRO_REST(__VA_ARGS__)); \
-        }                                                        \
-    }                                                            \
-    G_STMT_END
-
-#define _NMLOG2(level, call_id, ...)                                                        \
-    G_STMT_START                                                                            \
-    {                                                                                       \
-        if (nm_logging_enabled((level), (_NMLOG_DOMAIN))) {                                 \
-            NMAuthManagerCallId *_call_id     = (call_id);                                  \
-            char                 __prefix[30] = _NMLOG_PREFIX_NAME;                         \
-                                                                                            \
-            if (_call_id->self != singleton_instance)                                       \
-                g_snprintf(__prefix,                                                        \
-                           sizeof(__prefix),                                                \
-                           ""_NMLOG_PREFIX_NAME                                             \
-                           "[%p]",                                                          \
-                           _call_id->self);                                                 \
-            _nm_log((level),                                                                \
-                    (_NMLOG_DOMAIN),                                                        \
-                    0,                                                                      \
-                    NULL,                                                                   \
-                    NULL,                                                                   \
-                    "%s: call[%" G_GUINT64_FORMAT "]: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \
-                    __prefix,                                                               \
-                    _call_id->call_numid _NM_UTILS_MACRO_REST(__VA_ARGS__));                \
-        }                                                                                   \
-    }                                                                                       \
-    G_STMT_END
-
-/*****************************************************************************/
-
-gboolean
-nm_auth_manager_get_polkit_enabled(NMAuthManager *self)
-{
-    g_return_val_if_fail(NM_IS_AUTH_MANAGER(self), FALSE);
-
-    return NM_AUTH_MANAGER_GET_PRIVATE(self)->dbus_connection != NULL;
-}
-
-/*****************************************************************************/
-
-static void
-_emit_changed_signal(NMAuthManager *self)
-{
-    g_signal_emit(self, signals[CHANGED_SIGNAL], 0);
-}
-
-typedef enum {
-    POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE                   = 0,
-    POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION = (1 << 0),
-} PolkitCheckAuthorizationFlags;
-
-struct _NMAuthManagerCallId {
-    CList                                   calls_lst;
-    NMAuthManager *                         self;
-    GCancellable *                          dbus_cancellable;
-    NMAuthManagerCheckAuthorizationCallback callback;
-    gpointer                                user_data;
-    guint64                                 call_numid;
-    guint                                   idle_id;
-    bool                                    idle_is_authorized : 1;
-};
-
-#define cancellation_id_to_str_a(call_numid)                     \
-    nm_sprintf_bufa(NM_STRLEN(CANCELLATION_ID_PREFIX) + 60,      \
-                    CANCELLATION_ID_PREFIX "%" G_GUINT64_FORMAT, \
-                    (call_numid))
-
-static void
-_call_id_free(NMAuthManagerCallId *call_id)
-{
-    c_list_unlink(&call_id->calls_lst);
-    nm_clear_g_source(&call_id->idle_id);
-
-    if (call_id->dbus_cancellable) {
-        /* we have a pending D-Bus call. We keep the call-id instance alive
-         * for _call_check_authorize_cb() */
-        g_cancellable_cancel(call_id->dbus_cancellable);
-        return;
-    }
-
-    g_object_unref(call_id->self);
-    g_slice_free(NMAuthManagerCallId, call_id);
-}
-
-static void
-_call_id_invoke_callback(NMAuthManagerCallId *call_id,
-                         gboolean             is_authorized,
-                         gboolean             is_challenge,
-                         GError *             error)
-{
-    c_list_unlink(&call_id->calls_lst);
-
-    call_id
-        ->callback(call_id->self, call_id, is_authorized, is_challenge, error, call_id->user_data);
-    _call_id_free(call_id);
-}
-
-static void
-cancel_check_authorization_cb(GObject *source, GAsyncResult *res, gpointer user_data)
-{
-    NMAuthManagerCallId *call_id     = user_data;
-    gs_unref_variant GVariant *value = NULL;
-    gs_free_error GError *error      = NULL;
-
-    value = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source), res, &error);
-    if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
-        _LOG2T(call_id, "cancel request was cancelled");
-    else if (error)
-        _LOG2T(call_id, "cancel request failed: %s", error->message);
-    else
-        _LOG2T(call_id, "cancel request succeeded");
-
-    _call_id_free(call_id);
-}
-
-static void
-_call_check_authorize_cb(GObject *proxy, GAsyncResult *res, gpointer user_data)
-{
-    NMAuthManagerCallId * call_id = user_data;
-    NMAuthManager *       self;
-    NMAuthManagerPrivate *priv;
-    gs_unref_variant GVariant *value    = NULL;
-    gs_free_error GError *error         = NULL;
-    gboolean              is_authorized = FALSE;
-    gboolean              is_challenge  = FALSE;
-
-    /* we need to clear the cancelable, to signal for _call_id_free() that we
-     * are not in a pending call.
-     *
-     * Note how _call_id_free() kept call-id alive, even if the request was
-     * already cancelled. */
-    g_clear_object(&call_id->dbus_cancellable);
-
-    self = call_id->self;
-    priv = NM_AUTH_MANAGER_GET_PRIVATE(self);
-
-    value = g_dbus_connection_call_finish(G_DBUS_CONNECTION(proxy), res, &error);
-
-    if (nm_utils_error_is_cancelled(error)) {
-        /* call_id was cancelled externally, but _call_id_free() kept call_id
-         * alive (and it has still the reference on @self. */
-
-        if (!priv->main_cancellable) {
-            /* we do a forced shutdown. There is no more time for cancelling... */
-            _call_id_free(call_id);
-
-            /* this shouldn't really happen, because:
-             * nm_auth_manager_check_authorization() only scheduled the D-Bus request at a time when
-             * main_cancellable was still set. It means, somebody called force-shutdown
-             * after call-id was schedule.
-             * force-shutdown should only be called after:
-             *   - cancel all pending requests
-             *   - give enough time to cancel the request and schedule a D-Bus call
-             *     to CancelCheckAuthorization (below), before issuing force-shutdown. */
-            g_return_if_reached();
-        }
-
-        g_dbus_connection_call(priv->dbus_connection,
-                               POLKIT_SERVICE,
-                               POLKIT_OBJECT_PATH,
-                               POLKIT_INTERFACE,
-                               "CancelCheckAuthorization",
-                               g_variant_new("(s)", cancellation_id_to_str_a(call_id->call_numid)),
-                               G_VARIANT_TYPE("()"),
-                               G_DBUS_CALL_FLAGS_NONE,
-                               CANCELLATION_TIMEOUT_MS,
-                               priv->main_cancellable,
-                               cancel_check_authorization_cb,
-                               call_id);
-        return;
-    }
-
-    if (!error) {
-        g_variant_get(value, "((bb@a{ss}))", &is_authorized, &is_challenge, NULL);
-        _LOG2T(call_id, "completed: authorized=%d, challenge=%d", is_authorized, is_challenge);
-    } else
-        _LOG2T(call_id, "completed: failed: %s", error->message);
-
-    _call_id_invoke_callback(call_id, is_authorized, is_challenge, error);
-}
-
-static gboolean
-_call_on_idle(gpointer user_data)
-{
-    NMAuthManagerCallId *call_id = user_data;
-    gboolean             is_authorized;
-    gboolean             is_challenge = FALSE;
-
-    is_authorized    = call_id->idle_is_authorized;
-    call_id->idle_id = 0;
-
-    _LOG2T(call_id,
-           "completed: authorized=%d, challenge=%d (simulated)",
-           is_authorized,
-           is_challenge);
-
-    _call_id_invoke_callback(call_id, is_authorized, is_challenge, NULL);
-    return G_SOURCE_REMOVE;
-}
-
-/*
- * @callback must never be invoked synchronously.
- *
- * @callback is always invoked exactly once, and never synchronously.
- * You may cancel the invocation with nm_auth_manager_check_authorization_cancel(),
- * but: you may only do so exactly once, and only before @callback is
- * invoked. Even if you cancel the request, @callback will still be invoked
- * (synchronously, during the _cancel() callback).
- *
- * The request keeps @self alive (it needs to do so, because when cancelling a
- * request we might need to do an additional CancelCheckAuthorization call, for
- * which @self must be live long enough).
- */
-NMAuthManagerCallId *
-nm_auth_manager_check_authorization(NMAuthManager *                         self,
-                                    NMAuthSubject *                         subject,
-                                    const char *                            action_id,
-                                    gboolean                                allow_user_interaction,
-                                    NMAuthManagerCheckAuthorizationCallback callback,
-                                    gpointer                                user_data)
-{
-    NMAuthManagerPrivate *        priv;
-    PolkitCheckAuthorizationFlags flags;
-    char                          subject_buf[64];
-    NMAuthManagerCallId *         call_id;
-
-    g_return_val_if_fail(NM_IS_AUTH_MANAGER(self), NULL);
-    g_return_val_if_fail(NM_IN_SET(nm_auth_subject_get_subject_type(subject),
-                                   NM_AUTH_SUBJECT_TYPE_INTERNAL,
-                                   NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS),
-                         NULL);
-    g_return_val_if_fail(action_id, NULL);
-
-    priv = NM_AUTH_MANAGER_GET_PRIVATE(self);
-
-    g_return_val_if_fail(!priv->disposing, NULL);
-    g_return_val_if_fail(!priv->shutting_down, NULL);
-
-    flags = allow_user_interaction ? POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION
-                                   : POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE;
-
-    call_id  = g_slice_new(NMAuthManagerCallId);
-    *call_id = (NMAuthManagerCallId){
-        .self               = g_object_ref(self),
-        .callback           = callback,
-        .user_data          = user_data,
-        .call_numid         = ++priv->call_numid_counter,
-        .idle_is_authorized = TRUE,
-    };
-    c_list_link_tail(&priv->calls_lst_head, &call_id->calls_lst);
-
-    if (nm_auth_subject_get_subject_type(subject) == NM_AUTH_SUBJECT_TYPE_INTERNAL) {
-        _LOG2T(call_id,
-               "CheckAuthorization(%s), subject=%s (succeeding for internal request)",
-               action_id,
-               nm_auth_subject_to_string(subject, subject_buf, sizeof(subject_buf)));
-        call_id->idle_id = g_idle_add(_call_on_idle, call_id);
-    } else if (nm_auth_subject_get_unix_process_uid(subject) == 0) {
-        _LOG2T(call_id,
-               "CheckAuthorization(%s), subject=%s (succeeding for root)",
-               action_id,
-               nm_auth_subject_to_string(subject, subject_buf, sizeof(subject_buf)));
-        call_id->idle_id = g_idle_add(_call_on_idle, call_id);
-    } else if (priv->auth_polkit_mode != NM_AUTH_POLKIT_MODE_USE_POLKIT) {
-        _LOG2T(call_id,
-               "CheckAuthorization(%s), subject=%s (PolicyKit disabled and always %s authorization "
-               "to non-root user)",
-               action_id,
-               nm_auth_subject_to_string(subject, subject_buf, sizeof(subject_buf)),
-               priv->auth_polkit_mode == NM_AUTH_POLKIT_MODE_ALLOW_ALL ? "grant" : "deny");
-        call_id->idle_is_authorized = (priv->auth_polkit_mode == NM_AUTH_POLKIT_MODE_ALLOW_ALL);
-        call_id->idle_id            = g_idle_add(_call_on_idle, call_id);
-    } else {
-        GVariant *      parameters;
-        GVariantBuilder builder;
-        GVariant *      subject_value;
-        GVariant *      details_value;
-
-        subject_value = nm_auth_subject_unix_to_polkit_gvariant(subject);
-        nm_assert(g_variant_is_floating(subject_value));
-
-        /* ((PolkitDetails *)NULL) */
-        g_variant_builder_init(&builder, G_VARIANT_TYPE("a{ss}"));
-        details_value = g_variant_builder_end(&builder);
-
-        parameters = g_variant_new("(@(sa{sv})s@a{ss}us)",
-                                   subject_value,
-                                   action_id,
-                                   details_value,
-                                   (guint32) flags,
-                                   cancellation_id_to_str_a(call_id->call_numid));
-
-        _LOG2T(call_id,
-               "CheckAuthorization(%s), subject=%s",
-               action_id,
-               nm_auth_subject_to_string(subject, subject_buf, sizeof(subject_buf)));
-
-        call_id->dbus_cancellable = g_cancellable_new();
-
-        nm_assert(priv->main_cancellable);
-
-        g_dbus_connection_call(priv->dbus_connection,
-                               POLKIT_SERVICE,
-                               POLKIT_OBJECT_PATH,
-                               POLKIT_INTERFACE,
-                               "CheckAuthorization",
-                               parameters,
-                               G_VARIANT_TYPE("((bba{ss}))"),
-                               G_DBUS_CALL_FLAGS_NONE,
-                               G_MAXINT, /* no timeout */
-                               call_id->dbus_cancellable,
-                               _call_check_authorize_cb,
-                               call_id);
-    }
-
-    return call_id;
-}
-
-void
-nm_auth_manager_check_authorization_cancel(NMAuthManagerCallId *call_id)
-{
-    NMAuthManager *self;
-    gs_free_error GError *error = NULL;
-
-    g_return_if_fail(call_id);
-
-    self = call_id->self;
-
-    g_return_if_fail(NM_IS_AUTH_MANAGER(self));
-    g_return_if_fail(!c_list_is_empty(&call_id->calls_lst));
-
-    nm_assert(
-        c_list_contains(&NM_AUTH_MANAGER_GET_PRIVATE(self)->calls_lst_head, &call_id->calls_lst));
-
-    nm_utils_error_set_cancelled(&error, FALSE, "NMAuthManager");
-    _LOG2T(call_id, "completed: failed due to call cancelled");
-    _call_id_invoke_callback(call_id, FALSE, FALSE, error);
-}
-
-/*****************************************************************************/
-
-static void
-changed_signal_cb(GDBusConnection *connection,
-                  const char *     sender_name,
-                  const char *     object_path,
-                  const char *     interface_name,
-                  const char *     signal_name,
-                  GVariant *       parameters,
-                  gpointer         user_data)
-{
-    NMAuthManager *       self = user_data;
-    NMAuthManagerPrivate *priv = NM_AUTH_MANAGER_GET_PRIVATE(self);
-    gboolean              valid_sender;
-
-    nm_assert(nm_streq0(signal_name, "Changed"));
-
-    valid_sender = nm_streq0(priv->name_owner, sender_name);
-
-    _LOGD("dbus-signal: \"Changed\" notification%s", valid_sender ? "" : " (ignore)");
-
-    if (valid_sender)
-        _emit_changed_signal(self);
-}
-
-static void
-_name_owner_changed(NMAuthManager *self, const char *name_owner, gboolean is_initial)
-{
-    NMAuthManagerPrivate *priv = NM_AUTH_MANAGER_GET_PRIVATE(self);
-    gboolean              is_changed;
-    gs_free char *        old_name_owner = NULL;
-
-    if (is_initial)
-        priv->got_name_owner = TRUE;
-    else {
-        if (!priv->got_name_owner)
-            return;
-    }
-
-    name_owner = nm_str_not_empty(name_owner);
-
-    is_changed = !nm_streq0(priv->name_owner, name_owner);
-    if (is_changed) {
-        old_name_owner   = g_steal_pointer(&priv->name_owner);
-        priv->name_owner = g_strdup(name_owner);
-    } else {
-        if (!is_initial)
-            return;
-    }
-
-    if (!priv->name_owner) {
-        if (is_initial)
-            _LOGT("name-owner: polkit not running");
-        else
-            _LOGT("name-owner: polkit stopped (was %s)", old_name_owner);
-    } else {
-        if (is_initial)
-            _LOGT("name-owner: polkit is running (now %s)", priv->name_owner);
-        else if (old_name_owner)
-            _LOGT("name-owner: polkit restarted (now %s, was %s)",
-                  priv->name_owner,
-                  old_name_owner);
-        else
-            _LOGT("name-owner: polkit started (now %s)", priv->name_owner);
-    }
-
-    if (priv->name_owner)
-        _emit_changed_signal(self);
-}
-
-static void
-_name_owner_changed_cb(GDBusConnection *connection,
-                       const char *     sender_name,
-                       const char *     object_path,
-                       const char *     interface_name,
-                       const char *     signal_name,
-                       GVariant *       parameters,
-                       gpointer         user_data)
-{
-    NMAuthManager *self = user_data;
-    const char *   new_owner;
-
-    if (!g_variant_is_of_type(parameters, G_VARIANT_TYPE("(sss)")))
-        return;
-
-    g_variant_get(parameters, "(&s&s&s)", NULL, NULL, &new_owner);
-
-    _name_owner_changed(self, new_owner, FALSE);
-}
-
-static void
-_name_owner_get_cb(const char *name_owner, GError *error, gpointer user_data)
-{
-    if (!nm_utils_error_is_cancelled(error))
-        _name_owner_changed(user_data, name_owner, TRUE);
-}
-
-/*****************************************************************************/
-
-NMAuthManager *
-nm_auth_manager_get()
-{
-    g_return_val_if_fail(singleton_instance, NULL);
-
-    return singleton_instance;
-}
-
-void
-nm_auth_manager_force_shutdown(NMAuthManager *self)
-{
-    NMAuthManagerPrivate *priv;
-
-    g_return_if_fail(NM_IS_AUTH_MANAGER(self));
-
-    priv = NM_AUTH_MANAGER_GET_PRIVATE(self);
-
-    /* FIXME(shutdown): ensure we properly call this API during shutdown as
-     * described next. */
-
-    /* while we have pending requests (NMAuthManagerCallId), the instance
-     * is kept alive.
-     *
-     * Even if the caller cancels all pending call-ids, we still need to keep
-     * a reference to self, in order to handle pending CancelCheckAuthorization
-     * requests.
-     *
-     * To do a coordinated shutdown, do the following:
-     * - cancel all pending NMAuthManagerCallId requests.
-     * - ensure everybody unrefs the NMAuthManager instance. If by that, the instance
-     *   gets destroyed, the shutdown already completed successfully.
-     * - Otherwise, the object is kept alive by pending CancelCheckAuthorization requests.
-     *   wait a certain timeout (1 second) for all requests to complete (by watching
-     *   for destruction of NMAuthManager).
-     * - if that doesn't happen within timeout, issue nm_auth_manager_force_shutdown() and
-     *   wait longer. After that, soon the instance should be destroyed and you
-     *   did a successful shutdown.
-     * - if the instance was still not destroyed within a short timeout, you leaked
-     *   resources. You cannot properly shutdown.
-     */
-
-    priv->shutting_down = TRUE;
-    nm_clear_g_cancellable(&priv->main_cancellable);
-}
-
-/*****************************************************************************/
-
-static void
-set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-    NMAuthManagerPrivate *priv = NM_AUTH_MANAGER_GET_PRIVATE(object);
-    int                   v_int;
-
-    switch (prop_id) {
-    case PROP_POLKIT_ENABLED:
-        /* construct-only */
-        v_int = g_value_get_int(value);
-        g_return_if_fail(NM_IN_SET(v_int,
-                                   NM_AUTH_POLKIT_MODE_ROOT_ONLY,
-                                   NM_AUTH_POLKIT_MODE_ALLOW_ALL,
-                                   NM_AUTH_POLKIT_MODE_USE_POLKIT));
-        priv->auth_polkit_mode = v_int;
-        nm_assert(priv->auth_polkit_mode == v_int);
-        break;
-    default:
-        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
-        break;
-    }
-}
-
-/*****************************************************************************/
-
-static void
-nm_auth_manager_init(NMAuthManager *self)
-{
-    NMAuthManagerPrivate *priv = NM_AUTH_MANAGER_GET_PRIVATE(self);
-
-    c_list_init(&priv->calls_lst_head);
-    priv->auth_polkit_mode = NM_AUTH_POLKIT_MODE_ROOT_ONLY;
-}
-
-static void
-constructed(GObject *object)
-{
-    NMAuthManager *       self = NM_AUTH_MANAGER(object);
-    NMAuthManagerPrivate *priv = NM_AUTH_MANAGER_GET_PRIVATE(self);
-    NMLogLevel            logl = LOGL_DEBUG;
-    const char *          create_message;
-
-    G_OBJECT_CLASS(nm_auth_manager_parent_class)->constructed(object);
-
-    if (priv->auth_polkit_mode != NM_AUTH_POLKIT_MODE_USE_POLKIT) {
-        if (priv->auth_polkit_mode == NM_AUTH_POLKIT_MODE_ROOT_ONLY)
-            create_message = "polkit disabled, root-only";
-        else
-            create_message = "polkit disabled, allow-all";
-        goto out;
-    }
-
-    priv->dbus_connection = nm_g_object_ref(NM_MAIN_DBUS_CONNECTION_GET);
-
-    if (!priv->dbus_connection) {
-        /* This warrants an info level message. */
-        logl = LOGL_INFO;
-        create_message =
-            "D-Bus connection not available. Polkit is disabled and only root will be authorized.";
-        priv->auth_polkit_mode = NM_AUTH_POLKIT_MODE_ROOT_ONLY;
-        goto out;
-    }
-
-    priv->main_cancellable = g_cancellable_new();
-
-    priv->name_owner_changed_id =
-        nm_dbus_connection_signal_subscribe_name_owner_changed(priv->dbus_connection,
-                                                               POLKIT_SERVICE,
-                                                               _name_owner_changed_cb,
-                                                               self,
-                                                               NULL);
-
-    priv->changed_id = g_dbus_connection_signal_subscribe(priv->dbus_connection,
-                                                          POLKIT_SERVICE,
-                                                          POLKIT_INTERFACE,
-                                                          "Changed",
-                                                          POLKIT_OBJECT_PATH,
-                                                          NULL,
-                                                          G_DBUS_SIGNAL_FLAGS_NONE,
-                                                          changed_signal_cb,
-                                                          self,
-                                                          NULL);
-
-    nm_dbus_connection_call_get_name_owner(priv->dbus_connection,
-                                           POLKIT_SERVICE,
-                                           -1,
-                                           priv->main_cancellable,
-                                           _name_owner_get_cb,
-                                           self);
-
-    create_message = "polkit enabled";
-
-out:
-    _NMLOG(logl, "create auth-manager: %s", create_message);
-}
-
-NMAuthManager *
-nm_auth_manager_setup(NMAuthPolkitMode auth_polkit_mode)
-{
-    NMAuthManager *self;
-
-    g_return_val_if_fail(!singleton_instance, singleton_instance);
-    nm_assert(NM_IN_SET(auth_polkit_mode,
-                        NM_AUTH_POLKIT_MODE_ROOT_ONLY,
-                        NM_AUTH_POLKIT_MODE_ALLOW_ALL,
-                        NM_AUTH_POLKIT_MODE_USE_POLKIT));
-
-    self = g_object_new(NM_TYPE_AUTH_MANAGER,
-                        NM_AUTH_MANAGER_POLKIT_ENABLED,
-                        (int) auth_polkit_mode,
-                        NULL);
-    _LOGD("set instance");
-
-    singleton_instance = self;
-    nm_singleton_instance_register();
-
-    nm_log_dbg(LOGD_CORE,
-               "setup %s singleton (" NM_HASH_OBFUSCATE_PTR_FMT ")",
-               "NMAuthManager",
-               NM_HASH_OBFUSCATE_PTR(singleton_instance));
-
-    return self;
-}
-
-static void
-dispose(GObject *object)
-{
-    NMAuthManager *       self = NM_AUTH_MANAGER(object);
-    NMAuthManagerPrivate *priv = NM_AUTH_MANAGER_GET_PRIVATE(self);
-
-    _LOGD("dispose");
-
-    nm_assert(c_list_is_empty(&priv->calls_lst_head));
-
-    priv->disposing = TRUE;
-
-    nm_clear_g_cancellable(&priv->main_cancellable);
-
-    nm_clear_g_dbus_connection_signal(priv->dbus_connection, &priv->name_owner_changed_id);
-
-    nm_clear_g_dbus_connection_signal(priv->dbus_connection, &priv->changed_id);
-
-    G_OBJECT_CLASS(nm_auth_manager_parent_class)->dispose(object);
-
-    g_clear_object(&priv->dbus_connection);
-
-    nm_clear_g_free(&priv->name_owner);
-}
-
-static void
-nm_auth_manager_class_init(NMAuthManagerClass *klass)
-{
-    GObjectClass *object_class = G_OBJECT_CLASS(klass);
-
-    object_class->set_property = set_property;
-    object_class->constructed  = constructed;
-    object_class->dispose      = dispose;
-
-    obj_properties[PROP_POLKIT_ENABLED] =
-        g_param_spec_int(NM_AUTH_MANAGER_POLKIT_ENABLED,
-                         "",
-                         "",
-                         NM_AUTH_POLKIT_MODE_ROOT_ONLY,
-                         NM_AUTH_POLKIT_MODE_USE_POLKIT,
-                         NM_AUTH_POLKIT_MODE_USE_POLKIT,
-                         G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
-
-    g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
-
-    signals[CHANGED_SIGNAL] = g_signal_new(NM_AUTH_MANAGER_SIGNAL_CHANGED,
-                                           NM_TYPE_AUTH_MANAGER,
-                                           G_SIGNAL_RUN_LAST,
-                                           0,
-                                           NULL,
-                                           NULL,
-                                           g_cclosure_marshal_VOID__VOID,
-                                           G_TYPE_NONE,
-                                           0);
-}