diff options
-rw-r--r-- | include/s_user.h | 1 | ||||
-rw-r--r-- | modules/Makefile.am | 3 | ||||
-rw-r--r-- | modules/Makefile.in | 52 | ||||
-rw-r--r-- | modules/m_svshost.c | 121 | ||||
-rw-r--r-- | modules/m_svsmode.c | 15 | ||||
-rw-r--r-- | src/s_user.c | 19 |
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 |