updates.
[silc.git] / apps / silcd / serverconfig.h
1 /*
2
3   serverconfig.h
4
5   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
6
7   Copyright (C) 1997 - 2000 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13   
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19 */
20
21 #ifndef SERVERCONFIG_H
22 #define SERVERCONFIG_H
23
24 /* Holds information of configured algorithms */
25 typedef struct SilcServerConfigSectionAlgStruct {
26   char *alg_name;
27   char *sim_name;
28   uint32 block_len;
29   uint32 key_len;
30   struct SilcServerConfigSectionAlgStruct *next;
31   struct SilcServerConfigSectionAlgStruct *prev;
32 #define SILC_CONFIG_SERVER_MODNAME "builtin"
33 } SilcServerConfigSectionAlg;
34
35 /* Holds server keys from config file */
36 typedef struct {
37   SilcPublicKey public_key;
38   SilcPrivateKey private_key;
39 } SilcServerConfigSectionServerKeys;
40
41 /* Holds server information from config file */
42 typedef struct {
43   char *server_name;
44   char *server_ip;
45   char *location;
46   uint16 port;
47 } SilcServerConfigSectionServerInfo;
48
49 /* Holds server's administrative information from config file */
50 typedef struct {
51   char *location;
52   char *server_type;
53   char *admin_name;
54   char *admin_email;
55 } SilcServerConfigSectionAdminInfo;
56
57 /* Holds all the ports the server is listenning on */
58 typedef struct SilcServerConfigSectionListenPortStruct {
59   char *host;
60   char *remote_ip;
61   uint16 port;
62   struct SilcServerConfigSectionListenPortStruct *next;
63   struct SilcServerConfigSectionListenPortStruct *prev;
64 } SilcServerConfigSectionListenPort;
65
66 /* Holds server's execution identity, or the user and group which
67    to change from root when server starts */
68 typedef struct {
69  char *user;
70  char *group;
71 } SilcServerConfigSectionIdentity;
72
73 /* Holds all the configured log files. */
74 typedef struct SilcServerConfigSectionLoggingStruct {
75   char *logtype;
76   char *filename;
77   uint32 maxsize;
78   struct SilcServerConfigSectionLoggingStruct *next;
79   struct SilcServerConfigSectionLoggingStruct *prev;
80
81 /* Allowed <Logging> section types */
82 #define SILC_CONFIG_SERVER_LF_INFO "infologfile"
83 #define SILC_CONFIG_SERVER_LF_WARNING "warninglogfile"
84 #define SILC_CONFIG_SERVER_LF_ERROR "errorlogfile"
85 #define SILC_CONFIG_SERVER_LF_FATAL "fatallogfile"
86 } SilcServerConfigSectionLogging;
87
88 /* Holds all configured connection classes */
89 typedef struct SilcServerConfigSectionConnectionClassStruct {
90   uint32 class;
91   uint32 ping_freq;
92   uint32 connect_freq;
93   uint32 max_links;
94   struct SilcServerConfigSectionConnectionClassStruct *next;
95   struct SilcServerConfigSectionConnectionClassStruct *prev;
96 } SilcServerConfigSectionConnectionClass;
97
98 #define SILC_CONFIG_SERVER_AUTH_METH_PASSWD "passwd"
99 #define SILC_CONFIG_SERVER_AUTH_METH_PUBKEY "pubkey"
100
101 /* Holds all client authentication data from config file */
102 typedef struct SilcServerConfigSectionClientConnectionStruct {
103   char *host;
104   SilcAuthMethod auth_meth;
105   void *auth_data;
106   uint32 auth_data_len;
107   uint16 port;
108   uint32 class;
109   struct SilcServerConfigSectionClientConnectionStruct *next;
110   struct SilcServerConfigSectionClientConnectionStruct *prev;
111 } SilcServerConfigSectionClientConnection;
112
113 /* Hols all server's administrators authentication data from config file */
114 typedef struct SilcServerConfigSectionAdminConnectionStruct {
115   char *host;
116   char *username;
117   char *nickname;
118   SilcAuthMethod auth_meth;
119   void *auth_data;
120   uint32 auth_data_len;
121   struct SilcServerConfigSectionAdminConnectionStruct *next;
122   struct SilcServerConfigSectionAdminConnectionStruct *prev;
123 } SilcServerConfigSectionAdminConnection;
124
125 /* Holds all configured server/router connections from config file */
126 typedef struct SilcServerConfigSectionServerConnectionStruct {
127   char *host;
128   SilcAuthMethod auth_meth;
129   void *auth_data;
130   uint32 auth_data_len;
131   uint16 port;
132   char *version;
133   uint32 class;
134   int initiator;
135   struct SilcServerConfigSectionServerConnectionStruct *next;
136   struct SilcServerConfigSectionServerConnectionStruct *prev;
137 } SilcServerConfigSectionServerConnection;
138
139 /* Holds all configured denied connections from config file */
140 typedef struct {
141   char *host;
142   char *time;
143   char *comment;
144   uint16 port;
145 } SilcServerConfigSectionDenyConnection;
146
147 /* Holds motd file */
148 typedef struct {
149   char *motd_file;
150 } SilcServerConfigSectionMotd;
151
152 /* 
153    SILC Server Config object. 
154
155    This object holds all the data parsed from the SILC server configuration
156    file. This is mainly used at the initialization of the server.
157
158 */
159 typedef struct {
160   /* Pointer back to the server */
161   void *server;
162
163   /* Filename of the configuration file */
164   char *filename;
165
166   /* Configuration sections */
167   SilcServerConfigSectionAlg *cipher;
168   SilcServerConfigSectionAlg *pkcs;
169   SilcServerConfigSectionAlg *hash_func;
170   SilcServerConfigSectionAlg *hmac;
171   SilcServerConfigSectionServerKeys *server_keys;
172   SilcServerConfigSectionServerInfo *server_info;
173   SilcServerConfigSectionAdminInfo *admin_info;
174   SilcServerConfigSectionListenPort *listen_port;
175   SilcServerConfigSectionIdentity *identity;
176   SilcServerConfigSectionLogging *logging;
177   SilcServerConfigSectionConnectionClass *conn_class;
178   SilcServerConfigSectionClientConnection *clients;
179   SilcServerConfigSectionServerConnection *servers;
180   SilcServerConfigSectionServerConnection *routers;
181   SilcServerConfigSectionAdminConnection *admins;
182   SilcServerConfigSectionDenyConnection *denied;
183   SilcServerConfigSectionMotd *motd;
184 } SilcServerConfigObject;
185
186 typedef SilcServerConfigObject *SilcServerConfig;
187
188 /* Configuration section type enumerations. */
189 typedef enum {
190   SILC_CONFIG_SERVER_SECTION_TYPE_NONE = 0,
191   SILC_CONFIG_SERVER_SECTION_TYPE_CIPHER,
192   SILC_CONFIG_SERVER_SECTION_TYPE_PKCS,
193   SILC_CONFIG_SERVER_SECTION_TYPE_HASH_FUNCTION,
194   SILC_CONFIG_SERVER_SECTION_TYPE_HMAC,
195   SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_KEYS,
196   SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_INFO,
197   SILC_CONFIG_SERVER_SECTION_TYPE_ADMIN_INFO,
198   SILC_CONFIG_SERVER_SECTION_TYPE_LISTEN_PORT,
199   SILC_CONFIG_SERVER_SECTION_TYPE_IDENTITY,
200   SILC_CONFIG_SERVER_SECTION_TYPE_LOGGING,
201   SILC_CONFIG_SERVER_SECTION_TYPE_CONNECTION_CLASS,
202   SILC_CONFIG_SERVER_SECTION_TYPE_CLIENT_CONNECTION,
203   SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_CONNECTION,
204   SILC_CONFIG_SERVER_SECTION_TYPE_ROUTER_CONNECTION,
205   SILC_CONFIG_SERVER_SECTION_TYPE_ADMIN_CONNECTION,
206   SILC_CONFIG_SERVER_SECTION_TYPE_DENY_CONNECTION,
207   SILC_CONFIG_SERVER_SECTION_TYPE_MOTD,
208 } SilcServerConfigSectionType;
209
210 /* SILC Configuration Section structure. */
211 typedef struct {
212   const char *section;
213   SilcServerConfigSectionType type;
214   int maxfields;
215 } SilcServerConfigSection;
216
217 /* LIst of all possible config sections in SILC server. */
218 extern SilcServerConfigSection silc_server_config_sections[];
219
220 /* Structure used in parsing the configuration lines. The line is read
221    from a file to this structure before parsing it further. */
222 typedef struct SilcServerConfigParseStruct {
223   SilcBuffer line;
224   int linenum;
225   SilcServerConfigSection *section;
226   struct SilcServerConfigParseStruct *next;
227   struct SilcServerConfigParseStruct *prev;
228 } *SilcServerConfigParse;
229
230 /* Macros */
231
232 /* Allocates list entries for configuration sections. Used by all
233    config sections as this is common. */
234 #define SILC_SERVER_CONFIG_LIST_ALLOC(x)                \
235 do {                                                    \
236   if (!(x)) {                                           \
237     (x) = silc_calloc(1, sizeof(*(x)));                 \
238     (x)->next = NULL;                                   \
239     (x)->prev = NULL;                                   \
240   } else {                                              \
241     if (!(x)->next) {                                   \
242       (x)->next = silc_calloc(1, sizeof(*(x)->next));   \
243       (x)->next->next = NULL;                           \
244       (x)->next->prev = (x);                            \
245       (x) = (x)->next;                                  \
246     }                                                   \
247   }                                                     \
248 } while(0)
249
250 /* Prototypes */
251 SilcServerConfig silc_server_config_alloc(char *filename);
252 void silc_server_config_free(SilcServerConfig config);
253 int silc_server_config_parse(SilcServerConfig config, SilcBuffer buffer,
254                              SilcServerConfigParse *return_config);
255 int silc_server_config_parse_lines(SilcServerConfig config, 
256                                    SilcServerConfigParse parse_config);
257 int silc_server_config_check_sections(uint32 checkmask);
258 void silc_server_config_setlogfiles(SilcServerConfig config);
259 void silc_server_config_register_ciphers(SilcServerConfig config);
260 void silc_server_config_register_pkcs(SilcServerConfig config);
261 void silc_server_config_register_hashfuncs(SilcServerConfig config);
262 void silc_server_config_register_hmacs(SilcServerConfig config);
263 SilcServerConfigSectionClientConnection *
264 silc_server_config_find_client_conn(SilcServerConfig config, 
265                                     char *host, int port);
266 SilcServerConfigSectionServerConnection *
267 silc_server_config_find_server_conn(SilcServerConfig config, 
268                                     char *host, int port);
269 SilcServerConfigSectionServerConnection *
270 silc_server_config_find_router_conn(SilcServerConfig config, 
271                                     char *host, int port);
272 SilcServerConfigSectionAdminConnection *
273 silc_server_config_find_admin(SilcServerConfig config,
274                               char *host, char *username, char *nickname);
275 void silc_server_config_print();
276
277 #endif