version 1.157, 2018/05/18 14:23:00 |
version 1.160, 2018/10/02 19:41:23 |
|
|
/* $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 |
|
|
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 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 400 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 436 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 449 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 492 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 564 pg_redirect(const struct req *req, const char *name) |
|
Line 588 pg_redirect(const struct req *req, const char *name) |
|
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 841 resp_format(const struct req *req, const char *file) |
|
Line 867 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' ? "" : "/", |
|
|
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; |