Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/VibeDevelopers/Comet.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239/* * Copyright (c) 2005 Ariadne Conill <ariadne -at- dereferenced.org> * and Jilles Tjoelker <jilles -at- stack.nl> * All rights reserved. * * Redistribution in both source and binary forms are permitted * provided that the above copyright notice remains unchanged. * * m_chghost.c: A module for handling spoofing dynamically. */
#include "stdinc.h"#include "send.h"#include "channel.h"#include "client.h"#include "defaults.h"#include "ircd.h"#include "numeric.h"#include "s_conf.h"#include "s_newconf.h"#include "s_serv.h"#include "s_user.h"#include "hash.h"#include "msg.h"#include "parse.h"#include "modules.h"#include "whowas.h"#include "monitor.h"
static const char chghost_desc[] = "Provides commands used to change and retrieve client hostnames";
static void me_realhost(struct MsgBuf *, struct Client *, struct Client *, int, const char **);static void ms_chghost(struct MsgBuf *, struct Client *, struct Client *, int, const char **);static void me_chghost(struct MsgBuf *, struct Client *, struct Client *, int, const char **);static void mo_chghost(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
struct Message realhost_msgtab = { "REALHOST", 0, 0, 0, 0, {mg_ignore, mg_ignore, mg_ignore, mg_ignore, {me_realhost, 2}, mg_ignore}};
struct Message chghost_msgtab = { "CHGHOST", 0, 0, 0, 0, {mg_ignore, mg_not_oper, {ms_chghost, 3}, {ms_chghost, 3}, {me_chghost, 3}, {mo_chghost, 3}}};
mapi_clist_av1 chghost_clist[] = { &chghost_msgtab, &realhost_msgtab, NULL };
DECLARE_MODULE_AV2(chghost, NULL, NULL, chghost_clist, NULL, NULL, NULL, NULL, chghost_desc);
/* clean_host() * * input - host to check * output - false if erroneous, else true * side effects - */static boolclean_host(const char *host){ int len = 0; const char *last_slash = 0;
if (*host == '\0' || *host == ':') return false;
for(; *host; host++) { len++;
if(!IsHostChar(*host)) return false; if(*host == '/') last_slash = host; }
if(len > HOSTLEN) return false;
if(last_slash && IsDigit(last_slash[1])) return false;
return true;}
/* * me_realhost * parv[1] = real host * * Yes this contains a little race condition if someone does a whois * in between the UID and REALHOST and use_whois_actually is enabled. * I don't think that's a big problem as the whole thing is a * race condition. */static voidme_realhost(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]){ if (!IsPerson(source_p)) return;
del_from_hostname_hash(source_p->orighost, source_p); rb_strlcpy(source_p->orighost, parv[1], sizeof source_p->orighost); if (irccmp(source_p->host, source_p->orighost)) SetDynSpoof(source_p); else ClearDynSpoof(source_p); add_to_hostname_hash(source_p->orighost, source_p);}
static booldo_chghost(struct Client *source_p, struct Client *target_p, const char *newhost, int is_encap){ if (!clean_host(newhost)) { sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "%s attempted to change hostname for %s to %s (invalid)", IsServer(source_p) ? source_p->name : get_oper_name(source_p), target_p->name, newhost); /* sending this remotely may disclose important * routing information -- jilles */ if (is_encap ? MyClient(target_p) : !ConfigServerHide.flatten_links) sendto_one_notice(target_p, ":*** Notice -- %s attempted to change your hostname to %s (invalid)", source_p->name, newhost); return false; } change_nick_user_host(target_p, target_p->name, target_p->username, newhost, 0, "Changing host"); if (irccmp(target_p->host, target_p->orighost)) { SetDynSpoof(target_p); if (MyClient(target_p)) sendto_one_numeric(target_p, RPL_HOSTHIDDEN, "%s :is now your hidden host (set by %s)", target_p->host, source_p->name); } else { ClearDynSpoof(target_p); if (MyClient(target_p)) sendto_one_numeric(target_p, RPL_HOSTHIDDEN, "%s :hostname reset by %s", target_p->host, source_p->name); } if (MyClient(source_p)) sendto_one_notice(source_p, ":Changed hostname for %s to %s", target_p->name, target_p->host); if (!IsServer(source_p) && !IsService(source_p)) sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s changed hostname for %s to %s", get_oper_name(source_p), target_p->name, target_p->host); return true;}
/* * ms_chghost * parv[1] = target * parv[2] = host */static voidms_chghost(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]){ struct Client *target_p;
if (!(target_p = find_person(parv[1]))) return;
if (do_chghost(source_p, target_p, parv[2], 0)) { sendto_server(client_p, NULL, CAP_EUID | CAP_TS6, NOCAPS, ":%s CHGHOST %s %s", use_id(source_p), use_id(target_p), parv[2]); sendto_server(client_p, NULL, CAP_TS6, CAP_EUID, ":%s ENCAP * CHGHOST %s :%s", use_id(source_p), use_id(target_p), parv[2]); }
return;}
/* * me_chghost * parv[1] = target * parv[2] = host */static voidme_chghost(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]){ struct Client *target_p;
if (!(target_p = find_person(parv[1]))) return;
do_chghost(source_p, target_p, parv[2], 1);}
/* * mo_chghost * parv[1] = target * parv[2] = host *//* Disable this because of the abuse potential -- jilles * No, make it toggleable via ./configure. --nenolod */static voidmo_chghost(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]){#ifdef ENABLE_OPER_CHGHOST struct Client *target_p;
if(!IsOperAdmin(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "admin"); return; }
if (!(target_p = find_named_person(parv[1]))) { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), parv[1]); return; }
if (!clean_host(parv[2])) { sendto_one_notice(source_p, ":Hostname %s is invalid", parv[2]); return; }
do_chghost(source_p, target_p, parv[2], 0);
sendto_server(NULL, NULL, CAP_EUID | CAP_TS6, NOCAPS, ":%s CHGHOST %s %s", use_id(source_p), use_id(target_p), parv[2]); sendto_server(NULL, NULL, CAP_TS6, CAP_EUID, ":%s ENCAP * CHGHOST %s :%s", use_id(source_p), use_id(target_p), parv[2]);#else sendto_one_numeric(source_p, ERR_DISABLED, form_str(ERR_DISABLED), "CHGHOST");#endif}