static void spawn_portal_bridge (CockpitPortal *self) { CockpitPipe *pipe; const gchar *data; const gchar **argv; g_assert (self->other == NULL); argv = current_argv (self); g_debug ("launching portal bridge: %s", argv[0]); pipe = cockpit_pipe_spawn (argv, NULL, NULL, COCKPIT_PIPE_FLAGS_NONE); self->other = cockpit_pipe_transport_new (pipe); g_object_unref (pipe); self->other_recv_sig = g_signal_connect (self->other, "recv", G_CALLBACK (on_other_recv), self); self->other_control_sig = g_signal_connect (self->other, "control", G_CALLBACK (on_other_control), self); self->other_closed_sig = g_signal_connect (self->other, "closed", G_CALLBACK (on_other_closed), self); if (!self->last_init) { data = "{\"command\":\"init\",\"version\":1}"; self->last_init = g_bytes_new_static (data, strlen (data)); } cockpit_transport_send (self->other, NULL, self->last_init); }
static CockpitCreds * cockpit_auth_session_login_finish (CockpitAuth *self, GAsyncResult *result, GHashTable *headers, CockpitTransport **transport, GError **error) { CockpitCreds *creds; SessionLoginData *sl; g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), cockpit_auth_session_login_async), NULL); if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) { build_gssapi_output_header (headers, NULL); return NULL; } sl = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); creds = parse_auth_results (sl, headers, error); if (!creds) return NULL; if (transport) *transport = cockpit_pipe_transport_new (sl->session_pipe); return creds; }
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; }
/** * cockpit_pipe_transport_new_fds: * @name: name for debugging * @in_fd: the file descriptor to read from * @out_fd: the file descriptor to write to * * Create a new CockpitPipeTransport for a pair * of file descriptors. * * Returns: (transfer full): the new transport */ CockpitTransport * cockpit_pipe_transport_new_fds (const gchar *name, gint in_fd, gint out_fd) { CockpitTransport *transport; CockpitPipe *pipe; pipe = cockpit_pipe_new (name, in_fd, out_fd); transport = cockpit_pipe_transport_new (pipe); g_object_unref (pipe); return transport; }
static CockpitCreds * cockpit_auth_remote_login_finish (CockpitAuth *self, GAsyncResult *result, GHashTable *headers, JsonObject **prompt_data, CockpitTransport **transport, GError **error) { CockpitCreds *creds; CockpitPipe *pipe = NULL; AuthData *ad; g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), cockpit_auth_remote_login_async), NULL); ad = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) return NULL; creds = parse_ssh_spawn_results (self, ad, headers, prompt_data, error); if (creds) { if (transport) { pipe = cockpit_auth_process_claim_as_pipe (ad->auth_process); *transport = cockpit_pipe_transport_new (pipe); g_object_unref (pipe); } } else { if (prompt_data && *prompt_data) cockpit_auth_prepare_login_reply (self, *prompt_data, headers, ad); else cockpit_auth_process_terminate (ad->auth_process); } g_free (ad->response_data); ad->response_data = NULL; return creds; }
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; }