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.
}
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
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. */
}
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
return;
#endif
- irc_account(user, stamp);
+ irc_account(user, stamp, timestamp, serial);
user->modes |= FLAGS_STAMPED;
}
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);
}
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
{
id = 0;
}
} while(!id);
-#endif
hi = calloc(1, sizeof(*hi));
hi->userlist_style = HI_DEFAULT_STYLE;
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;
}
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);
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) {
}
}
}
- StampUser(user, id);
+ StampUser(user, hi->handle, hi->registered, hi->id);
}
if ((ni = get_nick_info(user->nick)) && (ni->owner == hi))
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));
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");
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;
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])
struct handle_info *hi;
struct userNode *authed_users;
struct userData *channels;
- unsigned long int id;
+ unsigned long id;
unsigned int ii;
dict_t subdb;
}
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)) {
}
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);
}
}
char *infoline;
char *handle;
char *fakehost;
-#ifdef WITH_PROTOCOL_BAHAMUT
unsigned long id;
-#endif
unsigned long registered;
unsigned long lastseen;
int karma;
}
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;
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<nuf_used; nn++) {
if (nuf_list[nn](uNode)) break;
}
void
-irc_account(struct userNode *user, const char *stamp)
+irc_account(struct userNode *user, UNUSED_ARG(const char *stamp), UNUSED_ARG(unsigned long timestamp), unsigned long serial)
{
if (IsReggedNick(user)) {
- irc_svsmode(user, "+rd", base64toint(stamp, IDLEN));
+ irc_svsmode(user, "+rd", serial);
} else {
- irc_svsmode(user, "+d", base64toint(stamp, IDLEN));
+ irc_svsmode(user, "+d", serial);
}
}
NickChange(un, argv[1], 1);
} else {
/* new nick from a server */
- char id[8];
unsigned long stamp;
irc_in_addr_t ip;
if (argc < 10) return 0;
stamp = strtoul(argv[8], NULL, 0);
- if (stamp) inttobase64(id, stamp, IDLEN);
if (argc > 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;
}
}
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
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;
}
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':
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);