From 46eaac3381e072b7c08b96996d977177bbe41452 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 24 Jan 2014 18:11:49 -0500 Subject: Set a session id on our server ssl context in m_ssl_openssl. It is required for some clients which try to restore SSL sessions. --- src/modules/extra/m_ssl_openssl.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/modules/extra/m_ssl_openssl.cpp b/src/modules/extra/m_ssl_openssl.cpp index 7b7de023c..ad5eee791 100644 --- a/src/modules/extra/m_ssl_openssl.cpp +++ b/src/modules/extra/m_ssl_openssl.cpp @@ -132,6 +132,9 @@ class ModuleSSLOpenSSL : public Module SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, OnVerify); SSL_CTX_set_verify(clictx, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, OnVerify); + + const unsigned char session_id[] = "inspircd"; + SSL_CTX_set_session_id_context(ctx, session_id, sizeof(session_id) - 1); } void init() -- cgit v1.3.1-10-gc9f91 From 5ae804239ee1e2f8731b73ab37e9f16d8153d477 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Sun, 26 Jan 2014 16:39:21 +0100 Subject: m_ssl_openssl Fix memory leaks on /rehash ssl, unload and in VerifyCertificate() --- src/modules/extra/m_ssl_openssl.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/modules/extra/m_ssl_openssl.cpp b/src/modules/extra/m_ssl_openssl.cpp index ad5eee791..9a54ff80b 100644 --- a/src/modules/extra/m_ssl_openssl.cpp +++ b/src/modules/extra/m_ssl_openssl.cpp @@ -265,6 +265,7 @@ class ModuleSSLOpenSSL : public Module ServerInstance->Logs->Log("m_ssl_openssl",DEFAULT, "m_ssl_openssl.so: Couldn't set DH parameters %s. SSL errors follow:", dhfile.c_str()); ERR_print_errors_cb(error_callback, this); } + DH_free(ret); } fclose(dhpfile); @@ -629,8 +630,11 @@ class ModuleSSLOpenSSL : public Module certinfo->trusted = false; } - certinfo->dn = X509_NAME_oneline(X509_get_subject_name(cert),0,0); - certinfo->issuer = X509_NAME_oneline(X509_get_issuer_name(cert),0,0); + char buf[512]; + X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); + certinfo->dn = buf; + X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); + certinfo->issuer = buf; if (!X509_digest(cert, digest, md, &n)) { -- cgit v1.3.1-10-gc9f91 From 26fecc0bf2c72b9a0dea09c92ed89f78181f39f6 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Mon, 3 Feb 2014 10:08:05 +0100 Subject: m_banredirect Fix typo in a message (transfered -> transferred) Fixes issue #757 reported by @guikcd --- src/modules/m_banredirect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/modules/m_banredirect.cpp b/src/modules/m_banredirect.cpp index ee52a5cfb..2e2592541 100644 --- a/src/modules/m_banredirect.cpp +++ b/src/modules/m_banredirect.cpp @@ -321,7 +321,7 @@ class ModuleBanRedirect : public Module else { user->WriteNumeric(474, "%s %s :Cannot join channel (You are banned)", user->nick.c_str(), chan->name.c_str()); - user->WriteNumeric(470, "%s %s %s :You are banned from this channel, so you are automatically transfered to the redirected channel.", user->nick.c_str(), chan->name.c_str(), redir->targetchan.c_str()); + user->WriteNumeric(470, "%s %s %s :You are banned from this channel, so you are automatically transferred to the redirected channel.", user->nick.c_str(), chan->name.c_str(), redir->targetchan.c_str()); nofollow = true; Channel::JoinUser(user, redir->targetchan.c_str(), false, "", false, ServerInstance->Time()); nofollow = false; -- cgit v1.3.1-10-gc9f91 From 7525d32ac0d85ff1957f61ec653f78702093a8a7 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 4 Feb 2014 16:11:43 -0500 Subject: Fix new file descriptor debug log message in socketengine_poll to show the correct events --- src/socketengines/socketengine_poll.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/socketengines/socketengine_poll.cpp b/src/socketengines/socketengine_poll.cpp index ea7780686..e38e0fac1 100644 --- a/src/socketengines/socketengine_poll.cpp +++ b/src/socketengines/socketengine_poll.cpp @@ -137,7 +137,7 @@ bool PollEngine::AddFd(EventHandler* eh, int event_mask) events[index].fd = fd; events[index].events = mask_to_poll(event_mask); - ServerInstance->Logs->Log("SOCKET", DEBUG,"New file descriptor: %d (%d; index %d)", fd, events[fd].events, index); + ServerInstance->Logs->Log("SOCKET", DEBUG,"New file descriptor: %d (%d; index %d)", fd, events[index].events, index); SocketEngine::SetEventMask(eh, event_mask); CurrentSetSize++; return true; -- cgit v1.3.1-10-gc9f91 From d481bf8eb1a2c2dcf27e58c82420e3f35b7670eb Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Wed, 5 Feb 2014 18:02:01 +0100 Subject: socketengine_epoll Initialize CurrentSetSize (only used by m_httpd_stats) --- src/socketengines/socketengine_epoll.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/socketengines/socketengine_epoll.cpp b/src/socketengines/socketengine_epoll.cpp index 6913076a2..f2837777a 100644 --- a/src/socketengines/socketengine_epoll.cpp +++ b/src/socketengines/socketengine_epoll.cpp @@ -54,6 +54,7 @@ public: EPollEngine::EPollEngine() { + CurrentSetSize = 0; int max = ulimit(4, 0); if (max > 0) { -- cgit v1.3.1-10-gc9f91 From 7fec670c9b378f5c8470204ba36a284a424a11c7 Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Mon, 10 Feb 2014 20:08:56 +0000 Subject: Fix various problems detected by Clang 3.4. - cidr.cpp: remove inverted_bits; unused since 9fad3ecb9215a0034bf407f192926b04cb5efaed. - cmd_stats.cpp: remove needless inversion and comparison to 0. - inspircd.cpp: remove needless comparison to 0. - socket.cpp: remove all_zero; unused since 03a1bf15b1da7643b237c22db1a478916a976ccf. --- src/cidr.cpp | 18 ------------------ src/commands/cmd_stats.cpp | 2 +- src/inspircd.cpp | 2 +- src/socket.cpp | 2 -- 4 files changed, 2 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/cidr.cpp b/src/cidr.cpp index 54f7b83e9..050a3549d 100644 --- a/src/cidr.cpp +++ b/src/cidr.cpp @@ -23,25 +23,7 @@ #include "inspircd.h" -/* Used when comparing CIDR masks for the modulus bits left over. - * A lot of ircd's seem to do this: - * ((-1) << (8 - (mask % 8))) - * But imho, it sucks in comparison to a nice neat lookup table. - */ -const unsigned char inverted_bits[8] = { 0x00, /* 00000000 - 0 bits - never actually used */ - 0x80, /* 10000000 - 1 bits */ - 0xC0, /* 11000000 - 2 bits */ - 0xE0, /* 11100000 - 3 bits */ - 0xF0, /* 11110000 - 4 bits */ - 0xF8, /* 11111000 - 5 bits */ - 0xFC, /* 11111100 - 6 bits */ - 0xFE /* 11111110 - 7 bits */ -}; - - /* Match CIDR strings, e.g. 127.0.0.1 to 127.0.0.0/8 or 3ffe:1:5:6::8 to 3ffe:1::0/32 - * If you have a lot of hosts to match, youre probably better off building your mask once - * and then using the lower level MatchCIDRBits directly. * * This will also attempt to match any leading usernames or nicknames on the mask, using * match(), when match_with_username is true. diff --git a/src/commands/cmd_stats.cpp b/src/commands/cmd_stats.cpp index 898e89a7d..23143442a 100644 --- a/src/commands/cmd_stats.cpp +++ b/src/commands/cmd_stats.cpp @@ -217,7 +217,7 @@ void CommandStats::DoStats(char statschar, User* user, string_list &results) results.push_back(sn+" 249 "+user->nick+" :Channels: "+ConvToStr(ServerInstance->chanlist->size())); results.push_back(sn+" 249 "+user->nick+" :Commands: "+ConvToStr(ServerInstance->Parser->cmdlist.size())); - if (!ServerInstance->Config->WhoWasGroupSize == 0 && !ServerInstance->Config->WhoWasMaxGroups == 0) + if (ServerInstance->Config->WhoWasGroupSize && ServerInstance->Config->WhoWasMaxGroups) { Module* whowas = ServerInstance->Modules->Find("cmd_whowas.so"); if (whowas) diff --git a/src/inspircd.cpp b/src/inspircd.cpp index b201e38c6..766aeaf8e 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -476,7 +476,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : /* Set the finished argument values */ Config->cmdline.nofork = (do_nofork != 0); Config->cmdline.forcedebug = (do_debug != 0); - Config->cmdline.writelog = (!do_nolog != 0); + Config->cmdline.writelog = !do_nolog; Config->cmdline.TestSuite = (do_testsuite != 0); if (do_debug) diff --git a/src/socket.cpp b/src/socket.cpp index a695f8c73..e73d01af9 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -217,8 +217,6 @@ bool irc::sockets::satoap(const irc::sockets::sockaddrs& sa, std::string& addr, return !addr.empty(); } -static const char all_zero[16] = {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; - std::string irc::sockets::sockaddrs::str() const { char buffer[MAXBUF]; -- cgit v1.3.1-10-gc9f91 From d3d8375e232de4615b49f654b7e2d20c955eee6d Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Thu, 13 Feb 2014 14:10:01 +0100 Subject: socketengine_select Reset the values in the timeval struct on *nix before select() --- src/socketengines/socketengine_select.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/socketengines/socketengine_select.cpp b/src/socketengines/socketengine_select.cpp index c21b200c2..0b5abaf30 100644 --- a/src/socketengines/socketengine_select.cpp +++ b/src/socketengines/socketengine_select.cpp @@ -132,7 +132,9 @@ void SelectEngine::OnSetEvent(EventHandler* eh, int old_mask, int new_mask) int SelectEngine::DispatchEvents() { - static timeval tval = { 1, 0 }; + timeval tval; + tval.tv_sec = 1; + tval.tv_usec = 0; fd_set rfdset = ReadSet, wfdset = WriteSet, errfdset = ErrSet; -- cgit v1.3.1-10-gc9f91 From 60b5933a7e0973c0043b72a10d66226c9d1b423c Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 20 Feb 2014 13:03:31 -0500 Subject: Fix /who on opers incorrectly showing +i opers to users without the privilege to see them, introduced in b328aad53b044bd9cf9720dfed216b0ee61c8e31 --- src/commands/cmd_who.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/commands/cmd_who.cpp b/src/commands/cmd_who.cpp index f8926b9f7..2b3242211 100644 --- a/src/commands/cmd_who.cpp +++ b/src/commands/cmd_who.cpp @@ -368,7 +368,7 @@ CmdResult CommandWho::Handle (const std::vector& parameters, User * { if (!user->SharesChannelWith(oper)) { - if (usingwildcards && (!oper->IsModeSet('i')) && (!user->HasPrivPermission("users/auspex"))) + if (usingwildcards && (oper->IsModeSet('i')) && (!user->HasPrivPermission("users/auspex"))) continue; } -- cgit v1.3.1-10-gc9f91 From 1066fae0407abb79f973cd99a42479136a62d696 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Sat, 1 Mar 2014 13:04:10 +0100 Subject: Fix NULL dereference on rehash when there is a fatal error in the configuration of connect classes Fixes issue #780 reported by @JDowny --- src/configreader.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/configreader.cpp b/src/configreader.cpp index e8707cc3e..060f66d16 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -743,7 +743,10 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) User* user = useruid.empty() ? NULL : ServerInstance->FindNick(useruid); if (!valid) + { ServerInstance->Logs->Log("CONFIG",DEFAULT, "There were errors in your configuration file:"); + Classes.clear(); + } while (errstr.good()) { -- cgit v1.3.1-10-gc9f91 From 473f3d3b2f973a1d746aa456dd874e4094ac9388 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Sun, 2 Mar 2014 17:00:12 +0100 Subject: m_spanningtree Don't send snotices to servers about remote servers splitting The snotice is sent to opers when the SQUIT is processed by their server --- src/modules/m_spanningtree/treesocket1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index cb2c93548..7b233169d 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -201,7 +201,7 @@ void TreeSocket::Squit(TreeServer* Current, const std::string &reason) } else { - ServerInstance->SNO->WriteGlobalSno('L', "Server \002"+Current->GetName()+"\002 split from server \002"+Current->GetParent()->GetName()+"\002 with reason: "+reason); + ServerInstance->SNO->WriteToSnoMask('L', "Server \002"+Current->GetName()+"\002 split from server \002"+Current->GetParent()->GetName()+"\002 with reason: "+reason); } int num_lost_servers = 0; int num_lost_users = 0; -- cgit v1.3.1-10-gc9f91 From ed08638c1afa2742f0ebc3006dd0f1054020f7d4 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Sun, 2 Mar 2014 17:04:51 +0100 Subject: m_spanningtree Do pointer comparison before deleting one of the pointers in TreeSocket::Squit() While the previous code worked fine in practice, it was incorrect in theory --- src/modules/m_spanningtree/treesocket1.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index 7b233169d..c9729cc0f 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -212,8 +212,9 @@ void TreeSocket::Squit(TreeServer* Current, const std::string &reason) Current->Tidy(); Current->GetParent()->DelChild(Current); Current->cull(); + const bool ismyroot = (Current == MyRoot); delete Current; - if (Current == MyRoot) + if (ismyroot) { MyRoot = NULL; Close(); -- cgit v1.3.1-10-gc9f91 From 6aaf7047297b739377e7d509cb914f32447fb281 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Mon, 10 Mar 2014 12:17:41 +0100 Subject: Improve detection for non-cidr masks to prevent unwanted matches Fixes issue #762 reported by @neoinr --- src/cidr.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/cidr.cpp b/src/cidr.cpp index 050a3549d..a4a252a48 100644 --- a/src/cidr.cpp +++ b/src/cidr.cpp @@ -65,8 +65,14 @@ bool irc::sockets::MatchCIDR(const std::string &address, const std::string &cidr cidr_copy.assign(cidr_mask); } - if (cidr_copy.find('/') == std::string::npos) + const std::string::size_type per_pos = cidr_copy.rfind('/'); + if ((per_pos == std::string::npos) || (per_pos == cidr_copy.length()-1) + || (cidr_copy.find_first_not_of("0123456789", per_pos+1) != std::string::npos) + || (cidr_copy.find_first_not_of("0123456789.:") < per_pos)) + { + // The CIDR mask is invalid return false; + } irc::sockets::sockaddrs addr; irc::sockets::aptosa(address_copy, 0, addr); -- cgit v1.3.1-10-gc9f91 From 04779a0a0d82ab79036ca3d8e4ee0a4f21955baf Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Tue, 11 Mar 2014 13:20:21 +0100 Subject: cmd_names Allow opers having the channels/auspex priv to view the NAMES list of +s channels from outside A version of the check removed by this commit is in Channel::UserList() which takes the priv into account Discovered by @Cronus89 --- src/commands/cmd_names.cpp | 5 ----- 1 file changed, 5 deletions(-) (limited to 'src') diff --git a/src/commands/cmd_names.cpp b/src/commands/cmd_names.cpp index 0c06b636f..fd4a9cef5 100644 --- a/src/commands/cmd_names.cpp +++ b/src/commands/cmd_names.cpp @@ -58,11 +58,6 @@ CmdResult CommandNames::Handle (const std::vector& parameters, User c = ServerInstance->FindChan(parameters[0]); if (c) { - if ((c->IsModeSet('s')) && (!c->HasUser(user))) - { - user->WriteNumeric(401, "%s %s :No such nick/channel",user->nick.c_str(), c->name.c_str()); - return CMD_FAILURE; - } c->UserList(user); } else -- cgit v1.3.1-10-gc9f91 From b18319769864542912bec9646986ef229a884bde Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Thu, 13 Mar 2014 15:37:19 +0100 Subject: Backport "Refactor Channel::UserList() to use std::string" This gets rid of questionable snprintf() usage, reported by @hifi Backported commit: 8a06d54076551387f83a29360478ee6605e241b6 --- src/channels.cpp | 46 +++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/channels.cpp b/src/channels.cpp index c546e68db..73d408fb8 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -758,9 +758,6 @@ char* Channel::ChanModes(bool showkey) */ void Channel::UserList(User *user) { - char list[MAXBUF]; - size_t dlen, curlen; - if (!IS_LOCAL(user)) return; @@ -772,17 +769,23 @@ void Channel::UserList(User *user) return; } - dlen = curlen = snprintf(list,MAXBUF,"%s %c %s :", user->nick.c_str(), this->IsModeSet('s') ? '@' : this->IsModeSet('p') ? '*' : '=', this->name.c_str()); + std::string list = user->nick; + list.push_back(' '); + list.push_back(this->IsModeSet('s') ? '@' : this->IsModeSet('p') ? '*' : '='); + list.push_back(' '); + list.append(this->name).append(" :"); + std::string::size_type pos = list.size(); - int numusers = 0; - char* ptr = list + dlen; + bool has_one = false; /* Improvement by Brain - this doesnt change in value, so why was it inside * the loop? */ bool has_user = this->HasUser(user); - for (UserMembIter i = userlist.begin(); i != userlist.end(); i++) + std::string prefixlist; + std::string nick; + for (UserMembIter i = userlist.begin(); i != userlist.end(); ++i) { if (i->first->quitting) continue; @@ -795,8 +798,8 @@ void Channel::UserList(User *user) continue; } - std::string prefixlist = this->GetPrefixChar(i->first); - std::string nick = i->first->nick; + prefixlist = this->GetPrefixChar(i->first); + nick = i->first->nick; FOREACH_MOD(I_OnNamesListItem, OnNamesListItem(user, i->second, prefixlist, nick)); @@ -804,32 +807,25 @@ void Channel::UserList(User *user) if (nick.empty()) continue; - size_t ptrlen = 0; - - if (curlen + prefixlist.length() + nick.length() + 1 > 480) + if (list.size() + prefixlist.length() + nick.length() + 1 > 480) { /* list overflowed into multiple numerics */ - user->WriteNumeric(RPL_NAMREPLY, std::string(list)); + user->WriteNumeric(RPL_NAMREPLY, list); - /* reset our lengths */ - dlen = curlen = snprintf(list,MAXBUF,"%s %c %s :", user->nick.c_str(), this->IsModeSet('s') ? '@' : this->IsModeSet('p') ? '*' : '=', this->name.c_str()); - ptr = list + dlen; - - numusers = 0; + // Erase all nicks, keep the constant part + list.erase(pos); + has_one = false; } - ptrlen = snprintf(ptr, MAXBUF, "%s%s ", prefixlist.c_str(), nick.c_str()); - - curlen += ptrlen; - ptr += ptrlen; + list.append(prefixlist).append(nick).push_back(' '); - numusers++; + has_one = true; } /* if whats left in the list isnt empty, send it */ - if (numusers) + if (has_one) { - user->WriteNumeric(RPL_NAMREPLY, std::string(list)); + user->WriteNumeric(RPL_NAMREPLY, list); } user->WriteNumeric(RPL_ENDOFNAMES, "%s %s :End of /NAMES list.", user->nick.c_str(), this->name.c_str()); -- cgit v1.3.1-10-gc9f91 From 5c96689b177ded5b864f848687ec98f922215276 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Thu, 13 Mar 2014 15:41:10 +0100 Subject: Fix NAMES list getting truncated on servers having an excessively long server name --- src/channels.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/channels.cpp b/src/channels.cpp index 73d408fb8..6c9bd7c85 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -783,6 +783,7 @@ void Channel::UserList(User *user) */ bool has_user = this->HasUser(user); + const size_t maxlen = MAXBUF - 10 - ServerInstance->Config->ServerName.size(); std::string prefixlist; std::string nick; for (UserMembIter i = userlist.begin(); i != userlist.end(); ++i) @@ -807,7 +808,7 @@ void Channel::UserList(User *user) if (nick.empty()) continue; - if (list.size() + prefixlist.length() + nick.length() + 1 > 480) + if (list.size() + prefixlist.length() + nick.length() + 1 > maxlen) { /* list overflowed into multiple numerics */ user->WriteNumeric(RPL_NAMREPLY, list); -- cgit v1.3.1-10-gc9f91 From 3f601a622d886918866ae4775c1199892f43507c Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Sun, 23 Mar 2014 22:10:04 +0100 Subject: m_operprefix Don't set +y on the oper if hideoper is being unset due to deopering Fixes issue #801 reported by @UselessOper --- src/modules/m_operprefix.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/modules/m_operprefix.cpp b/src/modules/m_operprefix.cpp index 25937cd6e..62ddb6c67 100644 --- a/src/modules/m_operprefix.cpp +++ b/src/modules/m_operprefix.cpp @@ -162,7 +162,8 @@ class ModuleOperPrefixMode : public Module void HideOperWatcher::AfterMode(User* source, User* dest, Channel* channel, const std::string& parameter, bool adding, ModeType type) { - if (IS_LOCAL(dest)) + // If hideoper is being unset because the user is deopering, don't set +y + if (IS_LOCAL(dest) && IS_OPER(dest)) parentmod->SetOperPrefix(dest, !adding); } -- cgit v1.3.1-10-gc9f91 From ff33ebe7d9d9fb835d6c66ff15ddef78462966d0 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Tue, 25 Mar 2014 14:40:37 +0100 Subject: m_httpd Fix typo noticed by @SaberUK --- src/modules/m_httpd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/modules/m_httpd.cpp b/src/modules/m_httpd.cpp index a853e12c2..2a430d967 100644 --- a/src/modules/m_httpd.cpp +++ b/src/modules/m_httpd.cpp @@ -107,7 +107,7 @@ class HttpServerSocket : public BufferedSocket case 300: return "MULTIPLE CHOICES"; case 301: - return "MOVED PERMENANTLY"; + return "MOVED PERMANENTLY"; case 302: return "FOUND"; case 303: -- cgit v1.3.1-10-gc9f91 From 730128891aa71e2fec2f6210f2ebf339e233cd01 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Wed, 26 Mar 2014 17:24:51 +0100 Subject: m_globalload Don't pass a callback to ModuleManager::Reload() if reloading m_globalload --- src/modules/m_globalload.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/modules/m_globalload.cpp b/src/modules/m_globalload.cpp index 22286b950..9e0ec7705 100644 --- a/src/modules/m_globalload.cpp +++ b/src/modules/m_globalload.cpp @@ -149,7 +149,12 @@ class CommandGreloadmodule : public Command { Module* m = ServerInstance->Modules->Find(parameters[0]); if (m) - ServerInstance->Modules->Reload(m, new GReloadModuleWorker(user->nick, user->uuid, parameters[0])); + { + GReloadModuleWorker* worker = NULL; + if (m != creator) + worker = new GReloadModuleWorker(user->nick, user->uuid, parameters[0]); + ServerInstance->Modules->Reload(m, worker); + } else { user->WriteNumeric(975, "%s %s :Could not find module by that name", user->nick.c_str(), parameters[0].c_str()); -- cgit v1.3.1-10-gc9f91 From 96d561950c8086d132297eb691bf90bb2bc61a60 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Thu, 27 Mar 2014 15:41:47 +0100 Subject: m_watch Validate targ before use, noticed while rewriting m_watch for 2.2 --- src/modules/m_watch.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/modules/m_watch.cpp b/src/modules/m_watch.cpp index ec38edc31..fa7e212bb 100644 --- a/src/modules/m_watch.cpp +++ b/src/modules/m_watch.cpp @@ -316,10 +316,10 @@ class CommandWatch : public Command { for (watchlist::iterator q = wl->begin(); q != wl->end(); q++) { - if (!q->second.empty()) + User* targ = ServerInstance->FindNick(q->first.c_str()); + if (targ && !q->second.empty()) { user->WriteNumeric(604, "%s %s %s :is online", user->nick.c_str(), q->first.c_str(), q->second.c_str()); - User *targ = ServerInstance->FindNick(q->first.c_str()); if (IS_AWAY(targ)) { user->WriteNumeric(609, "%s %s %s %s %lu :is away", user->nick.c_str(), targ->nick.c_str(), targ->ident.c_str(), targ->dhost.c_str(), (unsigned long) targ->awaytime); -- cgit v1.3.1-10-gc9f91 From 23183603b7ea3b2a50ce082d573bef07ab794686 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Fri, 4 Apr 2014 18:30:02 +0200 Subject: Add REG_ALL checks to treat unregistered users as nonexistent in more cases --- src/commands/cmd_ison.cpp | 4 ++-- src/commands/cmd_kick.cpp | 4 ++-- src/modules/m_samode.cpp | 10 ++++++++++ src/modules/m_saquit.cpp | 2 +- src/modules/m_spanningtree/idle.cpp | 2 +- src/modules/m_watch.cpp | 2 +- 6 files changed, 17 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/commands/cmd_ison.cpp b/src/commands/cmd_ison.cpp index 227f1b3ed..01d12e13b 100644 --- a/src/commands/cmd_ison.cpp +++ b/src/commands/cmd_ison.cpp @@ -56,7 +56,7 @@ CmdResult CommandIson::Handle (const std::vector& parameters, User if (ison_already.find(u) != ison_already.end()) continue; - if (u) + if ((u) && (u->registered == REG_ALL)) { reply.append(u->nick).append(" "); if (reply.length() > 450) @@ -81,7 +81,7 @@ CmdResult CommandIson::Handle (const std::vector& parameters, User if (ison_already.find(u) != ison_already.end()) continue; - if (u) + if ((u) && (u->registered == REG_ALL)) { reply.append(u->nick).append(" "); if (reply.length() > 450) diff --git a/src/commands/cmd_kick.cpp b/src/commands/cmd_kick.cpp index 3c5fb0052..c497dd459 100644 --- a/src/commands/cmd_kick.cpp +++ b/src/commands/cmd_kick.cpp @@ -56,9 +56,9 @@ CmdResult CommandKick::Handle (const std::vector& parameters, User else u = ServerInstance->FindNick(parameters[1]); - if (!u || !c) + if ((!u) || (!c) || (u->registered != REG_ALL)) { - user->WriteServ( "401 %s %s :No such nick/channel", user->nick.c_str(), u ? parameters[0].c_str() : parameters[1].c_str()); + user->WriteServ( "401 %s %s :No such nick/channel", user->nick.c_str(), c ? parameters[1].c_str() : parameters[0].c_str()); return CMD_FAILURE; } diff --git a/src/modules/m_samode.cpp b/src/modules/m_samode.cpp index 9b71992a6..ea2ae24ab 100644 --- a/src/modules/m_samode.cpp +++ b/src/modules/m_samode.cpp @@ -39,6 +39,16 @@ class CommandSamode : public Command CmdResult Handle (const std::vector& parameters, User *user) { + if (parameters[0].c_str()[0] != '#') + { + User* target = ServerInstance->FindNickOnly(parameters[0]); + if ((!target) || (target->registered != REG_ALL)) + { + user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel", user->nick.c_str(), parameters[0].c_str()); + return CMD_FAILURE; + } + } + this->active = true; ServerInstance->Parser->CallHandler("MODE", parameters, user); if (ServerInstance->Modes->GetLastParse().length()) diff --git a/src/modules/m_saquit.cpp b/src/modules/m_saquit.cpp index 3b7bdc824..909a026ab 100644 --- a/src/modules/m_saquit.cpp +++ b/src/modules/m_saquit.cpp @@ -37,7 +37,7 @@ class CommandSaquit : public Command CmdResult Handle (const std::vector& parameters, User *user) { User* dest = ServerInstance->FindNick(parameters[0]); - if ((dest) && (!IS_SERVER(dest))) + if ((dest) && (!IS_SERVER(dest)) && (dest->registered == REG_ALL)) { if (ServerInstance->ULine(dest->server)) { diff --git a/src/modules/m_spanningtree/idle.cpp b/src/modules/m_spanningtree/idle.cpp index 8bc0cd2bb..0ea06a3cc 100644 --- a/src/modules/m_spanningtree/idle.cpp +++ b/src/modules/m_spanningtree/idle.cpp @@ -59,7 +59,7 @@ bool TreeSocket::Whois(const std::string &prefix, parameterlist ¶ms) { std::string who_did_the_whois = params[0]; User* who_to_send_to = ServerInstance->FindNick(who_did_the_whois); - if ((who_to_send_to) && (IS_LOCAL(who_to_send_to))) + if ((who_to_send_to) && (IS_LOCAL(who_to_send_to)) && (who_to_send_to->registered == REG_ALL)) { // an incoming reply to a whois we sent out std::string nick_whoised = prefix; diff --git a/src/modules/m_watch.cpp b/src/modules/m_watch.cpp index fa7e212bb..0e532d65b 100644 --- a/src/modules/m_watch.cpp +++ b/src/modules/m_watch.cpp @@ -238,7 +238,7 @@ class CommandWatch : public Command } User* target = ServerInstance->FindNick(nick); - if (target) + if ((target) && (target->registered == REG_ALL)) { (*wl)[nick] = std::string(target->ident).append(" ").append(target->dhost).append(" ").append(ConvToStr(target->age)); user->WriteNumeric(604, "%s %s %s :is online",user->nick.c_str(), nick, (*wl)[nick].c_str()); -- cgit v1.3.1-10-gc9f91 From cf89660a6b1fde729cfa7f9462f9396394d8b658 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Fri, 4 Apr 2014 18:31:10 +0200 Subject: Fix snotice about disabled command usage being sent to the wrong snomask --- src/command_parse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/command_parse.cpp b/src/command_parse.cpp index 34844d804..1c72c7de4 100644 --- a/src/command_parse.cpp +++ b/src/command_parse.cpp @@ -313,7 +313,7 @@ bool CommandParser::ProcessCommand(LocalUser *user, std::string &cmd) user->nick.c_str(), command.c_str()); } - ServerInstance->SNO->WriteToSnoMask('t', "%s denied for %s (%s@%s)", + ServerInstance->SNO->WriteToSnoMask('a', "%s denied for %s (%s@%s)", command.c_str(), user->nick.c_str(), user->ident.c_str(), user->host.c_str()); return do_more; } -- cgit v1.3.1-10-gc9f91 From e5f96b0564a63fff73485dd552dfaefe534ed080 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Sun, 6 Apr 2014 16:25:50 +0200 Subject: Fix IPv6 address handling in 6aaf7047297b739377e7d509cb914f32447fb281 --- src/cidr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/cidr.cpp b/src/cidr.cpp index a4a252a48..333875665 100644 --- a/src/cidr.cpp +++ b/src/cidr.cpp @@ -68,7 +68,7 @@ bool irc::sockets::MatchCIDR(const std::string &address, const std::string &cidr const std::string::size_type per_pos = cidr_copy.rfind('/'); if ((per_pos == std::string::npos) || (per_pos == cidr_copy.length()-1) || (cidr_copy.find_first_not_of("0123456789", per_pos+1) != std::string::npos) - || (cidr_copy.find_first_not_of("0123456789.:") < per_pos)) + || (cidr_copy.find_first_not_of("0123456789abcdef.:") < per_pos)) { // The CIDR mask is invalid return false; -- cgit v1.3.1-10-gc9f91 From 493ff75f1f89a7ede2800eff0368740fbaf02aa4 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Sun, 6 Apr 2014 16:28:11 +0200 Subject: Release 2.0.16 --- src/version.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/version.sh b/src/version.sh index 0410bd522..7e11aaaea 100755 --- a/src/version.sh +++ b/src/version.sh @@ -1,2 +1,2 @@ #!/bin/sh -echo "InspIRCd-2.0.15" +echo "InspIRCd-2.0.16" -- cgit v1.3.1-10-gc9f91