From bbe5cdc2b9a4d86b55cc1efdc05d77eef77a8256 Mon Sep 17 00:00:00 2001 From: pk910 Date: Wed, 28 Sep 2011 23:27:23 +0200 Subject: [PATCH] added cmd_setaccess --- bot_NeonServ.c | 3 + cmd_neonserv_setaccess.c | 122 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 cmd_neonserv_setaccess.c diff --git a/bot_NeonServ.c b/bot_NeonServ.c index dba2e6a..d20316e 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -225,6 +225,7 @@ static const struct default_language_entry msgtab[] = { {"NS_BOTWAR_REPORTED", "A supporter has been informed to help you preventing botwars in the future."}, {"NS_BOTWAR_ALERT", "$b$k4BOTWAR ALERT:$k$b Botwar in $b%s$b detected. (opponent: $b%s$b) Please join and help them preventing Botwars."}, /* {ARGS: "#TestChan", "OtherBot"} */ {"NS_INVITE_FAIL", "$b%s$b is not registered with %s or suspended."}, /* {ARGS: "#TestChan", "NeonServ"} */ + {"NS_SETACCESS_DONE", "$b%s$b has now %d global access."}, {NULL, NULL} }; @@ -314,6 +315,7 @@ INCLUDE ALL CMD's HERE #include "cmd_neonserv_reloadlang.c" #include "cmd_neonserv_oplog.c" //#include "cmd_neonserv_rename.c" +#include "cmd_neonserv_setaccess.c" //HARDCODED FUN CMD's //#include "cmd_neonserv_iplocate.c" @@ -515,6 +517,7 @@ void init_NeonServ() { OPER_COMMAND("unbind", neonserv_cmd_unbind, 1, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); OPER_COMMAND("oplog", neonserv_cmd_oplog, 0, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); OPER_COMMAND("search", neonserv_cmd_search, 1, 400, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + OPER_COMMAND("setaccess", neonserv_cmd_setaccess, 2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); #undef OPER_COMMAND start_bots(); diff --git a/cmd_neonserv_setaccess.c b/cmd_neonserv_setaccess.c new file mode 100644 index 0000000..c378ac9 --- /dev/null +++ b/cmd_neonserv_setaccess.c @@ -0,0 +1,122 @@ + +/* +* argv[0] - nick / *auth +* argv[1] - global access +*/ +static AUTHLOOKUP_CALLBACK(neonserv_cmd_setaccess_auth_lookup); +static USERAUTH_CALLBACK(neonserv_cmd_setaccess_nick_lookup); +static void neonserv_cmd_setaccess_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *nick, char *auth, int access); + +struct neonserv_cmd_setaccess_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct Event *event; + int access; + char *nick; +}; + +static CMD_BIND(neonserv_cmd_setaccess) { + int caccess; + MYSQL_RES *res; + MYSQL_ROW row; + caccess = atoi(argv[1]); + if(caccess < 0 || caccess > 1000) { + reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess); + return; + } + printf_mysql_query("SELECT `user_access` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) == NULL || atoi(row[0]) < caccess) { + reply(getTextBot(), user, "NS_ACCESS_OUTRANKED"); + return; + } + if(argv[0][0] == '*') { + //we've got an auth + argv[0]++; + printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0])); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + neonserv_cmd_setaccess_async1(client, getTextBot(), user, event, argv[0], row[0], caccess); + } else { + //we need to create a new user... + //but first lookup the auth to check if it really exists + struct neonserv_cmd_setaccess_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->event = event; + cache->access = caccess; + cache->nick = strdup(argv[0]); + lookup_authname(argv[0], neonserv_cmd_setaccess_auth_lookup, cache); + } + } else { + struct UserNode *cuser = getUserByNick(argv[0]); + if(!cuser) { + cuser = createTempUser(argv[0]); + cuser->flags |= USERFLAG_ISTMPUSER; + } + if(cuser->flags & USERFLAG_ISAUTHED) { + neonserv_cmd_setaccess_async1(client, getTextBot(), user, event, argv[0], cuser->auth, caccess); + } else { + struct neonserv_cmd_setaccess_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->event = event; + cache->access = caccess; + cache->nick = strdup(argv[0]); + get_userauth(cuser, neonserv_cmd_setaccess_nick_lookup, cache); + } + } +} + +static AUTHLOOKUP_CALLBACK(neonserv_cmd_setaccess_auth_lookup) { + struct neonserv_cmd_setaccess_cache *cache = data; + if(!exists) { + //AUTH_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick); + } else + neonserv_cmd_setaccess_async1(cache->client, cache->textclient, cache->user, cache->event, cache->nick, auth, cache->access); + free(cache->nick); + free(cache); +} + +static USERAUTH_CALLBACK(neonserv_cmd_setaccess_nick_lookup) { + struct neonserv_cmd_setaccess_cache *cache = data; + if(!user) { + //USER_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick); + } + else if(!(user->flags & USERFLAG_ISAUTHED)) { + //USER_NOT_AUTHED + reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick); + } + else + neonserv_cmd_setaccess_async1(cache->client, cache->textclient, cache->user, cache->event, user->nick, user->auth, cache->access); + free(cache->nick); + free(cache); +} + +static void neonserv_cmd_setaccess_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *nick, char *auth, int caccess) { + //we've got a valid auth now... + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `user_id`, `user_access` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + if(atoi(row[1]) != caccess) + printf_mysql_query("UPDATE `users` SET `user_access` = '%d' WHERE `user_id` = '%s'", caccess, row[0]); + } else { + printf_mysql_query("INSERT INTO `users` (`user_user`, `user_access`) VALUES ('%s', '%d')", escape_string(auth), caccess); + } + reply(textclient, user, "NS_SETACCESS_DONE", auth, caccess); + logEvent(event); +} -- 2.20.1