From bb5d6a24f02155e2252474809cd5e7161fa29b93 Mon Sep 17 00:00:00 2001 From: pk910 Date: Sun, 11 Dec 2011 15:54:37 +0100 Subject: [PATCH] added Channel Mode +S (SSL): Only allow SSL Users joining the channel --- include/channel.h | 3 ++- include/ircd_features.h | 1 + include/numeric.h | 1 + ircd/channel.c | 11 +++++++++-- ircd/ircd_features.c | 1 + ircd/m_join.c | 7 +++++++ ircd/m_relay.c | 2 ++ ircd/s_err.c | 2 +- 8 files changed, 24 insertions(+), 4 deletions(-) diff --git a/include/channel.h b/include/channel.h index 32bea51..cad2de0 100644 --- a/include/channel.h +++ b/include/channel.h @@ -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" diff --git a/include/ircd_features.h b/include/ircd_features.h index 1373888..cb14044 100644 --- a/include/ircd_features.h +++ b/include/ircd_features.h @@ -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 */ diff --git a/include/numeric.h b/include/numeric.h index 522b123..30e54d9 100644 --- a/include/numeric.h +++ b/include/numeric.h @@ -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 diff --git a/ircd/channel.c b/ircd/channel.c index 868a82f..e22935c 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -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, '-', diff --git a/ircd/ircd_features.c b/ircd/ircd_features.c index 5c57b89..7a67361 100644 --- a/ircd/ircd_features.c +++ b/ircd/ircd_features.c @@ -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 */ diff --git a/ircd/m_join.c b/ircd/m_join.c index 66c4379..9e22983 100644 --- a/ircd/m_join.c +++ b/ircd/m_join.c @@ -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); diff --git a/ircd/m_relay.c b/ircd/m_relay.c index ed8a758..2bfb142 100644 --- a/ircd/m_relay.c +++ b/ircd/m_relay.c @@ -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! diff --git a/ircd/s_err.c b/ircd/s_err.c index ede3c24..cc9ccf8 100644 --- a/ircd/s_err.c +++ b/ircd/s_err.c @@ -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 */ -- 2.20.1