/* * ms_fakehost - fakehost server message handler * * parv[0] = sender prefix * parv[1] = target user numeric * parv[2] = target user's new fake host */ int ms_fakehost(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { struct Client *target; if (parc < 3) return need_more_params(sptr, "FAKEHOST"); /* Locate our target user; ignore the message if we can't */ if(!(target = findNUser(parv[1]))) return 0; /* Ignore the assignment if it changes nothing */ if (HasFakeHost(target) && ircd_strcmp(cli_user(target)->fakehost, parv[2]) == 0) { return 0; } /* Assign and propagate the fakehost */ SetFakeHost(target); ircd_strncpy(cli_user(target)->fakehost, parv[2], HOSTLEN); hide_hostmask(target); sendcmdto_serv_butone(sptr, CMD_FAKEHOST, cptr, "%C %s", target, cli_user(target)->fakehost); return 0; }
/* * ms_account - server message handler * * parv[0] = sender prefix * parv[1] = numeric of client to act on * parv[2] = account name (12 characters or less) */ int ms_account(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { struct Client *acptr; int hidden; if (parc < 3) return need_more_params(sptr, "ACCOUNT"); if (!IsServer(sptr)) return protocol_violation(cptr, "ACCOUNT from non-server %s", cli_name(sptr)); if (!(acptr = findNUser(parv[1]))) return 0; /* Ignore ACCOUNT for a user that QUIT; probably crossed */ if (IsAccount(acptr)) return protocol_violation(cptr, "ACCOUNT for already registered user %s " "(%s -> %s)", cli_name(acptr), cli_user(acptr)->account, parv[2]); assert(0 == cli_user(acptr)->account[0]); if (strlen(parv[2]) > ACCOUNTLEN) { return protocol_violation(cptr, "Received account (%s) longer than %d for %s; ignoring.", parv[2], ACCOUNTLEN, cli_name(acptr)); } if (parc > 3) { cli_user(acptr)->acc_create = atoi(parv[3]); Debug((DEBUG_DEBUG, "Received timestamped account: account \"%s\", " "timestamp %Tu", parv[2], cli_user(acptr)->acc_create)); } hidden = HasHiddenHost(acptr); SetAccount(acptr); ircd_strncpy(cli_user(acptr)->account, parv[2], ACCOUNTLEN); if (!hidden) hide_hostmask(acptr); sendcmdto_serv_butone(sptr, CMD_ACCOUNT, cptr, cli_user(acptr)->acc_create ? "%C %s %Tu" : "%C %s", acptr, cli_user(acptr)->account, cli_user(acptr)->acc_create); return 0; }
/* * m_fakehost - fakehost user message handler * * parv[0] = sender prefix * parv[1] = new fake host */ int m_fakehost(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { if (!HasPriv(sptr, PRIV_SET_FAKEHOST)) return send_reply(sptr, ERR_NOPRIVILEGES); if (parc < 2) return need_more_params(sptr, "FAKEHOST"); /* Ignore the assignment if it changes nothing */ if (HasFakeHost(cptr) && ircd_strcmp(cli_user(cptr)->fakehost, parv[1]) == 0) { return 0; } /* Assign and propagate the fakehost */ SetFakeHost(cptr); ircd_strncpy(cli_user(cptr)->fakehost, parv[1], HOSTLEN); hide_hostmask(cptr); sendcmdto_serv_butone(sptr, CMD_FAKEHOST, cptr, "%C %s", sptr, cli_user(cptr)->fakehost); return 0; }
void do_oper(struct Client* cptr, struct Client* sptr, struct ConfItem* aconf) { struct Flags old_mode = cli_flags(sptr); char* modes; char* parv[2]; char* join[3]; char chan[CHANNELLEN-1]; char* ajoinchan; char* ajoinnotice; unsigned int snomask = 0; parv[0] = cli_name(sptr); parv[1] = NULL; SetOper(sptr); client_set_privs(sptr, aconf); ClearOper(sptr); snomask = ConfSnoMask(aconf) & SNO_ALL; snomask |= aconf->snomask & SNO_ALL; ajoinchan = ConfAjoinChan(aconf); ajoinnotice = ConfAjoinNotice(aconf); if (MyUser(sptr)) { SetLocOp(sptr); if (HasPriv(sptr, PRIV_PROPAGATE)) { ClearLocOp(sptr); SetOper(sptr); if (HasPriv(sptr, PRIV_ADMIN)) SetAdmin(sptr); if (!IsHideOper(sptr) && !IsChannelService(sptr) && !IsBot(sptr)) ++UserStats.opers; } cli_handler(sptr) = OPER_HANDLER; SetFlag(sptr, FLAG_WALLOP); SetFlag(sptr, FLAG_SERVNOTICE); SetFlag(sptr, FLAG_DEBUG); if (snomask) set_snomask(sptr, snomask, SNO_ADD); else set_snomask(sptr, feature_int(FEAT_SNOMASK_OPERDEFAULT), SNO_ADD); cli_max_sendq(sptr) = 0; /* Get the sendq from the oper's class */ cli_max_recvq(sptr) = 0; /* Get the recvq from the oper's class */ cli_lag_min(sptr) = -2; /* Get the fake lag minimum from the oper's class */ cli_lag_factor(sptr) = -2; /* Get the fake lag factor from the oper's class */ send_umode_out(sptr, sptr, &old_mode, HasPriv(sptr, PRIV_PROPAGATE)); } else { client_send_privs(&me, sptr, sptr); if (HasPriv(sptr, PRIV_PROPAGATE)) { modes = (HasPriv(sptr, PRIV_ADMIN) ? "aowsg" : "owsg"); } else { modes = "Owsg"; } sendcmdto_one(&me, CMD_MODE, sptr, "%s %s", cli_name(sptr), modes); } modes = ConfUmode(aconf); if (modes) { if (MyUser(sptr)) { char *umodev[] = { NULL, NULL, NULL, NULL }; umodev[1] = cli_name(sptr); umodev[2] = modes; old_mode = cli_flags(sptr); set_user_mode(sptr, sptr, 3, umodev, ALLOWMODES_ANY); send_umode(NULL, sptr, &old_mode, HasPriv(sptr, PRIV_PROPAGATE)); if ((cli_snomask(sptr) != feature_int(FEAT_SNOMASK_OPERDEFAULT)) && HasFlag(sptr, FLAG_SERVNOTICE)) send_reply(sptr, RPL_SNOMASK, cli_snomask(sptr), cli_snomask(sptr)); } else { if (snomask) sendcmdto_one(&me, CMD_MODE, sptr, "%s %s+s +%d", cli_name(sptr), modes, snomask); else sendcmdto_one(&me, CMD_MODE, sptr, "%s %s", cli_name(sptr), modes); } } send_reply(sptr, RPL_YOUREOPER); if ((feature_int(FEAT_HOST_HIDING_STYLE) == 1) || (feature_int(FEAT_HOST_HIDING_STYLE) == 3)) hide_hostmask(sptr); if (!EmptyString(ajoinchan)) { if (!EmptyString(ajoinnotice)) sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :%s", sptr, ajoinnotice); ircd_strncpy(chan, ajoinchan, CHANNELLEN-1); join[0] = cli_name(sptr); join[1] = chan; join[2] = NULL; m_join(sptr, sptr, 2, join); } if (!EmptyString(aconf->autojoinchan)) { if (!EmptyString(aconf->autojoinnotice)) sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :%s", sptr, aconf->autojoinnotice); ircd_strncpy(chan, aconf->autojoinchan, CHANNELLEN-1); join[0] = cli_name(sptr); join[1] = chan; join[2] = NULL; m_join(sptr, sptr, 2, join); } sendto_opmask_butone_global((MyUser(sptr) ? &me : NULL), SNO_OLDSNO, "%s (%s@%s) is now operator (%c)", cli_name(sptr), cli_user(sptr)->username, cli_user(sptr)->realhost, IsOper(sptr) ? 'O' : 'o'); if (feature_bool(FEAT_OPERMOTD)) m_opermotd(sptr, sptr, 1, parv); log_write(LS_OPER, L_INFO, 0, "OPER (%s) by (%#C)", aconf->name, sptr); }