/** * The /cs clear command. * @param u The user who issued the command * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing. **/ int do_clear(User * u) { char *chan = strtok(NULL, " "); char *what = strtok(NULL, " "); char tmp[BUFSIZE]; Channel *c; ChannelInfo *ci; if (!what) { syntax_error(s_ChanServ, u, "CLEAR", CHAN_CLEAR_SYNTAX); } else if (!(c = findchan(chan))) { notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan); } else if (!(ci = c->ci)) { notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); } else if (ci->flags & CI_VERBOTEN) { notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); } else if (!u || !check_access(u, ci, CA_CLEAR)) { notice_lang(s_ChanServ, u, PERMISSION_DENIED); } else if (stricmp(what, "bans") == 0) { char *av[2]; int i; /* Save original ban info */ int count = c->bancount; char **bans = scalloc(sizeof(char *) * count, 1); for (i = 0; i < count; i++) bans[i] = sstrdup(c->bans[i]); for (i = 0; i < count; i++) { av[0] = sstrdup("-b"); av[1] = bans[i]; anope_cmd_mode(whosends(ci), chan, "%s %s", av[0], av[1]); chan_set_modes(whosends(ci), c, 2, av, 0); free(av[1]); free(av[0]); } notice_lang(s_ChanServ, u, CHAN_CLEARED_BANS, chan); free(bans); } else if (ircd->except && stricmp(what, "excepts") == 0) { char *av[2]; int i; /* Save original except info */ int count = c->exceptcount; char **excepts = scalloc(sizeof(char *) * count, 1); for (i = 0; i < count; i++) excepts[i] = sstrdup(c->excepts[i]); for (i = 0; i < count; i++) { av[0] = sstrdup("-e"); av[1] = excepts[i]; anope_cmd_mode(whosends(ci), chan, "%s %s", av[0], av[1]); chan_set_modes(whosends(ci), c, 2, av, 0); free(av[1]); free(av[0]); } notice_lang(s_ChanServ, u, CHAN_CLEARED_EXCEPTS, chan); free(excepts); } else if (ircd->invitemode && stricmp(what, "invites") == 0) { char *av[2]; int i; /* Save original except info */ int count = c->invitecount; char **invites = scalloc(sizeof(char *) * count, 1); for (i = 0; i < count; i++) invites[i] = sstrdup(c->invite[i]); for (i = 0; i < count; i++) { av[0] = sstrdup("-I"); av[1] = invites[i]; anope_cmd_mode(whosends(ci), chan, "%s %s", av[0], av[1]); chan_set_modes(whosends(ci), c, 2, av, 0); free(av[1]); free(av[0]); } notice_lang(s_ChanServ, u, CHAN_CLEARED_INVITES, chan); free(invites); } else if (stricmp(what, "modes") == 0) { char buf[BUFSIZE], *end = buf; char *argv[2]; if (c->mode) { /* Clear modes the bulk of the modes */ anope_cmd_mode(whosends(ci), c->name, "%s", ircd->modestoremove); argv[0] = sstrdup(ircd->modestoremove); chan_set_modes(whosends(ci), c, 1, argv, 0); free(argv[0]); /* to prevent the internals from complaining send -k, -L, -f by themselves if we need to send them - TSL */ if (c->key) { anope_cmd_mode(whosends(ci), c->name, "-k %s", c->key); argv[0] = sstrdup("-k"); argv[1] = c->key; chan_set_modes(whosends(ci), c, 2, argv, 0); free(argv[0]); } if (ircd->Lmode && c->redirect) { anope_cmd_mode(whosends(ci), c->name, "-L %s", c->redirect); argv[0] = sstrdup("-L"); argv[1] = c->redirect; chan_set_modes(whosends(ci), c, 2, argv, 0); free(argv[0]); } if (ircd->fmode && c->flood) { if (flood_mode_char_remove) { anope_cmd_mode(whosends(ci), c->name, "%s %s", flood_mode_char_remove, c->flood); argv[0] = sstrdup(flood_mode_char_remove); argv[1] = c->flood; chan_set_modes(whosends(ci), c, 2, argv, 0); free(argv[0]); } else { if (debug) { alog("debug: flood_mode_char_remove was not set unable to remove flood/throttle modes"); } } } check_modes(c); } /* TODO: decide if the above implementation is better than this one. */ if (0) { CBModeInfo *cbmi = cbmodeinfos; CBMode *cbm; do { if (c->mode & cbmi->flag) *end++ = cbmi->mode; } while ((++cbmi)->flag != 0); cbmi = cbmodeinfos; do { if (cbmi->getvalue && (c->mode & cbmi->flag) && !(cbmi->flags & CBM_MINUS_NO_ARG)) { char *value = cbmi->getvalue(c); if (value) { *end++ = ' '; while (*value) *end++ = *value++; /* Free the value */ cbm = &cbmodes[(int) cbmi->mode]; cbm->setvalue(c, NULL); } } } while ((++cbmi)->flag != 0); *end = 0; anope_cmd_mode(whosends(ci), c->name, "-%s", buf); c->mode = 0; check_modes(c); } notice_lang(s_ChanServ, u, CHAN_CLEARED_MODES, chan); } else if (stricmp(what, "ops") == 0) { char *av[3]; struct c_userlist *cu, *next; if (ircd->svsmode_ucmode) { av[0] = sstrdup(chan); anope_cmd_svsmode_chan(av[0], "-o", NULL); if (ircd->owner) { anope_cmd_svsmode_chan(av[0], ircd->ownerunset, NULL); } if (ircd->protect || ircd->admin) { anope_cmd_svsmode_chan(av[0], ircd->adminunset, NULL); } for (cu = c->users; cu; cu = next) { next = cu->next; av[0] = sstrdup(chan); if (!chan_has_user_status(c, cu->user, CUS_OP)) { if (!chan_has_user_status(c, cu->user, CUS_PROTECT)) { if (!chan_has_user_status(c, cu->user, CUS_OWNER)) { continue; } else { snprintf(tmp, BUFSIZE, "%so", ircd->ownerunset); av[1] = sstrdup(tmp); } } else { snprintf(tmp, BUFSIZE, "%so", ircd->adminunset); av[1] = sstrdup(tmp); } } else { av[1] = sstrdup("-o"); } av[2] = sstrdup(cu->user->nick); do_cmode(s_ChanServ, 3, av); free(av[2]); free(av[1]); free(av[0]); } } else { for (cu = c->users; cu; cu = next) { next = cu->next; av[0] = sstrdup(chan); if (!chan_has_user_status(c, cu->user, CUS_OP)) { if (!chan_has_user_status(c, cu->user, CUS_PROTECT)) { if (!chan_has_user_status(c, cu->user, CUS_OWNER)) { continue; } else { snprintf(tmp, BUFSIZE, "%so", ircd->ownerunset); av[1] = sstrdup(tmp); } } else { snprintf(tmp, BUFSIZE, "%so", ircd->adminunset); av[1] = sstrdup(tmp); } } else { av[1] = sstrdup("-o"); } av[2] = sstrdup(cu->user->nick); anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], av[2]); do_cmode(s_ChanServ, 3, av); free(av[2]); free(av[1]); free(av[0]); } } notice_lang(s_ChanServ, u, CHAN_CLEARED_OPS, chan); } else if (ircd->halfop && stricmp(what, "hops") == 0) { char *av[3]; struct c_userlist *cu, *next; for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) continue; av[0] = sstrdup(chan); av[1] = sstrdup("-h"); av[2] = sstrdup(cu->user->nick); if (ircd->svsmode_ucmode) { anope_cmd_svsmode_chan(av[0], av[1], NULL); do_cmode(s_ChanServ, 3, av); break; } else { anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], av[2]); } do_cmode(s_ChanServ, 3, av); free(av[2]); free(av[1]); free(av[0]); } notice_lang(s_ChanServ, u, CHAN_CLEARED_HOPS, chan); } else if (stricmp(what, "voices") == 0) { char *av[3]; struct c_userlist *cu, *next; for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_VOICE)) continue; av[0] = sstrdup(chan); av[1] = sstrdup("-v"); av[2] = sstrdup(cu->user->nick); if (ircd->svsmode_ucmode) { anope_cmd_svsmode_chan(av[0], av[1], NULL); do_cmode(s_ChanServ, 3, av); break; } else { anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], av[2]); } do_cmode(s_ChanServ, 3, av); free(av[2]); free(av[1]); free(av[0]); } notice_lang(s_ChanServ, u, CHAN_CLEARED_VOICES, chan); } else if (stricmp(what, "users") == 0) { char *av[3]; struct c_userlist *cu = NULL, *next = NULL; char buf[256]; snprintf(buf, sizeof(buf), "CLEAR USERS command from %s", u->nick); for (cu = c->users; cu; cu = next) { next = cu->next; if ((cu->user->mode & UMODE_q)) { continue; } av[0] = sstrdup(chan); av[1] = sstrdup(cu->user->nick); av[2] = sstrdup(buf); anope_cmd_kick(whosends(ci), av[0], av[1], av[2]); do_kick(s_ChanServ, 3, av); free(av[2]); free(av[1]); free(av[0]); } notice_lang(s_ChanServ, u, CHAN_CLEARED_USERS, chan); } else { syntax_error(s_ChanServ, u, "CLEAR", CHAN_CLEAR_SYNTAX); } return MOD_CONT; }
int do_clear(User *u, Channel *c, int type) { /* 1= Modes * 2= Bans * 3= Excepts * 4= Invites * 5= Ops * 6= Hops * 7= Voices * 8= Users */ char tmp[BUFSIZE]; /* Clear Channel Modes */ if (type == 1) { char *argv[2]; notice(c->ci->bi->nick, c->name, "CLEAR MODES command from %s", u->nick); if (c->mode) { /* Clear modes the bulk of the modes */ xanadu_cmd_mode(c->ci->bi->nick, c->name, "%s", ircd->modestoremove); argv[0] = sstrdup(ircd->modestoremove); chan_set_modes(c->ci->bi->nick, c, 1, argv, 0); free(argv[0]); if (c->key) { xanadu_cmd_mode(c->ci->bi->nick, c->name, "-k %s", c->key); argv[0] = sstrdup("-k"); argv[1] = c->key; chan_set_modes(c->ci->bi->nick, c, 2, argv, 0); free(argv[0]); } if (ircd->Lmode && c->redirect) { xanadu_cmd_mode(c->ci->bi->nick, c->name, "-L %s", c->redirect); argv[0] = sstrdup("-L"); argv[1] = c->redirect; chan_set_modes(c->ci->bi->nick, c, 2, argv, 0); free(argv[0]); } if (ircd->fmode && c->flood) { if (flood_mode_char_remove) { xanadu_cmd_mode(c->ci->bi->nick, c->name, "%s %s", flood_mode_char_remove, c->flood); argv[0] = sstrdup(flood_mode_char_remove); argv[1] = c->flood; chan_set_modes(c->ci->bi->nick, c, 2, argv, 0); free(argv[0]); } } check_modes(c); } /* Clear Channel Bans */ } else if (type == 2) { char *av[2]; int i, count = c->bancount; char **bans = scalloc(sizeof(char *) * count, 1); /*count = c->bancount;*/ notice(c->ci->bi->nick, c->name, "CLEAR BANS command from %s", u->nick); /* Save original ban info */ for (i = 0; i < count; i++) bans[i] = sstrdup(c->bans[i]); if (ircd->svsmode_ucmode) { xanadu_cmd_svsmode_chan(c->name, "-b", NULL); for (i = 0; i < count; i++) { av[0] = sstrdup("-b"); av[1] = bans[i]; chan_set_modes(c->ci->bi->nick, c, 2, av, 0); free(av[0]); free(av[1]); } } else { for (i = 0; i < count; i++) { av[0] = sstrdup("-b"); av[1] = bans[i]; xanadu_cmd_mode(c->ci->bi->nick, c->name, "%s %s", av[0], av[1]); chan_set_modes(c->ci->bi->nick, c, 2, av, 0); free(av[0]); free(av[1]); } } free(bans); /* Clear Channel Excepts */ } else if (ircd->except && type == 3) { char *av[2]; int i, count = c->exceptcount; char **excepts = scalloc(sizeof(char *) * count, 1); notice(c->ci->bi->nick, c->name, "CLEAR EXCEPTS command from %s", u->nick); /* Save original except info */ for (i = 0; i < count; i++) excepts[i] = sstrdup(c->excepts[i]); if (ircd->svsmode_ucmode) { xanadu_cmd_svsmode_chan(c->name, "-e", NULL); for (i = 0; i < count; i++) { av[0] = sstrdup("-e"); av[1] = excepts[i]; chan_set_modes(c->ci->bi->nick, c, 2, av, 0); free(av[1]); free(av[0]); } } else { for (i = 0; i < count; i++) { av[0] = sstrdup("-e"); av[1] = excepts[i]; xanadu_cmd_mode(c->ci->bi->nick, c->name, "%s %s", av[0], av[1]); chan_set_modes(c->ci->bi->nick, c, 2, av, 0); free(av[1]); free(av[0]); } } free(excepts); } else if (!(ircd->except) && type == 3) { moduleNoticeLang(c->ci->bi->nick, u, LANG_EXCEPTS_UNSUPPORTED); /* Clear Channel Invites */ } else if (ircd->invitemode && type == 4) { char *av[2]; int i, count = c->invitecount; char **invites = scalloc(sizeof(char *) * count, 1); notice(c->ci->bi->nick, c->name, "CLEAR INVITES command from %s", u->nick); /* Save original invite info */ for (i = 0; i < count; i++) invites[i] = sstrdup(c->invite[i]); if (ircd->svsmode_ucmode) { xanadu_cmd_svsmode_chan(c->name, "-I", NULL); for (i = 0; i < count; i++) { av[0] = sstrdup("-I"); av[1] = invites[i]; chan_set_modes(c->ci->bi->nick, c, 2, av, 0); free(av[1]); free(av[0]); } } else { for (i = 0; i < count; i++) { av[0] = sstrdup("-I"); av[1] = invites[i]; xanadu_cmd_mode(c->ci->bi->nick, c->name, "%s %s", av[0], av[1]); chan_set_modes(c->ci->bi->nick, c, 2, av, 0); free(av[1]); free(av[0]); } } free(invites); } else if (!(ircd->invitemode) && type == 4) { moduleNoticeLang(c->ci->bi->nick, u, LANG_INVITEMODE_UNSUPPORTED); /* Clear Channel OPs */ } else if (type == 5) { char *av[4]; struct c_userlist *cu, *next; char buf[BUFSIZE]; int ac; notice(c->ci->bi->nick, c->name, "CLEAR OPS command from %s", u->nick); av[0] = c->name; if (ircd->svsmode_ucmode) { xanadu_cmd_svsmode_chan(c->name, "-o", NULL); if (ircd->owner) { xanadu_cmd_svsmode_chan(c->name, ircd->ownerunset, NULL); } if (ircd->protect || ircd->admin) { xanadu_cmd_svsmode_chan(c->name, ircd->adminunset, NULL); } for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_OP)) { if (!chan_has_user_status(c, cu->user, CUS_PROTECT)) { if (!chan_has_user_status(c, cu->user, CUS_OWNER)) { continue; } else { snprintf(tmp, BUFSIZE, "%so", ircd->ownerunset); } } else { snprintf(tmp, BUFSIZE, "%so", ircd->adminunset); } } else { snprintf(tmp, BUFSIZE, "-o"); } if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[2] = tmp; av[3] = cu->user->nick; ac = 4; } else { av[1] = tmp; av[2] = cu->user->nick; ac = 3; } do_cmode(c->ci->bi->nick, ac, av); } } else { for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_OP)) { if (!chan_has_user_status(c, cu->user, CUS_PROTECT)) { if (!chan_has_user_status(c, cu->user, CUS_OWNER)) { continue; } else { snprintf(tmp, BUFSIZE, "%so", ircd->ownerunset); } } else { snprintf(tmp, BUFSIZE, "%so", ircd->adminunset); } } else { snprintf(tmp, BUFSIZE, "-o"); } if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[2] = tmp; av[3] = cu->user->nick; ac = 4; } else { av[1] = tmp; av[2] = cu->user->nick; ac = 3; } xanadu_cmd_mode(c->ci->bi->nick, c->name, "%s :%s", tmp, cu->user->nick); do_cmode(c->ci->bi->nick, ac, av); } } /* Clear Channel HOPs */ } else if (ircd->halfop && type == 6) { char *av[4]; struct c_userlist *cu, *next; char buf[BUFSIZE]; int ac; notice(c->ci->bi->nick, c->name, "CLEAR HOPS command from %s", u->nick); av[0] = c->name; if (ircdcap->tsmode) av[2] = sstrdup("-h"); else av[1] = sstrdup("-h"); if (ircd->svsmode_ucmode) { xanadu_cmd_svsmode_chan(c->name, "-h", NULL); for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) continue; if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[3] = cu->user->nick; ac = 4; } else { av[2] = cu->user->nick; ac = 3; } do_cmode(c->ci->bi->nick, ac, av); } } else { for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) continue; if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[3] = cu->user->nick; ac = 4; } else { av[2] = cu->user->nick; ac = 3; } xanadu_cmd_mode(c->ci->bi->nick, c->name, "-h :%s", cu->user->nick); do_cmode(c->ci->bi->nick, ac, av); } } if (ircdcap->tsmode) free(av[2]); else free(av[1]); } else if (!(ircd->halfop) && type == 6) { moduleNoticeLang(c->ci->bi->nick, u, LANG_HOPS_UNSUPPORTED); /* Clear Channel Voices */ } else if (type == 7) { char *av[4]; struct c_userlist *cu, *next; char buf[BUFSIZE]; int ac; notice(c->ci->bi->nick, c->name, "CLEAR VOICES command from %s", u->nick); av[0] = c->name; if (ircdcap->tsmode) av[2] = sstrdup("-v"); else av[1] = sstrdup("-v"); if (ircd->svsmode_ucmode) { xanadu_cmd_svsmode_chan(av[0], "-v", NULL); for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_VOICE)) continue; if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[3] = cu->user->nick; ac = 4; } else { av[2] = cu->user->nick; ac = 3; } do_cmode(c->ci->bi->nick, ac, av); } } else { for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_VOICE)) continue; if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[3] = cu->user->nick; ac = 4; } else { av[2] = cu->user->nick; ac = 3; } xanadu_cmd_mode(c->ci->bi->nick, c->name, "-v :%s", cu->user->nick); do_cmode(c->ci->bi->nick, ac, av); } } if (ircdcap->tsmode) free(av[2]); else free(av[1]); /* Clear Channel Users */ } else if (type == 8) { char *av[3]; struct c_userlist *cu, *next; char buf[256]; snprintf(buf, sizeof(buf), "CLEAR USERS command from %s", u->nick); notice(c->ci->bi->nick, c->name, buf); av[0] = c->name; av[2] = buf; for (cu = c->users; cu; cu = next) { next = cu->next; av[1] = cu->user->nick; xanadu_cmd_kick(c->ci->bi->nick, av[0], av[1], av[2]); do_kick(c->ci->bi->nick, 3, av); } } /* Should NEVER happen, therefor if it does, stop processing */ else { alog("[bs_fantasy_ext] An error has occured while processing CLEAR !!!"); return MOD_STOP; } return MOD_CONT; }
int do_clear(User *u, Channel *c, int type) { /* 1= Modes * 2= Bans * 3= Excepts * 4= Invites * 5= Ops * 6= Hops * 7= Voices * 8= Users */ /* Clear Channel Modes */ if (type == 1) { char *argv[2]; notice(c->ci->bi->nick, c->name, "CLEAR MODES command from %s", u->nick); if (c->mode) { /* Clear modes the bulk of the modes */ anope_cmd_mode(c->ci->bi->nick, c->name, "%s", ircd->modestoremove); argv[0] = sstrdup(ircd->modestoremove); chan_set_modes(c->ci->bi->nick, c, 1, argv, 0); free(argv[0]); if (c->key) { anope_cmd_mode(c->ci->bi->nick, c->name, "-k %s", c->key); argv[0] = sstrdup("-k"); argv[1] = c->key; chan_set_modes(c->ci->bi->nick, c, 2, argv, 0); free(argv[0]); } if (ircd->Lmode && c->redirect) { anope_cmd_mode(c->ci->bi->nick, c->name, "-L %s", c->redirect); argv[0] = sstrdup("-L"); argv[1] = c->redirect; chan_set_modes(c->ci->bi->nick, c, 2, argv, 0); free(argv[0]); } if (ircd->fmode && c->flood) { if (flood_mode_char_remove) { anope_cmd_mode(c->ci->bi->nick, c->name, "%s %s", flood_mode_char_remove, c->flood); argv[0] = sstrdup(flood_mode_char_remove); argv[1] = c->flood; chan_set_modes(c->ci->bi->nick, c, 2, argv, 0); free(argv[0]); } } check_modes(c); } /* Clear Channel Bans */ } else if (type == 2) { char *av[2]; Entry *ban, *next; notice(c->ci->bi->nick, c->name, "CLEAR BANS command from %s", u->nick); if (c->bans && c->bans->count) { if (ircd->svsmode_ucmode) { anope_cmd_svsmode_chan(c->name, "-b", NULL); av[0] = "-b"; for (ban = c->bans->entries; ban; ban = next) { next = ban->next; av[1] = ban->mask; chan_set_modes(c->ci->bi->nick, c, 2, av, 0); } } else { av[0] = "-b"; for (ban = c->bans->entries; ban; ban = next) { next = ban->next; av[1] = ban->mask; anope_cmd_mode(c->ci->bi->nick, c->name, "%s %s", av[0], av[1]); chan_set_modes(c->ci->bi->nick, c, 2, av, 0); } } } /* Clear Channel Excepts */ } else if (ircd->except && type == 3) { char *av[2]; Entry *except, *next; notice(c->ci->bi->nick, c->name, "CLEAR EXCEPTS command from %s", u->nick); if (c->excepts && c->excepts->count) { if (ircd->svsmode_ucmode) { anope_cmd_svsmode_chan(c->name, "-e", NULL); av[0] = "-e"; for (except = c->excepts->entries; except; except = next) { next = except->next; av[1] = except->mask; chan_set_modes(c->ci->bi->nick, c, 2, av, 0); } } else { av[0] = "-e"; for (except = c->excepts->entries; except; except = next) { next = except->next; av[1] = except->mask; anope_cmd_mode(c->ci->bi->nick, c->name, "%s %s", av[0], av[1]); chan_set_modes(c->ci->bi->nick, c, 2, av, 0); } } } } else if (!(ircd->except) && type == 3) { noticeLang(c->ci->bi->nick, u, LANG_EXCEPTS_UNSUPPORTED); /* Clear Channel Invites */ } else if (ircd->invitemode && type == 4) { char *av[2]; Entry *invite, *next; notice(c->ci->bi->nick, c->name, "CLEAR INVITES command from %s", u->nick); if (c->invites && c->invites->count) { if (ircd->svsmode_ucmode) { anope_cmd_svsmode_chan(c->name, "-e", NULL); av[0] = "-I"; for (invite = c->invites->entries; invite; invite = next) { next = invite->next; av[1] = invite->mask; chan_set_modes(c->ci->bi->nick, c, 2, av, 0); } } else { av[0] = "-I"; for (invite = c->invites->entries; invite; invite = next) { next = invite->next; av[1] = invite->mask; anope_cmd_mode(c->ci->bi->nick, c->name, "%s %s", av[0], av[1]); chan_set_modes(c->ci->bi->nick, c, 2, av, 0); } } } } else if (!(ircd->invitemode) && type == 4) { noticeLang(c->ci->bi->nick, u, LANG_INVITEMODE_UNSUPPORTED); /* Clear Channel OPs */ } else if (type == 5) { char *av[6]; /* The max we have to hold: chan, ts, modes(max3), nick, nick, nick */ int ac, isop, isadmin, isown, count, i; char buf[BUFSIZE], tmp[BUFSIZE], tmp2[BUFSIZE]; struct c_userlist *cu, *next; notice(c->ci->bi->nick, c->name, "CLEAR OPS command from %s", u->nick); av[0] = c->name; if (ircd->svsmode_ucmode) { anope_cmd_svsmode_chan(c->name, "-o", NULL); if (ircd->owner) { anope_cmd_svsmode_chan(c->name, ircd->ownerunset, NULL); } if (ircd->protect || ircd->admin) { anope_cmd_svsmode_chan(c->name, ircd->adminunset, NULL); } for (cu = c->users; cu; cu = next) { next = cu->next; isop = chan_has_user_status(c, cu->user, CUS_OP); isadmin = chan_has_user_status(c, cu->user, CUS_PROTECT); isown = chan_has_user_status(c, cu->user, CUS_OWNER); count = (isop ? 1 : 0) + (isadmin ? 1 : 0) + (isown ? 1 : 0); if (!isop && !isadmin && !isown) continue; snprintf(tmp, BUFSIZE, "-%s%s%s", (isop ? "o" : ""), (isadmin ? ircd->adminunset+1 : ""), (isown ? ircd->ownerunset+1 : "")); if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[2] = tmp; /* We have to give as much nicks as modes.. - Viper */ for (i = 0; i < count; i++) av[i+3] = cu->user->nick; ac = 3 + i; } else { av[1] = tmp; /* We have to give as much nicks as modes.. - Viper */ for (i = 0; i < count; i++) av[i+2] = cu->user->nick; ac = 2 + i; } do_cmode(c->ci->bi->nick, ac, av); } } else { for (cu = c->users; cu; cu = next) { next = cu->next; isop = chan_has_user_status(c, cu->user, CUS_OP); isadmin = chan_has_user_status(c, cu->user, CUS_PROTECT); isown = chan_has_user_status(c, cu->user, CUS_OWNER); count = (isop ? 1 : 0) + (isadmin ? 1 : 0) + (isown ? 1 : 0); if (!isop && !isadmin && !isown) continue; snprintf(tmp, BUFSIZE, "-%s%s%s", (isop ? "o" : ""), (isadmin ? ircd->adminunset+1 : ""), (isown ? ircd->ownerunset+1 : "")); /* We need to send the IRCd a nick for every mode.. - Viper */ snprintf(tmp2, BUFSIZE, "%s %s %s", (isop ? cu->user->nick : ""), (isadmin ? cu->user->nick : ""), (isown ? cu->user->nick : "")); if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[2] = tmp; /* We have to give as much nicks as modes.. - Viper */ for (i = 0; i < count; i++) av[i+3] = cu->user->nick; ac = 3 + i; anope_cmd_mode(c->ci->bi->nick, av[0], "%s %s", av[2], tmp2); } else { av[1] = tmp; /* We have to give as much nicks as modes.. - Viper */ for (i = 0; i < count; i++) av[i+2] = cu->user->nick; ac = 2 + i; anope_cmd_mode(c->ci->bi->nick, av[0], "%s %s", av[1], tmp2); } do_cmode(c->ci->bi->nick, ac, av); } } /* Clear Channel HOPs */ } else if (ircd->halfop && type == 6) { char *av[4]; struct c_userlist *cu, *next; char buf[BUFSIZE]; int ac; notice(c->ci->bi->nick, c->name, "CLEAR HOPS command from %s", u->nick); av[0] = c->name; if (ircdcap->tsmode) av[2] = sstrdup("-h"); else av[1] = sstrdup("-h"); if (ircd->svsmode_ucmode) { anope_cmd_svsmode_chan(c->name, "-h", NULL); for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) continue; if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[3] = cu->user->nick; ac = 4; } else { av[2] = cu->user->nick; ac = 3; } do_cmode(c->ci->bi->nick, ac, av); } } else { for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) continue; if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[3] = cu->user->nick; ac = 4; } else { av[2] = cu->user->nick; ac = 3; } anope_cmd_mode(c->ci->bi->nick, c->name, "-h %s", cu->user->nick); do_cmode(c->ci->bi->nick, ac, av); } } if (ircdcap->tsmode) free(av[2]); else free(av[1]); } else if (!(ircd->halfop) && type == 6) { noticeLang(c->ci->bi->nick, u, LANG_HOPS_UNSUPPORTED); /* Clear Channel Voices */ } else if (type == 7) { char *av[4]; struct c_userlist *cu, *next; char buf[BUFSIZE]; int ac; notice(c->ci->bi->nick, c->name, "CLEAR VOICES command from %s", u->nick); av[0] = c->name; if (ircdcap->tsmode) av[2] = sstrdup("-v"); else av[1] = sstrdup("-v"); if (ircd->svsmode_ucmode) { anope_cmd_svsmode_chan(av[0], "-v", NULL); for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_VOICE)) continue; if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[3] = cu->user->nick; ac = 4; } else { av[2] = cu->user->nick; ac = 3; } do_cmode(c->ci->bi->nick, ac, av); } } else { for (cu = c->users; cu; cu = next) { next = cu->next; if (!chan_has_user_status(c, cu->user, CUS_VOICE)) continue; if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); av[1] = buf; av[3] = cu->user->nick; ac = 4; } else { av[2] = cu->user->nick; ac = 3; } anope_cmd_mode(c->ci->bi->nick, c->name, "-v %s", cu->user->nick); do_cmode(c->ci->bi->nick, ac, av); } } if (ircdcap->tsmode) free(av[2]); else free(av[1]); /* Clear Channel Users */ } else if (type == 8) { char *av[3]; struct c_userlist *cu, *next; char buf[256]; snprintf(buf, sizeof(buf), "CLEAR USERS command from %s", u->nick); notice(c->ci->bi->nick, c->name, buf); av[0] = c->name; av[2] = buf; for (cu = c->users; cu; cu = next) { next = cu->next; av[1] = cu->user->nick; anope_cmd_kick(c->ci->bi->nick, av[0], av[1], av[2]); do_kick(c->ci->bi->nick, 3, av); } } /* Should NEVER happen, therefor if it does, stop processing */ else { alog("[bs_fantasy_ext] An error has occured while processing CLEAR !!!"); return MOD_STOP; } return MOD_CONT; }
/** * The /cs register command. * @param u The user who issued the command * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing. **/ int do_register(User * u) { char *chan = strtok(NULL, " "); char *pass = strtok(NULL, " "); char *desc = strtok(NULL, ""); NickCore *nc; Channel *c; ChannelInfo *ci; struct u_chaninfolist *uc; int is_servadmin = is_services_admin(u); char founderpass[PASSMAX + 1]; char tmp_pass[PASSMAX]; if (readonly) { notice_lang(s_ChanServ, u, CHAN_REGISTER_DISABLED); return MOD_CONT; } if (checkDefCon(DEFCON_NO_NEW_CHANNELS)) { notice_lang(s_ChanServ, u, OPER_DEFCON_DENIED); return MOD_CONT; } if (!desc) { syntax_error(s_ChanServ, u, "REGISTER", CHAN_REGISTER_SYNTAX); } else if (*chan == '&') { notice_lang(s_ChanServ, u, CHAN_REGISTER_NOT_LOCAL); } else if (*chan != '#') { notice_lang(s_ChanServ, u, CHAN_SYMBOL_REQUIRED); } else if (!xanadu_valid_chan(chan)) { notice_lang(s_ChanServ, u, CHAN_X_INVALID, chan); } else if (!u->na || !(nc = u->na->nc)) { notice_lang(s_ChanServ, u, CHAN_MUST_REGISTER_NICK, s_NickServ); } else if (!nick_recognized(u)) { notice_lang(s_ChanServ, u, CHAN_MUST_IDENTIFY_NICK, s_NickServ, s_NickServ); } else if (!(c = findchan(chan))) { notice_lang(s_ChanServ, u, CHAN_REGISTER_NONE_CHANNEL, chan); } else if ((ci = cs_findchan(chan)) != NULL) { if (ci->flags & CI_VERBOTEN) { alog("%s: Attempt to register FORBIDden channel %s by %s!%s@%s", s_ChanServ, ci->name, u->nick, u->username, u->host); notice_lang(s_ChanServ, u, CHAN_MAY_NOT_BE_REGISTERED, chan); } else { notice_lang(s_ChanServ, u, CHAN_ALREADY_REGISTERED, chan); } } else if (!stricmp(chan, "#")) { notice_lang(s_ChanServ, u, CHAN_MAY_NOT_BE_REGISTERED, chan); } else if (!chan_has_user_status(c, u, CUS_OP)) { notice_lang(s_ChanServ, u, CHAN_MUST_BE_CHANOP); } else if (!is_servadmin && nc->channelmax > 0 && nc->channelcount >= nc->channelmax) { notice_lang(s_ChanServ, u, nc->channelcount > nc-> channelmax ? CHAN_EXCEEDED_CHANNEL_LIMIT : CHAN_REACHED_CHANNEL_LIMIT, nc->channelmax); } else if (stricmp(u->nick, pass) == 0 || (StrictPasswords && strlen(pass) < 5)) { notice_lang(s_ChanServ, u, MORE_OBSCURE_PASSWORD); } else if (!(ci = makechan(chan))) { alog("%s: makechan() failed for REGISTER %s", s_ChanServ, chan); notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED); } else if (strscpy(founderpass, pass, PASSMAX + 1), enc_encrypt_in_place(founderpass, PASSMAX) < 0) { alog("%s: Couldn't encrypt password for %s (REGISTER)", s_ChanServ, chan); notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED); delchan(ci); } else { c->ci = ci; ci->c = c; ci->bantype = CSDefBantype; ci->flags = CSDefFlags; ci->mlock_on = ircd->defmlock; ci->memos.memomax = MSMaxMemos; ci->last_used = ci->time_registered; ci->founder = nc; if (strlen(pass) > PASSMAX) notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX); memset(pass, 0, strlen(pass)); memcpy(ci->founderpass, founderpass, PASSMAX); ci->desc = sstrdup(desc); if (c->topic) { ci->last_topic = sstrdup(c->topic); strscpy(ci->last_topic_setter, c->topic_setter, NICKMAX); ci->last_topic_time = c->topic_time; } else { /* Set this to something, otherwise it will maliform the topic */ strscpy(ci->last_topic_setter, s_ChanServ, NICKMAX); } ci->bi = NULL; ci->botflags = BSDefFlags; ci->founder->channelcount++; alog("%s: Channel '%s' registered by %s!%s@%s", s_ChanServ, chan, u->nick, u->username, u->host); notice_lang(s_ChanServ, u, CHAN_REGISTERED, chan, u->nick); if(enc_decrypt(ci->founderpass,tmp_pass,PASSMAX) == 1) { notice_lang(s_ChanServ, u, CHAN_PASSWORD_IS, ci->founderpass); } uc = scalloc(sizeof(*uc), 1); uc->next = u->founder_chans; uc->prev = NULL; if (u->founder_chans) u->founder_chans->prev = uc; u->founder_chans = uc; uc->chan = ci; /* Implement new mode lock */ check_modes(c); /* On most ircds you do not receive the admin/owner mode till its registered */ if (ircd->admin) { xanadu_cmd_mode(s_ChanServ, chan, "%s %s", ircd->adminset, u->nick); } if (ircd->owner && ircd->ownerset) { xanadu_cmd_mode(s_ChanServ, chan, "%s %s", ircd->ownerset, u->nick); } send_event(EVENT_CHAN_REGISTERED, 1, chan); } return MOD_CONT; }
int do_sync(User *u, Channel *c) { struct c_userlist *cu, *next; /* Variables needed for building the cmd to remove voices.. */ int count = 0, newac = 0; char modes[BUFSIZE], nicks[BUFSIZE], buf[BUFSIZE]; char *end1, *end2; char **newav = scalloc(sizeof(char *) * 13, 1); end1 = modes; end2 = nicks; *end1 = 0; *end2 = 0; newav[newac] = c->name; newac++; if (!c->ci) { free(newav); return MOD_CONT; } if (ircdcap->tsmode) { snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); newav[newac] = buf; newac++; } cu = c->users; while (cu) { /* We store the next user just in case current user ends up getting kicked off the channel. */ next = cu->next; do_up_down(cu->user, c, "up", 0); /* We have to remove voices manually because the cores function doesn't care about that * as it's not covered by secureops.. */ if (chan_has_user_status(c, cu->user, CUS_VOICE) && !check_access(cu->user, c->ci, CA_AUTOVOICE) && !check_access(cu->user, c->ci, CA_VOICEME) && !check_access(cu->user, c->ci, CA_VOICE)) { /* Add the user to the string to remove his voice.. */ end1 += snprintf(end1, sizeof(modes) - (end1 - modes), "-v"); end2 += snprintf(end2, sizeof(nicks) - (end2 - nicks), "%s ", GET_USER(cu->user)); newav[newac+1] = GET_USER(cu->user); newac++; count++; /* Check whether the command hasn't grown too long yet. * We don't allow more then 10 mode changes per command.. this should keep us safely below the 512 max length per cmd. */ if (count == 10) { /* We've reached the maximum.. send the mode changes. */ if (ircdcap->tsmode) newav[2] = modes; else newav[1] = modes; newac++; anope_cmd_mode(c->ci->bi->nick, c->name, "%s %s", modes, nicks); do_cmode(c->ci->bi->nick, newac, newav); /* Reset the buffer for the next set of changes.. */ if (ircdcap->tsmode) newac = 2; else newac = 1; *end1 = 0; *end2 = 0; count = 0; } } cu = next; } /* If we still have some mode changes to send, do it now.. */ if (count > 0) { if (ircdcap->tsmode) newav[2] = modes; else newav[1] = modes; newac++; anope_cmd_mode(c->ci->bi->nick, c->name, "%s %s", modes, nicks); do_cmode(c->ci->bi->nick, newac, newav); } noticeLang(c->ci->bi->nick, u, LANG_SYNC_DONE, c->name); free(newav); return MOD_CONT; }