int DieDelay = 5;
time_t startup_time = time(NULL);
int NetBufferSize = 10240; // NetBufferSize used as the buffer size for all read() ops
-time_t nb_start = time(NULL);
+time_t nb_start = 0;
extern vector<Module*> modules;
std::vector<std::string> module_names;
bool IsDenied(userrec *user);
void AddWhoWas(userrec* u);
+std::vector<long> auth_cookies;
std::stringstream config_f(stringstream::in | stringstream::out);
void safedelete(userrec *p)
{
if (!strcasecmp(i->second->server,servername))
{
+ log(DEBUG,"%s is common to %s sharing with %s",i->second->nick,servername,u->nick);
return true;
}
}
}
-void NetSendToCommon(userrec* u, chanrec* c, char* s)
+void NetSendToCommon(userrec* u, char* s)
{
char buffer[MAXBUF];
snprintf(buffer,MAXBUF,"%s",s);
+ log(DEBUG,"NetSendToCommon: '%s' '%s'",u->nick,s);
+
for (int j = 0; j < 32; j++)
{
if (me[j] != NULL)
char buffer[MAXBUF];
snprintf(buffer,MAXBUF,"%s",s);
+ log(DEBUG,"NetSendToAll: '%s'",s);
+
for (int j = 0; j < 32; j++)
{
if (me[j] != NULL)
char buffer[MAXBUF];
snprintf(buffer,MAXBUF,"%s",s);
+ log(DEBUG,"NetSendToOne: '%s' '%s'",target,s);
+
for (int j = 0; j < 32; j++)
{
if (me[j] != NULL)
char buffer[MAXBUF];
snprintf(buffer,MAXBUF,"%s",s);
+ log(DEBUG,"NetSendToAllExcept: '%s' '%s'",target,s);
+
for (int j = 0; j < 32; j++)
{
if (me[j] != NULL)
}
-int main (int argc, char *argv[])
+int main(int argc, char *argv[])
{
Start();
+ srand(time(NULL));
log(DEBUG,"*** InspIRCd starting up!");
if (!FileExists(CONFIG_FILE))
{
// if any users of this channel are on remote servers, broadcast the packet
char buffer[MAXBUF];
snprintf(buffer,MAXBUF,"P %s %s :%s",user->nick,chan->name,parameters[1]);
- NetSendToCommon(user,chan,buffer);
+ NetSendToCommon(user,buffer);
}
else
{
// if any users of this channel are on remote servers, broadcast the packet
char buffer[MAXBUF];
snprintf(buffer,MAXBUF,"V %s %s :%s",user->nick,chan->name,parameters[1]);
- NetSendToCommon(user,chan,buffer);
+ NetSendToCommon(user,buffer);
}
else
{
strncpy(clientlist[nick]->host, host,160);
strncpy(clientlist[nick]->dhost, dhost,160);
strncpy(clientlist[nick]->server, server,256);
- strncpy(clientlist[nick]->ident, ident,10); // +1 char to compensate for '~'
+ strncpy(clientlist[nick]->ident, ident,10); // +1 char to compensate for tilde
strncpy(clientlist[nick]->fullname, gecos,128);
clientlist[nick]->signon = TS;
clientlist[nick]->nping = 0; // this is ignored for a remote user anyway.
strncpy(user->dhost,host,160);
}
+void handle_plus(char token,char* params,serverrec* source,serverrec* reply, char* udp_host)
+{
+ // %s %s %d %d
+ char* servername = strtok(params," ");
+ char* ipaddr = strtok(NULL," ");
+ char* ipport = strtok(NULL," ");
+ char* cookie = strtok(NULL," ");
+ log(DEBUG," ");
+ log(DEBUG," ");
+ log(DEBUG,"*** Connecting back to %s:%d",ipaddr,ipport);
+ me[defaultRoute]->MeshCookie(ipaddr,atoi(ipport),atoi(cookie),servername);
+ log(DEBUG," ");
+}
+
void handle_J(char token,char* params,serverrec* source,serverrec* reply, char* udp_host)
{
}
}
-void process_restricted_commands(char token,char* params,serverrec* source,serverrec* reply, char* udp_host)
+void process_restricted_commands(char token,char* params,serverrec* source,serverrec* reply, char* udp_host,char* ipaddr,int port)
{
+ long authcookie = rand()*rand();
+ char buffer[MAXBUF];
+
switch(token)
{
// Y <TS>
// start netburst
case 'Y':
nb_start = time(NULL);
- WriteOpers("Server %s is starting netburst.",source->name);
+ WriteOpers("Server %s is starting netburst.",udp_host);
+ // now broadcast this new servers address out to all servers that are linked to us,
+ // except the newcomer. They'll all attempt to connect back to it.
+
+ // give the server its authcookie.
+ snprintf(buffer,MAXBUF,"~ %d",authcookie);
+ source->SendPacket(buffer,udp_host);
+ // tell all the other servers to use this authcookie to connect back again
+ snprintf(buffer,MAXBUF,"+ %s %s %d %d",udp_host,ipaddr,port,authcookie);
+ NetSendToAllExcept(udp_host,buffer);
+ break;
+ // ~
+ // Store authcookie
+ // once stored, this authcookie permits other servers to log in
+ // without user or password, using it.
+ case '~':
+ auth_cookies.push_back(atoi(params));
+ log(DEBUG,"*** Stored auth cookie, will permit servers with auth-cookie %d",atoi(params));
+ break;
+ // connect back to a server using an authcookie
+ case '+':
+ handle_plus(token,params,source,reply,udp_host);
break;
// ?
// ping
case 'F':
WriteOpers("Server %s has completed netburst. (%d secs)",udp_host,time(NULL)-nb_start);
handle_F(token,params,source,reply,udp_host);
+ nb_start = 0;
break;
+ // X <reserved>
+ // Send netburst now
case 'X':
WriteOpers("Sending my netburst to %s",udp_host);
DoSync(source,udp_host);
if (strstr(params," :")) {
strncpy(finalparam,strstr(params," :"),1024);
}
+ if (token == '-') {
+ char* cookie = strtok(params," ");
+ char* servername = strtok(NULL," ");
+ char* serverdesc = finalparam+2;
+ WriteOpers("AuthCookie CONNECT from %s (%s)",servername,udp_host);
+ for (int u = 0; u < auth_cookies.size(); u++)
+ {
+ if (auth_cookies[u] == atoi(cookie))
+ {
+ WriteOpers("Allowed cookie from %s, is now part of the mesh",servername);
+
+
+ for (int j = 0; j < 32; j++)
+ {
+ if (me[j] != NULL)
+ {
+ for (int k = 0; k < me[j]->connectors.size(); k++)
+ {
+ if (!strcasecmp(me[j]->connectors[k].GetServerName().c_str(),udp_host))
+ {
+ me[j]->connectors[k].SetServerName(servername);
+ return;
+ }
+ }
+ }
+ WriteOpers("\2WARNING!\2 %s sent us an authentication packet but we are not authenticating with this server right now! Possible intrusion attempt!",udp_host);
+ return;
+ }
+
+
+ return;
+ }
+ }
+ WriteOpers("Bad cookie from %s!",servername);
+ return;
+ }
+ else
if (token == 'S') {
// S test.chatspike.net password :ChatSpike InspIRCd test server
char* servername = strtok(params," ");
char buffer[MAXBUF];
sprintf(buffer,"X 0");
serv->SendPacket(buffer,udp_host);
- DoSync(serv,udp_host);
+ DoSync(me[j],udp_host);
return;
}
}
// found a valid ircd_connector.
// TODO: Fix this so it only lets servers in that are in the
// STATE_CONNECTED state!!!
- process_restricted_commands(token,params,me[j],serv,udp_host);
+ process_restricted_commands(token,params,me[j],serv,udp_host,me[j]->connectors[x].GetServerIP(),me[j]->connectors[x].GetServerPort());
return;
}
}
incomingSockfd = accept (me[x]->fd, (sockaddr *) &client, &length);
strncpy (remotehost,(char *) inet_ntoa (client.sin_addr),MAXBUF);
// add to this connections ircd_connector vector
- me[x]->AddIncoming(incomingSockfd,remotehost);
+ me[x]->AddIncoming(incomingSockfd,remotehost,ntohs(client.sin_port));
}
}
}
- for (int x = 0; x != UDPportCount; x++)
+ for (int x = 0; x < UDPportCount; x++)
{
std::deque<std::string> msgs;
msgs.clear();
log(DEBUG,"Invalid string from %s [route%d]",udp_host,x);
break;
}
+ // during a netburst, send all data to all other linked servers
+ if ((nb_start>0) && (udp_msg[0] != 'Y') && (udp_msg[0] != 'X') && (udp_msg[0] != 'F'))
+ {
+ NetSendToAllExcept(udp_host,udp_msg);
+ }
FOREACH_MOD OnPacketReceive(udp_msg);
handle_link_packet(udp_msg, udp_host, me[x]);
}