X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/e7fe88409f717e491eba6fe1912325758e8feefa..0ad6b4a5d4f166d5f16f9d849f495868458e1578:/src/nickserv.c diff --git a/src/nickserv.c b/src/nickserv.c index 6f8e3cc..7c28c0d 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -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" @@ -139,7 +141,7 @@ #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 " }, { "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)