1.\" $OpenBSD: man.cgi.8,v 1.10 2014/09/14 19:44:20 schwarze Exp $ 2.\" 3.\" Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org> 4.\" 5.\" Permission to use, copy, modify, and distribute this software for any 6.\" purpose with or without fee is hereby granted, provided that the above 7.\" copyright notice and this permission notice appear in all copies. 8.\" 9.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16.\" 17.Dd $Mdocdate: September 14 2014 $ 18.Dt MAN.CGI 8 19.Os 20.Sh NAME 21.Nm man.cgi 22.Nd CGI program to search and display manual pages 23.Sh DESCRIPTION 24The 25.Nm 26CGI program searches for manual pages on a WWW server 27and displays them to HTTP clients, 28providing functionality equivalent to the 29.Xr apropos 1 30and 31.Xr man 1 32utilities. 33It can use multiple manual trees in parallel. 34.Ss HTML search interface 35At the top of each generated HTML page, 36.Nm 37displays a search form containing these elements: 38.Bl -enum 39.It 40An input box for search queries, expecting 41either a name of a manual page or an 42.Ar expression 43using the syntax described in the 44.Xr apropos 1 45manual; filling this in is required for each search. 46.Pp 47The expression is broken into words at whitespace. 48Whitespace characters and backslashes can be escaped 49by prepending a backslash. 50The effect of prepending a backslash to another character is undefined; 51in the current implementation, it has no effect. 52.It 53A 54.Dq Submit 55button to send a search request from the client to the server. 56.It 57A 58.Dq Reset 59button to undo any changes to the input boxes and the dropdown menus 60and reset them to the values contained in the 61.Ev QUERY_STRING . 62.It 63Radio buttons to select pages either by name like in 64.Xr man 1 65or using 66.Xr apropos 1 67queries. 68.It 69A dropdown menu to optionally select a manual section. 70If one is provided, it has the same effect as the 71.Xr man 1 72and 73.Xr apropos 1 74.Fl s 75option. 76Otherwise, pages from all sections are shown. 77.It 78A dropdown menu to optionally select an architecture. 79If one is provided, it has the same effect as the 80.Xr man 1 81and 82.Xr apropos 1 83.Fl S 84option. 85By default, pages for all architectures are shown. 86.It 87A dropdown menu to select a manual tree. 88If the configuration file 89.Pa /var/www/man/manpath.conf 90contains only one manpath, the dropdown menu is not shown. 91By default, the first manpath given in the file is used. 92.El 93.Ss Program output 94The 95.Nm 96program generates five kinds of output pages: 97.Bl -tag -width Ds 98.It The index page. 99This is returned when calling 100.Nm 101without 102.Ev PATH_INFO 103and without a 104.Ev QUERY_STRING . 105It serves as a starting point for using the program 106and shows the search form only. 107.It A list page. 108Lists are returned when searches match more than one manual page. 109The first column shows the names and section numbers of manuals 110as clickable links. 111The second column shows the one-line descriptions of the manuals. 112.It A manual page. 113This output format is used when a search matches exactly one 114manual page, or when a link on a list page or an 115.Ic \&Xr 116link on another manual page is followed. 117.It A no-result page. 118This is shown when a search request returns no results - 119eiher because it violates the query syntax, or because 120the search does not match any manual pages. 121.It \&An error page. 122This cannot happen by merely clicking the 123.Dq Search 124button, but only by manually entering an invalid URI. 125It does not show the search form, but only an error message 126and a link back to the index page. 127.El 128.Ss Setup 129For each manual tree, create one first-level subdirectory below 130.Pa /var/www/man . 131The name of one of these directories is called a 132.Dq manpath 133in the context of 134.Nm . 135Create a single ASCII text file 136.Pa /var/www/man/manpath.conf 137containing the names of these directories, one per line. 138The directory given first is used as the default manpath. 139.Pp 140Inside each of these directories, use the same directory and file 141structure as found below 142.Pa /usr/share/man , 143that is, second-level subdirectories 144.Pa /var/www/man/*/man1 , /var/www/man/*/man2 145etc. containing source 146.Xr mdoc 7 147and 148.Xr man 7 149manuals with file name extensions matching the section numbers, 150second-level subdirectories 151.Pa /var/www/man/*/cat1 , /var/www/man/*/cat2 152etc. containing preformatted manuals with the file name extension 153.Sq 0 , 154and optional third-level subdirectories for architectures. 155Use 156.Xr makewhatis 8 157to create a 158.Xr mandoc.db 5 159database inside each manpath. 160.Pp 161Configure your web server to execute CGI programs located in 162.Pa /cgi-bin . 163.Pp 164To compile 165.Nm , 166first copy 167.Pa cgi.h.example 168to 169.Pa cgi.h 170and edit it according to your needs. 171It contains the following compile-time definitions: 172.Bl -tag -width Ds 173.It Ev COMPAT_OLDURI 174Only useful for running on www.openbsd.org to deal with old URIs containing 175.Qq "manpath=OpenBSD " 176where the blank character has to be translated to a hyphen. 177When compiling for other sites, this definition can be deleted. 178.It Ev CSS_DIR 179An optional path to the directory containing the CSS files, 180to be specified relative to the server's document root, 181and to be specified without a trailing slash. 182When not specified, the CSS files 183are assumed to be in the document root. 184This is used in generated HTML code. 185.It Ev CUSTOMIZE_BEGIN 186A HTML string to be inserted right after opening the 187.Aq BODY 188element. 189.It Ev CUSTOMIZE_TITLE 190An ASCII string to be used for the HTML 191.Aq TITLE 192element. 193.It Ev HTTP_HOST 194The FQDN of the (possibly virtual) host the HTTP server is running on. 195This is used for 196.Ic Location: 197headers in HTTP 303 responses. 198.It Ev MAN_DIR 199A path to the 200.Nm 201data directory to be used instead of 202.Pa /var/www/man , 203relative to the web server 204.Xr chroot 2 205directory, to be specified without a trailing slash. 206This is prepended to the manpath when opening 207.Xr mandoc.db 5 208and manual page files. 209.El 210.Pp 211After editing 212.Pa cgi.h , 213run 214.Pp 215.Dl make man.cgi 216.Pp 217and copy the files to the proper locations. 218Reading the 219.Cm installcgi 220target in the 221.Pa Makefile 222can help with that, but do not run it without carefully checking it 223because the directory layouts of web servers vary greatly. 224.Ss URI interface 225.Nm 226uniform resource identifiers are not needed for interactive use, 227but can be useful for deep linking. 228They consist of: 229.Bl -enum 230.It 231The 232.Cm http:// 233protocol specifier. 234.It 235The host name and a following slash. 236.It 237The path to the program, normally 238.Pa cgi-bin/man.cgi/ . 239.It 240To show a single page, a slash, the manpath, another slash, 241and the name of the requested file, for example 242.Pa /OpenBSD-current/man1/mandoc.1 . 243.It 244For searches, a query string starting with a question mark 245and consisting of 246.Ar key Ns = Ns Ar value 247pairs, separated by ampersands, for example 248.Pa ?manpath=OpenBSD-current&query=mandoc . 249Supported keys are 250.Cm manpath , 251.Cm query , 252.Cm sec , 253.Cm arch , 254corresponding to 255.Xr apropos 1 256.Fl M , 257.Ar expression , 258.Fl s , 259.Fl S , 260respectively, and 261.Cm apropos , 262which is a boolean parameter to select or deselect the 263.Xr apropos 1 264query mode. 265For backward compatibility with the traditional 266.Nm , 267.Cm sektion 268is supported as an alias for 269.Cm sec . 270.El 271.Ss Restricted character set 272For security reasons, in particular to prevent cross site scripting 273attacks, some strings used by 274.Nm 275can only contain the following characters: 276.Pp 277.Bl -dash -compact -offset indent 278.It 279lower case and upper case ASCII letters 280.It 281the ten decimal digits 282.It 283the dash 284.Pq Sq - 285.It 286the dot 287.Pq Sq \&. 288.It 289the slash 290.Pq Sq / 291.It 292the underscore 293.Pq Sq _ 294.El 295.Pp 296In particular, this applies to the 297.Ev SCRIPT_NAME , 298to all manpaths, and to all architecture names. 299.Sh ENVIRONMENT 300The web server may pass the following CGI variables to 301.Nm : 302.Bl -tag -width Ds 303.It Ev PATH_INFO 304The final part of the URI path passed from the client to the server, 305starting after the 306.Ev SCRIPT_NAME 307and ending before the 308.Ev QUERY_STRING . 309It is used by the 310.Cm show 311page to acquire the manpath and filename it needs. 312.It Ev QUERY_STRING 313The HTTP query string passed from the client to the server. 314It is the final part of the URI, after the question mark. 315It is used by the 316.Cm search 317page to acquire the named parameters it needs. 318.It Ev SCRIPT_NAME 319The path to the 320.Nm 321binary relative to the server root, usually 322.Pa /cgi-bin/man.cgi . 323This is used for generating URIs to be embedded 324in generated HTML code and HTTP headers. 325If this contains any character not contained in the 326.Sx Restricted character set , 327.Nm 328reports an internal server error and exits without doing anything. 329.El 330.Sh FILES 331.Bl -tag -width Ds 332.It Pa /var/www 333Default web server 334.Xr chroot 2 335directory. 336All the following paths are specified relative to this directory. 337.It Pa /cgi-bin/man.cgi 338The path to the 339.Nm 340program relative to the server root. 341Can be overridden by 342.Ev SCRIPT_NAME . 343.It Pa /htdocs 344The path to the server document root relative to the server root. 345This is part of the web server configuration and not specific to 346.Nm . 347.It Pa /htdocs/man-cgi.css 348A style sheet for general 349.Nm 350styling, referenced from each generated HTML page. 351.It Pa /htdocs/man.css 352A style sheet for 353.Xr mandoc 1 354HTML styling, referenced from each generated HTML page after 355.Pa man-cgi.css . 356.It Pa /man 357Default 358.Nm 359data directory containing all the manual trees. 360Can be overridden by 361.Ev MAN_DIR . 362.It Pa /man/mandoc/man1/apropos.1 , /man/mandoc/man8/man.cgi.8 363Manual pages documenting 364.Nm 365itself, linked from the index page. 366.It Pa /man/manpath.conf 367The list of available manpaths, one per line. 368If any of the lines in this file contains a slash 369.Pq Sq / 370or any character not contained in the 371.Sx Restricted character set , 372.Nm 373reports an internal server error and exits without doing anything. 374.It Pa /man/OpenBSD-current/man1/mandoc.1 375An example 376.Xr mdoc 7 377source file located below the 378.Dq OpenBSD-current 379manpath. 380.El 381.Sh COMPATIBILITY 382The 383.Nm 384CGI program is call-compatible with queries from the traditional 385.Pa man.cgi 386script by Wolfram Schneider. 387However, the output may not be quite the same. 388.Sh SEE ALSO 389.Xr apropos 1 , 390.Xr mandoc.db 5 , 391.Xr makewhatis 8 , 392.Xr slowcgi 8 393.Sh HISTORY 394A version of 395.Nm 396based on 397.Xr mandoc 1 398first appeared in mdocml-1.12.1 (March 2012). 399The current SQLite3-based version first appeared in 400.Ox 5.6 . 401.Sh AUTHORS 402.An -nosplit 403The 404.Nm 405program was written by 406.An Kristaps Dzonsons Aq Mt kristaps@bsd.lv 407and ported to the SQLite3-based 408.Xr mandoc.db 5 409backend by 410.An Ingo Schwarze Aq Mt schwarze@openbsd.org . 411