diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2016-06-05 14:16:36 +0100 |
---|---|---|
committer | Russell King <rmk+kernel@armlinux.org.uk> | 2016-06-05 17:47:56 +0100 |
commit | 634111fc07826dcf7f1f408c5186dc9f842d2a5c (patch) | |
tree | f5afb868285fb4438f4f00574f63f1ef5c0392f0 | |
parent | 0a892daa10889c2c29855276c0ac34082dea6dfa (diff) |
Add support for configurable initial channel modes
-rw-r--r-- | include/conf.h | 1 | ||||
-rw-r--r-- | modules/core/m_join.c | 20 | ||||
-rw-r--r-- | src/conf.c | 1 | ||||
-rw-r--r-- | src/conf_lexer.l | 7 | ||||
-rw-r--r-- | src/conf_parser.y | 37 |
5 files changed, 57 insertions, 9 deletions
diff --git a/include/conf.h b/include/conf.h index 6ec4dcd..f761819 100644 --- a/include/conf.h +++ b/include/conf.h @@ -282,6 +282,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 57235c9..673e88c 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", @@ -1119,6 +1119,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 3534931..3a1948b 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 @@ -2878,7 +2886,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 ';' { @@ -2940,6 +2949,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 ***************************************************************************/ |