]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/client.c
configure: "netinet/in_systm.h" is optional
[ngircd-alex.git] / src / ngircd / client.c
index f163f72c371e2a84121a84d178c3552530109b3d..2114f84ddbc8bcf6a6761db022524b880c6a1d85 100644 (file)
@@ -440,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 )
 {
@@ -683,7 +671,6 @@ Client_OrigUser(CLIENT *Client) {
 
 #endif
 
-
 /**
  * Return the hostname of a client.
  * @param Client Pointer to client structure
@@ -694,33 +681,88 @@ Client_Hostname(CLIENT *Client)
 {
        assert (Client != NULL);
        return Client->host;
-} /* Client_Hostname */
+}
 
+/**
+ * Return the cloaked hostname of a client, if set.
+ * @param Client Pointer to the client structure.
+ * @return Pointer to the cloaked hostname or NULL if not set.
+ */
+GLOBAL char *
+Client_HostnameCloaked(CLIENT *Client)
+{
+       assert(Client != NULL);
+       return Client->cloaked;
+}
 
 /**
- * Get potentially cloaked hostname of a client.
+ * Get (potentially cloaked) hostname of a client to display it to other users.
+ *
  * 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)
+Client_HostnameDisplayed(CLIENT *Client)
 {
        assert(Client != NULL);
-       if (Client_HasMode(Client, 'x'))
-               return Client_ID(Client->introducer);
-       else
+
+       /* Client isn't cloaked at all, return real hostname: */
+       if (!Client_HasMode(Client, 'x'))
                return Client_Hostname(Client);
-} /* Client_HostnameCloaked */
 
+       /* Use an already saved cloaked hostname, if there is one */
+       if (Client->cloaked[0])
+               return Client->cloaked;
 
-GLOBAL char *
-Client_Password( CLIENT *Client )
+       Client_UpdateCloakedHostname(Client, NULL, NULL);
+       return Client->cloaked;
+}
+
+/**
+ * Update (and generate, if necessary) the cloaked hostname of a client.
+ *
+ * The newly set cloaked hostname is announced in the network using METADATA
+ * commands to peers that support this feature.
+ *
+ * @param Client The client of which the cloaked hostname should be updated.
+ * @param Origin The originator of the hostname change, or NULL if this server.
+ * @param Hostname The new cloaked hostname, or NULL if it should be generated.
+ */
+GLOBAL void
+Client_UpdateCloakedHostname(CLIENT *Client, CLIENT *Origin,
+                            const char *Hostname)
 {
-       assert( Client != NULL );
-       return Client->pwd;
-} /* Client_Password */
+       static char Cloak_Buffer[CLIENT_HOST_LEN];
 
+       assert(Client != NULL);
+       if (!Origin)
+               Origin = Client_ThisServer();
+
+       if (!Hostname) {
+               /* Generate new cloaked hostname */
+               if (*Conf_CloakHostModeX) {
+                       strlcpy(Cloak_Buffer, Client->host, CLIENT_HOST_LEN);
+                       strlcat(Cloak_Buffer, Conf_CloakHostSalt,
+                               CLIENT_HOST_LEN);
+                       snprintf(Client->cloaked, sizeof(Client->cloaked),
+                                Conf_CloakHostModeX, Hash(Cloak_Buffer));
+               } else
+                       strlcpy(Client->cloaked, Client_ID(Client->introducer),
+                               sizeof(Client->cloaked));
+       } else
+               strlcpy(Client->cloaked, Hostname, sizeof(Client->cloaked));
+       LogDebug("Cloaked hostname of \"%s\" updated to \"%s\"",
+                Client_ID(Client), Client->cloaked);
+
+       /* Inform other servers in the network */
+       IRC_WriteStrServersPrefixFlag(Client_NextHop(Origin), Origin, 'M',
+                                     "METADATA %s cloakhost :%s",
+                                     Client_ID(Client), Client->cloaked);
+}
 
 GLOBAL char *
 Client_Modes( CLIENT *Client )
@@ -812,10 +854,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
  */
@@ -823,7 +867,6 @@ GLOBAL char *
 Client_MaskCloaked(CLIENT *Client)
 {
        static char Mask_Buffer[GETID_LEN];
-       char Cloak_Buffer[GETID_LEN];
 
        assert (Client != NULL);
 
@@ -831,16 +874,8 @@ Client_MaskCloaked(CLIENT *Client)
        if (!Client_HasMode(Client, 'x'))
                return Client_Mask(Client);
 
-       if(*Conf_CloakHostModeX) {
-               strlcpy(Cloak_Buffer, Client->host, GETID_LEN);
-               strlcat(Cloak_Buffer, Conf_CloakHostSalt, GETID_LEN);
-               snprintf(Cloak_Buffer, GETID_LEN, Conf_CloakHostModeX, Hash(Cloak_Buffer));
-       } else {
-               strncpy(Cloak_Buffer, Client_ID(Client->introducer), GETID_LEN);
-       }
-
-       snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s",
-               Client->id, Client->user, Cloak_Buffer);
+       snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user,
+                Client_HostnameDisplayed(Client));
 
        return Mask_Buffer;
 } /* Client_MaskCloaked */
@@ -885,7 +920,7 @@ Client_Away( CLIENT *Client )
  * the appropriate error messages.
  *
  * @param      Client Client that wants to change the nickname.
- * @param      Nick New nick name.
+ * @param      Nick New nickname.
  * @returns    true if nickname is valid, false otherwise.
  */
 GLOBAL bool
@@ -907,7 +942,7 @@ Client_CheckNick(CLIENT *Client, char *Nick)
 
        if (Client_Type(Client) != CLIENT_SERVER
            && Client_Type(Client) != CLIENT_SERVICE) {
-               /* Make sure that this isn't a restricted/forbidden nick name */
+               /* Make sure that this isn't a restricted/forbidden nickname */
                if (Conf_NickIsBlocked(Nick)) {
                        IRC_WriteStrClient(Client, ERR_FORBIDDENNICKNAME_MSG,
                                           Client_ID(Client), Nick);
@@ -1349,7 +1384,7 @@ Client_RegisterWhowas( CLIENT *Client )
                 sizeof( My_Whowas[slot].id ));
        strlcpy( My_Whowas[slot].user, Client_User( Client ),
                 sizeof( My_Whowas[slot].user ));
-       strlcpy( My_Whowas[slot].host, Client_HostnameCloaked( Client ),
+       strlcpy( My_Whowas[slot].host, Client_HostnameDisplayed( Client ),
                 sizeof( My_Whowas[slot].host ));
        strlcpy( My_Whowas[slot].info, Client_Info( Client ),
                 sizeof( My_Whowas[slot].info ));