New configuration option "NoPAM" to disable PAM

When the "NoPAM" configuration option is set and ngIRCd is compiled
with support for PAM, ngIRCd will not call any PAM functions: all
connection attemps without password will succeed instead and all
connection attemps with password will fail.

If ngIRCd is compiled without PAM support, this option is a dummy
option and nothing changes: the global server password will still be
in effect.
This commit is contained in:
Alexander Barton 2010-07-13 15:10:35 +02:00
parent 37ee0a3313
commit f369177617
5 changed files with 23 additions and 1 deletions

View File

@ -135,6 +135,9 @@
# with support for it. # with support for it.
;NoIdent = no ;NoIdent = no
# Don't use PAM, even if ngIRCd has been compiled with support for it.
;NoPAM = no
# try to connect to other irc servers using ipv4 and ipv6, if possible # try to connect to other irc servers using ipv4 and ipv6, if possible
;ConnectIPv6 = yes ;ConnectIPv6 = yes
;ConnectIPv4 = yes ;ConnectIPv4 = yes

View File

@ -210,6 +210,12 @@ If ngIRCd is compiled with IDENT support this can be used to disable IDENT
lookups at run time. lookups at run time.
Default: no. Default: no.
.TP .TP
\fBNoPAM\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: no.
.TP
\fBConnectIPv4\fR \fBConnectIPv4\fR
Set this to no if you do not want ngIRCd to connect to other IRC servers using 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. IPv4. This allows usage of ngIRCd in IPv6-only setups.

View File

@ -331,6 +331,7 @@ Conf_Test( void )
printf(" PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly)); printf(" PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly));
printf(" NoDNS = %s\n", yesno_to_str(Conf_NoDNS)); printf(" NoDNS = %s\n", yesno_to_str(Conf_NoDNS));
printf(" NoIdent = %s\n", yesno_to_str(Conf_NoIdent)); printf(" NoIdent = %s\n", yesno_to_str(Conf_NoIdent));
printf(" NoPAM = %s\n", yesno_to_str(Conf_NoPAM));
#ifdef WANT_IPV6 #ifdef WANT_IPV6
printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6)); printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
@ -580,6 +581,7 @@ Set_Defaults(bool InitServers)
Conf_ConnectRetry = 60; Conf_ConnectRetry = 60;
Conf_NoDNS = false; Conf_NoDNS = false;
Conf_NoIdent = false; Conf_NoIdent = false;
Conf_NoPAM = false;
Conf_Oper_Count = 0; Conf_Oper_Count = 0;
Conf_Channel_Count = 0; Conf_Channel_Count = 0;
@ -986,6 +988,11 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
#endif #endif
return; return;
} }
if(strcasecmp(Var, "NoPAM") == 0) {
/* don't use PAM library to authenticate users */
Conf_NoPAM = Check_ArgIsTrue(Arg);
return;
}
#ifdef WANT_IPV6 #ifdef WANT_IPV6
/* the default setting for all the WANT_IPV6 special options is 'true' */ /* the default setting for all the WANT_IPV6 special options is 'true' */
if( strcasecmp( Var, "ConnectIPv6" ) == 0 ) { if( strcasecmp( Var, "ConnectIPv6" ) == 0 ) {

View File

@ -152,6 +152,9 @@ GLOBAL bool Conf_NoDNS;
/* Disable IDENT lookups, even when compiled with support for it */ /* Disable IDENT lookups, even when compiled with support for it */
GLOBAL bool Conf_NoIdent; GLOBAL bool Conf_NoIdent;
/* Disable all usage of PAM, even when compiled with support for it */
GLOBAL bool Conf_NoPAM;
/* /*
* try to connect to remote systems using the ipv6 protocol, * try to connect to remote systems using the ipv6 protocol,
* if they have an ipv6 address? (default yes) * if they have an ipv6 address? (default yes)

View File

@ -787,7 +787,10 @@ Hello_User(CLIENT * Client)
/* Sub process */ /* Sub process */
signal(SIGTERM, Proc_GenericSignalHandler); signal(SIGTERM, Proc_GenericSignalHandler);
Log_Init_Subprocess("Auth"); Log_Init_Subprocess("Auth");
result = PAM_Authenticate(Client); if (Conf_NoPAM) {
result = (Client_Password(Client)[0] == '\0');
} else
result = PAM_Authenticate(Client);
write(pipefd[1], &result, sizeof(result)); write(pipefd[1], &result, sizeof(result));
Log_Exit_Subprocess("Auth"); Log_Exit_Subprocess("Auth");
exit(0); exit(0);