iAdd TLS support - sacc - sacc(omys), simple console gopher client Err bitreich.org 70 hgit clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ URL:git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ bitreich.org 70 1Log /scm/sacc/log.gph bitreich.org 70 1Files /scm/sacc/files.gph bitreich.org 70 1Refs /scm/sacc/refs.gph bitreich.org 70 1Tags /scm/sacc/tag bitreich.org 70 1LICENSE /scm/sacc/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 92394502830c460c78633f56a69da4ce5f01d5fa /scm/sacc/commit/92394502830c460c78633f56a69da4ce5f01d5fa.gph bitreich.org 70 1parent a58414c67ddf05ff48b8a86fb2d3cf5e58cea4b9 /scm/sacc/commit/a58414c67ddf05ff48b8a86fb2d3cf5e58cea4b9.gph bitreich.org 70 hAuthor: Quentin Rameau URL:mailto:quinq@fifth.space bitreich.org 70 iDate: Fri, 9 Apr 2021 23:58:34 +0200 Err bitreich.org 70 i Err bitreich.org 70 iAdd TLS support Err bitreich.org 70 i Err bitreich.org 70 iTLS will be used when a gophers:// URL is requested. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 4 ++-- Err bitreich.org 70 i M config.mk | 4 ++++ Err bitreich.org 70 i M sacc.c | 124 ++++++++++++++++++++++++++----- Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 110 insertions(+), 22 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/sacc/file/Makefile.gph bitreich.org 70 i@@ -14,7 +14,7 @@ config.h: Err bitreich.org 70 i cp config.def.h config.h Err bitreich.org 70 i Err bitreich.org 70 i $(BIN): $(OBJ) Err bitreich.org 70 i- $(CC) $(OBJ) $(LDFLAGS) $(LIBS) -o $@ Err bitreich.org 70 i+ $(CC) $(OBJ) $(LDFLAGS) $(LIBS) $(TLSLIBS) -o $@ Err bitreich.org 70 i Err bitreich.org 70 i $(OBJ): config.h config.mk common.h Err bitreich.org 70 i Err bitreich.org 70 i@@ -33,7 +33,7 @@ uninstall: Err bitreich.org 70 i Err bitreich.org 70 i # Stock FLAGS Err bitreich.org 70 i SACCCFLAGS = -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 -D_BSD_SOURCE -D_GNU_SOURCE \ Err bitreich.org 70 i- $(CFLAGS) Err bitreich.org 70 i+ $(TLSCFLAGS) $(CFLAGS) Err bitreich.org 70 i Err bitreich.org 70 i .c.o: Err bitreich.org 70 i $(CC) $(SACCCFLAGS) -c $< Err bitreich.org 70 1diff --git a/config.mk b/config.mk /scm/sacc/file/config.mk.gph bitreich.org 70 i@@ -12,3 +12,7 @@ LIBS=-lcurses Err bitreich.org 70 i # Define NEED_ASPRINTF and/or NEED_STRCASESTR in your cflags if your system does Err bitreich.org 70 i # not provide asprintf() or strcasestr(), respectively. Err bitreich.org 70 i #CFLAGS = -DNEED_ASPRINTF -DNEED_STRCASESTR Err bitreich.org 70 i+ Err bitreich.org 70 i+# gophers (gopher over TLS) support Err bitreich.org 70 i+TLSCFLAGS = -DUSE_TLS Err bitreich.org 70 i+TLSLIBS = -ltls Err bitreich.org 70 1diff --git a/sacc.c b/sacc.c /scm/sacc/file/sacc.c.gph bitreich.org 70 i@@ -18,14 +18,26 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i+#ifdef USE_TLS Err bitreich.org 70 i+#include Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 i #include "common.h" Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i Err bitreich.org 70 i+struct cnx { Err bitreich.org 70 i+#ifdef USE_TLS Err bitreich.org 70 i+ struct tls *tls; Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ int sock; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i static char *mainurl; Err bitreich.org 70 i static Item *mainentry; Err bitreich.org 70 i static int devnullfd; Err bitreich.org 70 i static int parent = 1; Err bitreich.org 70 i static int interactive; Err bitreich.org 70 i+static int tls; Err bitreich.org 70 i Err bitreich.org 70 i static void (*diag)(char *fmt, ...); Err bitreich.org 70 i Err bitreich.org 70 i@@ -417,7 +429,7 @@ molddiritem(char *raw) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static char * Err bitreich.org 70 i-getrawitem(int sock) Err bitreich.org 70 i+getrawitem(struct cnx *cnx) Err bitreich.org 70 i { Err bitreich.org 70 i char *raw, *buf; Err bitreich.org 70 i size_t bn, bs; Err bitreich.org 70 i@@ -445,7 +457,18 @@ getrawitem(int sock) Err bitreich.org 70 i buf = raw + (bn-1) * BUFSIZ; Err bitreich.org 70 i bs = BUFSIZ; Err bitreich.org 70 i } Err bitreich.org 70 i- } while ((n = read(sock, buf, bs)) > 0); Err bitreich.org 70 i+ Err bitreich.org 70 i+#ifdef USE_TLS Err bitreich.org 70 i+ if (tls) { Err bitreich.org 70 i+ do { Err bitreich.org 70 i+ n = tls_read(cnx->tls, buf, bs); Err bitreich.org 70 i+ } while (n == TLS_WANT_POLLIN || n == TLS_WANT_POLLOUT); Err bitreich.org 70 i+ } else Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ { Err bitreich.org 70 i+ n = read(cnx->sock, buf, bs); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } while (n > 0); Err bitreich.org 70 i Err bitreich.org 70 i *buf = '\0'; Err bitreich.org 70 i Err bitreich.org 70 i@@ -458,7 +481,7 @@ getrawitem(int sock) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-sendselector(int sock, const char *selector) Err bitreich.org 70 i+sendselector(struct cnx *cnx, const char *selector) Err bitreich.org 70 i { Err bitreich.org 70 i char *msg, *p; Err bitreich.org 70 i size_t ln; Err bitreich.org 70 i@@ -468,10 +491,21 @@ sendselector(int sock, const char *selector) Err bitreich.org 70 i msg = p = xmalloc(ln); Err bitreich.org 70 i snprintf(msg, ln--, "%s\r\n", selector); Err bitreich.org 70 i Err bitreich.org 70 i- while ((n = write(sock, p, ln)) > 0) { Err bitreich.org 70 i+ do { Err bitreich.org 70 i+#ifdef USE_TLS Err bitreich.org 70 i+ if (tls) { Err bitreich.org 70 i+ do { Err bitreich.org 70 i+ n = tls_write(cnx->tls, p, ln); Err bitreich.org 70 i+ } while (n == TLS_WANT_POLLIN || n == TLS_WANT_POLLOUT); Err bitreich.org 70 i+ } else Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ { Err bitreich.org 70 i+ n = write(cnx->sock, p, ln); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i ln -= n; Err bitreich.org 70 i p += n; Err bitreich.org 70 i- } Err bitreich.org 70 i+ } while (n > 0); Err bitreich.org 70 i Err bitreich.org 70 i free(msg); Err bitreich.org 70 i if (n == -1) Err bitreich.org 70 i@@ -480,8 +514,20 @@ sendselector(int sock, const char *selector) Err bitreich.org 70 i return n; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+static void Err bitreich.org 70 i+closecnx(struct cnx *cnx) Err bitreich.org 70 i+{ Err bitreich.org 70 i+#ifdef USE_TLS Err bitreich.org 70 i+ if (tls) { Err bitreich.org 70 i+ tls_close(cnx->tls); Err bitreich.org 70 i+ tls_free(cnx->tls); Err bitreich.org 70 i+ } Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ close(cnx->sock); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i static int Err bitreich.org 70 i-connectto(const char *host, const char *port) Err bitreich.org 70 i+connectto(const char *host, const char *port, struct cnx *cnx) Err bitreich.org 70 i { Err bitreich.org 70 i sigset_t set, oset; Err bitreich.org 70 i static const struct addrinfo hints = { Err bitreich.org 70 i@@ -506,10 +552,23 @@ connectto(const char *host, const char *port) Err bitreich.org 70 i if ((sock = socket(addr->ai_family, addr->ai_socktype, Err bitreich.org 70 i addr->ai_protocol)) < 0) Err bitreich.org 70 i continue; Err bitreich.org 70 i- if ((r = connect(sock, addr->ai_addr, addr->ai_addrlen)) < 0) { Err bitreich.org 70 i+ Err bitreich.org 70 i+ r = connect(sock, addr->ai_addr, addr->ai_addrlen); Err bitreich.org 70 i+ if (r == -1) { Err bitreich.org 70 i close(sock); Err bitreich.org 70 i continue; Err bitreich.org 70 i } Err bitreich.org 70 i+#ifdef USE_TLS Err bitreich.org 70 i+ if (tls) { Err bitreich.org 70 i+ if ((cnx->tls = tls_client()) == NULL) { Err bitreich.org 70 i+ diag("Can't establish TLS with \"%s\": %s", Err bitreich.org 70 i+ host, tls_error(cnx->tls)); Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ r = tls_connect_socket(cnx->tls, sock, host); Err bitreich.org 70 i+ } Err bitreich.org 70 i+#endif Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -526,8 +585,10 @@ connectto(const char *host, const char *port) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i sigprocmask(SIG_SETMASK, &oset, NULL); Err bitreich.org 70 i- return sock; Err bitreich.org 70 i Err bitreich.org 70 i+ cnx->sock = sock; Err bitreich.org 70 i+ Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i err: Err bitreich.org 70 i sigprocmask(SIG_SETMASK, &oset, NULL); Err bitreich.org 70 i return -1; Err bitreich.org 70 i@@ -537,13 +598,15 @@ static int Err bitreich.org 70 i download(Item *item, int dest) Err bitreich.org 70 i { Err bitreich.org 70 i char buf[BUFSIZ]; Err bitreich.org 70 i+ struct cnx cnx; Err bitreich.org 70 i ssize_t r, w; Err bitreich.org 70 i int src; Err bitreich.org 70 i Err bitreich.org 70 i if (!item->tag) { Err bitreich.org 70 i- if ((src = connectto(item->host, item->port)) < 0 || Err bitreich.org 70 i- sendselector(src, item->selector) < 0) Err bitreich.org 70 i+ if (connectto(item->host, item->port, &cnx) < 0 || Err bitreich.org 70 i+ sendselector(&cnx, item->selector) < 0) Err bitreich.org 70 i return 0; Err bitreich.org 70 i+ src = cnx.sock; Err bitreich.org 70 i } else if ((src = open(item->tag, O_RDONLY)) < 0) { Err bitreich.org 70 i printf("Can't open source file %s: %s", Err bitreich.org 70 i item->tag, strerror(errno)); Err bitreich.org 70 i@@ -551,8 +614,20 @@ download(Item *item, int dest) Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- w = 0; Err bitreich.org 70 i- while ((r = read(src, buf, BUFSIZ)) > 0) { Err bitreich.org 70 i+ for (w = 0; w != -1;) { Err bitreich.org 70 i+#ifdef USE_TLS Err bitreich.org 70 i+ if (tls) { Err bitreich.org 70 i+ do { Err bitreich.org 70 i+ r = tls_read(cnx.tls, buf, sizeof(buf)); Err bitreich.org 70 i+ } while (r == TLS_WANT_POLLIN || r == TLS_WANT_POLLOUT); Err bitreich.org 70 i+ } else Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ { Err bitreich.org 70 i+ r = read(src, buf, sizeof(buf)); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (r <= 0) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ Err bitreich.org 70 i while ((w = write(dest, buf, r)) > 0) Err bitreich.org 70 i r -= w; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -563,7 +638,7 @@ download(Item *item, int dest) Err bitreich.org 70 i errno = 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- close(src); Err bitreich.org 70 i+ closecnx(&cnx); Err bitreich.org 70 i Err bitreich.org 70 i return (r == 0 && w == 0); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -618,14 +693,15 @@ cleanup: Err bitreich.org 70 i static int Err bitreich.org 70 i fetchitem(Item *item) Err bitreich.org 70 i { Err bitreich.org 70 i- char *raw, *r; Err bitreich.org 70 i- int sock; Err bitreich.org 70 i+ struct cnx cnx; Err bitreich.org 70 i+ char *raw; Err bitreich.org 70 i Err bitreich.org 70 i- if ((sock = connectto(item->host, item->port)) < 0 || Err bitreich.org 70 i- sendselector(sock, item->selector) < 0) Err bitreich.org 70 i+ if (connectto(item->host, item->port, &cnx) < 0 || Err bitreich.org 70 i+ sendselector(&cnx, item->selector) < 0) Err bitreich.org 70 i return 0; Err bitreich.org 70 i- raw = getrawitem(sock); Err bitreich.org 70 i- close(sock); Err bitreich.org 70 i+ Err bitreich.org 70 i+ raw = getrawitem(&cnx); Err bitreich.org 70 i+ closecnx(&cnx); Err bitreich.org 70 i Err bitreich.org 70 i if (raw == NULL || !*raw) { Err bitreich.org 70 i diag("Empty response from server"); Err bitreich.org 70 i@@ -910,8 +986,16 @@ moldentry(char *url) Err bitreich.org 70 i int parsed, ipv6; Err bitreich.org 70 i Err bitreich.org 70 i if (p = strstr(url, "://")) { Err bitreich.org 70 i- if (strncmp(url, "gopher", p - url)) Err bitreich.org 70 i+ if (strncmp(url, "gopher", p - url) == 0) { Err bitreich.org 70 i+ if (tls) { Err bitreich.org 70 i+ diag("Switching from gophers to gopher"); Err bitreich.org 70 i+ tls = 0; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } else if (strncmp(url, "gophers", p - url) == 0) { Err bitreich.org 70 i+ tls = 1; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i die("Protocol not supported: %.*s", p - url, url); Err bitreich.org 70 i+ } Err bitreich.org 70 i host = p + 3; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 .