]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/nickserv.c
fix crash when rerouting without routing configured
[irc/evilnet/x3.git] / src / nickserv.c
index 4b7e44d12dd3156083efafe249d10f49022d5ce0..1f3ee2fdcd6990e51442d368703f17c5b003e230 100644 (file)
@@ -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");