]> arthur.barton.de Git - ngircd.git/commitdiff
Generate "METADATA host" commands on "MODE +/-x"
authorAlexander Barton <alex@barton.de>
Mon, 5 Nov 2012 22:49:12 +0000 (23:49 +0100)
committerAlexander Barton <alex@barton.de>
Mon, 5 Nov 2012 22:49:12 +0000 (23:49 +0100)
Use "METADATA host" commands to let servers supporting this command
know which (possibly cloaked) hostname is in effect for a specific
client. This prevents "double cloaking" of hostnames and even cloaked
hostnames are in sync on all servers supporting "METADATA" now.

src/ngircd/irc-mode.c

index ce4044d0bf7b154401e10096af47abed1911550b..1cf19afc2bf437f19a2887509e12851c932a7951 100644 (file)
@@ -36,6 +36,8 @@
 #include "irc-mode.h"
 
 
+static void Announce_Client_Hostname PARAMS((CLIENT *Origin, CLIENT *Client));
+
 static bool Client_Mode PARAMS((CLIENT *Client, REQUEST *Req, CLIENT *Origin,
                                CLIENT *Target));
 static bool Channel_Mode PARAMS((CLIENT *Client, REQUEST *Req, CLIENT *Origin,
@@ -367,9 +369,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
                                                  Client_ID(Target),
                                                  the_modes);
                        if (send_RPL_HOSTHIDDEN_MSG)
-                               IRC_WriteStrClient(Client, RPL_HOSTHIDDEN_MSG,
-                                                  Client_ID(Client),
-                                                  Client_HostnameCloaked(Client));
+                               Announce_Client_Hostname(Origin, Client);
                }
                LogDebug("%s \"%s\": Mode change, now \"%s\".",
                         Client_TypeText(Target), Client_Mask(Target),
@@ -381,6 +381,27 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 } /* Client_Mode */
 
 
+/**
+ * Announce changed client hostname in the network.
+ *
+ * @param Client The client of which the hostname changed.
+ */
+static void
+Announce_Client_Hostname(CLIENT *Origin, CLIENT *Client)
+{
+       assert(Client != NULL);
+
+       /* Inform the client itself */
+       IRC_WriteStrClient(Client, RPL_HOSTHIDDEN_MSG, Client_ID(Client),
+                          Client_HostnameCloaked(Client));
+
+       /* Inform other servers in the network */
+       IRC_WriteStrServersPrefixFlag(Origin, Client_ThisServer(), 'M',
+                                     "METADATA %s host :%s", Client_ID(Client),
+                                     Client_HostnameCloaked(Client));
+}
+
+
 static bool
 Channel_Mode_Answer_Request(CLIENT *Origin, CHANNEL *Channel)
 {