summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/modules/extra/m_ssl_gnutls.cpp42
1 files changed, 39 insertions, 3 deletions
diff --git a/src/modules/extra/m_ssl_gnutls.cpp b/src/modules/extra/m_ssl_gnutls.cpp
index b496b5706..f665af0d0 100644
--- a/src/modules/extra/m_ssl_gnutls.cpp
+++ b/src/modules/extra/m_ssl_gnutls.cpp
@@ -27,6 +27,15 @@
enum issl_status { ISSL_NONE, ISSL_HANDSHAKING_READ, ISSL_HANDSHAKING_WRITE, ISSL_HANDSHAKEN, ISSL_CLOSING, ISSL_CLOSED };
+bool isin(int port, std::vector<int> portlist)
+{
+ for(unsigned int i = 0; i < portlist.size(); i++)
+ if(portlist[i] == port)
+ return true;
+
+ return false;
+}
+
class issl_session
{
public:
@@ -44,6 +53,8 @@ class ModuleSSL : public Module
ServerConfig* SrvConf;
ConfigReader* Conf;
+ CullList culllist;
+
std::vector<int> listenports;
int inbufsize;
@@ -179,15 +190,40 @@ class ModuleSSL : public Module
gnutls_global_deinit();
}
+ virtual void OnCleanup(int target_type, void* item)
+ {
+ if(target_type == TYPE_USER)
+ {
+ userrec* user = (userrec*)item;
+
+ if(user->GetExt("ssl") && isin(user->port, listenports))
+ {
+ // User is using SSL, and they're using one of *our* SSL ports.
+ // Potentially there could be multiple SSL modules loaded at once on different ports.
+ culllist.AddItem(user, "SSL module unloading");
+ }
+ }
+ }
+
+ virtual void OnUnloadModule(Module* mod, std::string name)
+ {
+ if(mod == this)
+ {
+ // We're being unloaded, kill all the users added to the cull list in OnCleanup
+ int numusers = culllist.Apply();
+ log(DEBUG, "m_ssl_gnutls.so: Killed %d users for unload of GnuTLS SSL module", numusers);
+ }
+ }
+
virtual Version GetVersion()
{
- return Version(1, 0, 0, 0, VF_STATIC | VF_VENDOR);
+ return Version(1, 0, 0, 0, VF_VENDOR);
}
void Implements(char* List)
{
- List[I_OnRawSocketAccept] = List[I_OnRawSocketClose] = List[I_OnRawSocketRead] = List[I_OnRawSocketWrite] = 1;
- List[I_OnSyncUserMetaData] = List[I_OnDecodeMetaData] = List[I_OnUserQuit] = List[I_OnRehash] = List[I_OnWhois] = 1;
+ List[I_OnRawSocketAccept] = List[I_OnRawSocketClose] = List[I_OnRawSocketRead] = List[I_OnRawSocketWrite] = List[I_OnCleanup] = 1;
+ List[I_OnSyncUserMetaData] = List[I_OnDecodeMetaData] = List[I_OnUnloadModule] = List[I_OnRehash] = List[I_OnWhois] = 1;
}
virtual void OnRawSocketAccept(int fd, std::string ip, int localport)