]> jfr.im git - irc/freenode/solanum.git/commitdiff
m_webirc: Blow away ident if we've got it
authorEd Kellett <redacted>
Sun, 25 Oct 2020 19:40:03 +0000 (19:40 +0000)
committerEd Kellett <redacted>
Mon, 2 Nov 2020 19:59:29 +0000 (19:59 +0000)
Previously, anyone on the WEBIRC gateway would get its ident if it
advertised one, which seems wrong to me.

This allows ident to be used with WEBIRC while still letting users send
their own ~username in band.

extensions/m_webirc.c
include/client.h

index dff262c62b888efded461fa7d27760aef8e95dbc..99ae7d42cf501bde5c8cbf387cc417f89c84ff55 100644 (file)
@@ -75,8 +75,8 @@ DECLARE_MODULE_AV2(webirc, NULL, NULL, webirc_clist, NULL, webirc_hfnlist, NULL,
 
 /*
  * mr_webirc - webirc message handler
- *      parv[1] = password
- *      parv[2] = fake username (we ignore this)
+ *     parv[1] = password
+ *     parv[2] = fake username (we ignore this)
  *     parv[3] = fake hostname
  *     parv[4] = fake ip
  */
@@ -89,13 +89,20 @@ mr_webirc(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sourc
 
        int secure = 0;
 
+       if (source_p->flags & FLAGS_SENTUSER || !EmptyString(source_p->name))
+       {
+               exit_client(client_p, source_p, &me, "WEBIRC may not follow NICK/USER");
+       }
+
        aconf = find_address_conf(client_p->host, client_p->sockhost,
                                IsGotId(client_p) ? client_p->username : "webirc",
                                IsGotId(client_p) ? client_p->username : "webirc",
                                (struct sockaddr *) &client_p->localClient->ip,
                                GET_SS_FAMILY(&client_p->localClient->ip), NULL);
+
        if (aconf == NULL || !(aconf->status & CONF_CLIENT))
                return;
+
        if (!IsConfDoSpoofIp(aconf) || irccmp(aconf->info.name, "webirc."))
        {
                /* XXX */
@@ -133,6 +140,8 @@ mr_webirc(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sourc
        }
 
        source_p->localClient->ip = addr;
+       source_p->username[0] = '\0';
+       ClearGotId(source_p);
 
        if (parc >= 6)
        {
index ba890b57d9b27191fc27d6b7b525198b83f59add..5a86061c61a401f117788e3655cdcecc1cdefb60 100644 (file)
@@ -539,6 +539,7 @@ struct ListClient
 #define IsNoForward(x)          ((x)->umodes & UMODE_NOFORWARD)
 
 #define SetGotId(x)             ((x)->flags |= FLAGS_GOTID)
+#define ClearGotId(x)           ((x)->flags &= ~FLAGS_GOTID)
 #define IsGotId(x)              (((x)->flags & FLAGS_GOTID) != 0)
 
 #define IsExemptKline(x)        ((x)->flags & FLAGS_EXEMPTKLINE)