+ if (parameters[1].length() > ServerInstance->Config->Limits.MaxHost)
+ {
+ user->WriteNotice("*** CHGHOST: Host too long");
+ return CMD_FAILURE;
+ }
+
+ for (std::string::const_iterator x = parameters[1].begin(); x != parameters[1].end(); x++)
+ {
+ if (!hostmap[(unsigned char)*x])
+ {
+ user->WriteNotice("*** CHGHOST: Invalid characters in hostname");
+ return CMD_FAILURE;
+ }
+ }
+
+ User* dest = ServerInstance->FindNick(parameters[0]);
+
+ // Allow services to change the host of unregistered users
+ if ((!dest) || ((dest->registered != REG_ALL) && (!user->server->IsULine())))
+ {
+ user->WriteNumeric(Numerics::NoSuchNick(parameters[0]));
+ return CMD_FAILURE;
+ }
+
+ if (IS_LOCAL(dest))
+ {
+ if ((dest->ChangeDisplayedHost(parameters[1])) && (!user->server->IsULine()))
+ {
+ // fix by brain - ulines set hosts silently
+ ServerInstance->SNO->WriteGlobalSno('a', user->nick+" used CHGHOST to make the displayed host of "+dest->nick+" become "+dest->dhost);
+ }
+ }
+
+ return CMD_SUCCESS;