X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fchannels.cpp;h=4435b3324cb6205cfae8f3a538615b7a796d7f20;hb=bd12e3a4e6501496f6eeb7aeb5245162020d6e6c;hp=7a42bccbbb4ba201943cf9926a9022ddfd520a2f;hpb=84af5345c10e05b9ae20774943a4cb6a2cdac38d;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/channels.cpp b/src/channels.cpp index 7a42bccbb..4435b3324 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -81,7 +81,7 @@ int Channel::SetTopic(User *u, std::string &ntopic, bool forceset) /* 0: check status, 1: don't, -1: disallow change silently */ FOREACH_RESULT(I_OnLocalTopicChange,OnLocalTopicChange(u,this,ntopic)); - + if (MOD_RESULT == 1) return CMD_FAILURE; else if (MOD_RESULT == 0) @@ -296,6 +296,7 @@ Channel* Channel::JoinUser(InspIRCd* Instance, User *user, const char* cn, bool strlcpy(cname, cn, Instance->Config->Limits.ChanMax); Ptr = Instance->FindChan(cname); + bool created_by_local = false; if (!Ptr) { @@ -310,6 +311,7 @@ Channel* Channel::JoinUser(InspIRCd* Instance, User *user, const char* cn, bool else { privs = "@"; + created_by_local = true; } if (IS_LOCAL(user) && override == false) @@ -412,9 +414,11 @@ Channel* Channel::JoinUser(InspIRCd* Instance, User *user, const char* cn, bool } } - /* As spotted by jilles, dont bother to set this on remote users */ - if (IS_LOCAL(user) && Ptr->GetUserCounter() == 0) + if (created_by_local) + { + /* As spotted by jilles, dont bother to set this on remote users */ Ptr->SetDefaultModes(); + } return Channel::ForceChan(Instance, Ptr, user, privs, bursting); } @@ -485,78 +489,73 @@ Channel* Channel::ForceChan(InspIRCd* Instance, Channel* Ptr, User* user, const bool Channel::IsBanned(User* user) { - char mask[MAXBUF]; - int MOD_RESULT = 0; - FOREACH_RESULT(I_OnCheckBan,OnCheckBan(user, this)); + int result = 0; + FOREACH_RESULT_MAP(I_OnCheckBan, OnCheckBan(user, this), + result = banmatch_reduce(result, MOD_RESULT); + ); + + if (result) + return (result < 0); - if (MOD_RESULT == -1) - return true; - else if (MOD_RESULT == 0) + char mask[MAXBUF]; + snprintf(mask, MAXBUF, "%s!%s@%s", user->nick.c_str(), user->ident.c_str(), user->GetIPString()); + for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++) { - snprintf(mask, MAXBUF, "%s!%s@%s", user->nick.c_str(), user->ident.c_str(), user->GetIPString()); - for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++) + if ((InspIRCd::Match(user->GetFullHost(),i->data, NULL)) || // host + (InspIRCd::Match(user->GetFullRealHost(),i->data, NULL)) || // uncloaked host + (InspIRCd::MatchCIDR(mask, i->data, NULL))) // ip { - if ((InspIRCd::Match(user->GetFullHost(),i->data, NULL)) || // host - (InspIRCd::Match(user->GetFullRealHost(),i->data, NULL)) || // uncloaked host - (InspIRCd::MatchCIDR(mask, i->data, NULL))) // ip - { - return true; - } + return true; } } return false; } -bool Channel::IsExtBanned(const std::string &str, char type) +int Channel::GetExtBanStatus(const std::string &str, char type) { - int MOD_RESULT = 0; - FOREACH_RESULT(I_OnCheckStringExtBan, OnCheckStringExtBan(str, this, type)); + int result = 0; + FOREACH_RESULT_MAP(I_OnCheckStringExtBan, OnCheckStringExtBan(str, this, type), + result = banmatch_reduce(result, MOD_RESULT); + ); + + if (result) + return result; - if (MOD_RESULT == -1) - return true; - else if (MOD_RESULT == 0) + // nobody decided for us, check the ban list + for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++) { - for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++) - { - if (i->data[0] != type || i->data[1] != ':') - continue; + if (i->data[0] != type || i->data[1] != ':') + continue; - // Iterate past char and : to get to the mask without doing a data copy(!) - std::string maskptr = i->data.substr(2); - ServerInstance->Logs->Log("EXTBANS", DEBUG, "Checking %s against %s, type is %c", str.c_str(), maskptr.c_str(), type); + std::string maskptr = i->data.substr(2); + ServerInstance->Logs->Log("EXTBANS", DEBUG, "Checking %s against %s, type is %c", str.c_str(), maskptr.c_str(), type); - if (InspIRCd::Match(str, maskptr, NULL)) - return true; - } + if (InspIRCd::Match(str, maskptr, NULL)) + return -1; } - return false; + return 0; } -bool Channel::IsExtBanned(User *user, char type) +int Channel::GetExtBanStatus(User *user, char type) { - int MOD_RESULT = 0; - FOREACH_RESULT(I_OnCheckExtBan, OnCheckExtBan(user, this, type)); - - if (MOD_RESULT == -1) - return true; - else if (MOD_RESULT == 0) - { - char mask[MAXBUF]; - snprintf(mask, MAXBUF, "%s!%s@%s", user->nick.c_str(), user->ident.c_str(), user->GetIPString()); - - // XXX: we should probably hook cloaked hosts in here somehow too.. - if (this->IsExtBanned(mask, type)) - return true; + int result = 0; + FOREACH_RESULT_MAP(I_OnCheckExtBan, OnCheckExtBan(user, this, type), + result = banmatch_reduce(result, MOD_RESULT); + ); - if (this->IsExtBanned(user->GetFullHost(), type)) - return true; + if (result) + return result; - if (this->IsExtBanned(user->GetFullRealHost(), type)) - return true; - } - - return false; + char mask[MAXBUF]; + int rv = 0; + snprintf(mask, MAXBUF, "%s!%s@%s", user->nick.c_str(), user->ident.c_str(), user->GetIPString()); + + // XXX: we should probably hook cloaked hosts in here somehow too.. + rv = banmatch_reduce(rv, this->GetExtBanStatus(mask, type)); + rv = banmatch_reduce(rv, this->GetExtBanStatus(user->GetFullHost(), type)); + rv = banmatch_reduce(rv, this->GetExtBanStatus(user->GetFullRealHost(), type)); + return rv; } /* Channel::PartUser