aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2024-07-25 22:05:40 -0400
committerTest_User <hax@andrewyu.org>2024-07-25 22:05:40 -0400
commitb63f84c3f75bd5f5c4dc8619dc9bc84896a75d50 (patch)
tree2a610a466a4eda680fe3e72a464cf5f705187dd2
parentac2ea4055b55db21f9e2cc311eab8656126b92b3 (diff)
downloadhaxircd-b63f84c3f75bd5f5c4dc8619dc9bc84896a75d50.tar.gz
haxircd-b63f84c3f75bd5f5c4dc8619dc9bc84896a75d50.zip
Fix some member ID-related bugs
-rw-r--r--protocols/inspircd3.c54
-rw-r--r--protocols/inspircd4.c54
2 files changed, 92 insertions, 16 deletions
diff --git a/protocols/inspircd3.c b/protocols/inspircd3.c
index ba93431..e3dca1c 100644
--- a/protocols/inspircd3.c
+++ b/protocols/inspircd3.c
@@ -748,12 +748,13 @@ void inspircd3_protocol_propagate_set_channel(struct string from, struct channel
struct server_info *server = get_table_index(server_list, users[x]->server);
inspircd3_protocol_propagate(from, STRING(":"));
- struct inspircd3_protocol_specific_user *prot_specific = users[x]->protocol_specific[INSPIRCD3_PROTOCOL];
struct inspircd3_protocol_member_id *member;
- if (!STRING_EQ(server->sid, SID) && server->protocol == INSPIRCD3_PROTOCOL)
+ if (!STRING_EQ(server->sid, SID) && server->protocol == INSPIRCD3_PROTOCOL) {
+ struct inspircd3_protocol_specific_user *prot_specific = users[x]->protocol_specific[INSPIRCD3_PROTOCOL];
member = get_table_index(prot_specific->memberships, channel->name);
- else
+ } else {
member = 0;
+ }
if (member)
inspircd3_protocol_propagate(from, member->id_str);
@@ -782,12 +783,13 @@ void inspircd3_protocol_propagate_join_channel(struct string from, struct channe
struct server_info *server = get_table_index(server_list, users[x]->server);
inspircd3_protocol_propagate(from, STRING(":"));
- struct inspircd3_protocol_specific_user *prot_specific = users[x]->protocol_specific[INSPIRCD3_PROTOCOL];
struct inspircd3_protocol_member_id *member;
- if (!STRING_EQ(server->sid, SID) && server->protocol == INSPIRCD3_PROTOCOL)
+ if (!STRING_EQ(server->sid, SID) && server->protocol == INSPIRCD3_PROTOCOL) {
+ struct inspircd3_protocol_specific_user *prot_specific = users[x]->protocol_specific[INSPIRCD3_PROTOCOL];
member = get_table_index(prot_specific->memberships, channel->name);
- else
+ } else {
member = 0;
+ }
if (member)
inspircd3_protocol_propagate(from, member->id_str);
@@ -1157,6 +1159,22 @@ void inspircd3_protocol_introduce_user_to(size_t net, void *handle, struct user_
networks[net].send(handle, channel->channel_ts_str);
networks[net].send(handle, STRING(" + :,"));
networks[net].send(handle, user->uid);
+
+ struct server_info *server = get_table_index(server_list, user->server);
+
+ networks[net].send(handle, STRING(":"));
+ struct inspircd3_protocol_specific_user *prot_specific = user->protocol_specific[INSPIRCD3_PROTOCOL];
+ struct inspircd3_protocol_member_id *member;
+ if (!STRING_EQ(user->server, SID) && server->protocol == INSPIRCD3_PROTOCOL)
+ member = get_table_index(prot_specific->memberships, channel->name);
+ else
+ member = 0;
+
+ if (member)
+ networks[net].send(handle, member->id_str);
+ else
+ networks[net].send(handle, STRING("0"));
+
networks[net].send(handle, STRING("\n"));
}
}
@@ -1173,6 +1191,23 @@ void inspircd3_protocol_introduce_channel_to(size_t net, void *handle, struct ch
for (size_t i = 0; i < channel->user_list.len; i++) {
networks[net].send(handle, STRING(","));
networks[net].send(handle, channel->user_list.array[i].name);
+
+ struct user_info *user = channel->user_list.array[i].ptr;
+ struct server_info *server = get_table_index(server_list, user->server);
+
+ networks[net].send(handle, STRING(":"));
+ struct inspircd3_protocol_specific_user *prot_specific = user->protocol_specific[INSPIRCD3_PROTOCOL];
+ struct inspircd3_protocol_member_id *member;
+ if (!STRING_EQ(user->server, SID) && server->protocol == INSPIRCD3_PROTOCOL)
+ member = get_table_index(prot_specific->memberships, channel->name);
+ else
+ member = 0;
+
+ if (member)
+ networks[net].send(handle, member->id_str);
+ else
+ networks[net].send(handle, STRING("0"));
+
if (i != channel->user_list.len - 1)
networks[net].send(handle, STRING(" "));
}
@@ -1695,7 +1730,8 @@ int inspircd3_protocol_handle_fjoin(struct string source, size_t argc, struct st
if (!users[n] || !users[n]->protocol_specific[INSPIRCD3_PROTOCOL]) // TODO: Check that it's coming the right way too
user_count--;
- i++;
+ if (i < argv[arg_i].len && argv[arg_i].data[i] != ' ')
+ i++;
struct string mid;
mid.data = &(argv[arg_i].data[i]);
@@ -1714,8 +1750,10 @@ int inspircd3_protocol_handle_fjoin(struct string source, size_t argc, struct st
char err;
size_t mid_number = str_to_unsigned(mid, &err);
- if (err)
+ if (err) {
+ WRITES(2, STRING("[InspIRCd v3] [FJOIN] Invalid member ID given!\r\n"));
goto inspircd3_protocol_handle_fjoin_free_member_ids;
+ }
members[n] = malloc(sizeof(**members));
if (!members[n])
diff --git a/protocols/inspircd4.c b/protocols/inspircd4.c
index ad1f1ae..f336506 100644
--- a/protocols/inspircd4.c
+++ b/protocols/inspircd4.c
@@ -751,12 +751,13 @@ void inspircd4_protocol_propagate_set_channel(struct string from, struct channel
struct server_info *server = get_table_index(server_list, users[x]->server);
inspircd4_protocol_propagate(from, STRING(":"));
- struct inspircd4_protocol_specific_user *prot_specific = users[x]->protocol_specific[INSPIRCD4_PROTOCOL];
struct inspircd4_protocol_member_id *member;
- if (!STRING_EQ(server->sid, SID) && server->protocol == INSPIRCD4_PROTOCOL)
+ if (!STRING_EQ(server->sid, SID) && server->protocol == INSPIRCD4_PROTOCOL) {
+ struct inspircd4_protocol_specific_user *prot_specific = users[x]->protocol_specific[INSPIRCD4_PROTOCOL];
member = get_table_index(prot_specific->memberships, channel->name);
- else
+ } else {
member = 0;
+ }
if (member)
inspircd4_protocol_propagate(from, member->id_str);
@@ -785,12 +786,13 @@ void inspircd4_protocol_propagate_join_channel(struct string from, struct channe
struct server_info *server = get_table_index(server_list, users[x]->server);
inspircd4_protocol_propagate(from, STRING(":"));
- struct inspircd4_protocol_specific_user *prot_specific = users[x]->protocol_specific[INSPIRCD4_PROTOCOL];
struct inspircd4_protocol_member_id *member;
- if (!STRING_EQ(server->sid, SID) && server->protocol == INSPIRCD4_PROTOCOL)
+ if (!STRING_EQ(server->sid, SID) && server->protocol == INSPIRCD4_PROTOCOL) {
+ struct inspircd4_protocol_specific_user *prot_specific = users[x]->protocol_specific[INSPIRCD4_PROTOCOL];
member = get_table_index(prot_specific->memberships, channel->name);
- else
+ } else {
member = 0;
+ }
if (member)
inspircd4_protocol_propagate(from, member->id_str);
@@ -1162,6 +1164,22 @@ void inspircd4_protocol_introduce_user_to(size_t net, void *handle, struct user_
networks[net].send(handle, channel->channel_ts_str);
networks[net].send(handle, STRING(" + :,"));
networks[net].send(handle, user->uid);
+
+ struct server_info *server = get_table_index(server_list, user->server);
+
+ networks[net].send(handle, STRING(":"));
+ struct inspircd4_protocol_specific_user *prot_specific = user->protocol_specific[INSPIRCD4_PROTOCOL];
+ struct inspircd4_protocol_member_id *member;
+ if (!STRING_EQ(user->server, SID) && server->protocol == INSPIRCD4_PROTOCOL)
+ member = get_table_index(prot_specific->memberships, channel->name);
+ else
+ member = 0;
+
+ if (member)
+ networks[net].send(handle, member->id_str);
+ else
+ networks[net].send(handle, STRING("0"));
+
networks[net].send(handle, STRING("\n"));
}
}
@@ -1178,6 +1196,23 @@ void inspircd4_protocol_introduce_channel_to(size_t net, void *handle, struct ch
for (size_t i = 0; i < channel->user_list.len; i++) {
networks[net].send(handle, STRING(","));
networks[net].send(handle, channel->user_list.array[i].name);
+
+ struct user_info *user = channel->user_list.array[i].ptr;
+ struct server_info *server = get_table_index(server_list, user->server);
+
+ networks[net].send(handle, STRING(":"));
+ struct inspircd4_protocol_specific_user *prot_specific = user->protocol_specific[INSPIRCD4_PROTOCOL];
+ struct inspircd4_protocol_member_id *member;
+ if (!STRING_EQ(user->server, SID) && server->protocol == INSPIRCD4_PROTOCOL)
+ member = get_table_index(prot_specific->memberships, channel->name);
+ else
+ member = 0;
+
+ if (member)
+ networks[net].send(handle, member->id_str);
+ else
+ networks[net].send(handle, STRING("0"));
+
if (i != channel->user_list.len - 1)
networks[net].send(handle, STRING(" "));
}
@@ -1702,7 +1737,8 @@ int inspircd4_protocol_handle_fjoin(struct string source, size_t argc, struct st
if (!users[n] || !users[n]->protocol_specific[INSPIRCD4_PROTOCOL]) // TODO: Check that it's coming the right way too
user_count--;
- i++;
+ if (i < argv[arg_i].len && argv[arg_i].data[i] != ' ')
+ i++;
struct string mid;
mid.data = &(argv[arg_i].data[i]);
@@ -1721,8 +1757,10 @@ int inspircd4_protocol_handle_fjoin(struct string source, size_t argc, struct st
char err;
size_t mid_number = str_to_unsigned(mid, &err);
- if (err)
+ if (err) {
+ WRITES(2, STRING("[InspIRCd v4] [FJOIN] Invalid member ID given!.\r\n"));
goto inspircd4_protocol_handle_fjoin_free_member_ids;
+ }
members[n] = malloc(sizeof(**members));
if (!members[n])