summary refs log tree commit diff
path: root/handle.c
diff options
context:
space:
mode:
authorNakidai <nakidai@disroot.org>2026-02-09 13:15:23 +0300
committerNakidai <nakidai@disroot.org>2026-02-09 13:15:23 +0300
commit15b0b805fe2e739c9d89b54e1bfb26beb79c3112 (patch)
treeeacc7138a6a029778d824b6ff1958f516e9d203f /handle.c
parent643b1b995679d9ea315d5767111f376c5af6c44b (diff)
downloadlibreircd-15b0b805fe2e739c9d89b54e1bfb26beb79c3112.tar.gz
libreircd-15b0b805fe2e739c9d89b54e1bfb26beb79c3112.zip
Add authorization for mode_channel()
User has to be authorized in order to be able to change channel's
modes.
Diffstat (limited to 'handle.c')
-rw-r--r--handle.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/handle.c b/handle.c
index 31a11c1..ecbde08 100644
--- a/handle.c
+++ b/handle.c
@@ -76,8 +76,26 @@ join(struct Message *msg, struct Peer *peer)
 static int
 mode_channel(struct Message *msg, struct Peer *peer)
 {
-	(void)msg;
-	(void)peer;
+	enum ChannelPeerMode modes;
+	struct Channel *channel;
+	size_t i;
+
+	for (i = 0; i < channels_c; ++i)
+		if (!strcmp(channels[i].name, msg->params[0]))
+			break;
+	ensure(i != channels_c, reply(peer, 403, msg->params[0]), 0);
+	channel = &channels[i];
+
+	ensure(msg->params[1] && *msg->params[1], reply(peer, 324, channel->name, ""), 0);
+
+	for (i = 0; i < channel->peers_c; ++i)
+		if (channel->peers[i].p->fd == peer->fd)
+			break;
+	ensure(i != channel->peers_c, reply(peer, 482, channel->name), 0);
+	modes = channel->peers[i].modes;
+
+	ensure(modes & CHANNEL_OPER || peer->modes & OPER, reply(peer, 482, channel->name), 0);
+
 	return 0;
 }