* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * InspIRCd: (C) 2002-2010 InspIRCd Development Team
* See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
virtual void OnLookupComplete(const std::string &result, unsigned int ttl, bool cached)
{
/* Check the user still exists */
- if ((them) && (them == ServerInstance->SE->GetRef(theirfd)))
+ if ((them) && (&them->eh == ServerInstance->SE->GetRef(theirfd)))
{
if (notify)
ServerInstance->SNO->WriteGlobalSno('a', "Connecting user %s detected as using CGI:IRC (%s), changing real host to %s from %s", them->nick.c_str(), them->host.c_str(), result.c_str(), typ.c_str());
- them->host.assign(result,0, 64);
- them->dhost.assign(result, 0, 64);
- if (querytype)
- them->SetClientIP(result.c_str());
- them->ident.assign("~cgiirc", 0, 8);
+ if (result.length() > 64)
+ return;
+ them->host = result;
+ them->dhost = result;
them->InvalidateCache();
them->CheckLines(true);
}
virtual void OnError(ResolverError e, const std::string &errormessage)
{
- if ((them) && (them == ServerInstance->SE->GetRef(theirfd)))
+ if ((them) && (&them->eh == ServerInstance->SE->GetRef(theirfd)))
{
if (notify)
ServerInstance->SNO->WriteToSnoMask('a', "Connecting user %s detected as using CGI:IRC (%s), but their host can't be resolved from their %s!", them->nick.c_str(), them->host.c_str(), typ.c_str());
ServerInstance->Extensions.Register(&cmd.webirc_hostname);
ServerInstance->Extensions.Register(&cmd.webirc_ip);
- Implementation eventlist[] = { I_OnRehash, I_OnUserRegister, I_OnSyncUser, I_OnDecodeMetaData, I_OnUserDisconnect, I_OnUserConnect };
- ServerInstance->Modules->Attach(eventlist, this, 6);
+ Implementation eventlist[] = { I_OnRehash, I_OnUserRegister, I_OnDecodeMetaData, I_OnUserDisconnect, I_OnUserConnect };
+ ServerInstance->Modules->Attach(eventlist, this, 5);
}
{
std::string *webirc_hostname = cmd.webirc_hostname.get(user);
std::string *webirc_ip = cmd.webirc_ip.get(user);
- if (webirc_hostname)
+ if (webirc_hostname && webirc_hostname->length() < 64)
{
- user->host.assign(*webirc_hostname, 0, 64);
- user->dhost.assign(*webirc_hostname, 0, 64);
+ user->host = *webirc_hostname;
+ user->dhost = *webirc_hostname;
user->InvalidateCache();
- cmd.webirc_hostname.unset(user);
}
if (webirc_ip)
{
user->CheckClass();
user->CheckLines(true);
}
+ cmd.webirc_hostname.unset(user);
}
bool CheckPass(LocalUser* user)
{
cmd.realhost.set(user, user->host);
cmd.realip.set(user, user->GetIPString());
- user->host.assign(user->password, 0, 64);
- user->dhost.assign(user->password, 0, 64);
+ user->host = user->password;
+ user->dhost = user->password;
user->InvalidateCache();
- bool valid = false;
ServerInstance->Users->RemoveCloneCounts(user);
- valid = user->SetClientIP(user->password.c_str());
+ user->SetClientIP(user->password.c_str());
ServerInstance->Users->AddLocalClone(user);
ServerInstance->Users->AddGlobalClone(user);
user->SetClass();
user->CheckClass();
- if (valid)
+ try
{
- /* We were given a IP in the password, we don't do DNS so they get this is as their host as well. */
- if(NotifyOpers)
- ServerInstance->SNO->WriteGlobalSno('a', "Connecting user %s detected as using CGI:IRC (%s), changing real host to %s from PASS", user->nick.c_str(), user->host.c_str(), user->password.c_str());
+
+ bool cached;
+ CGIResolver* r = new CGIResolver(this, NotifyOpers, user->password, false, user, user->GetFd(), "PASS", cached);
+ ServerInstance->AddResolver(r, cached);
}
- else
+ catch (...)
{
- /* We got as resolved hostname in the password. */
- try
- {
-
- bool cached;
- CGIResolver* r = new CGIResolver(this, NotifyOpers, user->password, false, user, user->GetFd(), "PASS", cached);
- ServerInstance->AddResolver(r, cached);
- }
- catch (...)
- {
- if (NotifyOpers)
- ServerInstance->SNO->WriteToSnoMask('a', "Connecting user %s detected as using CGI:IRC (%s), but I could not resolve their hostname!", user->nick.c_str(), user->host.c_str());
- }
+ if (NotifyOpers)
+ ServerInstance->SNO->WriteToSnoMask('a', "Connecting user %s detected as using CGI:IRC (%s), but I could not resolve their hostname!", user->nick.c_str(), user->host.c_str());
}
user->password.clear();
bool IsValidHost(const std::string &host)
{
- if(!host.size())
+ if(!host.size() || host.size() > 64)
return false;
for(unsigned int i = 0; i < host.size(); i++)