- [x] Update local to latest Swift version - [x] Smoke test - [x] Address any and all warnings - [x] Fix invalid json in README and example json file - [x] Update production to latest Swift version - [x] Rip out static site generation TODOs, move into separate repo - [x] Make sure all TODOs are addressed - [x] Update README - [x] Audit code changes for loggable scenarios, including misconfigurations for new config file updates - [x] Merge and tag SocketServer - [x] Implement - Short-lived client certificates are allowed - Generated on demand - Deleted immediately after use - Can be used as a "session identifier" to maintain server-side state for applications - Substitute for HTTP cookies, only generated voluntarily by the client, and once client deletes it, server cannot possible resurrect same value later - Long-lived client certificates can be used for authentication into multi-user applications without passwords - Self-hosted, single-user applications can be secured in manner familiar with OpenSSH, analogous to the `.authorized_keys` file for SSH - Gemini requests typically made without client certificate - Client certs created in response to a server request for one (via response code) - [x] Has its scope bound to the same hostname as the request URL and to all paths below the path of the request URL path - Interactive clients are strongly recommended to make deletion / temporary deactivation of certificates easy and to give users full control of client certificates