aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--general_network.c48
-rw-r--r--general_network.h2
-rw-r--r--protocols.c14
-rw-r--r--protocols.h12
-rw-r--r--protocols/inspircd2.c42
-rw-r--r--protocols/inspircd2.h6
-rw-r--r--pseudoclients.c11
-rw-r--r--pseudoclients.h8
-rw-r--r--pseudoclients/haxserv.c7
-rw-r--r--pseudoclients/haxserv.h4
-rw-r--r--pseudoclients/services.c49
-rw-r--r--pseudoclients/services.h4
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, &timestamp_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);