diff options
-rw-r--r-- | pseudoclients/services.c | 64 |
1 files changed, 52 insertions, 12 deletions
diff --git a/pseudoclients/services.c b/pseudoclients/services.c index d52a64d..a61919d 100644 --- a/pseudoclients/services.c +++ b/pseudoclients/services.c @@ -628,28 +628,30 @@ void services_pseudoclient_handle_post_rename_user(struct string from, struct us 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) + struct string nick_upper; + if (str_clone(&nick_upper, nick) != 0) return; - for (size_t i = 0; i < account_upper.len; i++) - account_upper.data[i] = CASEMAP(account_upper.data[i]); + for (size_t i = 0; i < nick_upper.len; i++) + nick_upper.data[i] = CASEMAP(nick_upper.data[i]); MDB_val key = { - .mv_data = account_upper.data, - .mv_size = account_upper.len, + .mv_data = nick_upper.data, + .mv_size = nick_upper.len, }; MDB_val data; + MDB_txn *txn; + if (mdb_txn_begin(services_db_env, NULL, MDB_RDONLY, &txn) != 0) { + free(nick_upper.data); + return; + } + if (mdb_get(txn, services_nick_to_account, &key, &data) != 0) { - free(account_upper.data); + free(nick_upper.data); mdb_txn_abort(txn); return; } - free(account_upper.data); + free(nick_upper.data); key = data; if (mdb_get(txn, services_account_to_name, &key, &data) != 0) { @@ -692,6 +694,44 @@ void services_pseudoclient_handle_set_cert(struct string from, struct user_info struct string account = {.data = data.mv_data, .len = data.mv_size}; set_account(SID, user, account, NICKSERV_UID); mdb_txn_abort(txn); + } else { + struct string nick_upper; + if (str_clone(&nick_upper, user->nick) != 0) + return; + for (size_t i = 0; i < nick_upper.len; i++) + nick_upper.data[i] = CASEMAP(nick_upper.data[i]); + + MDB_val key = { + .mv_data = nick_upper.data, + .mv_size = nick_upper.len, + }; + MDB_val data; + + MDB_txn *txn; + if (mdb_txn_begin(services_db_env, NULL, MDB_RDONLY, &txn) != 0) { + free(nick_upper.data); + return; + } + + if (mdb_get(txn, services_nick_to_account, &key, &data) != 0) { + free(nick_upper.data); + mdb_txn_abort(txn); + return; + } + free(nick_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; |