From 861a54454105f67d46873220f34bf214e65d5d69 Mon Sep 17 00:00:00 2001 From: Ed Kellett Date: Sun, 25 Oct 2020 19:40:03 +0000 Subject: [PATCH] m_webirc: Blow away ident if we've got it 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 | 13 +++++++++++-- include/client.h | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/extensions/m_webirc.c b/extensions/m_webirc.c index dff262c6..99ae7d42 100644 --- a/extensions/m_webirc.c +++ b/extensions/m_webirc.c @@ -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) { diff --git a/include/client.h b/include/client.h index ba890b57..5a86061c 100644 --- a/include/client.h +++ b/include/client.h @@ -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)