- // this method is called for any extended mode character.
- // all module modes for all modules pass through here
- // (unless another module further up the chain claims them)
- // so we must be VERY careful to only act upon modes which
- // we have claimed ourselves. This is a feature to allow
- // modules to 'spy' on extended mode activity if they so wish.
- if ((modechar == 'x') && (type == MT_CLIENT))
- {
- // OnExtendedMode gives us a void* as the target, we must cast
- // it into a userrec* or a chanrec* depending on the value of
- // the 'type' parameter (MT_CLIENT or MT_CHANNEL)
- userrec* dest = (userrec*)target;
-
- // we've now determined that this is our mode character...
- // is the user adding the mode to their list or removing it?
- if (mode_on)
- {
- // the mode is being turned on - so attempt to
- // allocate the user a cloaked host using a non-reversible
- // algorithm (its simple, but its non-reversible so the
- // simplicity doesnt really matter). This algorithm
- // will not work if the user has only one level of domain
- // naming in their hostname (e.g. if they are on a lan or
- // are connecting via localhost) -- this doesnt matter much.
- if (strchr(dest->host,'.'))
- {
- // in inspircd users have two hostnames. A displayed
- // hostname which can be modified by modules (e.g.
- // to create vhosts, implement chghost, etc) and a
- // 'real' hostname which you shouldnt write to.
- std::string a = strstr(dest->host,".");
- char ra[64];
- this->GenHash(dest->host,ra);
- std::string b = "";
- in_addr testaddr;
- std::string hostcloak = prefix + "-" + std::string(ra) + a;
- /* Fix by brain - if the cloaked host is > the max length of a host (64 bytes
- * according to the DNS RFC) then tough titty, they get cloaked as an IP.
- * Their ISP shouldnt go to town on subdomains, or they shouldnt have a kiddie
- * vhost.
- */
- if ((!inet_aton(dest->host,&testaddr)) && (hostcloak.length() < 64))
- {
- // if they have a hostname, make something appropriate
- b = hostcloak;
- }
- else
- {
- // else, they have an ip
- b = std::string(ra) + "." + prefix + ".cloak";
- }
- Srv->Log(DEBUG,"cloak: allocated "+b);
- Srv->ChangeHost(dest,b);
- }
- }
- else
- {
- // user is removing the mode, so just restore their real host
- // and make it match the displayed one.
- Srv->ChangeHost(dest,dest->host);
- }
- // this mode IS ours, and we have handled it. If we chose not to handle it,
- // for example the user cannot cloak as they have a vhost or such, then
- // we could return 0 here instead of 1 and the core would not send the mode
- // change to the user.
- return 1;
- }
- else
- {
- // this mode isn't ours, we have to bail and return 0 to not handle it.
- return 0;
- }