}
else if (targetuser)
{
- /* Display user's current mode string */
- user->WriteServ("221 %s :+%s",targetuser->nick,targetuser->FormatModes());
- if (*targetuser->oper)
- user->WriteServ("008 %s +%s :Server notice mask", targetuser->nick, targetuser->FormatNoticeMasks());
- return;
+ if ((targetuser == user) || (*user->oper))
+ {
+ /* Display user's current mode string */
+ user->WriteServ("221 %s :+%s",targetuser->nick,targetuser->FormatModes());
+ if (*targetuser->oper)
+ user->WriteServ("008 %s +%s :Server notice mask", targetuser->nick, targetuser->FormatNoticeMasks());
+ return;
+ }
+ else
+ {
+ user->WriteServ("502 %s :Can't change mode for other users", user->nick);
+ }
}
/* No such nick/channel */
{
ServerInstance->Log(DEBUG,"Spool list");
const char* mode = parameters[1];
- if (*mode == '+')
- mode++;
- unsigned char handler_id = ((*mode) - 65) | MASK_CHANNEL;
- ModeHandler* mh = modehandlers[handler_id];
- if ((mh) && (mh->IsListMode()))
+
+ while (mode && *mode)
{
- mh->DisplayList(user, targetchannel);
- return;
+ if (*mode == '+')
+ {
+ mode++;
+ continue;
+ }
+
+ ModeHandler *mh = this->FindMode(*mode, MODETYPE_CHANNEL);
+
+ if ((mh) && (mh->IsListMode()))
+ {
+ mh->DisplayList(user, targetchannel);
+ }
+
+ mode++;
}
}
{
type = MODETYPE_USER;
mask = MASK_USER;
+ if ((user != targetuser) && (!ServerInstance->ULine(user->server)))
+ {
+ user->WriteServ("502 %s :Can't change mode for other users", user->nick);
+ return;
+ }
}
else
{
/* A mode prefix of ',' is not acceptable, it would fuck up server to server.
* A mode prefix of ':' will fuck up both server to server, and client to server.
+ * A mode prefix of '#' will mess up /whois and /privmsg
*/
- if ((mh->GetPrefix() == ',') || (mh->GetPrefix() == ':'))
+ if ((mh->GetPrefix() == ',') || (mh->GetPrefix() == ':') || (mh->GetPrefix() == '#'))
return false;
mh->GetModeType() == MODETYPE_USER ? mask = MASK_USER : mask = MASK_CHANNEL;