浏览代码

* Completed some missing code for '+r' (#127)

svn: 2304
Bryan Drewery 21 年之前
父节点
当前提交
6bc5b6a696
共有 5 个文件被更改,包括 36 次插入4 次删除
  1. 1 1
      doc/UPDATES
  2. 13 3
      src/mod/irc.mod/chan.c
  3. 13 0
      src/mod/irc.mod/cmdsirc.c
  4. 4 0
      src/mod/irc.mod/irc.c
  5. 5 0
      src/mod/irc.mod/mode.c

+ 1 - 1
doc/UPDATES

@@ -50,7 +50,7 @@ Lines prefixed with '-' were disabled before release and are not finished, or ar
 * Fixed typo for 'help nopass'
 * Added CIDR/mask matching support for all user hosts, ie, '.+host user *!jerry@1.2.0.0/16' will match 'bob!jerry@1.2.3.4'
 * Balanced out mdop/mop kicks to not make entire net flood off.
-* Added flag '+r' which will make a bot resolve all hosts it sees to match against userlist. (You should only set this per-chan)
+* Added flag '+r' which will make a bot resolve all hosts it sees to match against userlist. (You should only set this per-chan) (#127)
 
 1.2.4
 * Fixed cmd_botset not displaying botnick.

+ 13 - 3
src/mod/irc.mod/chan.c

@@ -28,7 +28,7 @@ static void resolv_member_callback(int id, void *client_data, const char *host,
     return;
 
   memberlist *m = NULL;
-  char *ps = NULL, *pe = NULL;
+  char *ps = NULL, *pe = NULL, s[UHOSTLEN + 1];
 
   if (ips && ips[0]) {
     for (m = r->chan->channel.member; m && m->nick[0]; m = m->next) {
@@ -41,6 +41,10 @@ static void resolv_member_callback(int id, void *client_data, const char *host,
 
             simple_snprintf(user, pe - ps + 1, m->userhost);
             simple_snprintf(m->userip, sizeof(m->userip), "%s@%s", user, ips[0]);
+            if (!m->user) {
+              simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
+              m->user = get_user_by_host(s);
+            }
             return;
           }
         }
@@ -198,6 +202,10 @@ void priority_do(struct chanset_t * chan, bool opsonly, int action)
 
       simple_sprintf(s, "%s!%s", m->nick, m->userhost);
       m->user = get_user_by_host(s);
+      if (!m->user && doresolv(chan) && m->userip[0]) {
+        simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
+        m->user = get_user_by_host(s);
+      }
       m->tried_getuser = 1;
     }
 
@@ -1302,6 +1310,10 @@ 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]) {
+             simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
+             m->user = get_user_by_host(s);
+           }
     }
     get_user_flagrec(m->user, &fr, chan->dname);
     if (glob_bot(fr) && chan_hasop(m) && !match_my_nick(m->nick))
@@ -1343,8 +1355,6 @@ void recheck_channel(struct chanset_t *chan, int dobans)
 static int got302(char *from, char *msg)
 {
   char *p = NULL, *nick = NULL, *uhost = NULL;
-  struct chanset_t *chan = NULL;
-  memberlist *m = NULL;
 
 #ifdef CACHE
   cache_t *cache = NULL;

+ 13 - 0
src/mod/irc.mod/cmdsirc.c

@@ -1067,6 +1067,10 @@ static void cmd_mop(int idx, char *par)
         if (!m->user) {
           sprintf(s, "%s!%s", m->nick, m->userhost);
           m->user = get_user_by_host(s);
+          if (!m->user && doresolv(chan) && m->userip[0]) {
+            simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
+            m->user = get_user_by_host(s);
+          }
         }
         if (m->user && u_pass_match(m->user, "-"))
           continue;		/* dont op users without a pass */
@@ -1129,6 +1133,10 @@ static void cmd_find(int idx, char *par)
         sprintf(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]) {
+            simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
+            m->user = get_user_by_host(s);
+          }
           m->tried_getuser = 1;
         }
         if ((!lookup_user && wild_match(par, s)) || (lookup_user && m->user == u)) {
@@ -1320,6 +1328,11 @@ 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]) {
+          simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
+          m->user = get_user_by_host(s);
+        }
+        m->tried_getuser = 1;
       }
       if (m->user == NULL)
 	strlcpy(handle, "*", sizeof handle);

+ 4 - 0
src/mod/irc.mod/irc.c

@@ -1352,6 +1352,10 @@ check_expired_chanstuff(struct chanset_t *chan)
             if (!m->user && !m->tried_getuser) {
               simple_sprintf(s, "%s!%s", m->nick, m->userhost);
               m->user = get_user_by_host(s);
+              if (!m->user && doresolv(chan) && m->userip[0]) {
+                simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
+                m->user = get_user_by_host(s);
+              }
               m->tried_getuser = 1;
             }
 

+ 5 - 0
src/mod/irc.mod/mode.c

@@ -930,6 +930,11 @@ static memberlist *assert_ismember(struct chanset_t *chan, const char *nick)
 
       simple_sprintf(s, "%s!%s", m->nick, m->userhost);
       m->user = get_user_by_host(s);
+      if (!m->user && doresolv(chan) && m->userip[0]) {
+        simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
+        m->user = get_user_by_host(s);
+      }
+      m->tried_getuser = 1;
     }
   } else {
     if (channel_pending(chan))