From 973e771f779a04c07e88ea6a62d37625144a9587 Mon Sep 17 00:00:00 2001 From: pk910 Date: Sat, 27 Aug 2011 09:07:34 +0200 Subject: [PATCH] recheck userlist before execute cmd_deop or cmd_deopall --- cmd_neonserv_deop.c | 53 +++++++++++++++++++++++++++++++++++------- cmd_neonserv_deopall.c | 42 +++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 8 deletions(-) diff --git a/cmd_neonserv_deop.c b/cmd_neonserv_deop.c index d140d1f..993a011 100644 --- a/cmd_neonserv_deop.c +++ b/cmd_neonserv_deop.c @@ -2,17 +2,54 @@ /* * argv[0-*] nicks */ +static USERLIST_CALLBACK(neonserv_cmd_deop_userlist_lookup); +static void neonserv_cmd_deop_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char **argv, int argc); + +struct neonserv_cmd_deop_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + char **argv; + int argc; +}; static CMD_BIND(neonserv_cmd_deop) { - int i, done_users = 0; - struct UserNode *cuser; - struct ChanUser *chanuser; - struct ModeBuffer *modeBuf; check_mysql(); if(!checkChannelAccess(user, chan, "channel_canop", 1, 0)) { reply(getTextBot(), user, "NS_ACCESS_DENIED"); return; } + struct neonserv_cmd_deop_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->argv = calloc(argc, sizeof(char*)); + int i; + for(i = 0; i < argc; i++) { + cache->argv[i] = strdup(argv[i]); + } + cache->argc = argc; + get_userlist(chan, neonserv_cmd_deop_userlist_lookup, cache); +} + +static USERLIST_CALLBACK(neonserv_cmd_deop_userlist_lookup) { + struct neonserv_cmd_kick_cache *cache = data; + neonserv_cmd_deop_async1(cache->client, cache->textclient, cache->user, chan, cache->argv, cache->argc); + int i; + for(i = 0; i < cache->argc; i++) { + free(cache->argv[i]); + } + free(cache); +} + +static void neonserv_cmd_deop_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char **argv, int argc) { + int i, done_users = 0; + struct UserNode *cuser; + struct ChanUser *chanuser; + struct ModeBuffer *modeBuf; modeBuf = initModeBuffer(client, chan); for(i = 0; i < argc; i++) { cuser = searchUserByNick(argv[i]); @@ -20,11 +57,11 @@ static CMD_BIND(neonserv_cmd_deop) { chanuser = getChanUser(cuser, chan); if(!chanuser) continue; if(isNetworkService(cuser)) { - reply(getTextBot(), user, "NS_SERVICE_IMMUNE", cuser->nick); + reply(textclient, user, "NS_SERVICE_IMMUNE", cuser->nick); continue; } if(isUserProtected(chan, cuser, user)) { - reply(getTextBot(), user, "NS_USER_PROTECTED", cuser->nick); + reply(textclient, user, "NS_USER_PROTECTED", cuser->nick); continue; } done_users++; @@ -33,7 +70,7 @@ static CMD_BIND(neonserv_cmd_deop) { } freeModeBuffer(modeBuf); if(done_users == argc) - reply(getTextBot(), user, "NS_DEOP_DONE", chan->name); + reply(textclient, user, "NS_DEOP_DONE", chan->name); else - reply(getTextBot(), user, "NS_DEOP_FAIL", client->user->nick); + reply(textclient, user, "NS_DEOP_FAIL", client->user->nick); } diff --git a/cmd_neonserv_deopall.c b/cmd_neonserv_deopall.c index 57f01f3..1f1f390 100644 --- a/cmd_neonserv_deopall.c +++ b/cmd_neonserv_deopall.c @@ -2,8 +2,50 @@ /* * argv[0] (optional) nick mask */ +static USERLIST_CALLBACK(neonserv_cmd_deopall_userlist_lookup); +static void neonserv_cmd_deopall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char **argv, int argc); + +struct neonserv_cmd_deopall_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + char **argv; + int argc; +}; static CMD_BIND(neonserv_cmd_deopall) { + check_mysql(); + if(!checkChannelAccess(user, chan, "channel_canop", 1, 0)) { + reply(getTextBot(), user, "NS_ACCESS_DENIED"); + return; + } + struct neonserv_cmd_deopall_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->argv = calloc(argc, sizeof(char*)); + int i; + for(i = 0; i < argc; i++) { + cache->argv[i] = strdup(argv[i]); + } + cache->argc = argc; + get_userlist(chan, neonserv_cmd_deopall_userlist_lookup, cache); +} + +static USERLIST_CALLBACK(neonserv_cmd_deopall_userlist_lookup) { + struct neonserv_cmd_kick_cache *cache = data; + neonserv_cmd_deopall_async1(cache->client, cache->textclient, cache->user, chan, cache->argv, cache->argc); + int i; + for(i = 0; i < cache->argc; i++) { + free(cache->argv[i]); + } + free(cache); +} + +static void neonserv_cmd_deopall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char **argv, int argc) { int issuer_access, victim_access, done_users = 0; char *nickmask = NULL; struct ChanUser *chanuser; -- 2.20.1