From 9c42eaa12d25e68bab6d4de14eb5fee5fa4a0a70 Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Tue, 8 Jul 2008 23:01:19 -0400 Subject: [PATCH] Support sending and receiving account timestamps (but ignore them for now). src/hash.h (account_func_t): Add timestamp and serial ID fields. (call_account_func): Likewise. (StampUser): Likewise. src/hash.c (call_account_func): Pass them through to account_func. (StampUser): Pass them through to irc_account. src/nickserv.h (handle_info::id): Make this field unconditional. src/nickserv.c (register_handle): Make the ID assignment unconditional. (free_handle_info): Make the ID handling here unconditional. (set_user_handle_info): Pass all the ID fields to StampUser(). (cmd_handleinfo): Move NSMSG_HANDLEINFO_ID to be staff only. (nickserv_saxdb_write): Make the ID assertion and write unconditional. (nickserv_db_read_handle): Remove redundant "int". (handle_account): Use account name preferentially, fall back to ID. src/proto.h (irc_account): Add timestamp and serial number parameters. src/proto-bahamut.c (AddUser): Make stamp parameter unsigned long. Pass it appropriately to call_account_func(). (irc_account): Add timestamp and serial number parameters; use serial number in place of a base64-decoded stamp. src/proto-p10.c (irc_account): Send timestamp and serial number for user. (cmd_account): Parse them when they are present. (mod_usermode): Likewise. --- src/hash.c | 8 +++---- src/hash.h | 6 ++--- src/nickserv.c | 53 +++++++++++++++------------------------------ src/nickserv.h | 2 -- src/proto-bahamut.c | 14 +++++------- src/proto-p10.c | 30 ++++++++++++++++++++----- src/proto.h | 2 +- 7 files changed, 55 insertions(+), 60 deletions(-) diff --git a/src/hash.c b/src/hash.c index c5aa49e..a7aa6a0 100644 --- a/src/hash.c +++ b/src/hash.c @@ -219,7 +219,7 @@ reg_account_func(account_func_t handler) } void -call_account_func(struct userNode *user, const char *stamp) +call_account_func(struct userNode *user, const char *stamp, unsigned long timestamp, unsigned long serial) { /* We've received an account stamp for a user; notify NickServ, which registers the sole account_func @@ -228,7 +228,7 @@ call_account_func(struct userNode *user, const char *stamp) P10 Protocol violation if (user->modes & FLAGS_STAMPED) here. */ if (account_func) - account_func(user, stamp); + account_func(user, stamp, timestamp, serial); #ifdef WITH_PROTOCOL_P10 /* Mark the user so we don't stamp it again. */ @@ -237,7 +237,7 @@ call_account_func(struct userNode *user, const char *stamp) } void -StampUser(struct userNode *user, const char *stamp) +StampUser(struct userNode *user, const char *stamp, unsigned long timestamp, unsigned long serial) { #ifdef WITH_PROTOCOL_P10 /* The P10 protocol says we can't stamp users who already @@ -246,7 +246,7 @@ StampUser(struct userNode *user, const char *stamp) return; #endif - irc_account(user, stamp); + irc_account(user, stamp, timestamp, serial); user->modes |= FLAGS_STAMPED; } diff --git a/src/hash.h b/src/hash.h index e02e0ae..a1a2c91 100644 --- a/src/hash.h +++ b/src/hash.h @@ -215,10 +215,10 @@ typedef void (*nick_change_func_t)(struct userNode *user, const char *old_nick); void reg_nick_change_func(nick_change_func_t handler); void NickChange(struct userNode* user, const char *new_nick, int no_announce); -typedef void (*account_func_t) (struct userNode *user, const char *stamp); +typedef void (*account_func_t) (struct userNode *user, const char *stamp, unsigned long timestamp, unsigned long serial); void reg_account_func(account_func_t handler); -void call_account_func(struct userNode *user, const char *stamp); -void StampUser(struct userNode *user, const char *stamp); +void call_account_func(struct userNode *user, const char *stamp, unsigned long timestamp, unsigned long serial); +void StampUser(struct userNode *user, const char *stamp, unsigned long timestamp, unsigned long serial); void assign_fakehost(struct userNode *user, const char *host, int announce); typedef void (*new_channel_func_t) (struct chanNode *chan); diff --git a/src/nickserv.c b/src/nickserv.c index 9ab83c8..180fea8 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -409,11 +409,10 @@ canonicalize_hostmask(char *mask) } static struct handle_info * -register_handle(const char *handle, const char *passwd, UNUSED_ARG(unsigned long id)) +register_handle(const char *handle, const char *passwd, unsigned long id) { struct handle_info *hi; -#ifdef WITH_PROTOCOL_BAHAMUT char id_base64[IDLEN + 1]; do { @@ -437,7 +436,6 @@ register_handle(const char *handle, const char *passwd, UNUSED_ARG(unsigned long id = 0; } } while(!id); -#endif hi = calloc(1, sizeof(*hi)); hi->userlist_style = HI_DEFAULT_STYLE; @@ -446,10 +444,8 @@ register_handle(const char *handle, const char *passwd, UNUSED_ARG(unsigned long hi->infoline = NULL; dict_insert(nickserv_handle_dict, hi->handle, hi); -#ifdef WITH_PROTOCOL_BAHAMUT hi->id = id; dict_insert(nickserv_id_dict, strdup(id_base64), hi); -#endif return hi; } @@ -522,13 +518,10 @@ static void free_handle_info(void *vhi) { struct handle_info *hi = vhi; - -#ifdef WITH_PROTOCOL_BAHAMUT char id[IDLEN + 1]; inttobase64(id, hi->id, IDLEN); dict_remove(nickserv_id_dict, id); -#endif free_string_list(hi->masks); assert(!hi->users); @@ -956,16 +949,6 @@ set_user_handle_info(struct userNode *user, struct handle_info *hi, int stamp) apply_fakehost(hi); if (stamp) { -#ifdef WITH_PROTOCOL_BAHAMUT - /* Stamp users with their account ID. */ - char id[IDLEN + 1]; - inttobase64(id, hi->id, IDLEN); -#elif WITH_PROTOCOL_P10 - /* Stamp users with their account name. */ - char *id = hi->handle; -#else - const char *id = "???"; -#endif if (!nickserv_conf.disable_nicks) { struct nick_info *ni; for (ni = hi->nicks; ni; ni = ni->next) { @@ -975,7 +958,7 @@ set_user_handle_info(struct userNode *user, struct handle_info *hi, int stamp) } } } - StampUser(user, id); + StampUser(user, hi->handle, hi->registered, hi->id); } if ((ni = get_nick_info(user->nick)) && (ni->owner == hi)) @@ -1331,9 +1314,6 @@ static NICKSERV_FUNC(cmd_handleinfo) nsmsg_none = handle_find_message(hi, "MSG_NONE"); reply("NSMSG_HANDLEINFO_ON", hi->handle); -#ifdef WITH_PROTOCOL_BAHAMUT - reply("NSMSG_HANDLEINFO_ID", hi->id); -#endif feh = hi->registered; reply("NSMSG_HANDLEINFO_REGGED", ctime(&feh)); @@ -1375,6 +1355,9 @@ static NICKSERV_FUNC(cmd_handleinfo) reply(type); } + if (oper_has_access(user, cmd->parent->bot, 601, 1)) + reply("NSMSG_HANDLEINFO_ID", hi->id); + if (oper_has_access(user, cmd->parent->bot, 0, 1) || IsStaff(user)) { if (!hi->notes) { reply("NSMSG_HANDLEINFO_NO_NOTES"); @@ -2879,9 +2862,7 @@ nickserv_saxdb_write(struct saxdb_context *ctx) { for (it = dict_first(nickserv_handle_dict); it; it = iter_next(it)) { hi = iter_data(it); -#ifdef WITH_PROTOCOL_BAHAMUT - assert(hi->id); -#endif + assert(hi->id != 0); saxdb_start_record(ctx, iter_key(it), 0); if (hi->cookie) { struct handle_cookie *cookie = hi->cookie; @@ -2934,9 +2915,7 @@ nickserv_saxdb_write(struct saxdb_context *ctx) { flags[flen] = 0; saxdb_write_string(ctx, KEY_FLAGS, flags); } -#ifdef WITH_PROTOCOL_BAHAMUT saxdb_write_int(ctx, KEY_ID, hi->id); -#endif if (hi->infoline) saxdb_write_string(ctx, KEY_INFO, hi->infoline); if (hi->last_quit_host[0]) @@ -3505,7 +3484,7 @@ nickserv_db_read_handle(const char *handle, dict_t obj) struct handle_info *hi; struct userNode *authed_users; struct userData *channels; - unsigned long int id; + unsigned long id; unsigned int ii; dict_t subdb; @@ -3991,15 +3970,17 @@ handle_new_user(struct userNode *user) } void -handle_account(struct userNode *user, const char *stamp) +handle_account(struct userNode *user, const char *stamp, unsigned long timestamp, unsigned long serial) { - struct handle_info *hi; + struct handle_info *hi = NULL; -#ifdef WITH_PROTOCOL_P10 - hi = dict_find(nickserv_handle_dict, stamp, NULL); -#else - hi = dict_find(nickserv_id_dict, stamp, NULL); -#endif + if (stamp != NULL) + hi = dict_find(nickserv_handle_dict, stamp, NULL); + if ((hi == NULL) && (serial != 0)) { + char id[IDLEN + 1]; + inttobase64(id, serial, IDLEN); + hi = dict_find(nickserv_id_dict, id, NULL); + } if (hi) { if (HANDLE_FLAGGED(hi, SUSPENDED)) { @@ -4007,7 +3988,7 @@ handle_account(struct userNode *user, const char *stamp) } set_user_handle_info(user, hi, 0); } else { - log_module(MAIN_LOG, LOG_WARNING, "%s had unknown account stamp %s.", user->nick, stamp); + log_module(MAIN_LOG, LOG_WARNING, "%s had unknown account stamp %s:%lu:%lu.", user->nick, stamp, timestamp, serial); } } diff --git a/src/nickserv.h b/src/nickserv.h index 5054de3..3311c90 100644 --- a/src/nickserv.h +++ b/src/nickserv.h @@ -97,9 +97,7 @@ struct handle_info { char *infoline; char *handle; char *fakehost; -#ifdef WITH_PROTOCOL_BAHAMUT unsigned long id; -#endif unsigned long registered; unsigned long lastseen; int karma; diff --git a/src/proto-bahamut.c b/src/proto-bahamut.c index 7f8e25f..790010e 100644 --- a/src/proto-bahamut.c +++ b/src/proto-bahamut.c @@ -112,7 +112,7 @@ is_valid_nick(const char *nick) { } struct userNode * -AddUser(struct server* uplink, const char *nick, const char *ident, const char *hostname, const char *modes, const char *userinfo, unsigned long timestamp, irc_in_addr_t realip, const char *stamp) { +AddUser(struct server* uplink, const char *nick, const char *ident, const char *hostname, const char *modes, const char *userinfo, unsigned long timestamp, irc_in_addr_t realip, unsigned long stamp) { struct userNode *uNode, *oldUser; unsigned int nn, dummy; @@ -166,7 +166,7 @@ AddUser(struct server* uplink, const char *nick, const char *ident, const char * mod_usermode(uNode, modes); if (dummy) uNode->modes |= FLAGS_DUMMY; - if (stamp) call_account_func(uNode, stamp); + if (stamp) call_account_func(uNode, NULL, 0, stamp); if (IsLocal(uNode)) irc_user(uNode); for (nn=0; nn 10) ip.in6_32[3] = htonl(atoi(argv[9])); - un = AddUser(GetServerH(argv[7]), argv[1], argv[5], argv[6], argv[4], argv[argc-1], atoi(argv[3]), ip, (stamp ? id : 0)); + un = AddUser(GetServerH(argv[7]), argv[1], argv[5], argv[6], argv[4], argv[argc-1], atoi(argv[3]), ip, stamp); } return 1; } diff --git a/src/proto-p10.c b/src/proto-p10.c index 8105b8b..dfe2356 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -493,9 +493,9 @@ irc_user(struct userNode *user) } void -irc_account(struct userNode *user, const char *stamp) +irc_account(struct userNode *user, const char *stamp, unsigned long timestamp, unsigned long serial) { - putsock("%s " P10_ACCOUNT " %s %s", self->numeric, user->numeric, stamp); + putsock("%s " P10_ACCOUNT " %s %s %lu %lu", self->numeric, user->numeric, stamp, timestamp, serial); } void @@ -1186,13 +1186,19 @@ static CMD_FUNC(cmd_nick) static CMD_FUNC(cmd_account) { struct userNode *user; + unsigned long timestamp = 0; + unsigned long serial = 0; if ((argc < 3) || !origin || !GetServerH(origin)) return 0; /* Origin must be server. */ user = GetUserN(argv[1]); if (!user) return 1; /* A QUIT probably passed the ACCOUNT. */ - call_account_func(user, argv[2]); + if (argc > 3) + timestamp = strtoul(argv[3], NULL, 10); + if (argc > 4) + serial = strtoul(argv[4], NULL, 10); + call_account_func(user, argv[2], timestamp, serial); return 1; } @@ -2239,13 +2245,25 @@ void mod_usermode(struct userNode *user, const char *mode_change) { case 'r': if (*word) { char tag[MAXLEN]; + char *sep; unsigned int ii; - for (ii=0; (*word != ' ') && (*word != '\0'); ) + unsigned long ts = 0; + unsigned long id = 0; + + for (ii=0; (*word != ' ') && (*word != '\0') && (*word != ':'); ) tag[ii++] = *word++; - tag[ii] = 0; + if (*word == ':') { + ts = strtoul(word + 1, &sep, 10); + if (*sep == ':') { + id = strtoul(word + 1, &sep, 10); + } else if (*sep != ' ' && *sep != '\0') { + ts = 0; + } + } + tag[ii] = '\0'; while (*word == ' ') word++; - call_account_func(user, tag); + call_account_func(user, tag, ts, id); } break; case 'f': diff --git a/src/proto.h b/src/proto.h index cfee7c5..3ee7cb5 100644 --- a/src/proto.h +++ b/src/proto.h @@ -144,7 +144,7 @@ void irc_stats(struct userNode *from, struct server *target, char type); void irc_svsnick(struct userNode *from, struct userNode *target, const char *newnick); /* account maintenance */ -void irc_account(struct userNode *user, const char *stamp); +void irc_account(struct userNode *user, const char *stamp, unsigned long timestamp, unsigned long serial); void irc_regnick(struct userNode *user); void irc_fakehost(struct userNode *user, const char *host); -- 2.20.1