X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/2184cc9c4f592e0b0ce1618df347a1fa0709d5a6..211567363bd8bfbd70cef81e4208ea02d49ebb55:/newsearch/ns-gline.c diff --git a/newsearch/ns-gline.c b/newsearch/ns-gline.c index f59c55f7..f989633d 100644 --- a/newsearch/ns-gline.c +++ b/newsearch/ns-gline.c @@ -13,6 +13,7 @@ #include "../irc/irc.h" /* irc_send() */ #include "../lib/irc_string.h" /* IPtostr(), longtoduration(), durationtolong() */ #include "../lib/strlfunc.h" +#include "../glines/glines.h" /* used for *_free functions that need to warn users of certain things i.e. hitting too many users in a (kill) or (gline) - declared in newsearch.c */ @@ -42,6 +43,8 @@ struct searchNode *gline_parse(searchCtx *ctx, int argc, char **argv) { localdata->marker = nextchanmarker(); else if (ctx->searchcmd == reg_nicksearch) localdata->marker = nextnickmarker(); + else if (ctx->searchcmd == reg_whowassearch) + localdata->marker = nextwhowasmarker(); else { free(localdata); parseError = "gline: invalid search type"; @@ -128,28 +131,35 @@ void *gline_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput) { struct gline_localdata *localdata; nick *np; chanindex *cip; + whowas *ww; localdata = thenode->localdata; if (ctx->searchcmd == reg_chansearch) { cip = (chanindex *)theinput; cip->marker = localdata->marker; - localdata->count += cip->channel->users->totalusers; + if (cip->channel != NULL) + localdata->count += cip->channel->users->totalusers; } else { np = (nick *)theinput; - np->marker = localdata->marker; + if (ctx->searchcmd == reg_nicksearch) + np->marker = localdata->marker; + else { + ww = (whowas *)np->next; + ww->marker = localdata->marker; + } localdata->count++; } return (void *)1; } -static int glineuser(nick *np, struct gline_localdata *localdata, time_t ti) { +static int glineuser(glinebuf *gbuf, nick *np, struct gline_localdata *localdata, time_t ti) { char msgbuf[512]; if (!IsOper(np) && !IsService(np) && !IsXOper(np)) { nssnprintf(msgbuf, sizeof(msgbuf), localdata->reason, np); - glinebynick(np, localdata->duration, msgbuf, 0); + glinebufaddbynick(gbuf, np, 0, "newsearch", msgbuf, getnettime() + localdata->duration, getnettime(), getnettime() + localdata->duration); return 1; } @@ -160,8 +170,10 @@ void gline_free(searchCtx *ctx, struct searchNode *thenode) { struct gline_localdata *localdata; nick *np, *nnp; chanindex *cip, *ncip; - int i, j, safe=0; + whowas *ww; + int i, j, hits, safe=0; time_t ti = time(NULL); + glinebuf gbuf; localdata = thenode->localdata; @@ -173,6 +185,8 @@ void gline_free(searchCtx *ctx, struct searchNode *thenode) { return; } + glinebufinit(&gbuf, 0); + if (ctx->searchcmd == reg_chansearch) { for (i=0;ichannel->users->content[j]))) { - if(!glineuser(np, localdata, ti)) + if(!glineuser(&gbuf, np, localdata, ti)) safe++; } } } } } - } - else { + } else if (ctx->searchcmd == reg_nicksearch) { for (i=0;inext; if (np->marker == localdata->marker) { - if(!glineuser(np, localdata, ti)) + if(!glineuser(&gbuf, np, localdata, ti)) safe++; } } } + } else { + for (i = whowasoffset; i < whowasoffset + whowasmax; i++) { + ww = &whowasrecs[i % whowasmax]; + + if (ww->type == WHOWAS_UNUSED) + continue; + + if (ww->marker == localdata->marker) { + if(!glineuser(&gbuf, &ww->nick, localdata, ti)) + safe++; + } + } } + + glinebufcounthits(&gbuf, &hits, NULL); + glinebufcommit(&gbuf, 1); + if (safe) ctx->reply(senderNSExtern, "Warning: your pattern matched privileged users (%d in total) - these have not been touched.", safe); /* notify opers of the action */