added Channel Mode +S (SSL): Only allow SSL Users joining the channel
[ircu2.10.12-pk.git] / ircd / channel.c
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,          '-',