gboolean cockpit_handler_resource (CockpitWebServer *server, const gchar *path, GHashTable *headers, CockpitWebResponse *response, CockpitHandlerData *ws) { CockpitWebService *service; if (g_str_has_prefix (path, "/cockpit/static/")) { cockpit_web_response_file (response, path + 16, TRUE, ws->static_roots); return TRUE; } service = cockpit_auth_check_cookie (ws->auth, headers); if (service) { cockpit_web_service_resource (service, headers, response); g_object_unref (service); } else if (g_str_equal (path, "/") || g_str_has_suffix (path, ".html")) { send_login_html (response, ws); } else { cockpit_web_response_error (response, 401, NULL, NULL); } return TRUE; }
static gboolean on_handle_resource (CockpitWebServer *server, const gchar *path, GHashTable *headers, CockpitWebResponse *response, gpointer user_data) { gchar **parts; gchar *rebuilt; g_assert (g_str_has_prefix (path, "/pkg")); /* TODO: This needs a better implementation later, when the tests aren't all broken */ parts = g_strsplit (path, "/", -1); if (g_strcmp0 (parts[2], "system") == 0) { g_free (parts[2]); parts[2] = g_strdup ("systemd"); } rebuilt = g_strjoinv ("/", parts); inject_address (response, "bus_address", bus_address); inject_address (response, "direct_address", direct_address); cockpit_web_response_file (response, rebuilt, FALSE, cockpit_web_server_get_document_roots (server)); g_strfreev (parts); g_free (rebuilt); return TRUE; }
gboolean cockpit_handler_default (CockpitWebServer *server, const gchar *path, GHashTable *headers, CockpitWebResponse *response, CockpitHandlerData *data) { CockpitWebService *service; const gchar *remainder = NULL; gboolean resource; path = cockpit_web_response_get_path (response); g_return_val_if_fail (path != NULL, FALSE); resource = g_str_has_prefix (path, "/cockpit/") || g_str_has_prefix (path, "/cockpit+") || g_str_equal (path, "/cockpit"); /* Stuff in /cockpit or /cockpit+xxx */ if (resource) { cockpit_web_response_skip_path (response); remainder = cockpit_web_response_get_path (response); if (!remainder) { cockpit_web_response_error (response, 404, NULL, NULL); return TRUE; } else if (g_str_has_prefix (remainder, "/static/")) { /* Static stuff is served without authentication */ cockpit_web_response_file (response, remainder + 8, TRUE, data->static_roots); return TRUE; } } /* Remainder of stuff needs authentication */ service = cockpit_auth_check_cookie (data->auth, path, headers); if (resource) { if (g_str_equal (remainder, "/login")) { handle_login (data, service, path, headers, response); } else { handle_resource (data, service, path, headers, response); } } else { handle_shell (data, service, path, headers, response); } return TRUE; }
gboolean cockpit_handler_root (CockpitWebServer *server, const gchar *path, GHashTable *headers, CockpitWebResponse *response, CockpitHandlerData *ws) { /* Don't cache forever */ cockpit_web_response_file (response, path, ws->branding_roots); return TRUE; }
static gboolean cockpit_web_server_default_handle_resource (CockpitWebServer *self, const gchar *path, GHashTable *headers, CockpitWebResponse *response) { if (self->document_roots) cockpit_web_response_file (response, path, FALSE, (const gchar **)self->document_roots); else cockpit_web_response_error (response, 404, NULL, NULL); return TRUE; }
static gboolean on_handle_source (CockpitWebServer *server, const gchar *path, GHashTable *headers, CockpitWebResponse *response, gpointer user_data) { cockpit_web_response_set_cache_type (response, COCKPIT_WEB_RESPONSE_NO_CACHE); inject_address (response, "bus_address", bus_address); inject_address (response, "direct_address", direct_address); cockpit_web_response_file (response, path, cockpit_web_server_get_document_roots (server)); return TRUE; }
static void send_login_html (CockpitWebResponse *response, CockpitHandlerData *ws) { static const gchar *marker = "<head>"; CockpitWebFilter *filter; GBytes *environment; environment = build_environment (ws->os_release); filter = cockpit_web_inject_new (marker, environment); g_bytes_unref (environment); cockpit_web_response_add_filter (response, filter); cockpit_web_response_file (response, "/login.html", FALSE, ws->static_roots); g_object_unref (filter); }
gboolean cockpit_handler_static (CockpitWebServer *server, CockpitWebServerRequestType reqtype, const gchar *path, GHashTable *headers, GBytes *input, CockpitWebResponse *response, CockpitHandlerData *ws) { const gchar *roots[] = { cockpit_ws_static_directory, NULL }; if (reqtype != COCKPIT_WEB_SERVER_REQUEST_GET) return FALSE; cockpit_web_response_file (response, path + 8, TRUE, roots); return TRUE; }
static void handle_package_file (CockpitWebServer *server, CockpitWebResponse *response, gchar **parts) { gchar *rebuilt; /* TODO: This needs a better implementation later, when the tests aren't all broken */ if (g_strcmp0 (parts[2], "system") == 0) { g_free (parts[2]); parts[2] = g_strdup ("systemd"); } if (g_strcmp0 (parts[2], "base1") == 0) { g_free (parts[1]); parts[1] = g_strdup ("src"); } rebuilt = g_strjoinv ("/", parts); cockpit_web_response_file (response, rebuilt, cockpit_web_server_get_document_roots (server)); g_free (rebuilt); }