X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmodules%2Fm_cgiirc.cpp;h=a9abb4b15d69a7a0885a48c7cab2806dbfa4875c;hb=d185decae97752368d5cf62311cbc0d1a52aa22c;hp=7860b8a6e99dd0612c3e9f4bffc3ae452a0932b0;hpb=efac11ae7a0458e195a8f5b61229ed3214b64f86;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_cgiirc.cpp b/src/modules/m_cgiirc.cpp index 7860b8a6e..a9abb4b15 100644 --- a/src/modules/m_cgiirc.cpp +++ b/src/modules/m_cgiirc.cpp @@ -61,11 +61,11 @@ class CommandWebirc : public Command this->source = "m_cgiirc.so"; this->syntax = "password client hostname ip"; } - CmdResult Handle(const char* const* parameters, int pcnt, User *user) + CmdResult Handle(const std::vector ¶meters, User *user) { if(user->registered == REG_ALL) return CMD_FAILURE; - + for(CGIHostlist::iterator iter = Hosts.begin(); iter != Hosts.end(); iter++) { if(ServerInstance->MatchText(user->host, iter->hostmask) || ServerInstance->MatchText(user->GetIPString(), iter->hostmask)) @@ -75,7 +75,7 @@ class CommandWebirc : public Command user->Extend("cgiirc_realhost", new std::string(user->host)); user->Extend("cgiirc_realip", new std::string(user->GetIPString())); if (notify) - ServerInstance->SNO->WriteToSnoMask('A', "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; @@ -108,12 +108,13 @@ class CGIResolver : public Resolver if ((them) && (them == ServerInstance->SE->GetRef(theirfd))) { if (notify) - ServerInstance->SNO->WriteToSnoMask('A', "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(); } } @@ -122,7 +123,7 @@ class CGIResolver : public Resolver if ((them) && (them == 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, 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()); } } @@ -139,7 +140,7 @@ class ModuleCgiIRC : public Module public: ModuleCgiIRC(InspIRCd* Me) : Module(Me) { - + OnRehash(NULL,""); mycommand = new CommandWebirc(Me, Hosts, NotifyOpers); ServerInstance->AddCommand(mycommand); @@ -148,7 +149,7 @@ public: ServerInstance->Modules->Attach(eventlist, this, 7); } - + virtual void Prioritize() { ServerInstance->Modules->SetPriority(this, I_OnUserConnect, PRIO_FIRST); @@ -158,18 +159,18 @@ public: { 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. - + if(Conf.GetError() == CONF_VALUE_NOT_FOUND) NotifyOpers = true; - + for(int i = 0; i < Conf.Enumerate("cgihost"); i++) { std::string hostmask = Conf.ReadValue("cgihost", "mask", i); // An allowed CGI:IRC host std::string type = Conf.ReadValue("cgihost", "type", i); // What type of user-munging we do on this host. std::string password = Conf.ReadValue("cgihost", "password", i); - + if(hostmask.length()) { if (type == "webirc" && !password.length()) { @@ -210,13 +211,13 @@ public: User* user = (User*)item; std::string* realhost; std::string* realip; - + if(user->GetExt("cgiirc_realhost", realhost)) { delete realhost; user->Shrink("cgiirc_realhost"); } - + if(user->GetExt("cgiirc_realip", realip)) { delete realip; @@ -224,13 +225,13 @@ public: } } } - + virtual void OnSyncUserMetaData(User* user, Module* proto, void* opaque, const std::string &extname, bool displayable) { if((extname == "cgiirc_realhost") || (extname == "cgiirc_realip")) { std::string* data; - + if(user->GetExt(extname, data)) { proto->ProtoSendMetaData(opaque, TYPE_USER, user, extname, *data); @@ -255,32 +256,36 @@ public: { OnCleanup(TYPE_USER, user); } - + virtual int OnUserRegister(User* user) - { + { for(CGIHostlist::iterator iter = Hosts.begin(); iter != Hosts.end(); iter++) - { + { if(ServerInstance->MatchText(user->host, iter->hostmask) || ServerInstance->MatchText(user->GetIPString(), iter->hostmask)) { // Deal with it... 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) { @@ -297,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"); @@ -308,7 +313,7 @@ public: bool valid=false; ServerInstance->Users->RemoveCloneCounts(user); #ifdef IPV6 - valid = (inet_pton(AF_INET6, webirc_ip->c_str(), &((sockaddr_in6*)user->ip)->sin6_addr) > 0); + valid = (inet_pton(AF_INET6, webirc_ip->c_str(), &((sockaddr_in6*)user->ip)->sin6_addr) > 0); if(!valid) valid = (inet_aton(webirc_ip->c_str(), &((sockaddr_in*)user->ip)->sin_addr)); @@ -323,6 +328,7 @@ public: ServerInstance->Users->AddLocalClone(user); ServerInstance->Users->AddGlobalClone(user); user->CheckClass(); + user->CheckLines(); } } @@ -332,19 +338,19 @@ 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; 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); + valid = (inet_pton(AF_INET6, user->password.c_str(), &((sockaddr_in6*)user->ip)->sin6_addr) > 0); else - valid = (inet_aton(user->password, &((sockaddr_in*)user->ip)->sin_addr)); + valid = (inet_aton(user->password.c_str(), &((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->Users->AddLocalClone(user); @@ -355,7 +361,7 @@ public: { /* 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->WriteToSnoMask('A', "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 { @@ -370,41 +376,37 @@ public: 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, 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->SNO->WriteToSnoMask('A', "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; } - + return false; } - + 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; - + for(int i = 0; i < 4; i++) if(!HexToInt(ip[i], ident + i*2)) return false; snprintf(newip, 16, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); - + user->Extend("cgiirc_realhost", new std::string(user->host)); user->Extend("cgiirc_realip", new std::string(user->GetIPString())); ServerInstance->Users->RemoveCloneCounts(user); @@ -419,9 +421,9 @@ public: 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); @@ -429,26 +431,23 @@ 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->SNO->WriteToSnoMask('A', "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; } - + bool IsValidHost(const std::string &host) { if(!host.size()) return false; - + for(unsigned int i = 0; i < host.size(); i++) { if( ((host[i] >= '0') && (host[i] <= '9')) || @@ -456,12 +455,12 @@ public: ((host[i] >= 'a') && (host[i] <= 'z')) || ((host[i] == '-') && (i > 0) && (i+1 < host.size()) && (host[i-1] != '.') && (host[i+1] != '.')) || ((host[i] == '.') && (i > 0) && (i+1 < host.size())) ) - + continue; else return false; } - + return true; } @@ -469,10 +468,10 @@ public: { if(ip.size() < 7 || ip.size() > 15) return false; - + short sincedot = 0; short dots = 0; - + for(unsigned int i = 0; i < ip.size(); i++) { if((dots <= 3) && (sincedot <= 3)) @@ -490,16 +489,16 @@ public: else { return false; - + } } - + if(dots != 3) return false; - + return true; } - + bool HexToInt(int &out, const char* in) { char ip[3]; @@ -507,22 +506,22 @@ public: ip[1] = in[1]; ip[2] = 0; out = strtol(ip, NULL, 16); - + if(out > 255 || out < 0) return false; return true; } - + virtual ~ModuleCgiIRC() { } - + virtual Version GetVersion() { return Version(1,2,0,0,VF_VENDOR,API_VERSION); } - + }; MODULE_INIT(ModuleCgiIRC)