static void handle_login (CockpitHandlerData *data, CockpitWebService *service, const gchar *path, GHashTable *headers, CockpitWebResponse *response) { GHashTable *out_headers; GIOStream *io_stream; CockpitCreds *creds; JsonObject *creds_json = NULL; if (service) { out_headers = cockpit_web_server_new_table (); creds = cockpit_web_service_get_creds (service); creds_json = cockpit_creds_to_json (creds); send_login_response (response, creds_json, out_headers); g_hash_table_unref (out_headers); json_object_unref (creds_json); return; } io_stream = cockpit_web_response_get_stream (response); cockpit_auth_login_async (data->auth, path,io_stream, headers, on_login_complete, g_object_ref (response)); }
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); }
gboolean cockpit_handler_login (CockpitWebServer *server, const gchar *path, GHashTable *headers, CockpitWebResponse *response, CockpitHandlerData *ws) { CockpitWebService *service; CockpitCreds *creds; gchar *remote_peer = NULL; GHashTable *out_headers; GIOStream *io_stream; service = cockpit_auth_check_cookie (ws->auth, headers); if (service == NULL) { io_stream = cockpit_web_response_get_stream (response); remote_peer = get_remote_address (io_stream); cockpit_auth_login_async (ws->auth, headers, remote_peer, on_login_complete, g_object_ref (response)); g_free (remote_peer); } else { out_headers = cockpit_web_server_new_table (); creds = cockpit_web_service_get_creds (service); send_login_response (response, creds, out_headers); g_hash_table_unref (out_headers); g_object_unref (service); } /* no response yet */ return TRUE; }
static void handle_login (CockpitHandlerData *data, CockpitWebService *service, const gchar *path, GHashTable *headers, CockpitWebResponse *response) { GHashTable *out_headers; gchar *remote_peer = NULL; GIOStream *io_stream; CockpitCreds *creds; if (service) { out_headers = cockpit_web_server_new_table (); creds = cockpit_web_service_get_creds (service); send_login_response (response, creds, out_headers); g_hash_table_unref (out_headers); } else { io_stream = cockpit_web_response_get_stream (response); remote_peer = get_remote_address (io_stream); cockpit_auth_login_async (data->auth, path, headers, remote_peer, on_login_complete, g_object_ref (response)); g_free (remote_peer); } }
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); }