Просмотр исходного кода

* Ported [2429] to 1.2.9

svn: 2586
Bryan Drewery 20 лет назад
Родитель
Сommit
d246ad1367
2 измененных файлов с 39 добавлено и 23 удалено
  1. 1 0
      doc/UPDATES
  2. 38 23
      src/mod/irc.mod/chan.c

+ 1 - 0
doc/UPDATES

@@ -18,6 +18,7 @@ Lines prefixed with '-' were disabled before release and are not finished, or ar
 * Removed references to the old 'greet' features of eggdrop from help.
 * Fixed tempdir checking to attempt to 'mkdir ~/.ssh/' for '~/.ssh/...' tempdir.
 * Fixed bot link getting colors. (fixes #161)
+* Fixed +r bots resolving users by resolved ip before host.
 
 1.2.8
 * Fixed [bot]* cmds depending on case of botnicks.

+ 38 - 23
src/mod/irc.mod/chan.c

@@ -1656,18 +1656,6 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
   }
 */
 
-  /* Store the userhost */
-  if (!m->userhost[0])
-    simple_snprintf(m->userhost, sizeof(m->userhost), "%s@%s", user, host);
-  if (doresolv(chan)) {
-    if (is_dotted_ip(host))
-      simple_snprintf(m->userip, sizeof(m->userip), "%s@%s", user, host);
-    else
-      resolve_to_member(chan, nick, host);
-  }
-
-  simple_snprintf(userhost, sizeof(userhost), "%s!%s", nick, m->userhost);
-
   waschanop = me_op(chan);      /* Am I opped here? */
   if (strchr(flags, '@') != NULL)	/* Flags say he's opped? */
     m->flags |= (CHANOP | WASOP);	/* Yes, so flag in my table */
@@ -1684,6 +1672,12 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
   if (!(m->flags & (CHANVOICE | CHANOP)))
     m->flags |= STOPWHO;
 
+  /* Store the userhost */
+  if (!m->userhost[0])
+    simple_snprintf(m->userhost, sizeof(m->userhost), "%s@%s", user, host);
+
+  simple_snprintf(userhost, sizeof(userhost), "%s!%s", nick, m->userhost);
+
   if (me) {			/* Is it me? */
 //    strcpy(botuserhost, m->userhost);		/* Yes, save my own userhost */
     m->joined = now;				/* set this to keep the whining masses happy */
@@ -1698,6 +1692,15 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
     m->user = get_user_by_host(userhost);
     m->tried_getuser = 1;
   }
+
+  //userhost failed, let's try resolving them...
+  if (!m->user && doresolv(chan)) {
+    if (is_dotted_ip(host))
+      simple_snprintf(m->userip, sizeof(m->userip), "%s@%s", user, host);
+    else  
+      resolve_to_member(chan, nick, host);
+  }
+
   get_user_flagrec(m->user, &fr, chan->dname);
   
   if (me_op(chan)) {
@@ -2343,10 +2346,14 @@ static int gotjoin(char *from, char *chname)
       dprintf(DP_MODE, "PART %s\n", chname);
     }
   } else if (!channel_pending(chan)) {
+    char *host = NULL;
+
     chan->status &= ~CHAN_STOP_CYCLE;
     strcpy(uhost, from);
     nick = splitnick(&uhost);
     detect_chan_flood(nick, uhost, from, chan, FLOOD_JOIN, NULL);
+    if ((host = strchr(uhost, '@')))
+      host++;
 
     chan = findchan(chname);
     if (!chan) {   
@@ -2385,19 +2392,26 @@ static int gotjoin(char *from, char *chname)
           goto exit;
 
 	/* The tcl binding might have deleted the current user. Recheck. */
-	u = get_user_by_host(from);
+        if (!m->user) {
+          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); 
+          }
+        }
         splitjoin++;
 	m->split = 0;
 	m->last = now;
 	m->delay = 0L;
 	m->flags = (chan_hasop(m) ? WASOP : 0);
-	m->user = u;
-	set_handle_laston(chan->dname, u, now);
+	set_handle_laston(chan->dname, m->user, now);
 	m->flags |= STOPWHO;
         irc_log(chan, "%s returned from netsplit", m->nick);
       } else {
-        char *p = NULL;
-
 	if (m)
 	  killmember(chan, nick);
 	m = newmember(chan, nick);
@@ -2408,15 +2422,16 @@ static int gotjoin(char *from, char *chname)
 	m->delay = 0L;
 	strlcpy(m->nick, nick, sizeof(m->nick));
 	strlcpy(m->userhost, uhost, sizeof(m->userhost));
-        if (doresolv(chan) && (p = strchr(uhost, '@'))) {
-          p++;
-          if (is_dotted_ip(p))
+	m->user = u;
+        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, p); 
+            resolve_to_member(chan, nick, host); 
         }
-        
-	m->user = u;
+
 	m->flags |= STOPWHO;
 
 	/* The tcl binding might have deleted the current user and the