summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/modules/m_spanningtree.cpp140
1 files changed, 7 insertions, 133 deletions
diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp
index b770631f5..322b94e75 100644
--- a/src/modules/m_spanningtree.cpp
+++ b/src/modules/m_spanningtree.cpp
@@ -26,7 +26,6 @@
#include "inspircd.h"
#include "wildcard.h"
#include "xline.h"
-#include "aes.h"
#include "ssl.h"
/** If you make a change which breaks the protocol, increment this.
@@ -38,7 +37,7 @@
* Failure to document your protocol changes will result in a painfully
* painful death by pain. You have been warned.
*/
-const long ProtocolVersion = 1102;
+const long ProtocolVersion = 1103;
/*
* The server list in InspIRCd is maintained as two structures
@@ -111,7 +110,6 @@ class Link : public classbase
std::string RecvPass;
unsigned long AutoConnect;
time_t NextConnectTime;
- std::string EncryptionKey;
bool HiddenFromStats;
std::string FailOver;
std::string Hook;
@@ -673,8 +671,6 @@ class TreeSocket : public InspSocket
time_t NextPing;
bool LastPingWasGood;
bool bursting;
- AES* ctx_in;
- AES* ctx_out;
unsigned int keylength;
std::string ModuleList;
std::map<std::string,std::string> CapKeys;
@@ -692,8 +688,6 @@ class TreeSocket : public InspSocket
{
myhost = host;
this->LinkState = LISTENER;
- this->ctx_in = NULL;
- this->ctx_out = NULL;
Instance->Log(DEBUG, "HOOK = %08x", Hook);
@@ -706,8 +700,6 @@ class TreeSocket : public InspSocket
{
myhost = ServerName;
this->LinkState = CONNECTING;
- this->ctx_in = NULL;
- this->ctx_out = NULL;
}
/** When a listening socket gives us a new file descriptor,
@@ -718,8 +710,6 @@ class TreeSocket : public InspSocket
: InspSocket(SI, newfd, ip), Utils(Util), Hook(HookMod)
{
this->LinkState = WAIT_AUTH_1;
- this->ctx_in = NULL;
- this->ctx_out = NULL;
Instance->Log(DEBUG, "HOOK = %08x", Hook);
@@ -742,42 +732,9 @@ class TreeSocket : public InspSocket
~TreeSocket()
{
- if (ctx_in)
- DELETE(ctx_in);
- if (ctx_out)
- DELETE(ctx_out);
-
if (Hook)
InspSocketUnhookRequest(this, (Module*)Utils->Creator, Hook).Send();
}
-
- void InitAES(std::string key,std::string SName)
- {
- if (key == "")
- return;
-
- ctx_in = new AES();
- ctx_out = new AES();
- Instance->Log(DEBUG,"Initialized AES key %s",key.c_str());
- // key must be 16, 24, 32 etc bytes (multiple of 8)
- keylength = key.length();
- if (!(keylength == 16 || keylength == 24 || keylength == 32))
- {
- this->Instance->SNO->WriteToSnoMask('l',"\2ERROR\2: Key length for encryptionkey is not 16, 24 or 32 bytes in length!");
- Instance->Log(DEBUG,"Key length not 16, 24 or 32 characters!");
- }
- else
- {
- if (this->GetState() != I_ERROR)
- {
- this->Instance->SNO->WriteToSnoMask('l',"\2AES\2: Initialized %d bit encryption to server %s",keylength*8,SName.c_str());
- ctx_in->MakeKey(key.c_str(), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
- \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", keylength, keylength);
- ctx_out->MakeKey(key.c_str(), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
- \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", keylength, keylength);
- }
- }
- }
/** When an outbound connection finishes connecting, we receive
* this event, and must send our SERVER string to the other
@@ -801,18 +758,6 @@ class TreeSocket : public InspSocket
else
this->SendCapabilities();
- if (x->EncryptionKey != "")
- {
- if (!(x->EncryptionKey.length() == 16 || x->EncryptionKey.length() == 24 || x->EncryptionKey.length() == 32))
- {
- this->Instance->SNO->WriteToSnoMask('l',"\2WARNING\2: Your encryption key is NOT 16, 24 or 32 characters in length, encryption will \2NOT\2 be enabled.");
- }
- else
- {
- this->WriteLine(std::string("AES ")+this->Instance->Config->ServerName);
- this->InitAES(x->EncryptionKey,x->Name.c_str());
- }
- }
/* found who we're supposed to be connecting to, send the neccessary gubbins. */
if (Hook)
Instance->Timers->AddTimer(new HandshakeTimer(Instance, this, &(*x), this->Utils));
@@ -2220,34 +2165,6 @@ class TreeSocket : public InspSocket
/* Process this one, abort if it
* didnt return true.
*/
- if (this->ctx_in)
- {
- char out[1024];
- char result[1024];
- memset(result,0,1024);
- memset(out,0,1024);
- /* ERROR + CAPAB is still allowed unencryped */
- if ((ret.substr(0,7) != "ERROR :") && (ret.substr(0,6) != "CAPAB "))
- {
- int nbytes = from64tobits(out, ret.c_str(), 1024);
- if ((nbytes > 0) && (nbytes < 1024))
- {
- ctx_in->Decrypt(out, result, nbytes, 0);
- for (int t = 0; t < nbytes; t++)
- {
- if (result[t] == '\7')
- {
- /* We only need to stick a \0 on the
- * first \7, the rest will be lost
- */
- result[t] = 0;
- break;
- }
- }
- ret = result;
- }
- }
- }
if (!this->ProcessLine(ret))
{
return false;
@@ -2264,22 +2181,6 @@ class TreeSocket : public InspSocket
int WriteLine(std::string line)
{
Instance->Log(DEBUG,"OUT: %s",line.c_str());
- if (this->ctx_out)
- {
- char result[10240];
- char result64[10240];
- if (this->keylength)
- {
- // pad it to the key length
- int n = this->keylength - (line.length() % this->keylength);
- if (n)
- line.append(n,'\7');
- }
- unsigned int ll = line.length();
- ctx_out->Encrypt(line.c_str(), result, ll, 0);
- to64frombits((unsigned char*)result64,(unsigned char*)result,ll);
- line = result64;
- }
line.append("\r\n");
return this->Write(line);
}
@@ -3130,16 +3031,6 @@ class TreeSocket : public InspSocket
this->Instance->SNO->WriteToSnoMask('l',"Server connection from \2"+sname+"\2 denied, already exists on server "+CheckDupe->GetParent()->GetName());
return false;
}
- /* If the config says this link is encrypted, but the remote side
- * hasnt bothered to send the AES command before SERVER, then we
- * boot them off as we MUST have this connection encrypted.
- */
- if ((x->EncryptionKey != "") && (!this->ctx_in))
- {
- this->WriteLine("ERROR :This link requires AES encryption to be enabled. Plaintext connection refused.");
- this->Instance->SNO->WriteToSnoMask('l',"Server connection from \2"+sname+"\2 denied, remote server did not enable AES.");
- return false;
- }
this->Instance->SNO->WriteToSnoMask('l',"Verified incoming server connection from \002"+sname+"\002["+(x->HiddenFromStats ? "<hidden>" : this->GetIP())+"] ("+description+")");
this->InboundServerName = sname;
this->InboundDescription = description;
@@ -3190,24 +3081,6 @@ class TreeSocket : public InspSocket
command = params[0].c_str();
params.pop_front();
- if ((!this->ctx_in) && (command == "AES"))
- {
- std::string sserv = params[0];
- for (std::vector<Link>::iterator x = Utils->LinkBlocks.begin(); x < Utils->LinkBlocks.end(); x++)
- {
- if ((x->EncryptionKey != "") && (x->Name == sserv))
- {
- this->InitAES(x->EncryptionKey,sserv);
- }
- }
-
- return true;
- }
- else if ((this->ctx_in) && (command == "AES"))
- {
- this->Instance->SNO->WriteToSnoMask('l',"\2AES\2: Encryption already enabled on this connection yet %s is trying to enable it twice!",params[0].c_str());
- }
-
switch (this->LinkState)
{
TreeServer* Node;
@@ -4138,9 +4011,10 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
if ((!transport.empty()) && (hooks.find(transport.c_str()) == hooks.end()))
{
- ServerInstance->Log(DEFAULT,"m_spanningtree: WARNING: Can't find transport type '%s' - maybe you forgot to load it BEFORE m_spanningtree in your config file?",
- transport.c_str());
- continue;
+ ServerInstance->Log(DEFAULT,"m_spanningtree: WARNING: Can't find transport type '%s' for port %s:%s - maybe you forgot\
+ to load it BEFORE m_spanningtree in your config file?",
+ transport.c_str(), IP.c_str(), Port.c_str());
+ break;
}
TreeSocket* listener = new TreeSocket(this, ServerInstance, IP.c_str(), portno, true, 10, transport.empty() ? NULL : hooks[transport.c_str()]);
@@ -4177,7 +4051,6 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
L.SendPass = Conf->ReadValue("link","sendpass",j);
L.RecvPass = Conf->ReadValue("link","recvpass",j);
L.AutoConnect = Conf->ReadInteger("link","autoconnect",j,true);
- L.EncryptionKey = Conf->ReadValue("link","encryptionkey",j);
L.HiddenFromStats = Conf->ReadFlag("link","hidden",j);
L.Timeout = Conf->ReadInteger("link","timeout",j,true);
L.Hook = Conf->ReadValue("link", "transport", j);
@@ -4267,6 +4140,7 @@ void HandshakeTimer::Tick(time_t TIME)
{
if (sock->GetHook() && InspSocketHSCompleteRequest(sock, (Module*)Utils->Creator, sock->GetHook()).Send())
{
+ Instance->Log(DEBUG,"Handshake timer activated, sending SERVER and/or CAPAB");
InspSocketAttachCertRequest(sock, (Module*)Utils->Creator, sock->GetHook()).Send();
sock->SendCapabilities();
if (sock->GetLinkState() == CONNECTING)
@@ -4842,7 +4716,7 @@ class ModuleSpanningTree : public Module
{
for (unsigned int i = 0; i < Utils->LinkBlocks.size(); i++)
{
- results.push_back(std::string(ServerInstance->Config->ServerName)+" 213 "+user->nick+" "+statschar+" *@"+(Utils->LinkBlocks[i].HiddenFromStats ? "<hidden>" : Utils->LinkBlocks[i].IPAddr)+" * "+Utils->LinkBlocks[i].Name.c_str()+" "+ConvToStr(Utils->LinkBlocks[i].Port)+" "+(Utils->LinkBlocks[i].EncryptionKey != "" ? 'e' : '-')+(Utils->LinkBlocks[i].AutoConnect ? 'a' : '-')+'s');
+ results.push_back(std::string(ServerInstance->Config->ServerName)+" 213 "+user->nick+" "+statschar+" *@"+(Utils->LinkBlocks[i].HiddenFromStats ? "<hidden>" : Utils->LinkBlocks[i].IPAddr)+" * "+Utils->LinkBlocks[i].Name.c_str()+" "+ConvToStr(Utils->LinkBlocks[i].Port)+" "+(Utils->LinkBlocks[i].Hook.empty() ? "plaintext" : Utils->LinkBlocks[i].Hook)+" "+(Utils->LinkBlocks[i].AutoConnect ? 'a' : '-')+'s');
if (statschar == 'c')
results.push_back(std::string(ServerInstance->Config->ServerName)+" 244 "+user->nick+" H * * "+Utils->LinkBlocks[i].Name.c_str());
}