diff options
author | Luke Bratch <luke@bratch.co.uk> | 2019-05-19 14:30:08 +0100 |
---|---|---|
committer | Luke Bratch <luke@bratch.co.uk> | 2019-05-19 14:30:08 +0100 |
commit | 52d426544ce976f81cbd626fbba343c066ed88d0 (patch) | |
tree | 479ed51e3d96aef99d70a9807f76d93593e1c871 | |
parent | c4de74dce0ada6bafd297222e85bfe170805d6fb (diff) |
Handle server MODEs more intelligently, in particular so we can relay our user MODE to new clients correctly.
-rw-r--r-- | blabouncer.c | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/blabouncer.c b/blabouncer.c index 2c210b1..f85e58c 100644 --- a/blabouncer.c +++ b/blabouncer.c @@ -903,14 +903,40 @@ int processircmessage(SSL *server_ssl, char *str, int source, struct client *cli return 1; } - // Server MODE received? Store in ircdstrings for when clients connect and relay to current clients. + // Server MODE received? See what sort it is and act accordingly. if (strncmp(tokens[1], "MODE", strlen(tokens[1])) == 0) { - printf("Server MODE found and it is: %s with length %zd! Mode is '%s'. Storing for later.\n", tokens[1], strlen(tokens[1]), tokens[3]); + printf("Server MODE found and it is: %s with length %zd! Next token is '%s'. Analysing...\n", tokens[1], strlen(tokens[1]), tokens[2]); + + // 4 tokens could be either our initial mode or a channel mode (or something else - TODO - what else?) + if (counter == 4) { + // Might be our initial mode (e.g. ":nick MODE nick :+iwz") + char comparison[MAXDATASIZE]; + snprintf(comparison, MAXDATASIZE, ":%s MODE %s :", ircdstrings->ircnick, ircdstrings->ircnick); + if (strncmp(str, comparison, strlen(comparison)) == 0) { + // Looks like it! + printf("Our initial MODE found (%s), storing for later.\n", tokens[3]); + // Store in ircdstrings for when clients connect and relay to current clients. + strcpy(ircdstrings->mode, tokens[3]); + + // Relay to all current clients anyway - TODO - Necessary? + sendtoallclients(clients, str, sourcefd, settings); + + free(strcopyPtr); + return 1; + } + + // Might be a channel mode (e.g. ":nick!user@host MODE #channel +s") + if (tokens[2][0] == '#') { + // Looks like it! Tell all clients. + printf("Channel MODE found (%s %s), telling all clients.\n", tokens[2], tokens[3]); + sendtoallclients(clients, str, sourcefd, settings); - // Store for new clients - strcpy(ircdstrings->mode, tokens[3]); + free(strcopyPtr); + return 1; + } + } - // Relay to all current clients + // Relay to all current clients if not processed by the above sendtoallclients(clients, str, sourcefd, settings); free(strcopyPtr); |