Sfoglia il codice sorgente

Merge branch 'resolv-cleanup'

* resolv-cleanup:
  * Add comment regarding future work
  * Add comment regarding future work
  * Act on successfully looking up a user's IP
  * Trigger resolver in cmd_channel
  * Lookup user ips every minute until all users have ips
  * When a new member joins, add their ip to m->userip if it is an ip. Otherwise, if +r, resolve their hostname
  * Populate userip if the host is an ip, even if the bot is not +r
  * Always resolve members if bot is +r, even if their user has successfully been looked up
  * Don't check for doresolv() if just looking up an ip. m->userip could still be set from WHOX

Conflicts:
	doc/UPDATES
Bryan Drewery 17 anni fa
parent
commit
f005953520

+ 1 - 0
doc/UPDATES

@@ -11,6 +11,7 @@
 * Give localhubs credit for adding their child bots in 'whois'
 * New userfile pass algorithm (salted-sha1)
 * New userfile cmdpass algorithm (salted-sha1)
+* Cleanup +r implementation a bit to lookup users more often than only on join.
 
 1.2.16 - http://wraith.botpack.net/milestone/1.2.16
 * Add 'set altchars' so that alternative characters used for nicks can be changed. (fixes #418)

+ 22 - 20
src/mod/irc.mod/chan.c

@@ -64,6 +64,10 @@ static void resolv_member_callback(int id, void *client_data, const char *host,
             if (!m->user) {
               simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
               m->user = get_user_by_host(s);
+
+              /* Act on this lookup */
+              if (m->user)
+                check_this_user(m->user->handle, 0, NULL);
             }
             return;
           }
@@ -224,7 +228,7 @@ void priority_do(struct chanset_t * chan, bool opsonly, int action)
 
       simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
       m->user = get_user_by_host(s);
-      if (!m->user && doresolv(chan) && m->userip[0]) {
+      if (!m->user && m->userip[0]) {
         simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
         m->user = get_user_by_host(s);
       }
@@ -1338,7 +1342,7 @@ void recheck_channel(struct chanset_t *chan, int dobans)
     if (!m->user && !m->tried_getuser) {
            m->tried_getuser = 1;
            m->user = get_user_by_host(s);
-           if (!m->user && doresolv(chan) && m->userip[0]) {
+           if (!m->user && m->userip[0]) {
              simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
              m->user = get_user_by_host(s);
            }
@@ -1749,8 +1753,12 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
   if (!m->userhost[0])
     simple_snprintf(m->userhost, sizeof(m->userhost), "%s@%s", user, host);
 
-  if (!m->userip[0] && ip)
-    simple_snprintf(m->userip, sizeof(m->userip), "%s@%s", user, ip);
+  if (!m->userip[0]) {
+    if (ip)
+      simple_snprintf(m->userip, sizeof(m->userip), "%s@%s", user, ip);
+    else if (is_dotted_ip(host))
+      simple_snprintf(m->userip, sizeof(m->userip), "%s@%s", user, host);
+  }
 
   simple_snprintf(userhost, sizeof(userhost), "%s!%s", nick, m->userhost);
 
@@ -1767,13 +1775,9 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
     m->tried_getuser = 1;
   }
 
-  //userhost failed, let's try resolving them...
-  if (!m->user && !ip && doresolv(chan)) { /* !ip.. already checked for user earlier if set */
-    if (is_dotted_ip(host))
-      simple_snprintf(m->userip, sizeof(m->userip), "%s@%s", user, host);
-    else  
-      resolve_to_member(chan, nick, host);
-  }
+  //This bot is set +r, so resolve.
+  if (!m->userip[0] && doresolv(chan))
+    resolve_to_member(chan, nick, host);
 
   get_user_flagrec(m->user, &fr, chan->dname, chan);
   
@@ -2466,11 +2470,11 @@ static int gotjoin(char *from, char *chname)
           m->user = get_user_by_host(from);
           m->tried_getuser = 1;
  
-          if (!m->user && doresolv(chan)) {
-            if (is_dotted_ip(host)) 
+          if (!m->user && !m->userip[0] && doresolv(chan)) {
+            if (is_dotted_ip(host))
               strlcpy(m->userip, uhost, sizeof(m->userip));
             else
-              resolve_to_member(chan, nick, host); 
+              resolve_to_member(chan, nick, host);
           }
         }
       } else {
@@ -2483,15 +2487,13 @@ static int gotjoin(char *from, char *chname)
 	m->last = now;
 	m->delay = 0L;
 	strlcpy(m->userhost, uhost, sizeof(m->userhost));
+        if (is_dotted_ip(host))
+          strlcpy(m->userip, uhost, sizeof(m->userip));
         m->user = get_user_by_host(from);
         m->tried_getuser = 1;
 
-        if (!m->user && doresolv(chan)) {
-          if (is_dotted_ip(host)) 
-            strlcpy(m->userip, uhost, sizeof(m->userip));
-          else
-            resolve_to_member(chan, nick, host); 
-        }
+        if (!m->userip[0] && doresolv(chan))
+          resolve_to_member(chan, nick, host);
 
 //	m->flags |= STOPWHO;
 

+ 14 - 3
src/mod/irc.mod/cmdsirc.c

@@ -1242,7 +1242,7 @@ static void cmd_mop(int idx, char *par)
         if (!m->user) {
           simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
           m->user = get_user_by_host(s);
-          if (!m->user && doresolv(chan) && m->userip[0]) {
+          if (!m->user && m->userip[0]) {
             simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
             m->user = get_user_by_host(s);
           }
@@ -1308,7 +1308,7 @@ static void cmd_find(int idx, char *par)
         simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
         if (!m->user && !m->tried_getuser) {
           m->user = get_user_by_host(s);
-          if (!m->user && doresolv(chan) && m->userip[0]) {
+          if (!m->user && m->userip[0]) {
             simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
             m->user = get_user_by_host(s);
           }
@@ -1503,10 +1503,21 @@ static void cmd_channel(int idx, char *par)
       if (m->user == NULL) {
 	simple_snprintf(s1, sizeof s1, "%s!%s", m->nick, m->userhost);
 	m->user = get_user_by_host(s1);
-        if (!m->user && doresolv(chan) && m->userip[0]) {
+        if (!m->user && m->userip[0]) {
           simple_snprintf(s1, sizeof(s1), "%s!%s", m->nick, m->userip);
           m->user = get_user_by_host(s1);
         }
+
+        if (!m->userip[0] && doresolv(chan)) {
+          char host[UHOSTLEN] = "", *p = NULL;
+          p = strchr(m->userhost, '@');
+          if (p) {
+            ++p;
+            strlcpy(host, p, strlen(m->userhost) - (p - host));
+            resolve_to_member(chan, m->nick, host);
+          }
+        }
+
         m->tried_getuser = 1;
       }
       if (m->user == NULL)

+ 12 - 1
src/mod/irc.mod/irc.c

@@ -1475,13 +1475,24 @@ check_expired_chanstuff(struct chanset_t *chan)
         continue;
       }
 
+      //This bot is set +r, so resolve.
+      if (!m->userip[0] && doresolv(chan)) {
+        char host[UHOSTLEN] = "", *p = NULL;
+        p = strchr(m->userhost, '@');
+        if (p) {
+          ++p;
+          strlcpy(host, p, strlen(m->userhost) - (p - host));
+          resolve_to_member(chan, m->nick, host);
+        }
+      }
+
       if (me_op(chan)) {
         if (dovoice(chan) && !loading) {      /* autovoice of +v users if bot is +y */
           if (!chan_hasop(m) && !chan_hasvoice(m)) {
             if (!m->user && !m->tried_getuser) {
               simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
               m->user = get_user_by_host(s);
-              if (!m->user && doresolv(chan) && m->userip[0]) {
+              if (!m->user && m->userip[0]) {
                 simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
                 m->user = get_user_by_host(s);
               }

+ 1 - 1
src/mod/irc.mod/mode.c

@@ -935,7 +935,7 @@ static memberlist *assert_ismember(struct chanset_t *chan, const char *nick)
 
       simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
       m->user = get_user_by_host(s);
-      if (!m->user && doresolv(chan) && m->userip[0]) {
+      if (!m->user && m->userip[0]) {
         simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
         m->user = get_user_by_host(s);
       }

+ 2 - 0
src/mod/server.mod/servmsg.c

@@ -1311,6 +1311,8 @@ static int got311(char *from, char *msg)
 
   irc_whois(nick, "$b%s$b [%s@%s]", nick, username, address);
 
+  // FIXME: This should incorporate userip and member/client lookups - and should ACT on discovering a user.
+  // FIXME: This should also use whois_actually to cache userip
   simple_snprintf(uhost, sizeof uhost, "%s!%s@%s", nick, username, address);
   if ((u = get_user_by_host(uhost))) {
     int idx = 0;