X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fchannels.cpp;h=4c596575997e530b49ef63d013fea4f119149916;hb=34e8e5ff50213baad0ac81df8261a736d96e9b2d;hp=f340e12bf1528b4edf9a75cc3ddb8aeff0e72129;hpb=d54fd9b1e6b31f69332a9241b5f17330c0ad61e0;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/channels.cpp b/src/channels.cpp index f340e12bf..4c5965759 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -224,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); /* @@ -260,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]) @@ -318,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; } } } @@ -425,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 */ @@ -441,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 @@ -467,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; } @@ -676,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 '@': @@ -717,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); + } } } @@ -838,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); @@ -852,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);