summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichael <michael@82007160-df01-0410-b94d-b575c5fd34c7>2013-03-31 14:31:45 +0000
committermichael <michael@82007160-df01-0410-b94d-b575c5fd34c7>2013-03-31 14:31:45 +0000
commit2c7278c7e5ee0517be2b29a52bf717966c3a7dc0 (patch)
tree723a0edbe576a9aeafa031ffaf4e9be2c8c57c33
parente9eb37bc2d15eb06ed4e1f7c12c7220364714189 (diff)
- Forward-port -r1792 [Added SVSHOST command handler which allows services to change the
hostname of a specific user] git-svn-id: svn://svn.ircd-hybrid.org/svnroot/ircd-hybrid/trunk@1795 82007160-df01-0410-b94d-b575c5fd34c7
-rw-r--r--modules/Makefile.am3
-rw-r--r--modules/Makefile.in52
-rw-r--r--modules/core/m_nick.c22
-rw-r--r--modules/m_svshost.c121
-rw-r--r--src/s_user.c2
5 files changed, 158 insertions, 42 deletions
diff --git a/modules/Makefile.am b/modules/Makefile.am
index 21eadb4..3695570 100644
--- a/modules/Makefile.am
+++ b/modules/Makefile.am
@@ -47,6 +47,7 @@ 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 \
@@ -110,6 +111,7 @@ 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)
@@ -172,6 +174,7 @@ 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 43e7ec2..4d05bf2 100644
--- a/modules/Makefile.in
+++ b/modules/Makefile.in
@@ -348,6 +348,12 @@ 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)
@@ -516,16 +522,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_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_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)
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) \
@@ -546,16 +552,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_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_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)
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
ctags-recursive dvi-recursive html-recursive info-recursive \
install-data-recursive install-dvi-recursive \
@@ -811,6 +817,7 @@ 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 \
@@ -873,6 +880,7 @@ 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)
@@ -934,6 +942,7 @@ 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
@@ -1106,6 +1115,8 @@ 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)
@@ -1193,6 +1204,7 @@ 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/core/m_nick.c b/modules/core/m_nick.c
index 15d47af..a490292 100644
--- a/modules/core/m_nick.c
+++ b/modules/core/m_nick.c
@@ -58,7 +58,6 @@ static int check_clean_host(struct Client *client_p, char *nick, char *host,
struct Client *server_p);
static int clean_user_name(const char *);
-static int clean_host_name(const char *);
static void perform_nick_collides(struct Client *, struct Client *, struct Client *,
int, char **, time_t, const char *, char *, char *, char *);
@@ -611,7 +610,7 @@ static int
check_clean_host(struct Client *client_p, char *nick,
char *host, struct Client *server_p)
{
- if (!clean_host_name(host))
+ if (!valid_hostname(host))
{
++ServerStats.is_kill;
sendto_realops_flags(UMODE_DEBUG, L_ALL, SEND_NOTICE,
@@ -645,25 +644,6 @@ clean_user_name(const char *user)
return p - user <= USERLEN;
}
-/* clean_host_name()
- * input - hostname
- * output - none
- * side effects - walks through the hostname, returning 0 if erroneous
- */
-static int
-clean_host_name(const char *host)
-{
- const char *p = host;
-
- assert(host && *host);
-
- for (; *p; ++p)
- if (!IsHostChar(*p))
- return 0;
-
- return p - host <= HOSTLEN;
-}
-
/*
* nick_from_server()
*/
diff --git a/modules/m_svshost.c b/modules/m_svshost.c
new file mode 100644
index 0000000..5cdc4da
--- /dev/null
+++ b/modules/m_svshost.c
@@ -0,0 +1,121 @@
+/*
+ * 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/src/s_user.c b/src/s_user.c
index b2c7911..ddcfa83 100644
--- a/src/s_user.c
+++ b/src/s_user.c
@@ -658,7 +658,7 @@ valid_hostname(const char *hostname)
if (!IsHostChar(*p))
return 0;
- return 1;
+ return p - hostname <= HOSTLEN;
}
/* valid_username()