Browse Source

* Also use a shared channel member for verifying bot is on same network

Bryan Drewery 16 năm trước cách đây
mục cha
commit
b6681b2e50
1 tập tin đã thay đổi với 16 bổ sung2 xóa
  1. 16 2
      src/mod/irc.mod/irc.c

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

@@ -675,7 +675,10 @@ getin_request(char *botnick, char *code, char *par)
     // Does the remote bot have the same number of clients in its channel as me? And a shared member?
     int members = atoi(tmp);
 
-    if (!(chan->channel.members == members)) {
+    char *shared_nick = par[0] ? newsplit(&par) : NULL;
+    memberlist* shared_member = shared_nick ? ismember(chan, shared_nick) : NULL;
+    char *shared_host = par[0] ? newsplit(&par) : NULL;
+    if (!shared_nick || !shared_member || !shared_host || !(chan->channel.members == members) || strcmp(shared_host, shared_member->userhost)) {
       putlog(LOG_GETIN, "*", "opreq from %s/%s on %s - Bot seems to be on a different network???", botnick, nick, chan->dname);
       return;
     }
@@ -895,8 +898,19 @@ request_op(struct chanset_t *chan)
   char l[1024] = "";
   size_t len = 0;
 
+  // Pick a random member to use as verification
+  memberlist* shared_member = NULL;
+  int shared_member_cnt = randint(chan->channel.members);
+  int shared_idx = 0;
+
+  for (shared_member = chan->channel.member; shared_member && shared_member->nick[0]; shared_member = shared_member->next) {
+    if (shared_idx == shared_member_cnt)
+      break;
+    ++shared_idx;
+  }
+
   /* first scan for bots on my server, ask first found for ops */
-  simple_snprintf(s, sizeof(s), "gi o %s %s %d", chan->dname, botname, chan->channel.members);
+  simple_snprintf(s, sizeof(s), "gi o %s %s %d %s %s", chan->dname, botname, chan->channel.members, shared_member->nick, shared_member->userhost);
 
   /* look for bots 0-1 hops away */
   for (i2 = 0; i2 < i; i2++) {