]> git.saurik.com Git - apt.git/commitdiff
access _config via GET requests in the webserver
authorDavid Kalnischkies <kalnischkies@gmail.com>
Sun, 15 Sep 2013 20:54:04 +0000 (22:54 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Mon, 30 Sep 2013 07:17:44 +0000 (09:17 +0200)
Git-Dch: Ignore

test/interactive-helper/aptwebserver.cc

index fde95fec9c8c33b2e4f6c30b070f2826a576ea3a..7134b37bc21db071655147c33333ed76f25c4d87 100644 (file)
@@ -156,14 +156,28 @@ void sendError(int const client, int const httpcode, std::string const &request,
    std::string response("<html><head><title>");
    response.append(httpcodeToStr(httpcode)).append("</title></head>");
    response.append("<body><h1>").append(httpcodeToStr(httpcode)).append("</h1>");
-   if (error.empty() == false)
-      response.append("<p><em>Error</em>: ").append(error).append("</p>");
-   response.append("This error is a result of the request: <pre>");
+   if (httpcode != 200)
+   {
+      if (error.empty() == false)
+        response.append("<p><em>Error</em>: ").append(error).append("</p>");
+      response.append("This error is a result of the request: <pre>");
+   }
+   else
+   {
+      if (error.empty() == false)
+        response.append("<p><em>Success</em>: ").append(error).append("</p>");
+      response.append("The successfully executed operation was requested by: <pre>");
+   }
    response.append(request).append("</pre></body></html>");
    addDataHeaders(headers, response);
    sendHead(client, httpcode, headers);
    if (content == true)
       sendData(client, response);
+}
+void sendSuccess(int const client, std::string const &request,
+              bool content, std::string const &error = "")
+{
+   sendError(client, 200, request, content, error);
 }
                                                                        /*}}}*/
 void sendRedirect(int const client, int const httpcode, std::string const &uri,/*{{{*/
@@ -365,6 +379,49 @@ bool parseFirstLine(int const client, std::string const &request,  /*{{{*/
    return true;
 }
                                                                        /*}}}*/
+bool handleOnTheFlyReconfiguration(int const client, std::string const &request, std::vector<std::string> const &parts)/*{{{*/
+{
+   size_t const pcount = parts.size();
+   if (pcount == 4 && parts[1] == "set")
+   {
+      _config->Set(parts[2], parts[3]);
+      sendSuccess(client, request, true, "Option '" + parts[2] + "' was set to '" + parts[3] + "'!");
+      return true;
+   }
+   else if (pcount == 4 && parts[1] == "find")
+   {
+      std::list<std::string> headers;
+      std::string response = _config->Find(parts[2], parts[3]);
+      addDataHeaders(headers, response);
+      sendHead(client, 200, headers);
+      sendData(client, response);
+      return true;
+   }
+   else if (pcount == 3 && parts[1] == "find")
+   {
+      std::list<std::string> headers;
+      if (_config->Exists(parts[2]) == true)
+      {
+        std::string response = _config->Find(parts[2]);
+        addDataHeaders(headers, response);
+        sendHead(client, 200, headers);
+        sendData(client, response);
+        return true;
+      }
+      sendError(client, 404, request, "Requested Configuration option doesn't exist.");
+      return false;
+   }
+   else if (pcount == 3 && parts[1] == "clear")
+   {
+      _config->Clear(parts[2]);
+      sendSuccess(client, request, true, "Option '" + parts[2] + "' was cleared.");
+      return true;
+   }
+
+   sendError(client, 400, request, true, "Unknown on-the-fly configuration request");
+   return false;
+}
+                                                                       /*}}}*/
 int main(int const argc, const char * argv[])
 {
    CommandLine::Args Args[] = {
@@ -475,6 +532,17 @@ int main(int const argc, const char * argv[])
            if (parseFirstLine(client, *m, filename, sendContent, closeConnection) == false)
               continue;
 
+           // special webserver command request
+           if (filename.length() > 1 && filename[0] == '_')
+           {
+              std::vector<std::string> parts = VectorizeString(filename, '/');
+              if (parts[0] == "_config")
+              {
+                 handleOnTheFlyReconfiguration(client, *m, parts);
+                 continue;
+              }
+           }
+
            // string replacements in the requested filename
            ::Configuration::Item const *Replaces = _config->Tree("aptwebserver::redirect::replace");
            if (Replaces != NULL)