From 68a91231a9480d591b43b359ad9a02af1faef07b Mon Sep 17 00:00:00 2001 From: Nakidai Date: Thu, 5 Feb 2026 14:11:41 +0300 Subject: Add OPER/SETOPER SETOPER is a command for config, OPER is the one to authorize a user --- handle.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'handle.c') diff --git a/handle.c b/handle.c index b99e82d..fb08f73 100644 --- a/handle.c +++ b/handle.c @@ -24,6 +24,9 @@ #include +static struct Oper opers[OPERS_MAX]; +size_t opers_c; + static int names(struct Message *msg, struct Peer *peer); static int @@ -191,6 +194,26 @@ nick(struct Message *msg, struct Peer *peer) return 0; } +static int +oper(struct Message *msg, struct Peer *peer) +{ + size_t i; + + ensure(peer->type, reply(peer, 451), 0); + ensure(msg->params[0] && *msg->params[0], reply(peer, 461), 0); + ensure(msg->params[1] && *msg->params[1], reply(peer, 464), 0); + + for (i = 0; i < opers_c; ++i) + if (!strcmp(opers[i].nick, msg->params[0])) + break; + ensure(i != opers_c && !strcmp(opers[i].pass, msg->params[1]), reply(peer, 464), 0); + + peer->modes |= OPER; + reply(peer, 381); + + return 0; +} + static int part(struct Message *msg, struct Peer *peer) { @@ -342,6 +365,38 @@ setinfo(struct Message *msg, struct Peer *peer) return 0; } +static int +setoper(struct Message *msg, struct Peer *peer) +{ + size_t i; + + ensure(peer->type == CONFIG, reply(peer, 481, "You're not a config file"), 0); + ensure(msg->params[0] && *msg->params[0], reply(peer, 461), 0); + ensure(msg->params[1], reply(peer, 461), 0); + ensure( + !*msg->params[1] || *msg->params[1] && opers_c < OPERS_MAX, + reply(peer, 420, msg->params[0]), + 0 + ); + + for (i = 0; i < opers_c; ++i) + if (!strcmp(opers[i].nick, msg->params[0])) + break; + + if (*msg->params[1]) + { + ++opers_c; + strlcpy(opers[i].nick, msg->params[0], sizeof(opers->pass)); + strlcpy(opers[i].pass, msg->params[1], sizeof(opers->pass)); + } + else if (i < PEERS_MAX) + { + opers[i] = opers[--opers_c]; + } + + return 0; +} + static int user(struct Message *msg, struct Peer *peer) { @@ -422,6 +477,7 @@ static struct Handler { { "names", names }, { "nick", nick }, { "notice", privmsg }, + { "oper", oper }, { "part", part }, { "ping", ping }, { "pong", pong }, @@ -429,6 +485,7 @@ static struct Handler { { "quit", quit }, { "setcreation", setcreation }, { "setinfo", setinfo }, + { "setoper", setoper }, { "user", user }, { "whois", whois }, }; -- cgit 1.4.1