diff options
-rw-r--r-- | include/mode.h | 4 | ||||
-rw-r--r-- | include/modes/umode_s.h | 1 | ||||
-rw-r--r-- | include/users.h | 2 | ||||
-rw-r--r-- | src/mode.cpp | 5 | ||||
-rw-r--r-- | src/modes/umode_s.cpp | 8 | ||||
-rw-r--r-- | src/modules/m_spanningtree/netburst.cpp | 16 | ||||
-rw-r--r-- | src/modules/m_spanningtree/protocolinterface.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_spanningtree/uid.cpp | 36 | ||||
-rw-r--r-- | src/users.cpp | 18 |
9 files changed, 67 insertions, 26 deletions
diff --git a/include/mode.h b/include/mode.h index 3ea4f6d06..467e7e2ae 100644 --- a/include/mode.h +++ b/include/mode.h @@ -211,6 +211,10 @@ class CoreExport ModeHandler : public Extensible */ char GetModeChar(); + /** For user modes, return the current parameter, if any + */ + std::string GetUserParameter(User* user); + /** * Called when a mode change for your mode occurs. * @param source Contains the user setting the mode. diff --git a/include/modes/umode_s.h b/include/modes/umode_s.h index 7463a71e5..def83d8c3 100644 --- a/include/modes/umode_s.h +++ b/include/modes/umode_s.h @@ -23,4 +23,5 @@ class ModeUserServerNoticeMask : public ModeHandler ModeUserServerNoticeMask(InspIRCd* Instance); ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool servermode); void OnParameterMissing(User* user, User* dest, Channel* channel); + std::string GetUserParameter(User* user); }; diff --git a/include/users.h b/include/users.h index 59cd6cc6f..269dfd65f 100644 --- a/include/users.h +++ b/include/users.h @@ -716,7 +716,7 @@ class CoreExport User : public connection /** Create a displayable mode string for this users umodes * @param The mode string */ - const char* FormatModes(); + const char* FormatModes(bool showparameters = false); /** Returns true if a specific mode is set * @param m The user mode diff --git a/src/mode.cpp b/src/mode.cpp index 7de334689..c3946af2e 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -117,6 +117,11 @@ char ModeHandler::GetModeChar() return mode; } +std::string ModeHandler::GetUserParameter(User* user) +{ + return ""; +} + ModeAction ModeHandler::OnModeChange(User*, User*, Channel*, std::string&, bool, bool) { return MODEACTION_DENY; diff --git a/src/modes/umode_s.cpp b/src/modes/umode_s.cpp index dde0cb15d..d7f508066 100644 --- a/src/modes/umode_s.cpp +++ b/src/modes/umode_s.cpp @@ -51,6 +51,14 @@ ModeAction ModeUserServerNoticeMask::OnModeChange(User* source, User* dest, Chan return MODEACTION_DENY; } +std::string ModeUserServerNoticeMask::GetUserParameter(User* user) +{ + std::string masks = user->FormatNoticeMasks(); + if (masks.length()) + masks = "+" + masks; + return masks; +} + void ModeUserServerNoticeMask::OnParameterMissing(User* user, User* dest, Channel* channel) { user->WriteServ("NOTICE %s :*** The user mode +s requires a parameter (server notice mask). Please provide a parameter, e.g. '+s +*'.", diff --git a/src/modules/m_spanningtree/netburst.cpp b/src/modules/m_spanningtree/netburst.cpp index 26ff4b209..6d068c5e2 100644 --- a/src/modules/m_spanningtree/netburst.cpp +++ b/src/modules/m_spanningtree/netburst.cpp @@ -223,10 +223,18 @@ void TreeSocket::SendUsers(TreeServer* Current) TreeServer* theirserver = Utils->FindServer(u->second->server); if (theirserver) { - snprintf(data,MAXBUF,":%s UID %s %lu %s %s %s %s +%s +%s %s %lu :%s", theirserver->GetID().c_str(), u->second->uuid.c_str(), - (unsigned long)u->second->age, u->second->nick.c_str(), u->second->host.c_str(), u->second->dhost.c_str(), - u->second->ident.c_str(), u->second->FormatModes(), u->second->FormatNoticeMasks(), u->second->GetIPString(), - (unsigned long)u->second->signon, u->second->fullname.c_str()); + snprintf(data,MAXBUF,":%s UID %s %lu %s %s %s %s %s %lu +%s :%s", + theirserver->GetID().c_str(), /* Prefix: SID */ + u->second->uuid.c_str(), /* 0: UUID */ + (unsigned long)u->second->age, /* 1: TS */ + u->second->nick.c_str(), /* 2: Nick */ + u->second->host.c_str(), /* 3: Displayed Host */ + u->second->dhost.c_str(), /* 4: Real host */ + u->second->ident.c_str(), /* 5: Ident */ + u->second->GetIPString(), /* 6: IP string */ + (unsigned long)u->second->signon, /* 7: Signon time for WHOWAS */ + u->second->FormatModes(true), /* 8...n: Modes and params */ + u->second->fullname.c_str()); /* size-1: GECOS */ this->WriteLine(data); if (IS_OPER(u->second)) { diff --git a/src/modules/m_spanningtree/protocolinterface.cpp b/src/modules/m_spanningtree/protocolinterface.cpp index 410ccfdec..84a19b705 100644 --- a/src/modules/m_spanningtree/protocolinterface.cpp +++ b/src/modules/m_spanningtree/protocolinterface.cpp @@ -184,10 +184,9 @@ void SpanningTreeProtocolInterface::Introduce(User* user) params.push_back(user->host); params.push_back(user->dhost); params.push_back(user->ident); - params.push_back("+"+std::string(user->FormatModes())); - params.push_back("+"+std::string(user->FormatNoticeMasks())); params.push_back(user->GetIPString()); params.push_back(ConvToStr(user->signon)); + params.push_back("+"+std::string(user->FormatModes(true))); params.push_back(":"+std::string(user->fullname)); Utils->DoOneToMany(ServerInstance->Config->GetSID(), "UID", params); } diff --git a/src/modules/m_spanningtree/uid.cpp b/src/modules/m_spanningtree/uid.cpp index 3e76c9725..abde297a2 100644 --- a/src/modules/m_spanningtree/uid.cpp +++ b/src/modules/m_spanningtree/uid.cpp @@ -33,19 +33,19 @@ bool TreeSocket::ParseUID(const std::string &source, std::deque<std::string> ¶ms) { /** Do we have enough parameters: - * 1 2 3 4 5 6 7 8 9 10 - * UID uuid age nick host dhost ident +modestr +snomasks ip.string signon :gecos + * 0 1 2 3 4 5 6 7 8 9 (n-1) + * UID uuid age nick host dhost ident ip.string signon +modes (modepara) :gecos */ - if (params.size() != 11) + if (params.size() < 10) { if (!params.empty()) this->WriteLine(std::string(":")+this->Instance->Config->GetSID()+" KILL "+params[0]+" :Invalid client introduction ("+params[0]+" with only "+ - ConvToStr(params.size())+" of 11 parameters?)"); + ConvToStr(params.size())+" of 10 or more parameters?)"); return true; } time_t age_t = ConvToInt(params[1]); - time_t signon = ConvToInt(params[9]); + time_t signon = ConvToInt(params[7]); std::string empty; TreeServer* remoteserver = Utils->FindServer(source); @@ -101,40 +101,44 @@ bool TreeSocket::ParseUID(const std::string &source, std::deque<std::string> &pa _new->dhost.assign(params[4], 0, 64); _new->server = this->Instance->FindServerNamePtr(remoteserver->GetName().c_str()); _new->ident.assign(params[5], 0, MAXBUF); - _new->fullname.assign(params[10], 0, MAXBUF); + _new->fullname.assign(params[params.size() - 1], 0, MAXBUF); _new->registered = REG_ALL; _new->signon = signon; _new->age = age_t; /* we need to remove the + from the modestring, so we can do our stuff */ - std::string::size_type pos_after_plus = params[6].find_first_not_of('+'); + std::string::size_type pos_after_plus = params[8].find_first_not_of('+'); if (pos_after_plus != std::string::npos) - params[6] = params[6].substr(pos_after_plus); + params[8] = params[8].substr(pos_after_plus); - for (std::string::iterator v = params[6].begin(); v != params[6].end(); v++) + unsigned int paramptr = 9; + for (std::string::iterator v = params[8].begin(); v != params[8].end(); v++) { /* For each mode thats set, increase counter */ ModeHandler* mh = Instance->Modes->FindMode(*v, MODETYPE_USER); if (mh) { - mh->OnModeChange(_new, _new, NULL, empty, true); + if (mh->GetNumParams(true) && (paramptr < params.size())) + mh->OnModeChange(_new, _new, NULL, params[paramptr++], true); + else + mh->OnModeChange(_new, _new, NULL, empty, true); _new->SetMode(*v, true); mh->ChangeCount(1); } } - _new->ProcessNoticeMasks(params[7].c_str()); + //_new->ProcessNoticeMasks(params[7].c_str()); /* now we've done with modes processing, put the + back for remote servers */ - params[6] = "+" + params[6]; + params[8] = "+" + params[8]; #ifdef SUPPORT_IP6LINKS - if (params[8].find_first_of(":") != std::string::npos) - _new->SetSockAddr(AF_INET6, params[8].c_str(), 0); + if (params[6].find_first_of(":") != std::string::npos) + _new->SetSockAddr(AF_INET6, params[6].c_str(), 0); else #endif - _new->SetSockAddr(AF_INET, params[8].c_str(), 0); + _new->SetSockAddr(AF_INET, params[6].c_str(), 0); Instance->Users->AddGlobalClone(_new); @@ -146,7 +150,7 @@ bool TreeSocket::ParseUID(const std::string &source, std::deque<std::string> &pa if (dosend) this->Instance->SNO->WriteToSnoMask('C',"Client connecting at %s: %s!%s@%s [%s] [%s]", _new->server, _new->nick.c_str(), _new->ident.c_str(), _new->host.c_str(), _new->GetIPString(), _new->fullname.c_str()); - params[10] = ":" + params[10]; + params[params.size() - 1] = ":" + params[params.size() - 1]; Utils->DoOneToAllButSender(source, "UID", params, source); Instance->PI->Introduce(_new); diff --git a/src/users.cpp b/src/users.cpp index b749b4788..5c06e8d08 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -158,16 +158,28 @@ void User::SetMode(unsigned char m, bool value) modes[m-65] = value; } -const char* User::FormatModes() +const char* User::FormatModes(bool showparameters) { static char data[MAXBUF]; + std::string params; int offset = 0; - for (int n = 0; n < 64; n++) + + for (unsigned char n = 0; n < 64; n++) { if (modes[n]) - data[offset++] = n+65; + { + data[offset++] = n + 65; + ModeHandler* mh = ServerInstance->Modes->FindMode(n + 65, MODETYPE_USER); + if (showparameters && mh && mh->GetNumParams(true)) + { + std::string p = mh->GetUserParameter(this); + if (p.length()) + params.append(" ").append(p); + } + } } data[offset] = 0; + strlcat(data, params.c_str(), MAXBUF); return data; } |