From 821a5bca883ad8c06cb27963acf8861d9ef1031e Mon Sep 17 00:00:00 2001 From: brain Date: Thu, 5 Apr 2007 23:53:01 +0000 Subject: Fix for bug #199 (Feature request) submitted by owine. Ended up adding an extra parameter to for this. It turned into a biggie :P git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6742 e03df62e-2008-0410-955e-edbf42e46eb7 --- docs/inspircd.conf.example | 14 +++++- include/configreader.h | 2 +- include/inspircd.h | 5 ++ include/modules.h | 2 +- src/command_parse.cpp | 10 +++- src/commands.cpp | 80 ------------------------------ src/configreader.cpp | 9 ++-- src/cull_list.cpp | 5 +- src/modules/m_spanningtree/treesocket1.cpp | 4 +- 9 files changed, 40 insertions(+), 91 deletions(-) diff --git a/docs/inspircd.conf.example b/docs/inspircd.conf.example index 011cc29ab..766589071 100644 --- a/docs/inspircd.conf.example +++ b/docs/inspircd.conf.example @@ -377,7 +377,7 @@ # # # # @@ -549,7 +549,17 @@ sendpass="penguins" recvpass="polarbears"> - + +#-#-#-#-#-#-#-#-#-#-#-#- ULINES CONFIGURATION #-#-#-#-#-#-#-#-#-#-#-#-# +# This tag defines a ulined server. A U-Lined server has special # +# permissions, and should be used with caution. Services servers are # +# usually u-lined in this manner. # +# # +# The 'silent' value if set to yes indicates that this server should # +# not generate quit and connect notices, which can cut down on noise # +# to opers on the network. # +# # + #-#-#-#-#-#-#-#-#-#- MISCELLANEOUS CONFIGURATION -#-#-#-#-#-#-#-#-#-# diff --git a/include/configreader.h b/include/configreader.h index 2d144441a..499761449 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -487,7 +487,7 @@ class ServerConfig : public Extensible /** List of u-lined servers */ - std::vector ulines; + std::map ulines; /** Max banlist sizes for channels (the std::string is a glob) */ diff --git a/include/inspircd.h b/include/inspircd.h index 48560bab6..293a3ba42 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -1142,6 +1142,11 @@ class InspIRCd : public classbase */ bool ULine(const char* server); + /** Returns true if the uline is 'silent' (doesnt generate + * remote connect notices etc). + */ + bool SilentULine(const char* server); + /** Returns the subversion revision ID of this ircd * @return The revision ID or an empty string */ diff --git a/include/modules.h b/include/modules.h index c1e4bd239..1f8f0fb5e 100644 --- a/include/modules.h +++ b/include/modules.h @@ -75,7 +75,7 @@ enum MessageType { * ipv4 servers, so this value will be ten times as * high on ipv6 servers. */ -#define NATIVE_API_VERSION 11018 +#define NATIVE_API_VERSION 11019 #ifdef IPV6 #define API_VERSION (NATIVE_API_VERSION * 10) #else diff --git a/src/command_parse.cpp b/src/command_parse.cpp index 71fce09fd..a59d6db62 100644 --- a/src/command_parse.cpp +++ b/src/command_parse.cpp @@ -31,7 +31,15 @@ bool InspIRCd::ULine(const char* server) if (!*server) return true; - return (find(Config->ulines.begin(),Config->ulines.end(),server) != Config->ulines.end()); + return (Config->ulines.find(server) != Config->ulines.end()); +} + +bool InspIRCd::SilentULine(const char* server) +{ + std::map::iterator n = Config->ulines.find(server); + if (n != Config->ulines.end()) + return n->second; + else return false; } int InspIRCd::OperPassCompare(const char* data,const char* input, int tagnumber) diff --git a/src/commands.cpp b/src/commands.cpp index c31885483..65b11e5a0 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -19,86 +19,6 @@ #include "xline.h" #include "command_parse.h" -bool InspIRCd::ULine(const char* server) -{ - if (!server) - return false; - if (!*server) - return true; - - return (find(Config->ulines.begin(),Config->ulines.end(),server) != Config->ulines.end()); -} - -int InspIRCd::OperPassCompare(const char* data,const char* input, int tagnum) -{ - int MOD_RESULT = 0; - FOREACH_RESULT_I(this,I_OnOperCompare,OnOperCompare(data, input, tagnum)) - if (MOD_RESULT == 1) - return 0; - if (MOD_RESULT == -1) - return 1; - return strcmp(data,input); -} - -long InspIRCd::Duration(const char* str) -{ - char n_field[MAXBUF]; - long total = 0; - n_field[0] = 0; - - if ((!strchr(str,'s')) && (!strchr(str,'m')) && (!strchr(str,'h')) && (!strchr(str,'d')) && (!strchr(str,'w')) && (!strchr(str,'y'))) - { - std::string n = str; - n += 's'; - return Duration(n.c_str()); - } - - for (char* i = (char*)str; *i; i++) - { - // if we have digits, build up a string for the value in n_field, - // up to 10 digits in size. - if ((*i >= '0') && (*i <= '9')) - { - strlcat(n_field,i,10); - } - else - { - // we dont have a digit, check for numeric tokens - switch (tolower(*i)) - { - case 's': - total += atoi(n_field); - break; - - case 'm': - total += (atoi(n_field)*duration_m); - break; - - case 'h': - total += (atoi(n_field)*duration_h); - break; - - case 'd': - total += (atoi(n_field)*duration_d); - break; - - case 'w': - total += (atoi(n_field)*duration_w); - break; - - case 'y': - total += (atoi(n_field)*duration_y); - break; - } - n_field[0] = 0; - } - } - // add trailing seconds - total += atoi(n_field); - - return total; -} - /* All other ircds when doing this check usually just look for a string of *@* or *. We're smarter than that, though. */ bool InspIRCd::HostMatchesEveryone(const std::string &mask, userrec* user) diff --git a/src/configreader.cpp b/src/configreader.cpp index 26e9634d1..a32249000 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -412,7 +412,8 @@ bool InitULine(ServerConfig* conf, const char* tag) bool DoULine(ServerConfig* conf, const char* tag, char** entries, ValueList &values, int* types) { const char* server = values[0].GetString(); - conf->ulines.push_back(server); + const bool silent = values[1].GetBool(); + conf->ulines[server] = silent; return true; } @@ -619,9 +620,9 @@ void ServerConfig::Read(bool bail, userrec* user) InitConnect, DoConnect, DoneConnect}, {"uline", - {"server", NULL}, - {"", NULL}, - {DT_CHARPTR}, + {"server", "silent", NULL}, + {"", "0", NULL}, + {DT_CHARPTR, DT_BOOLEAN}, InitULine,DoULine,DoneULine}, {"banlist", diff --git a/src/cull_list.cpp b/src/cull_list.cpp index 4578b2a76..f6ea2e0f1 100644 --- a/src/cull_list.cpp +++ b/src/cull_list.cpp @@ -143,7 +143,10 @@ int CullList::Apply() if (IS_LOCAL(a->GetUser())) ServerInstance->SNO->WriteToSnoMask('q',"Client exiting: %s!%s@%s [%s]",a->GetUser()->nick,a->GetUser()->ident,a->GetUser()->host,oper_reason.c_str()); else - ServerInstance->SNO->WriteToSnoMask('Q',"Client exiting on server %s: %s!%s@%s [%s]",a->GetUser()->server,a->GetUser()->nick,a->GetUser()->ident,a->GetUser()->host,oper_reason.c_str()); + { + if (!ServerInstance->SilentULine(a->GetUser()->server)) + ServerInstance->SNO->WriteToSnoMask('Q',"Client exiting on server %s: %s!%s@%s [%s]",a->GetUser()->server,a->GetUser()->nick,a->GetUser()->ident,a->GetUser()->host,oper_reason.c_str()); + } a->GetUser()->AddToWhoWas(); } diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index 20943ef26..03c81fd68 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -946,7 +946,9 @@ bool TreeSocket::IntroduceClient(const std::string &source, std::dequeSetSockAddr(AF_INET, params[6].c_str(), 0); Instance->AddGlobalClone(_new); - this->Instance->SNO->WriteToSnoMask('C',"Client connecting at %s: %s!%s@%s [%s]",_new->server,_new->nick,_new->ident,_new->host, _new->GetIPString()); + + if (!this->Instance->SilentULine(_new->server)) + this->Instance->SNO->WriteToSnoMask('C',"Client connecting at %s: %s!%s@%s [%s]",_new->server,_new->nick,_new->ident,_new->host, _new->GetIPString()); params[7] = ":" + params[7]; Utils->DoOneToAllButSender(source,"NICK", params, source); -- cgit v1.2.3