X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Firc-info.c;h=79a157c24bf658fb91309ba65c566dff4ab9322a;hp=3d77237f4e08f95928d826462734dafc3f19e759;hb=b5faf3055b61afaef73ac49a448cac1a5b063127;hpb=44698e44e8a9bf9f3a1211e10b4d59e00be5864f diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c index 3d77237f..79a157c2 100644 --- a/src/ngircd/irc-info.c +++ b/src/ngircd/irc-info.c @@ -41,6 +41,7 @@ #include "irc-macros.h" #include "irc-write.h" #include "client-cap.h" +#include "op.h" #include "exp.h" #include "irc-info.h" @@ -501,7 +502,6 @@ IRC_ADMIN(CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) _IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix) @@ -546,7 +546,6 @@ IRC_INFO(CLIENT * Client, REQUEST * Req) IRC_SetPenalty(Client, 2); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) _IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix) @@ -596,8 +595,6 @@ IRC_ISON( CLIENT *Client, REQUEST *Req ) assert(Client != NULL); assert(Req != NULL); - _IRC_ARGC_GE_OR_RETURN_(Client, Req, 1) - strlcpy(rpl, RPL_ISON_MSG, sizeof rpl); for (i = 0; i < Req->argc; i++) { /* "All" ircd even parse ": ..." arguments and split @@ -636,7 +633,6 @@ IRC_LINKS(CLIENT *Client, REQUEST *Req) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) /* Get pointer to server mask or "*", if none given */ @@ -691,7 +687,6 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from) @@ -718,12 +713,10 @@ IRC_SERVLIST(CLIENT *Client, REQUEST *Req) { CLIENT *c; - IRC_SetPenalty(Client, 1); - assert(Client != NULL); assert(Req != NULL); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) + IRC_SetPenalty(Client, 1); if (Req->argc < 2 || strcmp(Req->argv[1], "0") == 0) { for (c = Client_First(); c!= NULL; c = Client_Next(c)) { @@ -762,7 +755,6 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 3); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from) @@ -795,7 +787,6 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from) @@ -875,13 +866,13 @@ IRC_STATS( CLIENT *Client, REQUEST *Req ) unsigned int days, hrs, mins; struct list_head *list; struct list_elem *list_item; + bool more_links = false; assert(Client != NULL); assert(Req != NULL); IRC_SetPenalty(Client, 2); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from) @@ -920,16 +911,20 @@ IRC_STATS( CLIENT *Client, REQUEST *Req ) list_item = Lists_GetNext(list_item); } break; + case 'L': /* Link status (servers and user links) */ + if (!Op_Check(from, Req)) + return Op_NoPrivileges(from, Req); + more_links = true; + case 'l': /* Link status (servers and own link) */ - case 'L': time_now = time(NULL); for (con = Conn_First(); con != NONE; con = Conn_Next(con)) { cl = Conn_GetClient(con); if (!cl) continue; - if ((Client_Type(cl) == CLIENT_SERVER) - || (cl == Client)) { - /* Server link or our own connection */ + if (Client_Type(cl) == CLIENT_SERVER || + cl == Client || + (more_links && Client_Type(cl) == CLIENT_USER)) { #ifdef ZLIB if (Conn_Options(con) & CONN_ZIP) { if (!IRC_WriteStrClient @@ -1020,7 +1015,6 @@ IRC_TIME( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from) @@ -1056,8 +1050,6 @@ IRC_USERHOST(CLIENT *Client, REQUEST *Req) IRC_SetPenalty(Client, 1); - _IRC_ARGC_GE_OR_RETURN_(Client, Req, 1) - if (Req->argc > 5) max = 5; else @@ -1120,7 +1112,6 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) _IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix) @@ -1156,18 +1147,18 @@ IRC_WHO(CLIENT *Client, REQUEST *Req) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) - only_ops = false; if (Req->argc == 2) { if (strcmp(Req->argv[1], "o") == 0) only_ops = true; #ifdef STRICT_RFC - else + else { + IRC_SetPenalty(Client, 2); return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); + } #endif } @@ -1211,11 +1202,12 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - /* Bad number of parameters? */ - if (Req->argc < 1 || Req->argc > 2) - return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); + /* Wrong number of parameters? */ + if (Req->argc < 1) + return IRC_WriteErrClient(Client, ERR_NONICKNAMEGIVEN_MSG, + Client_ID(Client)); + _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) /* Get target server for this command */ @@ -1316,10 +1308,6 @@ IRC_WHOWAS( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - /* Do not reveal any info on disconnected users? */ - if (Conf_MorePrivacy) - return CONNECTED; - /* Wrong number of parameters? */ if (Req->argc < 1) return IRC_WriteErrClient(Client, ERR_NONICKNAMEGIVEN_MSG, @@ -1329,6 +1317,10 @@ IRC_WHOWAS( CLIENT *Client, REQUEST *Req ) _IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 2, prefix) + /* Do not reveal any info on disconnected users? */ + if (Conf_MorePrivacy) + return CONNECTED; + /* Forward? */ if (target != Client_ThisServer()) { IRC_WriteStrClientPrefix(target, prefix, "WHOWAS %s %s %s",