commit - 6600ce3445c5363c75e743a0eec173cc73d79434
commit + a57748e1a14dc6fa51291d31dae92c9a5abdd7c0
blob - ff456a34fc542648efe5531229501d56eac29f20
blob + 3f1122ca2fcaba6c93f502667a8ea0f5ffc73699
--- src/ngircd/defines.h
+++ src/ngircd/defines.h
in seconds. */
#define USERMODES "aciorswx" /* Supported user modes. */
-#define CHANMODES "biIklmnoPstvz" /* Supported channel modes. */
+#define CHANMODES "biIklmnoOPstvz" /* Supported channel modes. */
#define CONNECTED true /* Internal status codes. */
#define DISCONNECTED false
blob - 81a9eb2e89f5f017f7dc9a9007441655df66059d
blob + ed71dc70bc683d3e3b0e7622e2f62798d881723e
--- src/ngircd/irc-channel.c
+++ src/ngircd/irc-channel.c
return false;
}
+ if (strchr(channel_modes, 'O') && !Client_OperByMe(Client)) {
+ /* Only IRC operators are allowed! */
+ IRC_WriteStrClient(Client, ERR_OPONLYCHANNEL_MSG,
+ Client_ID(Client), channame);
+ return false;
+ }
+
return true;
}
blob - 1e6772a69e636a6288ecf1393cf8db96eff7df47
blob + 30f4dee3ef26b9249c1d9f1aba76802c01df0c1d
--- src/ngircd/irc-mode.c
+++ src/ngircd/irc-mode.c
goto chan_exit;
}
break;
+ case 'O': /* IRC operators only */
+ if (modeok) {
+ /* Only IRC operators are allowed to
+ * set the 'O' channel mode! */
+ if (set && !(Client_OperByMe(Client)
+ || Client_Type(Client) == CLIENT_SERVER))
+ connected = IRC_WriteStrClient(Origin,
+ ERR_NOPRIVILEGES_MSG,
+ Client_ID(Origin));
+ else
+ x[0] = 'O';
+ } else
+ connected = IRC_WriteStrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ break;
case 'P': /* Persistent channel */
if (modeok) {
/* Only IRC operators are allowed to
blob - 900d2ff1101a9f80d77cc6efc75194ca48fa07a4
blob + ec4bd869df928aeec2e22a2fb554e9ba45d068aa
--- src/ngircd/messages.h
+++ src/ngircd/messages.h
#define ERR_PASSWDMISMATCH_MSG "464 %s :Invalid password"
#define ERR_CHANNELISFULL_MSG "471 %s %s :Cannot join channel (+l)"
#define ERR_SECURECHANNEL_MSG "471 %s %s :Cannot join channel (+z)"
+#define ERR_OPONLYCHANNEL_MSG "471 %s %s :Cannot join channel (+O)"
#define ERR_UNKNOWNMODE_MSG "472 %s: %c :is unknown mode char for %s"
#define ERR_INVITEONLYCHAN_MSG "473 %s %s :Cannot join channel (+i)"
#define ERR_BANNEDFROMCHAN_MSG "474 %s %s :Cannot join channel (+b)"