void ns_cmd_ghost(sourceinfo_t *si, int parc, char *parv[]) { myuser_t *mu; char *target = parv[0]; char *password = parv[1]; user_t *target_u; mynick_t *mn; if (!target) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "GHOST"); command_fail(si, fault_needmoreparams, _("Syntax: GHOST <target> [password]")); return; } if (nicksvs.no_nick_ownership) mn = NULL, mu = myuser_find(target); else { mn = mynick_find(target); mu = mn != NULL ? mn->owner : NULL; } target_u = user_find_named(target); if (!target_u) { command_fail(si, fault_nosuch_target, _("\2%s\2 is not online."), target); return; } else if (!mu && !target_u->myuser) { command_fail(si, fault_nosuch_target, _("\2%s\2 is not a registered nickname."), target); return; } else if (target_u == si->su) { command_fail(si, fault_badparams, _("You may not ghost yourself.")); return; } /* At this point, we're now checking metadata associated with the target's account. * If the target nick is unregistered, mu will be unset thus far. */ if (target_u->myuser && !mu) mu = target_u->myuser; if (password && metadata_find(mu, "private:freeze:freezer")) { command_fail(si, fault_authfail, "You cannot ghost users as \2%s\2 because the account has been frozen.", entity(mu)->name); logcommand(si, CMDLOG_DO, "failed GHOST \2%s\2 (frozen)", target); return; } if (password && (mu->flags & MU_NOPASSWORD)) { command_fail(si, fault_authfail, _("Password authentication is disabled for this account.")); logcommand(si, CMDLOG_DO, "failed GHOST \2%s\2 (password authentication disabled)", target); return; } if ((target_u->myuser && target_u->myuser == si->smu) || /* they're identified under our account */ (!nicksvs.no_nick_ownership && mn && mu == si->smu) || /* we're identified under their nick's account */ (!nicksvs.no_nick_ownership && password && verify_password(mu, password))) /* we have the correct password */ { logcommand(si, CMDLOG_DO, "GHOST: \2%s!%s@%s\2", target_u->nick, target_u->user, target_u->vhost); kill_user(si->service->me, target_u, "GHOST command used by %s", si->su != NULL && !strcmp(si->su->user, target_u->user) && !strcmp(si->su->vhost, target_u->vhost) ? si->su->nick : get_source_mask(si)); command_success_nodata(si, _("\2%s\2 has been ghosted."), target); /* Update the account's last seen time. * Perhaps the ghosted nick belonged to someone else, but we were identified to it? * Try this first. */ if (target_u->myuser && target_u->myuser == si->smu) target_u->myuser->lastlogin = CURRTIME; else mu->lastlogin = CURRTIME; return; } if (password) { logcommand(si, CMDLOG_DO, "failed GHOST \2%s\2 (bad password)", target); command_fail(si, fault_authfail, _("Invalid password for \2%s\2."), entity(mu)->name); bad_password(si, mu); } else { logcommand(si, CMDLOG_DO, "failed GHOST \2%s\2 (invalid login)", target); command_fail(si, fault_noprivs, _("You may not ghost \2%s\2."), target); } }
void ns_cmd_regain(sourceinfo_t *si, int parc, char *parv[]) { myuser_t *mu; char *target = parv[0]; char *password = parv[1]; user_t *target_u; mynick_t *mn; if (si->su == NULL) { command_fail(si, fault_noprivs, _("\2%s\2 can only be executed via IRC."), "REGAIN"); return; } if (!target) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "REGAIN"); command_fail(si, fault_needmoreparams, _("Syntax: REGAIN <target> [password]")); return; } if (nicksvs.no_nick_ownership) mn = NULL, mu = myuser_find(target); else { mn = mynick_find(target); mu = mn != NULL ? mn->owner : NULL; } target_u = user_find_named(target); if (!mu) { command_fail(si, fault_nosuch_target, _("\2%s\2 is not a registered nickname."), target); return; } if (!target_u) { command_fail(si, fault_nosuch_target, _("\2%s\2 is not online."), target); return; } else if (target_u == si->su) { command_fail(si, fault_badparams, _("You may not ghost yourself.")); return; } if ((!nicksvs.no_nick_ownership && mn && mu == si->smu) || /* we're identified under their nick's account */ (!nicksvs.no_nick_ownership && password && mn && verify_password(mu, password))) /* we have their nick's password */ { logcommand(si, CMDLOG_DO, "REGAIN %s!%s@%s", target_u->nick, target_u->user, target_u->vhost); kill_user(si->service->me, target_u, "REGAIN command used by %s", si->su != NULL && !strcmp(si->su->user, target_u->user) && !strcmp(si->su->vhost, target_u->vhost) ? si->su->nick : get_source_mask(si)); command_success_nodata(si, _("\2%s\2 has been regained."), target); fnc_sts(si->service->me, si->su, target, FNC_REGAIN); /* don't update the nick's last seen time */ mu->lastlogin = CURRTIME; return; } if (password && mu) { logcommand(si, CMDLOG_DO, "failed REGAIN %s (bad password)", target); command_fail(si, fault_authfail, _("Invalid password for \2%s\2."), mu->name); } else { logcommand(si, CMDLOG_DO, "failed REGAIN %s (invalid login)", target); command_fail(si, fault_noprivs, _("You may not regain \2%s\2."), target); } }
void ns_cmd_ghost(sourceinfo_t *si, int parc, char *parv[]) { myuser_t *mu; char *target = parv[0]; char *password = parv[1]; user_t *target_u; mynick_t *mn; if (!target) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "GHOST"); command_fail(si, fault_needmoreparams, _("Syntax: GHOST <target> [password]")); return; } if (nicksvs.no_nick_ownership) mn = NULL, mu = myuser_find(target); else { mn = mynick_find(target); mu = mn != NULL ? mn->owner : NULL; } target_u = user_find_named(target); if (!mu && (!target_u || !target_u->myuser)) { command_fail(si, fault_nosuch_target, _("\2%s\2 is not a registered nickname."), target); return; } if (!target_u) { command_fail(si, fault_nosuch_target, _("\2%s\2 is not online."), target); return; } else if (target_u == si->su) { command_fail(si, fault_badparams, _("You may not ghost yourself.")); return; } if (password && metadata_find(mu, "private:freeze:freezer")) { command_fail(si, fault_authfail, "You cannot ghost users as \2%s\2 because the account has been frozen.", entity(mu)->name); logcommand(si, CMDLOG_DO, "failed GHOST \2%s\2 (frozen)", target); return; } if ((target_u->myuser && target_u->myuser == si->smu) || /* they're identified under our account */ (!nicksvs.no_nick_ownership && mn && mu == si->smu) || /* we're identified under their nick's account */ (!nicksvs.no_nick_ownership && password && mn && verify_password(mu, password))) /* we have their nick's password */ { /* If we're ghosting an unregistered nick, mu will be unset, * however if it _is_ registered, we still need to set it or * the wrong user will have their last seen time updated... */ if(target_u->myuser && target_u->myuser == si->smu) mu = target_u->myuser; logcommand(si, CMDLOG_DO, "GHOST: \2%s!%s@%s\2", target_u->nick, target_u->user, target_u->vhost); kill_user(si->service->me, target_u, "GHOST command used by %s", si->su != NULL && !strcmp(si->su->user, target_u->user) && !strcmp(si->su->vhost, target_u->vhost) ? si->su->nick : get_source_mask(si)); command_success_nodata(si, _("\2%s\2 has been ghosted."), target); /* don't update the nick's last seen time */ mu->lastlogin = CURRTIME; return; } if (password && mu) { logcommand(si, CMDLOG_DO, "failed GHOST \2%s\2 (bad password)", target); command_fail(si, fault_authfail, _("Invalid password for \2%s\2."), entity(mu)->name); bad_password(si, mu); } else { logcommand(si, CMDLOG_DO, "failed GHOST \2%s\2 (invalid login)", target); command_fail(si, fault_noprivs, _("You may not ghost \2%s\2."), target); } }