summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modules.h2
-rw-r--r--include/users.h8
-rw-r--r--src/modules/m_cgiirc.cpp8
-rw-r--r--src/users.cpp13
4 files changed, 17 insertions, 14 deletions
diff --git a/include/modules.h b/include/modules.h
index 2b9237a5d..e450233da 100644
--- a/include/modules.h
+++ b/include/modules.h
@@ -116,7 +116,7 @@ struct ModResult {
* and numerical comparisons in preprocessor macros if they wish to support
* multiple versions of InspIRCd in one file.
*/
-#define INSPIRCD_VERSION_API 3
+#define INSPIRCD_VERSION_API 4
/**
* This #define allows us to call a method in all
diff --git a/include/users.h b/include/users.h
index 0fc63c9b8..88abfbcd1 100644
--- a/include/users.h
+++ b/include/users.h
@@ -393,9 +393,9 @@ class CoreExport User : public Extensible
/** Sets the client IP for this user
* @return true if the conversion was successful
*/
- virtual bool SetClientIP(const char* sip);
+ virtual bool SetClientIP(const char* sip, bool recheck_eline = true);
- virtual void SetClientIP(const irc::sockets::sockaddrs& sa);
+ virtual void SetClientIP(const irc::sockets::sockaddrs& sa, bool recheck_eline = true);
/** Constructor
* @throw CoreException if the UID allocated to the user already exists
@@ -825,9 +825,9 @@ class CoreExport LocalUser : public User, public InviteBase
*/
void SetClass(const std::string &explicit_name = "");
- bool SetClientIP(const char* sip);
+ bool SetClientIP(const char* sip, bool recheck_eline = true);
- void SetClientIP(const irc::sockets::sockaddrs& sa);
+ void SetClientIP(const irc::sockets::sockaddrs& sa, bool recheck_eline = true);
void SendText(const std::string& line);
void Write(const std::string& text);
diff --git a/src/modules/m_cgiirc.cpp b/src/modules/m_cgiirc.cpp
index 63efd6bae..d4ef602b3 100644
--- a/src/modules/m_cgiirc.cpp
+++ b/src/modules/m_cgiirc.cpp
@@ -176,9 +176,9 @@ class ModuleCgiIRC : public Module
CommandWebirc cmd;
LocalIntExt waiting;
- static void RecheckElineAndClass(LocalUser* user)
+ static void RecheckClass(LocalUser* user)
{
- user->exempt = (ServerInstance->XLines->MatchesLine("E", user) != NULL);
+ user->MyClass = NULL;
user->SetClass();
user->CheckClass();
}
@@ -198,7 +198,7 @@ class ModuleCgiIRC : public Module
ChangeIP(user, newip);
user->host = user->dhost = user->GetIPString();
user->InvalidateCache();
- RecheckElineAndClass(user);
+ RecheckClass(user);
// Don't create the resolver if the core couldn't put the user in a connect class or when dns is disabled
if (user->quitting || ServerInstance->Config->NoUserDns)
return;
@@ -295,7 +295,7 @@ public:
std::string* webirc_hostname = cmd.webirc_hostname.get(user);
user->host = user->dhost = (webirc_hostname ? *webirc_hostname : user->GetIPString());
- RecheckElineAndClass(user);
+ RecheckClass(user);
if (user->quitting)
return MOD_RES_DENY;
diff --git a/src/users.cpp b/src/users.cpp
index 30df3c153..adfa7642c 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -987,36 +987,39 @@ irc::sockets::cidr_mask User::GetCIDRMask()
return irc::sockets::cidr_mask(client_sa, range);
}
-bool User::SetClientIP(const char* sip)
+bool User::SetClientIP(const char* sip, bool recheck_eline)
{
cachedip.clear();
cached_hostip.clear();
return irc::sockets::aptosa(sip, 0, client_sa);
}
-void User::SetClientIP(const irc::sockets::sockaddrs& sa)
+void User::SetClientIP(const irc::sockets::sockaddrs& sa, bool recheck_eline)
{
cachedip.clear();
cached_hostip.clear();
memcpy(&client_sa, &sa, sizeof(irc::sockets::sockaddrs));
}
-bool LocalUser::SetClientIP(const char* sip)
+bool LocalUser::SetClientIP(const char* sip, bool recheck_eline)
{
irc::sockets::sockaddrs sa;
if (!irc::sockets::aptosa(sip, 0, sa))
// Invalid
return false;
- LocalUser::SetClientIP(sa);
+ LocalUser::SetClientIP(sa, recheck_eline);
return true;
}
-void LocalUser::SetClientIP(const irc::sockets::sockaddrs& sa)
+void LocalUser::SetClientIP(const irc::sockets::sockaddrs& sa, bool recheck_eline)
{
if (sa != client_sa)
{
User::SetClientIP(sa);
+ if (recheck_eline)
+ this->exempt = (ServerInstance->XLines->MatchesLine("E", this) != NULL);
+
FOREACH_MOD(I_OnSetUserIP,OnSetUserIP(this));
}
}