Blame libnm/tests/test-secret-agent.c

Packit Service a1bd4f
/* SPDX-License-Identifier: GPL-2.0+ */
Packit 5756e2
/*
Packit 5756e2
 * Copyright (C) 2010 - 2014 Red Hat, Inc.
Packit 5756e2
 */
Packit 5756e2
Packit 5756e2
#include "nm-default.h"
Packit 5756e2
Packit 5756e2
#include <sys/types.h>
Packit 5756e2
#include <signal.h>
Packit 5756e2
Packit 5756e2
#include "nm-secret-agent-old.h"
Packit 5756e2
Packit 5756e2
#include "nm-test-libnm-utils.h"
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
enum {
Packit Service a1bd4f
    SECRET_REQUESTED,
Packit Service a1bd4f
    LAST_SIGNAL,
Packit 5756e2
};
Packit 5756e2
Packit Service a1bd4f
static guint signals[LAST_SIGNAL] = {0};
Packit 5756e2
Packit 5756e2
typedef NMSecretAgentOld      TestSecretAgent;
Packit 5756e2
typedef NMSecretAgentOldClass TestSecretAgentClass;
Packit 5756e2
Packit Service a1bd4f
GType test_secret_agent_get_type(void);
Packit 5756e2
Packit Service a1bd4f
G_DEFINE_TYPE(TestSecretAgent, test_secret_agent, NM_TYPE_SECRET_AGENT_OLD)
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_get_secrets(NMSecretAgentOld *             agent,
Packit Service a1bd4f
                              NMConnection *                 connection,
Packit Service a1bd4f
                              const char *                   connection_path,
Packit Service a1bd4f
                              const char *                   setting_name,
Packit Service a1bd4f
                              const char **                  hints,
Packit Service a1bd4f
                              NMSecretAgentGetSecretsFlags   flags,
Packit Service a1bd4f
                              NMSecretAgentOldGetSecretsFunc callback,
Packit Service a1bd4f
                              gpointer                       callback_data)
Packit 5756e2
{
Packit Service a1bd4f
    NMSettingWirelessSecurity *s_wsec;
Packit Service a1bd4f
    GVariant *                 secrets = NULL;
Packit Service a1bd4f
    GVariantBuilder            secrets_builder, setting_builder;
Packit Service a1bd4f
    char *                     secret = NULL;
Packit Service a1bd4f
    GError *                   error  = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert_cmpstr(setting_name, ==, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME);
Packit Service a1bd4f
Packit Service a1bd4f
    s_wsec = nm_connection_get_setting_wireless_security(connection);
Packit Service a1bd4f
    g_assert(s_wsec);
Packit Service a1bd4f
    g_assert_cmpstr(nm_setting_wireless_security_get_key_mgmt(s_wsec), ==, "wpa-psk");
Packit Service a1bd4f
    g_assert_cmpstr(nm_setting_wireless_security_get_psk(s_wsec), ==, NULL);
Packit Service a1bd4f
Packit Service a1bd4f
    g_signal_emit(agent,
Packit Service a1bd4f
                  signals[SECRET_REQUESTED],
Packit Service a1bd4f
                  0,
Packit Service a1bd4f
                  connection,
Packit Service a1bd4f
                  connection_path,
Packit Service a1bd4f
                  NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
Packit Service a1bd4f
                  NM_SETTING_WIRELESS_SECURITY_PSK,
Packit Service a1bd4f
                  &secret);
Packit Service a1bd4f
Packit Service a1bd4f
    if (!secret) {
Packit Service a1bd4f
        error = g_error_new(NM_SECRET_AGENT_ERROR, NM_SECRET_AGENT_ERROR_NO_SECRETS, "No secrets");
Packit Service a1bd4f
        goto done;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (!strcmp(secret, "CANCEL")) {
Packit Service a1bd4f
        error = g_error_new(NM_SECRET_AGENT_ERROR,
Packit Service a1bd4f
                            NM_SECRET_AGENT_ERROR_USER_CANCELED,
Packit Service a1bd4f
                            "User canceled");
Packit Service a1bd4f
        goto done;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    g_variant_builder_init(&setting_builder, NM_VARIANT_TYPE_SETTING);
Packit Service a1bd4f
    g_variant_builder_add(&setting_builder,
Packit Service a1bd4f
                          "{sv}",
Packit Service a1bd4f
                          NM_SETTING_WIRELESS_SECURITY_PSK,
Packit Service a1bd4f
                          g_variant_new_string(secret));
Packit Service a1bd4f
Packit Service a1bd4f
    g_variant_builder_init(&secrets_builder, NM_VARIANT_TYPE_CONNECTION);
Packit Service a1bd4f
    g_variant_builder_add(&secrets_builder, "{sa{sv}}", setting_name, &setting_builder);
Packit Service a1bd4f
    secrets = g_variant_ref_sink(g_variant_builder_end(&secrets_builder));
Packit 5756e2
Packit 5756e2
done:
Packit Service a1bd4f
    callback(agent, connection, secrets, error, callback_data);
Packit Service a1bd4f
    g_clear_error(&error);
Packit Service a1bd4f
    nm_clear_pointer(&secrets, g_variant_unref);
Packit Service a1bd4f
    g_free(secret);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_cancel_get_secrets(NMSecretAgentOld *agent,
Packit Service a1bd4f
                                     const char *      connection_path,
Packit Service a1bd4f
                                     const char *      setting_name)
Packit 5756e2
{
Packit Service a1bd4f
    g_assert_not_reached();
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_save_secrets(NMSecretAgentOld *              agent,
Packit Service a1bd4f
                               NMConnection *                  connection,
Packit Service a1bd4f
                               const char *                    connection_path,
Packit Service a1bd4f
                               NMSecretAgentOldSaveSecretsFunc callback,
Packit Service a1bd4f
                               gpointer                        callback_data)
Packit 5756e2
{
Packit Service a1bd4f
    g_assert_not_reached();
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_delete_secrets(NMSecretAgentOld *                agent,
Packit Service a1bd4f
                                 NMConnection *                    connection,
Packit Service a1bd4f
                                 const char *                      connection_path,
Packit Service a1bd4f
                                 NMSecretAgentOldDeleteSecretsFunc callback,
Packit Service a1bd4f
                                 gpointer                          callback_data)
Packit 5756e2
{
Packit Service a1bd4f
    g_assert_not_reached();
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_init(TestSecretAgent *agent)
Packit Service a1bd4f
{}
Packit 5756e2
Packit 5756e2
static NMSecretAgentOld *
Packit Service a1bd4f
test_secret_agent_new(gboolean auto_register)
Packit 5756e2
{
Packit Service a1bd4f
    return nmtstc_context_object_new(test_secret_agent_get_type(),
Packit Service a1bd4f
                                     TRUE,
Packit Service a1bd4f
                                     NM_SECRET_AGENT_OLD_IDENTIFIER,
Packit Service a1bd4f
                                     "test-secret-agent",
Packit Service a1bd4f
                                     NM_SECRET_AGENT_OLD_AUTO_REGISTER,
Packit Service a1bd4f
                                     auto_register,
Packit Service a1bd4f
                                     NULL);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_class_init(TestSecretAgentClass *klass)
Packit 5756e2
{
Packit Service a1bd4f
    GObjectClass *         object_class = G_OBJECT_CLASS(klass);
Packit Service a1bd4f
    NMSecretAgentOldClass *agent_class  = NM_SECRET_AGENT_OLD_CLASS(klass);
Packit Service a1bd4f
Packit Service a1bd4f
    agent_class->get_secrets        = test_secret_agent_get_secrets;
Packit Service a1bd4f
    agent_class->cancel_get_secrets = test_secret_agent_cancel_get_secrets;
Packit Service a1bd4f
    agent_class->save_secrets       = test_secret_agent_save_secrets;
Packit Service a1bd4f
    agent_class->delete_secrets     = test_secret_agent_delete_secrets;
Packit Service a1bd4f
Packit Service a1bd4f
    signals[SECRET_REQUESTED] = g_signal_new("secret-requested",
Packit Service a1bd4f
                                             G_OBJECT_CLASS_TYPE(object_class),
Packit Service a1bd4f
                                             G_SIGNAL_RUN_LAST,
Packit Service a1bd4f
                                             0,
Packit Service a1bd4f
                                             NULL,
Packit Service a1bd4f
                                             NULL,
Packit Service a1bd4f
                                             NULL,
Packit Service a1bd4f
                                             G_TYPE_STRING,
Packit Service a1bd4f
                                             4,
Packit Service a1bd4f
                                             NM_TYPE_CONNECTION,
Packit Service a1bd4f
                                             G_TYPE_STRING,
Packit Service a1bd4f
                                             G_TYPE_STRING,
Packit Service a1bd4f
                                             G_TYPE_STRING);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
typedef struct {
Packit Service a1bd4f
    NMTstcServiceInfo *sinfo;
Packit Service a1bd4f
    NMClient *         client;
Packit 5756e2
Packit Service a1bd4f
    NMSecretAgentOld *agent;
Packit Service a1bd4f
    NMDevice *        device;
Packit Service a1bd4f
    NMConnection *    connection;
Packit 5756e2
Packit Service a1bd4f
    GMainLoop *loop;
Packit Service a1bd4f
    GSource *  timeout_source;
Packit 5756e2
Packit Service a1bd4f
    char *ifname;
Packit Service a1bd4f
    char *con_id;
Packit 5756e2
Packit Service a1bd4f
    int secrets_requested;
Packit 5756e2
} TestSecretAgentData;
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
connection_added_cb(GObject *s, GAsyncResult *result, gpointer user_data)
Packit 5756e2
{
Packit Service a1bd4f
    TestSecretAgentData *sadata = user_data;
Packit Service a1bd4f
    NMRemoteConnection * connection;
Packit Service a1bd4f
    GError *             error = NULL;
Packit 5756e2
Packit Service a1bd4f
    connection = nm_client_add_connection_finish(sadata->client, result, &error);
Packit 5756e2
Packit Service a1bd4f
    g_assert_no_error(error);
Packit Service a1bd4f
    g_assert_cmpstr(nm_connection_get_id(NM_CONNECTION(connection)), ==, sadata->con_id);
Packit 5756e2
Packit Service a1bd4f
    sadata->connection = NM_CONNECTION(connection);
Packit Service a1bd4f
    g_main_loop_quit(sadata->loop);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
register_cb(GObject *object, GAsyncResult *result, gpointer user_data)
Packit 5756e2
{
Packit Service a1bd4f
    TestSecretAgentData *sadata = user_data;
Packit Service a1bd4f
    GError *             error  = NULL;
Packit 5756e2
Packit Service a1bd4f
    nm_secret_agent_old_register_finish(sadata->agent, result, &error);
Packit Service a1bd4f
    g_assert_no_error(error);
Packit Service a1bd4f
    g_assert(nm_secret_agent_old_get_registered(sadata->agent));
Packit 5756e2
Packit Service a1bd4f
    g_main_loop_quit(sadata->loop);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
#define TEST_CON_ID_PREFIX "test-secret-agent"
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_setup(TestSecretAgentData *sadata, gconstpointer test_data)
Packit 5756e2
{
Packit Service a1bd4f
    static int           static_counter = 0;
Packit Service a1bd4f
    const int            counter        = static_counter++;
Packit Service a1bd4f
    const char *         create_agent   = test_data;
Packit Service a1bd4f
    NMConnection *       connection;
Packit Service a1bd4f
    NMSettingConnection *s_con;
Packit Service a1bd4f
    NMSettingWireless *  s_wireless;
Packit Service a1bd4f
    GBytes *             ssid;
Packit Service a1bd4f
    NMSetting *          s_wsec;
Packit Service a1bd4f
    gs_free_error GError *error = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
    sadata->sinfo = nmtstc_service_init();
Packit Service a1bd4f
    if (!sadata->sinfo)
Packit Service a1bd4f
        return;
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert(nm_g_main_context_is_thread_default(NULL));
Packit Service a1bd4f
Packit Service a1bd4f
    sadata->client = nmtstc_client_new(TRUE);
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert(nm_g_main_context_is_thread_default(NULL));
Packit Service a1bd4f
    g_assert(nm_g_main_context_is_thread_default(nm_client_get_main_context(sadata->client)));
Packit Service a1bd4f
Packit Service a1bd4f
    sadata->loop = g_main_loop_new(NULL, FALSE);
Packit Service a1bd4f
Packit Service a1bd4f
    sadata->timeout_source = g_timeout_source_new_seconds(5);
Packit Service a1bd4f
    g_source_set_callback(sadata->timeout_source, nmtst_g_source_assert_not_called, NULL, NULL);
Packit Service a1bd4f
    g_source_attach(sadata->timeout_source, NULL);
Packit Service a1bd4f
Packit Service a1bd4f
    sadata->ifname = g_strdup_printf("wlan%d", counter);
Packit Service a1bd4f
    sadata->con_id = g_strdup_printf("%s-%d", TEST_CON_ID_PREFIX, counter);
Packit Service a1bd4f
Packit Service a1bd4f
    sadata->device =
Packit Service a1bd4f
        nmtstc_service_add_device(sadata->sinfo, sadata->client, "AddWifiDevice", sadata->ifname);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Create the connection */
Packit Service a1bd4f
    connection = nmtst_create_minimal_connection(sadata->con_id,
Packit Service a1bd4f
                                                 NULL,
Packit Service a1bd4f
                                                 NM_SETTING_WIRELESS_SETTING_NAME,
Packit Service a1bd4f
                                                 &s_con);
Packit Service a1bd4f
    g_object_set(s_con, NM_SETTING_CONNECTION_INTERFACE_NAME, sadata->ifname, NULL);
Packit Service a1bd4f
Packit Service a1bd4f
    s_wireless = nm_connection_get_setting_wireless(connection);
Packit Service a1bd4f
    ssid       = g_bytes_new("foo", 3);
Packit Service a1bd4f
    g_object_set(s_wireless, NM_SETTING_WIRELESS_SSID, ssid, NULL);
Packit Service a1bd4f
    g_bytes_unref(ssid);
Packit Service a1bd4f
Packit Service a1bd4f
    s_wsec = g_object_new(NM_TYPE_SETTING_WIRELESS_SECURITY,
Packit Service a1bd4f
                          NM_SETTING_WIRELESS_SECURITY_KEY_MGMT,
Packit Service a1bd4f
                          "wpa-psk",
Packit Service a1bd4f
                          NULL);
Packit Service a1bd4f
    nm_connection_add_setting(connection, s_wsec);
Packit Service a1bd4f
Packit Service a1bd4f
    nm_client_add_connection_async(sadata->client,
Packit Service a1bd4f
                                   connection,
Packit Service a1bd4f
                                   TRUE,
Packit Service a1bd4f
                                   NULL,
Packit Service a1bd4f
                                   connection_added_cb,
Packit Service a1bd4f
                                   sadata);
Packit Service a1bd4f
    g_object_unref(connection);
Packit Service a1bd4f
Packit Service a1bd4f
    g_main_loop_run(sadata->loop);
Packit Service a1bd4f
    g_assert(sadata->connection);
Packit Service a1bd4f
Packit Service a1bd4f
    if (nm_streq(create_agent, "1")) {
Packit Service a1bd4f
        gboolean auto_register = nmtst_get_rand_bool();
Packit Service a1bd4f
Packit Service a1bd4f
        sadata->agent = test_secret_agent_new(auto_register);
Packit Service a1bd4f
Packit Service a1bd4f
        if (auto_register) {
Packit Service a1bd4f
            g_assert(nm_secret_agent_old_get_registered(sadata->agent));
Packit Service a1bd4f
            nm_secret_agent_old_register(sadata->agent, NULL, &error);
Packit Service a1bd4f
            g_assert_no_error(error);
Packit Service a1bd4f
        } else {
Packit Service a1bd4f
            g_assert(!nm_secret_agent_old_get_registered(sadata->agent));
Packit Service a1bd4f
            nm_secret_agent_old_register_async(sadata->agent, NULL, register_cb, sadata);
Packit Service a1bd4f
            g_main_loop_run(sadata->loop);
Packit Service a1bd4f
        }
Packit Service a1bd4f
Packit Service a1bd4f
        g_assert(nm_secret_agent_old_get_registered(sadata->agent));
Packit Service a1bd4f
    }
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_cleanup(TestSecretAgentData *sadata, gconstpointer test_data)
Packit 5756e2
{
Packit Service a1bd4f
    GVariant *                  ret;
Packit Service a1bd4f
    GError *                    error        = NULL;
Packit Service a1bd4f
    NMTstContextBusyWatcherData watcher_data = {};
Packit 5756e2
Packit Service a1bd4f
    g_assert(nm_g_main_context_is_thread_default(NULL));
Packit 5756e2
Packit Service a1bd4f
    if (!sadata->sinfo)
Packit Service a1bd4f
        return;
Packit 5756e2
Packit Service a1bd4f
    g_assert(nm_g_main_context_is_thread_default(nm_client_get_main_context(sadata->client)));
Packit 5756e2
Packit Service a1bd4f
    nmtst_context_busy_watcher_add(&watcher_data,
Packit Service a1bd4f
                                   nm_client_get_context_busy_watcher(sadata->client));
Packit 5756e2
Packit Service a1bd4f
    if (sadata->agent) {
Packit Service a1bd4f
        nmtst_context_busy_watcher_add(&watcher_data,
Packit Service a1bd4f
                                       nm_secret_agent_old_get_context_busy_watcher(sadata->agent));
Packit 5756e2
Packit Service a1bd4f
        if (nm_secret_agent_old_get_registered(sadata->agent)) {
Packit Service a1bd4f
            nm_secret_agent_old_unregister(sadata->agent, NULL, &error);
Packit Service a1bd4f
            g_assert_no_error(error);
Packit Service a1bd4f
        }
Packit Service a1bd4f
        g_object_unref(sadata->agent);
Packit Service a1bd4f
    }
Packit 5756e2
Packit Service a1bd4f
    ret =
Packit Service a1bd4f
        g_dbus_proxy_call_sync(sadata->sinfo->proxy,
Packit Service a1bd4f
                               "RemoveDevice",
Packit Service a1bd4f
                               g_variant_new("(s)", nm_object_get_path(NM_OBJECT(sadata->device))),
Packit Service a1bd4f
                               G_DBUS_CALL_FLAGS_NO_AUTO_START,
Packit Service a1bd4f
                               3000,
Packit Service a1bd4f
                               NULL,
Packit Service a1bd4f
                               &error);
Packit Service a1bd4f
    g_assert_no_error(error);
Packit Service a1bd4f
    g_variant_unref(ret);
Packit 5756e2
Packit Service a1bd4f
    g_object_unref(sadata->connection);
Packit Service a1bd4f
    g_object_unref(sadata->client);
Packit 5756e2
Packit Service a1bd4f
    nmtstc_service_cleanup(sadata->sinfo);
Packit 5756e2
Packit Service a1bd4f
    nm_clear_g_source_inst(&sadata->timeout_source);
Packit 5756e2
Packit Service a1bd4f
    g_main_loop_unref(sadata->loop);
Packit 5756e2
Packit Service a1bd4f
    g_free(sadata->ifname);
Packit Service a1bd4f
    g_free(sadata->con_id);
Packit 5756e2
Packit Service a1bd4f
    *sadata = (TestSecretAgentData){};
Packit 5756e2
Packit Service a1bd4f
    nmtst_context_busy_watcher_wait(&watcher_data);
Packit 5756e2
Packit Service a1bd4f
    while (g_main_context_iteration(NULL, FALSE)) {}
Packit 5756e2
Packit Service a1bd4f
    nmtst_main_context_assert_no_dispatch(NULL, nmtst_get_rand_uint32() % 500);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
connection_activated_none_cb(GObject *c, GAsyncResult *result, gpointer user_data)
Packit 5756e2
{
Packit Service a1bd4f
    TestSecretAgentData *sadata = user_data;
Packit Service a1bd4f
    gs_free_error GError *error = NULL;
Packit 5756e2
Packit Service a1bd4f
    nm_client_activate_connection_finish(sadata->client, result, &error);
Packit Service a1bd4f
    g_assert_error(error, NM_AGENT_MANAGER_ERROR, NM_AGENT_MANAGER_ERROR_NO_SECRETS);
Packit 5756e2
Packit Service a1bd4f
    g_main_loop_quit(sadata->loop);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_none(TestSecretAgentData *sadata, gconstpointer test_data)
Packit 5756e2
{
Packit Service a1bd4f
    if (!nmtstc_service_available(sadata->sinfo))
Packit Service a1bd4f
        return;
Packit Service a1bd4f
Packit Service a1bd4f
    nm_client_activate_connection_async(sadata->client,
Packit Service a1bd4f
                                        sadata->connection,
Packit Service a1bd4f
                                        sadata->device,
Packit Service a1bd4f
                                        NULL,
Packit Service a1bd4f
                                        NULL,
Packit Service a1bd4f
                                        connection_activated_none_cb,
Packit Service a1bd4f
                                        sadata);
Packit Service a1bd4f
    g_main_loop_run(sadata->loop);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
static char *
Packit Service a1bd4f
secrets_requested_no_secrets_cb(TestSecretAgent *agent,
Packit Service a1bd4f
                                NMConnection *   connection,
Packit Service a1bd4f
                                const char *     connection_path,
Packit Service a1bd4f
                                const char *     setting_name,
Packit Service a1bd4f
                                const char *     secret_name,
Packit Service a1bd4f
                                gpointer         user_data)
Packit 5756e2
{
Packit Service a1bd4f
    TestSecretAgentData *sadata = user_data;
Packit 5756e2
Packit Service a1bd4f
    g_assert_cmpstr(connection_path, ==, nm_connection_get_path(sadata->connection));
Packit Service a1bd4f
    sadata->secrets_requested++;
Packit 5756e2
Packit Service a1bd4f
    return NULL;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
connection_activated_no_secrets_cb(GObject *c, GAsyncResult *result, gpointer user_data)
Packit 5756e2
{
Packit Service a1bd4f
    TestSecretAgentData *sadata            = user_data;
Packit Service a1bd4f
    gs_unref_object NMActiveConnection *ac = NULL;
Packit Service a1bd4f
    gs_free_error GError *error            = NULL;
Packit 5756e2
Packit Service a1bd4f
    ac = nm_client_activate_connection_finish(sadata->client, result, &error);
Packit Service a1bd4f
    g_assert_error(error, NM_AGENT_MANAGER_ERROR, NM_AGENT_MANAGER_ERROR_NO_SECRETS);
Packit Service a1bd4f
    g_main_loop_quit(sadata->loop);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_no_secrets(TestSecretAgentData *sadata, gconstpointer test_data)
Packit 5756e2
{
Packit Service a1bd4f
    if (!nmtstc_service_available(sadata->sinfo))
Packit Service a1bd4f
        return;
Packit Service a1bd4f
Packit Service a1bd4f
    g_signal_connect(sadata->agent,
Packit Service a1bd4f
                     "secret-requested",
Packit Service a1bd4f
                     G_CALLBACK(secrets_requested_no_secrets_cb),
Packit Service a1bd4f
                     sadata);
Packit Service a1bd4f
Packit Service a1bd4f
    nm_client_activate_connection_async(sadata->client,
Packit Service a1bd4f
                                        sadata->connection,
Packit Service a1bd4f
                                        sadata->device,
Packit Service a1bd4f
                                        NULL,
Packit Service a1bd4f
                                        NULL,
Packit Service a1bd4f
                                        connection_activated_no_secrets_cb,
Packit Service a1bd4f
                                        sadata);
Packit Service a1bd4f
    g_main_loop_run(sadata->loop);
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert_cmpint(sadata->secrets_requested, ==, 1);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
connection_activated_cancel_cb(GObject *c, GAsyncResult *result, gpointer user_data)
Packit 5756e2
{
Packit Service a1bd4f
    TestSecretAgentData *sadata            = user_data;
Packit Service a1bd4f
    gs_unref_object NMActiveConnection *ac = NULL;
Packit Service a1bd4f
    gs_free_error GError *error            = NULL;
Packit 5756e2
Packit Service a1bd4f
    ac = nm_client_activate_connection_finish(sadata->client, result, &error);
Packit Service a1bd4f
    g_assert_error(error, NM_AGENT_MANAGER_ERROR, NM_AGENT_MANAGER_ERROR_USER_CANCELED);
Packit Service a1bd4f
    g_main_loop_quit(sadata->loop);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static char *
Packit Service a1bd4f
secrets_requested_cancel_cb(TestSecretAgent *agent,
Packit Service a1bd4f
                            NMConnection *   connection,
Packit Service a1bd4f
                            const char *     connection_path,
Packit Service a1bd4f
                            const char *     setting_name,
Packit Service a1bd4f
                            const char *     secret_name,
Packit Service a1bd4f
                            gpointer         user_data)
Packit 5756e2
{
Packit Service a1bd4f
    TestSecretAgentData *sadata = user_data;
Packit 5756e2
Packit Service a1bd4f
    g_assert_cmpstr(connection_path, ==, nm_connection_get_path(sadata->connection));
Packit Service a1bd4f
    sadata->secrets_requested++;
Packit 5756e2
Packit Service a1bd4f
    return g_strdup("CANCEL");
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_cancel(TestSecretAgentData *sadata, gconstpointer test_data)
Packit 5756e2
{
Packit Service a1bd4f
    if (!nmtstc_service_available(sadata->sinfo))
Packit Service a1bd4f
        return;
Packit Service a1bd4f
Packit Service a1bd4f
    g_signal_connect(sadata->agent,
Packit Service a1bd4f
                     "secret-requested",
Packit Service a1bd4f
                     G_CALLBACK(secrets_requested_cancel_cb),
Packit Service a1bd4f
                     sadata);
Packit Service a1bd4f
Packit Service a1bd4f
    nm_client_activate_connection_async(sadata->client,
Packit Service a1bd4f
                                        sadata->connection,
Packit Service a1bd4f
                                        sadata->device,
Packit Service a1bd4f
                                        NULL,
Packit Service a1bd4f
                                        NULL,
Packit Service a1bd4f
                                        connection_activated_cancel_cb,
Packit Service a1bd4f
                                        sadata);
Packit Service a1bd4f
    g_main_loop_run(sadata->loop);
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert_cmpint(sadata->secrets_requested, ==, 1);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
connection_activated_good_cb(GObject *c, GAsyncResult *result, gpointer user_data)
Packit 5756e2
{
Packit Service a1bd4f
    TestSecretAgentData *sadata = user_data;
Packit Service a1bd4f
    NMActiveConnection * ac;
Packit Service a1bd4f
    GError *             error = NULL;
Packit 5756e2
Packit Service a1bd4f
    ac = nm_client_activate_connection_finish(sadata->client, result, &error);
Packit Service a1bd4f
    g_assert_no_error(error);
Packit 5756e2
Packit Service a1bd4f
    g_object_unref(ac);
Packit 5756e2
Packit Service a1bd4f
    g_main_loop_quit(sadata->loop);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static char *
Packit Service a1bd4f
secrets_requested_good_cb(TestSecretAgent *agent,
Packit Service a1bd4f
                          NMConnection *   connection,
Packit Service a1bd4f
                          const char *     connection_path,
Packit Service a1bd4f
                          const char *     setting_name,
Packit Service a1bd4f
                          const char *     secret_name,
Packit Service a1bd4f
                          gpointer         user_data)
Packit 5756e2
{
Packit Service a1bd4f
    TestSecretAgentData *sadata = user_data;
Packit 5756e2
Packit Service a1bd4f
    g_assert_cmpstr(connection_path, ==, nm_connection_get_path(sadata->connection));
Packit Service a1bd4f
    sadata->secrets_requested++;
Packit 5756e2
Packit Service a1bd4f
    return g_strdup("password");
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_good(TestSecretAgentData *sadata, gconstpointer test_data)
Packit 5756e2
{
Packit Service a1bd4f
    if (!nmtstc_service_available(sadata->sinfo))
Packit Service a1bd4f
        return;
Packit Service a1bd4f
Packit Service a1bd4f
    g_signal_connect(sadata->agent,
Packit Service a1bd4f
                     "secret-requested",
Packit Service a1bd4f
                     G_CALLBACK(secrets_requested_good_cb),
Packit Service a1bd4f
                     sadata);
Packit Service a1bd4f
Packit Service a1bd4f
    nm_client_activate_connection_async(sadata->client,
Packit Service a1bd4f
                                        sadata->connection,
Packit Service a1bd4f
                                        sadata->device,
Packit Service a1bd4f
                                        NULL,
Packit Service a1bd4f
                                        NULL,
Packit Service a1bd4f
                                        connection_activated_good_cb,
Packit Service a1bd4f
                                        sadata);
Packit Service a1bd4f
    g_main_loop_run(sadata->loop);
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert_cmpint(sadata->secrets_requested, ==, 1);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
async_init_cb(GObject *object, GAsyncResult *result, gpointer user_data)
Packit 5756e2
{
Packit Service a1bd4f
    GMainLoop *   loop             = user_data;
Packit Service a1bd4f
    gs_free_error GError *error    = NULL;
Packit Service a1bd4f
    gs_unref_object GObject *agent = NULL;
Packit 5756e2
Packit Service a1bd4f
    agent = g_async_initable_new_finish(G_ASYNC_INITABLE(object), result, &error);
Packit Service a1bd4f
    nmtst_assert_success(NM_IS_SECRET_AGENT_OLD(agent), error);
Packit Service a1bd4f
    g_assert(!nm_secret_agent_old_get_registered(NM_SECRET_AGENT_OLD(agent)));
Packit 5756e2
Packit Service a1bd4f
    g_main_loop_quit(loop);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_nm_not_running(void)
Packit 5756e2
{
Packit Service a1bd4f
    gs_unref_object NMSecretAgentOld *agent  = NULL;
Packit Service a1bd4f
    nm_auto_unref_gmainloop GMainLoop *loop  = NULL;
Packit Service a1bd4f
    GError *                           error = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
    agent = g_initable_new(test_secret_agent_get_type(),
Packit Service a1bd4f
                           NULL,
Packit Service a1bd4f
                           &error,
Packit Service a1bd4f
                           NM_SECRET_AGENT_OLD_IDENTIFIER,
Packit Service a1bd4f
                           "test-secret-agent",
Packit Service a1bd4f
                           NULL);
Packit Service a1bd4f
    nmtst_assert_success(NM_IS_SECRET_AGENT_OLD(agent), error);
Packit Service a1bd4f
    g_assert(!nm_secret_agent_old_get_registered(agent));
Packit Service a1bd4f
    g_clear_object(&agent);
Packit Service a1bd4f
Packit Service a1bd4f
    loop = g_main_loop_new(NULL, FALSE);
Packit Service a1bd4f
    g_async_initable_new_async(test_secret_agent_get_type(),
Packit Service a1bd4f
                               G_PRIORITY_DEFAULT,
Packit Service a1bd4f
                               NULL,
Packit Service a1bd4f
                               async_init_cb,
Packit Service a1bd4f
                               loop,
Packit Service a1bd4f
                               NM_SECRET_AGENT_OLD_IDENTIFIER,
Packit Service a1bd4f
                               "test-secret-agent",
Packit Service a1bd4f
                               NULL);
Packit Service a1bd4f
    g_main_loop_run(loop);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
typedef struct {
Packit Service a1bd4f
    int step;
Packit Service a1bd4f
    int invoke_count;
Packit 5756e2
} AutoRegisterData;
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
registered_changed(GObject *object, GParamSpec *pspec, gpointer user_data)
Packit 5756e2
{
Packit Service a1bd4f
    NMSecretAgentOld *agent = NM_SECRET_AGENT_OLD(object);
Packit Service a1bd4f
    AutoRegisterData *data  = user_data;
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert(data);
Packit Service a1bd4f
    g_assert(NM_IS_SECRET_AGENT_OLD(agent));
Packit Service a1bd4f
Packit Service a1bd4f
    data->invoke_count++;
Packit Service a1bd4f
    g_assert_cmpint(data->invoke_count, ==, data->step);
Packit Service a1bd4f
Packit Service a1bd4f
    switch (data->step) {
Packit Service a1bd4f
    case 1:
Packit Service a1bd4f
    case 3:
Packit Service a1bd4f
        g_assert(nm_secret_agent_old_get_registered(agent));
Packit Service a1bd4f
        break;
Packit Service a1bd4f
    case 2:
Packit Service a1bd4f
    case 4:
Packit Service a1bd4f
        g_assert(!nm_secret_agent_old_get_registered(agent));
Packit Service a1bd4f
        break;
Packit Service a1bd4f
    default:
Packit Service a1bd4f
        g_assert_not_reached();
Packit Service a1bd4f
    }
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_secret_agent_auto_register(void)
Packit 5756e2
{
Packit Service a1bd4f
    NMTstcServiceInfo *sinfo;
Packit Service a1bd4f
    gs_unref_object NMSecretAgentOld *agent              = NULL;
Packit Service a1bd4f
    GError *                          error              = NULL;
Packit Service a1bd4f
    AutoRegisterData                  auto_register_data = {
Packit Service a1bd4f
        .step         = 0,
Packit Service a1bd4f
        .invoke_count = 0,
Packit Service a1bd4f
    };
Packit Service a1bd4f
    gulong                      signal_id;
Packit Service a1bd4f
    NMTstContextBusyWatcherData watcher_data = {};
Packit 5756e2
Packit Service a1bd4f
    sinfo = nmtstc_service_init();
Packit Service a1bd4f
    if (!nmtstc_service_available(sinfo))
Packit Service a1bd4f
        return;
Packit 5756e2
Packit Service a1bd4f
    agent = test_secret_agent_new(FALSE);
Packit Service a1bd4f
    g_assert(!nm_secret_agent_old_get_registered(agent));
Packit 5756e2
Packit Service a1bd4f
    signal_id = g_signal_connect(agent,
Packit Service a1bd4f
                                 "notify::" NM_SECRET_AGENT_OLD_REGISTERED,
Packit Service a1bd4f
                                 G_CALLBACK(registered_changed),
Packit Service a1bd4f
                                 &auto_register_data);
Packit 5756e2
Packit Service a1bd4f
    if (nmtst_get_rand_bool()) {
Packit Service a1bd4f
        g_object_set(agent, NM_SECRET_AGENT_OLD_AUTO_REGISTER, TRUE, NULL);
Packit Service a1bd4f
    } else
Packit Service a1bd4f
        nm_secret_agent_old_enable(agent, TRUE);
Packit Service a1bd4f
    g_assert(!nm_secret_agent_old_get_registered(agent));
Packit 5756e2
Packit Service a1bd4f
    nm_secret_agent_old_register(agent, NULL, &error);
Packit Service a1bd4f
    g_assert_no_error(error);
Packit Service a1bd4f
    g_assert(!nm_secret_agent_old_get_registered(agent));
Packit 5756e2
Packit Service a1bd4f
    auto_register_data.step = 1;
Packit Service a1bd4f
    nmtst_main_context_iterate_until_assert(NULL, 1000, nm_secret_agent_old_get_registered(agent));
Packit 5756e2
Packit Service a1bd4f
    auto_register_data.step = 2;
Packit Service a1bd4f
    nm_secret_agent_old_enable(agent, FALSE);
Packit Service a1bd4f
    g_assert(!nm_secret_agent_old_get_registered(agent));
Packit 5756e2
Packit Service a1bd4f
    nmtst_main_context_iterate_until(NULL, nmtst_get_rand_uint32() % 200, FALSE);
Packit 5756e2
Packit Service a1bd4f
    g_assert(!nm_secret_agent_old_get_registered(agent));
Packit 5756e2
Packit Service a1bd4f
    nmtstc_service_cleanup(sinfo);
Packit 5756e2
Packit Service a1bd4f
    g_assert(!nm_secret_agent_old_get_registered(agent));
Packit 5756e2
Packit Service a1bd4f
    nm_secret_agent_old_enable(agent, TRUE);
Packit 5756e2
Packit Service a1bd4f
    g_assert(!nm_secret_agent_old_get_registered(agent));
Packit 5756e2
Packit Service a1bd4f
    nmtst_main_context_iterate_until(NULL, nmtst_get_rand_uint32() % 200, FALSE);
Packit 5756e2
Packit Service a1bd4f
    g_assert(!nm_secret_agent_old_get_registered(agent));
Packit 5756e2
Packit Service a1bd4f
    sinfo = nmtstc_service_init();
Packit Service a1bd4f
    g_assert(nmtstc_service_available(sinfo));
Packit 5756e2
Packit Service a1bd4f
    auto_register_data.step = 3;
Packit Service a1bd4f
    nmtst_main_context_iterate_until_assert(NULL, 1000, nm_secret_agent_old_get_registered(agent));
Packit 5756e2
Packit Service a1bd4f
    nmtstc_service_cleanup(sinfo);
Packit 5756e2
Packit Service a1bd4f
    auto_register_data.step = 4;
Packit Service a1bd4f
    nmtst_main_context_iterate_until_assert(NULL, 1000, !nm_secret_agent_old_get_registered(agent));
Packit 5756e2
Packit Service a1bd4f
    nm_clear_g_signal_handler(agent, &signal_id);
Packit 5756e2
Packit Service a1bd4f
    nmtst_context_busy_watcher_add(&watcher_data,
Packit Service a1bd4f
                                   nm_secret_agent_old_get_context_busy_watcher(agent));
Packit 5756e2
Packit Service a1bd4f
    g_clear_object(&agent);
Packit 5756e2
Packit Service a1bd4f
    nmtst_context_busy_watcher_wait(&watcher_data);
Packit 5756e2
Packit Service a1bd4f
    nmtst_main_context_assert_no_dispatch(NULL, nmtst_get_rand_uint32() % 500);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit Service a1bd4f
NMTST_DEFINE();
Packit 5756e2
Packit 5756e2
int
Packit Service a1bd4f
main(int argc, char **argv)
Packit 5756e2
{
Packit Service a1bd4f
    g_setenv("LIBNM_USE_SESSION_BUS", "1", TRUE);
Packit Service a1bd4f
Packit Service a1bd4f
    nmtst_init(&argc, &argv, TRUE);
Packit Service a1bd4f
Packit Service a1bd4f
    g_test_add("/libnm/secret-agent/none",
Packit Service a1bd4f
               TestSecretAgentData,
Packit Service a1bd4f
               "0",
Packit Service a1bd4f
               test_setup,
Packit Service a1bd4f
               test_secret_agent_none,
Packit Service a1bd4f
               test_cleanup);
Packit Service a1bd4f
    g_test_add("/libnm/secret-agent/no-secrets",
Packit Service a1bd4f
               TestSecretAgentData,
Packit Service a1bd4f
               "1",
Packit Service a1bd4f
               test_setup,
Packit Service a1bd4f
               test_secret_agent_no_secrets,
Packit Service a1bd4f
               test_cleanup);
Packit Service a1bd4f
    g_test_add("/libnm/secret-agent/cancel",
Packit Service a1bd4f
               TestSecretAgentData,
Packit Service a1bd4f
               "1",
Packit Service a1bd4f
               test_setup,
Packit Service a1bd4f
               test_secret_agent_cancel,
Packit Service a1bd4f
               test_cleanup);
Packit Service a1bd4f
    g_test_add("/libnm/secret-agent/good",
Packit Service a1bd4f
               TestSecretAgentData,
Packit Service a1bd4f
               "1",
Packit Service a1bd4f
               test_setup,
Packit Service a1bd4f
               test_secret_agent_good,
Packit Service a1bd4f
               test_cleanup);
Packit Service a1bd4f
    g_test_add_func("/libnm/secret-agent/nm-not-running", test_secret_agent_nm_not_running);
Packit Service a1bd4f
    g_test_add_func("/libnm/secret-agent/auto-register", test_secret_agent_auto_register);
Packit Service a1bd4f
Packit Service a1bd4f
    return g_test_run();
Packit 5756e2
}