#include "mysqlConn.h"
#include "lang.h"
#include "tools.h"
+#include "IRCEvents.h"
+#include "HandleInfoHandler.h"
void _loadUserSettings(struct UserNode *user) {
MYSQL_RES *res;
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;
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]);
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;
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. */
}
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);
+}
+
#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);
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
#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));
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;
+}
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
#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);
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
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;
}
}
}
}
- 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;
}
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 {
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 {
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);
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 {
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);
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);
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]);
*/
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) {
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;
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;
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;
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)) {
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;
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 {
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);
};
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 {
}
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 {
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 {
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 {
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);
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 {
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;
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;
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)) {
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)) {
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];
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;
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;
#include "EventLogger.h"
#include "ModeNode.h"
#include "IRCQueue.h"
+#include "DBHelper.h"
#include "lib/ini.h"
time_t start_time;
init_handleinfohandler();
init_tools();
init_bots();
+ init_DBHelper();
load_languages();
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;
}
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) {