From 441876fc5090b0327600370347b7ef923636a508 Mon Sep 17 00:00:00 2001 From: pk910 Date: Fri, 4 Nov 2011 20:49:26 +0100 Subject: [PATCH] added DoNotRegister system and command cmd_noregister --- Makefile.am | 1 + database.sql | 16 +++ database.upgrade.sql | 13 +++ src/bot_NeonServ.c | 12 +++ src/cmd_global_register.c | 34 ++++++ src/cmd_neonserv.h | 1 + src/cmd_neonserv_giveowner.c | 16 +++ src/cmd_neonserv_noregister.c | 195 ++++++++++++++++++++++++++++++++++ src/commands.c | 1 + src/mysqlConn.c | 2 +- 10 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 src/cmd_neonserv_noregister.c diff --git a/Makefile.am b/Makefile.am index 5a0eb2e..d33ab4b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -112,6 +112,7 @@ neonserv_SOURCES = src/version.c \ src/cmd_neonserv_unvisited.c \ src/cmd_neonserv_extscript.c \ src/cmd_neonspam_set.c \ + src/cmd_neonserv_noregister.c \ src/cmd_funcmds.c \ src/lib/ini.c diff --git a/database.sql b/database.sql index 3693c0d..1aebd1e 100644 --- a/database.sql +++ b/database.sql @@ -339,3 +339,19 @@ CREATE TABLE IF NOT EXISTS `version` ( PRIMARY KEY (`database_version`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- + +-- +-- Tabellenstruktur für Tabelle `donotregister` +-- + +CREATE TABLE `donotregister` ( +`dnr_id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , +`dnr_target` VARCHAR( 256 ) NOT NULL , +`dnr_user` INT( 11 ) NOT NULL , +`dnr_timeout` INT( 20 ) NOT NULL , +`dnr_reason` TEXT NOT NULL , +UNIQUE ( +`dnr_target` +) +) ENGINE = MYISAM ; \ No newline at end of file diff --git a/database.upgrade.sql b/database.upgrade.sql index 4d4a9e4..36c8b0f 100644 --- a/database.upgrade.sql +++ b/database.upgrade.sql @@ -63,3 +63,16 @@ ALTER TABLE `channels` ALTER TABLE `bots` ADD `queue` TINYINT( 1 ) NOT NULL AFTER `textbot` -- version: 5 + +CREATE TABLE `donotregister` ( +`dnr_id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , +`dnr_target` VARCHAR( 256 ) NOT NULL , +`dnr_user` INT( 11 ) NOT NULL , +`dnr_timeout` INT( 20 ) NOT NULL , +`dnr_reason` TEXT NOT NULL , +UNIQUE ( +`dnr_target` +) +) ENGINE = MYISAM ; + +-- version: 6 diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index 8124048..7e6b9be 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -318,6 +318,18 @@ static const struct default_language_entry msgtab[] = { {"NS_COMMANDS_ACCESS", "Access"}, {"NS_COMMANDS_GACCESS", "GodAccess"}, {"NS_COMMANDS_FUNCTION", "Function"}, + {"NS_DNR_SET", "$b%s$b is do-not-register (by $b%s$b): %s" }, + {"NS_DNR_SET_EXPIRES", "$b%s$b is do-not-register (by $b%s$b; expires %s): %s" }, + {"NS_DNR_SET_ANONYM", "$b%s$b is do-not-register. Please contact the support to get more information."}, + {"NS_NOREGISTER_INVALID_DURATION", "$b%s$b is not a valid duration."}, + {"NS_NOREGISTER_REGISTERED", "$b%s$b is currently registered and can't be added to the do-not-register list."}, + {"NS_NOREGISTER_DONE", "added $b%s$b to the do-not-register list."}, + {"NS_NOREGISTER_HEAD", "The following do-not-registers were found:"}, + {"NS_DNR_TARGET", "Target"}, + {"NS_DNR_USER", "Issuer"}, + {"NS_DNR_EXPIRES", "Expires"}, + {"NS_DNR_REASON", "Reason"}, + {NULL, NULL} }; diff --git a/src/cmd_global_register.c b/src/cmd_global_register.c index 08c172a..61d3e90 100644 --- a/src/cmd_global_register.c +++ b/src/cmd_global_register.c @@ -53,6 +53,23 @@ CMD_BIND(global_cmd_register) { } else multibot = 1; } + printf_mysql_query("SELECT `user_user`, `dnr_timeout`, `dnr_reason`, `dnr_id` FROM `donotregister` LEFT JOIN `users` ON `dnr_user` = `user_id` WHERE `dnr_target` = '%s'", escape_string(channel)); + res = mysql_use(); + if((row = mysql_fetch_row(res)) != NULL) { + int expire_time = atoi(row[1]); + if(expire_time) { + if(expire_time - time(0) <= 0) { + printf_mysql_query("DELETE FROM `donotregister` WHERE `dnr_id` = '%s'", row[3]); + } else { + char expireBuf[MAXLEN]; + reply(getTextBot(), user, "NS_DNR_SET_EXPIRES", channel, row[0], timeToStr(user, (expire_time - time(0)), 2, expireBuf), row[2]); + return; + } + } else { + reply(getTextBot(), user, "NS_DNR_SET", channel, row[0], row[2]); + return; + } + } //if theres already another bot in the channel we don't need a owner parameter... if(multibot && argc < 2) { //skip all these owner check lines @@ -157,6 +174,23 @@ static void global_cmd_register_async1(struct ClientSocket *client, struct Clien else adminid = 0; if(multibot != 2) { + printf_mysql_query("SELECT `user_user`, `dnr_timeout`, `dnr_reason`, `dnr_id` FROM `donotregister` LEFT JOIN `users` ON `dnr_user` = `user_id` WHERE `dnr_target` = '%s'", escape_string(auth)); + res = mysql_use(); + if((row = mysql_fetch_row(res)) != NULL) { + int expire_time = atoi(row[1]); + if(expire_time) { + if(expire_time - time(0) <= 0) { + printf_mysql_query("DELETE FROM `donotregister` WHERE `dnr_id` = '%s'", row[3]); + } else { + char expireBuf[MAXLEN]; + reply(getTextBot(), user, "NS_DNR_SET_EXPIRES", auth, row[0], timeToStr(user, (expire_time - time(0)), 2, expireBuf), row[2]); + return; + } + } else { + reply(getTextBot(), user, "NS_DNR_SET", auth, row[0], row[2]); + return; + } + } printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { diff --git a/src/cmd_neonserv.h b/src/cmd_neonserv.h index c6eb9dc..334a002 100644 --- a/src/cmd_neonserv.h +++ b/src/cmd_neonserv.h @@ -74,6 +74,7 @@ CMD_BIND(neonserv_cmd_mdeluser); CMD_BIND(neonserv_cmd_mode); CMD_BIND(neonserv_cmd_move); CMD_BIND(neonserv_cmd_myaccess); +CMD_BIND(neonserv_cmd_noregister); CMD_BIND(neonserv_cmd_op); CMD_BIND(neonserv_cmd_opall); CMD_BIND(neonserv_cmd_oplog); diff --git a/src/cmd_neonserv_giveowner.c b/src/cmd_neonserv_giveowner.c index 3d41b02..dd203d8 100644 --- a/src/cmd_neonserv_giveowner.c +++ b/src/cmd_neonserv_giveowner.c @@ -103,6 +103,22 @@ static void neonserv_cmd_giveowner_async1(struct ClientSocket *client, struct Cl } MYSQL_RES *res; MYSQL_ROW row; + printf_mysql_query("SELECT `user_user`, `dnr_timeout`, `dnr_reason`, `dnr_id` FROM `donotregister` LEFT JOIN `users` ON `dnr_user` = `user_id` WHERE `dnr_target` = '%s'", escape_string(auth)); + res = mysql_use(); + if((row = mysql_fetch_row(res)) != NULL) { + int expire_time = atoi(row[1]); + if(expire_time) { + if(expire_time - time(0) <= 0) { + printf_mysql_query("DELETE FROM `donotregister` WHERE `dnr_id` = '%s'", row[3]); + } else { + reply(getTextBot(), user, "NS_DNR_SET_ANONYM", auth); + return; + } + } else { + reply(getTextBot(), user, "NS_DNR_SET_ANONYM", auth); + return; + } + } int userid; printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); res = mysql_use(); diff --git a/src/cmd_neonserv_noregister.c b/src/cmd_neonserv_noregister.c new file mode 100644 index 0000000..e67992f --- /dev/null +++ b/src/cmd_neonserv_noregister.c @@ -0,0 +1,195 @@ +/* cmd_neonserv_noregister.c - NeonServ v5.2 + * 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] *auth/#channel +* argv[1] duration +* argv[2-*] reason +*/ + +static AUTHLOOKUP_CALLBACK(neonserv_cmd_noregister_auth_lookup); +static USERAUTH_CALLBACK(neonserv_cmd_noregister_nick_lookup); +static void neonserv_cmd_noregister_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event,char *auth, int duration, char *reason); +static void neonserv_cmd_noregister_list(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, char **argv, int argc); + +struct neonserv_cmd_noregister_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct ChanNode *chan; + struct Event *event; + int duration; + char *reason, *nick; +}; + +CMD_BIND(neonserv_cmd_noregister) { + if(argc < 3) { + neonserv_cmd_noregister_list(client, user, chan, event, argv, argc); + return; + } + int duration = strToTime(user, argv[1]); + if(duration == 0 && strcmp(argv[1], "0")) { + reply(getTextBot(), user, "NS_NOREGISTER_INVALID_DURATION", argv[1]); + return; + } + char *reason = merge_argv(argv, 2, argc); + MYSQL_RES *res; + MYSQL_ROW row; + if(argv[0][0] == '#') { + printf_mysql_query("SELECT `botid` FROM `bot_channels` LEFT JOIN `channels` ON `bot_channels`.`chanid` = `channels`.`channel_id` WHERE `channel_name` = '%s'", escape_string(argv[0])); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + reply(getTextBot(), user, "NS_NOREGISTER_REGISTERED", argv[0]); + return; + } + neonserv_cmd_noregister_async1(client, getTextBot(), user, chan, event, argv[0], duration, reason); + } else 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_noregister_async1(client, getTextBot(), user, chan, event, row[0], duration, reason); + } else { + //we need to create a new user... + //but first lookup the auth to check if it really exists + struct neonserv_cmd_noregister_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->chan = chan; + cache->event = event; + cache->nick = strdup(argv[0]); + cache->duration = duration; + cache->reason = strdup(reason); + lookup_authname(argv[0], neonserv_cmd_noregister_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_noregister_async1(client, getTextBot(), user, chan, event, cuser->auth, duration, reason); + } else { + struct neonserv_cmd_noregister_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->chan = chan; + cache->event = event; + cache->nick = strdup(user->nick); + cache->duration = duration; + cache->reason = strdup(reason); + get_userauth(cuser, neonserv_cmd_noregister_nick_lookup, cache); + } + } +} + +static AUTHLOOKUP_CALLBACK(neonserv_cmd_noregister_auth_lookup) { + struct neonserv_cmd_noregister_cache *cache = data; + if(!exists) { + //AUTH_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick); + } else + neonserv_cmd_noregister_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, auth, cache->duration, cache->reason); + free(cache->reason); + free(cache->nick); + free(cache); +} + +static USERAUTH_CALLBACK(neonserv_cmd_noregister_nick_lookup) { + struct neonserv_cmd_noregister_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_noregister_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, user->auth, cache->duration, cache->reason); + free(cache->reason); + free(cache->nick); + free(cache); +} + +static void neonserv_cmd_noregister_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event,char *auth, int duration, char *reason) { + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `dnr_id` FROM `donotregister` WHERE `dnr_target` = '%s'", escape_string(auth)); + res = mysql_use(); + if((row = mysql_fetch_row(res)) != NULL) { + printf_mysql_query("DELETE FROM `donotregister` WHERE `dnr_id` = '%s'", row[0]); + } + int userid; + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) + userid = atoi(row[0]); + else + userid = 0; + printf_mysql_query("INSERT INTO `donotregister` (`dnr_target`, `dnr_timeout`, `dnr_user`, `dnr_reason`) VALUES ('%s', '%lu', '%d', '%s')", escape_string(auth), (duration ? (time(0)+duration) : 0), userid, escape_string(reason)); + reply(getTextBot(), user, "NS_NOREGISTER_DONE", auth); +} + +static void neonserv_cmd_noregister_list(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, char **argv, int argc) { + struct Table *table; + int entrys = 0; + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `dnr_target`, `dnr_timeout`, `user_user`, `dnr_reason` FROM `donotregister` LEFT JOIN `users` ON `dnr_user` = `user_id` ORDER BY `dnr_target` ASC"); + res = mysql_use(); + table = table_init(4, mysql_num_rows(res) + 1, 0); + char *content[4]; + content[0] = get_language_string(user, "NS_DNR_TARGET"); + content[1] = get_language_string(user, "NS_DNR_USER"); + content[2] = get_language_string(user, "NS_DNR_EXPIRES"); + content[3] = get_language_string(user, "NS_DNR_REASON"); + table_add(table, content); + int duration; + char expires_str[MAXLEN]; + while ((row = mysql_fetch_row(res)) != NULL) { + entrys++; + content[0] = row[0]; + content[1] = row[2]; + duration = atoi(row[1]); + content[2] = (duration ? timeToStr(user, (duration - time(0)), 2, expires_str) : get_language_string(user, "NS_USERS_SEEN_NEVER")); + content[3] = row[3]; + table_add(table, content); + } + //send the table + char **table_lines = table_end(table); + int i; + for(i = 0; i < table->entrys; i++) { + reply(getTextBot(), user, table_lines[i]); + } + if(!entrys) + reply(getTextBot(), user, "NS_TABLE_NONE"); + table_free(table); +} diff --git a/src/commands.c b/src/commands.c index 93e7d73..9fe3005 100644 --- a/src/commands.c +++ b/src/commands.c @@ -118,6 +118,7 @@ void register_commands() { 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); OPER_COMMAND("unvisited", neonserv_cmd_unvisited, 0, 400, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("noregister", neonserv_cmd_noregister,0, 300, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); #undef OPER_COMMAND //NeonSpam Commands diff --git a/src/mysqlConn.c b/src/mysqlConn.c index faeb701..272bb21 100644 --- a/src/mysqlConn.c +++ b/src/mysqlConn.c @@ -16,7 +16,7 @@ */ #include "mysqlConn.h" -#define DATABASE_VERSION "5" +#define DATABASE_VERSION "6" struct used_result { MYSQL_RES *result; -- 2.20.1