]> jfr.im git - irc/rqf/shadowircd.git/commitdiff
Allow for capabilities to be marked as "required".
authorWilliam Pitcock <redacted>
Mon, 20 Apr 2009 14:36:55 +0000 (09:36 -0500)
committerWilliam Pitcock <redacted>
Mon, 20 Apr 2009 14:36:55 +0000 (09:36 -0500)
If capability negotiation fails on these capabilities, then the server link is dropped.

include/s_serv.h
modules/m_capab.c

index 1d4296cb96c658fc9b519c2f55de2713ce05d92b..c52c78debcb602d14d897bc722bcc1571ebd8f90 100644 (file)
@@ -51,6 +51,7 @@ struct Capability
 {
        const char *name;       /* name of capability */
        unsigned int cap;       /* mask value */
+       unsigned int required;  /* 1 if required, 0 if not */
 };
 
 #define CAP_CAP         0x00001        /* received a CAP to begin with */
index 3e7de45d7c2e87214ba2f45a9f87e04acf7c7a5d..650d8ab43324ad58f807b43b602df4b795cc974a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ircd-ratbox: A slightly useful ircd.
- *  m_away.c: Negotiates capabilities with a remote server.
+ *  m_capab.c: Negotiates capabilities with a remote server.
  *
  *  Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
  *  Copyright (C) 1996-2002 Hybrid Development Team
@@ -96,6 +96,23 @@ mr_capab(struct Client *client_p, struct Client *source_p, int parc, const char
                }
        }
 
+       /* check to ensure any "required" caps are set. --nenolod */
+       for (cap = captab; cap->name; cap++)
+       {
+               if (!cap->required)
+                       continue;
+
+               if (!(client_p->localClient->caps & cap->cap))
+               {
+                       char exitbuf[BUFSIZE];
+
+                       rb_snprintf(exitbuf, BUFSIZE, "Missing required CAPAB [%s]", cap->cap);
+                       exit_client(client_p, client_p, client_p, exitbuf);
+
+                       return 0;
+               }
+       }
+
        return 0;
 }