5 Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
7 Copyright (C) 1997 - 2000 Pekka Riikonen
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.
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.
21 #ifndef SERVERCONFIG_H
22 #define SERVERCONFIG_H
24 /* Holds information of configured algorithms */
25 typedef struct SilcServerConfigSectionAlgStruct {
30 struct SilcServerConfigSectionAlgStruct *next;
31 struct SilcServerConfigSectionAlgStruct *prev;
32 #define SILC_CONFIG_SERVER_MODNAME "builtin"
33 } SilcServerConfigSectionAlg;
35 /* Holds server keys from config file */
37 SilcPublicKey public_key;
38 SilcPrivateKey private_key;
39 } SilcServerConfigSectionServerKeys;
41 /* Holds server information from config file */
47 } SilcServerConfigSectionServerInfo;
49 /* Holds server's administrative information from config file */
55 } SilcServerConfigSectionAdminInfo;
57 /* Holds all the ports the server is listenning on */
58 typedef struct SilcServerConfigSectionListenPortStruct {
62 struct SilcServerConfigSectionListenPortStruct *next;
63 struct SilcServerConfigSectionListenPortStruct *prev;
64 } SilcServerConfigSectionListenPort;
66 /* Holds server's execution identity, or the user and group which
67 to change from root when server starts */
71 } SilcServerConfigSectionIdentity;
73 /* Holds all the configured log files. */
74 typedef struct SilcServerConfigSectionLoggingStruct {
78 struct SilcServerConfigSectionLoggingStruct *next;
79 struct SilcServerConfigSectionLoggingStruct *prev;
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;
88 /* Holds all configured connection classes */
89 typedef struct SilcServerConfigSectionConnectionClassStruct {
94 struct SilcServerConfigSectionConnectionClassStruct *next;
95 struct SilcServerConfigSectionConnectionClassStruct *prev;
96 } SilcServerConfigSectionConnectionClass;
98 #define SILC_CONFIG_SERVER_AUTH_METH_PASSWD "passwd"
99 #define SILC_CONFIG_SERVER_AUTH_METH_PUBKEY "pubkey"
101 /* Holds all client authentication data from config file */
102 typedef struct SilcServerConfigSectionClientConnectionStruct {
104 SilcAuthMethod auth_meth;
106 uint32 auth_data_len;
109 struct SilcServerConfigSectionClientConnectionStruct *next;
110 struct SilcServerConfigSectionClientConnectionStruct *prev;
111 } SilcServerConfigSectionClientConnection;
113 /* Hols all server's administrators authentication data from config file */
114 typedef struct SilcServerConfigSectionAdminConnectionStruct {
118 SilcAuthMethod auth_meth;
120 uint32 auth_data_len;
121 struct SilcServerConfigSectionAdminConnectionStruct *next;
122 struct SilcServerConfigSectionAdminConnectionStruct *prev;
123 } SilcServerConfigSectionAdminConnection;
125 /* Holds all configured server/router connections from config file */
126 typedef struct SilcServerConfigSectionServerConnectionStruct {
128 SilcAuthMethod auth_meth;
130 uint32 auth_data_len;
136 char *backup_replace_ip;
137 uint16 backup_replace_port;
139 struct SilcServerConfigSectionServerConnectionStruct *next;
140 struct SilcServerConfigSectionServerConnectionStruct *prev;
141 } SilcServerConfigSectionServerConnection;
143 /* Holds all configured denied connections from config file */
144 typedef struct SilcServerConfigSectionDenyConnectionStruct {
148 struct SilcServerConfigSectionDenyConnectionStruct *next;
149 struct SilcServerConfigSectionDenyConnectionStruct *prev;
150 } SilcServerConfigSectionDenyConnection;
152 /* Holds motd file */
155 } SilcServerConfigSectionMotd;
160 } SilcServerConfigSectionPid;
163 SILC Server Config object.
165 This object holds all the data parsed from the SILC server configuration
166 file. This is mainly used at the initialization of the server.
170 /* Pointer back to the server */
173 /* Filename of the configuration file */
176 /* Configuration sections */
177 SilcServerConfigSectionAlg *cipher;
178 SilcServerConfigSectionAlg *pkcs;
179 SilcServerConfigSectionAlg *hash_func;
180 SilcServerConfigSectionAlg *hmac;
181 SilcServerConfigSectionServerKeys *server_keys;
182 SilcServerConfigSectionServerInfo *server_info;
183 SilcServerConfigSectionAdminInfo *admin_info;
184 SilcServerConfigSectionListenPort *listen_port;
185 SilcServerConfigSectionIdentity *identity;
186 SilcServerConfigSectionLogging *logging;
187 SilcServerConfigSectionConnectionClass *conn_class;
188 SilcServerConfigSectionClientConnection *clients;
189 SilcServerConfigSectionServerConnection *servers;
190 SilcServerConfigSectionServerConnection *routers;
191 SilcServerConfigSectionAdminConnection *admins;
192 SilcServerConfigSectionDenyConnection *denied;
193 SilcServerConfigSectionMotd *motd;
194 SilcServerConfigSectionPid *pidfile;
195 } SilcServerConfigObject;
197 typedef SilcServerConfigObject *SilcServerConfig;
199 /* Configuration section type enumerations. */
201 SILC_CONFIG_SERVER_SECTION_TYPE_NONE = 0,
202 SILC_CONFIG_SERVER_SECTION_TYPE_CIPHER,
203 SILC_CONFIG_SERVER_SECTION_TYPE_PKCS,
204 SILC_CONFIG_SERVER_SECTION_TYPE_HASH_FUNCTION,
205 SILC_CONFIG_SERVER_SECTION_TYPE_HMAC,
206 SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_KEYS,
207 SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_INFO,
208 SILC_CONFIG_SERVER_SECTION_TYPE_ADMIN_INFO,
209 SILC_CONFIG_SERVER_SECTION_TYPE_LISTEN_PORT,
210 SILC_CONFIG_SERVER_SECTION_TYPE_IDENTITY,
211 SILC_CONFIG_SERVER_SECTION_TYPE_LOGGING,
212 SILC_CONFIG_SERVER_SECTION_TYPE_CONNECTION_CLASS,
213 SILC_CONFIG_SERVER_SECTION_TYPE_CLIENT_CONNECTION,
214 SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_CONNECTION,
215 SILC_CONFIG_SERVER_SECTION_TYPE_ROUTER_CONNECTION,
216 SILC_CONFIG_SERVER_SECTION_TYPE_ADMIN_CONNECTION,
217 SILC_CONFIG_SERVER_SECTION_TYPE_DENY_CONNECTION,
218 SILC_CONFIG_SERVER_SECTION_TYPE_MOTD,
219 SILC_CONFIG_SERVER_SECTION_TYPE_PID,
220 } SilcServerConfigSectionType;
222 /* SILC Configuration Section structure. */
225 SilcServerConfigSectionType type;
227 } SilcServerConfigSection;
229 /* LIst of all possible config sections in SILC server. */
230 extern SilcServerConfigSection silc_server_config_sections[];
232 /* Structure used in parsing the configuration lines. The line is read
233 from a file to this structure before parsing it further. */
234 typedef struct SilcServerConfigParseStruct {
237 SilcServerConfigSection *section;
238 struct SilcServerConfigParseStruct *next;
239 struct SilcServerConfigParseStruct *prev;
240 } *SilcServerConfigParse;
244 /* Allocates list entries for configuration sections. Used by all
245 config sections as this is common. */
246 #define SILC_SERVER_CONFIG_LIST_ALLOC(x) \
249 (x) = silc_calloc(1, sizeof(*(x))); \
254 (x)->next = silc_calloc(1, sizeof(*(x)->next)); \
255 (x)->next->next = NULL; \
256 (x)->next->prev = (x); \
263 SilcServerConfig silc_server_config_alloc(char *filename);
264 void silc_server_config_free(SilcServerConfig config);
265 int silc_server_config_parse(SilcServerConfig config, SilcBuffer buffer,
266 SilcServerConfigParse *return_config);
267 int silc_server_config_parse_lines(SilcServerConfig config,
268 SilcServerConfigParse parse_config);
269 int silc_server_config_check_sections(uint32 checkmask);
270 void silc_server_config_setlogfiles(SilcServerConfig config);
271 bool silc_server_config_register_ciphers(SilcServerConfig config);
272 bool silc_server_config_register_pkcs(SilcServerConfig config);
273 bool silc_server_config_register_hashfuncs(SilcServerConfig config);
274 bool silc_server_config_register_hmacs(SilcServerConfig config);
275 SilcServerConfigSectionClientConnection *
276 silc_server_config_find_client_conn(SilcServerConfig config,
277 char *host, int port);
278 SilcServerConfigSectionServerConnection *
279 silc_server_config_find_server_conn(SilcServerConfig config,
280 char *host, int port);
281 SilcServerConfigSectionServerConnection *
282 silc_server_config_find_router_conn(SilcServerConfig config,
283 char *host, int port);
284 bool silc_server_config_is_primary_route(SilcServerConfig config);
285 SilcServerConfigSectionServerConnection *
286 silc_server_config_get_primary_router(SilcServerConfig config);
287 SilcServerConfigSectionAdminConnection *
288 silc_server_config_find_admin(SilcServerConfig config,
289 char *host, char *username, char *nickname);
290 SilcServerConfigSectionDenyConnection *
291 silc_server_config_denied_conn(SilcServerConfig config, char *host,