create-package-feed.pl: Polish file and directory handling
[privoxy.git] / cgisimple.c
index faa70da..8acfc1e 100644 (file)
@@ -1,4 +1,4 @@
-const char cgisimple_rcs[] = "$Id: cgisimple.c,v 1.135 2016/03/04 13:22:22 fabiankeil Exp $";
+const char cgisimple_rcs[] = "$Id: cgisimple.c,v 1.141 2016/05/08 10:46:29 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/cgisimple.c,v $
@@ -275,6 +275,49 @@ jb_err cgi_show_request(struct client_state *csp,
 
 
 #ifdef FEATURE_CLIENT_TAGS
+/*********************************************************************
+ *
+ * Function    :  cgi_create_client_tag_form
+ *
+ * Description :  Creates a HTML form to enable or disable a given
+ *                client tag.
+ *                XXX: Could use a template.
+ *
+ * Parameters  :
+ *          1  :  form = Buffer to fill with the generated form
+ *          2  :  size = Size of the form buffer
+ *          3  :  tag = Name of the tag this form should affect
+ *          4  :  toggle_state = Desired state after the button pressed 0
+ *          5  :  expires = Whether or not the tag should be enabled.
+ *                          Only checked if toggle_state is 1.
+ *
+ * Returns     :  void
+ *
+ *********************************************************************/
+static void cgi_create_client_tag_form(char *form, size_t size,
+   const char *tag, int toggle_state, int expires)
+{
+   char *button_name;
+
+   if (toggle_state == 1)
+   {
+      button_name = (expires == 1) ? "Enable" : "Enable temporarily";
+   }
+   else
+   {
+      assert(toggle_state == 0);
+      button_name = "Disable";
+   }
+
+   snprintf(form, size,
+      "<form method=\"GET\" action=\"client-tags\" style=\"display: inline\">\n"
+      " <input type=\"hidden\" name=\"tag\" value=\"%s\">\n"
+      " <input type=\"hidden\" name=\"toggle-state\" value=\"%u\">\n"
+      " <input type=\"hidden\" name=\"expires\" value=\"%u\">\n"
+      " <input type=\"submit\" value=\"%s\">\n"
+      "</form>", tag, toggle_state, !expires, button_name);
+}
+
 /*********************************************************************
  *
  * Function    :  cgi_show_client_tags
@@ -304,18 +347,18 @@ jb_err cgi_show_client_tags(struct client_state *csp,
    const char *toggle_state;
    const char *tag_expires;
    time_t time_to_live;
-   char *client_tags = strdup_or_die("");
+   char *client_tag_status;
    char buf[1000];
 
    assert(csp);
    assert(rsp);
    assert(parameters);
 
-   if (NULL == (exports = default_exports(csp, "show-client-tags")))
+   if (NULL == (exports = default_exports(csp, "client-tags")))
    {
       return JB_ERR_MEMORY;
    }
-
+   assert(csp->client_address != NULL);
    toggled_tag = lookup(parameters, "tag");
    if (*toggled_tag != '\0')
    {
@@ -338,45 +381,38 @@ jb_err cgi_show_client_tags(struct client_state *csp,
          disable_client_specific_tag(csp, toggled_tag);
       }
    }
-
    this_tag = csp->config->client_tags;
    if (this_tag->name == NULL)
    {
-      if (!err) err = string_append(&client_tags, "<p>No tags available.</p>\n");
+      client_tag_status = strdup_or_die("<p>No tags available.</p>\n");
    }
    else
    {
-      if (!err)
-      {
-         err = string_append(&client_tags, "<table border=\"1\">\n"
-            "<tr><th>Tag name</th>\n"
-            "<th>Current state</th><th>Change state</th><th>Description</th></tr>\n");
-      }
+      client_tag_status = strdup_or_die("<table border=\"1\">\n"
+         "<tr><th>Tag name</th>\n"
+         "<th>Current state</th><th>Change state</th><th>Description</th></tr>\n");
       while ((this_tag != NULL) && (this_tag->name != NULL))
       {
          int tag_state;
 
          privoxy_mutex_lock(&client_tags_mutex);
-         tag_state = client_has_requested_tag(csp->ip_addr_str, this_tag->name);
+         tag_state = client_has_requested_tag(csp->client_address, this_tag->name);
          privoxy_mutex_unlock(&client_tags_mutex);
-         if (!err) err = string_append(&client_tags, "<tr><td>");
-         if (!err) err = string_append(&client_tags, this_tag->name);
-         if (!err) err = string_append(&client_tags, "</td><td>");
-         if (!err) err = string_append(&client_tags, tag_state == 1 ? "Enabled" : "Disabled");
-         snprintf(buf, sizeof(buf),
-            "</td><td><a href=\"/show-client-tags?tag=%s&toggle-state=%d&amp;expires=0\">%s</a>",
-            this_tag->name, !tag_state, tag_state == 1 ? "Disable" : "Enable");
-         if (!err) err = string_append(&client_tags, buf);
+         if (!err) err = string_append(&client_tag_status, "<tr><td>");
+         if (!err) err = string_append(&client_tag_status, this_tag->name);
+         if (!err) err = string_append(&client_tag_status, "</td><td>");
+         if (!err) err = string_append(&client_tag_status, tag_state == 1 ? "Enabled" : "Disabled");
+         if (!err) err = string_append(&client_tag_status, "</td><td>");
+         cgi_create_client_tag_form(buf, sizeof(buf), this_tag->name, !tag_state, 1);
+         if (!err) err = string_append(&client_tag_status, buf);
          if (tag_state == 0)
          {
-            snprintf(buf, sizeof(buf), ". <a href=\"/show-client-tags?"
-               "tag=%s&amp;toggle-state=1&amp;expires=1\">Enable temporarily</a>",
-               this_tag->name);
-            if (!err) err = string_append(&client_tags, buf);
+            cgi_create_client_tag_form(buf, sizeof(buf), this_tag->name, !tag_state, 0);
+            if (!err) err = string_append(&client_tag_status, buf);
          }
-         if (!err) err = string_append(&client_tags, "</td><td>");
-         if (!err) err = string_append(&client_tags, this_tag->description);
-         if (!err) err = string_append(&client_tags, "</td></tr>\n");
+         if (!err) err = string_append(&client_tag_status, "</td><td>");
+         if (!err) err = string_append(&client_tag_status, this_tag->description);
+         if (!err) err = string_append(&client_tag_status, "</td></tr>\n");
          if (err)
          {
             free_map(exports);
@@ -384,22 +420,22 @@ jb_err cgi_show_client_tags(struct client_state *csp,
          }
          this_tag = this_tag->next;
       }
-      if (!err) err = string_append(&client_tags, "</table>\n");
+      if (!err) err = string_append(&client_tag_status, "</table>\n");
    }
 
-   if (map(exports, "client-tags", 1, client_tags, 0))
+   if (map(exports, "client-tags", 1, client_tag_status, 0))
    {
       free_map(exports);
       return JB_ERR_MEMORY;
    }
 
-   if (map(exports, "client-ip-addr", 1, csp->ip_addr_str, 1))
+   if (map(exports, "client-ip-addr", 1, csp->client_address, 1))
    {
       free_map(exports);
       return JB_ERR_MEMORY;
    }
 
-   return template_fill_for_cgi(csp, "show-client-tags", exports, rsp);
+   return template_fill_for_cgi(csp, "client-tags", exports, rsp);
 }
 #endif /* def FEATURE_CLIENT_TAGS */
 
@@ -1675,6 +1711,14 @@ static jb_err show_defines(struct map *exports)
    };
 
    static const struct feature features[] = {
+      {
+         "FEATURE_64_BIT_TIME_T",
+#if (SIZEOF_TIME_T == 8)
+         1,
+#else
+         0,
+#endif
+      },
       {
          "FEATURE_ACCEPT_FILTER",
 #ifdef FEATURE_ACCEPT_FILTER