static bool SelfSigned = false;
-bool isin(const std::string &hostandport, const std::vector<std::string> &portlist)
+bool isin(const std::string &host, int port, const std::vector<std::string> &portlist)
{
- return std::find(portlist.begin(), portlist.end(), hostandport) != portlist.end();
+ if (std::find(portlist.begin(), portlist.end(), "*:" + ConvToStr(port)) != portlist.end())
+ return true;
+
+ if (std::find(portlist.begin(), portlist.end(), ":" + ConvToStr(port)) != portlist.end())
+ return true;
+
+ return std::find(portlist.begin(), portlist.end(), host + ":" + ConvToStr(port)) != portlist.end();
}
char* get_error()
std::vector<std::string> listenports;
int inbufsize;
- issl_session sessions[MAX_DESCRIPTORS];
+ issl_session* sessions;
SSL_CTX* ctx;
SSL_CTX* clictx;
{
ServerInstance->Modules->PublishInterface("BufferedSocketHook", this);
+ sessions = new issl_session[ServerInstance->SE->GetMaxFds()];
+
// Not rehashable...because I cba to reduce all the sizes of existing buffers.
inbufsize = ServerInstance->Config->NetBufferSize;
virtual void OnHookUserIO(User* user, const std::string &targetip)
{
- if (!user->io && isin(targetip + ":" + ConvToStr(user->GetPort()), listenports))
+ if (!user->io && isin(targetip,user->GetPort(), listenports))
{
/* Hook the user with our module */
user->io = this;
for (size_t i = 0; i < ServerInstance->Config->ports.size(); i++)
if ((ServerInstance->Config->ports[i]->GetPort() == portno) && (ServerInstance->Config->ports[i]->GetIP() == addr))
ServerInstance->Config->ports[i]->SetDescription("ssl");
- ServerInstance->Logs->Log("m_ssl_openssl",DEFAULT, "m_ssl_gnutls.so: Enabling SSL for port %d", portno);
+ ServerInstance->Logs->Log("m_ssl_openssl",DEFAULT, "m_ssl_gnutls.so: Enabling SSL for port %ld", portno);
sslports.append((addr.empty() ? "*" : addr)).append(":").append(ConvToStr(portno)).append(";");
}
catch (ModuleException &e)
{
- ServerInstance->Logs->Log("m_ssl_openssl",DEFAULT, "m_ssl_gnutls.so: FAILED to enable SSL on port %d: %s. Maybe it's already hooked by the same port on a different IP, or you have an other SSL or similar module loaded?", portno, e.GetReason());
+ ServerInstance->Logs->Log("m_ssl_openssl",DEFAULT, "m_ssl_gnutls.so: FAILED to enable SSL on port %ld: %s. Maybe it's already hooked by the same port on a different IP, or you have an other SSL or similar module loaded?", portno, e.GetReason());
}
}
}
{
SSL_CTX_free(ctx);
SSL_CTX_free(clictx);
+ ServerInstance->Modules->UnpublishInterface("BufferedSocketHook", this);
+ delete[] sessions;
}
virtual void OnCleanup(int target_type, void* item)
virtual void OnRawSocketAccept(int fd, const std::string &ip, int localport)
{
/* Are there any possibilities of an out of range fd? Hope not, but lets be paranoid */
- if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ if ((fd < 0) || (fd > ServerInstance->SE->GetMaxFds() - 1))
return;
issl_session* session = &sessions[fd];
virtual void OnRawSocketConnect(int fd)
{
/* Are there any possibilities of an out of range fd? Hope not, but lets be paranoid */
- if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ if ((fd < 0) || (fd > ServerInstance->SE->GetMaxFds() -1))
return;
issl_session* session = &sessions[fd];
virtual void OnRawSocketClose(int fd)
{
/* Are there any possibilities of an out of range fd? Hope not, but lets be paranoid */
- if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ if ((fd < 0) || (fd > ServerInstance->SE->GetMaxFds() - 1))
return;
CloseSession(&sessions[fd]);
virtual int OnRawSocketRead(int fd, char* buffer, unsigned int count, int &readresult)
{
/* Are there any possibilities of an out of range fd? Hope not, but lets be paranoid */
- if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ if ((fd < 0) || (fd > ServerInstance->SE->GetMaxFds() - 1))
return 0;
issl_session* session = &sessions[fd];
virtual int OnRawSocketWrite(int fd, const char* buffer, int count)
{
/* Are there any possibilities of an out of range fd? Hope not, but lets be paranoid */
- if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ if ((fd < 0) || (fd > ServerInstance->SE->GetMaxFds() - 1))
return 0;
issl_session* session = &sessions[fd];
if ((user->GetExt("ssl", dummy)) && (IS_LOCAL(user)))
{
// Tell whatever protocol module we're using that we need to inform other servers of this metadata NOW.
- std::deque<std::string>* metadata = new std::deque<std::string>;
- metadata->push_back(user->nick);
- metadata->push_back("ssl"); // The metadata id
- metadata->push_back("ON"); // The value to send
- Event* event = new Event((char*)metadata,(Module*)this,"send_metadata");
- event->Send(ServerInstance); // Trigger the event. We don't care what module picks it up.
- delete event;
- delete metadata;
+ ServerInstance->PI->SendMetaData(user, TYPE_USER, "SSL", "on");
VerifyCertificate(&sessions[user->GetFd()], user);
if (sessions[user->GetFd()].sess)
X509_free(cert);
}
+
+ void Prioritize()
+ {
+ Module* server = ServerInstance->Modules->Find("m_spanningtree.so");
+ ServerInstance->Modules->SetPriority(this, I_OnPostConnect, PRIO_AFTER, &server);
+ }
+
};
static int error_callback(const char *str, size_t len, void *u)