#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"
FEAT_ERR_BANNEDFROMCHAN,
FEAT_ERR_BADCHANNELKEY,
FEAT_ERR_NEEDREGGEDNICK,
+ FEAT_ERR_SSLCHANNEL,
FEAT_ERR_JOINACCESS,
/* features that probably should not be touched */
#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
*/
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);
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;
}
*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);
MODE_NONOTICE, 'N',
MODE_QUARANTINE, 'Q',
MODE_AUDITORIUM, 'u',
+ MODE_SSLCHAN, 'S',
0x0, 0x0
};
static ulong64 local_flags[] = {
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;
MODE_ALTCHAN, 'F',
MODE_ACCESS, 'a',
MODE_AUDITORIUM, 'u',
+ MODE_SSLCHAN, 'S',
MODE_NOFLOOD, 'f',
0x0, 0x0
};
MODE_ALTCHAN, 'F',
MODE_ACCESS, 'a',
MODE_AUDITORIUM, 'u',
+ MODE_SSLCHAN, 'S',
MODE_NOFLOOD, 'f',
MODE_ADD, '+',
MODE_DEL, '-',
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 */
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)))
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 */
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)))
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);
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!
/* 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 */