aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ge.c31
-rw-r--r--gmid.c67
-rw-r--r--gmid.h3
-rw-r--r--server.c77
4 files changed, 79 insertions, 99 deletions
diff --git a/ge.c b/ge.c
index 4ccbbdc..d96c37a 100644
--- a/ge.c
+++ b/ge.c
@@ -33,8 +33,7 @@ struct imsgbuf ibuf, logibuf;
struct conf conf;
struct fcgi fcgi[FCGI_MAX]; /* just because it's referenced */
-struct vhosthead hosts;
-
+struct vhosthead hosts = TAILQ_HEAD_INITIALIZER(hosts);
static const struct option opts[] = {
{"help", no_argument, NULL, 'h'},
@@ -136,7 +135,7 @@ logger_init(void)
}
static int
-serve(const char *host, int port, const char *dir, struct tls *ctx)
+serve(const char *host, int port, const char *dir)
{
struct addrinfo hints, *res, *res0;
int error, saved_errno, sock = -1;
@@ -184,7 +183,7 @@ serve(const char *host, int port, const char *dir, struct tls *ctx)
freeaddrinfo(res0);
log_notice(NULL, "serving %s on port %d", dir, port);
- return server_main(ctx, NULL, sock, -1);
+ return server_main(NULL, sock, -1);
}
static __dead void
@@ -200,8 +199,6 @@ usage(void)
int
main(int argc, char **argv)
{
- struct tls_config *tlsconf;
- struct tls *ctx;
struct vhost *host;
struct location *loc;
const char *errstr, *certs_dir = NULL, *hostname = "localhost";
@@ -210,6 +207,7 @@ main(int argc, char **argv)
logger_init();
conf.port = 1965;
+ conf.protos = TLS_PROTOCOL_TLSv1_2 | TLS_PROTOCOL_TLSv1_3;
while ((ch = getopt_long(argc, argv, "d:H:hp:Vv", opts, NULL)) != -1) {
switch (ch) {
@@ -276,27 +274,8 @@ main(int argc, char **argv)
free(tmp);
}
- /* setup tls */
-
- if ((tlsconf = tls_config_new()) == NULL)
- fatal("tls_config_new");
-
- /* optionally accept client certs but don't try to verify them */
- tls_config_verify_client_optional(tlsconf);
- tls_config_insecure_noverifycert(tlsconf);
-
- if ((ctx = tls_server()) == NULL)
- fatal("tls_server failure");
-
- if (tls_config_set_keypair_file(tlsconf, host->cert, host->key))
- fatalx("can't load the keypair (%s, %s): %s",
- host->cert, host->key, tls_config_error(tlsconf));
-
- if (tls_configure(ctx, tlsconf) == -1)
- fatalx("tls_configure: %s", tls_error(ctx));
-
/* start the server */
signal(SIGPIPE, SIG_IGN);
setproctitle("%s", loc->dir);
- return serve(hostname, conf.port, loc->dir, ctx);
+ return serve(hostname, conf.port, loc->dir);
}
diff --git a/gmid.c b/gmid.c
index 82a42ca..af4d9cf 100644
--- a/gmid.c
+++ b/gmid.c
@@ -51,9 +51,6 @@ const char *pidfile;
struct conf conf;
-struct tls_config *tlsconf;
-struct tls *ctx;
-
static void
dummy_handler(int signo)
{
@@ -115,61 +112,6 @@ make_socket(int port, int family)
return sock;
}
-static void
-add_keypair(struct vhost *h)
-{
- if (*h->ocsp == '\0') {
- if (tls_config_add_keypair_file(tlsconf, h->cert, h->key) == -1)
- fatalx("failed to load the keypair (%s, %s): %s",
- h->cert, h->key, tls_config_error(tlsconf));
- } else {
- if (tls_config_add_keypair_ocsp_file(tlsconf, h->cert, h->key,
- h->ocsp) == -1)
- fatalx("failed to load the keypair (%s, %s, %s): %s",
- h->cert, h->key, h->ocsp,
- tls_config_error(tlsconf));
- }
-}
-
-void
-setup_tls(void)
-{
- struct vhost *h;
-
- if ((tlsconf = tls_config_new()) == NULL)
- fatal("tls_config_new");
-
- /* optionally accept client certs, but don't try to verify them */
- tls_config_verify_client_optional(tlsconf);
- tls_config_insecure_noverifycert(tlsconf);
-
- if (tls_config_set_protocols(tlsconf, conf.protos) == -1)
- fatalx("tls_config_set_protocols: %s",
- tls_config_error(tlsconf));
-
- if ((ctx = tls_server()) == NULL)
- fatal("tls_server failure");
-
- h = TAILQ_FIRST(&hosts);
-
- /* we need to set something, then we can add how many key we want */
- if (tls_config_set_keypair_file(tlsconf, h->cert, h->key))
- fatalx("tls_config_set_keypair_file failed for (%s, %s): %s",
- h->cert, h->key, tls_config_error(tlsconf));
-
- /* same for OCSP */
- if (*h->ocsp != '\0' &&
- tls_config_set_ocsp_staple_file(tlsconf, h->ocsp) == -1)
- fatalx("tls_config_set_ocsp_staple_file failed for (%s): %s",
- h->ocsp, tls_config_error(tlsconf));
-
- while ((h = TAILQ_NEXT(h, vhosts)) != NULL)
- add_keypair(h);
-
- if (tls_configure(ctx, tlsconf) == -1)
- fatalx("tls_configure: %s", tls_error(ctx));
-}
-
void
init_config(void)
{
@@ -233,9 +175,6 @@ free_config(void)
}
memset(fcgi, 0, sizeof(fcgi));
-
- tls_free(ctx);
- tls_config_free(tlsconf);
}
static int
@@ -322,10 +261,6 @@ serve(void)
{
int i, p[2];
- /* setup tls before dropping privileges: we don't want user
- * to put private certs inside the chroot. */
- setup_tls();
-
for (i = 0; i < conf.prefork; ++i) {
if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC,
PF_UNSPEC, p) == -1)
@@ -338,7 +273,7 @@ serve(void)
close(p[0]);
imsg_init(&servibuf[i], p[1]);
setproctitle("server");
- _exit(server_main(ctx, &servibuf[i], sock4, sock6));
+ _exit(server_main(&servibuf[i], sock4, sock6));
default:
close(p[1]);
imsg_init(&servibuf[i], p[0]);
diff --git a/gmid.h b/gmid.h
index e2a0128..e187147 100644
--- a/gmid.h
+++ b/gmid.h
@@ -297,7 +297,6 @@ enum imsg_type {
char *data_dir(void);
void load_local_cert(struct vhost*, const char*, const char*);
int make_socket(int, int);
-void setup_tls(void);
void init_config(void);
void free_config(void);
void drop_priv(void);
@@ -335,7 +334,7 @@ void client_write(struct bufferevent *, void *);
void start_reply(struct client*, int, const char*);
void client_close(struct client *);
struct client *client_by_id(int);
-int server_main(struct tls *, struct imsgbuf *, int, int);
+int server_main(struct imsgbuf *, int, int);
int client_tree_cmp(struct client *, struct client *);
SPLAY_PROTOTYPE(client_tree_id, client, entry, client_tree_cmp);
diff --git a/server.c b/server.c
index 3373182..13bc1db 100644
--- a/server.c
+++ b/server.c
@@ -1368,10 +1368,8 @@ handle_siginfo(int fd, short ev, void *d)
}
static void
-loop(struct tls *ctx_, int sock4, int sock6, struct imsgbuf *ibuf)
+loop(int sock4, int sock6, struct imsgbuf *ibuf)
{
- ctx = ctx_;
-
SPLAY_INIT(&clients);
event_init();
@@ -1405,6 +1403,70 @@ loop(struct tls *ctx_, int sock4, int sock6, struct imsgbuf *ibuf)
}
static void
+add_keypair(struct vhost *h, struct tls_config *conf)
+{
+ if (*h->ocsp == '\0') {
+ if (tls_config_add_keypair_file(conf, h->cert, h->key) == -1)
+ fatalx("failed to load the keypair (%s, %s): %s",
+ h->cert, h->key, tls_config_error(conf));
+ } else {
+ if (tls_config_add_keypair_ocsp_file(conf, h->cert, h->key,
+ h->ocsp) == -1)
+ fatalx("failed to load the keypair (%s, %s, %s): %s",
+ h->cert, h->key, h->ocsp,
+ tls_config_error(conf));
+ }
+}
+
+/*
+ * XXX: in a ideal privsep world, this is done by the parent process
+ * and its content sent to us.
+ */
+static void
+setup_tls(void)
+{
+ struct tls_config *tlsconf;
+ struct vhost *h;
+
+ if ((tlsconf = tls_config_new()) == NULL)
+ fatal("tls_config_new");
+
+ /* optionally accept client certs, but don't try to verify them */
+ tls_config_verify_client_optional(tlsconf);
+ tls_config_insecure_noverifycert(tlsconf);
+
+ if (tls_config_set_protocols(tlsconf, conf.protos) == -1)
+ fatalx("tls_config_set_protocols: %s",
+ tls_config_error(tlsconf));
+
+ h = TAILQ_FIRST(&hosts);
+
+ log_warn(NULL, "loading %s, %s, %s", h->cert, h->key, h->ocsp);
+
+ /* we need to set something, then we can add how many key we want */
+ if (tls_config_set_keypair_file(tlsconf, h->cert, h->key))
+ fatalx("tls_config_set_keypair_file failed for (%s, %s): %s",
+ h->cert, h->key, tls_config_error(tlsconf));
+
+ /* same for OCSP */
+ if (*h->ocsp != '\0' &&
+ tls_config_set_ocsp_staple_file(tlsconf, h->ocsp) == -1)
+ fatalx("tls_config_set_ocsp_staple_file failed for (%s): %s",
+ h->ocsp, tls_config_error(tlsconf));
+
+ while ((h = TAILQ_NEXT(h, vhosts)) != NULL)
+ add_keypair(h, tlsconf);
+
+ if ((ctx = tls_server()) == NULL)
+ fatal("tls_server failure");
+
+ if (tls_configure(ctx, tlsconf) == -1)
+ fatalx("tls_configure: %s", tls_error(ctx));
+
+ tls_config_free(tlsconf);
+}
+
+static void
load_vhosts(void)
{
struct vhost *h;
@@ -1423,14 +1485,19 @@ load_vhosts(void)
}
int
-server_main(struct tls *ctx_, struct imsgbuf *ibuf, int sock4, int sock6)
+server_main(struct imsgbuf *ibuf, int sock4, int sock6)
{
+ /*
+ * setup tls before dropping privileges: we don't want user
+ * to put private certs inside the chroot.
+ */
+ setup_tls();
drop_priv();
if (load_default_mime(&conf.mime) == -1)
fatal("can't load default mime");
sort_mime(&conf.mime);
load_vhosts();
- loop(ctx_, sock4, sock6, ibuf);
+ loop(sock4, sock6, ibuf);
return 0;
}