]> jfr.im git - irc/freenode/solanum.git/commitdiff
m_webirc: Blow away ident if we've got it origin/edk/webirc-ident
authorEd Kellett <redacted>
Sun, 25 Oct 2020 19:40:03 +0000 (19:40 +0000)
committerEd Kellett <redacted>
Sun, 25 Oct 2020 19:40:03 +0000 (19:40 +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 2937189ea784496d2b5ac4b2006aca39db5a9595..97c1f33ee90dd9ecf11c1a197d5b10c47557a2f0 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 cb5ec43d26210b8b8cf48e397748440538b4a06e..410d1f7471cb7781d04cba3f3453d36cb40c96b9 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)