X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree.cpp;h=1e908f07b139ce063d5dfccfa4b50358e811c58b;hb=922d4ebf7a27a6577d6b4f91e0f42ccdfa989455;hp=3a811d1faade39545a9b7864b0b492adff70dbb5;hpb=1d6b72a5ba80b7f56f20b67b92677ffba3994991;p=user%2Fhenk%2Fcode%2Finspircd.git
diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp
index 3a811d1fa..1e908f07b 100644
--- a/src/modules/m_spanningtree.cpp
+++ b/src/modules/m_spanningtree.cpp
@@ -330,7 +330,7 @@ class TreeServer : public classbase
userrec* a = (userrec*)*n;
log(DEBUG,"Kill %s fd=%d",a->nick,a->fd);
if (!IS_LOCAL(a))
- kill_link(a,reason_s);
+ userrec::QuitUser(a,reason_s);
}
return time_to_die.size();
}
@@ -1029,7 +1029,7 @@ class TreeSocket : public InspSocket
*/
mh = ServerInstance->ModeGrok->FindMode(*x, chan ? MODETYPE_CHANNEL : MODETYPE_USER);
- if ((mh->GetNumParams(adding) > 0) && (!mh->IsListMode()))
+ if ((mh) && (mh->GetNumParams(adding) > 0) && (!mh->IsListMode()))
{
/* We only want to do special things to
* modes with parameters, we are going to rewrite
@@ -1148,19 +1148,28 @@ class TreeSocket : public InspSocket
if (to_keep.length())
{
- n = 0;
+ unsigned int n = 2;
+ unsigned int q = 0;
modelist[0] = params[0].c_str();
modelist[1] = to_keep.c_str();
- for (unsigned int q = 2; (q < params.size()) && (q < 64); q++)
- modelist[q] = params_to_keep[n++].c_str();
+ if (params_to_keep.size() > 2)
+ {
+ for (q = 2; (q < params_to_keep.size()) && (q < 64); q++)
+ {
+ log(DEBUG,"Item %d of %d", q, params_to_keep.size());
+ modelist[n++] = params_to_keep[q].c_str();
+ }
+ }
if (smode)
{
+ log(DEBUG,"Send mode");
Srv->SendMode(modelist, n+2, who);
}
else
{
+ log(DEBUG,"Send mode client");
Srv->CallCommandHandler("MODE", modelist, n+2, who);
}
@@ -1329,11 +1338,11 @@ class TreeSocket : public InspSocket
userrec* user = Srv->FindNick(source);
if (!user)
{
- WriteChannelWithServ(source.c_str(), c, "TOPIC %s :%s", c->name, c->topic);
+ c->WriteChannelWithServ(source.c_str(), "TOPIC %s :%s", c->name, c->topic);
}
else
{
- WriteChannel(c, user, "TOPIC %s :%s", c->name, c->topic);
+ c->WriteChannel(user, "TOPIC %s :%s", c->name, c->topic);
nsource = user->server;
}
/* all done, send it on its way */
@@ -1359,7 +1368,7 @@ class TreeSocket : public InspSocket
memset(&mode_users,0,sizeof(mode_users));
mode_users[0] = first;
mode_users[1] = modestring;
- strcpy(first,"+");
+ strcpy(modestring,"+");
unsigned int modectr = 2;
userrec* who = NULL;
@@ -1421,7 +1430,7 @@ class TreeSocket : public InspSocket
who = Srv->FindNick(usr);
if (who)
{
- Srv->JoinUserToChannel(who,channel,key);
+ chanrec::JoinUser(who, channel.c_str(), true, key);
if (modectr >= (MAXMODES-1))
{
/* theres a mode for this user. push them onto the mode queue, and flush it
@@ -1434,8 +1443,9 @@ class TreeSocket : public InspSocket
Srv->SendMode((const char**)mode_users,modectr,who);
if (ourTS != TS)
{
- log(DEFAULT,"Channel TS for %s changed from %lu to %lu",us,ourTS,TS);
+ log(DEFAULT,"Channel TS for %s changed from %lu to %lu",us->name,ourTS,TS);
us->age = TS;
+ ourTS = TS;
}
}
else
@@ -1452,6 +1462,7 @@ class TreeSocket : public InspSocket
params.push_back(ConvToStr(us->age));
}
params.push_back(mode_users[x]);
+
}
// tell everyone to bounce the modes. bad modes, bad!
DoOneToMany(Srv->GetServerName(),"FMODE",params);
@@ -1465,7 +1476,7 @@ class TreeSocket : public InspSocket
/* there werent enough modes built up to flush it during FJOIN,
* or, there are a number left over. flush them out.
*/
- if ((modectr > 2) && (who))
+ if ((modectr > 2) && (who) && (us))
{
if (ourTS >= TS)
{
@@ -1473,8 +1484,9 @@ class TreeSocket : public InspSocket
Srv->SendMode((const char**)mode_users,modectr,who);
if (ourTS != TS)
{
- log(DEFAULT,"Channel TS for %s changed from %lu to %lu",us,ourTS,TS);
+ log(DEFAULT,"Channel TS for %s changed from %lu to %lu",us->name,ourTS,TS);
us->age = TS;
+ ourTS = TS;
}
}
else
@@ -1527,7 +1539,7 @@ class TreeSocket : public InspSocket
return true;
}
// NICK age nick host dhost ident +modes ip :gecos
- // 0 123 4 56 7
+ // 0 1 2 3 4 5 6 7
time_t age = atoi(params[0].c_str());
/* This used to have a pretty craq'y loop doing the same thing,
@@ -1563,9 +1575,13 @@ class TreeSocket : public InspSocket
{
clientlist[tempnick]->modes[(*v)-65] = 1;
}
- insp_aton(params[6].c_str(),&clientlist[tempnick]->ip4);
- WriteOpers("*** Client connecting at %s: %s!%s@%s [%s]",clientlist[tempnick]->server,clientlist[tempnick]->nick,clientlist[tempnick]->ident,clientlist[tempnick]->host, insp_ntoa(clientlist[tempnick]->ip4));
+ if (params[6].find_first_of(":") != std::string::npos)
+ clientlist[tempnick]->SetSockAddr(AF_INET6, params[6].c_str(), 0);
+ else
+ clientlist[tempnick]->SetSockAddr(AF_INET, params[6].c_str(), 0);
+
+ WriteOpers("*** Client connecting at %s: %s!%s@%s [%s]",clientlist[tempnick]->server,clientlist[tempnick]->nick,clientlist[tempnick]->ident,clientlist[tempnick]->host, clientlist[tempnick]->GetIPString());
params[7] = ":" + params[7];
DoOneToAllButSender(source,"NICK",params,source);
@@ -1770,7 +1786,7 @@ class TreeSocket : public InspSocket
{
if (u->second->registered == REG_ALL)
{
- snprintf(data,MAXBUF,":%s NICK %lu %s %s %s %s +%s %s :%s",u->second->server,(unsigned long)u->second->age,u->second->nick,u->second->host,u->second->dhost,u->second->ident,u->second->FormatModes(),insp_ntoa(u->second->ip4),u->second->fullname);
+ snprintf(data,MAXBUF,":%s NICK %lu %s %s %s %s +%s %s :%s",u->second->server,(unsigned long)u->second->age,u->second->nick,u->second->host,u->second->dhost,u->second->ident,u->second->FormatModes(),u->second->GetIPString(),u->second->fullname);
this->WriteLine(data);
if (*u->second->oper)
{
@@ -1998,7 +2014,11 @@ class TreeSocket : public InspSocket
/* This is not required as one is sent in OnUserPostNick below
*/
//DoOneToMany(u->nick,"NICK",par);
- Srv->ChangeUserNick(u,params[1]);
+ if (!u->ForceNickChange(params[1].c_str()))
+ {
+ userrec::QuitUser(u, "Nickname collision");
+ return true;
+ }
u->age = atoi(params[2].c_str());
}
}
@@ -2014,7 +2034,7 @@ class TreeSocket : public InspSocket
if (u)
{
- Srv->JoinUserToChannel(u,params[1],"");
+ chanrec::JoinUser(u, params[1].c_str(), false);
DoOneToAllButSender(prefix,"SVSJOIN",params,prefix);
}
return true;
@@ -2062,7 +2082,7 @@ class TreeSocket : public InspSocket
params[1] = ":" + params[1];
DoOneToAllButSender(prefix,"KILL",params,sourceserv);
::Write(who->fd, ":%s KILL %s :%s (%s)", sourceserv.c_str(), who->nick, sourceserv.c_str(), reason.c_str());
- Srv->QuitUser(who,reason);
+ userrec::QuitUser(who,reason);
}
return true;
}
@@ -2880,7 +2900,9 @@ class TreeSocket : public InspSocket
chanrec* chan = Srv->FindChannel(params[0]);
if (user && chan)
{
- server_kick_channel(user,chan,(char*)params[2].c_str(),false);
+ if (!chan->ServerKickUser(user, params[2].c_str(), false))
+ /* Yikes, the channels gone! */
+ delete chan;
}
}
if (this->InboundServerName != "")
@@ -2947,11 +2969,11 @@ class TreeSocket : public InspSocket
p.push_back(prefix);
p.push_back("Nickname collision");
DoOneToMany(Srv->GetServerName(),"KILL",p);
- Srv->QuitUser(x,"Nickname collision ("+prefix+" -> "+params[0]+")");
+ userrec::QuitUser(x,"Nickname collision ("+prefix+" -> "+params[0]+")");
userrec* y = Srv->FindNick(prefix);
if (y)
{
- Srv->QuitUser(y,"Nickname collision");
+ userrec::QuitUser(y,"Nickname collision");
}
return DoOneToAllButSenderRaw(line,sourceserv,prefix,command,params);
}
@@ -3034,13 +3056,20 @@ class TreeSocket : public InspSocket
* IPs for which we don't have a link block.
*/
bool found = false;
- vector::iterator i;
+
found = (std::find(ValidIPs.begin(), ValidIPs.end(), ip) != ValidIPs.end());
if (!found)
{
- WriteOpers("Server connection from %s denied (no link blocks with that IP address)", ip);
- close(newsock);
- return false;
+ for (vector::iterator i = ValidIPs.begin(); i != ValidIPs.end(); i++)
+ if (MatchCIDR(ip, (*i).c_str()))
+ found = true;
+
+ if (!found)
+ {
+ WriteOpers("Server connection from %s denied (no link blocks with that IP address)", ip);
+ close(newsock);
+ return false;
+ }
}
TreeSocket* s = new TreeSocket(newsock, ip);
Srv->AddSocket(s);
@@ -3063,7 +3092,7 @@ class ServernameResolver : public Resolver
*/
Link MyLink;
public:
- ServernameResolver(const std::string &hostname, Link x) : Resolver(hostname, true), MyLink(x)
+ ServernameResolver(const std::string &hostname, Link x) : Resolver(hostname, DNS_QUERY_FORWARD), MyLink(x)
{
/* Nothing in here, folks */
}
@@ -3092,10 +3121,10 @@ class ServernameResolver : public Resolver
}
}
- void OnError(ResolverError e)
+ void OnError(ResolverError e, const std::string &errormessage)
{
/* Ooops! */
- WriteOpers("*** CONNECT: Error connecting \002%s\002: Unable to resolve hostname.",MyLink.Name.c_str());
+ WriteOpers("*** CONNECT: Error connecting \002%s\002: Unable to resolve hostname - %s",MyLink.Name.c_str(),errormessage.c_str());
}
};
@@ -3104,7 +3133,7 @@ class SecurityIPResolver : public Resolver
private:
Link MyLink;
public:
- SecurityIPResolver(const std::string &hostname, Link x) : Resolver(hostname, true), MyLink(x)
+ SecurityIPResolver(const std::string &hostname, Link x) : Resolver(hostname, DNS_QUERY_FORWARD), MyLink(x)
{
}
@@ -3114,9 +3143,9 @@ class SecurityIPResolver : public Resolver
ValidIPs.push_back(result);
}
- void OnError(ResolverError e)
+ void OnError(ResolverError e, const std::string &errormessage)
{
- log(DEBUG,"Could not resolve IP associated with Link '%s'!",MyLink.Name.c_str());
+ log(DEBUG,"Could not resolve IP associated with Link '%s': %s",MyLink.Name.c_str(),errormessage.c_str());
}
};
@@ -3329,6 +3358,7 @@ void ReadConfiguration(bool rebind)
for (int j =0; j < Conf->Enumerate("link"); j++)
{
Link L;
+ std::string Allow = Conf->ReadValue("link","allowmask",j);
L.Name = (Conf->ReadValue("link","name",j)).c_str();
L.IPAddr = Conf->ReadValue("link","ipaddr",j);
L.Port = Conf->ReadInteger("link","port",j,true);
@@ -3343,12 +3373,22 @@ void ReadConfiguration(bool rebind)
{
ValidIPs.push_back(L.IPAddr);
+ if (Allow.length())
+ ValidIPs.push_back(Allow);
+
/* Needs resolving */
insp_inaddr binip;
if (insp_aton(L.IPAddr.c_str(), &binip) < 1)
{
- SecurityIPResolver* sr = new SecurityIPResolver(L.IPAddr, L);
- Srv->AddResolver(sr);
+ try
+ {
+ SecurityIPResolver* sr = new SecurityIPResolver(L.IPAddr, L);
+ Srv->AddResolver(sr);
+ }
+ catch (ModuleException& e)
+ {
+ log(DEBUG,"Error in resolver: %s",e.GetReason());
+ }
}
LinkBlocks.push_back(L);
@@ -3546,6 +3586,10 @@ class ModuleSpanningTree : public Module
params[1] = s->GetName();
DoOneToOne(user->nick, "STATS", params, s->GetName());
}
+ else
+ {
+ WriteServ(user->fd, "402 %s %s :No such server", user->nick, parameters[0]);
+ }
return 1;
}
return 0;
@@ -3752,8 +3796,15 @@ class ModuleSpanningTree : public Module
}
else
{
- ServernameResolver* snr = new ServernameResolver(x->IPAddr, *x);
- Srv->AddResolver(snr);
+ try
+ {
+ ServernameResolver* snr = new ServernameResolver(x->IPAddr, *x);
+ Srv->AddResolver(snr);
+ }
+ catch (ModuleException& e)
+ {
+ log(DEBUG,"Error in resolver: %s",e.GetReason());
+ }
}
}
@@ -3826,8 +3877,15 @@ class ModuleSpanningTree : public Module
}
else
{
- ServernameResolver* snr = new ServernameResolver(x->IPAddr, *x);
- Srv->AddResolver(snr);
+ try
+ {
+ ServernameResolver* snr = new ServernameResolver(x->IPAddr, *x);
+ Srv->AddResolver(snr);
+ }
+ catch (ModuleException& e)
+ {
+ log(DEBUG,"Error in resolver: %s",e.GetReason());
+ }
}
return 1;
}
@@ -4146,7 +4204,7 @@ class ModuleSpanningTree : public Module
params.push_back(user->dhost);
params.push_back(user->ident);
params.push_back("+"+std::string(user->FormatModes()));
- params.push_back((char*)insp_ntoa(user->ip4));
+ params.push_back(user->GetIPString());
params.push_back(":"+std::string(user->fullname));
DoOneToMany(Srv->GetServerName(),"NICK",params);