From 6aee4a2f22dbaf869edf05071a8f62cc2b8f653e Mon Sep 17 00:00:00 2001 From: pk910 Date: Wed, 5 Oct 2011 21:03:24 +0200 Subject: [PATCH] added cmd_rename --- Makefile.am | 1 + src/DBHelper.c | 43 +++++++++++++++++++++++++ src/DBHelper.h | 1 + src/bot_NeonServ.c | 3 ++ src/cmd_neonserv.h | 1 + src/cmd_neonserv_rename.c | 68 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 117 insertions(+) create mode 100644 src/cmd_neonserv_rename.c diff --git a/Makefile.am b/Makefile.am index c878cd0..44f64fb 100644 --- a/Makefile.am +++ b/Makefile.am @@ -103,6 +103,7 @@ neonserv_SOURCES = src/version.c \ src/cmd_neonserv_listrank.c \ src/cmd_neonserv_setrank.c \ src/cmd_neonserv_info.c \ + src/cmd_neonserv_rename.c \ src/lib/ini.c neonserv_LDADD = $(MYSQL_LIBS) $(WINSOCK_LIBS) diff --git a/src/DBHelper.c b/src/DBHelper.c index 643eb2f..fec30a2 100644 --- a/src/DBHelper.c +++ b/src/DBHelper.c @@ -180,3 +180,46 @@ char *getBanAffectingMask(struct ChanNode *chan, char *mask) { } return NULL; } + +int renameAccount(char *oldauth, char *newauth) { + MYSQL_RES *res, *res2; + MYSQL_ROW row, row2; + 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) { + int userid = atoi(row[0]); + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(newauth)); + res = mysql_use(); + if((row = mysql_fetch_row(res)) != NULL) { + //merge + int newuid = atoi(row[0]); + printf_mysql_query("SELECT `chanuser_id`, `chanuser_access`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_uid` = '%d'", newuid); + res = mysql_use(); + while((row = mysql_fetch_row(res)) != NULL) { + printf_mysql_query("SELECT `chanuser_id`, `chanuser_access`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_uid` = '%d'", userid); + res2 = mysql_use(); + if((row2 = mysql_fetch_row(res2)) != NULL) { + if(atoi(row[0]) > atoi(row2[0])) { + printf_mysql_query("UPDATE `chanusers` SET `chanuser_access` = '%s' WHERE `chanuser_id` = '%s'", row[0], row2[0]); + } + printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_id` = '%s'", row[0]); + } else + printf_mysql_query("UPDATE `chanusers` SET `chanuser_uid` = '%d' WHERE `chanuser_id` = '%s'", userid, row[0]); + } + printf_mysql_query("UPDATE `channels` SET `channel_registrator` = '%d' WHERE `channel_registrator` = '%d'", userid, newuid); + printf_mysql_query("UPDATE `bans` SET `ban_owner` = '%d' WHERE `ban_owner` = '%d'", userid, newuid); + printf_mysql_query("UPDATE `events` SET `auth` = '%s' WHERE `auth` = '%s'", escape_string(newauth), escape_string(oldauth)); + printf_mysql_query("UPDATE `godlog` SET `godlog_uid` = '%d' WHERE `godlog_uid` = '%d'", userid, newuid); + printf_mysql_query("UPDATE `owner_history` SET `owner_history_to_uid` = '%d' WHERE `owner_history_to_uid` = '%d'", userid, newuid); + printf_mysql_query("UPDATE `owner_history` SET `owner_history_from_uid` = '%d' WHERE `owner_history_from_uid` = '%d'", userid, newuid); + printf_mysql_query("UPDATE `owner_history` SET `owner_history_from_uid` = '%d' WHERE `owner_history_from_uid` = '%d'", userid, newuid); + printf_mysql_query("UPDATE `noinvite` SET `uid` = '%d' WHERE `uid` = '%d'", userid, newuid); + printf_mysql_query("DELETE FROM `users` WHERE `chanuser_id` = '%d'", newuid); + } else { + //simply rename the account + printf_mysql_query("UPDATE `users` SET `user_user` = '%s' WHERE `user_id` = '%d'", escape_string(newauth), userid); + } + return 1; + } + return 0; +} diff --git a/src/DBHelper.h b/src/DBHelper.h index 714246f..4750ecc 100644 --- a/src/DBHelper.h +++ b/src/DBHelper.h @@ -37,4 +37,5 @@ 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); #endif \ No newline at end of file diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index df781e6..1547538 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -308,6 +308,8 @@ static const struct default_language_entry msgtab[] = { {"NS_INFO_REGISTRAR", "Registered by:"}, {"NS_INFO_OWNERLOG", "Ownership transfer history for $b%s$b:"}, {"NS_INFO_OWNERCHANGE", " from %s to %s on %s"}, + {"NS_RENAME_DONE", "Renamed $b%s$b to $b%s$b."}, + {"NS_RENAME_FAIL", "Failed renaming $b%s$b."}, {NULL, NULL} }; @@ -529,6 +531,7 @@ void init_NeonServ() { OPER_COMMAND("setrank", neonserv_cmd_setrank, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); OPER_COMMAND("assignrank", neonserv_cmd_assignrank,2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); OPER_COMMAND("listrank", neonserv_cmd_listrank, 0, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("rename", neonserv_cmd_rename, 2, 300, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); #undef OPER_COMMAND start_bots(); diff --git a/src/cmd_neonserv.h b/src/cmd_neonserv.h index 39feafe..07c8bd2 100644 --- a/src/cmd_neonserv.h +++ b/src/cmd_neonserv.h @@ -86,6 +86,7 @@ CMD_BIND(neonserv_cmd_raw); CMD_BIND(neonserv_cmd_recover); CMD_BIND(neonserv_cmd_register); CMD_BIND(neonserv_cmd_reloadlang); +CMD_BIND(neonserv_cmd_rename); CMD_BIND(neonserv_cmd_resync); CMD_BIND(neonserv_cmd_say); CMD_BIND(neonserv_cmd_search); diff --git a/src/cmd_neonserv_rename.c b/src/cmd_neonserv_rename.c new file mode 100644 index 0000000..cf06571 --- /dev/null +++ b/src/cmd_neonserv_rename.c @@ -0,0 +1,68 @@ +/* cmd_neonserv_rename.c - NeonServ v5.0 + * Copyright (C) 2011 Philipp Kreil (pk910) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "cmd_neonserv.h" + +/* +* argv[0] old auth +* argv[1] new auth +*/ + +struct neonserv_cmd_rename_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct Event *event; + char *oldauth, *newauth; +}; + +static AUTHLOOKUP_CALLBACK(neonserv_cmd_rename_auth_lookup); +static void neonserv_cmd_rename_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *oldauth, char *newauth); + +CMD_BIND(neonserv_cmd_rename) { + struct neonserv_cmd_rename_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->event = event; + cache->oldauth = strdup(argv[0]); + cache->newauth = strdup(argv[1]); + lookup_authname(argv[0], neonserv_cmd_rename_auth_lookup, cache); +} + +static AUTHLOOKUP_CALLBACK(neonserv_cmd_rename_auth_lookup) { + struct neonserv_cmd_rename_cache *cache = data; + if(!exists) { + //AUTH_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->newauth); + } else + neonserv_cmd_rename_async1(cache->client, cache->textclient, cache->user, cache->event, cache->oldauth, auth); + free(cache->oldauth); + free(cache->newauth); + free(cache); +} + +static void neonserv_cmd_rename_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *oldauth, char *newauth) { + if(renameAccount(oldauth, newauth)) { + reply(textclient, user, "NS_RENAME_DONE", oldauth, newauth); + } else { + reply(textclient, user, "NS_RENAME_FAIL", oldauth); + } +} -- 2.20.1