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

Diff for /mandoc/cgi.c between version 1.151 and 1.160

version 1.151, 2017/03/15 13:49:50 version 1.160, 2018/10/02 19:41:23
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze <schwarze@usta.de>   * 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 69  enum focus {
Line 69  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             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 *req, const char *path);
 static  void             parse_query_string(struct req *, const char *);  static  void             parse_query_string(struct req *, const char *);
Line 90  static void   resp_format(const struct req *, const ch
Line 91  static void   resp_format(const struct req *, const ch
 static  void             resp_searchform(const struct req *, enum focus);  static  void             resp_searchform(const struct req *, enum focus);
 static  void             resp_show(const struct req *, const char *);  static  void             resp_show(const struct req *, const char *);
 static  void             set_query_attr(char **, char **);  static  void             set_query_attr(char **, char **);
   static  int              validate_arch(const char *);
 static  int              validate_filename(const char *);  static  int              validate_filename(const char *);
 static  int              validate_manpath(const struct req *, const char *);  static  int              validate_manpath(const struct req *, const char *);
 static  int              validate_urifrag(const char *);  static  int              validate_urifrag(const char *);
Line 140  html_putchar(char c)
Line 142  html_putchar(char c)
 {  {
   
         switch (c) {          switch (c) {
         case ('"'):          case '"':
                 printf("&quot;");                  printf("&quot;");
                 break;                  break;
         case ('&'):          case '&':
                 printf("&amp;");                  printf("&amp;");
                 break;                  break;
         case ('>'):          case '>':
                 printf("&gt;");                  printf("&gt;");
                 break;                  break;
         case ('<'):          case '<':
                 printf("&lt;");                  printf("&lt;");
                 break;                  break;
         default:          default:
Line 316  http_decode(char *p)
Line 318  http_decode(char *p)
 }  }
   
 static void  static void
   http_encode(const char *p)
   {
           for (; *p != '\0'; p++) {
                   if (isalnum((unsigned char)*p) == 0 &&
                       strchr("-._~", *p) == NULL)
                           printf("%%%02.2X", (unsigned char)*p);
                   else
                           putchar(*p);
           }
   }
   
   static void
 resp_begin_http(int code, const char *msg)  resp_begin_http(int code, const char *msg)
 {  {
   
Line 356  resp_begin_html(int code, const char *msg, const char 
Line 370  resp_begin_html(int code, const char *msg, const char 
                "<html>\n"                 "<html>\n"
                "<head>\n"                 "<head>\n"
                "  <meta charset=\"UTF-8\"/>\n"                 "  <meta charset=\"UTF-8\"/>\n"
                  "  <meta name=\"viewport\""
                         " content=\"width=device-width, initial-scale=1.0\">\n"
                "  <link rel=\"stylesheet\" href=\"%s/mandoc.css\""                 "  <link rel=\"stylesheet\" href=\"%s/mandoc.css\""
                " type=\"text/css\" media=\"all\">\n"                 " type=\"text/css\" media=\"all\">\n"
                "  <title>",                 "  <title>",
Line 398  resp_searchform(const struct req *req, enum focus focu
Line 414  resp_searchform(const struct req *req, enum focus focu
   
         /* Write query input box. */          /* Write query input box. */
   
         printf("    <input type=\"text\" name=\"query\" value=\"");          printf("    <input type=\"search\" name=\"query\" value=\"");
         if (req->q.query != NULL)          if (req->q.query != NULL)
                 html_print(req->q.query);                  html_print(req->q.query);
         printf( "\" size=\"40\"");          printf( "\" size=\"40\"");
Line 434  resp_searchform(const struct req *req, enum focus focu
Line 450  resp_searchform(const struct req *req, enum focus focu
                 printf(" selected=\"selected\"");                  printf(" selected=\"selected\"");
         puts(">All Architectures</option>");          puts(">All Architectures</option>");
         for (i = 0; i < arch_MAX; i++) {          for (i = 0; i < arch_MAX; i++) {
                 printf("      <option value=\"%s\"", arch_names[i]);                  printf("      <option");
                 if (NULL != req->q.arch &&                  if (NULL != req->q.arch &&
                     0 == strcmp(arch_names[i], req->q.arch))                      0 == strcmp(arch_names[i], req->q.arch))
                         printf(" selected=\"selected\"");                          printf(" selected=\"selected\"");
Line 447  resp_searchform(const struct req *req, enum focus focu
Line 463  resp_searchform(const struct req *req, enum focus focu
         if (req->psz > 1) {          if (req->psz > 1) {
                 puts("    <select name=\"manpath\">");                  puts("    <select name=\"manpath\">");
                 for (i = 0; i < (int)req->psz; i++) {                  for (i = 0; i < (int)req->psz; i++) {
                         printf("      <option ");                          printf("      <option");
                         if (strcmp(req->q.manpath, req->p[i]) == 0)                          if (strcmp(req->q.manpath, req->p[i]) == 0)
                                 printf("selected=\"selected\" ");                                  printf(" selected=\"selected\"");
                         printf("value=\"");                          printf(">");
                         html_print(req->p[i]);                          html_print(req->p[i]);
                         printf("\">");  
                         html_print(req->p[i]);  
                         puts("</option>");                          puts("</option>");
                 }                  }
                 puts("    </select>");                  puts("    </select>");
Line 490  validate_manpath(const struct req *req, const char* ma
Line 504  validate_manpath(const struct req *req, const char* ma
 }  }
   
 static int  static int
   validate_arch(const char *arch)
   {
           int      i;
   
           for (i = 0; i < arch_MAX; i++)
                   if (strcmp(arch, arch_names[i]) == 0)
                           return 1;
   
           return 0;
   }
   
   static int
 validate_filename(const char *file)  validate_filename(const char *file)
 {  {
   
Line 554  pg_error_internal(void)
Line 580  pg_error_internal(void)
 static void  static void
 pg_redirect(const struct req *req, const char *name)  pg_redirect(const struct req *req, const char *name)
 {  {
         printf("Status: 303 See Other\r\n");          printf("Status: 303 See Other\r\n"
         printf("Location: http://%s/", HTTP_HOST);              "Location: /");
         if (*scriptname != '\0')          if (*scriptname != '\0')
                 printf("%s/", scriptname);                  printf("%s/", scriptname);
         if (strcmp(req->q.manpath, req->p[0]))          if (strcmp(req->q.manpath, req->p[0]))
                 printf("%s/", req->q.manpath);                  printf("%s/", req->q.manpath);
         if (req->q.arch != NULL)          if (req->q.arch != NULL)
                 printf("%s/", req->q.arch);                  printf("%s/", req->q.arch);
         printf("%s", name);          http_encode(name);
         if (req->q.sec != NULL)          if (req->q.sec != NULL) {
                 printf(".%s", req->q.sec);                  putchar('.');
                   http_encode(req->q.sec);
           }
         printf("\r\nContent-Type: text/html; charset=utf-8\r\n\r\n");          printf("\r\nContent-Type: text/html; charset=utf-8\r\n\r\n");
 }  }
   
Line 591  pg_searchres(const struct req *req, struct manpage *r,
Line 619  pg_searchres(const struct req *req, struct manpage *r,
                  * If we have just one result, then jump there now                   * If we have just one result, then jump there now
                  * without any delay.                   * without any delay.
                  */                   */
                 printf("Status: 303 See Other\r\n");                  printf("Status: 303 See Other\r\n"
                 printf("Location: http://%s/%s%s%s/%s",                      "Location: /");
                     HTTP_HOST, scriptname,                  if (*scriptname != '\0')
                     *scriptname == '\0' ? "" : "/",                          printf("%s/", scriptname);
                     req->q.manpath, r[0].file);                  if (strcmp(req->q.manpath, req->p[0]))
                 printf("\r\n"                          printf("%s/", req->q.manpath);
                      "Content-Type: text/html; charset=utf-8\r\n"                  printf("%s\r\n"
                      "\r\n");                      "Content-Type: text/html; charset=utf-8\r\n\r\n",
                       r[0].file);
                 return;                  return;
         }          }
   
Line 831  resp_format(const struct req *req, const char *file)
Line 860  resp_format(const struct req *req, const char *file)
   
         mchars_alloc();          mchars_alloc();
         mp = mparse_alloc(MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1,          mp = mparse_alloc(MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1,
             MANDOCLEVEL_BADARG, NULL, req->q.manpath);              MANDOCERR_MAX, NULL, MANDOC_OS_OTHER, req->q.manpath);
         mparse_readfd(mp, fd, file);          mparse_readfd(mp, fd, file);
         close(fd);          close(fd);
   
         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%%N.%%S",          mandoc_asprintf(&conf.man, "/%s%s%s%s%%N.%%S",
               scriptname, *scriptname == '\0' ? "" : "/",
             usepath ? req->q.manpath : "", usepath ? "/" : "");              usepath ? req->q.manpath : "", usepath ? "/" : "");
   
         mparse_result(mp, &man, NULL);          mparse_result(mp, &man, NULL);
Line 1071  main(void)
Line 1102  main(void)
   
         if (*path != '\0') {          if (*path != '\0') {
                 parse_path_info(&req, path);                  parse_path_info(&req, path);
                 if (req.q.manpath == NULL || access(path, F_OK) == -1)                  if (req.q.manpath == NULL || req.q.sec == NULL ||
                       *req.q.query == '\0' || access(path, F_OK) == -1)
                         path = "";                          path = "";
         } else if ((querystring = getenv("QUERY_STRING")) != NULL)          } else if ((querystring = getenv("QUERY_STRING")) != NULL)
                 parse_query_string(&req, querystring);                  parse_query_string(&req, querystring);
Line 1086  main(void)
Line 1118  main(void)
                 return EXIT_FAILURE;                  return EXIT_FAILURE;
         }          }
   
         if ( ! (NULL == req.q.arch || validate_urifrag(req.q.arch))) {          if (req.q.arch != NULL && validate_arch(req.q.arch) == 0) {
                 pg_error_badrequest(                  pg_error_badrequest(
                     "You specified an invalid architecture.");                      "You specified an invalid architecture.");
                 return EXIT_FAILURE;                  return EXIT_FAILURE;

Legend:
Removed from v.1.151  
changed lines
  Added in v.1.160

CVSweb