X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_cgiirc.cpp;h=6c99d9d3500c262611b609a63a753306c81fe433;hb=87dd84a97265843cfe19f20c207c1c72f38a4f2d;hp=b30b9316b45d2875a5795fa68bc40d703c5e6e9e;hpb=b57c7f4e466f72fdd2ac3deca42caa1ea7748338;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_cgiirc.cpp b/src/modules/m_cgiirc.cpp index b30b9316b..6c99d9d35 100644 --- a/src/modules/m_cgiirc.cpp +++ b/src/modules/m_cgiirc.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * InspIRCd: (C) 2002-2008 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see @@ -33,25 +33,35 @@ public: CGItype type; std::string password; - CGIhost(const std::string &mask = "", CGItype t = IDENTFIRST, const std::string &password ="") - : hostmask(mask), type(t), password(password) + CGIhost(const std::string &mask = "", CGItype t = IDENTFIRST, const std::string &spassword ="") + : hostmask(mask), type(t), password(spassword) { } }; typedef std::vector CGIHostlist; -class cmd_webirc : public Command +/* + * WEBIRC + * This is used for the webirc method of CGIIRC auth, and is (really) the best way to do these things. + * Syntax: WEBIRC password client hostname ip + * Where password is a shared key, client is the name of the "client" and version (e.g. cgiirc), hostname + * is the resolved host of the client issuing the command and IP is the real IP of the client. + * + * How it works: + * To tie in with the rest of cgiirc module, and to avoid race conditions, /webirc is only processed locally + * and simply sets metadata on the user, which is later decoded on full connect to give something meaningful. + */ +class CommandWebirc : public Command { - InspIRCd* Me; CGIHostlist Hosts; bool notify; public: - cmd_webirc(InspIRCd* Me, CGIHostlist &Hosts, bool notify) : Command(Me, "WEBIRC", 0, 4, true), Hosts(Hosts), notify(notify) + CommandWebirc(InspIRCd* Instance, CGIHostlist &cHosts, bool bnotify) : Command(Instance, "WEBIRC", 0, 4, true), Hosts(cHosts), notify(bnotify) { this->source = "m_cgiirc.so"; this->syntax = "password client hostname ip"; } - CmdResult Handle(const char** parameters, int pcnt, User *user) + CmdResult Handle(const std::vector ¶meters, User *user) { if(user->registered == REG_ALL) return CMD_FAILURE; @@ -65,7 +75,7 @@ class cmd_webirc : public Command user->Extend("cgiirc_realhost", new std::string(user->host)); user->Extend("cgiirc_realip", new std::string(user->GetIPString())); if (notify) - ServerInstance->WriteOpers("*** Connecting user %s detected as using CGI:IRC (%s), changing real host to %s from %s", user->nick, user->host, parameters[2], user->host); + ServerInstance->SNO->WriteToSnoMask('A', "Connecting user %s detected as using CGI:IRC (%s), changing real host to %s from %s", user->nick.c_str(), user->host.c_str(), parameters[2].c_str(), user->host.c_str()); user->Extend("cgiirc_webirc_hostname", new std::string(parameters[2])); user->Extend("cgiirc_webirc_ip", new std::string(parameters[3])); return CMD_LOCALONLY; @@ -86,8 +96,8 @@ class CGIResolver : public Resolver User* them; bool notify; public: - CGIResolver(Module* me, InspIRCd* ServerInstance, bool NotifyOpers, const std::string &source, bool forward, User* 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) { } + CGIResolver(Module* me, InspIRCd* Instance, bool NotifyOpers, const std::string &source, bool forward, User* u, int userfd, const std::string &type, bool &cached) + : Resolver(Instance, 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, int resultnum = 0) { @@ -98,12 +108,13 @@ class CGIResolver : public Resolver if ((them) && (them == ServerInstance->SE->GetRef(theirfd))) { if (notify) - ServerInstance->WriteOpers("*** Connecting user %s detected as using CGI:IRC (%s), changing real host to %s from %s", them->nick, them->host, result.c_str(), typ.c_str()); + ServerInstance->SNO->WriteToSnoMask('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()); - strlcpy(them->host, result.c_str(), 63); - strlcpy(them->dhost, result.c_str(), 63); - strlcpy(them->ident, "~cgiirc", 8); + them->host.assign(result,0, 64); + them->dhost.assign(result, 0, 64); + them->ident.assign("~cgiirc", 0, 8); them->InvalidateCache(); + them->CheckLines(); } } @@ -112,7 +123,7 @@ class CGIResolver : public Resolver if ((them) && (them == ServerInstance->SE->GetRef(theirfd))) { if (notify) - ServerInstance->WriteOpers("*** Connecting user %s detected as using CGI:IRC (%s), but their host can't be resolved from their %s!", them->nick, them->host,typ.c_str()); + 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()); } } @@ -123,7 +134,7 @@ class CGIResolver : public Resolver class ModuleCgiIRC : public Module { - cmd_webirc* mycommand; + CommandWebirc* mycommand; bool NotifyOpers; CGIHostlist Hosts; public: @@ -131,24 +142,23 @@ public: { OnRehash(NULL,""); - mycommand=new cmd_webirc(Me, Hosts, NotifyOpers); + mycommand = new CommandWebirc(Me, Hosts, NotifyOpers); ServerInstance->AddCommand(mycommand); - } - void Implements(char* List) - { - List[I_OnRehash] = List[I_OnUserRegister] = List[I_OnCleanup] = List[I_OnSyncUserMetaData] = List[I_OnDecodeMetaData] = List[I_OnUserQuit] = List[I_OnUserConnect] = 1; + Implementation eventlist[] = { I_OnRehash, I_OnUserRegister, I_OnCleanup, I_OnSyncUserMetaData, I_OnDecodeMetaData, I_OnUserDisconnect, I_OnUserConnect }; + ServerInstance->Modules->Attach(eventlist, this, 7); } + - virtual Priority Prioritize() + virtual void Prioritize() { - // We want to get here before m_cloaking and m_hostchange etc - return PRIORITY_FIRST; + ServerInstance->Modules->SetPriority(this, I_OnUserConnect, PRIO_FIRST); } virtual void OnRehash(User* user, const std::string ¶meter) { ConfigReader Conf(ServerInstance); + Hosts.clear(); NotifyOpers = Conf.ReadFlag("cgiirc", "opernotice", 0); // If we send an oper notice when a CGI:IRC has their host changed. @@ -164,7 +174,7 @@ public: if(hostmask.length()) { if (type == "webirc" && !password.length()) { - ServerInstance->Log(DEFAULT, "m_cgiirc: Missing password in config: %s", hostmask.c_str()); + ServerInstance->Logs->Log("CONFIG",DEFAULT, "m_cgiirc: Missing password in config: %s", hostmask.c_str()); } else { @@ -188,7 +198,7 @@ public: } else { - ServerInstance->Log(DEFAULT, "m_cgiirc.so: Invalid value in config: %s", hostmask.c_str()); + ServerInstance->Logs->Log("CONFIG",DEFAULT, "m_cgiirc.so: Invalid value in config: %s", hostmask.c_str()); continue; } } @@ -242,7 +252,7 @@ public: } } - virtual void OnUserQuit(User* user, const std::string &message, const std::string &oper_message) + virtual void OnUserDisconnect(User* user) { OnCleanup(TYPE_USER, user); } @@ -258,20 +268,24 @@ public: if(iter->type == PASS) { CheckPass(user); // We do nothing if it fails so... + user->CheckLines(); } else if(iter->type == PASSFIRST && !CheckPass(user)) { // If the password lookup failed, try the ident CheckIdent(user); // If this fails too, do nothing + user->CheckLines(); } else if(iter->type == IDENT) { CheckIdent(user); // Nothing on failure. + user->CheckLines(); } else if(iter->type == IDENTFIRST && !CheckIdent(user)) { // If the ident lookup fails, try the password. CheckPass(user); + user->CheckLines(); } else if(iter->type == WEBIRC) { @@ -288,8 +302,8 @@ public: std::string *webirc_hostname, *webirc_ip; if(user->GetExt("cgiirc_webirc_hostname", webirc_hostname)) { - strlcpy(user->host,webirc_hostname->c_str(),63); - strlcpy(user->dhost,webirc_hostname->c_str(),63); + user->host.assign(*webirc_hostname, 0, 64); + user->dhost.assign(*webirc_hostname, 0, 64); delete webirc_hostname; user->InvalidateCache(); user->Shrink("cgiirc_webirc_hostname"); @@ -297,7 +311,7 @@ public: if(user->GetExt("cgiirc_webirc_ip", webirc_ip)) { bool valid=false; - user->RemoveCloneCounts(); + ServerInstance->Users->RemoveCloneCounts(user); #ifdef IPV6 valid = (inet_pton(AF_INET6, webirc_ip->c_str(), &((sockaddr_in6*)user->ip)->sin6_addr) > 0); @@ -311,9 +325,10 @@ public: delete webirc_ip; user->InvalidateCache(); user->Shrink("cgiirc_webirc_ip"); - ServerInstance->AddLocalClone(user); - ServerInstance->AddGlobalClone(user); + ServerInstance->Users->AddLocalClone(user); + ServerInstance->Users->AddGlobalClone(user); user->CheckClass(); + user->CheckLines(); } } @@ -323,30 +338,30 @@ public: { user->Extend("cgiirc_realhost", new std::string(user->host)); user->Extend("cgiirc_realip", new std::string(user->GetIPString())); - strlcpy(user->host, user->password, 64); - strlcpy(user->dhost, user->password, 64); + user->host.assign(user->password, 0, 64); + user->dhost.assign(user->password, 0, 64); user->InvalidateCache(); bool valid = false; - user->RemoveCloneCounts(); + ServerInstance->Users->RemoveCloneCounts(user); #ifdef IPV6 if (user->GetProtocolFamily() == AF_INET6) valid = (inet_pton(AF_INET6, user->password, &((sockaddr_in6*)user->ip)->sin6_addr) > 0); else valid = (inet_aton(user->password, &((sockaddr_in*)user->ip)->sin_addr)); #else - if (inet_aton(user->password, &((sockaddr_in*)user->ip)->sin_addr)) + if (inet_aton(user->password.c_str(), &((sockaddr_in*)user->ip)->sin_addr)) valid = true; #endif - ServerInstance->AddLocalClone(user); - ServerInstance->AddGlobalClone(user); + ServerInstance->Users->AddLocalClone(user); + ServerInstance->Users->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. */ if(NotifyOpers) - ServerInstance->WriteOpers("*** Connecting user %s detected as using CGI:IRC (%s), changing real host to %s from PASS", user->nick, user->host, user->password); + ServerInstance->SNO->WriteToSnoMask('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()); } else { @@ -361,15 +376,11 @@ public: catch (...) { if (NotifyOpers) - ServerInstance->WriteOpers("*** Connecting user %s detected as using CGI:IRC (%s), but i could not resolve their hostname!", user->nick, user->host); + 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 = 0; - - /*if(NotifyOpers) - ServerInstance->WriteOpers("*** Connecting user %s detected as using CGI:IRC (%s), changing real host to %s from PASS", user->nick, user->host, user->password);*/ - + user->password.clear(); return true; } @@ -379,14 +390,14 @@ public: bool CheckIdent(User* user) { int ip[4]; - char* ident; + const char* ident; char newip[16]; - int len = strlen(user->ident); + int len = user->ident.length(); if(len == 8) - ident = user->ident; - else if(len == 9 && *user->ident == '~') - ident = user->ident+1; + ident = user->ident.c_str(); + else if(len == 9 && user->ident[0] == '~') + ident = user->ident.c_str() + 1; else return false; @@ -398,21 +409,21 @@ public: user->Extend("cgiirc_realhost", new std::string(user->host)); user->Extend("cgiirc_realip", new std::string(user->GetIPString())); - user->RemoveCloneCounts(); + ServerInstance->Users->RemoveCloneCounts(user); #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); + ServerInstance->Users->AddLocalClone(user); + ServerInstance->Users->AddGlobalClone(user); user->CheckClass(); try { - strlcpy(user->host, newip, 16); - strlcpy(user->dhost, newip, 16); - strlcpy(user->ident, "~cgiirc", 8); + user->host.assign(newip, 0, 16); + user->dhost.assign(newip, 0, 16); + user->ident.assign("~cgiirc", 0, 8); bool cached; CGIResolver* r = new CGIResolver(this, ServerInstance, NotifyOpers, newip, false, user, user->GetFd(), "IDENT", cached); @@ -420,17 +431,14 @@ public: } catch (...) { - strlcpy(user->host, newip, 16); - strlcpy(user->dhost, newip, 16); - strlcpy(user->ident, "~cgiirc", 8); + user->host.assign(newip, 0, 16); + user->dhost.assign(newip, 0, 16); + user->ident.assign("~cgiirc", 0, 8); user->InvalidateCache(); if(NotifyOpers) - ServerInstance->WriteOpers("*** Connecting user %s detected as using CGI:IRC (%s), but i could not resolve their hostname!", user->nick, user->host); + 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()); } - /*strlcpy(user->host, newip, 16); - strlcpy(user->dhost, newip, 16); - strlcpy(user->ident, "~cgiirc", 8);*/ return true; } @@ -511,7 +519,7 @@ public: virtual Version GetVersion() { - return Version(1,1,0,0,VF_VENDOR,API_VERSION); + return Version(1,2,0,0,VF_VENDOR,API_VERSION); } };