1
0
Fork
You've already forked gmid
0
forked from op/gmid
simple and secure gemini server
  • C 81.1%
  • Roff 4.3%
  • Yacc 4.3%
  • Shell 3.6%
  • Makefile 2.1%
  • Other 4.5%
Find a file
Omar Polo 72caf63ecb client_cose: fix proxy event shutdown
depending on the timing, we might still have the timeout set and
that would re-enter the connection logic with a client struct free'd.
Reported by requiem, thank you!
2025年06月14日 14:20:00 +00:00
.github/workflows github: limit docker image builds to tags and the master branch 2024年08月24日 10:13:14 +00:00
compat update to new imsg APIs 2024年11月24日 14:28:58 +00:00
contrib typos; courtesy of codespell 2024年09月01日 07:54:06 +00:00
have fix imsg test 2024年11月24日 14:32:08 +00:00
keys prepare release 2.1 2024年08月03日 16:12:47 +00:00
regress fix test_log_common 2024年11月24日 14:30:19 +00:00
site typos; courtesy of codespell 2024年09月01日 07:54:06 +00:00
.cirrus.yml comment out stravis instead of adding -Wno-* for stupid gcc 2024年06月17日 07:09:14 +00:00
.dockerignore contrib/Dockerfile: fix the build and improve the usage 2024年01月11日 15:42:02 +00:00
.gitignore fuzzying the proxy protocol too 2024年07月02日 21:43:54 +00:00
ChangeLog prepare release 2.1.1 2024年08月25日 11:15:21 +00:00
config.c typos; courtesy of codespell 2024年09月01日 07:54:06 +00:00
configure -current again 2024年08月25日 11:20:43 +00:00
crypto.c update to new imsg APIs 2024年11月24日 14:28:58 +00:00
dirs.c don't set d_reclen 2022年07月07日 08:54:26 +00:00
fcgi.c fix: send port as SERVER_PORT 2024年08月18日 10:20:16 +02:00
ge.c gemexp: add -v 2024年07月02日 22:07:23 +00:00
gemexp.1 gemexp: add -v 2024年07月02日 22:07:23 +00:00
gg.1 gg: support IPv6 addresses in -P 2024年08月03日 14:02:00 +00:00
gg.c gg: support IPv6 addresses in -P 2024年08月03日 14:02:00 +00:00
gmid.8 improve the description for -f 2024年04月27日 16:10:46 +00:00
gmid.c fix timestamps in common and combined log styles 2024年08月29日 17:37:39 +00:00
gmid.conf.5 one more typo from codespell 2024年09月01日 07:56:50 +00:00
gmid.h work around comically tiny HOST_NAME_MAX on glibc system 2024年08月23日 10:22:31 +00:00
iri.c iri: don't error on a '..' component at the start of the path 2024年06月10日 11:42:22 +00:00
iri.h split out iri.h from gmid.h 2023年07月22日 13:49:07 +00:00
LICENSE copyright years 2022年07月04日 09:48:39 +00:00
log.c add missing include of gmid.h 2023年06月06日 11:57:33 +00:00
log.h switch to the more usual log.c 2023年06月06日 11:46:40 +00:00
logger.c convert remaining code to the imsg getters 2024年01月21日 19:40:06 +00:00
Makefile prepare release 2.1 2024年08月03日 16:12:47 +00:00
mime.c copyright years++ 2023年06月24日 10:07:17 +00:00
parse.y spell "nam" with the "e"; from codespell 2024年09月01日 07:55:10 +00:00
proc.c update to new imsg APIs 2024年11月24日 14:28:58 +00:00
proc.h remove proc_forward_imsg since it's unused 2024年01月21日 12:23:28 +00:00
proxy-proto.c proxy-protocol: accept cross-family proxying 2024年08月03日 14:40:17 +00:00
proxy.c add support for using the proxy protocol v1 when proxying too 2024年08月03日 10:27:07 +00:00
puny.c remove not so useful starts_with() 2023年08月11日 10:38:34 +00:00
README.md typos; courtesy of codespell 2024年09月01日 07:54:06 +00:00
sandbox.c resurrect landlock support 2023年08月23日 20:18:59 +00:00
server.c client_cose: fix proxy event shutdown 2025年06月14日 14:20:00 +00:00
titan.1 typos; courtesy of codespell 2024年09月01日 07:54:06 +00:00
titan.c typos; courtesy of codespell 2024年09月01日 07:54:06 +00:00
utf8.c fmt 2021年10月18日 10:05:55 +00:00
utils.c style 2024年06月10日 10:25:54 +00:00

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

gmid has a rich configuration file, heavily inspired by OpenBSD' httpd(8), with every detail carefully documented in the manpage. Here's a minimal example of a config file:

# /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

# /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.