]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/client.c
Always cloak client hostname, if needed
[ngircd-alex.git] / src / ngircd / client.c
index 1b356848090b835772db30921d8764c87da39869..4728c7a4672ac802d944dc599d23031f75e50d60 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2012 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
@@ -331,9 +331,15 @@ Client_SetHostname( CLIENT *Client, const char *Hostname )
        assert(Hostname != NULL);
 
        if (strlen(Conf_CloakHost)) {
+               char cloak[GETID_LEN];
+
+               strlcpy(cloak, Hostname, GETID_LEN);
+               strlcat(cloak, Conf_CloakHostSalt, GETID_LEN);
+               snprintf(cloak, GETID_LEN, Conf_CloakHost, Hash(cloak));
+
                LogDebug("Updating hostname of \"%s\": \"%s\" -> \"%s\"",
-                        Client_ID(Client), Client->host, Conf_CloakHost);
-               strlcpy(Client->host, Conf_CloakHost, sizeof(Client->host));
+                       Client_ID(Client), Client->host, cloak);
+               strlcpy(Client->host, cloak, sizeof(Client->host));
        } else {
                LogDebug("Updating hostname of \"%s\": \"%s\" -> \"%s\"",
                         Client_ID(Client), Client->host, Hostname);
@@ -434,18 +440,6 @@ Client_SetFlags( CLIENT *Client, const char *Flags )
 } /* Client_SetFlags */
 
 
-GLOBAL void
-Client_SetPassword( CLIENT *Client, const char *Pwd )
-{
-       /* set password sent by client */
-
-       assert( Client != NULL );
-       assert( Pwd != NULL );
-
-       strlcpy(Client->pwd, Pwd, sizeof(Client->pwd));
-} /* Client_SetPassword */
-
-
 GLOBAL void
 Client_SetAway( CLIENT *Client, const char *Txt )
 {
@@ -693,27 +687,36 @@ Client_Hostname(CLIENT *Client)
 
 /**
  * Get potentially cloaked hostname of a client.
+ *
  * If the client has not enabled cloaking, the real hostname is used.
+ * Please note that this function uses a global static buffer, so you can't
+ * nest invocations without overwriting earlier results!
+ *
  * @param Client Pointer to client structure
  * @return Pointer to client hostname
  */
 GLOBAL char *
 Client_HostnameCloaked(CLIENT *Client)
 {
+       static char Cloak_Buffer[CLIENT_HOST_LEN];
+
        assert(Client != NULL);
-       if (Client_HasMode(Client, 'x'))
-               return Client_ID(Client->introducer);
-       else
+
+       if (!Client_HasMode(Client, 'x'))
                return Client_Hostname(Client);
-} /* Client_HostnameCloaked */
 
+       /* Do simple mapping to the server ID? */
+       if (!*Conf_CloakHostModeX)
+               return Client_ID(Client->introducer);
 
-GLOBAL char *
-Client_Password( CLIENT *Client )
-{
-       assert( Client != NULL );
-       return Client->pwd;
-} /* Client_Password */
+       strlcpy(Cloak_Buffer, Client->host, CLIENT_HOST_LEN);
+       strlcat(Cloak_Buffer, Conf_CloakHostSalt, CLIENT_HOST_LEN);
+
+       snprintf(Cloak_Buffer, CLIENT_HOST_LEN, Conf_CloakHostModeX,
+                Hash(Cloak_Buffer));
+
+       return Cloak_Buffer;
+} /* Client_HostnameCloaked */
 
 
 GLOBAL char *
@@ -806,10 +809,12 @@ Client_Mask( CLIENT *Client )
 
 /**
  * Return ID of a client with cloaked hostname: "client!user@server-name"
+ *
  * This client ID is used for IRC prefixes, for example.
  * Please note that this function uses a global static buffer, so you can't
  * nest invocations without overwriting earlier results!
  * If the client has not enabled cloaking, the real hostname is used.
+ *
  * @param Client Pointer to client structure
  * @return Pointer to global buffer containing the client ID
  */
@@ -822,10 +827,11 @@ Client_MaskCloaked(CLIENT *Client)
 
        /* Is the client using cloaking at all? */
        if (!Client_HasMode(Client, 'x'))
-           return Client_Mask(Client);
+               return Client_Mask(Client);
+
+       snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user,
+                Client_HostnameCloaked(Client));
 
-       snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s",
-                Client->id, Client->user, Client_ID(Client->introducer));
        return Mask_Buffer;
 } /* Client_MaskCloaked */
 
@@ -889,6 +895,16 @@ Client_CheckNick(CLIENT *Client, char *Nick)
                return false;
        }
 
+       if (Client_Type(Client) != CLIENT_SERVER
+           && Client_Type(Client) != CLIENT_SERVICE) {
+               /* Make sure that this isn't a restricted/forbidden nick name */
+               if (Conf_NickIsBlocked(Nick)) {
+                       IRC_WriteStrClient(Client, ERR_FORBIDDENNICKNAME_MSG,
+                                          Client_ID(Client), Nick);
+                       return false;
+               }
+       }
+
        /* Nickname already registered? */
        if (Client_Search(Nick)) {
                IRC_WriteStrClient(Client, ERR_NICKNAMEINUSE_MSG,
@@ -1159,7 +1175,7 @@ Client_Introduce(CLIENT *From, CLIENT *Client, int Type)
        Client_SetType(Client, Type);
 
        if (From) {
-               if (Conf_IsService(Conf_GetServer(Client_Conn(From)),
+               if (Conf_NickIsService(Conf_GetServer(Client_Conn(From)),
                                   Client_ID(Client)))
                        Client_SetType(Client, CLIENT_SERVICE);
                LogDebug("%s \"%s\" (+%s) registered (via %s, on %s, %d hop%s).",