Mercurial > irccd
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;