inspircd

A modular C++ IRC daemon (ircd). https://www.inspircd.org/
Log | Files | Refs | README

commit dfb1e0da7823641ad648f9fbd19b43d2e6b0d7ad
parent f87b72b76f9ef198bdbbb01f9ca409501666c6a2
Author: linuxdaemon <linuxdaemon@snoonet.org>
Date:   Tue, 12 Mar 2019 09:48:28 -0500

Add Who::Request::GetFlagIndex to get field index

Replaces the dirty logic in m_hideoper and m_namesx

Diffstat:
Minclude/modules/who.h | 11+++++++++++
Msrc/coremods/core_who.cpp | 22++++++++++++++++++++++
Msrc/modules/m_hideoper.cpp | 19+++----------------
Msrc/modules/m_namesx.cpp | 19+++----------------
4 files changed, 39 insertions(+), 32 deletions(-)

diff --git a/include/modules/who.h b/include/modules/who.h @@ -71,6 +71,17 @@ class Who::Request /** A user specified label for the WHOX response. */ std::string whox_querytype; + /** Get the index in the response parameters for the different data fields + * + * The fields 'r' (realname) and 'd' (hops) will always be missing in a non-WHOX + * query, because WHOX splits them to 2 fields, where old WHO has them as one. + * + * @param flag The field name to look for + * @param out The index will be stored in this value + * @return True if the field is available, false otherwise + */ + virtual bool GetFlagIndex(char flag, size_t& out) const = 0; + protected: Request() : fuzzy_match(false) diff --git a/src/coremods/core_who.cpp b/src/coremods/core_who.cpp @@ -34,8 +34,19 @@ enum RPL_WHOSPCRPL = 354 }; +static const char whox_field_order[] = "tcuihsnfdlaor"; +static const char who_field_order[] = "cuhsnf"; + struct WhoData : public Who::Request { + std::string query_flag_order; + + bool GetFlagIndex(char flag, size_t& out) const CXX11_OVERRIDE + { + out = query_flag_order.find(flag); + return out != std::string::npos; + } + WhoData(const CommandBase::Params& parameters) { // Find the matchtext and swap the 0 for a * so we can use InspIRCd::Match on it. @@ -74,6 +85,17 @@ struct WhoData : public Who::Request current_bitset->set(chr); } } + + if (whox) + { + for (const char *c = whox_field_order; c; c++) + { + if (whox_fields[*c]) + query_flag_order.push_back(*c); + } + } + else + query_flag_order = who_field_order; } }; diff --git a/src/modules/m_hideoper.cpp b/src/modules/m_hideoper.cpp @@ -123,22 +123,9 @@ class ModuleHideOper if (request.flags['o']) return MOD_RES_DENY; - size_t flag_index = 5; - if (request.whox) - { - // We only need to fiddle with the flags if they are present. - if (!request.whox_fields['f']) - return MOD_RES_PASSTHRU; - - // WHOX makes this a bit tricky as we need to work out the parameter which the flags are in. - flag_index = 0; - static const char* flags = "tcuihsn"; - for (size_t i = 0; i < strlen(flags); ++i) - { - if (request.whox_fields[flags[i]]) - flag_index += 1; - } - } + size_t flag_index; + if (!request.GetFlagIndex('f', flag_index)) + return MOD_RES_PASSTHRU; // hide the "*" that marks the user as an oper from the /WHO line // #chan ident localhost insp22.test nick H@ :0 Attila diff --git a/src/modules/m_namesx.cpp b/src/modules/m_namesx.cpp @@ -84,22 +84,9 @@ class ModuleNamesX if (prefixes.length() <= 1) return MOD_RES_PASSTHRU; - size_t flag_index = 5; - if (request.whox) - { - // We only need to fiddle with the flags if they are present. - if (!request.whox_fields['f']) - return MOD_RES_PASSTHRU; - - // WHOX makes this a bit tricky as we need to work out the parameter which the flags are in. - flag_index = 0; - static const char* flags = "tcuihsn"; - for (size_t i = 0; i < strlen(flags); ++i) - { - if (request.whox_fields[flags[i]]) - flag_index += 1; - } - } + size_t flag_index; + if (!request.GetFlagIndex('f', flag_index)) + return MOD_RES_PASSTHRU; // #chan ident localhost insp22.test nick H@ :0 Attila if (numeric.GetParams().size() <= flag_index)