/* mo_unresv() * parv[0] = sender prefix * parv[1] = channel/nick to unforbid */ static void mo_unresv(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { char *resv = NULL; char *reason = NULL; char *target_server = NULL; /* UNRESV #channel ON irc.server.com */ /* UNRESV kiddie ON irc.server.com */ if(parse_aline("UNRESV", source_p, parc, parv, 0, &resv, NULL, NULL, &target_server, &reason) < 0) return; if(target_server != NULL) { sendto_match_servs(source_p, target_server, CAP_CLUSTER, "UNRESV %s %s", target_server, resv); /* Allow ON to apply local unresv as well if it matches */ if(!match(target_server, me.name)) return; } else cluster_a_line(source_p, "UNRESV", CAP_KLN, SHARED_UNRESV, resv); remove_resv(source_p, resv); }
/*! \brief REHASH command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = target server mask * - parv[2] = option [CONF, DNS, MOTD] */ static int ms_rehash(struct Client *source_p, int parc, char *parv[]) { const char *const option = parv[2]; const char *const server = parv[1]; sendto_match_servs(source_p, server, 0, "REHASH %s %s", server, option); if (match(server, me.name)) return 0; if (!find_matching_name_conf(CONF_SHARED, source_p->servptr->name, source_p->username, source_p->host, SHARED_REHASH)) return 0; for (const struct RehashStruct *tab = rehash_cmd_table; tab->handler; ++tab) { if (irccmp(tab->option, option)) continue; tab->handler(source_p); return 0; } return 0; }
static int m_alis(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { char buf[BUFSIZE]; int i = 1; if(find_server(NULL, "services.azzurra.org") == NULL) { sendto_one(source_p, ":%s 440 %s alis :Services are currently unavailable", me.name, source_p->name); return 0; } buf[0] = '\0'; while(i < parc) { rb_strlcat(buf, parv[i], sizeof(buf)); rb_strlcat(buf, " ", sizeof(buf)); i++; } sendto_match_servs(client_p, "services.azzurra.org", CAP_ENCAP, NOCAPS, "ENCAP services.azzurra.org RSMSG alis %s", buf); return 0; }
/*! \brief UNRESV command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = channel/nick * - parv[2] = "ON" * - parv[3] = target server */ static int mo_unresv(struct Client *source_p, int parc, char *parv[]) { char *resv = NULL; char *reason = NULL; char *target_server = NULL; if (!HasOFlag(source_p, OPER_FLAG_UNRESV)) { sendto_one_numeric(source_p, &me, ERR_NOPRIVS, "unresv"); return 0; } if (!parse_aline("UNRESV", source_p, parc, parv, 0, &resv, NULL, NULL, &target_server, &reason)) return 0; if (target_server) { sendto_match_servs(source_p, target_server, CAPAB_CLUSTER, "UNRESV %s %s", target_server, resv); /* Allow ON to apply local unresv as well if it matches */ if (match(target_server, me.name)) return 0; } else cluster_a_line(source_p, "UNRESV", CAPAB_KLN, SHARED_UNRESV, resv); resv_remove(source_p, resv); return 0; }
/* mo_resv() * parv[0] = command * parv[1] = channel/nick to forbid */ static int mo_resv(struct Client *source_p, int parc, char *parv[]) { char *resv = NULL; char *reason = NULL; char *target_server = NULL; time_t tkline_time = 0; /* RESV #channel ON irc.server.com :abuse * RESV kiddie ON irc.server.com :abuse */ if (!parse_aline("RESV", source_p, parc, parv, 0, &resv, NULL, &tkline_time, &target_server, &reason)) return 0; if (target_server) { /* if a given expire time is given, ENCAP it */ if (tkline_time) sendto_match_servs(source_p, target_server, CAP_ENCAP, "ENCAP %s RESV %d %s 0 :%s", target_server, (int)tkline_time, resv, reason); else sendto_match_servs(source_p, target_server, CAP_CLUSTER, "RESV %s %s :%s", target_server, resv, reason); /* Allow ON to apply local resv as well if it matches */ if (match(target_server, me.name)) return 0; } else { /* RESV #channel :abuse * RESV kiddie :abuse */ if (tkline_time) cluster_a_line(source_p, "ENCAP", CAP_ENCAP, SHARED_RESV, "RESV %d %s 0 :%s", (int)tkline_time, resv, reason); else cluster_a_line(source_p, "RESV", CAP_KLN, SHARED_RESV, "%s :%s", resv, reason); } parse_resv(source_p, resv, (int)tkline_time, reason); return 0; }
/*! \brief UNKLINE command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = target server * - parv[2] = user mask * - parv[3] = host mask */ static int ms_unkline(struct Client *source_p, int parc, char *parv[]) { if (parc != 4 || EmptyString(parv[3])) return 0; sendto_match_servs(source_p, parv[1], CAP_UNKLN, "UNKLINE %s %s %s", parv[1], parv[2], parv[3]); return me_unkline(source_p, parc, parv); }
/*! \brief REHASH command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = option [CONF, DNS, MOTD] * or for remote REHASH: * - parv[0] = command * - parv[1] = target server mask * - parv[2] = option [CONF, DNS, MOTD] */ static int mo_rehash(struct Client *source_p, int parc, char *parv[]) { const char *option = NULL; const char *server = NULL; if (EmptyString(parv[parc - 1])) { sendto_one_numeric(source_p, &me, ERR_NEEDMOREPARAMS, "REHASH"); return 0; } if (parc < 3) { if (!HasOFlag(source_p, OPER_FLAG_REHASH)) { sendto_one_numeric(source_p, &me, ERR_NOPRIVS, "rehash"); return 0; } option = parv[1]; } else { if (!HasOFlag(source_p, OPER_FLAG_REHASH_REMOTE)) { sendto_one_numeric(source_p, &me, ERR_NOPRIVS, "rehash:remote"); return 0; } server = parv[1]; option = parv[2]; } for (const struct RehashStruct *tab = rehash_cmd_table; tab->handler; ++tab) { if (irccmp(tab->option, option)) continue; if (!EmptyString(server)) sendto_match_servs(source_p, server, 0, "REHASH %s %s", server, option); if (EmptyString(server) || match(server, me.name)) tab->handler(source_p); return 0; } sendto_one_notice(source_p, &me, ":%s is not a valid option. " "Choose from CONF, DNS, MOTD", option); return 0; }
/* ** m_undline ** added May 28th 2000 by Toby Verrall <*****@*****.**> ** based totally on m_unkline ** added to hybrid-7 7/11/2000 --is ** ** parv[0] = sender nick ** parv[1] = dline to remove */ static void mo_undline(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { char *addr = NULL, *user = NULL; char *target_server = NULL; if (!HasOFlag(source_p, OPER_FLAG_UNDLINE)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "undline"); return; } if (parc < 2 || EmptyString(parv[1])) { sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS), me.name, source_p->name, "UNDLINE"); return; } if (parse_aline("UNDLINE", source_p, parc, parv, 0, &user, &addr, NULL, &target_server, NULL) < 0) return; if (target_server != NULL) { sendto_match_servs(source_p, target_server, CAP_UNDLN, "UNDLINE %s %s", target_server, addr); /* Allow ON to apply local unkline as well if it matches */ if (match(target_server, me.name)) return; } else cluster_a_line(source_p, "UNDLINE", CAP_UNDLN, SHARED_UNDLINE, "%s", addr); if (remove_dline_match(addr)) { sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed", me.name, source_p->name, addr); sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE, "%s has removed the D-Line for: [%s]", get_oper_name(source_p), addr); ilog(LOG_TYPE_DLINE, "%s removed D-Line for [%s]", get_oper_name(source_p), addr); } else sendto_one(source_p, ":%s NOTICE %s :No D-Line for [%s] found", me.name, source_p->name, addr); }
static int mo_adminwall(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { if(!IsAdmin(source_p)) { sendto_one_numeric(source_p, s_RPL(ERR_NOPRIVS), "adminwall"); return 0; } sendto_wallops_flags(UMODE_ADMIN, source_p, "ADMINWALL - %s", parv[1]); sendto_match_servs(source_p, "*", CAP_ENCAP, NOCAPS, "ENCAP * ADMINWALL :%s", parv[1]); return 0; }
static void ms_undline(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { if (parc != 3 || EmptyString(parv[2])) return; sendto_match_servs(source_p, parv[1], CAP_UNDLN, "UNDLINE %s %s", parv[1], parv[2]); me_undline(client_p, source_p, parc, parv); }
/*! \brief UNKLINE command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = user\@host mask * - parv[2] = "ON" * - parv[3] = target server */ static int mo_unkline(struct Client *source_p, int parc, char *parv[]) { char *target_server = NULL; char *user, *host; if (!HasOFlag(source_p, OPER_FLAG_UNKLINE)) { sendto_one_numeric(source_p, &me, ERR_NOPRIVS, "unkline"); return 0; } if (EmptyString(parv[1])) { sendto_one_numeric(source_p, &me, ERR_NEEDMOREPARAMS, "UNKLINE"); return 0; } if (parse_aline("UNKLINE", source_p, parc, parv, 0, &user, &host, NULL, &target_server, NULL) < 0) return 0; if (target_server) { sendto_match_servs(source_p, target_server, CAP_UNKLN, "UNKLINE %s %s %s", target_server, user, host); /* Allow ON to apply local unkline as well if it matches */ if (match(target_server, me.name)) return 0; } else cluster_a_line(source_p, "UNKLINE", CAP_UNKLN, SHARED_UNKLINE, "%s %s", user, host); if (remove_kline_match(host, user)) { sendto_one_notice(source_p, &me, ":K-Line for [%s@%s] is removed", user, host); sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE, "%s has removed the K-Line for: [%s@%s]", get_oper_name(source_p), user, host); ilog(LOG_TYPE_KLINE, "%s removed K-Line for [%s@%s]", get_oper_name(source_p), user, host); } else sendto_one_notice(source_p, &me, ":No K-Line for [%s@%s] found", user, host); return 0; }
/* ms_unresv() * parv[0] = sender prefix * parv[1] = target server * parv[2] = resv to remove */ static void ms_unresv(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { if((parc != 3) || EmptyString(parv[2])) return; sendto_match_servs(source_p, parv[1], CAP_CLUSTER, "UNRESV %s %s", parv[1], parv[2]); if(!IsClient(source_p) || !match(parv[1], me.name)) return; if(find_matching_name_conf(ULINE_TYPE, source_p->servptr->name, source_p->username, source_p->realhost, SHARED_UNRESV)) remove_resv(source_p, parv[2]); }
/* ms_encap() * * parv[1] - destination server * parv[2] - subcommand * parv[3] - parameters */ static int ms_encap(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { char buffer[BUFSIZE]; char *ptr; int cur_len = 0; int len; int i; ptr = buffer; for(i = 1; i < parc - 1; i++) { len = strlen(parv[i]) + 1; /* ugh, not even at the last parameter, just bail --fl */ if((size_t)(cur_len + len) >= sizeof(buffer)) return 0; rb_snprintf(ptr, sizeof(buffer) - cur_len, "%s ", parv[i]); cur_len += len; ptr += len; } len = strlen(parv[i]); /* if its a command without parameters, dont prepend a ':' */ if(parc == 3) rb_snprintf(ptr, sizeof(buffer) - cur_len, "%s", parv[2]); else rb_snprintf(ptr, sizeof(buffer) - cur_len, ":%s", parv[parc-1]); /* add a trailing \0 if it was too long */ if((cur_len + len) >= BUFSIZE) buffer[BUFSIZE-1] = '\0'; sendto_match_servs(source_p, parv[1], CAP_ENCAP, NOCAPS, "ENCAP %s", buffer); /* if it matches us, find a matching handler and call it */ if(match(parv[1], me.name)) handle_encap(client_p, source_p, parv[2], parc - 2, parv + 2); return 0; }
/* ms_resv() * parv[0] = sender prefix * parv[1] = target server * parv[2] = channel/nick to resv * parv[3] = reason */ static void ms_resv (struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { if ((parc != 4) || EmptyString (parv[3])) return; sendto_match_servs (source_p, parv[1], CAP_CLUSTER, "RESV %s %s :%s", parv[1], parv[2], parv[3]); if (!match (parv[1], me.name)) return; if (!IsPerson (source_p)) return; parse_resv (source_p, parv[2], parv[3], 1); }
/* ms_unresv() * parv[0] = sender prefix * parv[1] = target server * parv[2] = resv to remove */ static void ms_unresv (struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { if ((parc != 3) || EmptyString (parv[2])) return; sendto_match_servs (source_p, parv[1], CAP_CLUSTER, "UNRESV %s %s", parv[1], parv[2]); if (!match (me.name, parv[1])) return; if (!IsPerson (source_p)) return; remove_resv (source_p, parv[2], 1); }
void report_operspy(struct Client *source_p, const char *token, const char *arg) { /* if its not my client its already propagated */ if(MyClient(source_p)) sendto_match_servs(source_p, "*", CAP_ENCAP, NOCAPS, "ENCAP * OPERSPY %s %s", token, arg ? arg : ""); sendto_realops_snomask(SNO_OPERSPY, ConfigFileEntry.operspy_admin_only ? L_ADMIN : L_ALL, "OPERSPY %s %s %s", get_oper_name(source_p), token, arg ? arg : ""); ilog(L_OPERSPY, "OPERSPY %s %s %s", get_oper_name(source_p), token, arg ? arg : ""); }
/* ms_resv() * parv[0] = command * parv[1] = target server * parv[2] = channel/nick to resv * parv[3] = reason */ static int ms_resv(struct Client *source_p, int parc, char *parv[]) { if (parc != 4 || EmptyString(parv[3])) return 0; sendto_match_servs(source_p, parv[1], CAP_CLUSTER, "RESV %s %s :%s", parv[1], parv[2], parv[3]); if (match(parv[1], me.name)) return 0; if (HasFlag(source_p, FLAGS_SERVICE) || find_matching_name_conf(CONF_ULINE, source_p->servptr->name, source_p->username, source_p->host, SHARED_RESV)) parse_resv(source_p, parv[2], 0, parv[3]); return 0; }
/* load a module .. */ static void mo_modload(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char **parv) { if(!IsOperAdmin(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "admin"); return; } if(parc > 2) { sendto_match_servs(source_p, parv[2], CAP_ENCAP, NOCAPS, "ENCAP %s MODLOAD %s", parv[2], parv[1]); if(match(parv[2], me.name) == 0) return; } do_modload(source_p, parv[1]); }
/*! \brief LOCOPS command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = target server * - parv[2] = message text */ static int ms_locops(struct Client *source_p, int parc, char *parv[]) { const char *const targets = parv[1]; const char *const message = parv[2]; if (parc != 3 || EmptyString(message)) return 0; sendto_match_servs(source_p, targets, CAPAB_CLUSTER, "LOCOPS %s :%s", targets, message); if (match(targets, me.name)) return 0; if (shared_find(SHARED_LOCOPS, source_p->servptr->name, "*", "*")) sendto_realops_flags(UMODE_LOCOPS, L_ALL, SEND_LOCOPS, "from %s: %s", source_p->name, message); return 0; }
/*! \brief UNRESV command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = target server * - parv[2] = channel/nick */ static int ms_unresv(struct Client *source_p, int parc, char *parv[]) { if (parc != 3 || EmptyString(parv[2])) return 0; sendto_match_servs(source_p, parv[1], CAPAB_CLUSTER, "UNRESV %s %s", parv[1], parv[2]); if (match(parv[1], me.name)) return 0; if (HasFlag(source_p, FLAGS_SERVICE) || find_matching_name_conf(CONF_SHARED, source_p->servptr->name, source_p->username, source_p->host, SHARED_UNRESV)) resv_remove(source_p, parv[2]); return 0; }
static void ms_locops(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { if(parc != 3 || EmptyString(parv[2])) return; /* parv[0] parv[1] parv[2] * oper target serv message */ sendto_match_servs(source_p, parv[1], CAP_CLUSTER, NOCAPS, "LOCOPS %s :%s", parv[1], parv[2]); if(!match(parv[1], me.name)) return; if(!IsPerson(source_p)) return; if(find_cluster(source_p->user->server, CLUSTER_LOCOPS)) sendto_wallops_flags(UMODE_LOCOPS, source_p, "SLOCOPS - %s", parv[2]); }
/*! \brief UNKLINE command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = target server * - parv[2] = user mask * - parv[3] = host mask */ static int ms_unkline(struct Client *source_p, int parc, char *parv[]) { const char *kuser, *khost; if (parc != 4 || EmptyString(parv[3])) return 0; sendto_match_servs(source_p, parv[1], CAP_UNKLN, "UNKLINE %s %s %s", parv[1], parv[2], parv[3]); kuser = parv[2]; khost = parv[3]; if (match(parv[1], me.name)) return 0; if (HasFlag(source_p, FLAGS_SERVICE) || find_matching_name_conf(CONF_ULINE, source_p->servptr->name, source_p->username, source_p->host, SHARED_UNKLINE)) { if (remove_kline_match(khost, kuser)) { if (IsClient(source_p)) sendto_one_notice(source_p, &me, ":K-Line for [%s@%s] is removed", kuser, khost); sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE, "%s has removed the K-Line for: [%s@%s]", get_oper_name(source_p), kuser, khost); ilog(LOG_TYPE_KLINE, "%s removed K-Line for [%s@%s]", get_oper_name(source_p), kuser, khost); } else if (IsClient(source_p)) sendto_one_notice(source_p, &me, ":No K-Line for [%s@%s] found", kuser, khost); } return 0; }
/*! \brief UNXLINE command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = gecos * - parv[2] = "ON" * - parv[3] = target server */ static int mo_unxline(struct Client *source_p, int parc, char *parv[]) { struct aline_ctx aline = { .add = false, .simple_mask = true }; if (!HasOFlag(source_p, OPER_FLAG_UNXLINE)) { sendto_one_numeric(source_p, &me, ERR_NOPRIVS, "unxline"); return 0; } if (parse_aline("UNXLINE", source_p, parc, parv, &aline) == false) return 0; if (aline.server) { sendto_match_servs(source_p, aline.server, CAPAB_CLUSTER, "UNXLINE %s %s", aline.server, aline.mask); /* Allow ON to apply local unxline as well if it matches */ if (match(aline.server, me.name)) return 0; } else cluster_distribute(source_p, "UNXLINE", CAPAB_CLUSTER, CLUSTER_UNXLINE, "%s", aline.host); xline_remove(source_p, &aline); return 0; } /*! \brief UNXLINE command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = target server mask * - parv[2] = gecos */ static int ms_unxline(struct Client *source_p, int parc, char *parv[]) { struct aline_ctx aline = { .add = false, .simple_mask = true, .mask = parv[2], .server = parv[1] }; if (parc != 3 || EmptyString(parv[parc - 1])) return 0; sendto_match_servs(source_p, aline.server, CAPAB_CLUSTER, "UNXLINE %s %s", aline.server, aline.mask); if (match(aline.server, me.name)) return 0; if (HasFlag(source_p, FLAGS_SERVICE) || shared_find(SHARED_UNXLINE, source_p->servptr->name, source_p->username, source_p->host)) xline_remove(source_p, &aline); return 0; } static struct Message unxline_msgtab = { .cmd = "UNXLINE", .args_min = 2, .args_max = MAXPARA, .handlers[UNREGISTERED_HANDLER] = m_unregistered, .handlers[CLIENT_HANDLER] = m_not_oper, .handlers[SERVER_HANDLER] = ms_unxline, .handlers[ENCAP_HANDLER] = m_ignore, .handlers[OPER_HANDLER] = mo_unxline }; static void module_init(void) { mod_add_cmd(&unxline_msgtab); } static void module_exit(void) { mod_del_cmd(&unxline_msgtab); } struct module module_entry = { .version = "$Revision$", .modinit = module_init, .modexit = module_exit, };
static void ms_dline(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { char def_reason[] = CONF_NOREASON; char *dlhost, *oper_reason, *reason; const char *creason; const struct Client *target_p = NULL; struct sockaddr_storage daddr; struct AccessItem *aconf = NULL; time_t tkline_time = 0; int bits, t; char hostip[HOSTIPLEN + 1]; if (parc != 5 || EmptyString(parv[4])) return; /* parv[0] parv[1] parv[2] parv[3] parv[4] */ /* oper target_server tkline_time host reason */ sendto_match_servs(source_p, parv[1], CAP_DLN, "DLINE %s %s %s :%s", parv[1], parv[2], parv[3], parv[4]); if (!match(parv[1], me.name)) return; tkline_time = valid_tkline(parv[2], TK_SECONDS); dlhost = parv[3]; reason = parv[4]; if (HasFlag(source_p, FLAGS_SERVICE) || find_matching_name_conf(ULINE_TYPE, source_p->servptr->name, source_p->username, source_p->host, SHARED_DLINE)) { if (!IsClient(source_p)) return; if ((t = parse_netmask(dlhost, NULL, &bits)) == HM_HOST) { if ((target_p = find_chasing(client_p, source_p, dlhost, NULL)) == NULL) return; if (!MyConnect(target_p)) { sendto_one(source_p, ":%s NOTICE %s :Can't DLINE nick on another server", me.name, source_p->name); return; } if (IsExemptKline(target_p)) { sendto_one(source_p, ":%s NOTICE %s :%s is E-lined", me.name, source_p->name, target_p->name); return; } ip_to_string(&target_p->ip, hostip, sizeof(hostip)); dlhost = hostip; t = parse_netmask(dlhost, NULL, &bits); assert(t == HM_IPV4 || t == HM_IPV6); } if (bits < 8) { sendto_one(source_p, ":%s NOTICE %s :For safety, bitmasks less than 8 require conf access.", me.name, source_p->name); return; } if (t == HM_IPV6) t = AF_INET6; else t = AF_INET; parse_netmask(dlhost, &daddr, NULL); if ((aconf = find_dline_conf(&daddr, t)) != NULL) { creason = aconf->reason ? aconf->reason : def_reason; if (IsConfExemptKline(aconf)) sendto_one(source_p, ":%s NOTICE %s :[%s] is (E)d-lined by [%s] - %s", me.name, source_p->name, dlhost, aconf->host, creason); else sendto_one(source_p, ":%s NOTICE %s :[%s] already D-lined by [%s] - %s", me.name, source_p->name, dlhost, aconf->host, creason); return; } /* Look for an oper reason */ if ((oper_reason = strchr(reason, '|')) != NULL) * oper_reason++ = '\0'; if (!valid_comment(source_p, reason, 1)) return; apply_conf_ban(source_p, DLINE_TYPE, NULL, dlhost, reason, oper_reason, tkline_time); } }
static int m_displaymsg(struct Client *source_p, const char *channel, int underline, int action, const char *nick, const char *text) { struct Channel *chptr; struct membership *msptr; char nick2[NICKLEN+1]; char nick3[NICKLEN+1]; char text2[BUFSIZE]; if((chptr = find_channel(channel)) == NULL) { sendto_one(source_p, form_str(ERR_NOSUCHCHANNEL), channel); return 0; } if(!(msptr = find_channel_membership(chptr, source_p))) { sendto_one_numeric(source_p, ERR_NOTONCHANNEL, form_str(ERR_NOTONCHANNEL), chptr->chname); return 0; } if(!(chptr->mode.mode & chmode_flags['N'])) { sendto_one_numeric(source_p, 573, "%s :Roleplay commands are not enabled on this channel.", chptr->chname); return 0; } if(!can_send(chptr, source_p, msptr)) { sendto_one_numeric(source_p, 573, "%s :Cannot send to channel.", chptr->chname); return 0; } /* enforce flood stuff on roleplay commands */ if(flood_attack_channel(0, source_p, chptr, chptr->chname)) return 0; /* enforce target change on roleplay commands */ if(!is_chanop_voiced(msptr) && !IsOper(source_p) && !add_channel_target(source_p, chptr)) { sendto_one(source_p, form_str(ERR_TARGCHANGE), me.name, source_p->name, chptr->chname); return 0; } rb_strlcpy(nick3, nick, sizeof(nick3)); if(underline) snprintf(nick2, sizeof(nick2), "\x1F%s\x1F", strip_unprintable(nick3)); else snprintf(nick2, sizeof(nick2), "%s", strip_unprintable(nick3)); /* don't allow nicks to be empty after stripping * this prevents nastiness like fake factions, etc. */ if(EmptyString(nick3)) { sendto_one_numeric(source_p, 573, "%s :No visible non-stripped characters in nick.", chptr->chname); return 0; } if(action) snprintf(text2, sizeof(text2), "\1ACTION %s\1", text); else snprintf(text2, sizeof(text2), "%s", text); sendto_channel_local(ALL_MEMBERS, chptr, ":%s!%[email protected] PRIVMSG %s :%s (%s)", nick2, source_p->name, channel, text2, source_p->name); sendto_match_servs(source_p, "*", CAP_ENCAP, NOCAPS, "ENCAP * ROLEPLAY %s %s :%s", channel, nick2, text2); return 0; }
/* * ms_encap() * * inputs - destination server, subcommand, parameters * output - none * side effects - propogates subcommand to locally connected servers */ static void ms_encap(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { char buffer[BUFSIZE], *ptr = buffer; unsigned int cur_len = 0, len, i; int paramcount, mpara = 0; struct Message *mptr = NULL; MessageHandler handler = 0; for (i = 1; i < (unsigned int)parc - 1; i++) { len = strlen(parv[i]) + 1; if ((cur_len + len) >= sizeof(buffer)) return; ircsprintf(ptr, "%s ", parv[i]); cur_len += len; ptr += len; } len = strlen(parv[i]); /* * if the final parameter crosses our buffer size, should we bail, * like the rest, or should we truncate? ratbox seems to think truncate, * so i'll do that for now until i can talk to lee. -bill * * if the rest bail, we should too, but i'll make it optional for now. * frankily, bailing shouldn't matter, as ENCAP is basically worthless anyway. * infact, it will most likely not make final release. * --nenolod */ if (parc == 3) ircsprintf(ptr, "%s", parv[2]); else ircsprintf(ptr, ":%s", parv[parc-1]); #ifdef RATBOX_STYLE_ENCAP if ((cur_len + len) >= sizeof(buffer)) buffer[sizeof(buffer)-1] = '\0'; #else if ((cur_len + len) >= sizeof(buffer)) return; #endif sendto_match_servs(source_p, parv[1], CAP_ENCAP, "ENCAP %s", buffer); if (!match(parv[1], me.name)) return; mptr = find_command(parv[2]); if ((mptr == NULL) || (mptr->cmd == NULL)) return; paramcount = mptr->parameters; mpara = mptr->maxpara; mptr->bytes += strlen(buffer); /* * yes this is an ugly hack, but it is quicker than copying the entire array again * note: this hack wouldnt be needed if parv[0] were set to the command name, rather * than being derived from the prefix, as it should have been from the beginning. */ ptr = parv[0]; parv+=2; parc-=2; parv[0] = ptr; if ((handler = mptr->handlers[2]) == NULL) return; (*handler)(client_p, source_p, parc, parv); }
/* * ms_encap() * * inputs - destination server, subcommand, parameters * output - none * side effects - propagates subcommand to locally connected servers */ static void ms_encap(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { char buffer[IRCD_BUFSIZE], *ptr = buffer; unsigned int cur_len = 0, len, i; int paramcount, mpara = 0; struct Message *mptr = NULL; MessageHandler handler = 0; for (i = 1; i < (unsigned int)parc - 1; i++) { len = strlen(parv[i]) + 1; if ((cur_len + len) >= sizeof(buffer)) return; ircsprintf(ptr, "%s ", parv[i]); cur_len += len; ptr += len; } len = strlen(parv[i]); /* * if the final parameter crosses our buffer size, should we bail, * like the rest, or should we truncate? ratbox seems to think truncate, * so i'll do that for now until i can talk to lee. -bill */ if (parc == 3) ircsprintf(ptr, "%s", parv[2]); else ircsprintf(ptr, ":%s", parv[parc-1]); if ((cur_len + len) >= sizeof(buffer)) buffer[sizeof(buffer)-1] = '\0'; sendto_match_servs(source_p, parv[1], CAP_ENCAP, "ENCAP %s", buffer); if (!match(parv[1], me.name)) return; if ((mptr = find_command(parv[2])) == NULL) return; paramcount = mptr->parameters; mpara = mptr->maxpara; mptr->bytes += strlen(buffer); /* * yes this is an ugly hack, but it is quicker than copying the entire array again * note: this hack wouldnt be needed if parv[0] were set to the command name, rather * than being derived from the prefix, as it should have been from the beginning. */ ptr = parv[0]; parv += 2; parc -= 2; parv[0] = ptr; if ((handler = mptr->handlers[ENCAP_HANDLER]) == NULL) return; (*handler)(client_p, source_p, parc, parv); }
static void ms_dline(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { char def_reason[] = CONF_NOREASON; char *dlhost, *reason; const char *creason; const struct Client *target_p = NULL; struct irc_ssaddr daddr; struct MaskItem *conf=NULL; time_t tkline_time=0; int bits = 0, aftype = 0, t = 0; const char *current_date = NULL; time_t cur_time; char hostip[HOSTIPLEN + 1]; char buffer[IRCD_BUFSIZE]; if (parc != 5 || EmptyString(parv[4])) return; /* parv[0] parv[1] parv[2] parv[3] parv[4] */ /* oper target_server tkline_time host reason */ sendto_match_servs(source_p, parv[1], CAP_DLN, "DLINE %s %s %s :%s", parv[1], parv[2], parv[3], parv[4]); if (match(parv[1], me.name)) return; tkline_time = valid_tkline(parv[2], TK_SECONDS); dlhost = parv[3]; reason = parv[4]; if (HasFlag(source_p, FLAGS_SERVICE) || find_matching_name_conf(CONF_ULINE, source_p->servptr->name, source_p->username, source_p->host, SHARED_DLINE)) { if (!IsClient(source_p)) return; if ((t = parse_netmask(dlhost, NULL, &bits)) == HM_HOST) { if ((target_p = find_chasing(client_p, source_p, dlhost, NULL)) == NULL) return; if (!MyConnect(target_p)) { sendto_one(source_p, ":%s NOTICE %s :Can't DLINE nick on another server", me.name, source_p->name); return; } if (IsExemptKline(target_p)) { sendto_one(source_p, ":%s NOTICE %s :%s is E-lined", me.name, source_p->name, target_p->name); return; } getnameinfo((struct sockaddr *)&target_p->localClient->ip, target_p->localClient->ip.ss_len, hostip, sizeof(hostip), NULL, 0, NI_NUMERICHOST); dlhost = hostip; t = parse_netmask(dlhost, NULL, &bits); assert(t == HM_IPV4 || t == HM_IPV6); } if (bits < 8) { sendto_one(source_p, ":%s NOTICE %s :For safety, bitmasks less than 8 require conf access.", me.name, source_p->name); return; } #ifdef IPV6 if (t == HM_IPV6) aftype= AF_INET6; else #endif aftype = AF_INET; parse_netmask(dlhost, &daddr, NULL); if ((conf = find_dline_conf(&daddr, aftype)) != NULL) { creason = conf->reason ? conf->reason : def_reason; if (IsConfExemptKline(conf)) sendto_one(source_p, ":%s NOTICE %s :[%s] is (E)d-lined by [%s] - %s", me.name, source_p->name, dlhost, conf->host, creason); else sendto_one(source_p, ":%s NOTICE %s :[%s] already D-lined by [%s] - %s", me.name, source_p->name, dlhost, conf->host, creason); return; } cur_time = CurrentTime; current_date = smalldate(cur_time); if (!valid_comment(source_p, reason, 1)) return; conf = conf_make(CONF_DLINE); conf->host = xstrdup(dlhost); if (tkline_time != 0) snprintf(buffer, sizeof(buffer), "Temporary D-line %d min. - %s (%s)", (int)(tkline_time/60), reason, current_date); else snprintf(buffer, sizeof(buffer), "%s (%s)", reason, current_date); conf->reason = xstrdup(buffer); apply_dline(source_p, conf, tkline_time); rehashed_klines = 1; } }