X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fchannels.cpp;h=4c596575997e530b49ef63d013fea4f119149916;hb=34e8e5ff50213baad0ac81df8261a736d96e9b2d;hp=345ec79dd3a6264e77898663d57bd78eeca6c5f0;hpb=fe3799248f7d4cf50b1ba704615d5952dede8917;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/channels.cpp b/src/channels.cpp index 345ec79dd..4c5965759 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -16,27 +16,13 @@ using namespace std; -#include -#include -#include -#include -#include #include #include "configreader.h" #include "inspircd.h" -#include "hash_map.h" #include "users.h" -#include "ctables.h" -#include "globals.h" #include "modules.h" -#include "dynamic.h" -#include "commands.h" #include "wildcard.h" #include "mode.h" -#include "xline.h" -#include "inspstring.h" - -#include "typedefs.h" chanrec::chanrec(InspIRCd* Instance) : ServerInstance(Instance) { @@ -238,7 +224,7 @@ chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bo Ptr->modes[CM_TOPICLOCK] = Ptr->modes[CM_NOEXTERNAL] = 1; Ptr->created = Instance->Time(); *Ptr->topic = 0; - strlcpy(Ptr->setby, user->nick,NICKMAX-1); + *Ptr->setby = 0; Ptr->topicset = 0; Instance->Log(DEBUG,"chanrec::JoinUser(): created: %s",cname); /* @@ -274,21 +260,11 @@ chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bo FOREACH_RESULT_I(Instance,I_OnCheckKey,OnCheckKey(user, Ptr, key ? key : "")); if (!MOD_RESULT) { - if (!key) + if ((!key) || strcmp(key,Ptr->key)) { - Instance->Log(DEBUG,"chanrec::JoinUser(): no key given in JOIN"); - user->WriteServ("475 %s %s :Cannot join channel (Requires key)",user->nick, Ptr->name); + user->WriteServ("475 %s %s :Cannot join channel (Incorrect channel key)",user->nick, Ptr->name); return NULL; } - else - { - if (strcmp(key,Ptr->key)) - { - Instance->Log(DEBUG,"chanrec::JoinUser(): bad key given in JOIN"); - user->WriteServ("475 %s %s :Cannot join channel (Incorrect key)",user->nick, Ptr->name); - return NULL; - } - } } } if (Ptr->modes[CM_INVITEONLY]) @@ -332,17 +308,10 @@ chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bo sprintf(mask,"%s!%s@%s",user->nick, user->ident, user->GetIPString()); if (!MOD_RESULT) { - for (BanList::iterator i = Ptr->bans.begin(); i != Ptr->bans.end(); i++) + if (Ptr->IsBanned(user)) { - /* This allows CIDR ban matching - * - * Full masked host Full unmasked host IP with/without CIDR - */ - if ((match(user->GetFullHost(),i->data)) || (match(user->GetFullRealHost(),i->data)) || (match(mask, i->data, true))) - { - user->WriteServ("474 %s %s :Cannot join channel (You're banned)",user->nick, Ptr->name); - return NULL; - } + user->WriteServ("474 %s %s :Cannot join channel (You're banned)",user->nick, Ptr->name); + return NULL; } } } @@ -439,6 +408,7 @@ chanrec* chanrec::ForceChan(InspIRCd* Instance, chanrec* Ptr,ucrec *a,userrec* u a->channel = Ptr; Ptr->AddUser(user); + user->ModChannelCount(1); Ptr->WriteChannel(user,"JOIN :%s",Ptr->name); /* Major improvement by Brain - we dont need to be calculating all this pointlessly for remote users */ @@ -455,6 +425,25 @@ chanrec* chanrec::ForceChan(InspIRCd* Instance, chanrec* Ptr,ucrec *a,userrec* u return Ptr; } +bool chanrec::IsBanned(userrec* user) +{ + char mask[MAXBUF]; + sprintf(mask,"%s!%s@%s",user->nick, user->ident, user->GetIPString()); + for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++) + { + /* This allows CIDR ban matching + * + * Full masked host Full unmasked host IP with/without CIDR + */ + if ((match(user->GetFullHost(),i->data)) || (match(user->GetFullRealHost(),i->data)) || (match(mask, i->data, true))) + { + return true; + } + + } + return false; +} + /* chanrec::PartUser * remove a channel from a users record, and remove the record from the hash * if the channel has become empty @@ -481,6 +470,7 @@ long chanrec::PartUser(userrec *user, const char* reason) } user->chans[i]->uc_modes = 0; user->chans[i]->channel = NULL; + user->ModChannelCount(-1); this->RemoveAllPrefixes(user); break; } @@ -690,28 +680,25 @@ void chanrec::WriteChannelWithServ(const char* ServName, const std::string &text /* write formatted text from a source user to all users on a channel except * for the sender (for privmsg etc) */ -void chanrec::WriteAllExceptSender(userrec* user, char status, char* text, ...) +void chanrec::WriteAllExceptSender(userrec* user, bool serversource, char status, char* text, ...) { char textbuffer[MAXBUF]; va_list argsPtr; - if (!user || !text) + if (!text) return; va_start(argsPtr, text); vsnprintf(textbuffer, MAXBUF, text, argsPtr); va_end(argsPtr); - this->WriteAllExceptSender(user, status, std::string(textbuffer)); + this->WriteAllExceptSender(user, serversource, status, std::string(textbuffer)); } -void chanrec::WriteAllExceptSender(userrec* user, char status, const std::string& text) +void chanrec::WriteAllExceptSender(userrec* user, bool serversource, char status, const std::string& text) { CUList *ulist; - if (!user) - return; - switch (status) { case '@': @@ -731,7 +718,12 @@ void chanrec::WriteAllExceptSender(userrec* user, char status, const std::string for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { if ((IS_LOCAL(i->second)) && (user != i->second)) - i->second->WriteFrom(user,text); + { + if (serversource) + i->second->WriteServ(text); + else + i->second->WriteFrom(user,text); + } } } @@ -852,7 +844,7 @@ void chanrec::UserList(userrec *user) if (curlen > (480-NICKMAX)) { /* list overflowed into multiple numerics */ - user->WriteServ(list); + user->WriteServ(std::string(list)); /* reset our lengths */ dlen = curlen = snprintf(list,MAXBUF,"353 %s = %s :", user->nick, this->name); @@ -866,7 +858,7 @@ void chanrec::UserList(userrec *user) /* if whats left in the list isnt empty, send it */ if (numusers) { - user->WriteServ(list); + user->WriteServ(std::string(list)); } user->WriteServ("366 %s %s :End of /NAMES list.", user->nick, this->name); @@ -993,6 +985,11 @@ int chanrec::GetStatus(userrec *user) return STATUS_NORMAL; } +/*bool ModeParser::PrefixComparison(const prefixtype one, const prefixtype two) +{ + return one.second > two.second; +}*/ + void chanrec::SetPrefix(userrec* user, char prefix, unsigned int prefix_value, bool adding) { prefixlist::iterator n = prefixes.find(user); @@ -1004,6 +1001,7 @@ void chanrec::SetPrefix(userrec* user, char prefix, unsigned int prefix_value, b if (std::find(n->second.begin(), n->second.end(), pfx) == n->second.end()) { n->second.push_back(pfx); + std::sort(n->second.begin(), n->second.end(), ModeParser::PrefixComparison); } } else