Skip to content

Commit

Permalink
Predefined channles: Fix handling of legacy configuration options
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
alexbarton committed Mar 28, 2020
1 parent fed2218 commit 4d519cf
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 5 deletions.
23 changes: 19 additions & 4 deletions src/ngircd/channel.c
Expand Up @@ -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);
Expand All @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion src/testsuite/server-login-test.e
Expand Up @@ -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 }
Expand Down

0 comments on commit 4d519cf

Please sign in to comment.