commit d314c75a37f0132a1a16658494d0f60a0c0083f2 from: Alexander Barton date: Tue Mar 18 15:43:21 2014 UTC Allow "DefaultUserModes" to set all possible modes Let IRC_MODE() detect that the "fake" MODE command originated on the local sever, which enables all modes to be settable using "DefaultUserModes" that can be set by regular MODE commands, including modes only settable by IRC Operators. commit - 5009ab3e8c5a6fe7db5c5ad1d3fdc8aecfc64b55 commit + d314c75a37f0132a1a16658494d0f60a0c0083f2 blob - ec425bd284686546de2cc36bb330b82151937ba3 blob + 1d07822c5b405e748af8da30f13c397837afa8fc --- doc/sample-ngircd.conf.tmpl +++ doc/sample-ngircd.conf.tmpl @@ -172,8 +172,8 @@ ;ConnectIPv4 = yes # Default user mode(s) to set on new local clients. Please note that - # only modes can be set that the client could set on itself, you can't - # set "a" (away) or "o" (IRC Op), for example! Default: none. + # only modes can be set that the client could set using regular MODE + # commands, you can't set "a" (away) for example! Default: none. ;DefaultUserModes = i # Do DNS lookups when a client connects to the server. blob - 208b46110a00824fbab5d1844a1c1acc2a73023c blob + 9b2ed08259b3e0ea2b2fd95c3f6ad5a7382e00e6 --- man/ngircd.conf.5.tmpl +++ man/ngircd.conf.5.tmpl @@ -267,8 +267,8 @@ Default: yes. .TP \fBDefaultUserModes\fR (string) Default user mode(s) to set on new local clients. Please note that only modes -can be set that the client could set on itself, you can't set "a" (away) or -"o" (IRC Op), for example! +can be set that the client could set using regular MODE commands, you can't +set "a" (away) for example! Default: none. .TP \fBDNS\fR (boolean) blob - fe981213b33c8d85a3ad3ccb467e54fd6b54b56d blob + 79ab2ebe94beaa41b904b01b1493a83d125e5e25 --- src/ngircd/irc-mode.c +++ src/ngircd/irc-mode.c @@ -68,6 +68,13 @@ IRC_MODE( CLIENT *Client, REQUEST *Req ) _IRC_GET_SENDER_OR_RETURN_(origin, Req, Client) + /* Test for "fake" MODE commands injected by this local instance, + * for example when handling the "DefaultUserModes" settings. + * This doesn't harm real commands, because prefixes of regular + * clients are checked in Validate_Prefix() and can't be faked. */ + if (Req->prefix && Client_Search(Req->prefix) == Client_ThisServer()) + Client = Client_Search(Req->prefix); + /* Channel or user mode? */ cl = NULL; chan = NULL; if (Client_IsValidNick(Req->argv[0])) blob - 7f427a3a753e0fd3b0b9886d641439b521a3f08b blob + 64cc81251c6594cbd129a56270262fa9fede6c19 --- src/ngircd/login.c +++ src/ngircd/login.c @@ -192,7 +192,7 @@ Login_User_PostAuth(CLIENT *Client) /* Set default user modes */ if (Conf_DefaultUserModes[0]) { snprintf(modes, sizeof(modes), "+%s", Conf_DefaultUserModes); - Req.prefix = Client_ThisServer(); + Req.prefix = Client_ID(Client_ThisServer()); Req.command = "MODE"; Req.argc = 2; Req.argv[0] = Client_ID(Client);