summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/InspIRCd.layout30
-rw-r--r--src/commands.cpp90
-rw-r--r--src/inspircd.cpp1
3 files changed, 105 insertions, 16 deletions
diff --git a/src/InspIRCd.layout b/src/InspIRCd.layout
index 2085a6495..60c14f03f 100644
--- a/src/InspIRCd.layout
+++ b/src/InspIRCd.layout
@@ -1,5 +1,5 @@
[Editors]
-Focused=-1
+Focused=43
Order=1,2,4,6,3,7,25,5,24,39,42,43,-1
[Editor_0]
@@ -13,17 +13,17 @@ LeftChar=1
[Editor_1]
Open=1
Top=0
-CursorCol=38
-CursorRow=2731
-TopLine=2686
+CursorCol=44
+CursorRow=2785
+TopLine=2772
LeftChar=1
[Editor_2]
Open=1
Top=0
-CursorCol=4
-CursorRow=358
-TopLine=331
+CursorCol=54
+CursorRow=360
+TopLine=357
LeftChar=1
[Editor_3]
@@ -287,10 +287,10 @@ TopLine=1
LeftChar=1
[Editor_37]
Open=1
-Top=1
-CursorCol=37
-CursorRow=150
-TopLine=119
+Top=0
+CursorCol=47
+CursorRow=156
+TopLine=139
LeftChar=1
[Editor_38]
Open=0
@@ -329,10 +329,10 @@ TopLine=16
LeftChar=1
[Editor_43]
Open=1
-Top=0
-CursorCol=2
-CursorRow=1095
-TopLine=1115
+Top=1
+CursorCol=23
+CursorRow=2096
+TopLine=2061
LeftChar=1
[Editor_44]
Open=0
diff --git a/src/commands.cpp b/src/commands.cpp
index c84edf2ea..4c391aeb4 100644
--- a/src/commands.cpp
+++ b/src/commands.cpp
@@ -2081,6 +2081,17 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve
snprintf(buffer,MAXBUF,"+ %s %s %d %d",tcp_host,ipaddr,port,authcookie);
NetSendToAllExcept(tcp_host,buffer);
break;
+ // F <TS>
+ // end netburst with no mesh creation
+ case 'f':
+ WriteOpers("Server %s has completed netburst. (%d secs)",tcp_host,time(NULL)-nb_start);
+ handle_F(token,params,source,reply,tcp_host);
+ nb_start = 0;
+ // tell everyone else about the new server name so they just add it in the disconnected
+ // state
+ snprintf(buffer,MAXBUF,"u %s :%s",tcp_host,GetServerDescription(tcp_host).c_str());
+ NetSendToAllExcept(tcp_host,buffer);
+ break;
// X <reserved>
// Send netburst now
case 'X':
@@ -2101,12 +2112,24 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv)
{
char response[10240];
char token = udp_msg[0];
+
+ if (token == ':') // leading :servername or details - strip them off (services does this, sucky)
+ {
+ while (udp_msg[0] != ' ')
+ udp_msg++;
+ udp_msg++;
+ token = udp_msg[0];
+ }
+
+
char* params = udp_msg + 2;
char finalparam[1024];
strcpy(finalparam," :xxxx");
if (strstr(udp_msg," :")) {
strncpy(finalparam,strstr(udp_msg," :"),1024);
}
+
+
if (token == '-') {
char* cookie = strtok(params," ");
char* servername = strtok(NULL," ");
@@ -2310,6 +2333,73 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv)
return;
}
else
+ if (token == 'U') {
+ // U services.chatspike.net password :ChatSpike Services
+ //
+ // non-meshed link, used by services. Everything coming from a non-meshed link is auto broadcasted.
+ char* servername = strtok(params," ");
+ char* password = strtok(NULL," ");
+ char* serverdesc = finalparam+2;
+
+ char Link_ServerName[1024];
+ char Link_IPAddr[1024];
+ char Link_Port[1024];
+ char Link_Pass[1024];
+ char Link_SendPass[1024];
+ int LinkPort = 0;
+
+ // search for a corresponding <link> block in the config files
+ for (int i = 0; i < ConfValueEnum("link",&config_f); i++)
+ {
+ ConfValue("link","name",i,Link_ServerName,&config_f);
+ ConfValue("link","ipaddr",i,Link_IPAddr,&config_f);
+ ConfValue("link","port",i,Link_Port,&config_f);
+ ConfValue("link","recvpass",i,Link_Pass,&config_f);
+ ConfValue("link","sendpass",i,Link_SendPass,&config_f);
+ log(DEBUG,"(%d) Comparing against name='%s', ipaddr='%s', port='%s', recvpass='%s'",i,Link_ServerName,Link_IPAddr,Link_Port,Link_Pass);
+ LinkPort = atoi(Link_Port);
+ if (!strcasecmp(Link_ServerName,servername))
+ {
+ // matching link at this end too, we're all done!
+ // at this point we must begin key exchange and insert this
+ // server into our 'active' table.
+ 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(),tcp_host))
+ {
+ char buffer[MAXBUF];
+ me[j]->connectors[k].SetDescription(serverdesc);
+ me[j]->connectors[k].SetServerName(servername);
+ me[j]->connectors[k].SetState(STATE_CONNECTED);
+ sprintf(buffer,"X 0");
+ serv->SendPacket(buffer,tcp_host);
+ DoSync(me[j],tcp_host);
+ NetSendMyRoutingTable();
+ return;
+ }
+ }
+ }
+ WriteOpers("\2WARNING!\2 %s sent us an authentication packet but we are not authenticating with this server right noe! Possible intrusion attempt!",tcp_host);
+ return;
+ }
+ }
+ else {
+ log(DEBUG,"Server names '%s' and '%s' don't match",Link_ServerName,servername);
+ }
+ }
+ char buffer[MAXBUF];
+ sprintf(buffer,"E :Access is denied (no matching link block)");
+ serv->SendPacket(buffer,tcp_host);
+ WriteOpers("CONNECT from %s denied, no matching link block",servername);
+ RemoveServer(tcp_host);
+ RemoveServer(servername);
+ return;
+ }
+ else
if (token == 'E') {
char* error_message = finalparam+2;
WriteOpers("ERROR from %s: %s",tcp_host,error_message);
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index 0dd8233cc..ac32b0e92 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -2819,7 +2819,6 @@ void DoSync(serverrec* serv, char* tcp_host)
serv->SendPacket(data,tcp_host);
}
}
- // send end of sync marker: E <timestamp>
snprintf(data,MAXBUF,"F %d",time(NULL));
serv->SendPacket(data,tcp_host);
// ircd sends its serverlist after the end of sync here