added Channel Mode +S (SSL): Only allow SSL Users joining the channel
authorpk910 <philipp@zoelle1.de>
Sun, 11 Dec 2011 14:54:37 +0000 (15:54 +0100)
committerpk910 <philipp@zoelle1.de>
Sun, 11 Dec 2011 14:54:37 +0000 (15:54 +0100)
include/channel.h
include/ircd_features.h
include/numeric.h
ircd/channel.c
ircd/ircd_features.c
ircd/m_join.c
ircd/m_relay.c
ircd/s_err.c

index 32bea51e352f386a1c90396357599d99c8965cc0..cad2de035ef81d6db02b0d4f65fea3f69f5fb434 100644 (file)
@@ -131,12 +131,13 @@ typedef signed long long long64;
 #define MODE_ACCESS     0x100000000LLU /**< ChanServ access */
 #define MODE_AUDITORIUM 0x200000000LLU /**< +u Auditorium */
 #define MODE_NOFLOOD    0x400000000LLU /**< +f NoFlood */
+#define MODE_SSLCHAN    0x800000000LLU /**< +S SSL Channel */
 /** mode flags which take another parameter (With PARAmeterS)
  */
 #define MODE_WPARAS     (MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS|MODE_ALTCHAN|MODE_ACCESS|MODE_NOFLOOD)
 
 /** Available Channel modes */
-#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AcCbiklmMnNopstuUvrDRzQu" : "cCbiklmMnNopstuvrDRzQu"
+#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AcCbiklmMnNopsStuUvrDRzQu" : "cCbiklmMnNopsStuvrDRzQu"
 /** Available Channel modes that take parameters */
 #define infochanmodeswithparams feature_bool(FEAT_OPLEVELS) ? "AbfkloUvFa" : "bfklovFa"
 
index 13738881f05f536b9aa609ede1fcdb9fd6f1f30b..cb14044cbea274a19beb15b7fc46511a93fa89b4 100644 (file)
@@ -75,6 +75,7 @@ enum Feature {
   FEAT_ERR_BANNEDFROMCHAN,
   FEAT_ERR_BADCHANNELKEY,
   FEAT_ERR_NEEDREGGEDNICK,
+  FEAT_ERR_SSLCHANNEL,
   FEAT_ERR_JOINACCESS,
   
   /* features that probably should not be touched */
index 522b123cabd8d73642bc380eadff11a566d66344..30e54d936cdbad663bac4d1887e561bb273cf9cb 100644 (file)
@@ -409,6 +409,7 @@ extern const struct Numeric* get_error_numeric(int err);
 
 #define ERR_BADCHANNAME      479        /* EFNet extension */
                                         /* 479 Undernet extension badchan */
+#define ERR_SSLCHANNEL       480
 /*     ERR_CANNOTKNOCK      480        unreal */
 /*     ERR_NOULINE          480        austnet */
 #define ERR_NOPRIVILEGES     481
index 868a82f052c7d94496dff10b62c2815dafd3d239..e22935c4c10c585a0c8ef348938a1a7dce68dd8b 100644 (file)
@@ -794,7 +794,8 @@ int client_can_send_to_channel(struct Client *cptr, struct Channel *chptr, int r
    */
   if (!member) {
     if ((chptr->mode.mode & (MODE_NOPRIVMSGS|MODE_MODERATED)) ||
-       ((chptr->mode.mode & MODE_REGONLY) && !IsAccount(cptr)))
+       ((chptr->mode.mode & MODE_REGONLY) && !IsAccount(cptr)) ||
+    ((chptr->mode.mode & MODE_SSLCHAN) && !IsSSL(cptr)))
       return 0;
     else
       return !find_ban(cptr, chptr->banlist);
@@ -822,6 +823,7 @@ const char* find_no_nickchange_channel(struct Client* cptr, const char *new_nick
         continue;
       if ((member->channel->mode.mode & MODE_MODERATED)
           || (member->channel->mode.mode & MODE_REGONLY && !IsAccount(cptr))
+          || (member->channel->mode.mode & MODE_SSLCHAN && !IsSSL(cptr))
           || is_banned(member) || (new_nick && is_banned_with_nick(member, new_nick)))
         return member->channel->chname;
     }
@@ -889,6 +891,8 @@ void channel_modes(struct Client *cptr, char *mbuf, char *pbuf, int buflen,
     *mbuf++ = 'Q';
   if (chptr->mode.mode & MODE_AUDITORIUM)
     *mbuf++ = 'u';
+  if (chptr->mode.mode & MODE_SSLCHAN)
+    *mbuf++ = 'S';
   if (chptr->mode.limit) {
     *mbuf++ = 'l';
     ircd_snprintf(0, pbuf, buflen, "%u", chptr->mode.limit);
@@ -1606,6 +1610,7 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
        MODE_NONOTICE,  'N',
        MODE_QUARANTINE,  'Q',
        MODE_AUDITORIUM,  'u',
+    MODE_SSLCHAN,     'S',
     0x0, 0x0
   };
   static ulong64 local_flags[] = {
@@ -2047,7 +2052,7 @@ modebuf_mode(struct ModeBuf *mbuf, ulong64 mode)
           MODE_TOPICLIMIT | MODE_INVITEONLY | MODE_NOPRIVMSGS | MODE_REGONLY |
            MODE_DELJOINS | MODE_WASDELJOINS | MODE_REGISTERED | MODE_PERSIST |
            MODE_NOCOLOUR | MODE_NOCTCP | MODE_NOAMSGS | MODE_NONOTICE | 
-                  MODE_QUARANTINE | MODE_AUDITORIUM);
+                  MODE_QUARANTINE | MODE_AUDITORIUM | MODE_SSLCHAN);
 
   if (!(mode & ~(MODE_ADD | MODE_DEL))) /* don't add empty modes... */
     return;
@@ -2225,6 +2230,7 @@ modebuf_extract(struct ModeBuf *mbuf, char *buf)
        MODE_ALTCHAN,    'F',
        MODE_ACCESS,    'a',
        MODE_AUDITORIUM, 'u',
+    MODE_SSLCHAN,    'S',
        MODE_NOFLOOD,   'f',
     0x0, 0x0
   };
@@ -3759,6 +3765,7 @@ mode_parse(struct ModeBuf *mbuf, struct Client *cptr, struct Client *sptr,
        MODE_ALTCHAN,        'F',
     MODE_ACCESS,        'a',
        MODE_AUDITORIUM,    'u',
+    MODE_SSLCHAN,       'S',
        MODE_NOFLOOD,       'f',
     MODE_ADD,          '+',
     MODE_DEL,          '-',
index 5c57b893d4fd0c0e0ed45f9f641c8052dc2c29a3..7a673619404f59b962fa7b9b85d3ca73b1a92516 100644 (file)
@@ -340,6 +340,7 @@ static struct FeatureDesc {
   F_S(ERR_BANNEDFROMCHAN, FEAT_CASE, "Cannot join channel (+b)", 0),
   F_S(ERR_BADCHANNELKEY, FEAT_CASE, "Cannot join channel (+k)", 0),
   F_S(ERR_NEEDREGGEDNICK, FEAT_CASE, "Cannot join channel (+r)", 0),
+  F_S(ERR_SSLCHANNEL, FEAT_CASE, "Cannot join channel (+S)", 0),
   F_S(ERR_JOINACCESS, FEAT_CASE, "Cannot join channel (+a)", 0),
   
   /* features that probably should not be touched */
index 66c4379650c267d1f448eb66f9d49e1c835db6c5..9e2298331ff1a7957c5f42a1529f89393cb220c1 100644 (file)
@@ -216,6 +216,8 @@ int m_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
         err = ERR_CHANNELISFULL;
       else if ((chptr->mode.mode & MODE_REGONLY) && !IsAccount(sptr))
         err = ERR_NEEDREGGEDNICK;
+      else if ((chptr->mode.mode & MODE_SSLCHAN) && !IsSSL(sptr))
+        err = ERR_SSLCHANNEL;
       else if (find_ban(sptr, chptr->banlist))
         err = ERR_BANNEDFROMCHAN;
       else if (*chptr->mode.key && (!key || strcmp(key, chptr->mode.key)))
@@ -252,6 +254,7 @@ int m_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
         case ERR_BANNEDFROMCHAN: err = 'b'; break;
         case ERR_BADCHANNELKEY:  err = 'k'; break;
         case ERR_NEEDREGGEDNICK: err = 'r'; break;
+        case ERR_SSLCHANNEL:     err = 'S'; break;
         default: err = '?'; break;
         }
         /* send accountability notice */
@@ -303,6 +306,8 @@ int m_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
             err2 = ERR_CHANNELISFULL;
           else if ((chptrb->mode.mode & MODE_REGONLY) && !IsAccount(sptr))
             err2 = ERR_NEEDREGGEDNICK;
+          else if ((chptrb->mode.mode & MODE_SSLCHAN) && !IsSSL(sptr))
+            err2 = ERR_SSLCHANNEL;
           else if (find_ban(sptr, chptrb->banlist))
             err2 = ERR_BANNEDFROMCHAN;
           else if (*chptrb->mode.key && (!key || strcmp(key, chptrb->mode.key)))
@@ -331,6 +336,8 @@ int m_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
             error = feature_str(FEAT_ERR_BADCHANNELKEY);
         else if (err == ERR_NEEDREGGEDNICK)
             error = feature_str(FEAT_ERR_NEEDREGGEDNICK);
+        else if (err == ERR_SSLCHANNEL)
+            error = feature_str(FEAT_ERR_SSLCHANNEL);
         else if (err == ERR_JOINACCESS)
             error = feature_str(FEAT_ERR_JOINACCESS);
         
index ed8a758d117b43af398f0a7af53a9af09b6412d4..2bfb142da4b69c3c3180c94b75f57c3e5b51d98b 100644 (file)
@@ -105,6 +105,8 @@ static void mode_a_check_altchan(struct Client* sptr, char *channel) {
         err2 = ERR_CHANNELISFULL;
       else if ((chptrb->mode.mode & MODE_REGONLY) && !IsAccount(sptr))
         err2 = ERR_NEEDREGGEDNICK;
+      else if ((chptrb->mode.mode & MODE_SSLCHAN) && !IsSSL(sptr))
+        err2 = ERR_SSLCHANNEL;
       else if (find_ban(sptr, chptrb->banlist))
         err2 = ERR_BANNEDFROMCHAN;
       else if (*chptrb->mode.key) //Fix this!
index ede3c24b74119f2d5cfc2bb45e0b964eb15da886..cc9ccf88f933c8970d6cd932819339d175532a11 100644 (file)
@@ -992,7 +992,7 @@ static Numeric replyTable[] = {
 /* 479 */
   { ERR_BADCHANNAME, "%s :Cannot join channel (Badchanneled: %s)", "479" },
 /* 480 */
-  { 0 },
+  { ERR_SSLCHANNEL, "%s :%s", "480" },
 /* 481 */
   { ERR_NOPRIVILEGES, ":Permission Denied: Insufficient privileges", "481" },
 /* 482 */