serverconfig.h
- Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+ Author: Giovanni Giacobbi <giovanni@giacobbi.net>
- Copyright (C) 1997 - 2000 Pekka Riikonen
+ Copyright (C) 1997 - 2007 Pekka Riikonen
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
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
+ the Free Software Foundation; version 2 of the License.
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#ifndef SERVERCONFIG_H
#define SERVERCONFIG_H
-/* Holds information of configured algorithms */
-typedef struct SilcConfigServerSectionAlgStruct {
- char *alg_name;
- char *sim_name;
- unsigned int block_len;
- unsigned int key_len;
- struct SilcConfigServerSectionAlgStruct *next;
- struct SilcConfigServerSectionAlgStruct *prev;
-#define SILC_CONFIG_SERVER_MODNAME "builtin"
-} SilcConfigServerSectionAlg;
-
-/* Holds server information from config file */
-typedef struct {
- char *server_name;
+typedef struct SilcServerConfigCipherStruct {
+ char *name;
+ char *module;
+ SilcUInt32 key_length;
+ SilcUInt32 block_length;
+ struct SilcServerConfigCipherStruct *next;
+} SilcServerConfigCipher;
+
+typedef struct SilcServerConfigHashStruct {
+ char *name;
+ char *module;
+ SilcUInt32 block_length;
+ SilcUInt32 digest_length;
+ struct SilcServerConfigHashStruct *next;
+} SilcServerConfigHash;
+
+typedef struct SilcServerConfigHmacStruct {
+ char *name;
+ char *hash;
+ SilcUInt32 mac_length;
+ struct SilcServerConfigHmacStruct *next;
+} SilcServerConfigHmac;
+
+typedef struct SilcServerConfigPkcsStruct {
+ char *name;
+ struct SilcServerConfigPkcsStruct *next;
+} SilcServerConfigPkcs;
+
+typedef struct SilcServerConfigServerInfoInterfaceStruct {
char *server_ip;
- char *location;
- unsigned short port;
-} SilcConfigServerSectionServerInfo;
+ char *public_ip;
+ SilcUInt16 port;
+ struct SilcServerConfigServerInfoInterfaceStruct *next;
+} SilcServerConfigServerInfoInterface;
-/* Holds server's administrative information from config file */
-typedef struct {
- char *location;
- char *server_type;
- char *admin_name;
- char *admin_email;
-} SilcConfigServerSectionAdminInfo;
-
-/* Holds all the ports the server is listenning on */
-typedef struct SilcConfigServerSectionListenPortStruct {
- char *host;
- char *remote_ip;
- unsigned short port;
- struct SilcConfigServerSectionListenPortStruct *next;
- struct SilcConfigServerSectionListenPortStruct *prev;
-} SilcConfigServerSectionListenPort;
-
-/* Holds server's execution identity, or the user and group which
- to change from root when server starts */
-typedef struct {
- char *user;
- char *group;
-} SilcConfigServerSectionIdentity;
-
-/* Holds all the configured log files. */
-typedef struct SilcConfigServerSectionLoggingStruct {
- char *logtype;
- char *filename;
- unsigned int maxsize;
- struct SilcConfigServerSectionLoggingStruct *next;
- struct SilcConfigServerSectionLoggingStruct *prev;
-
-/* Allowed <Logging> section types */
-#define SILC_CONFIG_SERVER_LF_INFO "infologfile"
-#define SILC_CONFIG_SERVER_LF_WARNING "warninglogfile"
-#define SILC_CONFIG_SERVER_LF_ERROR "errorlogfile"
-#define SILC_CONFIG_SERVER_LF_FATAL "fatalogfile"
-} SilcConfigServerSectionLogging;
-
-/* Holds all configured connection classes */
-typedef struct SilcConfigServerSectionConnectionClassStruct {
- unsigned int class;
- unsigned int ping_freq;
- unsigned int connect_freq;
- unsigned int max_links;
- struct SilcConfigServerSectionConnectionClassStruct *next;
- struct SilcConfigServerSectionConnectionClassStruct *prev;
-} SilcConfigServerSectionConnectionClass;
-
-#define SILC_CONFIG_SERVER_AUTH_METH_PASSWD "passwd"
-#define SILC_CONFIG_SERVER_AUTH_METH_PUBKEY "pubkey"
+typedef struct SilcServerConfigServerInfoStruct {
+ char *server_name;
+ SilcServerConfigServerInfoInterface *primary;
+ SilcServerConfigServerInfoInterface *secondary;
+ char *server_type; /* E.g. "Test Server" */
+ char *location; /* geographic location */
+ char *admin; /* admin full name */
+ char *email; /* admin's email address */
+ char *user; /* userid the server should be runned at */
+ char *group; /* ditto, but about groupid */
+ SilcPublicKey public_key;
+ SilcPrivateKey private_key;
+ char *motd_file; /* path to text motd file (reading only) */
+ char *pid_file; /* path to the pid file (for reading and writing) */
+} SilcServerConfigServerInfo;
+
+typedef struct SilcServerConfigLoggingStruct {
+ char *file;
+ SilcUInt32 maxsize;
+} SilcServerConfigLogging;
+
+/* Connection parameters */
+typedef struct SilcServerConfigConnParams {
+ struct SilcServerConfigConnParams *next;
+ char *name;
+ char *version_protocol;
+ char *version_software;
+ char *version_software_vendor;
+ SilcUInt32 connections_max;
+ SilcUInt32 connections_max_per_host;
+ SilcUInt32 keepalive_secs;
+ SilcUInt32 reconnect_count;
+ SilcUInt32 reconnect_interval;
+ SilcUInt32 reconnect_interval_max;
+ SilcUInt32 key_exchange_rekey;
+ SilcUInt32 qos_rate_limit;
+ SilcUInt32 qos_bytes_limit;
+ SilcUInt32 qos_limit_sec;
+ SilcUInt32 qos_limit_usec;
+ SilcUInt32 chlimit;
+ unsigned int key_exchange_pfs : 1;
+ unsigned int reconnect_keep_trying : 1;
+ unsigned int anonymous : 1;
+ unsigned int qos : 1;
+} SilcServerConfigConnParams;
/* Holds all client authentication data from config file */
-typedef struct SilcConfigServerSectionClientConnectionStruct {
- char *host;
- int auth_meth;
- char *auth_data;
- unsigned short port;
- unsigned int class;
- struct SilcConfigServerSectionClientConnectionStruct *next;
- struct SilcConfigServerSectionClientConnectionStruct *prev;
-} SilcConfigServerSectionClientConnection;
-
-/* Hols all server's administrators authentication data from config file */
-typedef struct SilcConfigServerSectionAdminConnectionStruct {
+typedef struct SilcServerConfigClientStruct {
char *host;
- int auth_meth;
- char *auth_data;
- char *nickname;
- unsigned int class;
- struct SilcConfigServerSectionAdminConnectionStruct *next;
- struct SilcConfigServerSectionAdminConnectionStruct *prev;
-} SilcConfigServerSectionAdminConnection;
-
-/* Holds all configured server/router connections from config file */
-typedef struct SilcConfigServerSectionServerConnectionStruct {
+ unsigned char *passphrase;
+ SilcUInt32 passphrase_len;
+ SilcBool publickeys;
+ SilcServerConfigConnParams *param;
+ struct SilcServerConfigClientStruct *next;
+} SilcServerConfigClient;
+
+/* Holds all server's administrators authentication data from config file */
+typedef struct SilcServerConfigAdminStruct {
char *host;
- int auth_meth;
- char *auth_data;
- unsigned short port;
- char *version;
- unsigned int class;
- int initiator;
- struct SilcConfigServerSectionServerConnectionStruct *next;
- struct SilcConfigServerSectionServerConnectionStruct *prev;
-} SilcConfigServerSectionServerConnection;
+ char *user;
+ char *nick;
+ unsigned char *passphrase;
+ SilcUInt32 passphrase_len;
+ SilcBool publickeys;
+ struct SilcServerConfigAdminStruct *next;
+} SilcServerConfigAdmin;
/* Holds all configured denied connections from config file */
-typedef struct {
+typedef struct SilcServerConfigDenyStruct {
char *host;
- char *time;
- char *comment;
- unsigned short port;
-} SilcConfigServerSectionDenyConnection;
+ char *reason;
+ struct SilcServerConfigDenyStruct *next;
+} SilcServerConfigDeny;
-/* Holds all client redirections from config file */
-typedef struct {
+/* Holds all configured server connections from config file */
+typedef struct SilcServerConfigServerStruct {
char *host;
- unsigned short port;
-} SilcConfigServerSectionRedirectClient;
-
-/* Holds motd file */
+ unsigned char *passphrase;
+ SilcUInt32 passphrase_len;
+ SilcBool publickeys;
+ SilcServerConfigConnParams *param;
+ SilcBool backup_router;
+ struct SilcServerConfigServerStruct *next;
+} SilcServerConfigServer;
+
+/* Holds all configured router connections from config file */
+typedef struct SilcServerConfigRouterStruct {
+ char *host;
+ unsigned char *passphrase;
+ SilcUInt32 passphrase_len;
+ SilcBool publickeys;
+ SilcUInt16 port;
+ SilcServerConfigConnParams *param;
+ SilcBool initiator;
+ SilcBool backup_router;
+ SilcBool dynamic_connection;
+ char *backup_replace_ip;
+ SilcUInt16 backup_replace_port;
+ SilcBool backup_local;
+ struct SilcServerConfigRouterStruct *next;
+} SilcServerConfigRouter;
+
+/* define the SilcServerConfig object */
typedef struct {
- char *motd_file;
-} SilcConfigServerSectionMotd;
-
-/*
- SILC Server Config object.
+ SilcServer server;
+ void *tmp;
+
+ /* Reference count (when this reaches zero, config object is destroyed) */
+ SilcInt32 refcount;
+
+ /* The General section */
+ char *module_path;
+ SilcBool prefer_passphrase_auth;
+ SilcBool require_reverse_lookup;
+ SilcUInt32 channel_rekey_secs;
+ SilcUInt32 key_exchange_timeout;
+ SilcUInt32 conn_auth_timeout;
+ SilcServerConfigConnParams param;
+ SilcBool detach_disabled;
+ SilcUInt32 detach_timeout;
+ SilcBool logging_timestamp;
+ SilcBool logging_quick;
+ long logging_flushdelay;
+ char *debug_string;
+ SilcBool httpd;
+ char *httpd_ip;
+ SilcUInt16 httpd_port;
+ SilcBool dynamic_server;
+ SilcBool local_channels;
+
+ /* Other configuration sections */
+ SilcServerConfigCipher *cipher;
+ SilcServerConfigHash *hash;
+ SilcServerConfigHmac *hmac;
+ SilcServerConfigPkcs *pkcs;
+ SilcServerConfigLogging *logging_info;
+ SilcServerConfigLogging *logging_warnings;
+ SilcServerConfigLogging *logging_errors;
+ SilcServerConfigLogging *logging_fatals;
+ SilcServerConfigServerInfo *server_info;
+ SilcServerConfigConnParams *conn_params;
+ SilcServerConfigClient *clients;
+ SilcServerConfigAdmin *admins;
+ SilcServerConfigDeny *denied;
+ SilcServerConfigServer *servers;
+ SilcServerConfigRouter *routers;
+} *SilcServerConfig;
- This object holds all the data parsed from the SILC server configuration
- file. This is mainly used at the initialization of the server.
-
-*/
typedef struct {
- /* Pointer back to the server */
- void *server;
-
- /* Filename of the configuration file */
- char *filename;
-
- /* Configuration sections */
- SilcConfigServerSectionAlg *cipher;
- SilcConfigServerSectionAlg *pkcs;
- SilcConfigServerSectionAlg *hash_func;
- SilcConfigServerSectionServerInfo *server_info;
- SilcConfigServerSectionAdminInfo *admin_info;
- SilcConfigServerSectionListenPort *listen_port;
- SilcConfigServerSectionIdentity *identity;
- SilcConfigServerSectionLogging *logging;
- SilcConfigServerSectionConnectionClass *conn_class;
- SilcConfigServerSectionClientConnection *clients;
- SilcConfigServerSectionServerConnection *servers;
- SilcConfigServerSectionServerConnection *routers;
- SilcConfigServerSectionAdminConnection *admins;
- SilcConfigServerSectionDenyConnection *denied;
- SilcConfigServerSectionRedirectClient *redirect;
- SilcConfigServerSectionMotd *motd;
-} SilcConfigServerObject;
-
-typedef SilcConfigServerObject *SilcConfigServer;
-
-/* Configuration section type enumerations. */
-typedef enum {
- SILC_CONFIG_SERVER_SECTION_TYPE_NONE = 0,
- SILC_CONFIG_SERVER_SECTION_TYPE_CIPHER,
- SILC_CONFIG_SERVER_SECTION_TYPE_PKCS,
- SILC_CONFIG_SERVER_SECTION_TYPE_HASH_FUNCTION,
- SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_INFO,
- SILC_CONFIG_SERVER_SECTION_TYPE_ADMIN_INFO,
- SILC_CONFIG_SERVER_SECTION_TYPE_LISTEN_PORT,
- SILC_CONFIG_SERVER_SECTION_TYPE_IDENTITY,
- SILC_CONFIG_SERVER_SECTION_TYPE_LOGGING,
- SILC_CONFIG_SERVER_SECTION_TYPE_CONNECTION_CLASS,
- SILC_CONFIG_SERVER_SECTION_TYPE_CLIENT_CONNECTION,
- SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_CONNECTION,
- SILC_CONFIG_SERVER_SECTION_TYPE_ROUTER_CONNECTION,
- SILC_CONFIG_SERVER_SECTION_TYPE_ADMIN_CONNECTION,
- SILC_CONFIG_SERVER_SECTION_TYPE_DENY_CONNECTION,
- SILC_CONFIG_SERVER_SECTION_TYPE_REDIRECT_CLIENT,
- SILC_CONFIG_SERVER_SECTION_TYPE_MOTD,
-} SilcConfigServerSectionType;
-
-/* SILC Configuration Section structure. */
-typedef struct {
- const char *section;
- SilcConfigServerSectionType type;
- unsigned int maxfields;
-} SilcConfigServerSection;
-
-/* LIst of all possible config sections in SILC server. */
-extern SilcConfigServerSection silc_config_server_sections[];
-
-/* Structure used in parsing the configuration lines. The line is read
- from a file to this structure before parsing it further. */
-typedef struct SilcConfigServerParseStruct {
- SilcBuffer line;
- unsigned int linenum;
- SilcConfigServerSection *section;
- struct SilcConfigServerParseStruct *next;
- struct SilcConfigServerParseStruct *prev;
-} *SilcConfigServerParse;
-
-/* Macros */
-
-/* Allocates list entries for configuration sections. Used by all
- config sections as this is common. */
-#define SILC_SERVER_CONFIG_LIST_ALLOC(x) \
-do { \
- if (!(x)) { \
- (x) = silc_calloc(1, sizeof(*(x))); \
- (x)->next = NULL; \
- (x)->prev = NULL; \
- } else { \
- if (!(x)->next) { \
- (x)->next = silc_calloc(1, sizeof(*(x)->next)); \
- (x)->next->next = NULL; \
- (x)->next->prev = (x); \
- (x) = (x)->next; \
- } \
- } \
-} while(0)
+ SilcServerConfig config;
+ void *ref_ptr;
+} SilcServerConfigRef;
/* Prototypes */
-SilcConfigServer silc_config_server_alloc(char *filename);
-void silc_config_server_free(SilcConfigServer config);
-int silc_config_server_parse(SilcConfigServer config, SilcBuffer buffer,
- SilcConfigServerParse *return_config);
-int silc_config_server_parse_lines(SilcConfigServer config,
- SilcConfigServerParse parse_config);
-int silc_config_server_check_sections(unsigned int checkmask);
-void silc_config_server_setlogfiles(SilcConfigServer config);
-void silc_config_server_register_ciphers(SilcConfigServer config);
-void silc_config_server_register_pkcs(SilcConfigServer config);
-void silc_config_server_register_hashfuncs(SilcConfigServer config);
-SilcConfigServerSectionClientConnection *
-silc_config_server_find_client_conn(SilcConfigServer config,
- char *host, int port);
-SilcConfigServerSectionServerConnection *
-silc_config_server_find_server_conn(SilcConfigServer config,
- char *host, int port);
-SilcConfigServerSectionServerConnection *
-silc_config_server_find_router_conn(SilcConfigServer config,
- char *host, int port);
-void silc_config_server_print();
-#endif
+/* Basic config operations */
+SilcServerConfig silc_server_config_alloc(const char *filename,
+ SilcServer server);
+void silc_server_config_destroy(SilcServerConfig config);
+void silc_server_config_ref(SilcServerConfigRef *ref, SilcServerConfig config,
+ void *ref_ptr);
+void silc_server_config_unref(SilcServerConfigRef *ref);
+
+/* Algorithm registering and reset functions */
+SilcBool silc_server_config_register_ciphers(SilcServer server);
+SilcBool silc_server_config_register_hashfuncs(SilcServer server);
+SilcBool silc_server_config_register_hmacs(SilcServer server);
+SilcBool silc_server_config_register_pkcs(SilcServer server);
+void silc_server_config_setlogfiles(SilcServer server);
+
+/* Run-time config access functions */
+SilcServerConfigClient *
+silc_server_config_find_client(SilcServer server, char *host);
+SilcServerConfigAdmin *
+silc_server_config_find_admin(SilcServer server, char *host, char *user,
+ char *nick);
+SilcServerConfigDeny *
+silc_server_config_find_denied(SilcServer server, char *host);
+SilcServerConfigServer *
+silc_server_config_find_server_conn(SilcServer server, char *host);
+SilcServerConfigRouter *
+silc_server_config_find_router_conn(SilcServer server, char *host, int port);
+SilcServerConfigRouter *
+silc_server_config_find_backup_conn(SilcServer server, char *host);
+SilcBool silc_server_config_is_primary_route(SilcServer server);
+SilcServerConfigRouter *
+silc_server_config_get_primary_router(SilcServer server);
+SilcServerConfigRouter *
+silc_server_config_get_backup_router(SilcServer server);
+
+#endif /* !SERVERCONFIG_H */