From e755e8b341eea1b37ef82584cd65a05edf8fdbaa Mon Sep 17 00:00:00 2001 From: Test_User Date: Thu, 18 Jul 2024 20:12:29 -0400 Subject: Partial nickname enforcement implemented --- pseudoclients/haxserv.c | 7 ++++++- pseudoclients/haxserv.h | 4 +++- pseudoclients/services.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++-- pseudoclients/services.h | 4 +++- 4 files changed, 59 insertions(+), 5 deletions(-) (limited to 'pseudoclients') diff --git a/pseudoclients/haxserv.c b/pseudoclients/haxserv.c index 9d702ed..d5fa128 100644 --- a/pseudoclients/haxserv.c +++ b/pseudoclients/haxserv.c @@ -129,6 +129,7 @@ int haxserv_pseudoclient_post_reload(void) { pseudoclients[HAXSERV_PSEUDOCLIENT].handle_privmsg = haxserv_pseudoclient_handle_privmsg; pseudoclients[HAXSERV_PSEUDOCLIENT].handle_rename_user = haxserv_pseudoclient_handle_rename_user; pseudoclients[HAXSERV_PSEUDOCLIENT].handle_set_cert = haxserv_pseudoclient_handle_set_cert; + pseudoclients[HAXSERV_PSEUDOCLIENT].handle_post_rename_user = haxserv_pseudoclient_handle_post_rename_user; return 0; } @@ -302,7 +303,7 @@ void haxserv_pseudoclient_handle_privmsg(struct string from, struct string sourc } } -void haxserv_pseudoclient_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp) { +void haxserv_pseudoclient_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp, char forced, char immediate) { return; } @@ -310,6 +311,10 @@ void haxserv_pseudoclient_handle_set_cert(struct string from, struct user_info * return; } +void haxserv_pseudoclient_handle_post_rename_user(struct string from, struct user_info *user, struct string nick, size_t old_timestamp, char forced, char immediate) { + return; +} + int haxserv_pseudoclient_help_command(struct string from, struct string sender, struct string original_message, struct string respond_to, size_t argc, struct string *argv) { notice(SID, HAXSERV_UID, respond_to, STRING("Command list:")); for (size_t i = 0; i < haxserv_pseudoclient_commands.len; i++) { diff --git a/pseudoclients/haxserv.h b/pseudoclients/haxserv.h index 4f248e7..ff2c603 100644 --- a/pseudoclients/haxserv.h +++ b/pseudoclients/haxserv.h @@ -46,9 +46,11 @@ int haxserv_pseudoclient_allow_kill(struct string from, struct string source, st int haxserv_pseudoclient_allow_kick(struct string from, struct string source, struct channel_info *channel, struct user_info *user, struct string reason); void haxserv_pseudoclient_handle_privmsg(struct string from, struct string source, struct string target, struct string msg); -void haxserv_pseudoclient_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp); +void haxserv_pseudoclient_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp, char forced, char immediate); void haxserv_pseudoclient_handle_set_cert(struct string from, struct user_info *user, struct string cert, struct string source); +void haxserv_pseudoclient_handle_post_rename_user(struct string from, struct user_info *user, struct string nick, size_t old_timestamp, char forced, char immediate); + extern struct table haxserv_pseudoclient_commands; extern struct command_def haxserv_pseudoclient_help_command_def; diff --git a/pseudoclients/services.c b/pseudoclients/services.c index 2d6f495..4c96ddc 100644 --- a/pseudoclients/services.c +++ b/pseudoclients/services.c @@ -118,6 +118,8 @@ int services_pseudoclient_post_reload(void) { pseudoclients[SERVICES_PSEUDOCLIENT].handle_rename_user = services_pseudoclient_handle_rename_user; pseudoclients[SERVICES_PSEUDOCLIENT].handle_set_cert = services_pseudoclient_handle_set_cert; + pseudoclients[SERVICES_PSEUDOCLIENT].handle_post_rename_user = services_pseudoclient_handle_post_rename_user; + return 0; } @@ -512,7 +514,50 @@ void services_pseudoclient_handle_privmsg(struct string from, struct string sour return; } -void services_pseudoclient_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp) { +void services_pseudoclient_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp, char forced, char immediate) { + return; +} + +void services_pseudoclient_handle_post_rename_user(struct string from, struct user_info *user, struct string nick, size_t old_timestamp, char forced, char immediate) { + if (forced) + return; + + MDB_txn *txn; + if (mdb_txn_begin(services_db_env, NULL, MDB_RDONLY, &txn) != 0) + return; + + struct string account_upper; + if (str_clone(&account_upper, nick) != 0) + return; + for (size_t i = 0; i < account_upper.len; i++) + account_upper.data[i] = CASEMAP(account_upper.data[i]); + + MDB_val key = { + .mv_data = account_upper.data, + .mv_size = account_upper.len, + }; + MDB_val data; + + if (mdb_get(txn, services_nick_to_account, &key, &data) != 0) { + free(account_upper.data); + mdb_txn_abort(txn); + return; + } + free(account_upper.data); + + key = data; + if (mdb_get(txn, services_account_to_name, &key, &data) != 0) { + mdb_txn_abort(txn); + return; + } + + struct string required_account_name = {.data = data.mv_data, .len = data.mv_size}; + if (!STRING_EQ(required_account_name, user->account_name)) { + rename_user(SID, user, user->uid, 100, 1, 1); + } + + mdb_txn_abort(txn); + return; } @@ -538,9 +583,9 @@ void services_pseudoclient_handle_set_cert(struct string from, struct user_info mdb_txn_abort(txn); return; } - mdb_txn_abort(txn); struct string account = {.data = data.mv_data, .len = data.mv_size}; set_account(SID, user, account, NICKSERV_UID); + mdb_txn_abort(txn); } return; diff --git a/pseudoclients/services.h b/pseudoclients/services.h index e1dfe63..7361cea 100644 --- a/pseudoclients/services.h +++ b/pseudoclients/services.h @@ -46,5 +46,7 @@ int services_pseudoclient_allow_kill(struct string from, struct string source, s int services_pseudoclient_allow_kick(struct string from, struct string source, struct channel_info *channel, struct user_info *user, struct string reason); void services_pseudoclient_handle_privmsg(struct string from, struct string source, struct string target, struct string msg); -void services_pseudoclient_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp); +void services_pseudoclient_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp, char forced, char immediate); void services_pseudoclient_handle_set_cert(struct string from, struct user_info *user, struct string cert, struct string source); + +void services_pseudoclient_handle_post_rename_user(struct string from, struct user_info *user, struct string nick, size_t old_timestamp, char forced, char immediate); -- cgit v1.2.3