diff options
author | michael <michael@82007160-df01-0410-b94d-b575c5fd34c7> | 2013-03-31 14:31:45 +0000 |
---|---|---|
committer | michael <michael@82007160-df01-0410-b94d-b575c5fd34c7> | 2013-03-31 14:31:45 +0000 |
commit | 2c7278c7e5ee0517be2b29a52bf717966c3a7dc0 (patch) | |
tree | 723a0edbe576a9aeafa031ffaf4e9be2c8c57c33 | |
parent | e9eb37bc2d15eb06ed4e1f7c12c7220364714189 (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.am | 3 | ||||
-rw-r--r-- | modules/Makefile.in | 52 | ||||
-rw-r--r-- | modules/core/m_nick.c | 22 | ||||
-rw-r--r-- | modules/m_svshost.c | 121 | ||||
-rw-r--r-- | src/s_user.c | 2 |
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() |