static void dispose (GObject *object) { NMActiveConnection *self = NM_ACTIVE_CONNECTION (object); NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self); _LOGD ("disposing"); if (priv->chain) { nm_auth_chain_unref (priv->chain); priv->chain = NULL; } g_free (priv->specific_object); priv->specific_object = NULL; _set_settings_connection (self, NULL); g_clear_object (&priv->applied_connection); _device_cleanup (self); if (priv->master) { g_signal_handlers_disconnect_by_func (priv->master, (GCallback) master_state_cb, self); } g_clear_object (&priv->master); if (priv->parent) unwatch_parent (self); g_clear_object (&priv->subject); G_OBJECT_CLASS (nm_active_connection_parent_class)->dispose (object); }
static void auth_done (NMAuthChain *chain, GError *error, GDBusMethodInvocation *unused, gpointer user_data) { NMActiveConnection *self = NM_ACTIVE_CONNECTION (user_data); NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self); NMAuthCallResult result; g_assert (priv->chain == chain); g_assert (priv->result_func != NULL); /* Must stay alive over the callback */ g_object_ref (self); if (error) { priv->result_func (self, FALSE, error->message, priv->user_data1, priv->user_data2); goto done; } /* Caller has had a chance to obtain authorization, so we only need to * check for 'yes' here. */ result = nm_auth_chain_get_result (chain, NM_AUTH_PERMISSION_NETWORK_CONTROL); if (result != NM_AUTH_CALL_RESULT_YES) { priv->result_func (self, FALSE, "Not authorized to control networking.", priv->user_data1, priv->user_data2); goto done; } if (priv->wifi_shared_permission) { result = nm_auth_chain_get_result (chain, priv->wifi_shared_permission); if (result != NM_AUTH_CALL_RESULT_YES) { priv->result_func (self, FALSE, "Not authorized to share connections via wifi.", priv->user_data1, priv->user_data2); goto done; } } /* Otherwise authorized and available to activate */ priv->result_func (self, TRUE, NULL, priv->user_data1, priv->user_data2); done: nm_auth_chain_unref (chain); priv->chain = NULL; priv->result_func = NULL; priv->user_data1 = NULL; priv->user_data2 = NULL; g_object_unref (self); }
static gboolean auth_chain_finish (gpointer user_data) { NMAuthChain *self = user_data; self->idle_id = 0; /* Ensure we say alive across the callback */ self->refcount++; self->done_func (self, self->error, self->context, self->user_data); nm_auth_chain_unref (self); return FALSE; }
static NMAuthChain * _auth_chain_new (NMAuthSubject *subject, const char *dbus_sender, gulong user_uid, DBusGMethodInvocation *context, NMAuthChainResultFunc done_func, gpointer user_data) { NMAuthChain *self; g_return_val_if_fail (subject || user_uid == 0 || dbus_sender, NULL); self = g_malloc0 (sizeof (NMAuthChain)); self->refcount = 1; #if WITH_POLKIT self->authority = pk_authority_get (&self->error); #endif self->data = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, free_data); self->done_func = done_func; self->user_data = user_data; self->context = context; if (subject) { self->user_uid = nm_auth_subject_get_uid (subject); self->subject = g_object_ref (subject); } else { self->user_uid = user_uid; self->owner = g_strdup (dbus_sender); if (user_uid > 0 && !self->owner) { /* Need an owner */ g_warn_if_fail (self->owner); nm_auth_chain_unref (self); self = NULL; } } return self; }