diff options
author | Test_User <hax@andrewyu.org> | 2024-06-26 13:34:39 -0400 |
---|---|---|
committer | Test_User <hax@andrewyu.org> | 2024-06-26 13:34:39 -0400 |
commit | 77c4fc5f20d8d9061412a10c219d4ffeb2cd60c5 (patch) | |
tree | ba9c7f9bb741f8841f0eeefda7787232a868c015 /pseudoclients | |
parent | e02ba025f1f6be0dac2c490851a27c7abae0b1a0 (diff) | |
download | haxircd-77c4fc5f20d8d9061412a10c219d4ffeb2cd60c5.tar.gz haxircd-77c4fc5f20d8d9061412a10c219d4ffeb2cd60c5.zip |
UNGROUP
Diffstat (limited to 'pseudoclients')
-rw-r--r-- | pseudoclients/services.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/pseudoclients/services.c b/pseudoclients/services.c index 559cca3..c667ede 100644 --- a/pseudoclients/services.c +++ b/pseudoclients/services.c @@ -264,6 +264,62 @@ void services_pseudoclient_handle_privmsg(struct string from, struct string sour group_fail: notice(SID, NICKSERV_UID, user->uid, STRING("Unable to group nickname.")); return; + } else if (case_string_eq(msg, STRING("UNGROUP"))) { + if (user->account_name.len == 0) + goto ungroup_fail; + struct string nick_upper; + if (str_clone(&nick_upper, user->nick) != 0) + goto ungroup_fail; + for (size_t i = 0; i < nick_upper.len; i++) + nick_upper.data[i] = CASEMAP(nick_upper.data[i]); + struct string account_upper; + if (str_clone(&account_upper, user->account_name) != 0) + goto ungroup_fail_free_nick; + for (size_t i = 0; i < account_upper.len; i++) + account_upper.data[i] = CASEMAP(account_upper.data[i]); + + if (STRING_EQ(account_upper, nick_upper)) { + notice(SID, NICKSERV_UID, user->uid, STRING("This is your accountname. Please change your account name first. <not yet implemented>")); + goto ungroup_fail_free_account; + } + + MDB_txn *txn; + if (mdb_txn_begin(services_db_env, NULL, 0, &txn) != 0) + goto ungroup_fail_free_account; + + MDB_val key = { + .mv_data = nick_upper.data, + .mv_size = nick_upper.len, + }; + + if (mdb_del(txn, services_nick_to_account, &key, 0) != 0) + goto ungroup_fail_abort; + + MDB_val data = key; + key.mv_data = account_upper.data; + key.mv_size = account_upper.len; + + if (mdb_del(txn, services_account_to_nicks, &key, &data) != 0) + goto ungroup_fail_abort; + + if (mdb_txn_commit(txn) != 0) + goto ungroup_fail_free_account; + + notice(SID, NICKSERV_UID, user->uid, STRING("Nickname ungrouped.")); + + free(account_upper.data); + free(nick_upper.data); + return; + + ungroup_fail_abort: + mdb_txn_abort(txn); + ungroup_fail_free_account: + free(account_upper.data); + ungroup_fail_free_nick: + free(nick_upper.data); + ungroup_fail: + notice(SID, NICKSERV_UID, user->uid, STRING("Unable to ungroup nickname.")); + return; } else if (case_string_eq(msg, STRING("LIST"))) { if (user->account_name.len == 0) { notice(SID, NICKSERV_UID, user->uid, STRING("You are not logged in.")); @@ -370,6 +426,7 @@ void services_pseudoclient_handle_privmsg(struct string from, struct string sour notice(SID, NICKSERV_UID, user->uid, STRING("Cert added.")); + free(account_upper.data); return; addcert_fail_abort: @@ -419,6 +476,7 @@ void services_pseudoclient_handle_privmsg(struct string from, struct string sour notice(SID, NICKSERV_UID, user->uid, STRING("Cert removed.")); + free(account_upper.data); return; delcert_fail_abort: @@ -433,6 +491,7 @@ void services_pseudoclient_handle_privmsg(struct string from, struct string sour notice(SID, NICKSERV_UID, user->uid, STRING(" HELP lists commands.")); notice(SID, NICKSERV_UID, user->uid, STRING(" REGISTER registers your current nick to your current TLS client cert.")); notice(SID, NICKSERV_UID, user->uid, STRING(" GROUP adds your current nick to your account.")); + notice(SID, NICKSERV_UID, user->uid, STRING(" UNGROUP removes your current nick from your account.")); notice(SID, NICKSERV_UID, user->uid, STRING(" ADDCERT adds a specified cert to your account.")); notice(SID, NICKSERV_UID, user->uid, STRING(" DELCERT removes a specified cert from your account.")); notice(SID, NICKSERV_UID, user->uid, STRING(" LIST lists nicks and certs associated with your account.")); |