summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/s_user.h1
-rw-r--r--modules/Makefile.am3
-rw-r--r--modules/Makefile.in52
-rw-r--r--modules/m_svshost.c121
-rw-r--r--modules/m_svsmode.c15
-rw-r--r--src/s_user.c19
6 files changed, 50 insertions, 161 deletions
diff --git a/include/s_user.h b/include/s_user.h
index e90a31d..a0f167f 100644
--- a/include/s_user.h
+++ b/include/s_user.h
@@ -57,5 +57,6 @@ extern void add_isupport(const char *, const char *, int);
extern void delete_isupport(const char *);
extern void init_isupport(void);
extern void rebuild_isupport_message_line(void);
+extern void user_set_hostmask(struct Client *, const char *);
#endif
diff --git a/modules/Makefile.am b/modules/Makefile.am
index 3695570..21eadb4 100644
--- a/modules/Makefile.am
+++ b/modules/Makefile.am
@@ -47,7 +47,6 @@ modules_LTLIBRARIES = m_accept.la \
m_services.la \
m_stats.la \
m_svinfo.la \
- m_svshost.la \
m_svsmode.la \
m_svsnick.la \
m_tburst.la \
@@ -111,7 +110,6 @@ m_set_la_LDFLAGS = $(MODULE_FLAGS)
m_services_la_LDFLAGS = $(MODULE_FLAGS)
m_stats_la_LDFLAGS = $(MODULE_FLAGS)
m_svinfo_la_LDFLAGS = $(MODULE_FLAGS)
-m_svshost_la_LDFLAGS = $(MODULE_FLAGS)
m_svsmode_la_LDFLAGS = $(MODULE_FLAGS)
m_svsnick_la_LDFLAGS = $(MODULE_FLAGS)
m_tburst_la_LDFLAGS = $(MODULE_FLAGS)
@@ -174,7 +172,6 @@ m_set_la_SOURCES = m_set.c
m_services_la_SOURCES = m_services.c
m_stats_la_SOURCES = m_stats.c
m_svinfo_la_SOURCES = m_svinfo.c
-m_svshost_la_SOURCES = m_svshost.c
m_svsmode_la_SOURCES = m_svsmode.c
m_svsnick_la_SOURCES = m_svsnick.c
m_tburst_la_SOURCES = m_tburst.c
diff --git a/modules/Makefile.in b/modules/Makefile.in
index 4d05bf2..43e7ec2 100644
--- a/modules/Makefile.in
+++ b/modules/Makefile.in
@@ -348,12 +348,6 @@ m_svinfo_la_OBJECTS = $(am_m_svinfo_la_OBJECTS)
m_svinfo_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(m_svinfo_la_LDFLAGS) $(LDFLAGS) -o $@
-m_svshost_la_LIBADD =
-am_m_svshost_la_OBJECTS = m_svshost.lo
-m_svshost_la_OBJECTS = $(am_m_svshost_la_OBJECTS)
-m_svshost_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
- $(m_svshost_la_LDFLAGS) $(LDFLAGS) -o $@
m_svsmode_la_LIBADD =
am_m_svsmode_la_OBJECTS = m_svsmode.lo
m_svsmode_la_OBJECTS = $(am_m_svsmode_la_OBJECTS)
@@ -522,16 +516,16 @@ SOURCES = $(m_accept_la_SOURCES) $(m_admin_la_SOURCES) \
$(m_restart_la_SOURCES) $(m_resv_la_SOURCES) \
$(m_services_la_SOURCES) $(m_set_la_SOURCES) \
$(m_stats_la_SOURCES) $(m_svinfo_la_SOURCES) \
- $(m_svshost_la_SOURCES) $(m_svsmode_la_SOURCES) \
- $(m_svsnick_la_SOURCES) $(m_tburst_la_SOURCES) \
- $(m_testline_la_SOURCES) $(m_testmask_la_SOURCES) \
- $(m_time_la_SOURCES) $(m_topic_la_SOURCES) \
- $(m_trace_la_SOURCES) $(m_user_la_SOURCES) \
- $(m_userhost_la_SOURCES) $(m_users_la_SOURCES) \
- $(m_version_la_SOURCES) $(m_wallops_la_SOURCES) \
- $(m_watch_la_SOURCES) $(m_webirc_la_SOURCES) \
- $(m_who_la_SOURCES) $(m_whois_la_SOURCES) \
- $(m_whowas_la_SOURCES) $(m_xline_la_SOURCES)
+ $(m_svsmode_la_SOURCES) $(m_svsnick_la_SOURCES) \
+ $(m_tburst_la_SOURCES) $(m_testline_la_SOURCES) \
+ $(m_testmask_la_SOURCES) $(m_time_la_SOURCES) \
+ $(m_topic_la_SOURCES) $(m_trace_la_SOURCES) \
+ $(m_user_la_SOURCES) $(m_userhost_la_SOURCES) \
+ $(m_users_la_SOURCES) $(m_version_la_SOURCES) \
+ $(m_wallops_la_SOURCES) $(m_watch_la_SOURCES) \
+ $(m_webirc_la_SOURCES) $(m_who_la_SOURCES) \
+ $(m_whois_la_SOURCES) $(m_whowas_la_SOURCES) \
+ $(m_xline_la_SOURCES)
DIST_SOURCES = $(m_accept_la_SOURCES) $(m_admin_la_SOURCES) \
$(m_away_la_SOURCES) $(m_cap_la_SOURCES) $(m_capab_la_SOURCES) \
$(m_challenge_la_SOURCES) $(m_close_la_SOURCES) \
@@ -552,16 +546,16 @@ DIST_SOURCES = $(m_accept_la_SOURCES) $(m_admin_la_SOURCES) \
$(m_restart_la_SOURCES) $(m_resv_la_SOURCES) \
$(m_services_la_SOURCES) $(m_set_la_SOURCES) \
$(m_stats_la_SOURCES) $(m_svinfo_la_SOURCES) \
- $(m_svshost_la_SOURCES) $(m_svsmode_la_SOURCES) \
- $(m_svsnick_la_SOURCES) $(m_tburst_la_SOURCES) \
- $(m_testline_la_SOURCES) $(m_testmask_la_SOURCES) \
- $(m_time_la_SOURCES) $(m_topic_la_SOURCES) \
- $(m_trace_la_SOURCES) $(m_user_la_SOURCES) \
- $(m_userhost_la_SOURCES) $(m_users_la_SOURCES) \
- $(m_version_la_SOURCES) $(m_wallops_la_SOURCES) \
- $(m_watch_la_SOURCES) $(m_webirc_la_SOURCES) \
- $(m_who_la_SOURCES) $(m_whois_la_SOURCES) \
- $(m_whowas_la_SOURCES) $(m_xline_la_SOURCES)
+ $(m_svsmode_la_SOURCES) $(m_svsnick_la_SOURCES) \
+ $(m_tburst_la_SOURCES) $(m_testline_la_SOURCES) \
+ $(m_testmask_la_SOURCES) $(m_time_la_SOURCES) \
+ $(m_topic_la_SOURCES) $(m_trace_la_SOURCES) \
+ $(m_user_la_SOURCES) $(m_userhost_la_SOURCES) \
+ $(m_users_la_SOURCES) $(m_version_la_SOURCES) \
+ $(m_wallops_la_SOURCES) $(m_watch_la_SOURCES) \
+ $(m_webirc_la_SOURCES) $(m_who_la_SOURCES) \
+ $(m_whois_la_SOURCES) $(m_whowas_la_SOURCES) \
+ $(m_xline_la_SOURCES)
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
ctags-recursive dvi-recursive html-recursive info-recursive \
install-data-recursive install-dvi-recursive \
@@ -817,7 +811,6 @@ modules_LTLIBRARIES = m_accept.la \
m_services.la \
m_stats.la \
m_svinfo.la \
- m_svshost.la \
m_svsmode.la \
m_svsnick.la \
m_tburst.la \
@@ -880,7 +873,6 @@ m_set_la_LDFLAGS = $(MODULE_FLAGS)
m_services_la_LDFLAGS = $(MODULE_FLAGS)
m_stats_la_LDFLAGS = $(MODULE_FLAGS)
m_svinfo_la_LDFLAGS = $(MODULE_FLAGS)
-m_svshost_la_LDFLAGS = $(MODULE_FLAGS)
m_svsmode_la_LDFLAGS = $(MODULE_FLAGS)
m_svsnick_la_LDFLAGS = $(MODULE_FLAGS)
m_tburst_la_LDFLAGS = $(MODULE_FLAGS)
@@ -942,7 +934,6 @@ m_set_la_SOURCES = m_set.c
m_services_la_SOURCES = m_services.c
m_stats_la_SOURCES = m_stats.c
m_svinfo_la_SOURCES = m_svinfo.c
-m_svshost_la_SOURCES = m_svshost.c
m_svsmode_la_SOURCES = m_svsmode.c
m_svsnick_la_SOURCES = m_svsnick.c
m_tburst_la_SOURCES = m_tburst.c
@@ -1115,8 +1106,6 @@ m_stats.la: $(m_stats_la_OBJECTS) $(m_stats_la_DEPENDENCIES) $(EXTRA_m_stats_la_
$(AM_V_CCLD)$(m_stats_la_LINK) -rpath $(modulesdir) $(m_stats_la_OBJECTS) $(m_stats_la_LIBADD) $(LIBS)
m_svinfo.la: $(m_svinfo_la_OBJECTS) $(m_svinfo_la_DEPENDENCIES) $(EXTRA_m_svinfo_la_DEPENDENCIES)
$(AM_V_CCLD)$(m_svinfo_la_LINK) -rpath $(modulesdir) $(m_svinfo_la_OBJECTS) $(m_svinfo_la_LIBADD) $(LIBS)
-m_svshost.la: $(m_svshost_la_OBJECTS) $(m_svshost_la_DEPENDENCIES) $(EXTRA_m_svshost_la_DEPENDENCIES)
- $(AM_V_CCLD)$(m_svshost_la_LINK) -rpath $(modulesdir) $(m_svshost_la_OBJECTS) $(m_svshost_la_LIBADD) $(LIBS)
m_svsmode.la: $(m_svsmode_la_OBJECTS) $(m_svsmode_la_DEPENDENCIES) $(EXTRA_m_svsmode_la_DEPENDENCIES)
$(AM_V_CCLD)$(m_svsmode_la_LINK) -rpath $(modulesdir) $(m_svsmode_la_OBJECTS) $(m_svsmode_la_LIBADD) $(LIBS)
m_svsnick.la: $(m_svsnick_la_OBJECTS) $(m_svsnick_la_DEPENDENCIES) $(EXTRA_m_svsnick_la_DEPENDENCIES)
@@ -1204,7 +1193,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m_set.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m_stats.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m_svinfo.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m_svshost.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m_svsmode.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m_svsnick.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m_tburst.Plo@am__quote@
diff --git a/modules/m_svshost.c b/modules/m_svshost.c
deleted file mode 100644
index 5cdc4da..0000000
--- a/modules/m_svshost.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
- *
- * Copyright (C) 2013 by the Hybrid Development Team.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-
-/*! \file m_svshost.c
- * \brief Includes required functions for processing the SVSHOST command.
- * \version $Id$
- */
-
-#include "stdinc.h"
-#include "client.h"
-#include "ircd.h"
-#include "numeric.h"
-#include "s_serv.h"
-#include "send.h"
-#include "channel_mode.h"
-#include "parse.h"
-#include "modules.h"
-#include "irc_string.h"
-#include "s_user.h"
-#include "conf.h"
-#include "userhost.h"
-
-
-/*! \brief SVSHOST command handler (called by services)
- *
- * \param client_p Pointer to allocated Client struct with physical connection
- * to this server, i.e. with an open socket connected.
- * \param source_p Pointer to allocated Client struct from which the message
- * originally comes from. This can be a local or remote client.
- * \param parc Integer holding the number of supplied arguments.
- * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
- * pointers.
- * \note Valid arguments for this command are:
- * - parv[0] = sender prefix
- * - parv[1] = nickname
- * - parv[2] = TS
- * - parv[3] = hostname
- */
-static void
-ms_svshost(struct Client *client_p, struct Client *source_p,
- int parc, char *parv[])
-{
- struct Client *target_p = NULL;
- time_t ts = 0;
-
- if (!HasFlag(source_p, FLAGS_SERVICE))
- return;
-
- if ((target_p = find_person(client_p, parv[1])) == NULL)
- return;
-
- if ((ts = atol(parv[2])) && (ts != target_p->tsinfo))
- return;
-
- if (!valid_hostname(parv[3]))
- return;
-
- if (IsUserHostIp(target_p))
- delete_user_host(target_p->username, target_p->host, !MyConnect(target_p));
-
- strlcpy(target_p->host, parv[3], sizeof(target_p->host));
- SetIPSpoof(target_p);
-
- add_user_host(target_p->username, target_p->host, !MyConnect(target_p));
- SetUserHost(target_p);
-
- if (MyClient(target_p))
- clear_ban_cache_client(target_p);
-
- sendto_server(client_p, CAP_TS6, NOCAPS,
- ":%s SVSHOST %s %lu %s", ID(source_p),
- ID(target_p), (unsigned long)target_p->tsinfo, parv[3]);
- sendto_server(client_p, NOCAPS, CAP_TS6,
- ":%s SVSHOST %s %lu %s", source_p->name,
- target_p->name, (unsigned long)target_p->tsinfo, parv[3]);
-}
-
-static struct Message svshost_msgtab = {
- "SVSHOST", 0, 0, 4, MAXPARA, MFLG_SLOW, 0,
- {m_ignore, m_ignore, ms_svshost, m_ignore, m_ignore, m_ignore}
-};
-
-static void
-module_init(void)
-{
- mod_add_cmd(&svshost_msgtab);
-}
-
-static void
-module_exit(void)
-{
- mod_del_cmd(&svshost_msgtab);
-}
-
-struct module module_entry = {
- .node = { NULL, NULL, NULL },
- .name = NULL,
- .version = "$Revision$",
- .handle = NULL,
- .modinit = module_init,
- .modexit = module_exit,
- .flags = 0
-};
diff --git a/modules/m_svsmode.c b/modules/m_svsmode.c
index 433f660..0344d84 100644
--- a/modules/m_svsmode.c
+++ b/modules/m_svsmode.c
@@ -54,7 +54,7 @@
* - parv[1] = nickname
* - parv[2] = TS
* - parv[3] = mode
- * - parv[4] = optional argument (services id)
+ * - parv[4] = optional argument (services id, hostname)
*/
static void
ms_svsmode(struct Client *client_p, struct Client *source_p,
@@ -63,7 +63,7 @@ ms_svsmode(struct Client *client_p, struct Client *source_p,
struct Client *target_p = NULL;
const char *m = NULL, *extarg = NULL;
int what = MODE_ADD;
- unsigned int flag = 0, setmodes = 0;
+ unsigned int flag = 0, setflags = 0;
time_t ts = 0;
if (!HasFlag(source_p, FLAGS_SERVICE))
@@ -78,7 +78,7 @@ ms_svsmode(struct Client *client_p, struct Client *source_p,
if (parc > 4 && !EmptyString(parv[4]))
extarg = parv[4];
- setmodes = target_p->umodes;
+ setflags = target_p->umodes;
for (m = parv[3]; *m; ++m)
{
@@ -96,6 +96,11 @@ ms_svsmode(struct Client *client_p, struct Client *source_p,
strlcpy(target_p->svid, extarg, sizeof(target_p->svid));
break;
+ case 'x':
+ if (what == MODE_ADD && extarg)
+ user_set_hostmask(target_p, extarg);
+ break;
+
case 'o':
if (what == MODE_DEL && HasUMode(target_p, UMODE_OPER))
{
@@ -163,11 +168,11 @@ ms_svsmode(struct Client *client_p, struct Client *source_p,
target_p->name, (unsigned long)target_p->tsinfo, parv[3]);
}
- if (MyConnect(target_p) && (setmodes != target_p->umodes))
+ if (MyConnect(target_p) && (setflags != target_p->umodes))
{
char modebuf[IRCD_BUFSIZE];
- send_umode(target_p, target_p, setmodes, 0xffffffff, modebuf);
+ send_umode(target_p, target_p, setflags, 0xffffffff, modebuf);
}
}
diff --git a/src/s_user.c b/src/s_user.c
index 5c29525..3ec002c 100644
--- a/src/s_user.c
+++ b/src/s_user.c
@@ -1081,6 +1081,25 @@ send_umode_out(struct Client *client_p, struct Client *source_p,
send_umode(client_p, source_p, old, 0xffffffff, buf);
}
+void
+user_set_hostmask(struct Client *target_p, const char *hostname)
+{
+ if (!valid_hostname(hostname))
+ return;
+
+ if (IsUserHostIp(target_p))
+ delete_user_host(target_p->username, target_p->host, !MyConnect(target_p));
+
+ strlcpy(target_p->host, hostname, sizeof(target_p->host));
+ SetIPSpoof(target_p);
+
+ add_user_host(target_p->username, target_p->host, !MyConnect(target_p));
+ SetUserHost(target_p);
+
+ if (MyClient(target_p))
+ clear_ban_cache_client(target_p);
+}
+
/* user_welcome()
*
* inputs - client pointer to client to welcome