static void cockpit_authenticated_free (gpointer data) { CockpitAuthenticated *authenticated = data; GObject *object; if (authenticated->timeout_tag) g_source_remove (authenticated->timeout_tag); g_free (authenticated->cookie); cockpit_creds_poison (authenticated->creds); cockpit_creds_unref (authenticated->creds); if (authenticated->service) { if (authenticated->idling_sig) g_signal_handler_disconnect (authenticated->service, authenticated->idling_sig); if (authenticated->destroy_sig) g_signal_handler_disconnect (authenticated->service, authenticated->destroy_sig); object = G_OBJECT (authenticated->service); g_object_weak_unref (object, on_web_service_gone, authenticated); g_object_run_dispose (object); g_object_unref (authenticated->service); } g_free (authenticated); }
static gboolean on_handle_stream_socket (CockpitWebServer *server, const gchar *path, GIOStream *io_stream, GHashTable *headers, GByteArray *input, guint in_length, gpointer user_data) { CockpitTransport *transport; const gchar *query = NULL; CockpitCreds *creds; CockpitPipe *pipe; gchar *value; gchar **env; if (!g_str_has_prefix (path, "/cockpit/socket")) return FALSE; if (path[15] == '?') query = path + 16; else if (path[15] != '\0') return FALSE; if (service) { g_object_ref (service); } else { value = g_strdup_printf ("%d", server_port); env = g_environ_setenv (g_get_environ (), "COCKPIT_TEST_SERVER_PORT", value, TRUE); creds = cockpit_creds_new (g_get_user_name (), "test", COCKPIT_CRED_CSRF_TOKEN, "myspecialtoken", NULL); pipe = cockpit_pipe_spawn ((const gchar **)bridge_argv, (const gchar **)env, NULL, FALSE); transport = cockpit_pipe_transport_new (pipe); service = cockpit_web_service_new (creds, transport); cockpit_creds_unref (creds); g_object_unref (transport); g_object_unref (pipe); g_free (value); g_strfreev (env); /* Clear the pointer automatically when service is done */ g_object_add_weak_pointer (G_OBJECT (service), (gpointer *)&service); } if (query) cockpit_channel_socket_open (service, "/cockpit/socket", query, io_stream, headers, input); else cockpit_web_service_socket (service, "/cockpit/socket", io_stream, headers, input); /* Keeps ref on itself until it closes */ g_object_unref (service); return TRUE; }
/* Called by @server when handling HTTP requests to /socket - runs in a separate * thread dedicated to the request so it may do blocking I/O */ static gboolean on_handle_stream_socket (CockpitWebServer *server, CockpitWebServerRequestType reqtype, const gchar *resource, GIOStream *io_stream, GHashTable *headers, GByteArray *input, guint in_length, gpointer user_data) { CockpitWebService *service; CockpitCreds *creds; if (!g_str_equal (resource, "/socket")) return FALSE; creds = cockpit_creds_new (g_get_user_name (), NULL); service = cockpit_web_service_new (creds, NULL); cockpit_web_service_socket (service, io_stream, headers, input); /* Keeps ref on itself until it closes */ g_object_unref (service); cockpit_creds_unref (creds); return TRUE; }
static void remote_login_data_free (gpointer data) { RemoteLoginData *rl = data; if (rl->creds) cockpit_creds_unref (rl->creds); if (rl->transport) g_object_unref (rl->transport); g_free (rl); }
static void cockpit_ssh_data_free (CockpitSshData *data) { if (data->context) g_main_context_unref (data->context); g_free (data->command); if (data->creds) cockpit_creds_unref (data->creds); g_free (data->expect_key); g_free (data->host_key); if (data->host_fingerprint) ssh_string_free_char (data->host_fingerprint); ssh_free (data->session); g_free (data->knownhosts_file); g_free (data); }
static CockpitPipe * pop_session_process (CockpitAuth *self, CockpitCreds *creds) { CockpitPipe *proc = NULL; CockpitCreds *orig = NULL; if (g_hash_table_lookup_extended (self->ready_sessions, creds, (gpointer *)&orig, (gpointer *)&proc)) { if (!g_hash_table_steal (self->ready_sessions, orig)) g_assert_not_reached (); cockpit_creds_unref (orig); } return proc; }
static void cockpit_web_service_finalize (GObject *object) { CockpitWebService *self = COCKPIT_WEB_SERVICE (object); cockpit_sockets_cleanup (&self->sockets); if (self->transport) g_object_unref (self->transport); g_bytes_unref (self->control_prefix); cockpit_creds_unref (self->creds); if (self->ping_timeout) g_source_remove (self->ping_timeout); g_hash_table_destroy (self->host_by_checksum); g_hash_table_destroy (self->checksum_by_host); G_OBJECT_CLASS (cockpit_web_service_parent_class)->finalize (object); }
static gboolean on_handle_stream_socket (CockpitWebServer *server, const gchar *path, GIOStream *io_stream, GHashTable *headers, GByteArray *input, gpointer user_data) { CockpitTransport *transport; const gchar *query = NULL; CockpitCreds *creds; int session_stdin = -1; int session_stdout = -1; GError *error = NULL; GPid pid = 0; gchar *value; gchar **env; gchar **argv; if (!g_str_has_prefix (path, "/cockpit/socket")) return FALSE; if (path[15] == '?') { query = path + 16; } else if (path[15] != '\0') { return FALSE; } if (service) { g_object_ref (service); } else { g_clear_object (&bridge); value = g_strdup_printf ("%d", server_port); env = g_environ_setenv (g_get_environ (), "COCKPIT_TEST_SERVER_PORT", value, TRUE); argv = g_strdupv (bridge_argv); if (query) argv[g_strv_length (argv) - 1] = g_strdup (query); g_spawn_async_with_pipes (NULL, argv, env, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, &session_stdin, &session_stdout, NULL, &error); g_strfreev (env); g_free (argv); g_free (value); if (error) { g_critical ("couldn't run bridge %s: %s", bridge_argv[0], error->message); return FALSE; } bridge = g_object_new (COCKPIT_TYPE_PIPE, "name", "test-server-bridge", "in-fd", session_stdout, "out-fd", session_stdin, "pid", pid, NULL); creds = cockpit_creds_new (g_get_user_name (), "test", COCKPIT_CRED_CSRF_TOKEN, "myspecialtoken", NULL); transport = cockpit_pipe_transport_new (bridge); service = cockpit_web_service_new (creds, transport); cockpit_creds_unref (creds); g_object_unref (transport); /* Clear the pointer automatically when service is done */ g_object_add_weak_pointer (G_OBJECT (service), (gpointer *)&service); } cockpit_web_service_socket (service, path, io_stream, headers, input); /* Keeps ref on itself until it closes */ g_object_unref (service); return TRUE; }