]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/conf.c
configtest: print ssl config options even when unset
[ngircd-alex.git] / src / ngircd / conf.c
index 4a8b6283a4f8136d27a4e23f0cc1629a7e7e3f85..2b592b16d3ce44931aff3b047198d3c50488234d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2009 Alexander Barton (alex@barton.de)
  *
  * 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
@@ -40,6 +40,7 @@
 #include "ngircd.h"
 #include "conn.h"
 #include "client.h"
+#include "channel.h"
 #include "defines.h"
 #include "log.h"
 #include "match.h"
@@ -94,19 +95,46 @@ ConfSSL_Init(void)
        array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
 }
 
+static bool
+ssl_print_configvar(const char *name, const char *file)
+{
+       FILE *fp;
 
-static void
+       if (!file) {
+               printf("  %s =\n", name);
+               return true;
+       }
+
+       fp = fopen(file, "r");
+       if (fp)
+               fclose(fp);
+       else
+               fprintf(stderr, "ERROR: %s \"%s\": %s\n",
+                       name, file, strerror(errno));
+
+       printf("  %s = %s\n", name, file);
+       return fp != NULL;
+}
+
+static bool
 ConfSSL_Puts(void)
 {
-       if (Conf_SSLOptions.KeyFile)
-               printf( "  SSLKeyFile = %s\n", Conf_SSLOptions.KeyFile);
-       if (Conf_SSLOptions.CertFile)
-               printf( "  SSLCertFile = %s\n", Conf_SSLOptions.CertFile);
-       if (Conf_SSLOptions.DHFile)
-               printf( "  SSLDHFile = %s\n", Conf_SSLOptions.DHFile);
+       bool ret;
+
+       ret = ssl_print_configvar("SSLKeyFile", Conf_SSLOptions.KeyFile);
+
+       if (!ssl_print_configvar("SSLCertFile", Conf_SSLOptions.CertFile))
+               ret = false;
+
+       if (!ssl_print_configvar("SSLDHFile", Conf_SSLOptions.DHFile))
+               ret = false;
+
        if (array_bytes(&Conf_SSLOptions.KeyFilePassword))
-               puts("  SSLKeyFilePassword = <secret>"  );
+               puts("  SSLKeyFilePassword = <secret>");
+
        array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
+
+       return ret;
 }
 #endif
 
@@ -151,8 +179,8 @@ ports_parse(array *a, int Line, char *Arg)
         * must be separated by "," */
        ptr = strtok( Arg, "," );
        while (ptr) {
-               ngt_TrimStr( ptr );
-               port = atol( ptr );
+               ngt_TrimStr(ptr);
+               port = atoi(ptr);
                if (port > 0 && port < 0xFFFF) {
                        port16 = (UINT16) port;
                        if (!array_catb(a, (char*)&port16, sizeof port16))
@@ -239,37 +267,42 @@ Conf_Test( void )
        printf( "  PidFile = %s\n", Conf_PidFile);
        printf("  Listen = %s\n", Conf_ListenAddress);
        fputs("  Ports = ", stdout);
-
        ports_puts(&Conf_ListenPorts);
 #ifdef SSL_SUPPORT
        fputs("  SSLPorts = ", stdout);
        ports_puts(&Conf_SSLOptions.ListenPorts);
-       ConfSSL_Puts();
+       if (!ConfSSL_Puts())
+               config_valid = false;
 #endif
 
-       pwd = getpwuid( Conf_UID );
-       if( pwd ) printf( "  ServerUID = %s\n", pwd->pw_name );
-       else printf( "  ServerUID = %ld\n", (long)Conf_UID );
-       grp = getgrgid( Conf_GID );
-       if( grp ) printf( "  ServerGID = %s\n", grp->gr_name );
-       else printf( "  ServerGID = %ld\n", (long)Conf_GID );
-       printf( "  PingTimeout = %d\n", Conf_PingTimeout );
-       printf( "  PongTimeout = %d\n", Conf_PongTimeout );
-       printf( "  ConnectRetry = %d\n", Conf_ConnectRetry );
-       printf( "  OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
-       printf( "  OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
-       printf( "  PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly));
-       printf( "  NoDNS = %s\n", yesno_to_str(Conf_NoDNS));
-       printf( "  NoIdent = %s\n", yesno_to_str(Conf_NoIdent));
+       pwd = getpwuid(Conf_UID);
+       if (pwd)
+               printf("  ServerUID = %s\n", pwd->pw_name);
+       else
+               printf("  ServerUID = %ld\n", (long)Conf_UID);
+       grp = getgrgid(Conf_GID);
+       if (grp)
+               printf("  ServerGID = %s\n", grp->gr_name);
+       else
+               printf("  ServerGID = %ld\n", (long)Conf_GID);
+       printf("  PingTimeout = %d\n", Conf_PingTimeout);
+       printf("  PongTimeout = %d\n", Conf_PongTimeout);
+       printf("  ConnectRetry = %d\n", Conf_ConnectRetry);
+       printf("  OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
+       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("  NoDNS = %s\n", yesno_to_str(Conf_NoDNS));
+       printf("  NoIdent = %s\n", yesno_to_str(Conf_NoIdent));
 
 #ifdef WANT_IPV6
        printf("  ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
        printf("  ConnectIPv6 = %s\n", yesno_to_str(Conf_ConnectIPv4));
 #endif
-       printf( "  MaxConnections = %ld\n", Conf_MaxConnections);
-       printf( "  MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
-       printf( "  MaxJoins = %d\n", Conf_MaxJoins>0 ? Conf_MaxJoins : -1);
-       printf( "  MaxNickLength = %u\n\n", Conf_MaxNickLength - 1);
+       printf("  MaxConnections = %ld\n", Conf_MaxConnections);
+       printf("  MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
+       printf("  MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
+       printf("  MaxNickLength = %u\n\n", Conf_MaxNickLength - 1);
 
        for( i = 0; i < Conf_Oper_Count; i++ ) {
                if( ! Conf_Oper[i].name[0] ) continue;
@@ -386,7 +419,7 @@ Conf_GetServer( CONN_ID Idx )
 
 
 GLOBAL bool
-Conf_EnableServer( char *Name, UINT16 Port )
+Conf_EnableServer( const char *Name, UINT16 Port )
 {
        /* Enable specified server and adjust port */
 
@@ -399,7 +432,7 @@ Conf_EnableServer( char *Name, UINT16 Port )
                        /* Gotcha! Set port and enable server: */
                        Conf_Server[i].port = Port;
                        Conf_Server[i].flags &= ~CONF_SFLAG_DISABLED;
-                       return true;
+                       return (Conf_Server[i].port && Conf_Server[i].host[0]);
                }
        }
        return false;
@@ -425,7 +458,7 @@ Conf_EnablePassiveServer(const char *Name)
 
 
 GLOBAL bool
-Conf_DisableServer( char *Name )
+Conf_DisableServer( const char *Name )
 {
        /* Enable specified server and adjust port */
 
@@ -446,7 +479,7 @@ Conf_DisableServer( char *Name )
 
 
 GLOBAL bool
-Conf_AddServer( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd )
+Conf_AddServer( const char *Name, UINT16 Port, const char *Host, const char *MyPwd, const char *PeerPwd )
 {
        /* Add new server to configuration */
 
@@ -480,53 +513,53 @@ Conf_AddServer( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd
  * Check if the given nick name is an service
  */
 GLOBAL bool
-Conf_IsService(int ConfServer, char *Nick)
+Conf_IsService(int ConfServer, const char *Nick)
 {
        return MatchCaseInsensitive(Conf_Server[ConfServer].svs_mask, Nick);
 } /* Conf_IsService */
 
 
+/**
+ * Initialize configuration settings with their default values.
+ */
 static void
-Set_Defaults( bool InitServers )
+Set_Defaults(bool InitServers)
 {
-       /* Initialize configuration variables with default values. */
-
        int i;
 
-       strcpy( Conf_ServerName, "" );
-       snprintf( Conf_ServerInfo, sizeof Conf_ServerInfo, "%s %s", PACKAGE_NAME, PACKAGE_VERSION );
-       strcpy( Conf_ServerPwd, "" );
-
-       strcpy( Conf_ServerAdmin1, "" );
-       strcpy( Conf_ServerAdmin2, "" );
-       strcpy( Conf_ServerAdminMail, "" );
-
-       strlcpy( Conf_MotdFile, SYSCONFDIR, sizeof( Conf_MotdFile ));
-       strlcat( Conf_MotdFile, MOTD_FILE, sizeof( Conf_MotdFile ));
+       strcpy(Conf_ServerName, "");
+       snprintf(Conf_ServerInfo, sizeof Conf_ServerInfo, "%s %s",
+                PACKAGE_NAME, PACKAGE_VERSION);
+       strcpy(Conf_ServerPwd, "");
 
-       strlcpy( Conf_MotdPhrase, MOTD_PHRASE, sizeof( Conf_MotdPhrase ));
+       strcpy(Conf_ServerAdmin1, "");
+       strcpy(Conf_ServerAdmin2, "");
+       strcpy(Conf_ServerAdminMail, "");
 
-       strlcpy( Conf_Chroot, CHROOT_DIR, sizeof( Conf_Chroot ));
+       strlcpy(Conf_MotdFile, SYSCONFDIR, sizeof(Conf_MotdFile));
+       strlcat(Conf_MotdFile, MOTD_FILE, sizeof(Conf_MotdFile));
+       strlcpy(Conf_MotdPhrase, MOTD_PHRASE, sizeof(Conf_MotdPhrase));
 
-       strlcpy( Conf_PidFile, PID_FILE, sizeof( Conf_PidFile ));
+       Conf_UID = Conf_GID = 0;
+       strlcpy(Conf_Chroot, CHROOT_DIR, sizeof(Conf_Chroot));
+       strlcpy(Conf_PidFile, PID_FILE, sizeof(Conf_PidFile));
 
        free(Conf_ListenAddress);
        Conf_ListenAddress = NULL;
-       Conf_UID = Conf_GID = 0;
 
        Conf_PingTimeout = 120;
        Conf_PongTimeout = 20;
-
        Conf_ConnectRetry = 60;
+       Conf_NoDNS = false;
+       Conf_NoIdent = false;
 
        Conf_Oper_Count = 0;
        Conf_Channel_Count = 0;
 
        Conf_OperCanMode = false;
-       Conf_NoDNS = false;
-       Conf_NoIdent = false;
-       Conf_PredefChannelsOnly = false;
        Conf_OperServerMode = false;
+       Conf_AllowRemoteOper = false;
+       Conf_PredefChannelsOnly = false;
 
        Conf_ConnectIPv4 = true;
        Conf_ConnectIPv6 = true;
@@ -537,10 +570,23 @@ Set_Defaults( bool InitServers )
        Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT;
 
        /* Initialize server configuration structures */
-       if( InitServers ) for( i = 0; i < MAX_SERVERS; Init_Server_Struct( &Conf_Server[i++] ));
+       if (InitServers) {
+               for (i = 0; i < MAX_SERVERS;
+                    Init_Server_Struct(&Conf_Server[i++]));
+       }
 } /* Set_Defaults */
 
 
+static bool
+no_listenports(void)
+{
+       size_t cnt = array_bytes(&Conf_ListenPorts);
+#ifdef SSL_SUPPORT
+       cnt += array_bytes(&Conf_SSLOptions.ListenPorts);
+#endif
+       return cnt == 0;
+}
+
 static bool
 Read_Config( bool ngircd_starting )
 {
@@ -697,12 +743,14 @@ Read_Config( bool ngircd_starting )
                Conf_Server[New_Server_Idx] = New_Server;
        }
 
-       if (0 == array_length(&Conf_ListenPorts, sizeof(UINT16))) {
-               if (!array_copyb(&Conf_ListenPorts, (char*) &defaultport, sizeof defaultport)) {
-                       Config_Error( LOG_ALERT, "Could not add default listening Port %u: %s",
-                                                       (unsigned int) defaultport, strerror(errno));
-                       exit( 1 );
-               }
+       /* not a single listening port? Add default. */
+       if (no_listenports() &&
+               !array_copyb(&Conf_ListenPorts, (char*) &defaultport, sizeof defaultport))
+       {
+               Config_Error(LOG_ALERT, "Could not add default listening Port %u: %s",
+                                       (unsigned int) defaultport, strerror(errno));
+
+               exit(1);
        }
 
        if (!Conf_ListenAddress)
@@ -937,6 +985,11 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
                Conf_OperServerMode = Check_ArgIsTrue( Arg );
                return;
        }
+       if(strcasecmp(Var, "AllowRemoteOper") == 0) {
+               /* Are remote IRC operators allowed to control this server? */
+               Conf_AllowRemoteOper = Check_ArgIsTrue(Arg);
+               return;
+       }
        if( strcasecmp( Var, "MaxConnections" ) == 0 ) {
                /* Maximum number of connections. 0 -> "no limit". */
 #ifdef HAVE_ISDIGIT
@@ -1169,10 +1222,11 @@ Handle_Channelname(struct Conf_Channel *new_chan, const char *name)
        size_t size = sizeof(new_chan->name);
        char *dest = new_chan->name;
 
-       /* Channels names must begin with "&" or "#", if it is
-        * missing, add a '#'. This is only here for user convenience.
-        */
-       if (*name && *name != '#' && *name != '&') {
+       if (!Channel_IsValidName(name)) {
+               /*
+                * maybe user forgot to add a '#'.
+                * This is only here for user convenience.
+                */
                *dest = '#';
                --size;
                ++dest;