diff options
-rw-r--r-- | general_network.c | 48 | ||||
-rw-r--r-- | general_network.h | 2 | ||||
-rw-r--r-- | protocols.c | 14 | ||||
-rw-r--r-- | protocols.h | 12 | ||||
-rw-r--r-- | protocols/inspircd2.c | 42 | ||||
-rw-r--r-- | protocols/inspircd2.h | 6 | ||||
-rw-r--r-- | pseudoclients.c | 11 | ||||
-rw-r--r-- | pseudoclients.h | 8 | ||||
-rw-r--r-- | pseudoclients/haxserv.c | 7 | ||||
-rw-r--r-- | pseudoclients/haxserv.h | 4 | ||||
-rw-r--r-- | pseudoclients/services.c | 49 | ||||
-rw-r--r-- | pseudoclients/services.h | 4 |
12 files changed, 154 insertions, 53 deletions
diff --git a/general_network.c b/general_network.c index f5ce1e3..d04dbcd 100644 --- a/general_network.c +++ b/general_network.c @@ -374,38 +374,54 @@ int add_user(struct string from, struct string attached_to, struct string uid, s return 1; } -int rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp) { +int rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp, char forced, char immediate) { struct string timestamp_str; if (unsigned_to_str(timestamp, ×tamp_str) != 0) return 1; - void *tmp = malloc(nick.len); - if (!tmp) { - free(timestamp_str.data); - return 1; + if (forced && !immediate && STRING_EQ(user->server, SID)) + immediate = 1; + + void *tmp; + if (immediate) { + tmp = malloc(nick.len); + if (!tmp) { + free(timestamp_str.data); + return 1; + } } #ifdef USE_SERVER - if (protocols_handle_rename_user(from, user, nick, timestamp, timestamp_str) != 0) { - free(tmp); - free(timestamp_str.data); + if (protocols_handle_rename_user(from, user, nick, timestamp, timestamp_str, forced, immediate) != 0) { + if (immediate) { + free(tmp); + free(timestamp_str.data); + } return 1; } - protocols_propagate_rename_user(from, user, nick, timestamp, timestamp_str); + protocols_propagate_rename_user(from, user, nick, timestamp, timestamp_str, forced, immediate); #endif #ifdef USE_PSEUDOCLIENTS - pseudoclients_handle_rename_user(from, user, nick, timestamp); + pseudoclients_handle_rename_user(from, user, nick, timestamp, forced, immediate); + + size_t old_timestamp = user->nick_ts; #endif - free(user->nick.data); - user->nick.data = tmp; - memcpy(user->nick.data, nick.data, nick.len); - user->nick.len = nick.len; + if (immediate) { + free(user->nick.data); + user->nick.data = tmp; + memcpy(user->nick.data, nick.data, nick.len); + user->nick.len = nick.len; + + user->nick_ts_str = timestamp_str; + user->nick_ts = timestamp; + } - user->nick_ts_str = timestamp_str; - user->nick_ts = timestamp; +#ifdef USE_PSEUDOCLIENTS + pseudoclients_handle_post_rename_user(from, user, nick, old_timestamp, forced, immediate); +#endif return 0; } diff --git a/general_network.h b/general_network.h index c08bf18..5099c7d 100644 --- a/general_network.h +++ b/general_network.h @@ -132,7 +132,7 @@ int resolve(struct string address, struct string port, struct sockaddr *sockaddr int init_general_network(void); int add_user(struct string from, struct string attached_to, struct string uid, struct string nick, struct string fullname, struct string ident, struct string vhost, struct string host, struct string address, size_t user_ts, size_t nick_ts, void *handle, size_t protocol, size_t net, char is_pseudoclient, size_t pseudoclient); -int rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp); +int rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp, char forced, char immediate); void remove_user(struct string from, struct user_info *user, struct string reason, char propagate); int kill_user(struct string from, struct string source, struct user_info *user, struct string reason); int oper_user(struct string from, struct user_info *user, struct string type, struct string source); diff --git a/protocols.c b/protocols.c index d4a82db..56eecc0 100644 --- a/protocols.c +++ b/protocols.c @@ -223,11 +223,11 @@ void protocols_propagate_new_user(struct string from, struct user_info *info) { } } -void protocols_propagate_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str) { +void protocols_propagate_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate) { for (size_t i = 0; i < NUM_PROTOCOLS; i++) { if (!active_protocols[i]) continue; - protocols[i].propagate_rename_user(from, info, nick, timestamp, timestamp_str); + protocols[i].propagate_rename_user(from, info, nick, timestamp, timestamp_str, forced, immediate); } } @@ -371,12 +371,12 @@ int protocols_handle_new_user(struct string from, struct user_info *info) { return 1; } -int protocols_handle_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str) { +int protocols_handle_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate) { size_t i; for (i = 0; i < NUM_PROTOCOLS; i++) { if (!active_protocols[i]) continue; - if (protocols[i].handle_rename_user(from, info, nick, timestamp, timestamp_str) != 0) + if (protocols[i].handle_rename_user(from, info, nick, timestamp, timestamp_str, forced, immediate) != 0) goto protocols_handle_rename_user_fail; } @@ -387,7 +387,7 @@ int protocols_handle_rename_user(struct string from, struct user_info *info, str i--; if (!active_protocols[i]) continue; - protocols[i].fail_rename_user(from, info, nick, timestamp, timestamp_str); + protocols[i].fail_rename_user(from, info, nick, timestamp, timestamp_str, forced, immediate); } return 1; @@ -551,11 +551,11 @@ void protocols_fail_new_user(struct string from, struct user_info *info) { } } -void protocols_fail_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str) { +void protocols_fail_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate) { for (size_t i = 0; i < NUM_PROTOCOLS; i++) { if (!active_protocols[i]) continue; - protocols[i].fail_rename_user(from, info, nick, timestamp, timestamp_str); + protocols[i].fail_rename_user(from, info, nick, timestamp, timestamp_str, forced, immediate); } } diff --git a/protocols.h b/protocols.h index ca69aac..189d58d 100644 --- a/protocols.h +++ b/protocols.h @@ -47,7 +47,7 @@ struct protocol { void (*propagate_unlink_server)(struct string from, struct server_info *a, struct server_info *b, size_t protocol); void (*propagate_new_user)(struct string from, struct user_info *info); - void (*propagate_rename_user)(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str); + void (*propagate_rename_user)(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate); void (*propagate_remove_user)(struct string from, struct user_info *info, struct string reason); void (*propagate_kill_user)(struct string from, struct string source, struct user_info *info, struct string reason); void (*propagate_oper_user)(struct string from, struct user_info *info, struct string type, struct string reason); @@ -68,7 +68,7 @@ struct protocol { void (*handle_unlink_server)(struct string from, struct server_info *a, struct server_info *b, size_t protocol); int (*handle_new_user)(struct string from, struct user_info *info); - int (*handle_rename_user)(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str); + int (*handle_rename_user)(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate); void (*handle_remove_user)(struct string from, struct user_info *info, struct string reason, char propagate); void (*handle_kill_user)(struct string from, struct string source, struct user_info *info, struct string reason); int (*handle_oper_user)(struct string from, struct user_info *info, struct string type, struct string reason); @@ -86,7 +86,7 @@ struct protocol { void (*fail_new_server)(struct string from, struct string attached_to, struct server_info *info); void (*fail_new_user)(struct string from, struct user_info *info); - void (*fail_rename_user)(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str); + void (*fail_rename_user)(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate); void (*fail_oper_user)(struct string from, struct user_info *info, struct string type, struct string source); void (*fail_set_account)(struct string from, struct user_info *info, struct string account, struct string source); @@ -107,7 +107,7 @@ void protocols_propagate_new_server(struct string from, struct string attached_t void protocols_propagate_unlink_server(struct string from, struct server_info *a, struct server_info *b, size_t protocol); void protocols_propagate_new_user(struct string from, struct user_info *info); -void protocols_propagate_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str); +void protocols_propagate_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate); void protocols_propagate_remove_user(struct string from, struct user_info *info, struct string reason); void protocols_propagate_kill_user(struct string from, struct string source, struct user_info *info, struct string reason); void protocols_propagate_oper_user(struct string from, struct user_info *info, struct string type, struct string source); @@ -127,7 +127,7 @@ int protocols_handle_new_server(struct string from, struct string attached_to, s void protocols_handle_unlink_server(struct string from, struct server_info *a, struct server_info *b, size_t protocol); int protocols_handle_new_user(struct string from, struct user_info *info); -int protocols_handle_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str); +int protocols_handle_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate); void protocols_handle_remove_user(struct string from, struct user_info *info, struct string reason, char propagate); void protocols_handle_kill_user(struct string from, struct string source, struct user_info *info, struct string reason); int protocols_handle_oper_user(struct string from, struct user_info *info, struct string type, struct string source); @@ -143,7 +143,7 @@ void protocols_handle_kick_channel(struct string from, struct string source, str void protocols_fail_new_server(struct string from, struct string attached_to, struct server_info *info); void protocols_fail_new_user(struct string from, struct user_info *info); -void protocols_fail_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str); +void protocols_fail_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate); void protocols_fail_oper_user(struct string from, struct user_info *info, struct string type, struct string source); void protocols_fail_set_account(struct string from, struct user_info *info, struct string account, struct string source); diff --git a/protocols/inspircd2.c b/protocols/inspircd2.c index b19960e..c11577e 100644 --- a/protocols/inspircd2.c +++ b/protocols/inspircd2.c @@ -639,14 +639,34 @@ void inspircd2_protocol_propagate_new_user(struct string from, struct user_info } // :source NICK <nick> <timestamp> -void inspircd2_protocol_propagate_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp, struct string timestamp_str) { - inspircd2_protocol_propagate(from, STRING(":")); - inspircd2_protocol_propagate(from, user->uid); - inspircd2_protocol_propagate(from, STRING(" NICK ")); - inspircd2_protocol_propagate(from, nick); - inspircd2_protocol_propagate(from, STRING(" ")); - inspircd2_protocol_propagate(from, timestamp_str); - inspircd2_protocol_propagate(from, STRING("\n")); +void inspircd2_protocol_propagate_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate) { + if (forced) { + if (STRING_EQ(user->uid, nick)) { + inspircd2_protocol_propagate(from, STRING(":")); + inspircd2_protocol_propagate(from, from); + inspircd2_protocol_propagate(from, STRING(" SAVE ")); + inspircd2_protocol_propagate(from, user->uid); + inspircd2_protocol_propagate(from, STRING(" :")); + inspircd2_protocol_propagate(from, user->nick_ts_str); + inspircd2_protocol_propagate(from, STRING("\n")); + } else { + inspircd2_protocol_propagate(from, STRING(":")); + inspircd2_protocol_propagate(from, from); + inspircd2_protocol_propagate(from, STRING(" SANICK ")); + inspircd2_protocol_propagate(from, user->uid); + inspircd2_protocol_propagate(from, STRING(" :")); + inspircd2_protocol_propagate(from, nick); + inspircd2_protocol_propagate(from, STRING("\n")); + } + } else { + inspircd2_protocol_propagate(from, STRING(":")); + inspircd2_protocol_propagate(from, user->uid); + inspircd2_protocol_propagate(from, STRING(" NICK ")); + inspircd2_protocol_propagate(from, nick); + inspircd2_protocol_propagate(from, STRING(" ")); + inspircd2_protocol_propagate(from, timestamp_str); + inspircd2_protocol_propagate(from, STRING("\n")); + } } // :source QUIT [<reason>?] @@ -860,7 +880,7 @@ int inspircd2_protocol_handle_new_user(struct string from, struct user_info *inf return 0; } -int inspircd2_protocol_handle_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str) { +int inspircd2_protocol_handle_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate) { return 0; } @@ -908,7 +928,7 @@ void inspircd2_protocol_fail_new_user(struct string from, struct user_info *info return; } -void inspircd2_protocol_fail_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str) { +void inspircd2_protocol_fail_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate) { return; } @@ -1404,7 +1424,7 @@ int inspircd2_protocol_handle_nick(struct string source, size_t argc, struct str if (!user) return 0; // KILL timings, etc - if (rename_user(config->sid, user, argv[0], nick_ts) != 0) + if (rename_user(config->sid, user, argv[0], nick_ts, 0, 1) != 0) return -1; return 0; diff --git a/protocols/inspircd2.h b/protocols/inspircd2.h index 7c5bc99..144ba15 100644 --- a/protocols/inspircd2.h +++ b/protocols/inspircd2.h @@ -49,7 +49,7 @@ void inspircd2_protocol_propagate_new_server(struct string from, struct string a void inspircd2_protocol_propagate_unlink_server(struct string from, struct server_info *a, struct server_info *b, size_t protocol); void inspircd2_protocol_propagate_new_user(struct string from, struct user_info *info); -void inspircd2_protocol_propagate_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str); +void inspircd2_protocol_propagate_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate); void inspircd2_protocol_propagate_remove_user(struct string from, struct user_info *info, struct string reason); void inspircd2_protocol_propagate_kill_user(struct string from, struct string source, struct user_info *info, struct string reason); void inspircd2_protocol_propagate_oper_user(struct string from, struct user_info *info, struct string type, struct string source); @@ -69,7 +69,7 @@ int inspircd2_protocol_handle_new_server(struct string from, struct string attac void inspircd2_protocol_handle_unlink_server(struct string from, struct server_info *a, struct server_info *b, size_t protocol); int inspircd2_protocol_handle_new_user(struct string from, struct user_info *info); -int inspircd2_protocol_handle_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str); +int inspircd2_protocol_handle_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate); void inspircd2_protocol_handle_remove_user(struct string from, struct user_info *info, struct string reason, char propagate); void inspircd2_protocol_handle_kill_user(struct string from, struct string source, struct user_info *info, struct string reason); int inspircd2_protocol_handle_oper_user(struct string from, struct user_info *info, struct string type, struct string source); @@ -85,7 +85,7 @@ void inspircd2_protocol_handle_kick_channel(struct string from, struct string so void inspircd2_protocol_fail_new_server(struct string from, struct string attached_to, struct server_info *info); void inspircd2_protocol_fail_new_user(struct string from, struct user_info *info); -void inspircd2_protocol_fail_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str); +void inspircd2_protocol_fail_rename_user(struct string from, struct user_info *info, struct string nick, size_t timestamp, struct string timestamp_str, char forced, char immediate); void inspircd2_protocol_fail_oper_user(struct string from, struct user_info *info, struct string type, struct string source); void inspircd2_protocol_fail_set_account(struct string from, struct user_info *info, struct string account, struct string source); diff --git a/pseudoclients.c b/pseudoclients.c index 506a305..77ba1e2 100644 --- a/pseudoclients.c +++ b/pseudoclients.c @@ -101,10 +101,10 @@ void pseudoclients_handle_privmsg(struct string from, struct string sender, stru } } -void pseudoclients_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp) { +void pseudoclients_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp, char forced, char immediate) { for (size_t i = 0; i < NUM_PSEUDOCLIENTS; i++) { if (pseudoclients[i].active) - pseudoclients[i].handle_rename_user(from, user, nick, timestamp); + pseudoclients[i].handle_rename_user(from, user, nick, timestamp, forced, immediate); } } @@ -114,3 +114,10 @@ void pseudoclients_handle_set_cert(struct string from, struct user_info *user, s pseudoclients[i].handle_set_cert(from, user, cert, source); } } + +void pseudoclients_handle_post_rename_user(struct string from, struct user_info *user, struct string nick, size_t old_timestamp, char forced, char immediate) { + for (size_t i = 0; i < NUM_PSEUDOCLIENTS; i++) { + if (pseudoclients[i].active) + pseudoclients[i].handle_post_rename_user(from, user, nick, old_timestamp, forced, immediate); + } +} diff --git a/pseudoclients.h b/pseudoclients.h index 0dddc72..606cb39 100644 --- a/pseudoclients.h +++ b/pseudoclients.h @@ -44,9 +44,11 @@ struct pseudoclient { void (*handle_privmsg)(struct string from, struct string source, struct string target, struct string msg); - void (*handle_rename_user)(struct string from, struct user_info *user, struct string nick, size_t timestamp); + void (*handle_rename_user)(struct string from, struct user_info *user, struct string nick, size_t timestamp, char forced, char immediate); void (*handle_set_cert)(struct string from, struct user_info *user, struct string cert, struct string source); + + void (*handle_post_rename_user)(struct string from, struct user_info *user, struct string nick, size_t timestamp, char forced, char immediate); }; int init_pseudoclients(void); @@ -65,5 +67,7 @@ extern struct pseudoclient pseudoclients[NUM_PSEUDOCLIENTS]; extern char reload_pseudoclients[NUM_PSEUDOCLIENTS]; void pseudoclients_handle_privmsg(struct string from, struct string source, struct string target, struct string msg); -void pseudoclients_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp); +void pseudoclients_handle_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp, char forced, char immediate); void pseudoclients_handle_set_cert(struct string from, struct user_info *user, struct string cert, struct string source); + +void pseudoclients_handle_post_rename_user(struct string from, struct user_info *user, struct string nick, size_t timestamp, char forced, char immediate); 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); |