diff options
author | Attila Molnar <attilamolnar@hush.com> | 2014-01-19 16:48:41 +0100 |
---|---|---|
committer | Attila Molnar <attilamolnar@hush.com> | 2014-01-19 16:48:41 +0100 |
commit | f75a0d5482a09fffc0cc6cfece80bb2f1e4de815 (patch) | |
tree | e2031e58b6166c7690e1968be21f2294a4e81ef1 | |
parent | 69af56f973b9d31f5ebd7d83e6afedb59bb08c92 (diff) |
Use FindNickOnly() in a few more places if a local user is performing an action to prevent UID walking
-rw-r--r-- | src/mode.cpp | 26 | ||||
-rw-r--r-- | src/modules/m_callerid.cpp | 17 | ||||
-rw-r--r-- | src/modules/m_remove.cpp | 5 | ||||
-rw-r--r-- | src/modules/m_uninvite.cpp | 7 | ||||
-rw-r--r-- | src/modules/m_userip.cpp | 2 |
5 files changed, 46 insertions, 11 deletions
diff --git a/src/mode.cpp b/src/mode.cpp index 16751e712..2a32dfac2 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -346,10 +346,19 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool return MODEACTION_DENY; } - if (mh->GetTranslateType() == TR_NICK && !ServerInstance->FindNick(parameter)) + if (mh->GetTranslateType() == TR_NICK) { - user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel", user->nick.c_str(), parameter.c_str()); - return MODEACTION_DENY; + User* prefixtarget; + if (IS_LOCAL(user)) + prefixtarget = ServerInstance->FindNickOnly(parameter); + else + prefixtarget = ServerInstance->FindNick(parameter); + + if (!prefixtarget) + { + user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel", user->nick.c_str(), parameter.c_str()); + return MODEACTION_DENY; + } } if (mh->GetPrefixRank() && chan) @@ -378,9 +387,16 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool void ModeParser::Process(const std::vector<std::string>& parameters, User *user, bool merge) { - std::string target = parameters[0]; + const std::string& target = parameters[0]; Channel* targetchannel = ServerInstance->FindChan(target); - User* targetuser = ServerInstance->FindNick(target); + User* targetuser = NULL; + if (!targetchannel) + { + if (IS_LOCAL(user)) + targetuser = ServerInstance->FindNickOnly(target); + else + targetuser = ServerInstance->FindNick(target); + } ModeType type = targetchannel ? MODETYPE_CHANNEL : MODETYPE_USER; LastParse.clear(); diff --git a/src/modules/m_callerid.cpp b/src/modules/m_callerid.cpp index 74428f543..09c5c3f24 100644 --- a/src/modules/m_callerid.cpp +++ b/src/modules/m_callerid.cpp @@ -197,7 +197,7 @@ public: /* Even if callerid mode is not set, we let them manage their ACCEPT list so that if they go +g they can * have a list already setup. */ - std::string tok = parameters[0]; + const std::string& tok = parameters[0]; if (tok == "*") { @@ -207,7 +207,12 @@ public: } else if (tok[0] == '-') { - User* whotoremove = ServerInstance->FindNick(tok.substr(1)); + User* whotoremove; + if (IS_LOCAL(user)) + whotoremove = ServerInstance->FindNickOnly(tok.substr(1)); + else + whotoremove = ServerInstance->FindNick(tok.substr(1)); + if (whotoremove) return (RemoveAccept(user, whotoremove) ? CMD_SUCCESS : CMD_FAILURE); else @@ -215,7 +220,13 @@ public: } else { - User* whotoadd = ServerInstance->FindNick(tok[0] == '+' ? tok.substr(1) : tok); + const std::string target = (tok[0] == '+' ? tok.substr(1) : tok); + User* whotoadd; + if (IS_LOCAL(user)) + whotoadd = ServerInstance->FindNickOnly(target); + else + whotoadd = ServerInstance->FindNick(target); + if ((whotoadd) && (whotoadd->registered == REG_ALL) && (!whotoadd->quitting) && (!IS_SERVER(whotoadd))) return (AddAccept(user, whotoadd) ? CMD_SUCCESS : CMD_FAILURE); else diff --git a/src/modules/m_remove.cpp b/src/modules/m_remove.cpp index 86f50ad62..cf139f4a3 100644 --- a/src/modules/m_remove.cpp +++ b/src/modules/m_remove.cpp @@ -63,7 +63,10 @@ class RemoveBase : public Command const std::string& username = parameters[neworder ? 1 : 0]; /* Look up the user we're meant to be removing from the channel */ - target = ServerInstance->FindNick(username); + if (IS_LOCAL(user)) + target = ServerInstance->FindNickOnly(username); + else + target = ServerInstance->FindNick(username); /* And the channel we're meant to be removing them from */ channel = ServerInstance->FindChan(channame); diff --git a/src/modules/m_uninvite.cpp b/src/modules/m_uninvite.cpp index 10fd7c7b6..ff392edc3 100644 --- a/src/modules/m_uninvite.cpp +++ b/src/modules/m_uninvite.cpp @@ -37,7 +37,12 @@ class CommandUninvite : public Command CmdResult Handle (const std::vector<std::string> ¶meters, User *user) { - User* u = ServerInstance->FindNick(parameters[0]); + User* u; + if (IS_LOCAL(user)) + u = ServerInstance->FindNickOnly(parameters[0]); + else + u = ServerInstance->FindNick(parameters[0]); + Channel* c = ServerInstance->FindChan(parameters[1]); if ((!c) || (!u) || (u->registered != REG_ALL)) diff --git a/src/modules/m_userip.cpp b/src/modules/m_userip.cpp index 5ea84c04a..33b261ca1 100644 --- a/src/modules/m_userip.cpp +++ b/src/modules/m_userip.cpp @@ -42,7 +42,7 @@ class CommandUserip : public Command for (int i = 0; i < (int)parameters.size(); i++) { - User *u = ServerInstance->FindNick(parameters[i]); + User *u = ServerInstance->FindNickOnly(parameters[i]); if ((u) && (u->registered == REG_ALL)) { // Anyone may query their own IP |