From 4d519cfdbf57344aeaa3610a302bf4c654c058f6 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Sat, 28 Mar 2020 23:37:47 +0100 Subject: [PATCH] Predefined channles: Fix handling of legacy configuration options Fix the handling of legacy "Key" and "MaxUsers" [Channel] settings: - Activate them before evaluating the "Modes" parameter, to allow the latter to override those legacy options. - Enforce setting the respective +k/+l mode(s) to support the legacy "Mode = kl" notation, which was valid but is an invalid MODE string: key and limit are missing! So set them manually when "k" or "l" are detected in the first MODE parameter. - Sort modes +kl alphabetically, adjust test suite accordingly. --- src/ngircd/channel.c | 23 +++++++++++++++++++---- src/testsuite/server-login-test.e | 2 +- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 657fe781..3282a8d0 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -136,7 +136,7 @@ Channel_InitPredefined( void ) Channel_SetTopic(new_chan, NULL, conf_chan->topic); /* Evaluate modes strings with fake requests */ - if(conf_chan->modes_num) { + if (conf_chan->modes_num) { /* Prepare fake request structure */ strlcpy(name, conf_chan->name, sizeof(name)); Log(LOG_INFO, "Evaluating predefined channel modes for \"%s\".", name); @@ -154,16 +154,31 @@ Channel_InitPredefined( void ) Req.argv[Req.argc++] = c; c = strtok(0, " "); } - if(Req.argc > 1) + + if (Req.argc > 1) { + /* Handling of legacy "Key" and "MaxUsers" settings: + * Enforce setting the respective mode(s), to support + * the legacy "Mode = kl" notation, which was valid but + * is an invalid MODE string: key and limit are missing! + * So set them manually when "k" or "l" are detected in + * the first MODE parameter ... */ + if (Req.argc > 1 && strchr(Req.argv[1], 'k')) { + Channel_SetKey(new_chan, conf_chan->key); + Channel_ModeAdd(new_chan, 'k'); + } + if (strchr(Req.argv[1], 'l')) { + Channel_SetMaxUsers(new_chan, conf_chan->maxusers); + Channel_ModeAdd(new_chan, 'l'); + } + IRC_MODE(Client_ThisServer(), &Req); + } /* Original channel modes srings are no longer needed */ free(conf_chan->modes[n]); } } - Channel_SetKey(new_chan, conf_chan->key); - Channel_SetMaxUsers(new_chan, conf_chan->maxusers); Set_KeyFile(new_chan, conf_chan->keyfile); Log(LOG_INFO, diff --git a/src/testsuite/server-login-test.e b/src/testsuite/server-login-test.e index b5226a7d..bdf95e09 100644 --- a/src/testsuite/server-login-test.e +++ b/src/testsuite/server-login-test.e @@ -45,7 +45,7 @@ expect { } expect { timeout { exit 1 } - ":ngircd.test.server CHANINFO #FullKeyed +Plk Secret 0 :" + ":ngircd.test.server CHANINFO #FullKeyed +Pkl Secret 0 :" } expect { timeout { exit 1 } -- 2.39.2