From 08e35f665f35828dfcaee21b6f3ebda0660729ee Mon Sep 17 00:00:00 2001 From: "B.Greenham" Date: Tue, 2 Mar 2010 18:46:08 -0500 Subject: [PATCH] Add operator::vhost option. --- TODO-SHADOW | 1 - doc/example.conf | 6 ++++++ doc/reference.conf | 6 ++++++ include/s_newconf.h | 2 ++ src/newconf.c | 11 +++++++++++ src/s_user.c | 7 +++++-- 6 files changed, 30 insertions(+), 3 deletions(-) diff --git a/TODO-SHADOW b/TODO-SHADOW index da31800..3b1f247 100644 --- a/TODO-SHADOW +++ b/TODO-SHADOW @@ -6,7 +6,6 @@ Todo list for ShadowIRCd 6.0 * kicknorejoin (+J in inspircd chmode) * operoverride umode (+p), steal this from ircd-seven * immune cmode (+M), steal this from ircd-seven too -* host-on-operup: vhost that gets applied to you on oper-up. A surprising number of people want this. * Anything else we think of between now and release. :P Todo list for ShadowIRCd 6.1 diff --git a/doc/example.conf b/doc/example.conf index 1e9234b..acf1750 100755 --- a/doc/example.conf +++ b/doc/example.conf @@ -272,6 +272,12 @@ operator "god" { */ snomask = "+Zbfkrsuy"; + /* vhost: defines the vhost that this oper will get on oper up. + * this must be a valid hostmask. If this is specified the oper + * will not be given default_operhost. + */ + vhost = "is.an.oper"; + /* flags: misc options for the operator. You may prefix an option * with ~ to disable it, e.g. ~encrypted. * diff --git a/doc/reference.conf b/doc/reference.conf index 5642ad7..7978cb4 100755 --- a/doc/reference.conf +++ b/doc/reference.conf @@ -485,6 +485,12 @@ operator "god" { */ snomask = "+Zbfkrsuy"; + /* vhost: defines the vhost that this oper will get on oper up. + * this must be a valid hostmask. If this is specified the oper + * will not be given default_operhost. + */ + vhost = "is.an.oper"; + /* flags: misc options for the operator. You may prefix an option * with ~ to disable it, e.g. ~encrypted. * diff --git a/include/s_newconf.h b/include/s_newconf.h index 9b76f1e..847826e 100644 --- a/include/s_newconf.h +++ b/include/s_newconf.h @@ -119,6 +119,8 @@ struct oper_conf unsigned int snomask; + char *vhost; + struct PrivilegeSet *privset; #ifdef HAVE_LIBCRYPTO diff --git a/src/newconf.c b/src/newconf.c index ffdc34b..ebe7437 100644 --- a/src/newconf.c +++ b/src/newconf.c @@ -571,6 +571,10 @@ conf_end_oper(struct TopConf *tc) yy_tmpoper->flags = yy_oper->flags; yy_tmpoper->umodes = yy_oper->umodes; yy_tmpoper->snomask = yy_oper->snomask; + if(valid_hostname(yy_oper->vhost)) + yy_tmpoper->vhost = rb_strdup(yy_oper->vhost); + else + conf_report_error("Ignoring vhost setting for oper %s -- invalid hostmask.", yy_oper->name); yy_tmpoper->privset = yy_oper->privset; #ifdef HAVE_LIBCRYPTO @@ -700,6 +704,12 @@ conf_set_oper_snomask(void *data) yy_oper->snomask = parse_snobuf_to_mask(0, (const char *) data); } +static void +conf_set_oper_vhost(void *data) +{ + yy_oper->vhost = rb_strdup((char *) data); +} + static int conf_begin_class(struct TopConf *tc) { @@ -2066,6 +2076,7 @@ static struct ConfEntry conf_operator_table[] = { "umodes", CF_STRING | CF_FLIST, conf_set_oper_umodes, 0, NULL }, { "privset", CF_QSTRING, conf_set_oper_privset, 0, NULL }, { "snomask", CF_QSTRING, conf_set_oper_snomask, 0, NULL }, + { "vhost", CF_QSTRING, conf_set_oper_vhost, 0, NULL }, { "user", CF_QSTRING, conf_set_oper_user, 0, NULL }, { "password", CF_QSTRING, conf_set_oper_password, 0, NULL }, { "fingerprint", CF_QSTRING, conf_set_oper_fingerprint, 0, NULL }, diff --git a/src/s_user.c b/src/s_user.c index 062b0ed..c1ec57d 100644 --- a/src/s_user.c +++ b/src/s_user.c @@ -1310,9 +1310,12 @@ oper_up(struct Client *source_p, struct oper_conf *oper_p) else source_p->umodes |= DEFAULT_OPER_UMODES; - if(!EmptyString(ConfigFileEntry.default_operhost)) + if(oper_p->vhost || !EmptyString(ConfigFileEntry.default_operhost)) { - change_nick_user_host(source_p, source_p->name, source_p->username, ConfigFileEntry.default_operhost, 0, "Changing host"); + if(oper_p->vhost) + change_nick_user_host(source_p, source_p->name, source_p->username, oper_p->vhost, 0, "Changing host"); + else + change_nick_user_host(source_p, source_p->name, source_p->username, ConfigFileEntry.default_operhost, 0, "Changing host"); sendto_one_numeric(source_p, RPL_HOSTHIDDEN, "%s :is now your hidden host (set by %s)", source_p->host, source_p->servptr->name);