/* Makes a simple ban and kicks the target * @param requester The user requesting the kickban * @param ci The channel * @param u The user being kicked * @param reason The reason */ void bot_raw_ban(User *requester, ChannelInfo *ci, User *u, const Anope::string &reason) { if (!u || !ci) return; if (ModeManager::FindUserModeByName(UMODE_PROTECTED) && u->IsProtected() && requester != u) { ircdproto->SendPrivmsg(ci->bi, ci->name, "%s", translate(requester, ACCESS_DENIED)); return; } AccessGroup u_access = ci->AccessFor(u), req_access = ci->AccessFor(requester); if (ci->HasFlag(CI_PEACE) && u != requester && u_access >= req_access) return; if (matches_list(ci->c, u, CMODE_EXCEPT)) { ircdproto->SendPrivmsg(ci->bi, ci->name, "%s", translate(requester, _("User matches channel except."))); return; } Anope::string mask; get_idealban(ci, u, mask); ci->c->SetMode(NULL, CMODE_BAN, mask); /* Check if we need to do a signkick or not -GD */ if (ci->HasFlag(CI_SIGNKICK) || (ci->HasFlag(CI_SIGNKICK_LEVEL) && !req_access.HasPriv("SIGNKICK"))) ci->c->Kick(ci->bi, u, "%s (%s)", !reason.empty() ? reason.c_str() : ci->bi->nick.c_str(), requester->nick.c_str()); else ci->c->Kick(ci->bi, u, "%s", !reason.empty() ? reason.c_str() : ci->bi->nick.c_str()); }
void DoDel(CommandSource &source, NickServ::Account *nc, Anope::string certfp) { std::vector<NSCertEntry *> cl = nc->GetRefs<NSCertEntry *>(certentry); if (certfp.empty()) { User *u = source.GetUser(); if (u) certfp = u->fingerprint; } if (certfp.empty()) { this->OnSyntaxError(source, "DEL"); return; } NSCertEntry *cert = FindCert(cl, certfp); if (!cert) { source.Reply(_("\002{0}\002 not found on the certificate list of \002{1}\002."), certfp, nc->GetDisplay()); return; } cert->Delete(); Log(nc == source.GetAccount() ? LOG_COMMAND : LOG_ADMIN, source, this) << "to DELETE certificate fingerprint " << certfp << " from " << nc->GetDisplay(); source.Reply(_("\002{0}\002 deleted from the access list of \002{1}\002."), certfp, nc->GetDisplay()); }
void SendChannel(Channel *c) { Anope::string modes = c->GetModes(true, true); if (modes.empty()) modes = "+"; UplinkSocket::Message() << "SJOIN " << c->creation_time << " " << c->name << " " << modes << " :"; }
EventReturn OnEncrypt(const Anope::string &src, Anope::string &dest) override { if (!md5) return EVENT_CONTINUE; Encryption::Context *context = md5->CreateContext(); context->Update(reinterpret_cast<const unsigned char *>(src.c_str()), src.length()); context->Finalize(); Encryption::Hash hash = context->GetFinalizedHash(); char digest[32], digest2[16]; memset(digest, 0, sizeof(digest)); if (hash.second > sizeof(digest)) throw CoreException("Hash too large"); memcpy(digest, hash.first, hash.second); for (int i = 0; i < 32; i += 2) digest2[i / 2] = XTOI(digest[i]) << 4 | XTOI(digest[i + 1]); Anope::string buf = "oldmd5:" + Anope::Hex(digest2, sizeof(digest2)); Log(LOG_DEBUG_2) << "(enc_old) hashed password from [" << src << "] to [" << buf << "]"; dest = buf; delete context; return EVENT_ALLOW; }
Anope::string GetAttribute(const Anope::string &command) { size_t sp = command.rfind(' '); if (sp != Anope::string::npos) return command.substr(sp + 1); return command; }
ModuleReturn ModuleManager::DeleteModule(Module *m) { if (!m || !m->handle) return MOD_ERR_PARAMS; void *handle = m->handle; Anope::string filename = m->filename; Log(LOG_DEBUG) << "Unloading module " << m->name; dlerror(); void (*destroy_func)(Module *m) = function_cast<void (*)(Module *)>(dlsym(m->handle, "AnopeFini")); const char *err = dlerror(); if (!destroy_func || (err && *err)) { Log() << "No destroy function found for " << m->name << ", chancing delete..."; delete m; /* we just have to chance they haven't overwrote the delete operator then... */ } else destroy_func(m); /* Let the module delete it self, just in case */ if (dlclose(handle)) Log() << dlerror(); if (!filename.empty()) unlink(filename.c_str()); return MOD_ERR_OK; }
/* * RFC 2813, 4.2.2: Njoin Message: * The NJOIN message is used between servers only. * It is used when two servers connect to each other to exchange * the list of channel members for each channel. * * Even though the same function can be performed by using a succession * of JOIN, this message SHOULD be used instead as it is more efficient. * * Received: :dev.anope.de NJOIN #test :DukeP2,@DukeP,%test,+test2 */ void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) override { std::list<Message::Join::SJoinUser> users; commasepstream sep(params[1]); Anope::string buf; while (sep.GetToken(buf)) { Message::Join::SJoinUser sju; /* Get prefixes from the nick */ for (char ch; (ch = ModeManager::GetStatusChar(buf[0]));) { buf.erase(buf.begin()); sju.first.AddMode(ch); } sju.second = User::Find(buf); if (!sju.second) { Log(LOG_DEBUG) << "NJOIN for non-existent user " << buf << " on " << params[0]; continue; } users.push_back(sju); } Message::Join::SJoin(source, params[0], 0, "", users); }
void DoDelete(CommandSource &source, ChanServ::Channel *ci, const Anope::string &word) { if (!badwords->GetBadWordCount(ci)) { source.Reply(_("Bad word list for \002{0}\002 is empty."), ci->GetName()); return; } bool override = !source.AccessFor(ci).HasPriv("BADWORDS"); /* Special case: is it a number/list? Only do search if it isn't. */ if (!word.empty() && isdigit(word[0]) && word.find_first_not_of("1234567890,-") == Anope::string::npos) { unsigned int deleted = 0; NumberList(word, true, [&](unsigned int num) { if (!num || num > badwords->GetBadWordCount(ci)) return; Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "DEL " << badwords->GetBadWord(ci, num - 1)->GetWord(); ++deleted; badwords->EraseBadWord(ci, num - 1); },
void ModuleManager::CleanupRuntimeDirectory() { Anope::string dirbuf = services_dir + "/modules/runtime"; Log(LOG_DEBUG) << "Cleaning out Module run time directory (" << dirbuf << ") - this may take a moment please wait"; DIR *dirp = opendir(dirbuf.c_str()); if (!dirp) { Log(LOG_DEBUG) << "Cannot open directory (" << dirbuf << ")"; return; } for (dirent *dp; (dp = readdir(dirp));) { if (!dp->d_ino) continue; if (Anope::string(dp->d_name).equals_cs(".") || Anope::string(dp->d_name).equals_cs("..")) continue; Anope::string filebuf = dirbuf + "/" + dp->d_name; unlink(filebuf.c_str()); } closedir(dirp); }
bool Check(User *u, XLine *x) override { if (x->regex) { Anope::string uh = u->GetIdent() + "@" + u->host, nuhr = u->nick + "!" + uh + "#" + u->realname; return std::regex_match(uh.str(), *x->regex) || std::regex_match(nuhr.str(), *x->regex); } if (!x->GetNick().empty() && !Anope::Match(u->nick, x->GetNick())) return false; if (!x->GetUser().empty() && !Anope::Match(u->GetIdent(), x->GetUser())) return false; if (!x->GetReal().empty() && !Anope::Match(u->realname, x->GetReal())) return false; if (x->c && x->c->match(u->ip)) return true; if (x->GetHost().empty() || Anope::Match(u->host, x->GetHost()) || Anope::Match(u->ip.addr(), x->GetHost())) return true; return false; }
void IRCDProto::Parse(const Anope::string &buffer, Anope::string &source, Anope::string &command, std::vector<Anope::string> ¶ms) { spacesepstream sep(buffer); if (buffer[0] == ':') { sep.GetToken(source); source.erase(0, 1); } sep.GetToken(command); for (Anope::string token; sep.GetToken(token);) { if (token[0] == ':') { if (!sep.StreamEnd()) params.push_back(token.substr(1) + " " + sep.GetRemaining()); else params.push_back(token.substr(1)); break; } else params.push_back(token); } }
void bahamut::senders::MessageChannel::Send(Channel* c) { Anope::string modes = c->GetModes(true, true); if (modes.empty()) modes = "+"; Uplink::Send("SJOIN", c->creation_time, c->name, modes, ""); }
void Language::InitLanguages() { #if GETTEXT_FOUND Log(LOG_DEBUG) << "Initializing Languages..."; Languages.clear(); if (!bindtextdomain("anope", Anope::LocaleDir.c_str())) Log() << "Error calling bindtextdomain, " << Anope::LastError(); else Log(LOG_DEBUG) << "Successfully bound anope to " << Anope::LocaleDir; setlocale(LC_ALL, ""); spacesepstream sep(Config->GetBlock("options")->Get<Anope::string>("languages")); Anope::string language; while (sep.GetToken(language)) { const Anope::string &lang_name = Translate(language.c_str(), _("English")); if (lang_name == "English") { Log() << "Unable to use language " << language; continue; } Log(LOG_DEBUG) << "Found language " << language; Languages.push_back(language); } #else Log() << "Unable to initialize languages, gettext is not installed"; #endif }
cidr::cidr(const Anope::string &ip) { bool ipv6 = ip.find(':') != Anope::string::npos; size_t sl = ip.find_last_of('/'); if (sl == Anope::string::npos) { this->cidr_ip = ip; this->cidr_len = ipv6 ? 128 : 32; this->addr.pton(ipv6 ? AF_INET6 : AF_INET, ip); } else { Anope::string real_ip = ip.substr(0, sl); Anope::string cidr_range = ip.substr(sl + 1); this->cidr_ip = real_ip; this->cidr_len = ipv6 ? 128 : 32; try { if (cidr_range.is_pos_number_only()) this->cidr_len = convertTo<unsigned int>(cidr_range); } catch (const ConvertException &) { } this->addr.pton(ipv6 ? AF_INET6 : AF_INET, real_ip); } }
void sockaddrs::pton(int type, const Anope::string &address, int pport) { this->clear(); switch (type) { case AF_INET: { int i = inet_pton(type, address.c_str(), &sa4.sin_addr); if (i <= 0) this->clear(); else { sa4.sin_family = type; sa4.sin_port = htons(pport); } break; } case AF_INET6: { int i = inet_pton(type, address.c_str(), &sa6.sin6_addr); if (i <= 0) this->clear(); else { sa6.sin6_family = type; sa6.sin6_port = htons(pport); } break; } default: break; } }
ServiceBot::ServiceBot(const Anope::string &nnick, const Anope::string &nuser, const Anope::string &nhost, const Anope::string &nreal, const Anope::string &bmodes) : LocalUser(nnick, nuser, nhost, "", "", Me, nreal, Anope::CurTime, "", IRCD ? IRCD->UID_Retrieve() : "", NULL), botmodes(bmodes) { this->type = UserType::BOT; this->lastmsg = Anope::CurTime; this->introduced = false; bi = botinfo.Create(); bi->bot = this; bi->SetNick(nnick); bi->SetUser(nuser); bi->SetHost(nhost); bi->SetRealName(nreal); bi->SetCreated(Anope::CurTime); Event::OnCreateBot(&Event::CreateBot::OnCreateBot, this); // If we're synchronised with the uplink already, send the bot. if (Me && Me->IsSynced()) { Anope::string tmodes = !this->botmodes.empty() ? ("+" + this->botmodes) : IRCD->DefaultPseudoclientModes; if (!tmodes.empty()) this->SetModesInternal(this, tmodes.c_str()); //XXX //XLine x(this->nick, "Reserved for services"); //IRCD->SendSQLine(NULL, &x); IRCD->SendClientIntroduction(this); this->introduced = true; } }
void DoCheckAuthentication(XMLRPCServiceInterface *iface, XMLRPCClientSocket *source, XMLRPCRequest *request) { Anope::string username = request->data.size() > 0 ? request->data[0] : ""; Anope::string password = request->data.size() > 1 ? request->data[1] : ""; if (username.empty() || password.empty()) request->reply("error", "Invalid parameters"); else { NickAlias *na = findnick(username); if (!na) request->reply("error", "Invalid account"); else { EventReturn MOD_RESULT; FOREACH_RESULT(I_OnCheckAuthentication, OnCheckAuthentication(NULL, NULL, std::vector<Anope::string>(), na->nc->display, password)); if (MOD_RESULT == EVENT_ALLOW) { request->reply("result", "Success"); request->reply("account", na->nc->display); } else request->reply("error", "Invalid password"); } } }
// :42X UID Adam 1 1348535644 +aow Adam 192.168.0.5 192.168.0.5 42XAAAAAB 0 192.168.0.5 :Adam void plexus::UID::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) { /* An IP of 0 means the user is spoofed */ Anope::string ip = params[6]; if (ip == "0") ip.clear(); time_t ts; try { ts = convertTo<time_t>(params[2]); } catch (const ConvertException &) { ts = Anope::CurTime; } NickServ::Nick *na = NULL; try { if (params[8].is_pos_number_only() && convertTo<time_t>(params[8]) == ts) na = NickServ::FindNick(params[0]); } catch (const ConvertException &) { } if (params[8] != "0" && !na) na = NickServ::FindNick(params[8]); User::OnIntroduce(params[0], params[4], params[9], params[5], ip, source.GetServer(), params[10], ts, params[3], params[7], na ? na->GetAccount() : NULL); }
void plexus::senders::SVSLogin::Send(const Anope::string& uid, const Anope::string& acc, const Anope::string& vident, const Anope::string& vhost) { Anope::string sid = uid.substr(0, 3); Server *s = Server::Find(sid); Uplink::Send(Me, "ENCAP", s ? s->GetName() : sid, "SVSLOGIN", uid, "*", vident.empty() ? "*" : vident, vhost.empty() ? "*" : vhost, acc); }
void OnChanRegistered(ChanServ::Channel *ci) override { /* Set default bot flags */ spacesepstream sep(Config->GetModule(this)->Get<Anope::string>("defaults", "greet fantasy")); for (Anope::string token; sep.GetToken(token);) ci->SetS<bool>("BS_" + token.upper(), true); }
void User::Identify(NickServ::Nick *na) { if (this->nick.equals_ci(na->GetNick())) { na->SetLastUsermask(this->GetIdent() + "@" + this->GetDisplayedHost()); na->SetLastRealhost(this->GetIdent() + "@" + this->host); na->SetLastRealname(this->realname); na->SetLastSeen(Anope::CurTime); } IRCD->SendLogin(this, na); this->Login(na->GetAccount()); EventManager::Get()->Dispatch(&Event::NickIdentify::OnNickIdentify, this); if (this->IsServicesOper()) { Anope::string m = this->nc->o->GetType()->modes; if (!m.empty()) { this->SetModes(NULL, "%s", m.c_str()); this->SendMessage(Me, "Changing your usermodes to \002{0}\002", m.c_str()); UserMode *um = ModeManager::FindUserModeByName("OPER"); if (um && !this->HasMode("OPER") && m.find(um->mchar) != Anope::string::npos) IRCD->SendOper(this); } if (IRCD->CanSetVHost && !this->nc->o->GetVhost().empty()) { this->SendMessage(Me, "Changing your vhost to \002{0}\002", this->nc->o->GetVhost()); this->SetDisplayedHost(this->nc->o->GetVhost()); IRCD->SendVhost(this, "", this->nc->o->GetVhost()); } } }
Anope::string Sanitize(const Anope::string &string) override { Anope::string ret = string; for (int i = 0; special[i].character.empty() == false; ++i) ret = ret.replace_all_cs(special[i].character, special[i].replace); return ret; }
bool ChannelModeKey::IsValid(Anope::string &value) const { if (!value.empty() && value.find(':') == Anope::string::npos && value.find(',') == Anope::string::npos) return true; return false; }
void DoDel(CommandSource &source, const std::vector<Anope::string> ¶ms) { const Anope::string nick = params.size() > 1 ? params[1] : ""; if (nick.empty()) { this->OnSyntaxError(source, "DEL"); return; } Anope::string mask = RealMask(nick); if (mask.empty()) { source.Reply(_("Mask must be in the form \037user\037@\037host\037.")); return; } Ignore *ign = ignore_service->Find(mask); if (!ign) { source.Reply(_("\002{0}\002 not found on ignore list."), mask); return; } if (Anope::ReadOnly) source.Reply(_("Services are in read-only mode. Any changes made may not persist.")); Log(LOG_ADMIN, source, this) << "to remove an ignore on " << mask; source.Reply(_("\002{0}\002 will no longer be ignored."), mask); ign->Delete(); }
Anope::string RealMask(const Anope::string &mask) { /* If it s an existing user, we ignore the hostmask. */ User *u = User::Find(mask, true); if (u) return "*!*@" + u->host; size_t host = mask.find('@'); /* Determine whether we get a nick or a mask. */ if (host != Anope::string::npos) { size_t user = mask.find('!'); /* Check whether we have a nick too.. */ if (user != Anope::string::npos) { if (user > host) /* this should never happen */ return ""; else return mask; } else /* We have user@host. Add nick wildcard. */ return "*!" + mask; } /* We only got a nick.. */ return mask + "!*@*"; }
void DoDel(CommandSource &source, ChannelInfo *ci, const Anope::string &message) { EntryMessageList *messages = ci->GetExt<EntryMessageList *>("cs_entrymsg"); if (!message.is_pos_number_only()) source.Reply(("Entry message \002%s\002 not found on channel \002%s\002."), message.c_str(), ci->name.c_str()); else if (messages != NULL) { try { unsigned i = convertTo<unsigned>(message); if (i > 0 && i <= messages->size()) { messages->erase(messages->begin() + i - 1); if (messages->empty()) ci->Shrink("cs_entrymsg"); source.Reply(_("Entry message \002%i\002 for \002%s\002 deleted."), i, ci->name.c_str()); } else throw ConvertException(); } catch (const ConvertException &) { source.Reply(_("Entry message \002%s\002 not found on channel \002%s\002."), message.c_str(), ci->name.c_str()); } } else source.Reply(_("Entry message list for \002%s\002 is empty."), ci->name.c_str()); }
char *dlerror(void) { static Anope::string err; err = Anope::LastError(); SetLastError(0); return err.empty() ? NULL : const_cast<char *>(err.c_str()); }
void IRCDProto::SendAction(const MessageSource &source, const Anope::string &dest, const Anope::string &message) { Anope::string actionbuf = "\1ACTION "; actionbuf.append(message); actionbuf.append('\1'); SendPrivmsg(source, dest, actionbuf); }
void BackupDatabase() { tm *tm = localtime(&Anope::CurTime); if (tm->tm_mday != last_day) { last_day = tm->tm_mday; const std::map<Anope::string, Serialize::TypeBase *> &types = Serialize::TypeBase::GetTypes(); std::set<Anope::string> dbs; dbs.insert(Config->GetModule(this)->Get<Anope::string>("database", "anope.db")); for (const std::pair<Anope::string, Serialize::TypeBase *> &p : types) { Serialize::TypeBase *stype = p.second; if (stype->GetOwner()) dbs.insert("module_" + stype->GetOwner()->name + ".db"); } for (std::set<Anope::string>::const_iterator it = dbs.begin(), it_end = dbs.end(); it != it_end; ++it) { const Anope::string &oldname = Anope::DataDir + "/" + *it; Anope::string newname = Anope::DataDir + "/backups/" + *it + "-" + stringify(tm->tm_year + 1900) + Anope::printf("-%02i-", tm->tm_mon + 1) + Anope::printf("%02i", tm->tm_mday); /* Backup already exists or no database to backup */ if (Anope::IsFile(newname) || !Anope::IsFile(oldname)) continue; Log(LOG_DEBUG) << "db_flatfile: Attempting to rename " << *it << " to " << newname; if (rename(oldname.c_str(), newname.c_str())) { Anope::string err = Anope::LastError(); Log(this) << "Unable to back up database " << *it << " (" << err << ")!"; if (!Config->GetModule(this)->Get<bool>("nobackupokay")) { Anope::Quitting = true; Anope::QuitReason = "Unable to back up database " + *it + " (" + err + ")"; } continue; } backups[*it].push_back(newname); unsigned keepbackups = Config->GetModule(this)->Get<unsigned>("keepbackups"); if (keepbackups > 0 && backups[*it].size() > keepbackups) { unlink(backups[*it].front().c_str()); backups[*it].pop_front(); } } } }
MyRedisService(Module *c, const Anope::string &n, const Anope::string &h, int p, unsigned d) : Provider(c, n), host(h), port(p), db(d), sock(NULL), sub(NULL), ti(c), in_transaction(false) { sock = new RedisSocket(this, host.find(':') != Anope::string::npos); sock->Connect(host, port); sub = new RedisSocket(this, host.find(':') != Anope::string::npos); sub->Connect(host, port); }