]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-login.c
const'ify command name variable in _COMMAND strcuture
[ngircd-alex.git] / src / ngircd / irc-login.c
index 1091852bbb0865da87c06a6275c91bc0961d95c7..8e77e7fe34ddcefde11788fd00a5e15c0c7e77f9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -148,7 +148,6 @@ IRC_PASS( CLIENT *Client, REQUEST *Req )
                } else {
                        /* The peer seems to be a server supporting the
                         * "original" IRC protocol (RFC 2813). */
-                       serverver = "";
                        if (strchr(orig_flags, 'Z'))
                                flags = "Z";
                        else
@@ -322,18 +321,18 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
                        info = Req->argv[0];
                }
 
-               /* Nick ueberpruefen */
                c = Client_Search(nick);
                if(c) {
-                       /* Der neue Nick ist auf diesem Server bereits registriert:
-                        * sowohl der neue, als auch der alte Client muessen nun
-                        * disconnectiert werden. */
+                       /*
+                        * the new nick is already present on this server:
+                        * the new and the old one have to be disconnected now.
+                        */
                        Log( LOG_ERR, "Server %s introduces already registered nick \"%s\"!", Client_ID( Client ), Req->argv[0] );
                        Kill_Nick( Req->argv[0], "Nick collision" );
                        return CONNECTED;
                }
 
-               /* Server, zu dem der Client connectiert ist, suchen */
+               /* Find the Server this client is connected to */
                intr_c = Client_GetFromToken(Client, token);
                if( ! intr_c )
                {
@@ -342,14 +341,11 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
                        return CONNECTED;
                }
 
-               /* Neue Client-Struktur anlegen */
                c = Client_NewRemoteUser(intr_c, nick, hops, user, hostname,
                                         token, modes, info, true);
                if( ! c )
                {
-                       /* Eine neue Client-Struktur konnte nicht angelegt werden.
-                        * Der Client muss disconnectiert werden, damit der Netz-
-                        * status konsistent bleibt. */
+                       /* out of memory, need to disconnect client to keep network state consistent */
                        Log( LOG_ALERT, "Can't create client structure! (on connection %d)", Client_Conn( Client ));
                        Kill_Nick( Req->argv[0], "Server error" );
                        return CONNECTED;
@@ -360,7 +356,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
                 * RFC 1459: announce the new client only after receiving the
                 * USER command, first we need more information! */
                if (Req->argc < 7) {
-                       LogDebug("Client \"%s\" is beeing registered (RFC 1459) ...",
+                       LogDebug("Client \"%s\" is being registered (RFC 1459) ...",
                                 Client_Mask(c));
                        Client_SetType(c, CLIENT_GOTNICK);
                } else
@@ -561,6 +557,31 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req)
 } /* IRC_SERVICE */
 
 
+/**
+ * Handler for the IRC command "WEBIRC".
+ * Syntax: WEBIRC <password> <username> <real-hostname> <real-IP-address>
+ */
+GLOBAL bool
+IRC_WEBIRC(CLIENT *Client, REQUEST *Req)
+{
+       /* Exactly 4 parameters are requited */
+       if (Req->argc != 4)
+               return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
+                                         Client_ID(Client), Req->command);
+
+       if (!Conf_WebircPwd[0] || strcmp(Req->argv[0], Conf_WebircPwd) != 0)
+               return IRC_WriteStrClient(Client, ERR_PASSWDMISMATCH_MSG,
+                                         Client_ID(Client));
+
+       LogDebug("Connection %d: got valid WEBIRC command: user=%s, host=%s, ip=%s",
+                Client_Conn(Client), Req->argv[1], Req->argv[2], Req->argv[3]);
+
+       Client_SetUser(Client, Req->argv[1], true);
+       Client_SetHostname(Client, Req->argv[2]);
+       return CONNECTED;
+} /* IRC_WEBIRC */
+
+
 GLOBAL bool
 IRC_QUIT( CLIENT *Client, REQUEST *Req )
 {
@@ -583,7 +604,6 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
                target = Client_Search( Req->prefix );
                if( ! target )
                {
-                       /* Den Client kennen wir nicht (mehr), also nichts zu tun. */
                        Log( LOG_WARNING, "Got QUIT from %s for unknown client!?", Client_ID( Client ));
                        return CONNECTED;
                }
@@ -601,7 +621,7 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
                        strlcat(quitmsg, "\"", sizeof quitmsg );
                }
 
-               /* User, Service, oder noch nicht registriert */
+               /* User, Service, or not yet registered */
                Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
 
                return DISCONNECTED;
@@ -617,7 +637,6 @@ IRC_PING(CLIENT *Client, REQUEST *Req)
        assert(Client != NULL);
        assert(Req != NULL);
 
-       /* Wrong number of arguments? */
        if (Req->argc < 1)
                return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG,
                                          Client_ID(Client));
@@ -821,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,