Browse Source

Use new memberlist->from instead of dynamically determining it

Bryan Drewery 14 năm trước cách đây
mục cha
commit
b994f6bf5f
4 tập tin đã thay đổi với 59 bổ sung98 xóa
  1. 35 52
      src/mod/irc.mod/chan.c
  2. 15 28
      src/mod/irc.mod/cmdsirc.c
  3. 0 2
      src/mod/irc.mod/irc.c
  4. 9 16
      src/mod/irc.mod/mode.c

+ 35 - 52
src/mod/irc.mod/chan.c

@@ -59,7 +59,7 @@ static void resolv_member_callback(int id, void *client_data, const char *host,
   }
 
   memberlist *m = NULL;
-  char *pe = NULL, s[UHOSTLEN + 1], user[15] = "";
+  char *pe = NULL, user[15] = "";
   bool matched_user = 0;
 
   /* Apply lookup results to all matching members by host */
@@ -71,8 +71,7 @@ static void resolv_member_callback(int id, void *client_data, const char *host,
         simple_snprintf(m->userip, sizeof(m->userip), "%s@%s", user, bd::String(ips[0]).c_str());
         simple_snprintf(m->fromip, sizeof(m->fromip), "%s!%s", m->nick, m->userip);
         if (!m->user) {
-          simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
-          m->user = get_user_by_host(s);
+          m->user = get_user_by_host(m->fromip);
 
           /* Act on this lookup */
           if (m->user)
@@ -287,13 +286,9 @@ static memberlist *newmember(struct chanset_t *chan, char *nick)
 static bool member_getuser(memberlist* m, bool act_on_lookup) {
   if (!m) return 0;
   if (!m->user && !m->tried_getuser) {
-    static char s[UHOSTLEN] = "";
-
-    simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
-    m->user = get_user_by_host(s);
+    m->user = get_user_by_host(m->from);
     if (!m->user && m->userip[0]) {
-      simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
-      m->user = get_user_by_host(s);
+      m->user = get_user_by_host(m->fromip);
     }
     m->tried_getuser = 1;
 
@@ -688,10 +683,8 @@ static bool detect_chan_flood(memberlist* m, const char *from, struct chanset_t
       if (which == FLOOD_PART)
         add_mode(chan, '+', 'b', h);
       if (!channel_enforcebans(chan) && me_op(chan)) {
-	  char s[UHOSTLEN];
 	  for (m = chan->channel.member; m && m->nick[0]; m = m->next) {	  
-	    simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
-	    if (!chan_sentkick(m) && wild_match(h, s) &&
+	    if (!chan_sentkick(m) && wild_match(h, m->from) &&
 		(m->joined >= chan->floodtime[which]) &&
 		!m->is_me && me_op(chan)) {
 	      m->flags |= SENTKICK;
@@ -734,23 +727,21 @@ static bool detect_chan_flood(memberlist* m, const char *from, struct chanset_t
 }
 
 /* Given a chan/m do all necesary exempt checks and ban. */
-static void refresh_ban_kick(struct chanset_t*, memberlist *, char *);
+static void refresh_ban_kick(struct chanset_t*, memberlist *, const char *);
 static void do_closed_kick(struct chanset_t *chan, memberlist *m)
 {
   if (!chan || !m) return;
 
-  char s[UHOSTLEN] = "", *s1 = NULL;
-
-  simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
+  char *s1 = NULL;
 
   if (!(use_exempts &&
-        (u_match_mask(global_exempts,s) ||
-         u_match_mask(chan->exempts, s)))) {
-    if (u_match_mask(global_bans, s) || u_match_mask(chan->bans, s))
-      refresh_ban_kick(chan, m, s);
+        (u_match_mask(global_exempts, m->from) ||
+         u_match_mask(chan->exempts, m->from)))) {
+    if (u_match_mask(global_bans, m->from) || u_match_mask(chan->bans, m->from))
+      refresh_ban_kick(chan, m, m->from);
 
-    check_exemptlist(chan, s);
-    s1 = quickban(chan, s);
+    check_exemptlist(chan, m->from);
+    s1 = quickban(chan, m->from);
     u_addmask('b', chan, s1, conf.bot->nick, "joined closed chan", now + (60 * chan->ban_time), 0);
   }
   return;
@@ -773,27 +764,21 @@ static char *quickban(struct chanset_t *chan, const char *from)
 static void kick_all(struct chanset_t *chan, char *hostmask, const char *comment, int bantype)
 {
   int flushed = 0;
-  char s[UHOSTLEN] = "", sip[UHOSTLEN] = "";
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
 
   for (memberlist *m = chan->channel.member; m && m->nick[0]; m = m->next) {
-    simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
-    if (m->userip[0])
-      simple_snprintf(sip, sizeof(sip), "%s!%s", m->nick, m->userip);
-    else
-      sip[0] = 0;
     get_user_flagrec(m->user, &fr, chan->dname, chan);
-    if ((wild_match(hostmask, s) || match_cidr(hostmask, s) ||
-          (sip[0] && (wild_match(hostmask, sip) || match_cidr(hostmask, sip)))) &&
+    if ((wild_match(hostmask, m->from) || match_cidr(hostmask, m->from) ||
+          (m->userip[0] && (wild_match(hostmask, m->fromip) || match_cidr(hostmask, m->fromip)))) &&
         !chan_sentkick(m) &&
 	!m->is_me && !chan_issplit(m) &&
 	!(use_exempts &&
-	  ((bantype && (isexempted(chan, s) || (chan->ircnet_status & CHAN_ASKED_EXEMPTS))) ||
-	   (u_match_mask(global_exempts, s) ||
-	    u_match_mask(chan->exempts, s) ||
-            (sip[0] &&
-             (u_match_mask(global_exempts, sip) ||
-              u_match_mask(chan->exempts, sip))))))) {
+	  ((bantype && (isexempted(chan, m->from) || (chan->ircnet_status & CHAN_ASKED_EXEMPTS))) ||
+	   (u_match_mask(global_exempts, m->from) ||
+	    u_match_mask(chan->exempts, m->from) ||
+            (m->userip[0] &&
+             (u_match_mask(global_exempts, m->fromip) ||
+              u_match_mask(chan->exempts, m->fromip))))))) {
       if (!flushed) {
 	/* We need to kick someone, flush eventual bans first */
 	flush_mode(chan, QUICK);
@@ -809,7 +794,7 @@ static void kick_all(struct chanset_t *chan, char *hostmask, const char *comment
 
 /* If any bans match this wildcard expression, refresh them on the channel.
  */
-static void refresh_ban_kick(struct chanset_t* chan, memberlist *m, char *user)
+static void refresh_ban_kick(struct chanset_t* chan, memberlist *m, const char *user)
 {
   if (!m || chan_sentkick(m))
     return;
@@ -865,7 +850,7 @@ static void refresh_exempt(struct chanset_t *chan, char *user)
   }
 }
 
-static void refresh_invite(struct chanset_t *chan, char *user)
+static void refresh_invite(struct chanset_t *chan, const char *user)
 {
   maskrec *i = NULL;
 
@@ -895,14 +880,11 @@ static void enforce_bans(struct chanset_t *chan)
   if ((chan->ircnet_status & CHAN_ASKED_EXEMPTS))
     return;
 
-  char me[UHOSTLEN] = "", meip[UHOSTLEN] = "";
-
-  simple_snprintf(me, sizeof(me), "%s!%s", botname, botuserhost);
-  simple_snprintf(meip, sizeof(meip), "%s!%s", botname, botuserip);
+  const memberlist *me = ismember(chan, botname);
 
   /* Go through all bans, kicking the users. */
   for (masklist *b = chan->channel.ban; b && b->mask[0]; b = b->next) {
-    if (!(wild_match(b->mask, me) || match_cidr(b->mask, meip)) && !isexempted(chan, b->mask))
+    if (!(wild_match(b->mask, me->from) || match_cidr(b->mask, me->fromip)) && !isexempted(chan, b->mask))
       kick_all(chan, b->mask, "You are banned", 1);
   }
 }
@@ -1012,14 +994,14 @@ void check_this_ban(struct chanset_t *chan, char *banmask, bool sticky)
   if (!me_op(chan))
     return;
 
-  char user[UHOSTLEN] = "";
+  const char *user = NULL;
 
   for (memberlist *m = chan->channel.member; m && m->nick[0]; m = m->next) {
     for (int i = 0; i < (m->userip[0] ? 2 : 1); ++i) {
       if (i == 0 && m->userip[0]) // Check userip first in case userhost is already an ip
-        simple_snprintf(user, sizeof(user), "%s!%s", m->nick, m->userip);
+        user = m->fromip;
       else
-        simple_snprintf(user, sizeof(user), "%s!%s", m->nick, m->userhost);
+        user = m->from;
       if ((wild_match(banmask, user)  || match_cidr(banmask, user)) &&
           !(use_exempts &&
             (u_match_mask(global_exempts, user) ||
@@ -1168,12 +1150,12 @@ static void check_this_member(struct chanset_t *chan, char *nick, struct flag_re
     }
   }
 
-  char s[UHOSTLEN] = "";
+  const char *s = NULL;
   for (int i = 0; i < (m->userip[0] ? 2 : 1); ++i) {
     if (i == 0 && m->userip[0]) // Check userip first in case userhost is already an ip
-      simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
+      s = m->fromip;
     else
-      simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
+      s = m->from;
 
     /* check vs invites */
     if (use_invites &&
@@ -1225,11 +1207,12 @@ void check_this_user(char *hand, int del, char *host)
           u = NULL; // Pretend user doesn't exist when checking
       } else if (0 && del == 2) { //-host, may now match on a diff user and need to act on them
         /*
+        const char *s = NULL;
         for (int i = 0; i < (m->userip[0] ? 2 : 1); ++i) {
           if (i == 0 && m->userip[0]) // Check userip first in case userhost is already an ip
-            simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
+            s = m->fromip;
           else
-            simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
+            s = m->from;
           if (wild_match(host, s) ||
               (i == 0 && m->userip[0] && match_cidr(host, s))) {
             check_member = 1;
@@ -2963,7 +2946,7 @@ static int gotnick(char *from, char *msg)
       }
 
       strlcpy(m->nick, msg, sizeof(m->nick));
-      simple_snprintf(m->from, sizeof(m->from), "%s!%s", m->nick, m->userhost);
+      strlcpy(m->from, s1, sizeof(m->from));
 
       /*
        * Banned?

+ 15 - 28
src/mod/irc.mod/cmdsirc.c

@@ -284,8 +284,8 @@ static void cmd_kickban(int idx, char *par)
       dprintf(idx, "%s is not on %s\n", nick, chan->dname);
       return;
     }
-    simple_snprintf(s, sizeof s, "%s!%s", m->nick, m->userhost);
-    u = get_user_by_host(s);
+    member_getuser(m);
+    u = m->user;
     get_user_flagrec(u, &victim, chan->dname);
   
     if ((chan_master(victim) || glob_master(victim)) &&
@@ -484,7 +484,6 @@ static void cmd_op(int idx, char *par)
   if (!all && !chan)
     return;
 
-  char s[UHOSTLEN] = "";
   memberlist *m = NULL;
   struct userrec *u = NULL;
 
@@ -528,8 +527,8 @@ static void cmd_op(int idx, char *par)
     dprintf(idx, "%s is not on %s.\n", nick, chan->dname);
     return;
   }
-  simple_snprintf(s, sizeof s, "%s!%s", m->nick, m->userhost);
-  u = get_user_by_host(s);
+  member_getuser(m);
+  u = m->user;
   get_user_flagrec(u, &victim, chan->dname);
   if (chk_deop(victim, chan)) {
     dprintf(idx, "%s is currently being auto-deopped  on %s.\n", m->nick, chan->dname);
@@ -976,7 +975,6 @@ static void cmd_deop(int idx, char *par)
   if (!all && !chan)
     return;
 
-  char s[UHOSTLEN] = "";
   memberlist *m = NULL;
   struct userrec *u = NULL;
 
@@ -1022,8 +1020,8 @@ static void cmd_deop(int idx, char *par)
       dprintf(idx, "I'm not going to deop myself.\n");
       return;
     }
-    simple_snprintf(s, sizeof s, "%s!%s", m->nick, m->userhost);
-    u = get_user_by_host(s);
+    member_getuser(m);
+    u = m->user;
     get_user_flagrec(u, &victim, chan->dname);
 
     if ((chan_master(victim) || glob_master(victim)) &&
@@ -1080,7 +1078,6 @@ static void cmd_kick(int idx, char *par)
     return;
   }
 
-  char s[UHOSTLEN] = "";
   memberlist *m = NULL;
   struct userrec *u = NULL;
 
@@ -1117,8 +1114,8 @@ static void cmd_kick(int idx, char *par)
       dprintf(idx, "%s is not on %s\n", nick, chan->dname);
       return;
     }
-    simple_snprintf(s, sizeof s, "%s!%s", m->nick, m->userhost);
-    u = get_user_by_host(s);
+    member_getuser(m);
+    u = m->user;
     get_user_flagrec(u, &victim, chan->dname);
     if (chk_op(victim, chan) && !(chan_master(user) || glob_master(user))) {
       if (all) goto next;
@@ -1209,7 +1206,6 @@ static void cmd_mop(int idx, char *par)
   putlog(LOG_CMDS, "*", "#%s# (%s) mop %s", dcc[idx].nick, all ? "*" : chan->dname, par);
 
   memberlist *m = NULL;
-  char s[256] = "";
 
   while (chan) {
     get_user_flagrec(dcc[idx].user, &user, chan->dname);
@@ -1230,14 +1226,7 @@ static void cmd_mop(int idx, char *par)
     }
     if (channel_active(chan) && !channel_pending(chan)) {
       for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
-        if (!m->user) {
-          simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
-          m->user = get_user_by_host(s);
-          if (!m->user && m->userip[0]) {
-            simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
-            m->user = get_user_by_host(s);
-          }
-        }
+        member_getuser(m);
         if (m->user && u_pass_match(m->user, "-"))
           continue;		/* dont op users without a pass */
         get_user_flagrec(m->user, &victim, chan->dname);
@@ -1295,10 +1284,8 @@ static void cmd_find(int idx, char *par)
 
       for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
         member_getuser(m, 1);
-        char s[UHOSTLEN] = "";
 
-        simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
-        if ((!lookup_user && wild_match(par, s)) || (lookup_user && m->user == u)) {
+        if ((!lookup_user && wild_match(par, m->from)) || (lookup_user && m->user == u)) {
           fcount++;
           if (!found) {
             found = (memberlist **) my_calloc(1, sizeof(memberlist *) * 100);
@@ -1732,8 +1719,8 @@ static void cmd_adduser(int idx, char *par)
   }
   if (strlen(hand) > HANDLEN)
     hand[HANDLEN] = 0;
-  simple_snprintf(s, sizeof s, "%s!%s", m->nick, m->userhost);
-  if ((u = get_user_by_host(s))) {
+  member_getuser(m);
+  if ((u = m->user)) {
     dprintf(idx, "%s is already known as %s.\n", nick, u->handle);
     return;
   }
@@ -1787,7 +1774,7 @@ static void cmd_deluser(int idx, char *par)
     return;
   }
 
-  char *nick = NULL, s[UHOSTLEN] = "", *added = NULL;
+  char *nick = NULL, *added = NULL;
   struct chanset_t *chan = NULL;
   memberlist *m = NULL;
   struct userrec *u = NULL;
@@ -1804,8 +1791,8 @@ static void cmd_deluser(int idx, char *par)
     return;
   }
   get_user_flagrec(dcc[idx].user, &user, chan->dname);
-  simple_snprintf(s, sizeof s, "%s!%s", m->nick, m->userhost);
-  if (!(u = get_user_by_host(s))) {
+  member_getuser(m);
+  if (!(u = m->user)) {
     dprintf(idx, "%s is not a valid user.\n", nick);
     return;
   }

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

@@ -1374,7 +1374,6 @@ check_expired_chanstuff(struct chanset_t *chan)
   if (channel_active(chan) && shouldjoin(chan)) {
     masklist *b = NULL, *e = NULL;
     memberlist *m = NULL, *n = NULL;
-    char s[UHOSTLEN] = "";
     struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
 
     if (me_op(chan)) {
@@ -1434,7 +1433,6 @@ check_expired_chanstuff(struct chanset_t *chan)
       if (m->split) {
         ++splitmembers;
         if (now - m->split > wait_split) {
-          simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
           putlog(LOG_JOIN, chan->dname, "%s (%s) got lost in the net-split.", m->nick, m->userhost);
           --(chan->channel.splitmembers);
           killmember(chan, m->nick);

+ 9 - 16
src/mod/irc.mod/mode.c

@@ -649,16 +649,12 @@ got_op(struct chanset_t *chan, memberlist *m, memberlist *mv)
 static void
 got_deop(struct chanset_t *chan, memberlist *m, memberlist *mv, char *isserver)
 {
-  char s1[UHOSTLEN] = "";
   const bool was_op = chan_hasop(mv);
 
   if (mdop_reversing && !was_op)
     return;
 
   /* m is NULL if a server made the change */
-  if (m)
-    simple_snprintf(s1, sizeof(s1), "%s!%s", m->nick, m->userhost);
-
   if (mv->user) {
     get_user_flagrec(mv->user, &victim, chan->dname, chan);
   }
@@ -697,7 +693,7 @@ got_deop(struct chanset_t *chan, memberlist *m, memberlist *mv, char *isserver)
     putlog(LOG_MODES, chan->dname, "TS resync (%s): %s deopped by %s", chan->dname, mv->nick, isserver);
   /* Check for mass deop */
   else if (m) {
-    detect_chan_flood(m, s1, chan, FLOOD_DEOP, mv->nick);
+    detect_chan_flood(m, m->from, chan, FLOOD_DEOP, mv->nick);
   }
   /* Having op hides your +v and +h  status -- so now that someone's lost ops,
    * check to see if they have +v or +h
@@ -740,12 +736,11 @@ got_deop(struct chanset_t *chan, memberlist *m, memberlist *mv, char *isserver)
 static void
 got_ban(struct chanset_t *chan, memberlist *m, char *mask, char *isserver)
 {
-  char me[UHOSTLEN] = "", meip[UHOSTLEN] = "", s[UHOSTLEN] = "";
+  const memberlist *me = ismember(chan, botname);
+  char s[UHOSTLEN] = "";
 
-  simple_snprintf(me, sizeof(me), "%s!%s", botname, botuserhost);
-  simple_snprintf(meip, sizeof(meip), "%s!%s", botname, botuserip);
   simple_snprintf(s, sizeof s, "%s!%s", m ? m->nick : "", m ? m->userhost : isserver);
-  if (newban(chan, mask, s))
+  if (m && newban(chan, mask, m->from))
     return; /* The ban was already set, don't bother with it */
 
   if (channel_pending(chan) || !me_op(chan))
@@ -754,17 +749,15 @@ got_ban(struct chanset_t *chan, memberlist *m, char *mask, char *isserver)
   // Make an array of all matching users
   bd::Array<memberlist*> matchedUserMembers;
   bool matched_bot = false;
-  char s1[UHOSTLEN] = "";
 
   for (memberlist *mv = chan->channel.member; mv && mv->nick[0]; mv = mv->next) {
     member_getuser(mv);
     if (mv->user) {
-      simple_snprintf(s1, sizeof s1, "%s!%s", mv->nick, mv->userhost);
-      if ((wild_match(mask, s1) || match_cidr(mask, s1))) {
+      if ((wild_match(mask, mv->from) || match_cidr(mask, mv->from))) {
         if (!matched_bot && mv != m && mv->user->bot) {
           matched_bot = true;
         }
-        if (mv->user && !isexempted(chan, s1)) {
+        if (mv->user && !isexempted(chan, mv->from)) {
           matchedUserMembers << mv;
         }
       }
@@ -785,7 +778,7 @@ got_ban(struct chanset_t *chan, memberlist *m, char *mask, char *isserver)
     }
   }
 
-  if ((wild_match(mask, me) || match_cidr(mask, meip)) && !isexempted(chan, me)) {
+  if ((wild_match(mask, me->from) || match_cidr(mask, me->fromip)) && !isexempted(chan, me->from)) {
     add_mode(chan, '-', 'b', mask);
     reversing = 1;
     return;
@@ -1244,7 +1237,7 @@ gotmode(char *from, char *msg)
                   const size_t len = simple_snprintf(tmp, sizeof(tmp), "KICK %s %s :%s%s\r\n", chan->name, m->nick, kickprefix, response(RES_BADOP));
                   dprintf_real(DP_MODE_NEXT, tmp, len, sizeof(tmp));
                 }
-                simple_snprintf(tmp, sizeof(tmp), "%s!%s MODE %s %s", m->nick, m->userhost, chan->dname, modes[modecnt - 1]);
+                simple_snprintf(tmp, sizeof(tmp), "%s MODE %s %s", m->from, chan->dname, modes[modecnt - 1]);
                 deflag_user(u, DEFLAG_EVENT_BADCOOKIE, tmp, chan);
               }
               /* Do the logging last as it can slow down the KICK pushing */
@@ -1283,7 +1276,7 @@ gotmode(char *from, char *msg)
                     dprintf_real(DP_MODE_NEXT, tmp, len, sizeof(tmp));
                     m->flags |= SENTKICK;
                   }
-                  simple_snprintf(tmp, sizeof(tmp), "%s!%s MODE %s %s", m->nick, m->userhost, chan->dname, modes[modecnt - 1]);
+                  simple_snprintf(tmp, sizeof(tmp), "%s MODE %s %s", m->from, chan->dname, modes[modecnt - 1]);
                   deflag_user(u, DEFLAG_EVENT_MANUALOP, tmp, chan);
                 }
                 break;