summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2016-06-05 14:16:36 +0100
committerRussell King <rmk+kernel@armlinux.org.uk>2016-06-12 22:29:23 +0100
commit7a438c17063b92a23f9ab133a88097861a6f4527 (patch)
treebfe30e790be92d6c70bfd3eb8edd87134d028dbf
parent900d62df078e136d108edce85f6ce2b0c852c6ac (diff)
Add support for configurable initial channel modes
-rw-r--r--include/conf.h1
-rw-r--r--modules/core/m_join.c20
-rw-r--r--src/conf.c1
-rw-r--r--src/conf_lexer.l7
-rw-r--r--src/conf_parser.y37
5 files changed, 57 insertions, 9 deletions
diff --git a/include/conf.h b/include/conf.h
index 85ca5e6..b2e47f5 100644
--- a/include/conf.h
+++ b/include/conf.h
@@ -279,6 +279,7 @@ struct config_channel_entry
int no_join_on_split;
int default_split_server_count;
int default_split_user_count;
+ unsigned int default_modes;
};
struct config_server_hide
diff --git a/modules/core/m_join.c b/modules/core/m_join.c
index b31779d..833bebb 100644
--- a/modules/core/m_join.c
+++ b/modules/core/m_join.c
@@ -214,26 +214,30 @@ m_join(struct Client *client_p, struct Client *source_p,
*/
if (flags & CHFL_CHANOP)
{
+ char modebuf[MODEBUFLEN];
+ char parabuf[MODEBUFLEN];
+
chptr->channelts = CurrentTime;
- chptr->mode.mode |= MODE_TOPICLIMIT;
- chptr->mode.mode |= MODE_NOPRIVMSGS;
+ chptr->mode.mode |= ConfigChannel.default_modes;
+
+ channel_modes(chptr, &me, modebuf, parabuf);
sendto_server(client_p, CAP_TS6, NOCAPS,
- ":%s SJOIN %lu %s +nt :@%s",
+ ":%s SJOIN %lu %s %s %s:@%s",
me.id, (unsigned long)chptr->channelts,
- chptr->chname, source_p->id);
+ chptr->chname, modebuf, parabuf, source_p->id);
sendto_server(client_p, NOCAPS, CAP_TS6,
- ":%s SJOIN %lu %s +nt :@%s",
+ ":%s SJOIN %lu %s %s %s:@%s",
me.name, (unsigned long)chptr->channelts,
- chptr->chname, source_p->name);
+ chptr->chname, modebuf, parabuf, source_p->name);
/*
* notify all other users on the new channel
*/
sendto_channel_local(ALL_MEMBERS, 0, chptr, ":%s!%s@%s JOIN :%s",
source_p->name, source_p->username,
source_p->host, chptr->chname);
- sendto_channel_local(ALL_MEMBERS, 0, chptr, ":%s MODE %s +nt",
- me.name, chptr->chname);
+ sendto_channel_local(ALL_MEMBERS, 0, chptr, ":%s MODE %s %s",
+ me.name, chptr->chname, modebuf);
if (source_p->away[0])
sendto_channel_local_butone(source_p, 0, CAP_AWAY_NOTIFY, chptr,
":%s!%s@%s AWAY :%s",
diff --git a/src/conf.c b/src/conf.c
index 5850ffb..6f21b24 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -1118,6 +1118,7 @@ set_default_conf(void)
ConfigChannel.default_split_server_count = 0;
ConfigChannel.no_join_on_split = 0;
ConfigChannel.no_create_on_split = 0;
+ ConfigChannel.default_modes = MODE_NOPRIVMSGS | MODE_TOPICLIMIT;
ConfigServerHide.flatten_links = 0;
ConfigServerHide.links_delay = 300;
diff --git a/src/conf_lexer.l b/src/conf_lexer.l
index 875959d..466e827 100644
--- a/src/conf_lexer.l
+++ b/src/conf_lexer.l
@@ -158,6 +158,7 @@ cycle_on_host_change { return CYCLE_ON_HOST_CHANGE; }
deaf { return T_DEAF; }
debug { return T_DEBUG; }
default_floodcount { return DEFAULT_FLOODCOUNT; }
+default_modes { return DEFAULT_MODES; }
default_split_server_count { return DEFAULT_SPLIT_SERVER_COUNT; }
default_split_user_count { return DEFAULT_SPLIT_USER_COUNT; }
deny { return DENY; }
@@ -206,6 +207,7 @@ hub_mask { return HUB_MASK; }
ignore_bogus_ts { return IGNORE_BOGUS_TS; }
invisible { return T_INVISIBLE; }
invisible_on_connect { return INVISIBLE_ON_CONNECT; }
+inviteonly { return T_INVITEONLY; }
ip { return IP; }
ipv4 { return T_IPV4; }
ipv6 { return T_IPV6; }
@@ -243,6 +245,7 @@ max_watch { return MAX_WATCH; }
min_idle { return MIN_IDLE; }
min_nonwildcard { return MIN_NONWILDCARD; }
min_nonwildcard_simple { return MIN_NONWILDCARD_SIMPLE; }
+moderated { return T_MODERATED; }
module { return MODULE; }
modules { return MODULES; }
motd { return MOTD; }
@@ -258,6 +261,7 @@ no_join_on_split { return NO_JOIN_ON_SPLIT; }
no_oper_flood { return NO_OPER_FLOOD; }
no_tilde { return NO_TILDE; }
nononreg { return T_NONONREG; }
+noprivmsgs { return T_NOPRIVMSGS; }
number_per_cidr { return NUMBER_PER_CIDR; }
number_per_ip { return NUMBER_PER_IP; }
oper { return OPERATOR; }
@@ -275,6 +279,7 @@ path { return PATH; }
ping_cookie { return PING_COOKIE; }
ping_time { return PING_TIME; }
port { return PORT; }
+private { return T_PRIVATE; }
quarantine { return RESV; }
random_idle { return RANDOM_IDLE; }
reason { return REASON; }
@@ -290,6 +295,7 @@ resv { return RESV; }
resv_exempt { return RESV_EXEMPT; }
rsa_private_key_file { return RSA_PRIVATE_KEY_FILE; }
rsa_public_key_file { return RSA_PUBLIC_KEY_FILE; }
+secret { return T_SECRET; }
send_password { return SEND_PASSWORD; }
sendq { return SENDQ; }
server { return T_SERVER; }
@@ -327,6 +333,7 @@ stats_u_oper_only { return STATS_U_OPER_ONLY; }
throttle_time { return THROTTLE_TIME; }
tkline_expire_notices { return TKLINE_EXPIRE_NOTICES; }
tlsv1 { return T_TLSV1; }
+topiclimit { return T_TOPICLIMIT; }
true_no_oper_flood { return TRUE_NO_OPER_FLOOD; }
ts_max_delta { return TS_MAX_DELTA; }
ts_warn_delta { return TS_WARN_DELTA; }
diff --git a/src/conf_parser.y b/src/conf_parser.y
index 92e092e..303c66d 100644
--- a/src/conf_parser.y
+++ b/src/conf_parser.y
@@ -51,6 +51,7 @@
#include "numeric.h"
#include "s_user.h"
#include "motd.h"
+#include "channel_mode.h"
#ifdef HAVE_LIBCRYPTO
#include <openssl/rsa.h>
@@ -162,6 +163,7 @@ reset_block_state(void)
%token CONNECTFREQ
%token CYCLE_ON_HOST_CHANGE
%token DEFAULT_FLOODCOUNT
+%token DEFAULT_MODES
%token DEFAULT_SPLIT_SERVER_COUNT
%token DEFAULT_SPLIT_USER_COUNT
%token DENY
@@ -308,17 +310,22 @@ reset_block_state(void)
%token T_FULL
%token T_GLOBOPS
%token T_INVISIBLE
+%token T_INVITEONLY
%token T_IPV4
%token T_IPV6
%token T_LOCOPS
%token T_LOG
%token T_MAX_CLIENTS
+%token T_MODERATED
%token T_NCHANGE
%token T_NONONREG
+%token T_NOPRIVMSGS
%token T_OPERWALL
+%token T_PRIVATE
%token T_RECVQ
%token T_REJ
%token T_RESTART
+%token T_SECRET
%token T_SERVER
%token T_SERVICE
%token T_SERVICES_NAME
@@ -335,6 +342,7 @@ reset_block_state(void)
%token T_SSL_SERVER_METHOD
%token T_SSLV3
%token T_TLSV1
+%token T_TOPICLIMIT
%token T_UMODES
%token T_UNAUTH
%token T_UNDLINE
@@ -2870,7 +2878,8 @@ channel_item: channel_max_bans |
channel_no_create_on_split |
channel_no_join_on_split |
channel_jflood_count | channel_jflood_time |
- channel_disable_fake_channels | error;
+ channel_disable_fake_channels | channel_default_modes |
+ error;
channel_disable_fake_channels: DISABLE_FAKE_CHANNELS '=' TBOOL ';'
{
@@ -2932,6 +2941,32 @@ channel_jflood_time: JOIN_FLOOD_TIME '=' timespec ';'
GlobalSetOptions.joinfloodtime = $3;
};
+channel_default_modes: DEFAULT_MODES
+{
+ ConfigChannel.default_modes = 0;
+} '=' channel_default_mode_items ';' ;
+
+channel_default_mode_items: channel_default_mode_items ',' channel_default_mode_item | channel_default_mode_item;
+channel_default_mode_item: T_PRIVATE
+{
+ ConfigChannel.default_modes |= MODE_PRIVATE;
+} | T_SECRET
+{
+ ConfigChannel.default_modes |= MODE_SECRET;
+} | T_MODERATED
+{
+ ConfigChannel.default_modes |= MODE_MODERATED;
+} | T_TOPICLIMIT
+{
+ ConfigChannel.default_modes |= MODE_TOPICLIMIT;
+} | T_INVITEONLY
+{
+ ConfigChannel.default_modes |= MODE_INVITEONLY;
+} | T_NOPRIVMSGS
+{
+ ConfigChannel.default_modes |= MODE_NOPRIVMSGS;
+};
+
/***************************************************************************
* section serverhide
***************************************************************************/