From 15b0b805fe2e739c9d89b54e1bfb26beb79c3112 Mon Sep 17 00:00:00 2001 From: Nakidai Date: Mon, 9 Feb 2026 13:15:23 +0300 Subject: Add authorization for mode_channel() User has to be authorized in order to be able to change channel's modes. --- handle.c | 22 ++++++++++++++++++++-- reply.c | 13 +++++++++++++ 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, -- cgit 1.4.1