changeset 950:9fcb0038fe0a

irccd: bring SSL support back
author David Demelier <markand@malikania.fr>
date Sat, 16 Jan 2021 23:23:31 +0100
parents b4e8551e2064
children d11c2b0001ce
files CMakeLists.txt irccd/main.c irccdctl/main.c lib/CMakeLists.txt lib/irccd/server.c lib/irccd/server.h
diffstat 6 files changed, 60 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Sat Jan 16 22:48:30 2021 +0100
+++ b/CMakeLists.txt	Sat Jan 16 23:23:31 2021 +0100
@@ -37,6 +37,10 @@
 
 include(GNUInstallDirs)
 
+if (IRCCD_WITH_SSL)
+	find_package(OpenSSL REQUIRED)
+endif ()
+
 add_subdirectory(extern/libcompat)
 
 if (IRCCD_WITH_JS)
--- a/irccd/main.c	Sat Jan 16 22:48:30 2021 +0100
+++ b/irccd/main.c	Sat Jan 16 23:23:31 2021 +0100
@@ -20,9 +20,7 @@
 #include <err.h>
 
 #include <irccd/irccd.h>
-#include <irccd/js-plugin.h>
 #include <irccd/log.h>
-#include <irccd/plugin.h>
 #include <irccd/server.h>
 #include <irccd/transport.h>
 #include <irccd/util.h>
@@ -30,24 +28,23 @@
 int
 main(int argc, char **argv)
 {
+	(void)argc;
+	(void)argv;
+
 	struct irc_server s = {
 		.name = "malikania",
 		.username = "circ",
 		.nickname = "circ",
 		.hostname = "malikania.fr",
-		.port = 6667
-	};
-	struct irc_plugin p = {
-		.name = "fuck"
+		.port = 6697,
+		.flags = IRC_SERVER_FLAGS_SSL
 	};
 
 	irc_log_set_verbose(true);
 	irc_bot_init();
 
 	irc_transport_bind("/tmp/irccd.sock");
-	//irc_server_join(&s, "#test", NULL);
-	irc_js_plugin_open(&p, "/Users/markand/test.js");
-	//irc_bot_add_server(irc_util_memdup(&s, sizeof (s)));
-	irc_bot_add_plugin(&p);
+	irc_server_join(&s, "#test", NULL);
+	irc_bot_add_server(irc_util_memdup(&s, sizeof (s)));
 	irc_bot_run();
 }
--- a/irccdctl/main.c	Sat Jan 16 22:48:30 2021 +0100
+++ b/irccdctl/main.c	Sat Jan 16 23:23:31 2021 +0100
@@ -186,6 +186,8 @@
 static void
 cmd_server_mode(int argc, char **argv)
 {
+	(void)argc;
+	(void)argv;
 #if 0
 	req("MODE %s %s %s%c%s%c%s%c%s", argv[0], argv[1], argv[2],
 		argc >= 4 ? ' ', argv[3] : "",
@@ -198,6 +200,8 @@
 static void
 cmd_server_nick(int argc, char **argv)
 {
+	(void)argc;
+
 	req("SERVER-NICK %s %s", argv[0], argv[1]);
 	ok();
 }
@@ -205,6 +209,8 @@
 static void
 cmd_server_notice(int argc, char **argv)
 {
+	(void)argc;
+
 	req("SERVER-NOTICE %s %s %s", argv[0], argv[1], argv[2]);
 	ok();
 }
@@ -212,6 +218,8 @@
 static void
 cmd_server_part(int argc, char **argv)
 {
+	(void)argc;
+
 	/* Let's advertise irccd a bit. */
 	req("SERVER-PART %s %s %s", argv[0], argv[1],
 	    argc >= 3 ? argv[2] : "irccd is shutting down");
@@ -221,14 +229,16 @@
 static void
 cmd_server_topic(int argc, char **argv)
 {
+	(void)argc;
+
 	req("SERVER-TOPIC %s %s %s", argv[0], argv[1], argv[2]);
 	ok();
 }
 
 static const struct cmd {
 	const char *name;
-	unsigned int minargs;
-	unsigned int maxargs;
+	int minargs;
+	int maxargs;
 	void (*exec)(int, char **);
 } cmds[] = {
 	/* name                 min     max     exec                   */
--- a/lib/CMakeLists.txt	Sat Jan 16 22:48:30 2021 +0100
+++ b/lib/CMakeLists.txt	Sat Jan 16 23:23:31 2021 +0100
@@ -90,12 +90,13 @@
 	libirccd
 	PUBLIC
 		$<BUILD_INTERFACE:${libirccd_SOURCE_DIR}>
-		$<BUILD_INTERFACE:${libirccd_BINARY_DIR}>
-	PRIVATE
 		$<BUILD_INTERFACE:${libirccd_BINARY_DIR}>/irccd
 )
 target_link_libraries(libirccd libirccd-compat)
 
+if (IRCCD_WITH_SSL)
+	target_link_libraries(libirccd OpenSSL::SSL OpenSSL::Crypto)
+endif ()
 if (IRCCD_WITH_JS)
 	target_link_libraries(libirccd libirccd-duktape)
 endif ()
--- a/lib/irccd/server.c	Sat Jan 16 22:48:30 2021 +0100
+++ b/lib/irccd/server.c	Sat Jan 16 23:23:31 2021 +0100
@@ -30,7 +30,9 @@
 #include <string.h>
 #include <unistd.h>
 
-#if defined(IRCCD_HAVE_SSL)
+#include "config.h"
+
+#if defined(IRCCD_WITH_SSL)
 #       include <openssl/err.h>
 #endif
 
@@ -451,7 +453,7 @@
 		s->aip = NULL;
 	}
 
-#if defined(IRCCD_HAVE_SSL)
+#if defined(IRCCD_WITH_SSL)
 	if (s->ssl) {
 		SSL_free(s->ssl);
 		s->ssl = NULL;
@@ -493,10 +495,10 @@
 	/* TODO: server password as well. */
 }
 
-#if defined(IRCCD_HAVE_SSL)
+#if defined(IRCCD_WITH_SSL)
 
 static void
-secure_update(struct irc_server *s, int ret)
+update(struct irc_server *s, int ret)
 {
 	(void)s;
 	(void)ret;
@@ -505,21 +507,21 @@
 
 	int r;
 
-	if (!(s->flags & SERVER_FL_SSL))
+	if (!(s->flags & IRC_SERVER_FLAGS_SSL))
 		return;
 
 	switch ((r = SSL_get_error(s->ssl, ret))) {
 	case SSL_ERROR_WANT_READ:
-		s->ssl_state = SERVER_SSL_NEED_READ;
+		s->ssl_state = IRC_SERVER_SSL_NEED_READ;
 		break;
 	case SSL_ERROR_WANT_WRITE:
-		s->ssl_state = SERVER_SSL_NEED_WRITE;
+		s->ssl_state = IRC_SERVER_SSL_NEED_WRITE;
 		break;
 	case SSL_ERROR_SSL:
 		clear(s);
 		break;
 	default:
-		s->ssl_state = SERVER_SSL_NONE;
+		s->ssl_state = IRC_SERVER_SSL_NONE;
 		break;
 	}
 }
@@ -534,28 +536,28 @@
 	if (!(s->flags & IRC_SERVER_FLAGS_SSL))
 		auth(s);
 	else {
-#if defined(IRCCD_HAVE_SSL)
+#if defined(IRCCD_WITH_SSL)
 		int r;
 
-		s->state = SERVER_ST_HANDSHAKING;
+		s->state = IRC_SERVER_STATE_HANDSHAKING;
 
 		if ((r = SSL_do_handshake(s->ssl)) > 0)
 			auth(s);
 
-		secure_update(s, r);
+		update(s, r);
 #endif
 	}
 }
 
 static void
-secure_connect(struct irc_server *s)
+try_connect(struct irc_server *s)
 {
 	assert(s);
 
 	if (!(s->flags & IRC_SERVER_FLAGS_SSL))
 		handshake(s);
 	else {
-#if defined(IRCCD_HAVE_SSL)
+#if defined(IRCCD_WITH_SSL)
 		int r;
 
 		if (!s->ctx)
@@ -566,9 +568,9 @@
 		}
 
 		if ((r = SSL_connect(s->ssl)) > 0)
-			ssl_handshake(s);
+			handshake(s);
 
-		secure_update(s, r);
+		update(s, r);
 #endif
 	}
 }
@@ -617,7 +619,7 @@
 		 * otherwise we will need to wait until the socket is writable.
 		 */
 		if (connect(s->fd, s->aip->ai_addr, s->aip->ai_addrlen) == 0) {
-			secure_connect(s);
+			try_connect(s);
 			break;
 		}
 
@@ -641,9 +643,9 @@
 	ssize_t nr = 0;
 
 	if (s->flags & IRC_SERVER_FLAGS_SSL) {
-#if defined(IRCCD_HAVE_SSL)
+#if defined(IRCCD_WITH_SSL)
 		nr = SSL_read(s->ssl, buf, sizeof (buf) - 1);
-		secure_update(s, nr);
+		update(s, nr);
 #endif
 	} else {
 		if ((nr = recv(s->fd, buf, sizeof (buf) - 1, 0)) < 0)
@@ -664,9 +666,9 @@
 	ssize_t ns = 0;
 
 	if (s->flags & IRC_SERVER_FLAGS_SSL) {
-#if defined(IRCCD_HAVE_SSL)
-		ns = SSL_write(s->ssl, s->out.data, s->out.size);
-		secure_update(s, ns);
+#if defined(IRCCD_WITH_SSL)
+		ns = SSL_write(s->ssl, s->out, strlen(s->out));
+		update(s, ns);
 #endif
 	} else if ((ns = send(s->fd, s->out, strlen(s->out), 0)) <= 0)
 		clear(s);
@@ -685,7 +687,7 @@
 {
 	(void)s;
 
-#if defined(IRCCD_HAVE_SSL)
+#if defined(IRCCD_WITH_SSL)
 	if (s->flags & IRC_SERVER_FLAGS_SSL && s->ssl && s->ctx) {
 		switch (s->ssl_state) {
 		case IRC_SERVER_SSL_NEED_READ:
@@ -705,13 +707,13 @@
 static void
 prepare_ready(const struct irc_server *s, struct pollfd *pfd)
 {
-#if defined(IRCCD_HAVE_SSL)
+#if defined(IRCCD_WITH_SSL)
 	if (s->flags & IRC_SERVER_FLAGS_SSL && s->ssl_state) {
 		switch (s->ssl_state) {
-		case SERVER_SSL_NEED_READ:
+		case IRC_SERVER_SSL_NEED_READ:
 			pfd->events |= POLLIN;
 			break;
-		case SERVER_SSL_NEED_WRITE:
+		case IRC_SERVER_SSL_NEED_WRITE:
 			pfd->events |= POLLOUT;
 			break;
 		default:
@@ -723,7 +725,7 @@
 
 		if (s->out[0])
 			pfd->events |= POLLOUT;
-#if defined(IRCCD_HAVE_SSL)
+#if defined(IRCCD_WITH_SSL)
 	}
 #endif
 }
@@ -740,7 +742,7 @@
 		irc_log_warn("server %s: %s", s->name, strerror(res ? err : errno));
 		dial(s);
 	} else
-		secure_connect(s);
+		try_connect(s);
 }
 
 static void
--- a/lib/irccd/server.h	Sat Jan 16 22:48:30 2021 +0100
+++ b/lib/irccd/server.h	Sat Jan 16 23:23:31 2021 +0100
@@ -22,7 +22,9 @@
 #include <stdbool.h>
 #include <stddef.h>
 
-#if defined(IRC_HAVE_SSL)
+#include "config.h"
+
+#if defined(IRCCD_WITH_SSL)
 #       include <openssl/ssl.h>
 #endif
 
@@ -54,7 +56,7 @@
 	char token;
 };
 
-#if defined(IRCCD_HAVE_SSL)
+#if defined(IRCCD_WITH_SSL)
 
 enum irc_server_ssl_state {
 	IRC_SERVER_SSL_NONE,
@@ -93,7 +95,7 @@
 	enum irc_server_state state;
 
 	/* OpenSSL support. */
-#if defined(IRCCD_HAVE_SSL)
+#if defined(IRCCD_WITH_SSL)
 	SSL_CTX *ctx;
 	SSL *ssl;
 	enum irc_server_ssl_state ssl_state;