X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fusers.cpp;h=81f83058387fc544245ec01bbb1d4395c9da344c;hb=61197974c5f7ce009096468b208c3abf2c25810b;hp=2cc26c158c9bb0324c6e5c6da957c3e33971fa31;hpb=53b99c7324b5868e1660feca4dd81988bd43d371;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/users.cpp b/src/users.cpp index 2cc26c158..81f830583 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -18,37 +18,7 @@ #include "bancache.h" #include "commands/cmd_whowas.h" -typedef unsigned int uniq_id_t; -class sent -{ - uniq_id_t uniq_id; - uniq_id_t* array; - void init() - { - if (!array) - array = new uniq_id_t[ServerInstance->SE->GetMaxFds()]; - memset(array, 0, ServerInstance->SE->GetMaxFds() * sizeof(uniq_id_t)); - uniq_id++; - } - public: - sent() : uniq_id(static_cast(-1)), array(NULL) {} - inline uniq_id_t operator++() - { - if (++uniq_id == 0) - init(); - return uniq_id; - } - inline uniq_id_t& operator[](int i) - { - return array[i]; - } - ~sent() - { - delete[] array; - } -}; - -static sent already_sent; +already_sent_t LocalUser::already_sent_id = 0; std::string User::ProcessNoticeMasks(const char *sm) { @@ -67,9 +37,9 @@ std::string User::ProcessNoticeMasks(const char *sm) adding = false; break; case '*': - for (unsigned char d = 'A'; d <= 'z'; d++) + for (unsigned char d = 'a'; d <= 'z'; d++) { - if (ServerInstance->SNO->IsEnabled(d)) + if (!ServerInstance->SNO->masks[d - 'a'].Description.empty()) { if ((!IsNoticeMaskSet(d) && adding) || (IsNoticeMaskSet(d) && !adding)) { @@ -80,12 +50,23 @@ std::string User::ProcessNoticeMasks(const char *sm) output += d; } + oldadding = adding; + char u = toupper(d); + if ((!IsNoticeMaskSet(u) && adding) || (IsNoticeMaskSet(u) && !adding)) + { + if ((oldadding != adding) || (!output.length())) + output += (adding ? '+' : '-'); + + this->SetNoticeMask(u, adding); + + output += u; + } + oldadding = adding; } - oldadding = adding; } break; default: - if ((*c >= 'A') && (*c <= 'z') && (ServerInstance->SNO->IsEnabled(*c))) + if (isalpha(*c)) { if ((!IsNoticeMaskSet(*c) && adding) || (IsNoticeMaskSet(*c) && !adding)) { @@ -222,12 +203,11 @@ User::User(const std::string &uid, const std::string& sid, int type) } LocalUser::LocalUser(int myfd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* servaddr) - : User(ServerInstance->GetUID(), ServerInstance->Config->ServerName, USERTYPE_LOCAL), eh(this) + : User(ServerInstance->GetUID(), ServerInstance->Config->ServerName, USERTYPE_LOCAL), eh(this), + bytes_in(0), bytes_out(0), cmds_in(0), cmds_out(0), nping(0), CommandFloodPenalty(0), + already_sent(0) { - bytes_in = bytes_out = cmds_in = cmds_out = 0; - server_sa.sa.sa_family = AF_UNSPEC; - CommandFloodPenalty = 0; - lastping = nping = 0; + lastping = 0; eh.SetFd(myfd); memcpy(&client_sa, client, sizeof(irc::sockets::sockaddrs)); memcpy(&server_sa, servaddr, sizeof(irc::sockets::sockaddrs)); @@ -750,7 +730,7 @@ void LocalUser::CheckClass() } else if (a->type == CC_DENY) { - ServerInstance->Users->QuitUser(this, "Unauthorised connection"); + ServerInstance->Users->QuitUser(this, a->config->getString("reason", "Unauthorised connection")); return; } else if ((a->GetMaxLocal()) && (ServerInstance->Users->LocalCloneCount(this) > a->GetMaxLocal())) @@ -801,19 +781,7 @@ void LocalUser::FullConnect() * may put the user into a totally seperate class with different restrictions! so we *must* check again. * Don't remove this! -- w00t */ - this->SetClass(); - - /* Check the password, if one is required by the user's connect class. - * This CANNOT be in CheckClass(), because that is called prior to PASS as well! - */ - if (!MyClass->pass.empty()) - { - if (ServerInstance->PassCompare(this, MyClass->pass.c_str(), password.c_str(), MyClass->hash.c_str())) - { - ServerInstance->Users->QuitUser(this, "Invalid password"); - return; - } - } + SetClass(); CheckClass(); CheckLines(); @@ -904,7 +872,7 @@ bool User::ChangeNick(const std::string& newnick, bool force) * Also don't check Q:Lines for remote nickchanges, they should have our Q:Lines anyway to enforce themselves. * -- w00t */ - if (!IS_LOCAL(this)) + if (IS_LOCAL(this) && !force) { XLine* mq = ServerInstance->XLines->MatchesLine("Q",newnick); if (mq) @@ -1205,7 +1173,7 @@ void User::WriteCommonRaw(const std::string &line, bool include_self) if (this->registered != REG_ALL || quitting) return; - uniq_id_t uniq_id = ++already_sent; + LocalUser::already_sent_id++; UserChanList include_c(chans); std::map exceptions; @@ -1219,7 +1187,7 @@ void User::WriteCommonRaw(const std::string &line, bool include_self) LocalUser* u = IS_LOCAL(i->first); if (u && !u->quitting) { - already_sent[u->GetFd()] = uniq_id; + u->already_sent = LocalUser::already_sent_id; if (i->second) u->Write(line); } @@ -1231,9 +1199,9 @@ void User::WriteCommonRaw(const std::string &line, bool include_self) for (UserMembList::const_iterator i = ulist->begin(); i != ulist->end(); i++) { LocalUser* u = IS_LOCAL(i->first); - if (u && !u->quitting && already_sent[u->GetFd()] != uniq_id) + if (u && !u->quitting && u->already_sent != LocalUser::already_sent_id) { - already_sent[u->GetFd()] = uniq_id; + u->already_sent = LocalUser::already_sent_id; u->Write(line); } } @@ -1248,7 +1216,7 @@ void User::WriteCommonQuit(const std::string &normal_text, const std::string &op if (this->registered != REG_ALL) return; - uniq_id_t uniq_id = ++already_sent; + already_sent_t uniq_id = ++LocalUser::already_sent_id; snprintf(tb1,MAXBUF,":%s QUIT :%s",this->GetFullHost().c_str(),normal_text.c_str()); snprintf(tb2,MAXBUF,":%s QUIT :%s",this->GetFullHost().c_str(),oper_text.c_str()); @@ -1265,7 +1233,7 @@ void User::WriteCommonQuit(const std::string &normal_text, const std::string &op LocalUser* u = IS_LOCAL(i->first); if (u && !u->quitting) { - already_sent[u->GetFd()] = uniq_id; + u->already_sent = uniq_id; if (i->second) u->Write(IS_OPER(u) ? out2 : out1); } @@ -1276,9 +1244,9 @@ void User::WriteCommonQuit(const std::string &normal_text, const std::string &op for (UserMembList::const_iterator i = ulist->begin(); i != ulist->end(); i++) { LocalUser* u = IS_LOCAL(i->first); - if (u && !u->quitting && (already_sent[u->GetFd()] != uniq_id)) + if (u && !u->quitting && (u->already_sent != uniq_id)) { - already_sent[u->GetFd()] = uniq_id; + u->already_sent = uniq_id; u->Write(IS_OPER(u) ? out2 : out1); } } @@ -1389,8 +1357,8 @@ void User::DoHostCycle(const std::string &quitline) if (!ServerInstance->Config->CycleHosts) return; - uniq_id_t silent_id = ++already_sent; - uniq_id_t seen_id = ++already_sent; + already_sent_t silent_id = ++LocalUser::already_sent_id; + already_sent_t seen_id = ++LocalUser::already_sent_id; UserChanList include_c(chans); std::map exceptions; @@ -1404,12 +1372,12 @@ void User::DoHostCycle(const std::string &quitline) { if (i->second) { - already_sent[u->GetFd()] = seen_id; + u->already_sent = seen_id; u->Write(quitline); } else { - already_sent[u->GetFd()] = silent_id; + u->already_sent = silent_id; } } } @@ -1434,13 +1402,13 @@ void User::DoHostCycle(const std::string &quitline) LocalUser* u = IS_LOCAL(i->first); if (u == NULL || u == this) continue; - if (already_sent[u->GetFd()] == silent_id) + if (u->already_sent == silent_id) continue; - if (already_sent[u->GetFd()] != seen_id) + if (u->already_sent != seen_id) { u->Write(quitline); - already_sent[u->GetFd()] = seen_id; + u->already_sent = seen_id; } u->Write(joinline); if (modeline.length() > 0) @@ -1602,19 +1570,25 @@ void LocalUser::SetClass(const std::string &explicit_name) for (ClassVector::iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); i++) { ConnectClass* c = *i; + ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Checking %s", c->GetName().c_str()); - if (c->type == CC_ALLOW) - { - ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "ALLOW %s %d %s", c->host.c_str(), c->GetPort(), c->GetName().c_str()); - } - else if (c->type == CC_DENY) + ModResult MOD_RESULT; + FIRST_MOD_RESULT(OnSetConnectClass, MOD_RESULT, (this,c)); + if (MOD_RESULT == MOD_RES_DENY) + continue; + if (MOD_RESULT == MOD_RES_ALLOW) { - ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "DENY %s %d %s", c->GetHost().c_str(), c->GetPort(), c->GetName().c_str()); + ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Class forced by module to %s", c->GetName().c_str()); + found = c; + break; } - else - { + + if (c->type == CC_NAMED) + continue; + + bool regdone = (registered != REG_NONE); + if (c->config->getBool("registered", regdone) != regdone) continue; - } /* check if host matches.. */ if (c->GetHost().length() && !InspIRCd::MatchCIDR(this->GetIPString(), c->GetHost(), NULL) && @@ -1635,14 +1609,21 @@ void LocalUser::SetClass(const std::string &explicit_name) } /* if it requires a port ... */ - if (c->GetPort()) + int port = c->config->getInt("port"); + if (port) { - ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Requires port (%d)", c->GetPort()); + ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Requires port (%d)", port); /* and our port doesn't match, fail. */ - if (this->GetServerPort() != c->GetPort()) + if (this->GetServerPort() != port) + continue; + } + + if (!c->config->getString("pass").empty()) + { + if (ServerInstance->PassCompare(this, c->config->getString("pass"), password, c->config->getString("hash"))) { - ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Port match failed (%d)", this->GetServerPort()); + ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Bad password, skipping"); continue; } } @@ -1705,19 +1686,18 @@ const std::string& FakeUser::GetFullRealHost() ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask) : config(tag), type(t), fakelag(true), name("unnamed"), registration_timeout(0), host(mask), - pingtime(0), pass(""), hash(""), softsendqmax(0), hardsendqmax(0), recvqmax(0), - penaltythreshold(0), commandrate(0), maxlocal(0), maxglobal(0), maxchans(0), port(0), limit(0) + pingtime(0), softsendqmax(0), hardsendqmax(0), recvqmax(0), + penaltythreshold(0), commandrate(0), maxlocal(0), maxglobal(0), maxchans(0), limit(0) { } ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask, const ConnectClass& parent) : config(tag), type(t), fakelag(parent.fakelag), name("unnamed"), registration_timeout(parent.registration_timeout), host(mask), pingtime(parent.pingtime), - pass(parent.pass), hash(parent.hash), softsendqmax(parent.softsendqmax), - hardsendqmax(parent.hardsendqmax), recvqmax(parent.recvqmax), + softsendqmax(parent.softsendqmax), hardsendqmax(parent.hardsendqmax), recvqmax(parent.recvqmax), penaltythreshold(parent.penaltythreshold), commandrate(parent.commandrate), maxlocal(parent.maxlocal), maxglobal(parent.maxglobal), maxchans(parent.maxchans), - port(parent.port), limit(parent.limit) + limit(parent.limit) { } @@ -1727,8 +1707,6 @@ void ConnectClass::Update(const ConnectClass* src) registration_timeout = src->registration_timeout; host = src->host; pingtime = src->pingtime; - pass = src->pass; - hash = src->hash; softsendqmax = src->softsendqmax; hardsendqmax = src->hardsendqmax; recvqmax = src->recvqmax;