]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Implement user mode "c": receive connect/disconnect NOTICEs
authorAlexander Barton <alex@barton.de>
Sat, 22 May 2010 15:19:24 +0000 (17:19 +0200)
committerAlexander Barton <alex@barton.de>
Thu, 24 Jun 2010 22:33:01 +0000 (00:33 +0200)
Users having the user mode "c" set receive NOTICE messages on each
new client connection to the local server as well as disconnects.
Only IRC operators (users having the mode "o" set) are allowed to
set the 'c' user mode.

These connect/disconnect messages can be useful for open proxy
scanners -- BOPM (http://wiki.blitzed.org/BOPM) is now functional
with ngIRCd, for example.

src/ngircd/client.c
src/ngircd/defines.h
src/ngircd/irc-login.c
src/ngircd/irc-mode.c

index c565830a6b82957c8cc0287046c2175b7459b60c..671bf6cef5b5fed0e6f855baa2b98d5b8a447aaa 100644 (file)
@@ -1136,6 +1136,9 @@ Destroy_UserOrService(CLIENT *Client, const char *Txt, const char *FwdMsg, bool
                    "%s \"%s\" unregistered (connection %d): %s",
                    Client_TypeText(Client), Client_Mask(Client),
                    Client->conn_id, Txt);
+               Log_ServerNotice('c', "Client exiting: %s (%s@%s) [%s]",
+                                Client_ID(Client), Client_User(Client),
+                                Client_Hostname(Client), Txt);
 
                if (SendQuit) {
                        /* Inforam all the other servers */
index 94c7dd1e92a393ae24478cb037af1755cb25e334..b463c5f9f54006fb0fde6539c508c666569775ea 100644 (file)
@@ -80,7 +80,7 @@
 #define RECONNECT_DELAY 3              /* Time to delay re-connect attempts
                                           in seconds. */
 
-#define USERMODES "aiorsw"             /* Supported user modes. */
+#define USERMODES "aciorsw"            /* Supported user modes. */
 #define CHANMODES "biIklmnoPstvz"      /* Supported channel modes. */
 
 #define CONNECTED true                 /* Internal status codes. */
index c8b44dbc1653723d0a32cddd4f63300c8e906a60..8e77e7fe34ddcefde11788fd00a5e15c0c7e77f9 100644 (file)
@@ -840,10 +840,16 @@ Introduce_Client(CLIENT *From, CLIENT *Client, int Type)
                         Client_Modes(Client), Client_ID(From),
                         Client_ID(Client_Introducer(Client)),
                         Client_Hops(Client), Client_Hops(Client) > 1 ? "s": "");
-       } else
+       } else {
                Log(LOG_NOTICE, "%s \"%s\" registered (connection %d).",
                    Client_TypeText(Client), Client_Mask(Client),
                    Client_Conn(Client));
+               Log_ServerNotice('c', "Client connecting: %s (%s@%s) [%s] - %s",
+                                Client_ID(Client), Client_User(Client),
+                                Client_Hostname(Client),
+                                Conn_IPA(Client_Conn(Client)),
+                                Client_TypeText(Client));
+       }
 
        /* Inform other servers */
        IRC_WriteStrServersPrefixFlag_CB(From,
index d22d32f01acc3c82a787ecc375a6fe041cc57e39..cd470863aa2edea492a9e818cce5103c1d50af72 100644 (file)
@@ -172,6 +172,16 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
                                else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
                                break;
 
+                       case 'c': /* Receive connect notices
+                                  * (only settable by IRC operators!) */
+                               if(!set || Client_OperByMe(Origin)
+                                  || Client_Type(Client) == CLIENT_SERVER)
+                                       x[0] = 'c';
+                               else
+                                       ok = IRC_WriteStrClient(Origin,
+                                                       ERR_NOPRIVILEGES_MSG,
+                                                       Client_ID(Origin));
+                               break;
                        case 'o': /* IRC operator (only unsettable!) */
                                if(( ! set ) || ( Client_Type( Client ) == CLIENT_SERVER ))
                                {