From 55bcc9aad6a4c85d10b47fb8639b4d2255059051 Mon Sep 17 00:00:00 2001 From: pk910 Date: Thu, 27 Oct 2011 16:43:41 +0200 Subject: [PATCH] added user registered event, tidied up helper functions and added automatic auth rename --- src/DBHelper.c | 69 +++++++++++++++++++++++++++++++---- src/DBHelper.h | 6 ++- src/IRCEvents.c | 17 ++++++++- src/IRCEvents.h | 5 ++- src/IRCParser.c | 30 ++++++++++++++- src/cmd_neonserv_adduser.c | 2 +- src/cmd_neonserv_clvl.c | 12 ++++-- src/cmd_neonserv_deluser.c | 2 +- src/cmd_neonserv_deopall.c | 4 +- src/cmd_neonserv_devoiceall.c | 8 +--- src/cmd_neonserv_extscript.c | 2 +- src/cmd_neonserv_mdeluser.c | 14 +++---- src/cmd_neonserv_mode.c | 2 +- src/cmd_neonserv_set.c | 6 +-- src/cmd_neonserv_suspend.c | 2 +- src/cmd_neonserv_topic.c | 2 +- src/cmd_neonserv_trim.c | 8 ++-- src/cmd_neonserv_unsuspend.c | 2 +- src/cmd_neonserv_up.c | 2 +- src/cmd_neonserv_wipeinfo.c | 2 +- src/cmd_neonspam_set.c | 8 ++-- src/event_neonserv_mode.c | 2 +- src/event_neonspam_chanmsg.c | 2 +- src/event_neonspam_join.c | 2 +- src/main.c | 2 + src/modcmd.c | 6 +-- 26 files changed, 161 insertions(+), 58 deletions(-) diff --git a/src/DBHelper.c b/src/DBHelper.c index fe48bc4..a55b8c6 100644 --- a/src/DBHelper.c +++ b/src/DBHelper.c @@ -22,6 +22,8 @@ #include "mysqlConn.h" #include "lang.h" #include "tools.h" +#include "IRCEvents.h" +#include "HandleInfoHandler.h" void _loadUserSettings(struct UserNode *user) { MYSQL_RES *res; @@ -45,7 +47,7 @@ int isGodMode(struct UserNode *user) { return (user->flags & USERFLAG_GOD_MODE); } -int getChannelAccess(struct UserNode *user, struct ChanNode *chan, int override) { +int getChannelAccess(struct UserNode *user, struct ChanNode *chan) { if(!(user->flags & USERFLAG_ISAUTHED)) return 0; loadChannelSettings(chan); if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) return 0; @@ -55,10 +57,7 @@ int getChannelAccess(struct UserNode *user, struct ChanNode *chan, int override) printf_mysql_query("SELECT `user_id`, `user_access`, `user_god` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { - if(strcmp(row[2], "0") && override) - caccess = atoi(row[1]); printf_mysql_query("SELECT `chanuser_access`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_uid` = '%s' AND `chanuser_cid` = '%d'", row[0], chan->channel_id); - // res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { int cflags = atoi(row[1]); @@ -79,7 +78,7 @@ char *getChanDefault(char *channel_setting) { return row[0]; } -int checkChannelAccess(struct UserNode *user, struct ChanNode *chan, char *channel_setting, int allow_override, int allow_501) { +int checkChannelAccess(struct UserNode *user, struct ChanNode *chan, char *channel_setting, int allow_501) { loadChannelSettings(chan); if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) return 0; if((user->flags & USERFLAG_ISIRCOP)) return 1; @@ -145,11 +144,11 @@ int isUserProtected(struct ChanNode *chan, struct UserNode *victim, struct UserN if(protection == 3) return 0; /* Don't protect if the victim isn't added to the channel, unless we are to protect non-users also. */ - int victim_access = getChannelAccess(victim, chan, 0); + int victim_access = getChannelAccess(victim, chan); if (!victim_access && protection != 0) return 0; /* Protect if the aggressor isn't a user because at this point, the aggressor can only be less than or equal to the victim. */ - int issuer_access = getChannelAccess(issuer, chan, 0); + int issuer_access = getChannelAccess(issuer, chan); if (!issuer_access) return 1; /* If the aggressor was a user, then the victim can't be helped. */ @@ -223,3 +222,59 @@ int renameAccount(char *oldauth, char *newauth) { } return 0; } + +static AUTHLOOKUP_CALLBACK(event_user_registered_auth_lookup); + +struct event_user_registered_cache { + struct UserNode *new_user; + char *oldauth; +}; + +static int event_user_registered(struct UserNode *old_user, struct UserNode *new_user) { + //check if there is a fakehost on both sides... + if(!isFakeHost(old_user->host) || !isFakeHost(new_user->host)) return 0; + //extract user names + char oldauth[AUTHLEN], newauth[AUTHLEN]; + char *p; + if((p = strstr(old_user->host, "."))) { + *p = '\0'; + strcpy(oldauth, old_user->host); + *p = '.'; + } + if((p = strstr(new_user->host, "."))) { + *p = '\0'; + strcpy(newauth, new_user->host); + *p = '.'; + } + //check if we know this user; then check the new auth + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(oldauth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + struct event_user_registered_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return 1; + } + cache->new_user = new_user; + cache->oldauth = strdup(oldauth); + lookup_authname(newauth, event_user_registered_auth_lookup, cache); + } + return 1; +} + +static AUTHLOOKUP_CALLBACK(event_user_registered_auth_lookup) { + struct event_user_registered_cache *cache = data; + if(exists) { + renameAccount(cache->oldauth, auth); + strcpy(cache->new_user->auth, auth); + cache->new_user->flags |= USERFLAG_ISAUTHED; + } + free(cache->oldauth); +} + +void init_DBHelper() { + bind_registered(event_user_registered); +} + diff --git a/src/DBHelper.h b/src/DBHelper.h index 2ccca54..d914f6f 100644 --- a/src/DBHelper.h +++ b/src/DBHelper.h @@ -29,8 +29,8 @@ void _loadUserSettings(struct UserNode* user); #define loadUserSettings(USER) if((USER->flags & USERFLAG_ISAUTHED) && !(USER->flags & USERFLAG_LOADED_SETTINGS)) _loadUserSettings(USER) int isGodMode(struct UserNode *user); char *getChanDefault(char *channel_setting); -int getChannelAccess(struct UserNode *user, struct ChanNode *chan, int override); -int checkChannelAccess(struct UserNode *user, struct ChanNode *chan, char *channel_setting, int allow_override, int allow_501); +int getChannelAccess(struct UserNode *user, struct ChanNode *chan); +int checkChannelAccess(struct UserNode *user, struct ChanNode *chan, char *channel_setting, int allow_501); void _loadChannelSettings(struct ChanNode *chan); #define loadChannelSettings(CHAN) if(!(CHAN->flags & CHANFLAG_REQUESTED_CHANINFO)) _loadChannelSettings(CHAN) int isUserProtected(struct ChanNode *chan, struct UserNode *victim, struct UserNode *issuer); @@ -38,4 +38,6 @@ int isUserProtected(struct ChanNode *chan, struct UserNode *victim, struct UserN char *getBanAffectingMask(struct ChanNode *chan, char *mask); //returns bans that match a given mask eg. *!*@ab* if you pass *!*@abcdefg.* int renameAccount(char *oldauth, char *newauth); + +void init_DBHelper(); #endif \ No newline at end of file diff --git a/src/IRCEvents.c b/src/IRCEvents.c index 8176ef9..a8239a9 100644 --- a/src/IRCEvents.c +++ b/src/IRCEvents.c @@ -44,8 +44,9 @@ static void **binds; #define BIND_TYPE_INVITE 13 #define BIND_TYPE_RAW 14 #define BIND_TYPE_BOT_READY 15 +#define BIND_TYPE_REGISTERED 16 -#define TOTAL_BIND_TYPES 16 +#define TOTAL_BIND_TYPES 17 void init_bind() { binds = calloc(TOTAL_BIND_TYPES, sizeof(*binds)); @@ -189,3 +190,17 @@ FUNC_EVENT(raw, raw_func_t, BIND_TYPE_RAW, (struct ClientSocket *client, char *f FUNC_BIND(bot_ready, bot_ready_func_t, BIND_TYPE_BOT_READY) FUNC_UNBIND(bot_ready, bot_ready_func_t, BIND_TYPE_BOT_READY) FUNC_EVENT(bot_ready, bot_ready_func_t, BIND_TYPE_BOT_READY, (struct ClientSocket *client), (client)) + +FUNC_BIND(registered, registered_func_t, BIND_TYPE_REGISTERED) +FUNC_UNBIND(registered, registered_func_t, BIND_TYPE_REGISTERED) +int event_registered(struct UserNode *old_user, struct UserNode *new_user) { + struct binding *cbind; + int ret = 0; + pre_event(BIND_TYPE_REGISTERED); + for(cbind = binds[BIND_TYPE_REGISTERED]; cbind; cbind = cbind->next) { + registered_func_t *func = cbind->func; + ret |= func(old_user, new_user); + } + post_event(BIND_TYPE_REGISTERED); + return ret; +} diff --git a/src/IRCEvents.h b/src/IRCEvents.h index 7acae20..8d5ff5a 100644 --- a/src/IRCEvents.h +++ b/src/IRCEvents.h @@ -107,6 +107,9 @@ int bind_bot_ready(bot_ready_func_t *func); void unbind_bot_ready(bot_ready_func_t *func); int event_bot_ready(struct ClientSocket *client); - +typedef int registered_func_t(struct UserNode *old_user, struct UserNode *new_user); +int bind_registered(registered_func_t *func); +void unbind_registered(registered_func_t *func); +int event_registered(struct UserNode *old_user, struct UserNode *new_user); #endif \ No newline at end of file diff --git a/src/IRCParser.c b/src/IRCParser.c index 5d17786..d4ca05e 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -28,6 +28,7 @@ #include "ModeNode.h" struct irc_cmd *irc_commands = NULL; +static struct UserNode *registering_users = NULL; static void parse_line(struct ClientSocket *client, char *line); static void register_irc_function(char *command, irc_cmd_t *func); @@ -152,6 +153,25 @@ static IRC_CMD(raw_join) { if(user == NULL) { user = addUserMask(from); } + struct UserNode *registering, *last_registering = NULL; + int noEvent = 0; + for(registering = registering_users; registering; registering = registering->next) { + if(!strcmp(registering->nick, user->nick)) { + noEvent = event_registered(registering, user); + if(last_registering) + last_registering->next = registering->next; + else + registering_users = registering->next; + delUser(registering, 1); + } else if(time(0) - registering->created > 2) { + if(last_registering) + last_registering->next = registering->next; + else + registering_users = registering->next; + delUser(registering, 1); + } else + last_registering = registering; + } if(chan == NULL) { chan = addChannel(argv[0]); //request member list @@ -162,7 +182,8 @@ static IRC_CMD(raw_join) { putsock(client, "MODE %s +b", chan->name); } else if(!isUserOnChan(user, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) { struct ChanUser *chanuser = addChanUser(chan, user); - event_join(chanuser); + if(!noEvent) + event_join(chanuser); } return 1; } @@ -215,7 +236,12 @@ static IRC_CMD(raw_quit) { } } } - delUser(user, 1); //now we fully free the user + if(!stricmp(argv[0], "Registered") && !(user->flags & USERFLAG_ISBOT)) { + user->next = registering_users; + user->created = time(0); + registering_users = user; + } else + delUser(user, 1); //now we fully free the user return 1; } diff --git a/src/cmd_neonserv_adduser.c b/src/cmd_neonserv_adduser.c index 9021760..ecd9f72 100644 --- a/src/cmd_neonserv_adduser.c +++ b/src/cmd_neonserv_adduser.c @@ -43,7 +43,7 @@ CMD_BIND(neonserv_cmd_adduser) { reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess); return; } - if(caccess >= getChannelAccess(user, chan, 0)) { + if(caccess >= getChannelAccess(user, chan)) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { diff --git a/src/cmd_neonserv_clvl.c b/src/cmd_neonserv_clvl.c index 269d5e4..92cd4a4 100644 --- a/src/cmd_neonserv_clvl.c +++ b/src/cmd_neonserv_clvl.c @@ -40,7 +40,7 @@ CMD_BIND(neonserv_cmd_clvl) { reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess); return; } - if(caccess >= getChannelAccess(user, chan, 0)) { + if(caccess >= getChannelAccess(user, chan)) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { @@ -108,9 +108,13 @@ static void neonserv_cmd_clvl_async1(struct ClientSocket *client, struct ClientS res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { //clvl - if(atoi(row[0]) >= getChannelAccess(user, chan, 1)) { - reply(textclient, user, "NS_USER_OUTRANKED", nick); - return; + if(atoi(row[0]) >= getChannelAccess(user, chan)) { + if(isGodMode(user)) { + event->flags |= CMDFLAG_OPLOG; + } else { + reply(textclient, user, "NS_USER_OUTRANKED", nick); + return; + } } printf_mysql_query("UPDATE `chanusers` SET `chanuser_access` = '%d' WHERE `chanuser_id` = '%s'", caccess, row[1]); reply(textclient, user, "NS_CLVL_DONE", nick, caccess, chan->name); diff --git a/src/cmd_neonserv_deluser.c b/src/cmd_neonserv_deluser.c index 62b1462..0893d98 100644 --- a/src/cmd_neonserv_deluser.c +++ b/src/cmd_neonserv_deluser.c @@ -90,7 +90,7 @@ static void neonserv_cmd_deluser_async1(struct ClientSocket *client, struct Clie printf_mysql_query("SELECT `chanuser_access`, `chanuser_id` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { - if(atoi(row[0]) >= getChannelAccess(user, chan, 0)) { + if(atoi(row[0]) >= getChannelAccess(user, chan)) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { diff --git a/src/cmd_neonserv_deopall.c b/src/cmd_neonserv_deopall.c index 69d4680..b4c7d88 100644 --- a/src/cmd_neonserv_deopall.c +++ b/src/cmd_neonserv_deopall.c @@ -68,10 +68,10 @@ static void neonserv_cmd_deopall_async1(struct ClientSocket *client, struct Clie if(argc > 0) nickmask = argv[0]; modeBuf = initModeBuffer(client, chan); - issuer_access = getChannelAccess(user, chan, 0); + issuer_access = getChannelAccess(user, chan); for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) { if(nickmask && match(nickmask, chanuser->user->nick)) continue; - victim_access = getChannelAccess(user, chan, 0); + victim_access = getChannelAccess(user, chan); if(victim_access >= issuer_access) continue; if(!(chanuser->flags & CHANUSERFLAG_OPPED)) continue; modeBufferDeop(modeBuf, chanuser->user->nick); diff --git a/src/cmd_neonserv_devoiceall.c b/src/cmd_neonserv_devoiceall.c index 43ca9d5..09445fa 100644 --- a/src/cmd_neonserv_devoiceall.c +++ b/src/cmd_neonserv_devoiceall.c @@ -27,17 +27,13 @@ CMD_BIND(neonserv_cmd_devoiceall) { struct ChanUser *chanuser; struct ModeBuffer *modeBuf; check_mysql(); - if(!checkChannelAccess(user, chan, "channel_canvoice", 1, 0)) { - reply(getTextBot(), user, "NS_ACCESS_DENIED"); - return; - } if(argc > 0) nickmask = argv[0]; modeBuf = initModeBuffer(client, chan); - issuer_access = getChannelAccess(user, chan, 0); + issuer_access = getChannelAccess(user, chan); for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) { if(nickmask && match(nickmask, chanuser->user->nick)) continue; - victim_access = getChannelAccess(user, chan, 0); + victim_access = getChannelAccess(user, chan); if(victim_access >= issuer_access) continue; if(!(chanuser->flags & CHANUSERFLAG_VOICED)) continue; modeBufferDevoice(modeBuf, chanuser->user->nick); diff --git a/src/cmd_neonserv_extscript.c b/src/cmd_neonserv_extscript.c index fc9dc5a..a2202f5 100644 --- a/src/cmd_neonserv_extscript.c +++ b/src/cmd_neonserv_extscript.c @@ -86,7 +86,7 @@ CMD_BIND(neonserv_cmd_extscript) { partpos = sprintf(part, "%s", ((user->flags & USERFLAG_ISAUTHED) ? user->auth : "")); } else if(!strcmp(argv[i], "access")) { if(chan) - partpos = sprintf(part, "%d", getChannelAccess(user, chan, 0)); + partpos = sprintf(part, "%d", getChannelAccess(user, chan)); } } else { partpos = sprintf(part, "%s", argv[i]); diff --git a/src/cmd_neonserv_mdeluser.c b/src/cmd_neonserv_mdeluser.c index 078ba5c..79e4ba8 100644 --- a/src/cmd_neonserv_mdeluser.c +++ b/src/cmd_neonserv_mdeluser.c @@ -23,10 +23,6 @@ */ CMD_BIND(neonserv_cmd_mdeluser) { - if(!checkChannelAccess(user, chan, "channel_candel", 1, 0)) { - reply(getTextBot(), user, "NS_ACCESS_DENIED"); - return; - } int min_access, max_access; char *seperator = strstr(argv[0], "-"); if(seperator) { @@ -42,9 +38,13 @@ CMD_BIND(neonserv_cmd_mdeluser) { min_access = atoi(argv[0]); max_access = min_access; } - if(max_access >= getChannelAccess(user, chan, 1)) { - reply(getTextBot(), user, "NS_NO_ACCESS"); - return; + if(max_access >= getChannelAccess(user, chan)) { + if(isGodMode(user)) { + event->flags |= CMDFLAG_OPLOG; + } else { + reply(getTextBot(), user, "NS_NO_ACCESS"); + return; + } } MYSQL_RES *res; MYSQL_ROW row; diff --git a/src/cmd_neonserv_mode.c b/src/cmd_neonserv_mode.c index e6550a4..7404ef8 100644 --- a/src/cmd_neonserv_mode.c +++ b/src/cmd_neonserv_mode.c @@ -76,7 +76,7 @@ static void neonserv_cmd_mode_async1(struct ClientSocket *client, struct ClientS parseModeString(modelock, row[4]); else if(defaults[4]) parseModeString(modelock, defaults[4]); - int uaccess = getChannelAccess(user, chan, 0); + int uaccess = getChannelAccess(user, chan); char *a, *b = mode; char *argv[MAXNUMPARAMS]; char *carg; diff --git a/src/cmd_neonserv_set.c b/src/cmd_neonserv_set.c index c8b433a..46e85d8 100644 --- a/src/cmd_neonserv_set.c +++ b/src/cmd_neonserv_set.c @@ -85,7 +85,7 @@ CMD_BIND(neonserv_cmd_set) { int i, j; if(argc && !strcmp(argv[0], "defaults")) { //reset channel settings - int uaccess = getChannelAccess(user, chan, 0); + int uaccess = getChannelAccess(user, chan); if(uaccess < 500) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; @@ -243,7 +243,7 @@ static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNod reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess); return; } - int uaccess = getChannelAccess(user, chan, 0); + int uaccess = getChannelAccess(user, chan); if(uaccess == 500) uaccess++; if(atoi(value) > uaccess) { if(isGodMode(user)) { @@ -324,7 +324,7 @@ static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNo row = mysql_fetch_row(res); trigger = row[0]; if(argument) { - int uaccess = getChannelAccess(user, chan, 0); + int uaccess = getChannelAccess(user, chan); if(uaccess < 500) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; diff --git a/src/cmd_neonserv_suspend.c b/src/cmd_neonserv_suspend.c index 63b7b47..11e89b7 100644 --- a/src/cmd_neonserv_suspend.c +++ b/src/cmd_neonserv_suspend.c @@ -90,7 +90,7 @@ static void neonserv_cmd_suspend_async1(struct ClientSocket *client, struct Clie printf_mysql_query("SELECT `chanuser_access`, `chanuser_id`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { - if(atoi(row[0]) >= getChannelAccess(user, chan, 0)) { + if(atoi(row[0]) >= getChannelAccess(user, chan)) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { diff --git a/src/cmd_neonserv_topic.c b/src/cmd_neonserv_topic.c index 88d396a..2d0c8e5 100644 --- a/src/cmd_neonserv_topic.c +++ b/src/cmd_neonserv_topic.c @@ -54,7 +54,7 @@ CMD_BIND(neonserv_cmd_topic) { logEvent(event); return; } - int uaccess = getChannelAccess(user, chan, 0); + int uaccess = getChannelAccess(user, chan); if(uaccess >= atoi((row[3] ? row[3] : default_row[1]))) { //just set the topic newtopic = merge_argv(argv, 0, argc); diff --git a/src/cmd_neonserv_trim.c b/src/cmd_neonserv_trim.c index 97c9615..c9c8ed1 100644 --- a/src/cmd_neonserv_trim.c +++ b/src/cmd_neonserv_trim.c @@ -34,7 +34,7 @@ struct neonserv_cmd_trim_cache { }; CMD_BIND(neonserv_cmd_trim) { - if(stricmp(argv[0], "bans") && !checkChannelAccess(user, chan, "channel_candel", 0, 0)) { + if(stricmp(argv[0], "bans") && !checkChannelAccess(user, chan, "channel_candel", 0)) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { @@ -50,9 +50,9 @@ CMD_BIND(neonserv_cmd_trim) { } if(!stricmp(argv[0], "users")) { min_access = 1; - max_access = getChannelAccess(user, chan, 0) - 1; + max_access = getChannelAccess(user, chan) - 1; } else if(!stricmp(argv[0], "bans")) { - if(!checkChannelAccess(user, chan, "channel_staticban", 0, 0)) { + if(!checkChannelAccess(user, chan, "channel_staticban", 0)) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { @@ -96,7 +96,7 @@ CMD_BIND(neonserv_cmd_trim) { min_access = atoi(argv[0]); max_access = min_access; } - if(max_access >= getChannelAccess(user, chan, 0)) { + if(max_access >= getChannelAccess(user, chan)) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { diff --git a/src/cmd_neonserv_unsuspend.c b/src/cmd_neonserv_unsuspend.c index 557524f..1a4889d 100644 --- a/src/cmd_neonserv_unsuspend.c +++ b/src/cmd_neonserv_unsuspend.c @@ -90,7 +90,7 @@ static void neonserv_cmd_unsuspend_async1(struct ClientSocket *client, struct Cl printf_mysql_query("SELECT `chanuser_access`, `chanuser_id`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { - if(atoi(row[0]) >= getChannelAccess(user, chan, 0)) { + if(atoi(row[0]) >= getChannelAccess(user, chan)) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { diff --git a/src/cmd_neonserv_up.c b/src/cmd_neonserv_up.c index f98a09b..6bdda2f 100644 --- a/src/cmd_neonserv_up.c +++ b/src/cmd_neonserv_up.c @@ -45,7 +45,7 @@ CMD_BIND(neonserv_cmd_up) { chan_getop = atoi(row[0]); chan_getvoice = atoi(row[1]); } - caccess = getChannelAccess(user, chan, 1); + caccess = getChannelAccess(user, chan); if(caccess >= chan_getop) { if(!(chanuser->flags & CHANUSERFLAG_OPPED)) { putsock(client, "MODE %s +o %s", chan->name, user->nick); diff --git a/src/cmd_neonserv_wipeinfo.c b/src/cmd_neonserv_wipeinfo.c index 8cb065b..50cabac 100644 --- a/src/cmd_neonserv_wipeinfo.c +++ b/src/cmd_neonserv_wipeinfo.c @@ -90,7 +90,7 @@ static void neonserv_cmd_wipeinfo_async1(struct ClientSocket *client, struct Cli printf_mysql_query("SELECT `chanuser_access`, `chanuser_id` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { - if(atoi(row[0]) >= getChannelAccess(user, chan, 0)) { + if(atoi(row[0]) >= getChannelAccess(user, chan)) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; } else { diff --git a/src/cmd_neonspam_set.c b/src/cmd_neonspam_set.c index 3403e45..799045c 100644 --- a/src/cmd_neonspam_set.c +++ b/src/cmd_neonspam_set.c @@ -139,7 +139,7 @@ CMD_BIND(neonspam_cmd_set) { int i, j; if(argc && !strcmp(argv[0], "defaults")) { //reset channel settings - int uaccess = getChannelAccess(user, chan, 0); + int uaccess = getChannelAccess(user, chan); if(uaccess < 500) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; @@ -297,7 +297,7 @@ static char* neonspam_cmd_set_trigger(struct ClientSocket *client, struct UserNo row = mysql_fetch_row(res); trigger = row[0]; if(argument) { - int uaccess = getChannelAccess(user, chan, 0); + int uaccess = getChannelAccess(user, chan); if(uaccess < 500) { if(isGodMode(user)) { event->flags |= CMDFLAG_OPLOG; @@ -345,7 +345,7 @@ static char* neonspam_cmd_setexcept(struct ClientSocket *client, struct UserNode reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess); return NULL; } - int uaccess = getChannelAccess(user, chan, 0); + int uaccess = getChannelAccess(user, chan); if(uaccess == 500) uaccess++; if(value > uaccess) { if(isGodMode(user)) { @@ -613,7 +613,7 @@ static char* neonspam_cmd_setscanexcept(struct ClientSocket *client, struct User reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess); return NULL; } - int uaccess = getChannelAccess(user, chan, 0); + int uaccess = getChannelAccess(user, chan); if(uaccess == 500) uaccess++; if(identical && value > uaccess) { if(isGodMode(user)) { diff --git a/src/event_neonserv_mode.c b/src/event_neonserv_mode.c index 583f2a2..5ef8060 100644 --- a/src/event_neonserv_mode.c +++ b/src/event_neonserv_mode.c @@ -96,7 +96,7 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN parseModeString(modelock, row[4]); else if(defaults[4]) parseModeString(modelock, defaults[4]); - int uaccess = getChannelAccess(user, chan, 0); + int uaccess = getChannelAccess(user, chan); char *carg; int sent_modes_locked = 0; char tmp[MAXLEN]; diff --git a/src/event_neonspam_chanmsg.c b/src/event_neonspam_chanmsg.c index 2d2978b..f503596 100644 --- a/src/event_neonspam_chanmsg.c +++ b/src/event_neonspam_chanmsg.c @@ -166,7 +166,7 @@ static void neonspam_event_chanmsg_punish(struct ClientSocket *client, struct Ch loadChannelSettings(chanuser->chan); int uaccess = 0; if(chanuser->user->flags & USERFLAG_ISAUTHED) - uaccess = getChannelAccess(chanuser->user, chanuser->chan, 0); + uaccess = getChannelAccess(chanuser->user, chanuser->chan); char reason[MAXLEN]; reason[0] = '\0'; int punishment = 0; diff --git a/src/event_neonspam_join.c b/src/event_neonspam_join.c index 1578a01..ce29783 100644 --- a/src/event_neonspam_join.c +++ b/src/event_neonspam_join.c @@ -62,7 +62,7 @@ static USERAUTH_CALLBACK(neonspam_event_join_nick_lookup) { static void neonspam_event_join_punish(struct ClientSocket *client, struct ChanUser *chanuser, struct NeonSpamSettings *settings, int action) { int uaccess = 0; if(chanuser->user->flags & USERFLAG_ISAUTHED) - uaccess = getChannelAccess(chanuser->user, chanuser->chan, 0); + uaccess = getChannelAccess(chanuser->user, chanuser->chan); if(uaccess >= settings->exceptlevel[SPAMSETTINGS_JOINEXCINDEX]) return; //scanops / scanvoiced MYSQL_RES *res; diff --git a/src/main.c b/src/main.c index b8341fe..6c881fb 100644 --- a/src/main.c +++ b/src/main.c @@ -32,6 +32,7 @@ #include "EventLogger.h" #include "ModeNode.h" #include "IRCQueue.h" +#include "DBHelper.h" #include "lib/ini.h" time_t start_time; @@ -121,6 +122,7 @@ int main(void) init_handleinfohandler(); init_tools(); init_bots(); + init_DBHelper(); load_languages(); diff --git a/src/modcmd.c b/src/modcmd.c index 0b4bec7..301a502 100644 --- a/src/modcmd.c +++ b/src/modcmd.c @@ -291,8 +291,8 @@ static void handle_command_async(struct ClientSocket *client, struct UserNode *u printf_mysql_query("SELECT `channel_pubcmd` FROM `channels` WHERE `channel_name` = '%s'", escape_string(sent_chan->name)); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { - uaccess = getChannelAccess(user, sent_chan, 1); - if(row[0] && uaccess < atoi(row[0])) { //NOTE: HARDCODED DEFAULT: pubcmd = 0 + uaccess = getChannelAccess(user, sent_chan); + if(row[0] && uaccess < atoi(row[0]) && !isGodMode(user)) { //NOTE: HARDCODED DEFAULT: pubcmd = 0 reply(tmp_text_client, user, "MODCMD_PUBCMD", sent_chan->name); return; } @@ -351,7 +351,7 @@ static void handle_command_async(struct ClientSocket *client, struct UserNode *u chan->flags |= CHANFLAG_CHAN_REGISTERED; chan->channel_id = atoi(row[0]); if((sent_chan && sent_chan == chan) || access_count || minaccess) { - uaccess = getChannelAccess(user, chan, 0); + uaccess = getChannelAccess(user, chan); if(uaccess < minaccess && isGodMode(user)) { eventflags |= CMDFLAG_OPLOG; } else if(uaccess < minaccess) { -- 2.20.1