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 /handle.c | |
| 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.
Diffstat (limited to 'handle.c')
| -rw-r--r-- | handle.c | 22 |
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; } |