X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/bf93ca8d63e94ecbc72ee4fb54bcc15c5f5f6f1b..6a64b9cea9d7f537ce31c8df38fd738a3657fc39:/src/nickserv.c diff --git a/src/nickserv.c b/src/nickserv.c index 4b7e44d..eb077f5 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -27,7 +27,7 @@ #include "sendmail.h" #include "timeq.h" -#include +#include #define NICKSERV_CONF_NAME "services/nickserv" @@ -192,7 +192,7 @@ static const struct message_entry msgtab[] = { { "NSMSG_STAMPED_AUTH", "You have already authenticated to an account once this session; you may not authenticate to another." }, { "NSMSG_STAMPED_RESETPASS", "You have already authenticated to an account once this session; you may not reset your password to authenticate again." }, { "NSMSG_STAMPED_AUTHCOOKIE", "You have already authenticated to an account once this session; you may not use a cookie to authenticate to another account." }, - { "NSMSG_TITLE_INVALID", "Titles cannot contain any dots; please choose another." }, + { "NSMSG_TITLE_INVALID", "Titles may contain only a-z, A-Z, 0-9, and '-'. Please choose another." }, { "NSMSG_TITLE_TRUNCATED", "That title combined with the user's account name would result in a truncated host; please choose a shorter title." }, { "NSMSG_FAKEHOST_INVALID", "Fake hosts must be shorter than %d characters and cannot start with a dot." }, { "NSMSG_HANDLEINFO_ON", "$bAccount Information for %s$b" }, @@ -2952,7 +2952,9 @@ static OPTION_FUNC(opt_epithet) static OPTION_FUNC(opt_title) { - const char *title; + char *title; + const char *none; + char *sptr; if ((argc > 1) && oper_has_access(user, nickserv, nickserv_conf.set_title_level, 0)) { if (!override) { @@ -2961,20 +2963,28 @@ static OPTION_FUNC(opt_title) } title = argv[1]; - if (strchr(title, '.')) { - reply("NSMSG_TITLE_INVALID"); - return 0; - } - if ((strlen(user->handle_info->handle) + strlen(title) + - strlen(nickserv_conf.titlehost_suffix) + 2) > HOSTLEN) { - reply("NSMSG_TITLE_TRUNCATED"); - return 0; - } - - free(hi->fakehost); - if (!strcmp(title, "*")) { + if(!strcmp(title, "*")) { + free(hi->fakehost); hi->fakehost = NULL; - } else { + } + else { + if (strchr(title, '.')) { + reply("NSMSG_TITLE_INVALID"); + return 0; + } + /* Alphanumeric titles only. */ + for(sptr = title; *sptr; sptr++) { + if(!isalnum(*sptr) && *sptr != '-') { + reply("NSMSG_TITLE_INVALID"); + return 0; + } + } + if ((strlen(user->handle_info->handle) + strlen(title) + + strlen(nickserv_conf.titlehost_suffix) + 2) > HOSTLEN) { + reply("NSMSG_TITLE_TRUNCATED"); + return 0; + } + free(hi->fakehost); hi->fakehost = malloc(strlen(title)+2); hi->fakehost[0] = '.'; strcpy(hi->fakehost+1, title); @@ -2982,19 +2992,34 @@ static OPTION_FUNC(opt_title) apply_fakehost(hi); } else if (hi->fakehost && (hi->fakehost[0] == '.')) title = hi->fakehost + 1; - else - title = NULL; + else { + /* If theres no title set then the default title will therefore + be the first part of hidden_host in x3.conf.example, so for + consistency with opt_fakehost we will print this here */ + char *hs, *hidden_suffix, *rest; + + hs = conf_get_data("server/hidden_host", RECDB_QSTRING); + hidden_suffix = strdup(hs); + + /* Yes we do this twice */ + rest = strrchr(hidden_suffix, '.'); + *rest++ = '\0'; + rest = strrchr(hidden_suffix, '.'); + *rest++ = '\0'; + + title = hidden_suffix; + } + if (!title) - title = user_find_message(user, "MSG_NONE"); - send_message(user, nickserv, "NSMSG_SET_TITLE", title); + none = user_find_message(user, "MSG_NONE"); + send_message(user, nickserv, "NSMSG_SET_TITLE", title ? title : none); return 1; } int check_vhost(char *vhost, struct userNode *user, struct svccmd *cmd) { - unsigned int y, depth; - char *hostname; + unsigned int y; // check for a dot in the vhost if(strchr(vhost, '.') == NULL) { @@ -3087,11 +3112,9 @@ static OPTION_FUNC(opt_fakehost) } apply_fakehost(hi); fake = hi->fakehost; - } else { - /* no arg or no access, how did we even GET here? */ - reply("MSG_SETTING_PRIVILEGED", argv[0]); - return 0; - } + } else + fake = generate_fakehost(hi); + /* Tell them we set the host */ if (!fake) fake = user_find_message(user, "MSG_NONE");