[BACK]Return to cgi.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/cgi.c between version 1.164 and 1.173

version 1.164, 2018/12/30 00:49:54 version 1.173, 2020/06/29 19:22:09
Line 1 
Line 1 
 /*      $Id$ */  /* $Id$ */
 /*  /*
    * Copyright (c) 2014-2019 Ingo Schwarze <schwarze@usta.de>
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015, 2016, 2017, 2018 Ingo Schwarze <schwarze@usta.de>  
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 14 
Line 14 
  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    *
    * Implementation of the man.cgi(8) program.
  */   */
 #include "config.h"  #include "config.h"
   
Line 70  enum focus {
Line 72  enum focus {
 static  void             html_print(const char *);  static  void             html_print(const char *);
 static  void             html_putchar(char);  static  void             html_putchar(char);
 static  int              http_decode(char *);  static  int              http_decode(char *);
 static  void             http_encode(const char *p);  static  void             http_encode(const char *);
 static  void             parse_manpath_conf(struct req *);  static  void             parse_manpath_conf(struct req *);
 static  void             parse_path_info(struct req *req, const char *path);  static  void             parse_path_info(struct req *, const char *);
 static  void             parse_query_string(struct req *, const char *);  static  void             parse_query_string(struct req *, const char *);
 static  void             pg_error_badrequest(const char *);  static  void             pg_error_badrequest(const char *);
 static  void             pg_error_internal(void);  static  void             pg_error_internal(void);
 static  void             pg_index(const struct req *);  static  void             pg_index(const struct req *);
 static  void             pg_noresult(const struct req *, const char *);  static  void             pg_noresult(const struct req *, int, const char *,
                                   const char *);
 static  void             pg_redirect(const struct req *, const char *);  static  void             pg_redirect(const struct req *, const char *);
 static  void             pg_search(const struct req *);  static  void             pg_search(const struct req *);
 static  void             pg_searchres(const struct req *,  static  void             pg_searchres(const struct req *,
Line 119  static const char *const sec_names[] = {
Line 122  static const char *const sec_names[] = {
 static  const int sec_MAX = sizeof(sec_names) / sizeof(char *);  static  const int sec_MAX = sizeof(sec_names) / sizeof(char *);
   
 static  const char *const arch_names[] = {  static  const char *const arch_names[] = {
     "amd64",       "alpha",       "armv7",      "arm64",      "amd64",       "alpha",       "armv7",       "arm64",
     "hppa",        "i386",        "landisk",      "hppa",        "i386",        "landisk",     "loongson",
     "loongson",    "luna88k",     "macppc",      "mips64",      "luna88k",     "macppc",      "mips64",      "octeon",
     "octeon",      "sgi",         "socppc",      "sparc64",      "powerpc64",   "sgi",         "socppc",      "sparc64",
   
     "amiga",       "arc",         "armish",      "arm32",      "amiga",       "arc",         "armish",      "arm32",
     "atari",       "aviion",      "beagle",      "cats",      "atari",       "aviion",      "beagle",      "cats",
     "hppa64",      "hp300",      "hppa64",      "hp300",
Line 324  http_encode(const char *p)
Line 328  http_encode(const char *p)
         for (; *p != '\0'; p++) {          for (; *p != '\0'; p++) {
                 if (isalnum((unsigned char)*p) == 0 &&                  if (isalnum((unsigned char)*p) == 0 &&
                     strchr("-._~", *p) == NULL)                      strchr("-._~", *p) == NULL)
                         printf("%%%02.2X", (unsigned char)*p);                          printf("%%%2.2X", (unsigned char)*p);
                 else                  else
                         putchar(*p);                          putchar(*p);
         }          }
Line 339  resp_begin_http(int code, const char *msg)
Line 343  resp_begin_http(int code, const char *msg)
   
         printf("Content-Type: text/html; charset=utf-8\r\n"          printf("Content-Type: text/html; charset=utf-8\r\n"
              "Cache-Control: no-cache\r\n"               "Cache-Control: no-cache\r\n"
                "Content-Security-Policy: default-src 'none'; "
                "style-src 'self' 'unsafe-inline'\r\n"
              "Pragma: no-cache\r\n"               "Pragma: no-cache\r\n"
              "\r\n");               "\r\n");
   
Line 408  resp_searchform(const struct req *req, enum focus focu
Line 414  resp_searchform(const struct req *req, enum focus focu
 {  {
         int              i;          int              i;
   
         printf("<form action=\"/%s\" method=\"get\">\n"          printf("<form action=\"/%s\" method=\"get\" "
                  "autocomplete=\"off\" autocapitalize=\"none\">\n"
                "  <fieldset>\n"                 "  <fieldset>\n"
                "    <legend>Manual Page Search Parameters</legend>\n",                 "    <legend>Manual Page Search Parameters</legend>\n",
                scriptname);                 scriptname);
Line 546  pg_index(const struct req *req)
Line 553  pg_index(const struct req *req)
 }  }
   
 static void  static void
 pg_noresult(const struct req *req, const char *msg)  pg_noresult(const struct req *req, int code, const char *http_msg,
       const char *user_msg)
 {  {
         resp_begin_html(200, NULL, NULL);          resp_begin_html(code, http_msg, NULL);
         resp_searchform(req, FOCUS_QUERY);          resp_searchform(req, FOCUS_QUERY);
         puts("<p>");          puts("<p>");
         puts(msg);          puts(user_msg);
         puts("</p>");          puts("</p>");
         resp_end_html();          resp_end_html();
 }  }
Line 869  resp_format(const struct req *req, const char *file)
Line 877  resp_format(const struct req *req, const char *file)
         memset(&conf, 0, sizeof(conf));          memset(&conf, 0, sizeof(conf));
         conf.fragment = 1;          conf.fragment = 1;
         conf.style = mandoc_strdup(CSS_DIR "/mandoc.css");          conf.style = mandoc_strdup(CSS_DIR "/mandoc.css");
         conf.toc = 1;  
         usepath = strcmp(req->q.manpath, req->p[0]);          usepath = strcmp(req->q.manpath, req->p[0]);
         mandoc_asprintf(&conf.man, "/%s%s%s%s%%N.%%S",          mandoc_asprintf(&conf.man, "/%s%s%s%s%%N.%%S",
             scriptname, *scriptname == '\0' ? "" : "/",              scriptname, *scriptname == '\0' ? "" : "/",
Line 1017  pg_search(const struct req *req)
Line 1024  pg_search(const struct req *req)
         if (req->isquery && req->q.equal && argc == 1)          if (req->isquery && req->q.equal && argc == 1)
                 pg_redirect(req, argv[0]);                  pg_redirect(req, argv[0]);
         else if (mansearch(&search, &paths, argc, argv, &res, &ressz) == 0)          else if (mansearch(&search, &paths, argc, argv, &res, &ressz) == 0)
                 pg_noresult(req, "You entered an invalid query.");                  pg_noresult(req, 400, "Bad Request",
                       "You entered an invalid query.");
         else if (ressz == 0)          else if (ressz == 0)
                 pg_noresult(req, "No results found.");                  pg_noresult(req, 404, "Not Found", "No results found.");
         else          else
                 pg_searchres(req, res, ressz);                  pg_searchres(req, res, ressz);
   
Line 1178  parse_path_info(struct req *req, const char *path)
Line 1186  parse_path_info(struct req *req, const char *path)
         }          }
   
         /* Optional section. */          /* Optional section. */
         if (strncmp(path, "man", 3) == 0) {          if (strncmp(path, "man", 3) == 0 || strncmp(path, "cat", 3) == 0) {
                 path += 3;                  path += 3;
                 end = strchr(path, '/');                  end = strchr(path, '/');
                 free(req->q.sec);                  free(req->q.sec);

Legend:
Removed from v.1.164  
changed lines
  Added in v.1.173

CVSweb