aboutsummaryrefslogtreecommitdiff
path: root/pseudoclients
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2024-07-18 20:12:29 -0400
committerTest_User <hax@andrewyu.org>2024-07-18 20:32:10 -0400
commite755e8b341eea1b37ef82584cd65a05edf8fdbaa (patch)
tree63862f2609e7470ec3cb432b416626b90fe6f3f8 /pseudoclients
parent925da4ee0c7364900e67c1c6ce4a1323166d5198 (diff)
downloadhaxircd-e755e8b341eea1b37ef82584cd65a05edf8fdbaa.tar.gz
haxircd-e755e8b341eea1b37ef82584cd65a05edf8fdbaa.zip
Partial nickname enforcement implemented
Diffstat (limited to 'pseudoclients')
-rw-r--r--pseudoclients/haxserv.c7
-rw-r--r--pseudoclients/haxserv.h4
-rw-r--r--pseudoclients/services.c49
-rw-r--r--pseudoclients/services.h4
4 files changed, 59 insertions, 5 deletions
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);