summaryrefslogtreecommitdiffstats
path: root/cgi.c
Commit message (Collapse)AuthorAgeFilesLines
* Fatal errors no longer exist.Ingo Schwarze2015-01-151-10/+2
| | | | | | If a file can be opened, mandoc will produce some output; at worst, the output may be almost empty. Simplifies error handling and frees a message type for future use.
* Make the code sipler and more robust by always assigning a valueIngo Schwarze2014-11-261-11/+5
| | | | to q.manpath and dropping the (incomplete) later NULL checks.
* In man(1) mode without -a, stop searching after the first manual treeIngo Schwarze2014-11-111-0/+1
| | | | | that contained at least one match in order to not prefer mdoc(1) from ports over mdoc(7). As a bonus, this results in a speedup.
* Make the character table available to libroff so it can check theIngo Schwarze2014-10-281-2/+6
| | | | | | | | validity of character escape names and warn about unknown ones. This requires mchars_spec2cp() to report unknown names again. Fortunately, that doesn't require changing the calling code because according to groff, invalid character escapes should not produce output anyway, and now that we warn about them, that's fine.
* be a bit more patient, 1s is sometimes insufficient for legitimate queriesIngo Schwarze2014-10-071-2/+2
|
* Modify man.cgi to use HTML5.Kristaps Dzonsons2014-09-271-5/+2
|
* Support backslash-escaping of white space in the query expression,Ingo Schwarze2014-09-141-33/+32
| | | | | | to be more similar to apropos(1) called from the shell. Missing feature reported by Marcus MERIGHI <mcmer dash openbsd at tor dot at> on misc@.
* Sync section titles with OpenBSD.Ingo Schwarze2014-08-261-6/+6
| | | | | | | | | | For section 4, "Kernel Interfaces" is just too confusing, the difference from sections 2 and 9 is too hard to see. The 3p change was suggested by bluhm@; that part of the manual describes more modules than functions. Align the CGI section titles with the console section titles.
* limit CGI process execution time to make REDoS attacks less effective;Ingo Schwarze2014-08-211-0/+14
| | | | attack surface pointed out by Sebastien Marie
* Fully integrate apropos(1) into mandoc(1).Ingo Schwarze2014-08-171-3/+3
| | | | | | | | | Switch the argmode on the progname, including man(1). Provide -f and -k options to switch the argmode. Store the argmode inside struct search, generalizing the flags. Derive the deftype from the argmode when needed instead of storing it. Store the outkey inside struct search instead of passing it alone. While here, get rid of the trailing blanks in Makefile.depend.
* Get rid of HAVE_CONFIG_H, it is always defined; idea from libnbcompat.Ingo Schwarze2014-08-101-2/+2
| | | | | | Include <sys/types.h> where needed, it does not belong in config.h. Remove <stdio.h> from config.h; if it is missing somewhere, it should be added, but i cannot find a *.c file where it is missing.
* mansearch.h uses uint64_t, so it needs stdint.h; found on LinuxIngo Schwarze2014-08-051-0/+1
|
* Choosing the right encoding is a tricky business...Ingo Schwarze2014-07-251-34/+8
| | | | | | | | | | | | | | Printing query strings for URIs *always* needs URI-encoding, and when embedding the URI into an HTML document, it needs replacement of the "&" separators by "&amp;" *in addition to that*, not instead. Delete the function html_primtquery(), it was completely wrong. You can see the badness by entering "mandoc &sec=2" into the query input box before this patch and click "Submit". You come to the right page at first (...man.cgi?query=mandoc+%26sec%3D2&apropos=0&sec=0&...), but now the link to mandoc(1) is wrong: ...mandoc.1?query=mandoc &amp;sec=2&amp;... Clicking on that, the "&sec=2" disappears from the query input box and suddenly you have the first dropdown set to "2 - System Calls". Oops.
* Sort the URI keys for .Xr links in the same order used by the search form,Ingo Schwarze2014-07-251-7/+12
| | | | | and leave out the manpath when it is the default. For building the HTML formatter options, do not use a static buffer.
* oops, we must not try to validate a manpath we don't have;Ingo Schwarze2014-07-251-1/+2
| | | | fixing an oversight introduced in rev. 1.77
* We cannot easily control the order of the QUERY_STRING keys generatedIngo Schwarze2014-07-251-16/+18
| | | | | | | | | | | | by the search form, it's just the order of the fields in the form. Actually, that's not too bad; the generated URI resembles the generating form. To minimize confusion for people looking at URIs, give the keys in the same order when generating URIs for search listings and search redirections, the latter being used instead of search listings that would have only one single entry. Also, if the manpath is the default, remove it form the generated URIs.
* In generated .Xr links, avoid double encoding of ampersandsIngo Schwarze2014-07-251-1/+2
| | | | and avoid empty arch= keys.
* Even though this is not XHTML yet, remove some gratuitious violationsIngo Schwarze2014-07-251-11/+11
| | | | of XHTML syntax. Also add some cosmetic newlines to the HTML code.
* The names of all other struct query memebers match the correspondingIngo Schwarze2014-07-251-12/+16
| | | | | | QUERY_STRING keys, so rename "expr" to "query". Also add some missing function prototypes. No functional change.
* clean up pg_show() to not modify a string returned from getenv(3)Ingo Schwarze2014-07-251-14/+19
|
* Rewrite http_parse() completely:Ingo Schwarze2014-07-251-47/+102
| | | | | | | | | 1. Make sure the last occurrence of each key is used, even if it is empty, in which case it resets the value to the default. 2. When there is an HTTP encoding error, skip the affected key-value pair only, but not all subsequent key-value pairs. 3. Do not modify a string returned from getenv(3). 4. Do not assume the NULL pointer is all null bits.
* Sort result pages first by section number, then by name.Ingo Schwarze2014-07-241-11/+0
| | | | | | | | By moving the sort from cgi.c to mansearch.c, we get two advantages: Easier access to the data needed for sorting, in particular the section number, and the apropos(1) command line utility profits as well. Feature requested by deraadt@.
* Provide a dropdown entry "All Architectures" and make it the default.Ingo Schwarze2014-07-241-1/+25
| | | | | | | Still, amd64 remains the default in the following sense: If a man(1) mode search returns more than one page of the same name, prefer amd64 over other architectures for immediate display. ok deraadt@ daniel@
* Security fix to prevent XSS attacks:Ingo Schwarze2014-07-221-1/+41
| | | | | | | | Restrict the character set of strings passed into html_alloc(), in particular architecture names that come from the QUERY_STRING, but also SCRIPT_NAME and manpath.conf content for additional safety, and bail out safely on violations. Issue reported by Sebastien Marie <semarie-openbsd at latrappe dot fr>.
* fix a minibug reported by kristaps@:Ingo Schwarze2014-07-211-5/+9
| | | | preserve manpath and arch in .Xr links
* Kristaps points out that the current HTTP/1.1 draft standard (RFCIngo Schwarze2014-07-211-2/+2
| | | | | | | | | | | | | | | | | | 2616) requires the Location: response-header field to be an absolute URI (14.30), and only the most recent proposed standard (RFC 7231), which is barely a month old, allows a relative Location: (7.1.2). While most modern browsers appear to support relative Location: headers, some may not, and it's maybe a bit early to rely on relative Location: headers. I'm not going back to the HTTP_HOST or SERVER_NAME CGI variables, though. While some CGI programs certainly require those, in which case both the CGI programmer and the web server admin have to be very careful to keep the system secure and reliable, man.cgi(8) does not really need them. We always know at compile time which domain we are running for, and for man.cgi(8), security and reliability are definitely much more important than flexibility. So make HTTP_HOST a compile-time definition for now.
* Security fix:Ingo Schwarze2014-07-191-4/+33
| | | | | | | | | | | Validate the manpath up front and report a Bad Request if it is not listed in manpath.conf, such that clients can't probe which directories exist on the server. In case of configuration errors, consistently report Internal Server Error without disclosing any further information. Partially based on a patch from Sebastien Marie <semarie-openbsd at latrappe dot fr>, but avoiding a couple of issues with that patch and approaching the issue in a somewhat more rigorous way.
* Security fix:Ingo Schwarze2014-07-191-1/+28
| | | | | | | | | | | | Validate the name of the file to show before opening it. Only allow relative filenames starting with "man" or "cat" and containing neither "/.." nor "../". While here, correct the condition discarding an initial "./". Vulnerability found by Sebastien Marie <semarie-openbsd at latrappe dot fr>. Many thanks for sending a patch; however, i did not use it but made the checks even stricter.
* Do not use the HTTP_HOST CGI variable,Ingo Schwarze2014-07-181-6/+2
| | | | | | | | just make the HTTP redirect Location: relative. Less user input is good, it reduces the attack surface. Besides, this removes one global variable and 4 lines of code. Patch from Sebastien Marie <semarie-openbsd at latrappe dot fr>.
* When the MAN_DIR/manpath.conf configuration file does not exist or is empty,Ingo Schwarze2014-07-181-2/+12
| | | | | | | | | log the problem, hand the pg_error_internal() error page to the client, and exit(3) in a controlled way instead of stumbling on and segfaulting later. Patch from Sebastien Marie <semarie-openbsd at latrappe dot fr>, messages tweaked by me.
* Compatibility hack for the old "manpath=OpenBSD<blank>" query parameter format;Ingo Schwarze2014-07-131-4/+15
| | | | | unfortunate, more than 400 links needing this are scattered all around the www.openbsd.org website, and CVSweb needs this as well.
* Make the calltree a bit easier to understand by giving theIngo Schwarze2014-07-131-22/+21
| | | | | | functions that call resp_begin_html() names starting with "pg_" and those called after resp_begin_html() names with "resp_". No functional change, purely renaming functions.
* make source vs. formatted guessing a bit more robustIngo Schwarze2014-07-131-0/+2
|
* By popular demand, bring man.cgi default mode closer to what man(1) does:Ingo Schwarze2014-07-131-20/+46
| | | | | | Even when there are multiple pages with the same name in different sections, show one of them, using the same priorities as in the default man.conf(5) file.
* Install the manuals of the web interface below the same directoryIngo Schwarze2014-07-131-4/+4
| | | | | | | | as manpath.conf, such that we do not need to mix our own documentation into the documentation we are serving, which may not even be possible if the latter is updated automatically. Based on an idea by beck@.
* Polish the search form using feedback from beck@ and others,Ingo Schwarze2014-07-121-27/+96
| | | | in particular introduce a section dropdown and an architecture dropdown.
* No need for run-time configuration, add minimal compile-timeIngo Schwarze2014-07-121-17/+7
| | | | | configuration facilities, just two paths and two HTML strings. Show the title on all pages, not just the index page.
* Simplify: Delete 74 lines of code including one enum type, oneIngo Schwarze2014-07-121-98/+25
| | | | | | global lookup table, two functions, two function arguments, one struct member, one local variable, and the "search/" and "show/" part of the URIs, all without losing functionality.
* Start fixing issues that beck@ helped find:Ingo Schwarze2014-07-121-37/+34
| | | | | | | | | | | | Distinguish between man(1) and apropos(1) mode by adding back the classical QUERY_STRING variable "apropos=". Change the default back to "apropos=0". Control it by adding a HTML <SELECT> element for it. Rename the "expr=" QUERY_STRING variable back to its classical name "query=", i don't see how the new name is better than the classical one. While here, drop the concept of a "legacy mode". Simply continue to support the features, and use what we consider best.
* fix the two manual links on the index pageIngo Schwarze2014-07-121-7/+8
|
* merge OpenBSD rev. 1.3 by tedu@:Ingo Schwarze2014-07-111-6/+8
| | | | | make http decode linear time. also remove a redundant null check.
* merge OpenBSD rev. 1.2 by tedu@:Ingo Schwarze2014-07-111-8/+9
| | | | http headers must end lines with CRLF.
* Link to the new man.cgi(8) manual, now that we have it! :-)Ingo Schwarze2014-07-101-2/+5
| | | | While here, s/satisfy/match/ when talking about queries.
* some sugar for the index pageIngo Schwarze2014-07-091-2/+10
|
* Clean up error reporting:Ingo Schwarze2014-07-091-49/+50
| | | | | | | * Consistent naming and use of resp_* functions. * Split resp_noresult() out of resp_search() and reuse it. * Log information about internal errors. * And some minor fixes.
* namespace cleanups:Ingo Schwarze2014-07-091-44/+47
| | | | | | | | | | CGI variable: s/CACHE_DIR/MAN_DIR/ because it's static, not a cache default MAN_DIR: /cache/man.cgi/ -> /man/ see above global variable: s/cache/mandir/ see above global variable: s/css/cssdir/ for consistency with mandir global variable: s/host/httphost/ for consistency with HTTP_HOST global variable: s/progname/scriptname/ for consistency with SCRIPT_NAME struct query: member s/manroot/manpath/ for consistency with QUERY_STRING
* remove obsolete __sun includesIngo Schwarze2014-07-091-9/+2
| | | | and improve some whitespace and comments
* set a reasonable default for .OsIngo Schwarze2014-07-091-1/+2
|
* oops, forgot to trim the newline characterIngo Schwarze2014-07-091-0/+2
|
* Simplify pathgen() even more.Ingo Schwarze2014-07-091-27/+13
| | | | | | Let manpath.conf be a plain text list of the directories to use. As a bonus, this makes the order configurable. Get rid of <dirent.h>, opendir(3), readdir(3), stat(2).