diff options
| author | Alexander Barton <alex@barton.de> | 2012-10-06 22:37:57 +0200 |
|---|---|---|
| committer | Alexander Barton <alex@barton.de> | 2012-10-06 22:37:57 +0200 |
| commit | c9d166747d4ea161c55c765edc23e2cd3bd7dec4 (patch) | |
| tree | 1062a7610d311b8297fff9dce9676d3c22e5aeef /src | |
| parent | 56cdc2175c4cbe6abdf45f2d32016c260f3728f7 (diff) | |
| parent | 9ac94339dca746d830a877944e30d1cc9c45c47f (diff) | |
| download | ngircd-c9d166747d4ea161c55c765edc23e2cd3bd7dec4.tar.gz ngircd-c9d166747d4ea161c55c765edc23e2cd3bd7dec4.zip | |
Merge branch 'bug141-ModesQq'
This closes bug #141. * bug141-ModesQq: KICK-protect IRC services Implement channel mode "Q" and user mode "q" Conflicts: src/ngircd/defines.h src/ngircd/messages.h
Diffstat (limited to 'src')
| -rw-r--r-- | src/ngircd/channel.c | 12 | ||||
| -rw-r--r-- | src/ngircd/defines.h | 4 | ||||
| -rw-r--r-- | src/ngircd/irc-mode.c | 10 | ||||
| -rw-r--r-- | src/ngircd/messages.h | 3 |
4 files changed, 26 insertions, 3 deletions
diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 10b05405..f3c74dc6 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -327,6 +327,18 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name, } if(Client_Type(Peer) == CLIENT_USER) { + /* Channel mode 'Q' and user mode 'q' on target: nobody but + * IRC Operators and servers can kick the target user */ + if ((strchr(Channel_Modes(chan), 'Q') + || Client_HasMode(Target, 'q') + || Client_Type(Target) == CLIENT_SERVICE) + && !Client_HasMode(Origin, 'o')) { + IRC_WriteStrClient(Origin, ERR_KICKDENY_MSG, + Client_ID(Origin), Name, + Client_ID(Target)); + return; + } + /* Check if client has the rights to kick target */ ptr = Channel_UserModes(chan, Peer); target_modes = Channel_UserModes(chan, Target); diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h index 1eb3337d..37ca6764 100644 --- a/src/ngircd/defines.h +++ b/src/ngircd/defines.h @@ -161,10 +161,10 @@ #endif /** Supported user modes. */ -#define USERMODES "aBcCiorRswx" +#define USERMODES "aBcCioqrRswx" /** Supported channel modes. */ -#define CHANMODES "abehiIklmMnoOPqrRstvVz" +#define CHANMODES "abehiIklmMnoOPqQrRstvVz" /** Away message for users connected to linked servers. */ #define DEFAULT_AWAY_MSG "Away" diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c index a08d4d92..c7d02c91 100644 --- a/src/ngircd/irc-mode.c +++ b/src/ngircd/irc-mode.c @@ -257,6 +257,15 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) ERR_NOPRIVILEGES_MSG, Client_ID(Origin)); break; + case 'q': /* KICK-protected user */ + if (!set || Client_Type(Client) == CLIENT_SERVER + || Client_OperByMe(Origin)) + x[0] = 'q'; + else + ok = IRC_WriteStrClient(Origin, + ERR_NOPRIVILEGES_MSG, + Client_ID(Origin)); + break; case 'r': /* Restricted (only settable) */ if (set || Client_Type(Client) == CLIENT_SERVER) x[0] = 'r'; @@ -570,6 +579,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) case 'M': /* Only identified nicks can write */ case 'm': /* Moderated */ case 'n': /* Only members can write */ + case 'Q': /* No kicks */ case 't': /* Topic locked */ if(is_oper || is_machine || is_owner || is_admin || is_op || is_halfop) diff --git a/src/ngircd/messages.h b/src/ngircd/messages.h index ac75daf9..b94a999a 100644 --- a/src/ngircd/messages.h +++ b/src/ngircd/messages.h @@ -21,7 +21,7 @@ #define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)" #define RPL_CREATED_MSG "003 %s :This server has been started %s" #define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s" -#define RPL_ISUPPORT1_MSG "005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=#&+ CHANMODES=beI,k,l,imMnOPRstVz CHANLIMIT=#&+:%d :are supported on this server" +#define RPL_ISUPPORT1_MSG "005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=#&+ CHANMODES=beI,k,l,imMnOPQRstVz CHANLIMIT=#&+:%d :are supported on this server" #define RPL_ISUPPORT2_MSG "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d MODES=%d MAXLIST=beI:%d EXCEPTS=e INVEX=I PENALTY :are supported on this server" #define RPL_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d" @@ -140,6 +140,7 @@ #define ERR_NOPRIVILEGES_MSG "481 %s :Permission denied" #define ERR_CHANOPRIVSNEEDED_MSG "482 %s %s :You are not channel operator" #define ERR_CHANOPPRIVTOOLOW_MSG "482 %s %s :Your privileges are too low" +#define ERR_KICKDENY_MSG "482 %s %s :Cannot kick, %s is protected" #define ERR_CANTKILLSERVER_MSG "483 %s :You can't kill a server!" #define ERR_RESTRICTED_MSG "484 %s :Your connection is restricted" #define ERR_NICKREGISTER_MSG "484 %s :Cannot modify user mode (+R) -- Use IRC services" |