Support sending and receiving account timestamps (but ignore them for now).
authorMichael Poole <mdpoole@troilus.org>
Wed, 9 Jul 2008 03:01:19 +0000 (23:01 -0400)
committerMichael Poole <mdpoole@troilus.org>
Wed, 9 Jul 2008 03:01:19 +0000 (23:01 -0400)
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
src/hash.h
src/nickserv.c
src/nickserv.h
src/proto-bahamut.c
src/proto-p10.c
src/proto.h

index c5aa49e0655b65c3c7f0c4b7ef724f3853146226..a7aa6a0e1a1df7483becda04e00d19a5bd734cc4 100644 (file)
@@ -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;
 }
 
index e02e0aeeb1860e5d5058a913cb25b666174b1efd..a1a2c9194d6bf57257764a1b6de4067bd0f8e1b0 100644 (file)
@@ -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);
index 9ab83c80d7f67702153cd9100580ffc55a9d129e..180fea8a5c3e0f48655c73f6be6dabb96de23ca6 100644 (file)
@@ -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);
     }
 }
 
index 5054de3effafdba37488262ddeb962ff2cc0cc85..3311c9083d6c941365d6c948c7b6150730af751e 100644 (file)
@@ -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;
index 7f8e25fbe921c1810b02458110f86ea17f7e4e89..790010ecfa6b2ec7f354defb12d589c70a0a7323 100644 (file)
@@ -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<nuf_used; nn++) {
         if (nuf_list[nn](uNode)) break;
@@ -259,12 +259,12 @@ irc_user(struct userNode *user) {
 }
 
 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);
     }
 }
 
@@ -805,16 +805,14 @@ static CMD_FUNC(cmd_nick) {
         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;
 }
index 8105b8bf543ccbb1a53184cbf5187a2911b1d8a4..dfe23563b2e2cf34ba4b4db00c7c0534f9877004 100644 (file)
@@ -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':
index cfee7c5e2a65d361a4065a1e2ab821268a5b0c20..3ee7cb58faa607dcb48b5c7ee7a8ce13acc6cba1 100644 (file)
@@ -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);