mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-18 15:40:30 +01:00
We don't need a separate "GSList *chains" to track the NMAuthChain
requests for the agents. Every agent should only have one auth-chain in
fly at any time. We can attach that NMAuthChain to the secret-agent.
Also, fix a race where:
1) A secret agent registers. We would start an auth-chain check, but not
yet track the secret agent.
2) Then the secret agent unregisters. The unregistration request will fail,
because the secret agent is not yet in the list of fully registered agents.
The same happens if the secret agent disconnects at this point.
agent_disconnect_cb() would not find the secret agent to remove.
3) afterwards, authentication completes and we register the
secret-agent, although we should not.
There is also another race: if we get authority_changed_cb() we would
not restart the authentication for the secret-agent that is still
registering. Hence, we don't know whether the result once it completes
would already contain the latest state.
96 lines
4.2 KiB
C
96 lines
4.2 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Copyright (C) 2010 - 2011 Red Hat, Inc.
|
|
*/
|
|
|
|
#ifndef __NETWORKMANAGER_SECRET_AGENT_H__
|
|
#define __NETWORKMANAGER_SECRET_AGENT_H__
|
|
|
|
#include "nm-connection.h"
|
|
|
|
#include "c-list/src/c-list.h"
|
|
|
|
#define NM_TYPE_SECRET_AGENT (nm_secret_agent_get_type ())
|
|
#define NM_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SECRET_AGENT, NMSecretAgent))
|
|
#define NM_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SECRET_AGENT, NMSecretAgentClass))
|
|
#define NM_IS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SECRET_AGENT))
|
|
#define NM_IS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SECRET_AGENT))
|
|
#define NM_SECRET_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SECRET_AGENT, NMSecretAgentClass))
|
|
|
|
#define NM_SECRET_AGENT_DISCONNECTED "disconnected"
|
|
|
|
typedef struct _NMSecretAgentClass NMSecretAgentClass;
|
|
typedef struct _NMSecretAgentCallId NMSecretAgentCallId;
|
|
|
|
struct _NMAuthChain;
|
|
struct _NMSecretAgentPrivate;
|
|
|
|
struct _NMSecretAgent {
|
|
GObject parent;
|
|
CList agent_lst;
|
|
struct _NMAuthChain *auth_chain;
|
|
struct _NMSecretAgentPrivate *_priv;
|
|
bool fully_registered:1;
|
|
};
|
|
|
|
GType nm_secret_agent_get_type (void);
|
|
|
|
NMSecretAgent *nm_secret_agent_new (GDBusMethodInvocation *context,
|
|
NMAuthSubject *subject,
|
|
const char *identifier,
|
|
NMSecretAgentCapabilities capabilities);
|
|
|
|
const char *nm_secret_agent_get_description (NMSecretAgent *agent);
|
|
|
|
const char *nm_secret_agent_get_dbus_owner (NMSecretAgent *agent);
|
|
|
|
const char *nm_secret_agent_get_identifier (NMSecretAgent *agent);
|
|
|
|
gulong nm_secret_agent_get_owner_uid (NMSecretAgent *agent);
|
|
|
|
const char *nm_secret_agent_get_owner_username (NMSecretAgent *agent);
|
|
|
|
gulong nm_secret_agent_get_pid (NMSecretAgent *agent);
|
|
|
|
NMSecretAgentCapabilities nm_secret_agent_get_capabilities (NMSecretAgent *agent);
|
|
|
|
NMAuthSubject *nm_secret_agent_get_subject (NMSecretAgent *agent);
|
|
|
|
void nm_secret_agent_add_permission (NMSecretAgent *agent,
|
|
const char *permission,
|
|
gboolean allowed);
|
|
|
|
gboolean nm_secret_agent_has_permission (NMSecretAgent *agent,
|
|
const char *permission);
|
|
|
|
typedef void (*NMSecretAgentCallback) (NMSecretAgent *agent,
|
|
NMSecretAgentCallId *call_id,
|
|
GVariant *new_secrets, /* NULL for save & delete */
|
|
GError *error,
|
|
gpointer user_data);
|
|
|
|
NMSecretAgentCallId *nm_secret_agent_get_secrets (NMSecretAgent *agent,
|
|
const char *path,
|
|
NMConnection *connection,
|
|
const char *setting_name,
|
|
const char **hints,
|
|
NMSecretAgentGetSecretsFlags flags,
|
|
NMSecretAgentCallback callback,
|
|
gpointer callback_data);
|
|
|
|
NMSecretAgentCallId *nm_secret_agent_save_secrets (NMSecretAgent *agent,
|
|
const char *path,
|
|
NMConnection *connection,
|
|
NMSecretAgentCallback callback,
|
|
gpointer callback_data);
|
|
|
|
NMSecretAgentCallId *nm_secret_agent_delete_secrets (NMSecretAgent *agent,
|
|
const char *path,
|
|
NMConnection *connection,
|
|
NMSecretAgentCallback callback,
|
|
gpointer callback_data);
|
|
|
|
void nm_secret_agent_cancel_call (NMSecretAgent *self,
|
|
NMSecretAgentCallId *call_id);
|
|
|
|
#endif /* __NETWORKMANAGER_SECRET_AGENT_H__ */
|