]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/nickserv.c
helpfile improvements
[irc/evilnet/x3.git] / src / nickserv.c
index 173fca320df762ec2e3d38c823c994d95ce332e7..cf9d4498ed51964de18f3702e71bdf81d452b84a 100644 (file)
@@ -1,7 +1,7 @@
 /* nickserv.c - Nick/authentication service
  * Copyright 2000-2004 srvx Development Team
  *
- * This file is part of srvx.
+ * This file is part of x3.
  *
  * srvx is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -110,7 +110,7 @@ DEFINE_LIST(handle_info_list, struct handle_info*);
 #define NICKSERV_MIN_PARMS(N) do { \
   if (argc < N) { \
     reply("MSG_MISSING_PARAMS", argv[0]); \
-    svccmd_send_help(user, nickserv, cmd); \
+    svccmd_send_help_brief(user, nickserv, cmd); \
     return 0; \
   } } while (0)
 
@@ -134,7 +134,7 @@ static const struct message_entry msgtab[] = {
     { "NSMSG_HANDLE_TOLONG", "The account name %s is too long. Account names must be %lu charactors or less."},
     { "NSMSG_PASSWORD_SHORT", "Your password must be at least %lu characters long." },
     { "NSMSG_PASSWORD_ACCOUNT", "Your password may not be the same as your account name." },
-    { "NSMSG_PASSWORD_DICTIONARY", "Your password should not be the word \"password\", or any other dictionary word." },
+    { "NSMSG_PASSWORD_DICTIONARY", "Your password is too simple. You must choose a password that is not just a word or name." },
     { "NSMSG_PASSWORD_READABLE", "Your password must have at least %lu digit(s), %lu capital letter(s), and %lu lower-case letter(s)." },
     { "NSMSG_PARTIAL_REGISTER", "Account has been registered to you; nick was already registered to someone else." },
     { "NSMSG_OREGISTER_VICTIM", "%s has registered a new account for you (named %s)." },
@@ -185,29 +185,30 @@ static const struct message_entry msgtab[] = {
     { "NSMSG_TITLE_INVALID", "Titles cannot contain any dots; 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", "Account information for $b%s$b:" },
-    { "NSMSG_HANDLEINFO_ID", "  Account ID: %lu" },
-    { "NSMSG_HANDLEINFO_REGGED", "  Registered on: %s" },
-    { "NSMSG_HANDLEINFO_LASTSEEN", "  Last seen: %s" },
-    { "NSMSG_HANDLEINFO_LASTSEEN_NOW", "  Last seen: Right now!" },
-    { "NSMSG_HANDLEINFO_VACATION", "  On vacation." },
-    { "NSMSG_HANDLEINFO_EMAIL_ADDR", "  Email address: %s" },
-    { "NSMSG_HANDLEINFO_COOKIE_ACTIVATION", "  Cookie: There is currently an activation cookie issued for this account" },
-    { "NSMSG_HANDLEINFO_COOKIE_PASSWORD", "  Cookie: There is currently a password change cookie issued for this account" },
-    { "NSMSG_HANDLEINFO_COOKIE_EMAIL", "  Cookie: There is currently an email change cookie issued for this account" },
-    { "NSMSG_HANDLEINFO_COOKIE_ALLOWAUTH", "  Cookie: There is currently an allowauth cookie issued for this account" },
-    { "NSMSG_HANDLEINFO_COOKIE_UNKNOWN", "  Cookie: There is currently an unknown cookie issued for this account" },
-    { "NSMSG_HANDLEINFO_INFOLINE", "  Infoline: %s" },
-    { "NSMSG_HANDLEINFO_FLAGS", "  Flags: %s" },
-    { "NSMSG_HANDLEINFO_EPITHET", "  Epithet: %s" },
-    { "NSMSG_HANDLEINFO_FAKEHOST", "  Fake host: %s" },
-    { "NSMSG_HANDLEINFO_LAST_HOST", "  Last quit hostmask: %s" },
-    { "NSMSG_HANDLEINFO_LAST_HOST_UNKNOWN", "  Last quit hostmask: Unknown" },
-    { "NSMSG_HANDLEINFO_NICKS", "  Nickname(s): %s" },
-    { "NSMSG_HANDLEINFO_MASKS", "  Hostmask(s): %s" },
-    { "NSMSG_HANDLEINFO_CHANNELS", "  Channel(s): %s" },
-    { "NSMSG_HANDLEINFO_CURRENT", "  Current nickname(s): %s" },
-    { "NSMSG_HANDLEINFO_DNR", "  Do-not-register (by %s): %s" },
+    { "NSMSG_HANDLEINFO_ON", "$bAccount Information for %s$b" },
+    { "NSMSG_HANDLEINFO_END", "----------End of Account Info-----------" },
+    { "NSMSG_HANDLEINFO_ID", "Account ID: %lu" },
+    { "NSMSG_HANDLEINFO_REGGED", "Registered on: %s" },
+    { "NSMSG_HANDLEINFO_LASTSEEN", "Last seen: %s" },
+    { "NSMSG_HANDLEINFO_LASTSEEN_NOW", "Last seen: Right now!" },
+    { "NSMSG_HANDLEINFO_VACATION", "On vacation." },
+    { "NSMSG_HANDLEINFO_EMAIL_ADDR", "Email address: %s" },
+    { "NSMSG_HANDLEINFO_COOKIE_ACTIVATION", "Cookie: There is currently an activation cookie issued for this account" },
+    { "NSMSG_HANDLEINFO_COOKIE_PASSWORD", "Cookie: There is currently a password change cookie issued for this account" },
+    { "NSMSG_HANDLEINFO_COOKIE_EMAIL", "Cookie: There is currently an email change cookie issued for this account" },
+    { "NSMSG_HANDLEINFO_COOKIE_ALLOWAUTH", "Cookie: There is currently an allowauth cookie issued for this account" },
+    { "NSMSG_HANDLEINFO_COOKIE_UNKNOWN", "Cookie: There is currently an unknown cookie issued for this account" },
+    { "NSMSG_HANDLEINFO_INFOLINE", "Infoline: %s" },
+    { "NSMSG_HANDLEINFO_FLAGS", "Flags: %s" },
+    { "NSMSG_HANDLEINFO_EPITHET", "Epithet: %s" },
+    { "NSMSG_HANDLEINFO_FAKEHOST", "Fake host: %s" },
+    { "NSMSG_HANDLEINFO_LAST_HOST", "Last quit hostmask: %s" },
+    { "NSMSG_HANDLEINFO_LAST_HOST_UNKNOWN", "Last quit hostmask: Unknown" },
+    { "NSMSG_HANDLEINFO_NICKS", "Nickname(s): %s" },
+    { "NSMSG_HANDLEINFO_MASKS", "Hostmask(s): %s" },
+    { "NSMSG_HANDLEINFO_CHANNELS", "Channel(s): %s" },
+    { "NSMSG_HANDLEINFO_CURRENT", "Current nickname(s): %s" },
+    { "NSMSG_HANDLEINFO_DNR", "Do-not-register (by %s): %s" },
     { "NSMSG_USERINFO_AUTHED_AS", "$b%s$b is authenticated to account $b%s$b." },
     { "NSMSG_USERINFO_NOT_AUTHED", "$b%s$b is not authenticated to any account." },
     { "NSMSG_NICKINFO_OWNER", "Nick $b%s$b is owned by account $b%s$b." },
@@ -273,7 +274,9 @@ static const struct message_entry msgtab[] = {
     { "NSMSG_RECLAIMED_SVSNICK", "Forcibly changed %s's nick." },
     { "NSMSG_RECLAIMED_KILL",  "Disconnected %s from the network." },
     { "NSMSG_CLONE_AUTH", "Warning: %s (%s@%s) authed to your account." },
-    { "NSMSG_SETTING_LIST", "$b$N account settings:$b" },
+    { "NSMSG_SETTING_LIST", "$b$N account settings$b" },
+    { "NSMSG_SETTING_LIST_HEADER", "----------------------------------------" },
+    { "NSMSG_SETTING_LIST_END",    "-------------End Of Settings------------" },
     { "NSMSG_INVALID_OPTION", "$b%s$b is an invalid account setting." },
     { "NSMSG_INVALID_ANNOUNCE", "$b%s$b is an invalid announcements value." },
     { "NSMSG_SET_INFO", "$bINFO:         $b%s" },
@@ -309,7 +312,7 @@ static const struct message_entry msgtab[] = {
         "This email has been sent to verify that this email address belongs to the person who tried to register an account on %1$s.  Your cookie is:\n"
         "%2$s\n"
         "To verify your email address and complete the account registration, visit the following URL:\n"
-        "http://www.afternet.org/play/index.php?option=com_registration&task=activate&username=%5$s&cookie=%2$s\n"
+        "http://www.afternet.org/index.php?option=com_registration&task=activate&username=%5$s&cookie=%2$s\n"
         "\n"
         "If you did NOT request this account, you do not need to do anything.\n"
         "Please contact the %1$s staff if you have questions, and be sure to check our website." },
@@ -323,7 +326,7 @@ static const struct message_entry msgtab[] = {
     { "NSEMAIL_PASSWORD_CHANGE_BODY_WEB", 
         "This email has been sent to verify that you wish to change the password on your account %5$s.  Your cookie is %2$s.\n"
         "To complete the password change, click the following URL:\n"
-        "http://www.afternet.org/play/index.php?option=com_registration&task=passcookie&username=%5$s&cookie=%2$s\n"
+        "http://www.afternet.org/index.php?option=com_registration&task=passcookie&username=%5$s&cookie=%2$s\n"
         "If you did NOT request your password to be changed, you do not need to do anything.\n"
         "Please contact the %1$s staff if you have questions." },
     { "NSEMAIL_EMAIL_CHANGE_SUBJECT", "Email address change verification for %s" },
@@ -1036,6 +1039,27 @@ nickserv_bake_cookie(struct handle_cookie *cookie)
     timeq_add(cookie->expires, nickserv_free_cookie, cookie);
 }
 
+/* Contributed by the great sneep of afternet ;) */
+/* Since this gets used in a URL, we want to avoid stuff that confuses
+ * email clients such as ] and ?. a-z, 0-9 only.
+ */
+void genpass(char *str, int len)
+{
+        int i = 0;
+        char c = 0;
+
+        for(i = 0; i < len; i++)
+        {
+                do
+                {
+                        c = (char)((float)rand() / (float)RAND_MAX * (float)256);
+                } while(!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')));
+                str[i] = c;
+        }
+        str[i] = '\0';
+        return;
+}
+
 static void
 nickserv_make_cookie(struct userNode *user, struct handle_info *hi, enum cookie_type type, const char *cookie_data, int weblink)
 {
@@ -1053,9 +1077,14 @@ nickserv_make_cookie(struct userNode *user, struct handle_info *hi, enum cookie_
     cookie->hi = hi;
     cookie->type = type;
     cookie->data = cookie_data ? strdup(cookie_data) : NULL;
+
     cookie->expires = now + nickserv_conf.cookie_timeout;
-    inttobase64(cookie->cookie, rand(), 5);
-    inttobase64(cookie->cookie+5, rand(), 5);
+    /* Adding dedicated password gen function for more control -Rubin */
+    genpass(cookie->cookie, 10);
+    /*
+     *inttobase64(cookie->cookie, rand(), 5);
+     *inttobase64(cookie->cookie+5, rand(), 5);
+     */
 
     netname = nickserv_conf.network_name;
     subject[0] = 0;
@@ -1291,6 +1320,7 @@ static NICKSERV_FUNC(cmd_register)
        */
       SyncLog("REGISTER %s %s %s %s", hi->handle, syncpass, email_addr ? email_addr : "0", user->info);
     }
+    process_adduser_pending(user);
 
     return 1;
 }
@@ -1358,6 +1388,7 @@ static NICKSERV_FUNC(cmd_handleinfo)
 
     nsmsg_none = handle_find_message(hi, "MSG_NONE");
     reply("NSMSG_HANDLEINFO_ON", hi->handle);
+    reply("MSG_BAR");
 #ifdef WITH_PROTOCOL_BAHAMUT
     reply("NSMSG_HANDLEINFO_ID", hi->id);
 #endif
@@ -1380,8 +1411,10 @@ static NICKSERV_FUNC(cmd_handleinfo)
             reply("NSMSG_HANDLEINFO_DNR", dnr->setter, dnr->reason);
         if (!oper_outranks(user, hi))
             return 1;
-    } else if (hi != user->handle_info)
+    } else if (hi != user->handle_info) {
+        reply("NSMSG_HANDLEINFO_END");
         return 1;
+    }
 
     if (nickserv_conf.email_enabled)
         reply("NSMSG_HANDLEINFO_EMAIL_ADDR", visible_email_addr(user, hi));
@@ -1484,7 +1517,7 @@ static NICKSERV_FUNC(cmd_handleinfo)
            }
             if (IsUserSuspended(channel))
                 buff[pos++] = '-';
-            pos += sprintf(buff+pos, "%d:%s ", channel->access, name);
+            pos += sprintf(buff+pos, "%s:%s ", user_level_name_from_level(channel->access), name);
            if (next == NULL) {
              print_chans_buff:
                buff[pos-1] = 0;
@@ -1514,6 +1547,7 @@ static NICKSERV_FUNC(cmd_handleinfo)
        }
     }
 
+    reply("NSMSG_HANDLEINFO_END");
     return 1;
 }
 
@@ -1758,6 +1792,8 @@ static NICKSERV_FUNC(cmd_auth)
     if (hi->passwd[0] != '$')
         cryptpass(passwd, hi->passwd);
     reply("NSMSG_AUTH_SUCCESS");
+
+    process_adduser_pending(user);
     argv[pw_arg] = "****";
     return 1;
 }
@@ -2254,16 +2290,19 @@ set_list(struct userNode *user, struct handle_info *hi, int override)
     option_func_t *opt;
     unsigned int i;
     char *set_display[] = {
-        "INFO", "WIDTH", "TABLEWIDTH", "COLOR", "PRIVMSG", "STYLE",
-        "EMAIL", "ANNOUNCEMENTS", "MAXLOGINS", "LANGUAGE"
+        "INFO", "WIDTH", "TABLEWIDTH", "COLOR", "PRIVMSG", /* "STYLE", */
+        "EMAIL", "ANNOUNCEMENTS", "MAXLOGINS", "LANGUAGE",
+        "FAKEHOST", "TITLE", "EPITHET"
     };
 
     send_message(user, nickserv, "NSMSG_SETTING_LIST");
+    send_message(user, nickserv, "NSMSG_SETTING_LIST_HEADER");
 
     /* Do this so options are presented in a consistent order. */
     for (i = 0; i < ArrayLength(set_display); ++i)
        if ((opt = dict_find(nickserv_opt_dict, set_display[i], NULL)))
            opt(user, hi, override, 0, NULL);
+    send_message(user, nickserv, "NSMSG_SETTING_LIST_END");
 }
 
 static NICKSERV_FUNC(cmd_set)
@@ -2385,6 +2424,7 @@ static OPTION_FUNC(opt_privmsg)
     return 1;
 }
 
+/*
 static OPTION_FUNC(opt_style)
 {
     char *style;
@@ -2408,6 +2448,7 @@ static OPTION_FUNC(opt_style)
     send_message(user, nickserv, "NSMSG_SET_STYLE", style);
     return 1;
 }
+*/
 
 static OPTION_FUNC(opt_announcements)
 {
@@ -2574,13 +2615,15 @@ static OPTION_FUNC(opt_level)
 
 static OPTION_FUNC(opt_epithet)
 {
-    if (!override) {
-        send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
-        return 0;
-    }
-
     if ((argc > 1) && oper_has_access(user, nickserv, nickserv_conf.set_epithet_level, 0)) {
-        char *epithet = unsplit_string(argv+1, argc-1, NULL);
+        char *epithet;
+        if (!override) {
+            send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
+            return 0;
+        }
+
+        epithet = unsplit_string(argv+1, argc-1, NULL);
+
         if (hi->epithet)
             free(hi->epithet);
         if ((epithet[0] == '*') && !epithet[1])
@@ -2600,12 +2643,12 @@ static OPTION_FUNC(opt_title)
 {
     const char *title;
 
-    if (!override) {
-        send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
-        return 0;
-    }
-
     if ((argc > 1) && oper_has_access(user, nickserv, nickserv_conf.set_title_level, 0)) {
+        if (!override) {
+            send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
+            return 0;
+        }
+
         title = argv[1];
         if (strchr(title, '.')) {
             send_message(user, nickserv, "NSMSG_TITLE_INVALID");
@@ -2640,12 +2683,12 @@ static OPTION_FUNC(opt_fakehost)
 {
     const char *fake;
 
-    if (!override) {
-        send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
-        return 0;
-    }
-
     if ((argc > 1) && oper_has_access(user, nickserv, nickserv_conf.set_fakehost_level, 0)) {
+        if (!override) {
+            send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
+            return 0;
+        }
+
         fake = argv[1];
         if ((strlen(fake) > HOSTLEN) || (fake[0] == '.')) {
             send_message(user, nickserv, "NSMSG_FAKEHOST_INVALID", HOSTLEN);
@@ -3999,7 +4042,7 @@ init_nickserv(const char *nick)
     dict_insert(nickserv_opt_dict, "TABLEWIDTH", opt_tablewidth);
     dict_insert(nickserv_opt_dict, "COLOR", opt_color);
     dict_insert(nickserv_opt_dict, "PRIVMSG", opt_privmsg);
-    dict_insert(nickserv_opt_dict, "STYLE", opt_style);
+/*    dict_insert(nickserv_opt_dict, "STYLE", opt_style); */
     dict_insert(nickserv_opt_dict, "PASS", opt_password);
     dict_insert(nickserv_opt_dict, "PASSWORD", opt_password);
     dict_insert(nickserv_opt_dict, "FLAGS", opt_flags);