*/
#include "inspircd.h"
-#include "users.h"
-#include "modules.h"
-#include "dns.h"
+
#ifndef WINDOWS
#include <sys/socket.h>
#include <netinet/in.h>
/* $ModDesc: Change user's hosts connecting from known CGI:IRC hosts */
-enum CGItype { PASS, IDENT, PASSFIRST, IDENTFIRST, WEBIRC };
+enum CGItype { INVALID, PASS, IDENT, PASSFIRST, IDENTFIRST, WEBIRC };
/** Holds a CGI site's details
CGIResolver(Module* me, InspIRCd* ServerInstance, bool NotifyOpers, const std::string &source, bool forward, userrec* u, int userfd, const std::string &type, bool &cached)
: Resolver(ServerInstance, source, forward ? DNS_QUERY_A : DNS_QUERY_PTR4, cached, me), typ(type), theirfd(userfd), them(u), notify(NotifyOpers) { }
- virtual void OnLookupComplete(const std::string &result, unsigned int ttl, bool cached)
+ virtual void OnLookupComplete(const std::string &result, unsigned int ttl, bool cached, int resultnum = 0)
{
+ if (resultnum)
+ return;
+
/* Check the user still exists */
if ((them) && (them == ServerInstance->SE->GetRef(theirfd)))
{
if(hostmask.length())
{
- Hosts.push_back(CGIhost(hostmask));
-
- if(type == "pass")
- Hosts.back().type = PASS;
- else if(type == "ident")
- Hosts.back().type = IDENT;
- else if(type == "passfirst")
- Hosts.back().type = PASSFIRST;
- else if(type == "webirc") {
- Hosts.back().type = WEBIRC;
- if(password.length())
- Hosts.back().password=password;
- else
+ if (type == "webirc" && !password.length()) {
ServerInstance->Log(DEFAULT, "m_cgiirc: Missing password in config: %s", hostmask.c_str());
}
+ else
+ {
+ CGItype cgitype = INVALID;
+ if (type == "pass")
+ cgitype = PASS;
+ else if (type == "ident")
+ cgitype = IDENT;
+ else if (type == "passfirst")
+ cgitype = PASSFIRST;
+ else if (type == "webirc")
+ {
+ cgitype = WEBIRC;
+ }
+
+ if (cgitype == INVALID)
+ cgitype = PASS;
+
+ Hosts.push_back(CGIhost(hostmask,cgitype, password.length() ? password : "" ));
+ }
}
else
{
if(user->GetExt("cgiirc_webirc_ip", webirc_ip))
{
bool valid=false;
+ user->RemoveCloneCounts();
#ifdef IPV6
valid = (inet_pton(AF_INET6, webirc_ip->c_str(), &((sockaddr_in6*)user->ip)->sin6_addr) > 0);
delete webirc_ip;
user->InvalidateCache();
user->Shrink("cgiirc_webirc_ip");
+ ServerInstance->AddLocalClone(user);
+ ServerInstance->AddGlobalClone(user);
+ user->CheckClass();
}
}
user->InvalidateCache();
bool valid = false;
+ user->RemoveCloneCounts();
#ifdef IPV6
if (user->GetProtocolFamily() == AF_INET6)
valid = (inet_pton(AF_INET6, user->password, &((sockaddr_in6*)user->ip)->sin6_addr) > 0);
if (inet_aton(user->password, &((sockaddr_in*)user->ip)->sin_addr))
valid = true;
#endif
+ ServerInstance->AddLocalClone(user);
+ ServerInstance->AddGlobalClone(user);
+ user->CheckClass();
+
if (valid)
{
/* We were given a IP in the password, we don't do DNS so they get this is as their host as well. */
user->Extend("cgiirc_realhost", new std::string(user->host));
user->Extend("cgiirc_realip", new std::string(user->GetIPString()));
+ user->RemoveCloneCounts();
#ifdef IPV6
if (user->GetProtocolFamily() == AF_INET6)
inet_pton(AF_INET6, newip, &((sockaddr_in6*)user->ip)->sin6_addr);
else
#endif
inet_aton(newip, &((sockaddr_in*)user->ip)->sin_addr);
-
+ ServerInstance->AddLocalClone(user);
+ ServerInstance->AddGlobalClone(user);
+ user->CheckClass();
try
{
strlcpy(user->host, newip, 16);