1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
# gmid
gmid is a full-featured Gemini server written with security in mind.
It can serve static files, has optional FastCGI and proxying support,
and a rich configuration syntax.
A few helper programs are shipped as part of gmid:
- `gg` is a simple command-line Gemini client.
- `gemexp` is a stripped-down config-less version of gmid to quickly
serve a directory from the command line.
- `titan` is a command-line titan client.
## Internationalisation (IRIs, IDN, UNICODE)
Even thought the current Gemini specification doesn't mention anything
in this regard, I think it's important to make as easy as possible to
use non-ASCII characters in domain names and URL paths.
For starters, gmid has full support for IRIs (RFC3987 —
Internationalized Resource Identifiers). IRIs are a superset of URIs
that allow UNICODE characters, so there aren't incompatibilities with
URI-only clients.
There is full support also for IDNs (Internationalized Domain Names).
There's no need to fiddle with punycode, or even know what it is: the
hostname in the configuration file can (and must be) in the decoded
form (e.g. `naïve` and not `xn--nave-6pa`), gmid will do the rest.
The only missing piece is UNICODE normalisation of the IRI path: gmid
doesn't do that (yet).
## Configuration
[httpd]: https://man.openbsd.org/httpd.8
gmid has a rich configuration file, heavily inspired by OpenBSD'
[httpd(8)][httpd], with every detail carefully documented in the
manpage. Here's a minimal example of a config file:
```conf
# /etc/gmid.conf
server "example.com" {
listen on * port 1965
cert "/path/to/cert.pem"
key "/path/to/key.pem"
root "/var/gemini/example.com"
}
```
and a slightly more complex one
```conf
# /etc/gmid.conf
cert_root = "/path/to/keys"
server "example.com" {
listen on * port 1965
alias "foobar.com"
cert $cert_root "/example.com.crt"
key $cert_root "/example.com.pem"
root "/var/gemini/example.com"
# lang for text/gemini files
lang "en"
# only for locations that matches /files/*
location "/files/*" {
# generate directory listings
auto index on
}
location "/repo/*" {
# change the index file name
index "README.gmi"
lang "it"
}
}
```
## Building
gmid depends on libevent2, LibreSSL or OpenSSL, and yacc or GNU bison.
The build is as simple as
$ ./configure
$ make
If the configure scripts fails to pick up something, please open an
issue or notify me via email.
To install execute:
# make install
### Testing
Execute
$ make regress
to start the suite. Keep in mind that the regression tests needs to
create a few file inside the `regress` directory and bind the 10965 and
10966 ports.
## Contributing
Any form of contribution is welcome, not only patches or bug reports.
If you have a sample configuration for some specific use-case, a
script or anything that could be useful to others, consider adding it
to the `contrib` directory.
## Architecture/Security considerations
gmid has a privsep design, where the operations done by the daemon are
split into multiple processes:
- main: the main process is the only one that keeps the original
privileges. It opens the TLS certificates on the behalf of the
`server` and `crypto` processes, reloads the configuration upon
`SIGHUP` and re-opens the log files upon `SIGUSR1`.
- logger: handles the logging with syslog and/or local files.
- server: listens for connections and handles the requests. It also
speaks FastCGI and do the proxying.
- crypto: holds the TLS private keys to avoid a compromised `server`
process to disclose them.
|