]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-info.c
Merge branch 'bug167-WebircIPAnoDNS' of git://arthur.barton.de/ngircd-alex
[ngircd-alex.git] / src / ngircd / irc-info.c
index ea0ed4e58e481e5503a99510341648276be9b940..aa98a5b560b163f4b96a5b4c7b1a20b7f4f6f2f3 100644 (file)
@@ -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"
@@ -151,8 +152,6 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
        assert( Client != NULL );
        assert( Chan != NULL );
 
-       IRC_SetPenalty(Client, 1);
-
        is_member = Channel_IsMemberOf(Chan, Client);
 
        /* Secret channel? */
@@ -190,7 +189,7 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
                }
        }
 
-       /* If there are a lot of clients, augment penalty a bit */
+       /* If there are a lot of clients, increase the penalty a bit */
        if (count > MAX_RPL_WHO)
                IRC_SetPenalty(Client, 1);
 
@@ -499,9 +498,6 @@ IRC_ADMIN(CLIENT *Client, REQUEST *Req )
        assert( Client != NULL );
        assert( Req != NULL );
 
-       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)
 
@@ -544,9 +540,6 @@ IRC_INFO(CLIENT * Client, REQUEST * Req)
        assert(Client != NULL);
        assert(Req != NULL);
 
-       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 +589,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 ":<x> <y> ..." arguments and split
@@ -634,9 +625,6 @@ IRC_LINKS(CLIENT *Client, REQUEST *Req)
        assert(Client != NULL);
        assert(Req != NULL);
 
-       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 */
@@ -689,9 +677,6 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req )
        assert( Client != NULL );
        assert( Req != NULL );
 
-       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)
 
@@ -721,10 +706,6 @@ IRC_SERVLIST(CLIENT *Client, REQUEST *Req)
        assert(Client != NULL);
        assert(Req != NULL);
 
-       IRC_SetPenalty(Client, 1);
-
-       _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2)
-
        if (Req->argc < 2 || strcmp(Req->argv[1], "0") == 0) {
                for (c = Client_First(); c!= NULL; c = Client_Next(c)) {
                        if (Client_Type(c) != CLIENT_SERVICE)
@@ -760,9 +741,6 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req )
        assert( Client != NULL );
        assert( Req != NULL );
 
-       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)
 
@@ -793,9 +771,6 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
        assert( Client != NULL );
        assert( Req != NULL );
 
-       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 +850,11 @@ 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 +893,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
@@ -1018,9 +995,6 @@ IRC_TIME( CLIENT *Client, REQUEST *Req )
        assert(Client != NULL);
        assert(Req != NULL);
 
-       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)
 
@@ -1054,10 +1028,6 @@ IRC_USERHOST(CLIENT *Client, REQUEST *Req)
        assert(Client != NULL);
        assert(Req != NULL);
 
-       IRC_SetPenalty(Client, 1);
-
-       _IRC_ARGC_GE_OR_RETURN_(Client, Req, 1)
-
        if (Req->argc > 5)
                max = 5;
        else
@@ -1118,9 +1088,6 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req )
        assert( Client != NULL );
        assert( Req != NULL );
 
-       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)
 
@@ -1154,20 +1121,17 @@ IRC_WHO(CLIENT *Client, REQUEST *Req)
        assert (Client != NULL);
        assert (Req != NULL);
 
-       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 {
                        return IRC_WriteErrClient(Client,
                                                  ERR_NEEDMOREPARAMS_MSG,
                                                  Client_ID(Client),
                                                  Req->command);
+               }
 #endif
        }
 
@@ -1186,7 +1150,6 @@ IRC_WHO(CLIENT *Client, REQUEST *Req)
        }
 
        /* No channel or (valid) mask given */
-       IRC_SetPenalty(Client, 2);
        return IRC_WHO_Mask(Client, NULL, only_ops);
 } /* IRC_WHO */
 
@@ -1209,8 +1172,6 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
        assert( Client != NULL );
        assert( Req != NULL );
 
-       IRC_SetPenalty(Client, 1);
-
        /* Wrong number of parameters? */
        if (Req->argc < 1)
                return IRC_WriteErrClient(Client, ERR_NONICKNAMEGIVEN_MSG,
@@ -1272,6 +1233,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
                        continue;
                }
                got_wildcard = true;
+               /* Increase penalty for wildcard queries */
                IRC_SetPenalty(Client, 3);
 
                for (c = Client_First(); c; c = Client_Next(c)) {
@@ -1317,10 +1279,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,
@@ -1330,6 +1288,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",
@@ -1577,6 +1539,10 @@ IRC_Send_NAMES(CLIENT * Client, CHANNEL * Chan)
 GLOBAL bool
 IRC_Send_ISUPPORT(CLIENT * Client)
 {
+       if (Conf_Network[0] && !IRC_WriteStrClient(Client, RPL_ISUPPORTNET_MSG,
+                                                  Client_ID(Client),
+                                                  Conf_Network))
+               return DISCONNECTED;
        if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
                                CHANTYPES, CHANTYPES, Conf_MaxJoins))
                return DISCONNECTED;