diff options
| author | Nakidai <nakidai@disroot.org> | 2026-02-09 13:15:23 +0300 |
|---|---|---|
| committer | Nakidai <nakidai@disroot.org> | 2026-02-09 13:15:23 +0300 |
| commit | 15b0b805fe2e739c9d89b54e1bfb26beb79c3112 (patch) | |
| tree | eacc7138a6a029778d824b6ff1958f516e9d203f | |
| parent | 643b1b995679d9ea315d5767111f376c5af6c44b (diff) | |
| download | libreircd-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.c | 22 | ||||
| -rw-r--r-- | 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, |