Integer type name change.
[silc.git] / apps / silcd / serverconfig.h
index 5b7a1d54cd2bc70859ccc73b90a06565a9f4f5be..c4190e36dffcfc070d4c1b8a6ee7baa99a13c50e 100644 (file)
@@ -2,15 +2,15 @@
 
   serverconfig.h
 
-  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+  Author: Johnny Mnemonic <johnny@themnemonic.org>
 
-  Copyright (C) 1997 - 2000 Pekka Riikonen
+  Copyright (C) 1997 - 2002 Johnny Mnemonic
 
   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.
-  
+
   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 {
+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 SilcServerConfigServerInfoStruct {
   char *server_name;
   char *server_ip;
-  char *location;
-  unsigned short port;
-} SilcConfigServerSectionServerInfo;
-
-/* 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 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"
+  SilcUInt16 port;
+  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 {
+  char *name;
+  SilcUInt32 connections_max;
+  SilcUInt32 connections_max_per_host;
+  SilcUInt32 keepalive_secs;
+  SilcUInt32 reconnect_count;
+  SilcUInt32 reconnect_interval;
+  SilcUInt32 reconnect_interval_max;
+  bool reconnect_keep_trying;
+  SilcUInt32 key_exchange_rekey;
+  bool key_exchange_pfs;
+  struct SilcServerConfigConnParams *next;
+} SilcServerConfigConnParams;
 
 /* Holds all client authentication data from config file */
-typedef struct SilcConfigServerSectionClientConnectionStruct {
+typedef struct SilcServerConfigClientStruct {
   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 {
+  unsigned char *passphrase;
+  SilcUInt32 passphrase_len;
+  void *publickey;
+  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;
-  char *nickname;
-  unsigned int class;
-  struct SilcConfigServerSectionAdminConnectionStruct *next;
-  struct SilcConfigServerSectionAdminConnectionStruct *prev;
-} SilcConfigServerSectionAdminConnection;
-
-/* Holds all configured server/router connections from config file */
-typedef struct SilcConfigServerSectionServerConnectionStruct {
-  char *host;
-  int auth_meth;
-  char *auth_data;
-  unsigned short port;
-  char *version;
-  unsigned int class;
-  struct SilcConfigServerSectionServerConnectionStruct *next;
-  struct SilcConfigServerSectionServerConnectionStruct *prev;
-} SilcConfigServerSectionServerConnection;
+  char *user;
+  char *nick;
+  unsigned char *passphrase;
+  SilcUInt32 passphrase_len;
+  void *publickey;
+  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 */
-typedef struct {
-  char *motd_file;
-} SilcConfigServerSectionMotd;
-
-/* 
-   SILC Server Config object. 
-
-   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;
-  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_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;
+  unsigned char *passphrase;
+  SilcUInt32 passphrase_len;
+  void *publickey;
+  char *version;
+  SilcServerConfigConnParams *param;
+  bool backup_router;
+  struct SilcServerConfigServerStruct *next;
+} SilcServerConfigServer;
 
-/* SILC Configuration Section structure. */
+/* Holds all configured router connections from config file */
+typedef struct SilcServerConfigRouterStruct {
+  char *host;
+  unsigned char *passphrase;
+  SilcUInt32 passphrase_len;
+  void *publickey;
+  SilcUInt16 port;
+  char *version;
+  SilcServerConfigConnParams *param;
+  bool initiator;
+  bool backup_router;
+  char *backup_replace_ip;
+  SilcUInt16 backup_replace_port;
+  bool backup_local;
+  struct SilcServerConfigRouterStruct *next;
+} SilcServerConfigRouter;
+
+/* define the SilcServerConfig object */
 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)
+  void *tmp;
+
+  /* The General section */
+  char *module_path;
+  bool prefer_passphrase_auth;
+  bool require_reverse_lookup;
+  SilcUInt32 channel_rekey_secs;
+  SilcUInt32 key_exchange_timeout;
+  SilcUInt32 conn_auth_timeout;
+  SilcServerConfigConnParams param;
+
+  /* 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;
 
 /* 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(char *filename);
+void silc_server_config_destroy(SilcServerConfig config);
+
+/* Algorithm registering and reset functions */
+bool silc_server_config_register_ciphers(SilcServer server);
+bool silc_server_config_register_hashfuncs(SilcServer server);
+bool silc_server_config_register_hmacs(SilcServer server);
+bool 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);
+bool silc_server_config_is_primary_route(SilcServer server);
+SilcServerConfigRouter *
+silc_server_config_get_primary_router(SilcServer server);
+bool silc_server_config_set_defaults(SilcServer server);
+
+#endif /* !SERVERCONFIG_H */