]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/nickserv.c
nickserv: marked cmd possibly unused to silence warning
[irc/evilnet/x3.git] / src / nickserv.c
index 6f8e3ccf9125f84999e7c86d6a6350ba3063285a..7c28c0d5851d4fb82f56c94b5ec179bc0c929bb8 100644 (file)
@@ -58,6 +58,8 @@
 #define KEY_TITLEHOST_SUFFIX "titlehost_suffix"
 #define KEY_AUTO_OPER "auto_oper"
 #define KEY_AUTO_ADMIN "auto_admin"
+#define KEY_AUTO_OPER_PRIVS "auto_oper_privs"
+#define KEY_AUTO_ADMIN_PRIVS "auto_admin_privs"
 #define KEY_FLAG_LEVELS "flag_levels"
 #define KEY_HANDLE_EXPIRE_FREQ "handle_expire_freq"
 #define KEY_ACCOUNT_EXPIRE_FREQ "account_expire_freq"
 #define NICKSERV_VALID_CHARS   "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
 
 #define NICKSERV_FUNC(NAME) MODCMD_FUNC(NAME)
-#define OPTION_FUNC(NAME) int NAME(struct svccmd *cmd, struct userNode *user, struct handle_info *hi, UNUSED_ARG(unsigned int override), unsigned int argc, char *argv[])
+#define OPTION_FUNC(NAME) int NAME(UNUSED_ARG(struct svccmd *cmd), struct userNode *user, struct handle_info *hi, UNUSED_ARG(unsigned int override), unsigned int argc, char *argv[])
 typedef OPTION_FUNC(option_func_t);
 
 DEFINE_LIST(handle_info_list, struct handle_info*)
@@ -159,7 +161,7 @@ extern struct string_list *autojoin_channels;
 static struct module *nickserv_module;
 static struct service *nickserv_service;
 static struct log_type *NS_LOG;
-static dict_t nickserv_handle_dict; /* contains struct handle_info* */
+dict_t nickserv_handle_dict; /* contains struct handle_info* */
 static dict_t nickserv_id_dict; /* contains struct handle_info* */
 static dict_t nickserv_nick_dict; /* contains struct nick_info* */
 static dict_t nickserv_opt_dict; /* contains option_func_t* */
@@ -322,6 +324,7 @@ static const struct message_entry msgtab[] = {
     { "NSMSG_CANNOT_MERGE_SELF", "You cannot merge account $b%s$b with itself." },
     { "NSMSG_HANDLES_MERGED", "Merged account $b%s$b into $b%s$b." },
     { "NSMSG_RECLAIM_WARN", "%s is a registered nick - you must auth to account %s or change your nick." },
+    { "NSMSG_RECLAIM_HOWTO", "To auth to account %s you must use /msg %s@%s AUTH %s <password>" },
     { "NSMSG_RECLAIM_KILL", "Unauthenticated user of nick." },
     { "NSMSG_RECLAIMED_NONE", "You cannot manually reclaim a nick." },
     { "NSMSG_RECLAIMED_WARN", "Sent a request for %s to change their nick." },
@@ -1124,7 +1127,7 @@ nickserv_register(struct userNode *user, struct userNode *settee, const char *ha
         send_message(user, nickserv, "NSMSG_REGISTER_H_SUCCESS");
       }
     }
-    else if ((ni = dict_find(nickserv_nick_dict, user->nick, NULL))) {
+    else if (user && (ni = dict_find(nickserv_nick_dict, user->nick, NULL))) {
       if(user) {
         send_message(user, nickserv, "NSMSG_PARTIAL_REGISTER");
       }
@@ -2120,6 +2123,8 @@ struct handle_info *loc_auth(char *handle, char *password, char *userhost)
 
 static NICKSERV_FUNC(cmd_auth)
 {
+    char *privv[MAXNUMPARAMS];
+    int privc, i;
     int pw_arg, used, maxlogins;
     struct handle_info *hi;
     const char *passwd;
@@ -2144,9 +2149,11 @@ static NICKSERV_FUNC(cmd_auth)
     if (argc == 3) {
         passwd = argv[2];
         handle = argv[1];
+        pw_arg = 2;
         hi = dict_find(nickserv_handle_dict, argv[1], NULL);
     } else if (argc == 2) {
         passwd = argv[1];
+        pw_arg = 1;
         if (nickserv_conf.disable_nicks) {
             hi = get_handle_info(user->nick);
         } else {
@@ -2318,11 +2325,25 @@ static NICKSERV_FUNC(cmd_auth)
         /* Auto Oper users with Opserv access -Life4Christ 8-10-2005  */
         if( nickserv_conf.auto_admin[0] && hi->opserv_level >= opserv_conf_admin_level())
         {
+            if (nickserv_conf.auto_admin_privs[0]) {
+                irc_raw_privs(user, nickserv_conf.auto_admin_privs);
+                privc = split_line(strdup(nickserv_conf.auto_admin_privs), false, MAXNUMPARAMS, privv);
+                for (i = 0; i < privc; i++) {
+                    client_modify_priv_by_name(user, privv[i], 1);
+                }
+            }
             irc_umode(user,nickserv_conf.auto_admin);
             reply("NSMSG_AUTO_OPER_ADMIN");
         }
         else if (nickserv_conf.auto_oper[0] && hi->opserv_level > 0)
         {
+            if (nickserv_conf.auto_oper_privs[0]) {
+                irc_raw_privs(user, nickserv_conf.auto_oper_privs);
+                privc = split_line(strdup(nickserv_conf.auto_oper_privs), false, MAXNUMPARAMS, privv);
+                for (i = 0; i < privc; i++) {
+                    client_modify_priv_by_name(user, privv[i], 1);
+                }
+            }
             irc_umode(user,nickserv_conf.auto_oper);
             reply("NSMSG_AUTO_OPER");
         }
@@ -4882,6 +4903,12 @@ nickserv_conf_read(void)
     str = database_get_data(conf_node, KEY_AUTO_ADMIN, RECDB_QSTRING);
     nickserv_conf.auto_admin = str ? str : "";
 
+    str = database_get_data(conf_node, KEY_AUTO_OPER_PRIVS, RECDB_QSTRING);
+    nickserv_conf.auto_oper_privs = str ? str : "";
+
+    str = database_get_data(conf_node, KEY_AUTO_ADMIN_PRIVS, RECDB_QSTRING);
+    nickserv_conf.auto_admin_privs = str ? str : "";
+
     str = conf_get_data("server/network", RECDB_QSTRING);
     nickserv_conf.network_name = str ? str : "some IRC network";
     if (!nickserv_conf.auth_policer_params) {
@@ -4978,6 +5005,7 @@ nickserv_reclaim(struct userNode *user, struct nick_info *ni, enum reclaim_actio
         break;
     case RECLAIM_WARN:
         send_message(user, nickserv, "NSMSG_RECLAIM_WARN", ni->nick, ni->owner->handle);
+        send_message(user, nickserv, "NSMSG_RECLAIM_HOWTO", ni->owner->handle, nickserv->nick, self->name, ni->owner->handle);
         break;
     case RECLAIM_SVSNICK:
         do {
@@ -5013,6 +5041,7 @@ check_user_nick(struct userNode *user) {
     }
     if (nickserv_conf.warn_nick_owned)
         send_message(user, nickserv, "NSMSG_RECLAIM_WARN", ni->nick, ni->owner->handle);
+        send_message(user, nickserv, "NSMSG_RECLAIM_HOWTO", ni->owner->handle, nickserv->nick, self->name, ni->owner->handle);
     if (nickserv_conf.auto_reclaim_action == RECLAIM_NONE)
         return 0;
     if (nickserv_conf.auto_reclaim_delay)