static int mo_privs(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p; if (parc < 2 || EmptyString(parv[1])) target_p = source_p; else { target_p = find_named_person(parv[1]); if (target_p == NULL) { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), parv[1]); return 0; } } if (MyClient(target_p)) show_privs(source_p, target_p); else sendto_one(target_p, ":%s ENCAP %s PRIVS %s", get_id(source_p, target_p), target_p->servptr->name, use_id(target_p)); return 0; }
static int mo_grant(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p; if(!IsOperGrant(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "grant"); return 0; } target_p = find_named_person(parv[1]); if(target_p == NULL) { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), parv[1]); return 0; } if(MyClient(target_p)) { do_grant(source_p, target_p, parv[2]); } else { sendto_one(target_p, ":%s ENCAP %s GRANT %s %s", get_id(source_p, target_p), target_p->servptr->name, get_id(target_p, target_p), parv[2]); } return 0; }
/* Disable this because of the abuse potential -- jilles * No, make it toggleable via ./configure. --nenolod */ static int mo_chghost(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p; if(!IsOperAdmin(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "admin"); return 0; } if (!(target_p = find_named_person(parv[1]))) { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), parv[1]); return 0; } if (!clean_host(parv[2])) { sendto_one_notice(source_p, ":Hostname %s is invalid", parv[2]); return 0; } 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]); return 0; }
static int m_identify(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { const char *nick; struct Client *target_p; if (parc < 2 || EmptyString(parv[1])) { sendto_one(source_p, form_str(ERR_NOTEXTTOSEND), me.name, source_p->name); return 0; } nick = parv[1][0] == '#' ? SVS_chanserv_NICK : SVS_nickserv_NICK; if ((target_p = find_named_person(nick)) && IsService(target_p)) { sendto_one(target_p, ":%s PRIVMSG %s :IDENTIFY %s", get_id(source_p, target_p), get_id(target_p, target_p), reconstruct_parv(parc - 1, &parv[1])); } else { sendto_one_numeric(source_p, ERR_SERVICESDOWN, form_str(ERR_SERVICESDOWN), nick); } return 0; }
static int mo_dehelper(struct Client *client_p, struct Client *source_p, int parc, const char **parv) { struct Client *target_p; if (!IsOperAdmin(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "admin"); return 0; } if(!(target_p = find_named_person(parv[1]))) { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), me.name, parv[1]); return 0; } if(MyClient(target_p)) do_dehelper(source_p, target_p); else sendto_one(target_p, ":%s ENCAP %s DEHELPER %s", use_id(source_p), target_p->servptr->name, use_id(target_p)); return 0; }
static int mo_grant(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p; int addflags = 0, removeflags = 0; int dooper = 0, dodeoper = 0; int i, j; int dir; const char *p; char *q; int add_snomask = 0, remove_snomask = 0; char oper_flag_changes[32], snomask_changes[64]; if(!IsOperGrant(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "grant"); return 0; } target_p = find_named_person(parv[1]); if (target_p == NULL) { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), parv[1]); return 0; } for (i = 2; i < parc; i++) { p = parv[i]; if (*p == '-') dir = MODE_DEL, p++; else if (*p == '+') dir = MODE_ADD, p++; else dir = MODE_ADD; if (!irccmp(p, "oper")) { if (dir == MODE_ADD) dooper = 1, dodeoper = 0; else dodeoper = 1, dooper = 0; continue; } if (!irccmp(p, "snomask")) { add_snomask = parse_snobuf_to_mask(0, parv[++i]); remove_snomask = ~parse_snobuf_to_mask(~0, parv[i]); continue; } for (j = 0; flag_table[j].name != NULL; j++) { if (!irccmp(p, flag_table[j].name)) { if (dir == MODE_ADD) addflags |= flag_table[j].mode, removeflags &= ~flag_table[j].mode; else removeflags |= flag_table[j].mode, addflags &= ~flag_table[j].mode; break; } } if (flag_table[j].name == NULL) { sendto_one_notice(source_p, ":Unknown GRANT keyword '%s'", p); return 0; } } if (((addflags | removeflags) & source_p->operflags) != (addflags | removeflags)) { sendto_one_notice(source_p, ":You may not change flags you do not have access to"); return 0; } if (MyClient(target_p)) { do_grant(source_p, target_p, addflags, removeflags, dooper, dodeoper, add_snomask, remove_snomask); } else { q = oper_flag_changes; for (i = 0; oper_flagtable[i].flag; ++i) { if (addflags & oper_flagtable[i].flag) *q++ = oper_flagtable[i].has; else if (removeflags & oper_flagtable[i].flag) *q++ = oper_flagtable[i].hasnt; } if(q == oper_flag_changes) *q++ = '.'; *q++ = '\0'; strlcpy(snomask_changes, construct_snobuf_changes(add_snomask, remove_snomask), sizeof(snomask_changes)); sendto_realops_snomask(SNO_DEBUG, L_NETWIDE, "Sending ENCAP GRANT %s %s %d %d %s to %s", get_id(target_p, target_p), oper_flag_changes, dooper, dodeoper, snomask_changes, target_p->servptr->name); sendto_one(target_p, ":%s ENCAP %s GRANT %s %s %d %d %s", get_id(source_p, target_p), target_p->servptr->name, get_id(target_p, target_p), oper_flag_changes, dooper, dodeoper, snomask_changes); } return 0; }
static int m_cmessage(int p_or_n, const char *command, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p; struct Channel *chptr; struct membership *msptr; if(!IsFloodDone(source_p)) flood_endgrace(source_p); if((target_p = find_named_person(parv[1])) == NULL) { if(p_or_n != NOTICE) sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), parv[1]); return 0; } if((chptr = find_channel(parv[2])) == NULL) { if(p_or_n != NOTICE) sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL, form_str(ERR_NOSUCHCHANNEL), parv[2]); return 0; } if((msptr = find_channel_membership(chptr, source_p)) == NULL) { if(p_or_n != NOTICE) sendto_one_numeric(source_p, ERR_NOTONCHANNEL, form_str(ERR_NOTONCHANNEL), chptr->chname); return 0; } if(!is_chanop_voiced(msptr)) { if(p_or_n != NOTICE) sendto_one(source_p, form_str(ERR_VOICENEEDED), me.name, source_p->name, chptr->chname); return 0; } if(!IsMember(target_p, chptr)) { if(p_or_n != NOTICE) sendto_one_numeric(source_p, ERR_USERNOTINCHANNEL, form_str(ERR_USERNOTINCHANNEL), target_p->name, chptr->chname); return 0; } if(MyClient(target_p) && (IsSetCallerId(target_p) || (IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0])) && !accept_message(source_p, target_p) && !IsOper(source_p)) { if (IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0]) { if (p_or_n != NOTICE) sendto_one_numeric(source_p, ERR_NONONREG, form_str(ERR_NONONREG), target_p->name); return 0; } if(p_or_n != NOTICE) sendto_one_numeric(source_p, ERR_TARGUMODEG, form_str(ERR_TARGUMODEG), target_p->name); if((target_p->localClient->last_caller_id_time + ConfigFileEntry.caller_id_wait) < rb_current_time()) { if(p_or_n != NOTICE) sendto_one_numeric(source_p, RPL_TARGNOTIFY, form_str(RPL_TARGNOTIFY), target_p->name); sendto_one(target_p, form_str(RPL_UMODEGMSG), me.name, target_p->name, source_p->name, source_p->username, source_p->host); target_p->localClient->last_caller_id_time = rb_current_time(); } return 0; } if(p_or_n != NOTICE) source_p->localClient->last = rb_current_time(); sendto_anywhere(target_p, source_p, command, ":%s", parv[3]); return 0; }
/* ** mo_forcenick ** parv[1] = forcenick victim ** parv[2] = new nickname */ static int mo_forcenick(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p, *exist_p; const char *user; const char *newnick; user = parv[1]; /* You must be this tall to ride the ride */ if(!IsOperLocalForce(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "local_force"); return 0; } /* Truncate it so clean_nick doesn't spaz out */ if(!EmptyString(parv[2])) { char *s; s = LOCAL_COPY(parv[2]); if(strlen(s) > (size_t) NICKLEN) s[NICKLEN] = '\0'; newnick = s; } else { sendto_one_numeric(source_p, ERR_NONICKNAMEGIVEN, form_str(ERR_NONICKNAMEGIVEN), me.name, source_p->name); return 0; } /* Nick has to be clean or we'll have a protocol violation... */ if(!clean_nick(newnick)) { sendto_one(source_p, form_str(ERR_ERRONEUSNICKNAME), me.name, user, newnick); return 0; } /* Find the target... */ if((target_p = find_named_person(user)) == NULL) { sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS), me.name, source_p->name, "FORCENICK"); return 0; } /* If it's a server, sod it, changing its name is stupid... */ if(IsServer(target_p) || IsMe(target_p)) { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), user); return 0; } /* Do we have permission to send it globally? */ if(!MyClient(target_p) && (!IsOperGlobalForce(source_p))) { sendto_one_notice(source_p, ":Nick %s is not on your server and you do not have the global_force flag", target_p->name); return 0; } /* Check to see if the new nick exists */ if((exist_p = find_named_person(newnick)) != NULL) { /* Could just be a case shift */ if(irccmp(target_p->name, newnick)) { sendto_one(source_p, form_str(ERR_NICKNAMEINUSE), me.name, user, newnick); return 0; } /* If it's the same nick, f**k it */ else if(!strcmp(target_p->name, newnick)) return 0; } sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Received FORCENICK message for %s!%s@%s. From %s (Newnick: %s)", target_p->name, target_p->username, target_p->orighost, source_p->name, newnick); ilog(L_MAIN, "FORCENICK called for [%s] by %s!%s@%s", target_p->name, source_p->name, source_p->username, source_p->host); sendto_one_notice(target_p, ":You have been forcenicked from %s to %s by %s", target_p->name, newnick, source_p->name); if(!MyClient(target_p)) { struct Client *cptr = target_p->servptr; sendto_one(cptr, ":%s ENCAP %s FORCENICK %s :%s", get_id(source_p, cptr), cptr->name, get_id(target_p, cptr), newnick); return 0; } change_nick(target_p, newnick); return 0; }
/* ** mo_forcejoin ** parv[1] = forcejoin victim ** parv[2] = forcejoin channel list */ static int mo_forcejoin(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p; const char *user, *chanlist; user = parv[1]; if(!IsOperLocalForce(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "local_force"); return 0; } if(EmptyString(parv[2])) { sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS), me.name, source_p->name, "FORCEJOIN"); return 0; } else chanlist = parv[2]; if((target_p = find_named_person(user)) == NULL) { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), user); return 0; } if(!IsPerson(target_p)) return 0; if(!MyClient(target_p) && !IsOperGlobalForce(source_p)) { sendto_one_notice(source_p, ":Nick %s is not on your server and you do not have the global_force flag", target_p->name); return 0; } sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Received FORCEJOIN message for %s!%s@%s. From %s (Channels: %s)", target_p->name, target_p->username, target_p->orighost, source_p->name, chanlist); ilog(L_MAIN, "FORCEJOIN called for [%s] by %s!%s@%s", target_p->name, source_p->name, source_p->username, source_p->host); sendto_one_notice(target_p, ":You have been forcejoined to %s by %s", chanlist, source_p->name); if(!MyClient(target_p)) { struct Client *cptr = target_p->servptr; sendto_one(cptr, ":%s ENCAP %s FORCEJOIN %s :%s", get_id(source_p, cptr), cptr->name, get_id(target_p, cptr), chanlist); return 0; } user_join_override(client_p, source_p, target_p, chanlist); return 0; }