summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Bratch <luke@bratch.co.uk>2019-05-17 22:35:15 +0100
committerLuke Bratch <luke@bratch.co.uk>2019-05-17 22:35:15 +0100
commit4cd965884ae9a9e9738818eca11af9ba9aa792d4 (patch)
tree2a948a286873af6e05d62898c51724369a8f24bd
parent6c4c42c68c53091a0ca04ae6885ed3cc24216348 (diff)
Track and relay our user MODE correctly, including for new clients.
-rw-r--r--blabouncer.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/blabouncer.c b/blabouncer.c
index c4396f4..775ccce 100644
--- a/blabouncer.c
+++ b/blabouncer.c
@@ -6,7 +6,7 @@
// - Do we actually need to store the modes in the channel struct?
// - Get CAP from server and relay to client
// - "01:53:47 -!- ServerMode/#test [b] by irc.tghost.co.uk" on existing clients when new client connects
-// - Keep track of changing user modes
+// - Keep track of changing user modes in channels
// - Should replay log do more than PRIVMSGs?
// - Check authentication before even getting to the send functions to save unnecessary processing
// - Configurable auto channels
@@ -15,7 +15,6 @@
// - Alert when clients connect/authenticate/disconnect
// - Perhaps rename clients.ssl and server_ssl since they may not even be OpenSSL sockets
// - Is it possible to replay JOINs/PARTs accurately?
-// - New clients don't get their own server mode (e.g. blabounce(+i))
//
// Example WHOIS reply:
// BOUNCER-SERVER RECEIVED: :irc.tghost.co.uk 307 blabounce l_bratch :is identified for this nick
@@ -88,6 +87,7 @@ struct ircdstrings {
char ircnick[MAXNICKLENGTH];
char ircusername[MAXUSERNAMELEN];
char currentmsg[MAXDATASIZE]; // Holding area for the current server-received IRC message being processed in case it needs building across multiple reads (i.e. a truncated/split message)
+ char mode[MAXDATASIZE];
};
// Structure of settings either to be read from the configuration file or set/changed at runtime
@@ -802,6 +802,19 @@ 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.
+ 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]);
+
+ // Store for new clients
+ strcpy(ircdstrings->mode, tokens[3]);
+
+ // Relay to all current clients
+ sendtoallclients(clients, str, sourcefd, settings);
+
+ return 1;
+ }
}
// Don't return if we got here because this means we didn't process something above
@@ -931,6 +944,13 @@ int processircmessage(SSL *server_ssl, char *str, int source, struct client *cli
sendtoclient(sourcefd, outgoingmsg, clients, settings);
}
+ // Send our mode to the client
+ if (!snprintf(outgoingmsg, MAXDATASIZE, ":%s MODE %s %s", ircdstrings->ircnick, ircdstrings->ircnick, ircdstrings->mode)) {
+ fprintf(stderr, "Error while preparing USER just connected, MODE response!\n");
+ exit(1);
+ }
+ sendtoclient(sourcefd, outgoingmsg, clients, settings);
+
// Set the client as registered
clients[arrindex(clients, sourcefd)].registered = 1;
@@ -1034,6 +1054,13 @@ int processircmessage(SSL *server_ssl, char *str, int source, struct client *cli
return 1;
}
+ // Just send MODE to server and let it talk back to clients as required
+ if (strncmp(tokens[0], "MODE", strlen(tokens[0])) == 0) {
+ printf("Client MODE found and it is: %s with length %zd! Sending to server...\n", tokens[0], strlen(tokens[0]));
+ sendtoserver(server_ssl, str, strlen(str), sourcefd, clients, settings);
+ return 1;
+ }
+
// Custom BLABOUNCER command received
// Case insensitive comparisons here since clients won't be recognising and uppercasing these commands
if (strncasecmp(tokens[0], "BLABOUNCER", strlen(tokens[0])) == 0) {