static void on_remote_login_done (CockpitSshTransport *transport, const gchar *problem, gpointer user_data) { CockpitAuth *self = COCKPIT_AUTH (g_async_result_get_source_object (user_data)); GSimpleAsyncResult *task = user_data; if (problem) { if (g_str_equal (problem, "authentication-failed")) { g_simple_async_result_set_error (task, COCKPIT_ERROR, COCKPIT_ERROR_AUTHENTICATION_FAILED, "Authentication failed"); } else if (g_str_equal (problem, "not-supported") || g_str_equal (problem, "no-forwarding")) { g_simple_async_result_set_error (task, COCKPIT_ERROR, COCKPIT_ERROR_AUTHENTICATION_FAILED, "Authentication failed: no-supported-methods"); } else { g_simple_async_result_set_error (task, COCKPIT_ERROR, COCKPIT_ERROR_FAILED, "Couldn't connect or authenticate: %s", problem); } } g_simple_async_result_complete (task); g_object_unref (self); g_object_unref (task); }
static void on_login_complete (GObject *object, GAsyncResult *result, gpointer user_data) { LoginResponse *lr = user_data; GError *error = NULL; CockpitWebService *service; GIOStream *io_stream; io_stream = cockpit_web_response_get_stream (lr->response); service = cockpit_auth_login_finish (COCKPIT_AUTH (object), result, !G_IS_SOCKET_CONNECTION (io_stream), lr->headers, &error); if (error) { cockpit_web_response_gerror (lr->response, lr->headers, error); login_response_free (lr); g_error_free (error); } else { cockpit_web_service_modules (service, "localhost", on_login_modules, lr); g_object_unref (service); } }
static void on_login_complete (GObject *object, GAsyncResult *result, gpointer user_data) { CockpitWebResponse *response = user_data; GError *error = NULL; CockpitWebService *service; CockpitAuthFlags flags = 0; CockpitCreds *creds; GHashTable *headers; GIOStream *io_stream; io_stream = cockpit_web_response_get_stream (response); if (G_IS_SOCKET_CONNECTION (io_stream)) flags |= COCKPIT_AUTH_COOKIE_INSECURE; headers = cockpit_web_server_new_table (); service = cockpit_auth_login_finish (COCKPIT_AUTH (object), result, flags, headers, &error); if (error) { cockpit_web_response_gerror (response, headers, error); g_error_free (error); } else { creds = cockpit_web_service_get_creds (service); send_login_response (response, creds, headers); g_object_unref (service); } g_hash_table_unref (headers); g_object_unref (response); }
static void cockpit_auth_finalize (GObject *object) { CockpitAuth *self = COCKPIT_AUTH (object); g_byte_array_unref (self->key); g_hash_table_destroy (self->authenticated); G_OBJECT_CLASS (cockpit_auth_parent_class)->finalize (object); }
static void cockpit_auth_finalize (GObject *object) { CockpitAuth *self = COCKPIT_AUTH (object); if (self->timeout_tag) g_source_remove (self->timeout_tag); g_bytes_unref (self->key); g_hash_table_destroy (self->authenticated); g_hash_table_destroy (self->authentication_pending); G_OBJECT_CLASS (cockpit_auth_parent_class)->finalize (object); }
static gboolean on_process_timeout (gpointer data) { CockpitAuth *self = COCKPIT_AUTH (data); self->timeout_tag = 0; if (g_hash_table_size (self->authenticated) == 0) { g_debug ("web service is idle"); g_signal_emit (self, sig__idling, 0); } return FALSE; }
static void on_login_complete (GObject *object, GAsyncResult *result, gpointer user_data) { CockpitWebResponse *response = user_data; GError *error = NULL; JsonObject *response_data = NULL; GHashTable *headers; GIOStream *io_stream; GBytes *content; io_stream = cockpit_web_response_get_stream (response); headers = cockpit_web_server_new_table (); response_data = cockpit_auth_login_finish (COCKPIT_AUTH (object), result, io_stream, headers, &error); /* Never cache a login response */ cockpit_web_response_set_cache_type (response, COCKPIT_WEB_RESPONSE_NO_CACHE); if (error) { if (response_data) { g_hash_table_insert (headers, g_strdup ("Content-Type"), g_strdup ("application/json")); content = cockpit_json_write_bytes (response_data); cockpit_web_response_headers_full (response, 401, "Authentication required", -1, headers); cockpit_web_response_queue (response, content); cockpit_web_response_complete (response); g_bytes_unref (content); } else { cockpit_web_response_gerror (response, headers, error); } g_error_free (error); } else { send_login_response (response, response_data, headers); } if (response_data) json_object_unref (response_data); g_hash_table_unref (headers); g_object_unref (response); }