Merge branch 'master' of github.com:michael-lazar/jetforce

This commit is contained in:
Michael Lazar 2020-05-31 00:21:09 -04:00
commit 0c1483c9d5
1 changed files with 129 additions and 31 deletions

160
README.md
View File

@ -121,7 +121,7 @@ a directory is requested, jetforce will look for a file named **index.gmi** in t
directory to return. Otherwise, a directory file listing will be automatically directory to return. Otherwise, a directory file listing will be automatically
generated. generated.
### CGI Scripts ### CGI
Jetforce supports a simplified version of CGI scripting. It doesn't Jetforce supports a simplified version of CGI scripting. It doesn't
exactly follow the [RFC 3875](https://tools.ietf.org/html/rfc3875) exactly follow the [RFC 3875](https://tools.ietf.org/html/rfc3875)
@ -130,36 +130,7 @@ specification for CGI, but it gets the job done for the purposes of Gemini.
Any executable file placed in the server's ``cgi-bin/`` directory will be Any executable file placed in the server's ``cgi-bin/`` directory will be
considered a CGI script. When a CGI script is requested by a gemini client, considered a CGI script. When a CGI script is requested by a gemini client,
the jetforce server will execute the script and pass along information about the jetforce server will execute the script and pass along information about
the request using environment variables: the request using environment variables.
| Variable Name | Description | Example |
| --- | --- | --- |
| GATEWAY_INTERFACE | CGI version (for compatability). | ``GCI/1.1`` |
| SERVER_PROTOCOL | The server protocol. | ``GEMINI`` |
| SERVER_SOFTWARE | The server version string. | ``jetforce/0.0.7`` |
| GEMINI_URL | Raw URL string from the request. | ``gemini://mozz.us/cgi-bin/example.cgi/hello?world``
| SCRIPT_NAME | The part of the URL's path that corresponds to the CGI script location. | ``/cgi-bin/example.cgi`` |
| PATH_INFO | The remainder of the URL's path after the CGI script location. | ``/hello`` |
| QUERY_STRING | The query string portion of the request URL. | ``world`` |
| HOSTNAME | Server hostname. | ``mozz.us`` |
| SERVER_NAME | Server hostname (alias for HOSTNAME). | ``mozz.us`` |
| REMOTE_ADDR | Client IP address. | ``10.10.0.2`` |
| REMOTE_HOST | Client IP address (alias for REMOTE_ADDR). | ``10.10.0.2`` |
| SERVER_PORT | Server port number. | ``1965`` |
| TLS_CIPHER | TLS cipher that was negotiated. | ``TLS_AES_256_GCM_SHA384``|
| TLS_VERSION | TLS version that was negotiated. | ``TLSv1.3`` |
Additional CGI variables will also be included when the connection uses a TLS client certificate:
| Variable Name | Description | Example |
| --- | --- | --- |
| AUTH_TYPE | Authentication type (for compatability). | ``CERTIFICATE`` |
| REMOTE_USER | The subject CommonName attribute, if provided. | ``michael123`` |
| TLS_CLIENT_HASH | A base64-encoded certificate fingerprint. | ``hjQftIC/4zPDQ1MNdav5nRQ39pM482xoTIgxtjyZOpY=`` |
| TLS_CLIENT_NOT_BEFORE | Certificate activation date. | ``2020-04-05T04:18:22Z`` |
| TLS_CLIENT_NOT_AFTER | Certificate expiration date. | ``2021-04-05T04:18:22Z`` |
| TLS_CLIENT_SERIAL_NUMBER | Certificate serial number. | ``73629018972631`` |
| TLS_CLIENT_AUTHORISED | Was the certificate verified by the server's CA? | ``0`` (not authorised) / ``1`` (authorised) |
The CGI script must then write the gemini response to the *stdout* stream. The CGI script must then write the gemini response to the *stdout* stream.
This includes the status code and meta string on the first line, and the This includes the status code and meta string on the first line, and the
@ -167,6 +138,133 @@ optional response body on subsequent lines. The bytes generated by the
CGI script will be forwarded *verbatim* to the gemini client, without any CGI script will be forwarded *verbatim* to the gemini client, without any
additional modification by the server. additional modification by the server.
#### CGI Environment Variables
<dl>
<dt>GATEWAY_INTERFACE</dt>
<dd>
CGI version (for compatability with RFC 3785).<br>
<em>Example: "GCI/1.1"</em>
</dd>
<dt>SERVER_PROTOCOL</dt>
<dd>
The server protocol.<br>
<em>Example: "GEMINI"</em>
</dd>
<dt>SERVER_SOFTWARE</dt>
<dd>
The server name and version.<br>
<em>Example: "jetforce/0.0.7"</em>
</dd>
<dt>GEMINI_URL</dt>
<dd>
The entire URL that was requested by the client.<br>
<em>Example: "gemini://mozz.us/cgi-bin/example.cgi/hello?world"</em>
</dd>
<dt>SCRIPT_NAME</dt>
<dd>
The part of the URL's path that corresponds to the CGI script location.<br>
<em>Example: "/cgi-bin/example.cgi"</em>
</dd>
<dt>PATH_INFO</dt>
<dd>
The remainder of the URL's path after the SCRIPT_NAME.<br>
<em>Example: "/hello"</em>
</dd>
<dt>QUERY_STRING</dt>
<dd>
The query string portion of the request URL.<br>
<em>Example: "world"</em>
</dd>
<dt>SERVER_NAME / HOSTNAME</dt>
<dd>
The server hostname.<br>
<em>Example: "mozz.us"</em>
</dd>
<dt>SERVER_PORT</dt>
<dd>
The server port number.<br>
<em>Example: "1965"</em>
</dd>
<dt>REMOTE_HOST / REMOTE_ADDR</dt>
<dd>
The client's IP address.<br>
<em>Example: "10.10.0.2"</em>
</dd>
<dt>TLS_CIPHER</dt>
<dd>
The negotiated TLS cipher<br>
<em>Example: "TLS_AES_256_GCM_SHA384"</em>
</dd>
<dt>TLS_VERSION</dt>
<dd>
The negotiated TLS version.<br>
<em>Example: "TLSv1.3"</em>
</dd>
</dl>
#### CGI Environment Variables - Authenticated
Additional CGI variables will be included only when the client connection uses a TLS client certificate:
<dl>
<dt>AUTH_TYPE</dt>
<dd>
Authentication type (for compatability with RFC 3785).<br>
<em>Example: "CERTIFICATE"</em>
</dd>
<dt>REMOTE_USER</dt>
<dd>
The certificate's subject CommonName attribute, if provided.<br>
<em>Example: "mozz123"</em>
</dd>
<dt>TLS_CLIENT_HASH</dt>
<dd>
A base64-encoded fingerprint that can be used to uniquely identify the certificate.<br>
<em>Example: "hjQftIC/4zPDQ1MNdav5nRQ39pM482xoTIgxtjyZOpY="</em>
</dd>
<dt>TLS_CLIENT_NOT_BEFORE</dt>
<dd>
The certificate's activation date.<br>
<em>Example: "2020-04-05T04:18:22Z"</em>
</dd>
<dt>TLS_CLIENT_NOT_AFTER</dt>
<dd>
The certificate's activation date.<br>
<em>Example: "2021-04-05T04:18:22Z"</em>
</dd>
<dt>TLS_CLIENT_SERIAL_NUMBER</dt>
<dd>
The certificate's serial number.<br>
<em>Example: "73629018972631"</em>
</dd>
<dt>TLS_CLIENT_VERIFIED</dt>
<dd>
Was the certificate deemed trusted by the server's CA certificate store.<br>
<em>0 (not authorised) / 1 (authorised)</em>
</dd>
</dl>
## Deployment ## Deployment
Jetforce is intended to be run behind a process manager that handles Jetforce is intended to be run behind a process manager that handles