Module: ngircd.git
Branch: master
Commit: 6600ce3445c5363c75e743a0eec173cc73d79434
URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=6600ce34…
Author: Alexander Barton <alex(a)barton.de>
Date: Mon Jan 10 00:10:01 2011 +0100
Remove ZeroConf variable from sample-ngircd.conf
---
doc/sample-ngircd.conf.tmpl | 4 ----
1 files changed, 0 insertions(+), 4 deletions(-)
diff --git a/doc/sample-ngircd.conf.tmpl b/doc/sample-ngircd.conf.tmpl
index 180bdce..58696be 100644
--- a/doc/sample-ngircd.conf.tmpl
+++ b/doc/sample-ngircd.conf.tmpl
@@ -164,10 +164,6 @@
# Use PAM if ngIRCd has been compiled with support for it.
;PAM = no
- # Use ZeroConf service registration if ngIRCd has been
- # compiled with support for it (e.g. Howl, Avahi, Mac OS X).
- ;ZeroConf = no
-
[Operator]
# [Operator] sections are used to define IRC Operators. There may be
# more than one [Operator] block, one for each local operator.
Module: ngircd.git
Branch: master
Commit: ba32d594fd7a93305cd01a14978971d948392510
URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=ba32d594…
Author: Alexander Barton <alex(a)barton.de>
Date: Sun Jan 9 22:40:11 2011 +0100
Channel_CheckAdminRights(): test if client can admin a channel
This generic function tests if a client is allowed to do administrative
tasks to a specific channel:
- servers and services are always truested ("allowed everything"),
- channel operators are allowed,
- IRC operarors are allowed if OperCanUseMode is set in the config.
---
src/ngircd/channel.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++-
src/ngircd/channel.h | 6 ++++-
src/ngircd/irc-mode.c | 32 ++++++-------------------
3 files changed, 72 insertions(+), 26 deletions(-)
diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c
index e49e5a9..c8c15d9 100644
--- a/src/ngircd/channel.c
+++ b/src/ngircd/channel.c
@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2009 Alexander Barton (alex(a)barton.de)
+ * Copyright (c)2001-2011 Alexander Barton (alex(a)barton.de) and Contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1119,6 +1119,64 @@ Channel_CheckKey(CHANNEL *Chan, CLIENT *Client, const char *Key)
} /* Channel_CheckKey */
+/**
+ * Check wether a client is allowed to administer a channel or not.
+ *
+ * @param Chan The channel to test.
+ * @param Client The client from which the command has been received.
+ * @param Origin The originator of the command (or NULL).
+ * @param OnChannel Set to true if the originator is member of the channel.
+ * @param AdminOk Set to true if the client is allowed to do
+ * administrative tasks on this channel.
+ * @param UseServerMode Set to true if ngIRCd should emulate "server mode",
+ * that is send commands as if originating from a server
+ * and not the originator of the command.
+ */
+GLOBAL void
+Channel_CheckAdminRights(CHANNEL *Chan, CLIENT *Client, CLIENT *Origin,
+ bool *OnChannel, bool *AdminOk, bool *UseServerMode)
+{
+ assert (Chan != NULL);
+ assert (Client != NULL);
+ assert (OnChannel != NULL);
+ assert (AdminOk != NULL);
+ assert (UseServerMode != NULL);
+
+ /* Use the client as origin, if no origin has been given (no prefix?) */
+ if (!Origin)
+ Origin = Client;
+
+ *OnChannel = false;
+ *AdminOk = false;
+ *UseServerMode = false;
+
+ if (Client_Type(Client) != CLIENT_USER
+ && Client_Type(Client) != CLIENT_SERVER
+ && Client_Type(Client) != CLIENT_SERVICE)
+ return;
+
+ /* Allow channel administration if the client is a server or service */
+ if (Client_Type(Client) != CLIENT_USER) {
+ *AdminOk = true;
+ return;
+ }
+
+ *OnChannel = Channel_IsMemberOf(Chan, Origin);
+
+ if (*OnChannel && strchr(Channel_UserModes(Chan, Origin), 'o')) {
+ /* User is a channel operator */
+ *AdminOk = true;
+ } else if (Conf_OperCanMode) {
+ /* IRC operators are allowed to administer channels as well */
+ if (Client_OperByMe(Origin)) {
+ *AdminOk = true;
+ if (Conf_OperServerMode)
+ *UseServerMode = true;
+ }
+ }
+} /* Channel_CheckAdminRights */
+
+
static CL2CHAN *
Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
{
diff --git a/src/ngircd/channel.h b/src/ngircd/channel.h
index 030f910..b912aab 100644
--- a/src/ngircd/channel.h
+++ b/src/ngircd/channel.h
@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2008 by Alexander Barton (alex(a)barton.de)
+ * Copyright (c)2001-2011 Alexander Barton (alex(a)barton.de) and Contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -133,6 +133,10 @@ GLOBAL void Channel_LogServer PARAMS((const char *msg));
GLOBAL bool Channel_CheckKey PARAMS((CHANNEL *Chan, CLIENT *Client,
const char *Key));
+GLOBAL void Channel_CheckAdminRights PARAMS((CHANNEL *Chan, CLIENT *Client,
+ CLIENT *Origin, bool *OnChannel,
+ bool *AdminOk, bool *UseServerMode));
+
#define Channel_IsLocal(c) (Channel_Name(c)[0] == '&')
#define Channel_IsModeless(c) (Channel_Name(c)[0] == '+')
diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c
index a4c1d89..1e6772a 100644
--- a/src/ngircd/irc-mode.c
+++ b/src/ngircd/irc-mode.c
@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2010 Alexander Barton (alex(a)barton.de)
+ * Copyright (c)2001-2011 Alexander Barton (alex(a)barton.de) and Contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -316,8 +316,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
{
char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2],
argadd[CLIENT_PASS_LEN], *mode_ptr;
- bool connected, set, skiponce, retval, onchannel;
- bool modeok = true, use_servermode = false;
+ bool connected, set, skiponce, retval, onchannel, modeok, use_servermode;
int mode_arg, arg_arg;
CLIENT *client;
long l;
@@ -331,28 +330,13 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
if (Req->argc <= 1)
return Channel_Mode_Answer_Request(Origin, Channel);
- /* Is the user allowed to change modes? */
- if (Client_Type(Client) == CLIENT_USER) {
- /* Is the originating user on that channel? */
- onchannel = Channel_IsMemberOf(Channel, Origin);
- modeok = false;
- /* channel operator? */
- if (onchannel &&
- strchr(Channel_UserModes(Channel, Origin), 'o')) {
- modeok = true;
- } else if (Conf_OperCanMode) {
- /* IRC-Operators can use MODE as well */
- if (Client_OperByMe(Origin)) {
- modeok = true;
- if (Conf_OperServerMode)
- use_servermode = true; /* Change Origin to Server */
- }
- }
+ Channel_CheckAdminRights(Channel, Client, Origin,
+ &onchannel, &modeok, &use_servermode);
- if (!onchannel && !modeok)
- return IRC_WriteStrClient(Origin, ERR_NOTONCHANNEL_MSG,
- Client_ID(Origin), Channel_Name(Channel));
- }
+ if (!onchannel && !modeok)
+ return IRC_WriteStrClient(Origin, ERR_NOTONCHANNEL_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
mode_arg = 1;
mode_ptr = Req->argv[mode_arg];
Module: ngircd.git
Branch: master
Commit: 1964bda252ceb499f4a1f76f3e06d996acc2c821
URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=1964bda2…
Author: Florian Westphal <fw(a)strlen.de>
Date: Sun Jan 9 19:42:42 2011 +0100
conf: move 'run-time-feature-disable' options to new FEATURE section
---
doc/sample-ngircd.conf.tmpl | 27 ++++++++--------
man/ngircd.conf.5.tmpl | 57 +++++++++++++++++++--------------
src/ngircd/conf.c | 73 +++++++++++++++++++++++++-----------------
3 files changed, 90 insertions(+), 67 deletions(-)
diff --git a/doc/sample-ngircd.conf.tmpl b/doc/sample-ngircd.conf.tmpl
index 9bfa9d4..180bdce 100644
--- a/doc/sample-ngircd.conf.tmpl
+++ b/doc/sample-ngircd.conf.tmpl
@@ -134,19 +134,6 @@
# Allow Pre-Defined Channels only (see Section [Channels])
;PredefChannelsOnly = no
- # Do any DNS lookups when a client connects to the server.
- ;DNS = yes
-
- # Do any IDENT lookups if ngIRCd has been compiled with support for it.
- ;Ident = yes
-
- # Use PAM if ngIRCd has been compiled with support for it.
- ;PAM = no
-
- # Use ZeroConf service registration if ngIRCd has been
- # compiled with support for it (e.g. Howl, Avahi, Mac OS X).
- ;ZeroConf = no
-
# try to connect to other irc servers using ipv4 and ipv6, if possible
;ConnectIPv6 = yes
;ConnectIPv4 = yes
@@ -167,6 +154,20 @@
# maximum nick name length!
;MaxNickLength = 9
+[Features]
+ # Do any DNS lookups when a client connects to the server.
+ ;DNS = yes
+
+ # Do any IDENT lookups if ngIRCd has been compiled with support for it.
+ ;Ident = yes
+
+ # Use PAM if ngIRCd has been compiled with support for it.
+ ;PAM = no
+
+ # Use ZeroConf service registration if ngIRCd has been
+ # compiled with support for it (e.g. Howl, Avahi, Mac OS X).
+ ;ZeroConf = no
+
[Operator]
# [Operator] sections are used to define IRC Operators. There may be
# more than one [Operator] block, one for each local operator.
diff --git a/man/ngircd.conf.5.tmpl b/man/ngircd.conf.5.tmpl
index 1a6301f..eb50472 100644
--- a/man/ngircd.conf.5.tmpl
+++ b/man/ngircd.conf.5.tmpl
@@ -47,13 +47,18 @@ ports on which the server should be listening. IRC operators of this
server are defined in
.I [Operator]
blocks.
+.I [Features]
+can be used to disable compile-time features at run time, e.g. if ngircd
+was built to support ident lookups, but you do not want ngircd to perform
+ident lookups you can disable them here.
+This section is optional.
.I [Server]
is the section where server links are configured. And
.I [Channel]
blocks are used to configure pre-defined ("persistent") IRC channels.
.PP
There can be more than one [Operator], [Server] and [Channel] sections
-per configuration file, but only one [Global] section.
+per configuration file, but only one [Global] and one [Features] section.
.SH [GLOBAL]
The
.I [Global]
@@ -205,29 +210,6 @@ you do not want to have channels other than those defined in
[Channel] sections in the configuration file.
Default: no.
.TP
-\fBDNS\fR
-If set to false, ngIRCd will not make DNS lookups when clients connect.
-If you configure the daemon to connect to other servers, ngIRCd may still
-perform a DNS lookup if required.
-Default: yes.
-.TP
-\fBIdent\fR
-If ngIRCd is compiled with IDENT support this can be used to disable IDENT
-lookups at run time.
-Default: yes.
-.TP
-\fBPAM\fR
-If ngIRCd is compiled with PAM support this can be used to disable all calls
-to the PAM library at runtime; all users connecting without password are
-allowed to connect, all passwords given will fail.
-Default: yes.
-.TP
-\fBZeroConf\fR
-If ngIRCd is compiled to register its services using ZeroConf (e.g. using
-Howl, Avahi or on Mac OS X) this parameter can be used to disable service
-registration at runtime.
-Default: yes.
-.TP
\fBConnectIPv4\fR
Set this to no if you do not want ngIRCd to connect to other IRC servers using
IPv4. This allows usage of ngIRCd in IPv6-only setups.
@@ -269,6 +251,33 @@ Password of the IRC operator.
\fBMask\fR
Mask that is to be checked before an /OPER for this account is accepted.
Example: nick!ident(a)*.example.com
+.SH [FEATURES]
+An optional section that can be used to disable features at
+run-time. A feature is enabled by default if if ngircd was built with
+support for it.
+\fBDNS\fR
+If set to false, ngIRCd will not make DNS lookups when clients connect.
+If you configure the daemon to connect to other servers, ngIRCd may still
+perform a DNS lookup if required.
+Default: yes.
+.TP
+\fBIdent\fR
+If ngIRCd is compiled with IDENT support this can be used to disable IDENT
+lookups at run time.
+Default: yes.
+.TP
+\fBPAM\fR
+If ngIRCd is compiled with PAM support this can be used to disable all calls
+to the PAM library at runtime; all users connecting without password are
+allowed to connect, all passwords given will fail.
+Default: yes.
+.TP
+\fBZeroConf\fR
+If ngIRCd is compiled to register its services using ZeroConf (e.g. using
+Howl, Avahi or on Mac OS X) this parameter can be used to disable service
+registration at runtime.
+Default: yes.
+.TP
.SH [SERVER]
Other servers are configured in
.I [Server]
diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c
index 5a992eb..5819ef1 100644
--- a/src/ngircd/conf.c
+++ b/src/ngircd/conf.c
@@ -62,6 +62,7 @@ static bool Read_Config PARAMS(( bool ngircd_starting ));
static bool Validate_Config PARAMS(( bool TestOnly, bool Rehash ));
static void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg ));
+static void Handle_FEATURES PARAMS(( int Line, char *Var, char *Arg ));
static void Handle_OPERATOR PARAMS(( int Line, char *Var, char *Arg ));
static void Handle_SERVER PARAMS(( int Line, char *Var, char *Arg ));
static void Handle_CHANNEL PARAMS(( int Line, char *Var, char *Arg ));
@@ -232,7 +233,7 @@ opers_free(void)
{
struct Conf_Oper *op;
size_t len;
-
+
len = array_length(&Conf_Opers, sizeof(*op));
op = array_start(&Conf_Opers);
while (len--) {
@@ -247,7 +248,7 @@ opers_puts(void)
{
struct Conf_Oper *op;
size_t len;
-
+
len = array_length(&Conf_Opers, sizeof(*op));
op = array_start(&Conf_Opers);
while (len--) {
@@ -341,11 +342,6 @@ Conf_Test( void )
printf(" OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
printf(" AllowRemoteOper = %s\n", yesno_to_str(Conf_AllowRemoteOper));
printf(" PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly));
- printf(" DNS = %s\n", yesno_to_str(Conf_DNS));
- printf(" Ident = %s\n", yesno_to_str(Conf_Ident));
- printf(" PAM = %s\n", yesno_to_str(Conf_PAM));
- printf(" ZeroConf = %s\n", yesno_to_str(Conf_ZeroConf));
-
#ifdef WANT_IPV6
printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
printf(" ConnectIPv6 = %s\n", yesno_to_str(Conf_ConnectIPv4));
@@ -355,6 +351,13 @@ Conf_Test( void )
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
printf(" MaxNickLength = %u\n\n", Conf_MaxNickLength - 1);
+ puts("[FEATURES]");
+ printf(" DNS = %s\n", yesno_to_str(Conf_DNS));
+ printf(" Ident = %s\n", yesno_to_str(Conf_Ident));
+ printf(" PAM = %s\n", yesno_to_str(Conf_PAM));
+ printf(" ZeroConf = %s\n", yesno_to_str(Conf_ZeroConf));
+ puts("");
+
opers_puts();
for( i = 0; i < MAX_SERVERS; i++ ) {
@@ -818,6 +821,7 @@ Read_Config( bool ngircd_starting )
arg = ptr + 1; ngt_TrimStr( arg );
if( strcasecmp( section, "[GLOBAL]" ) == 0 ) Handle_GLOBAL( line, var, arg );
+ else if( strcasecmp( section, "[FEATURES]" ) == 0 ) Handle_FEATURES( line, var, arg );
else if( strcasecmp( section, "[OPERATOR]" ) == 0 ) Handle_OPERATOR( line, var, arg );
else if( strcasecmp( section, "[SERVER]" ) == 0 ) Handle_SERVER( line, var, arg );
else if( strcasecmp( section, "[CHANNEL]" ) == 0 ) Handle_CHANNEL( line, var, arg );
@@ -1117,7 +1121,7 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
if (CheckLegacyNoOption(Var, Arg)) {
Config_Error(LOG_WARNING, "%s, line %d: \"No\"-Prefix has been removed, use "
- "\"%s = %s\" instead",
+ "\"%s = %s\" in [FEATURES] section instead",
NGIRCd_ConfFile, Line, NoNo(Var), InvertArg(Arg));
if (strcasecmp(Var, "NoIdent") == 0)
WarnIdent(Line);
@@ -1125,28 +1129,6 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
WarnPAM(Line);
return;
}
- if( strcasecmp( Var, "DNS" ) == 0 ) {
- /* do reverse dns lookups when clients connect? */
- Conf_DNS = Check_ArgIsTrue( Arg );
- return;
- }
- if (strcasecmp(Var, "Ident") == 0) {
- /* do IDENT lookups when clients connect? */
- Conf_Ident = Check_ArgIsTrue(Arg);
- WarnIdent(Line);
- return;
- }
- if(strcasecmp(Var, "PAM") == 0) {
- /* use PAM library to authenticate users */
- Conf_PAM = Check_ArgIsTrue(Arg);
- WarnPAM(Line);
- return;
- }
- if(strcasecmp(Var, "ZeroConf") == 0) {
- /* register services using ZeroConf */
- Conf_ZeroConf = Check_ArgIsTrue(Arg);
- return;
- }
#ifdef WANT_IPV6
/* the default setting for all the WANT_IPV6 special options is 'true' */
if( strcasecmp( Var, "ConnectIPv6" ) == 0 ) {
@@ -1272,6 +1254,37 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
static void
+Handle_FEATURES(int Line, char *Var, char *Arg)
+{
+ assert( Line > 0 );
+ assert( Var != NULL );
+ assert( Arg != NULL );
+
+ if( strcasecmp( Var, "DNS" ) == 0 ) {
+ /* do reverse dns lookups when clients connect? */
+ Conf_DNS = Check_ArgIsTrue( Arg );
+ return;
+ }
+ if (strcasecmp(Var, "Ident") == 0) {
+ /* do IDENT lookups when clients connect? */
+ Conf_Ident = Check_ArgIsTrue(Arg);
+ WarnIdent(Line);
+ return;
+ }
+ if(strcasecmp(Var, "PAM") == 0) {
+ /* use PAM library to authenticate users */
+ Conf_PAM = Check_ArgIsTrue(Arg);
+ WarnPAM(Line);
+ return;
+ }
+ if(strcasecmp(Var, "ZeroConf") == 0) {
+ /* register services using ZeroConf */
+ Conf_ZeroConf = Check_ArgIsTrue(Arg);
+ return;
+ }
+}
+
+static void
Handle_OPERATOR( int Line, char *Var, char *Arg )
{
size_t len;