X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fnickserv.c;h=5da64a780a3291a57df60ac1684492d401cdaee7;hb=13698718d16cae97ed4df135fc20af386883b241;hp=8632fa8312d3cb8668cd76fb6a5863b452a26e95;hpb=7f7039bc6843a03327351267b75112f81b64277f;p=srvx.git diff --git a/src/nickserv.c b/src/nickserv.c index 8632fa8..5da64a7 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -48,6 +48,7 @@ #define KEY_VALID_NICK_REGEX "valid_nick_regex" #define KEY_DB_BACKUP_FREQ "db_backup_freq" #define KEY_MODOPER_LEVEL "modoper_level" +#define KEY_MODSTAFF_LEVEL "modstaff_level" #define KEY_SET_EPITHET_LEVEL "set_epithet_level" #define KEY_SET_TITLE_LEVEL "set_title_level" #define KEY_SET_FAKEHOST_LEVEL "set_fakehost_level" @@ -82,6 +83,7 @@ #define KEY_NICKS "nicks" #define KEY_MASKS "masks" #define KEY_OPSERV_LEVEL "opserv_level" +#define KEY_STAFF_LEVEL "staff_level" #define KEY_FLAGS "flags" #define KEY_REGISTER_ON "register" #define KEY_LAST_SEEN "lastseen" @@ -330,6 +332,7 @@ static const struct message_entry msgtab[] = { { "NSMSG_SET_MAXLOGINS", "$bMAXLOGINS: $b%d" }, { "NSMSG_SET_LANGUAGE", "$bLANGUAGE: $b%s" }, { "NSMSG_SET_LEVEL", "$bLEVEL: $b%d" }, + { "NSMSG_SET_STAFFLEVEL", "$bSTAFF_LEVEL: $b%d" }, { "NSMSG_SET_EPITHET", "$bEPITHET: $b%s" }, { "NSMSG_SET_TITLE", "$bTITLE: $b%s" }, { "NSMSG_SET_FAKEHOST", "$bFAKEHOST: $b%s" }, @@ -394,6 +397,7 @@ static struct { unsigned long handle_expire_delay; unsigned long nochan_handle_expire_delay; unsigned long modoper_level; + unsigned long modstaff_level; unsigned long set_epithet_level; unsigned long set_title_level; unsigned long set_fakehost_level; @@ -690,6 +694,23 @@ oper_has_access(struct userNode *user, struct userNode *bot, unsigned int min_le return 1; } +int +staff_has_access(struct userNode *user, struct userNode *bot, unsigned int min_level, unsigned int quiet) { + if (!user->handle_info) { + if (!quiet) + send_message(user, bot, "MSG_AUTHENTICATE"); + return 0; + } + + if (user->handle_info->staff_level < min_level) { + if (!quiet) + send_message(user, bot, "NSMSG_NO_ACCESS"); + return 0; + } + + return 1; +} + static int is_valid_handle(const char *handle) { @@ -1361,16 +1382,17 @@ static NICKSERV_FUNC(cmd_register) return 0; /* Add any masks they should get. */ if (nickserv_conf.default_hostmask) { - string_list_append(hi->masks, strdup("*@*")); + nickserv_addmask(NULL, hi, strdup("*@*")); } else { - string_list_append(hi->masks, generate_hostmask(user, GENMASK_OMITNICK|GENMASK_NO_HIDING|GENMASK_ANY_IDENT)); + nickserv_addmask(NULL, hi, generate_hostmask(user, GENMASK_OMITNICK|GENMASK_NO_HIDING|GENMASK_ANY_IDENT)); if (irc_in_addr_is_valid(user->ip) && !irc_pton(&ip, NULL, user->hostname)) - string_list_append(hi->masks, generate_hostmask(user, GENMASK_OMITNICK|GENMASK_BYIP|GENMASK_NO_HIDING|GENMASK_ANY_IDENT)); + nickserv_addmask(NULL, hi, generate_hostmask(user, GENMASK_OMITNICK|GENMASK_BYIP|GENMASK_NO_HIDING|GENMASK_ANY_IDENT)); } /* If they're the first to register, give them level 1000. */ if (dict_size(nickserv_handle_dict) == 1) { hi->opserv_level = 1000; + hi->staff_level = 1000; reply("NSMSG_ROOT_HANDLE", argv[1]); } @@ -1937,9 +1959,9 @@ static NICKSERV_FUNC(cmd_auth) cryptpass(passwd, hi->passwd); if (!hi->masks->used) { irc_in_addr_t ip; - string_list_append(hi->masks, generate_hostmask(user, GENMASK_OMITNICK|GENMASK_NO_HIDING|GENMASK_ANY_IDENT)); + nickserv_addmask(NULL, hi, generate_hostmask(user, GENMASK_OMITNICK|GENMASK_NO_HIDING|GENMASK_ANY_IDENT)); if (irc_in_addr_is_valid(user->ip) && irc_pton(&ip, NULL, user->hostname)) - string_list_append(hi->masks, generate_hostmask(user, GENMASK_OMITNICK|GENMASK_BYIP|GENMASK_NO_HIDING|GENMASK_ANY_IDENT)); + nickserv_addmask(NULL, hi, generate_hostmask(user, GENMASK_OMITNICK|GENMASK_BYIP|GENMASK_NO_HIDING|GENMASK_ANY_IDENT)); } authlog_add(hi, user, NULL); argv[pw_arg] = "****"; @@ -2020,7 +2042,7 @@ static MODCMD_FUNC(cmd_authlog) static MODCMD_FUNC(cmd_oauthlog) { struct handle_info *hi; - NICKSERV_MIN_PARMS(1); + NICKSERV_MIN_PARMS(2); if (!(hi = get_victim_oper(user, argv[1]))) return 0; @@ -2813,6 +2835,8 @@ static OPTION_FUNC(opt_password) cryptpass(argv[1], hi->passwd); send_message(user, nickserv, "NSMSG_SET_PASSWORD", "***"); + argv[1] = "****"; + return 1; } @@ -2945,6 +2969,24 @@ oper_try_set_access(struct userNode *user, struct userNode *bot, struct handle_i return 1; } +int +oper_try_set_staff_access(struct userNode *user, struct userNode *bot, struct handle_info *target, unsigned int new_level) { + if (!oper_has_access(user, bot, nickserv_conf.modstaff_level, 0)) + return 0; + if ((user->handle_info->opserv_level < target->opserv_level) + || ((user->handle_info->opserv_level == target->opserv_level) + && (user->handle_info->opserv_level < 1000))) { + send_message(user, bot, "MSG_USER_OUTRANKED", target->handle); + return 0; + } + if (target->staff_level == new_level) + return 0; + log_module(NS_LOG, LOG_INFO, "Account %s setting staff level for account %s to %d (from %d).", + user->handle_info->handle, target->handle, new_level, target->staff_level); + target->staff_level = new_level; + return 1; +} + static OPTION_FUNC(opt_level) { int res; @@ -2959,6 +3001,20 @@ static OPTION_FUNC(opt_level) return res; } +static OPTION_FUNC(opt_staff_level) +{ + int res; + + if (!override) { + send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]); + return 0; + } + + res = (argc > 1) ? oper_try_set_staff_access(user, nickserv, hi, strtoul(argv[1], NULL, 0)) : 0; + send_message(user, nickserv, "NSMSG_SET_STAFFLEVEL", hi->staff_level); + return res; +} + static OPTION_FUNC(opt_epithet) { if (!override) { @@ -3467,6 +3523,8 @@ nickserv_saxdb_write(struct saxdb_context *ctx) { } if (hi->opserv_level) saxdb_write_int(ctx, KEY_OPSERV_LEVEL, hi->opserv_level); + if (hi->staff_level) + saxdb_write_int(ctx, KEY_STAFF_LEVEL, hi->staff_level); if (hi->language != lang_C) saxdb_write_string(ctx, KEY_LANGUAGE, hi->language->name); saxdb_write_string(ctx, KEY_PASSWD, hi->passwd); @@ -3611,6 +3669,10 @@ static NICKSERV_FUNC(cmd_merge) if (hi_from->opserv_level > hi_to->opserv_level) hi_to->opserv_level = hi_from->opserv_level; + /* Do they get a staff level promotion? */ + if (hi_from->staff_level > hi_to->staff_level) + hi_to->staff_level = hi_from->staff_level; + /* What about last seen time? */ if (hi_from->lastseen > hi_to->lastseen) hi_to->lastseen = hi_from->lastseen; @@ -4192,6 +4254,8 @@ nickserv_db_read_authlog(UNUSED_ARG(const char *key), void *data, void *extra) str = database_get_data(rd->d.object, KEY_AUTHLOG_QUIT_REASON, RECDB_QSTRING); authlog->quit_reason = str ? strdup(str) : NULL; + authlog->user = NULL; + authlog->next = NULL; //append it to the end of the list... @@ -4255,6 +4319,8 @@ nickserv_db_read_handle(const char *handle, dict_t obj) hi->language = language_find(str ? str : "C"); str = database_get_data(obj, KEY_OPSERV_LEVEL, RECDB_QSTRING); hi->opserv_level = str ? strtoul(str, NULL, 0) : 0; + str = database_get_data(obj, KEY_STAFF_LEVEL, RECDB_QSTRING); + hi->staff_level = str ? strtoul(str, NULL, 0) : 0; str = database_get_data(obj, KEY_INFO, RECDB_QSTRING); if (str) hi->infoline = strdup(str); @@ -4543,6 +4609,8 @@ nickserv_conf_read(void) nickserv_conf.db_backup_frequency = str ? ParseInterval(str) : 7200; str = database_get_data(conf_node, KEY_MODOPER_LEVEL, RECDB_QSTRING); nickserv_conf.modoper_level = str ? strtoul(str, NULL, 0) : 900; + str = database_get_data(conf_node, KEY_MODSTAFF_LEVEL, RECDB_QSTRING); + nickserv_conf.modstaff_level = str ? strtoul(str, NULL, 0) : 800; str = database_get_data(conf_node, KEY_SET_EPITHET_LEVEL, RECDB_QSTRING); nickserv_conf.set_epithet_level = str ? strtoul(str, NULL, 0) : 1; str = database_get_data(conf_node, KEY_SET_TITLE_LEVEL, RECDB_QSTRING); @@ -4700,19 +4768,18 @@ check_user_nick(struct userNode *user) { //check if this user is a pending LOC user if(pendingLOCUsers) { struct pendingLOCUser *pending, *next, *prev = NULL; + int remove; for(pending = pendingLOCUsers; pending; pending = next) { next = pending->next; + remove = 0; if(user->handle_info == pending->handle_info) { pending->authlog->user = user; free((char*) pending->authlog->hostmask); pending->authlog->hostmask = generate_hostmask(user, GENMASK_USENICK|GENMASK_STRICT_IDENT|GENMASK_NO_HIDING|GENMASK_STRICT_HOST); - if(prev) - prev->next = next; - else - pendingLOCUsers = next; - free(pending); - } - if(now - pending->time > 10) { + remove = 1; + } else if(now - pending->time > 10) + remove = 1; + if(remove) { if(prev) prev->next = next; else @@ -4944,6 +5011,8 @@ init_nickserv(const char *nick) dict_insert(nickserv_opt_dict, "DEVNULL", opt_devnull); dict_insert(nickserv_opt_dict, "ACCESS", opt_level); dict_insert(nickserv_opt_dict, "LEVEL", opt_level); + dict_insert(nickserv_opt_dict, "STAFF", opt_staff_level); + dict_insert(nickserv_opt_dict, "STAFF_LEVEL", opt_staff_level); dict_insert(nickserv_opt_dict, "EPITHET", opt_epithet); if (titlehost_suffix) { dict_insert(nickserv_opt_dict, "TITLE", opt_title);