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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #6
0
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;
}
Beispiel #7
0
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);
}
Beispiel #8
0
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;
}
Beispiel #9
0
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);
}