summary refs log tree commit diff
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
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.
-rw-r--r--handle.c22
-rw-r--r--reply.c13
2 files changed, 33 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;
 }
 
diff --git a/reply.c b/reply.c
index 04a00c2..adc2557 100644
--- a/reply.c
+++ b/reply.c
@@ -133,6 +133,13 @@ vreply(const struct Peer *peer, int number, va_list ap)
 		getnick(peer),
 		nick
 	), nick, _);
+	REPLY(324, WRITE(
+		":%s 324 %s %s +%s",
+		hostname,
+		getnick(peer),
+		channel,
+		modes
+	), channel, modes, _);
 	REPLY(353, WRITE(
 		":%s 353 %s = %s :%s",
 		hostname,
@@ -252,6 +259,12 @@ vreply(const struct Peer *peer, int number, va_list ap)
 		getnick(peer),
 		reason
 	), reason, _);
+	REPLY(482, WRITE(
+		":%s 482 %s %s :You're not channel operator",
+		hostname,
+		getnick(peer),
+		channel
+	), channel, _);
 	REPLY(484, WRITE(
 		":%s 484 %s :Your connection is restricted!",
 		hostname,