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.
22 #include "serverincludes.h"
23 #include "server_internal.h"
25 SilcServerConfigSection silc_server_config_sections[] = {
27 SILC_CONFIG_SERVER_SECTION_TYPE_CIPHER, 4 },
29 SILC_CONFIG_SERVER_SECTION_TYPE_PKCS, 2 },
31 SILC_CONFIG_SERVER_SECTION_TYPE_HASH_FUNCTION, 4 },
33 SILC_CONFIG_SERVER_SECTION_TYPE_HMAC, 3 },
35 SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_INFO, 4 },
37 SILC_CONFIG_SERVER_SECTION_TYPE_ADMIN_INFO, 4 },
39 SILC_CONFIG_SERVER_SECTION_TYPE_LISTEN_PORT, 3 },
41 SILC_CONFIG_SERVER_SECTION_TYPE_IDENTITY, 2 },
43 SILC_CONFIG_SERVER_SECTION_TYPE_LOGGING, 3 },
44 { "[ConnectionClass]",
45 SILC_CONFIG_SERVER_SECTION_TYPE_CONNECTION_CLASS, 4 },
46 { "[ClientConnection]",
47 SILC_CONFIG_SERVER_SECTION_TYPE_CLIENT_CONNECTION, 5 },
48 { "[ServerConnection]",
49 SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_CONNECTION, 6 },
50 { "[RouterConnection]",
51 SILC_CONFIG_SERVER_SECTION_TYPE_ROUTER_CONNECTION, 7 },
52 { "[AdminConnection]",
53 SILC_CONFIG_SERVER_SECTION_TYPE_ADMIN_CONNECTION, 5 },
55 SILC_CONFIG_SERVER_SECTION_TYPE_DENY_CONNECTION, 4 },
57 SILC_CONFIG_SERVER_SECTION_TYPE_REDIRECT_CLIENT, 2 },
59 SILC_CONFIG_SERVER_SECTION_TYPE_MOTD, 1 },
61 { NULL, SILC_CONFIG_SERVER_SECTION_TYPE_NONE, 0 }
64 /* Allocates a new configuration object, opens configuration file and
65 parses the file. The parsed data is returned to the newly allocated
66 configuration object. */
68 SilcServerConfig silc_server_config_alloc(char *filename)
72 SilcServerConfigParse config_parse;
74 SILC_LOG_DEBUG(("Allocating new configuration object"));
76 new = silc_calloc(1, sizeof(*new));
78 fprintf(stderr, "Could not allocate new configuration object");
82 new->filename = filename;
84 /* Open configuration file and parse it */
87 silc_config_open(filename, &buffer);
90 if ((silc_server_config_parse(new, buffer, &config_parse)) == FALSE)
92 if ((silc_server_config_parse_lines(new, config_parse)) == FALSE)
104 /* Free's a configuration object. */
106 void silc_server_config_free(SilcServerConfig config)
109 silc_free(config->filename);
110 silc_free(config->server_info);
111 silc_free(config->admin_info);
112 silc_free(config->listen_port);
113 silc_free(config->identity);
114 silc_free(config->conn_class);
115 silc_free(config->clients);
116 silc_free(config->admins);
117 silc_free(config->servers);
118 silc_free(config->routers);
119 silc_free(config->denied);
120 silc_free(config->redirect);
121 silc_free(config->motd);
126 /* Parses the the buffer and returns the parsed lines into return_config
127 argument. The return_config argument doesn't have to be initialized
128 before calling this. It will be initialized during the parsing. The
129 buffer sent as argument can be safely free'd after this function has
130 succesfully returned. */
132 int silc_server_config_parse(SilcServerConfig config, SilcBuffer buffer,
133 SilcServerConfigParse *return_config)
136 unsigned int linenum;
137 char line[1024], *cp;
138 SilcServerConfigSection *cptr = NULL;
139 SilcServerConfigParse parse = *return_config, first = NULL;
141 SILC_LOG_DEBUG(("Parsing configuration file"));
145 while((begin = silc_gets(line, sizeof(line),
146 buffer->data, buffer->len, begin)) != EOF) {
150 /* Check for bad line */
151 if (silc_check_line(cp))
154 /* Remove tabs and whitespaces from the line */
155 if (strchr(cp, '\t')) {
157 while(strchr(cp + i, '\t')) {
158 *strchr(cp + i, '\t') = ' ';
162 for (i = 0; i < strlen(cp); i++) {
178 /* Remove new line sign */
179 if (strchr(cp, '\n'))
180 *strchr(cp, '\n') = '\0';
182 /* Check for matching sections */
183 for (cptr = silc_server_config_sections; cptr->section; cptr++)
184 if (!strncasecmp(cp, cptr->section, strlen(cptr->section)))
187 if (!cptr->section) {
188 fprintf(stderr, "%s:%d: Unknown section `%s'\n",
189 config->filename, linenum, cp);
196 * Start of a configuration line
199 if (cptr->type != SILC_CONFIG_SERVER_SECTION_TYPE_NONE) {
201 if (strchr(cp, '\n'))
202 *strchr(cp, '\n') = ':';
205 parse = silc_calloc(1, sizeof(*parse));
207 parse->section = NULL;
211 if (parse->next == NULL) {
212 parse->next = silc_calloc(1, sizeof(*parse->next));
213 parse->next->line = NULL;
214 parse->next->section = NULL;
215 parse->next->next = NULL;
216 parse->next->prev = parse;
224 /* Add the line to parsing structure for further parsing. */
226 parse->section = cptr;
227 parse->line = silc_buffer_alloc(strlen(cp) + 1);
228 parse->linenum = linenum;
229 silc_buffer_pull_tail(parse->line, strlen(cp));
230 silc_buffer_put(parse->line, cp, strlen(cp));
237 /* Set the return_config argument to its first value so that further
238 parsing can be started from the first line. */
239 *return_config = first;
244 /* Parses the lines earlier read from configuration file. The config object
245 must not be initialized, it will be initialized in this function. The
246 parse_config argument is uninitialized automatically during this
249 int silc_server_config_parse_lines(SilcServerConfig config,
250 SilcServerConfigParse parse_config)
252 int ret, check = FALSE;
253 unsigned int checkmask;
255 SilcServerConfigParse pc = parse_config;
258 SILC_LOG_DEBUG(("Parsing configuration lines"));
268 /* Get number of tokens in line */
269 ret = silc_config_check_num_token(line);
270 if (ret != pc->section->maxfields) {
272 fprintf(stderr, "%s:%d: Missing tokens, %d tokens (should be %d)\n",
273 config->filename, pc->linenum, ret,
274 pc->section->maxfields);
279 switch(pc->section->type) {
280 case SILC_CONFIG_SERVER_SECTION_TYPE_CIPHER:
282 SILC_SERVER_CONFIG_LIST_ALLOC(config->cipher);
284 /* Get cipher name */
285 ret = silc_config_get_token(line, &config->cipher->alg_name);
289 fprintf(stderr, "%s:%d: Cipher name not defined\n",
290 config->filename, pc->linenum);
294 /* Get module name */
295 config->cipher->sim_name = NULL;
296 ret = silc_config_get_token(line, &config->cipher->sim_name);
301 ret = silc_config_get_token(line, &tmp);
305 fprintf(stderr, "%s:%d: Cipher key length not defined\n",
306 config->filename, pc->linenum);
309 config->cipher->key_len = atoi(tmp);
312 /* Get block length */
313 ret = silc_config_get_token(line, &tmp);
317 fprintf(stderr, "%s:%d: Cipher block length not defined\n",
318 config->filename, pc->linenum);
321 config->cipher->block_len = atoi(tmp);
325 checkmask |= (1L << pc->section->type);
328 case SILC_CONFIG_SERVER_SECTION_TYPE_PKCS:
330 SILC_SERVER_CONFIG_LIST_ALLOC(config->pkcs);
333 ret = silc_config_get_token(line, &config->pkcs->alg_name);
337 fprintf(stderr, "%s:%d: PKCS name not defined\n",
338 config->filename, pc->linenum);
343 ret = silc_config_get_token(line, &tmp);
347 fprintf(stderr, "%s:%d: PKCS key length not defined\n",
348 config->filename, pc->linenum);
351 config->pkcs->key_len = atoi(tmp);
355 checkmask |= (1L << pc->section->type);
358 case SILC_CONFIG_SERVER_SECTION_TYPE_HASH_FUNCTION:
360 SILC_SERVER_CONFIG_LIST_ALLOC(config->hash_func);
362 /* Get Hash function name */
363 ret = silc_config_get_token(line, &config->hash_func->alg_name);
367 fprintf(stderr, "%s:%d: Hash function name not defined\n",
368 config->filename, pc->linenum);
372 /* Get Hash function module name */
373 config->hash_func->sim_name = NULL;
374 ret = silc_config_get_token(line, &config->hash_func->sim_name);
378 /* Get block length */
379 ret = silc_config_get_token(line, &tmp);
383 fprintf(stderr, "%s:%d: Hash function block length not defined\n",
384 config->filename, pc->linenum);
387 config->hash_func->block_len = atoi(tmp);
390 /* Get hash length */
391 ret = silc_config_get_token(line, &tmp);
395 fprintf(stderr, "%s:%d: Hash function hash length not defined\n",
396 config->filename, pc->linenum);
399 config->hash_func->key_len = atoi(tmp);
403 checkmask |= (1L << pc->section->type);
406 case SILC_CONFIG_SERVER_SECTION_TYPE_HMAC:
408 SILC_SERVER_CONFIG_LIST_ALLOC(config->hmac);
411 ret = silc_config_get_token(line, &config->hmac->alg_name);
415 fprintf(stderr, "%s:%d: HMAC name not defined\n",
416 config->filename, pc->linenum);
421 ret = silc_config_get_token(line, &config->hmac->sim_name);
425 fprintf(stderr, "%s:%d: Hash function name not defined\n",
426 config->filename, pc->linenum);
431 ret = silc_config_get_token(line, &tmp);
435 fprintf(stderr, "%s:%d: HMAC's MAC length not defined\n",
436 config->filename, pc->linenum);
439 config->hmac->key_len = atoi(tmp);
443 checkmask |= (1L << pc->section->type);
446 case SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_INFO:
448 if (!config->server_info)
449 config->server_info = silc_calloc(1, sizeof(*config->server_info));
451 /* Get server name */
452 ret = silc_config_get_token(line, &config->server_info->server_name);
456 /* Server name not defined */
461 ret = silc_config_get_token(line, &config->server_info->server_ip);
465 /* Server IP not defined */
469 /* Get server location */
470 ret = silc_config_get_token(line, &config->server_info->location);
474 /* Get server port */
475 /* XXX: Need port here??? */
476 ret = silc_config_get_token(line, &tmp);
480 /* Port not defined */
483 config->server_info->port = atoi(tmp);
487 checkmask |= (1L << pc->section->type);
490 case SILC_CONFIG_SERVER_SECTION_TYPE_ADMIN_INFO:
492 if (!config->admin_info)
493 config->admin_info = silc_calloc(1, sizeof(*config->admin_info));
496 ret = silc_config_get_token(line, &config->admin_info->location);
500 /* Get server type */
501 ret = silc_config_get_token(line, &config->admin_info->server_type);
505 /* Get admins name */
506 ret = silc_config_get_token(line, &config->admin_info->admin_name);
510 /* Get admins email address */
511 ret = silc_config_get_token(line, &config->admin_info->admin_email);
516 checkmask |= (1L << pc->section->type);
519 case SILC_CONFIG_SERVER_SECTION_TYPE_LISTEN_PORT:
521 SILC_SERVER_CONFIG_LIST_ALLOC(config->listen_port);
524 ret = silc_config_get_token(line, &config->listen_port->host);
529 ret = silc_config_get_token(line, &config->listen_port->remote_ip);
534 ret = silc_config_get_token(line, &tmp);
539 config->listen_port->port = 0;
541 config->listen_port->port = atoi(tmp);
546 checkmask |= (1L << pc->section->type);
549 case SILC_CONFIG_SERVER_SECTION_TYPE_IDENTITY:
551 if (!config->identity)
552 config->identity = silc_calloc(1, sizeof(*config->identity));
555 ret = silc_config_get_token(line, &config->identity->user);
559 ret = silc_config_get_token(line, &config->identity->group);
564 checkmask |= (1L << pc->section->type);
566 case SILC_CONFIG_SERVER_SECTION_TYPE_CONNECTION_CLASS:
568 SILC_SERVER_CONFIG_LIST_ALLOC(config->conn_class);
570 /* Get class number */
571 ret = silc_config_get_token(line, &tmp);
575 /* Class number not defined */
578 config->conn_class->class = atoi(tmp);
581 /* Get ping frequency */
582 ret = silc_config_get_token(line, &tmp);
585 config->conn_class->ping_freq = atoi(tmp);
588 /* Get connect frequency */
589 ret = silc_config_get_token(line, &tmp);
592 config->conn_class->connect_freq = atoi(tmp);
596 ret = silc_config_get_token(line, &tmp);
599 config->conn_class->max_links = atoi(tmp);
603 checkmask |= (1L << pc->section->type);
606 case SILC_CONFIG_SERVER_SECTION_TYPE_LOGGING:
608 SILC_SERVER_CONFIG_LIST_ALLOC(config->logging);
610 /* Get log section type and check it */
611 ret = silc_config_get_token(line, &config->logging->logtype);
615 fprintf(stderr, "%s:%d: Log file section not defined\n",
616 config->filename, pc->linenum);
619 if (strcmp(config->logging->logtype, SILC_CONFIG_SERVER_LF_INFO)
620 && strcmp(config->logging->logtype, SILC_CONFIG_SERVER_LF_WARNING)
621 && strcmp(config->logging->logtype, SILC_CONFIG_SERVER_LF_ERROR)
622 && strcmp(config->logging->logtype, SILC_CONFIG_SERVER_LF_FATAL)) {
623 fprintf(stderr, "%s:%d: Unknown log file section '%s'\n",
624 config->filename, pc->linenum, config->logging->logtype);
628 /* Get log filename */
629 ret = silc_config_get_token(line, &config->logging->filename);
633 fprintf(stderr, "%s:%d: Log file name not defined\n",
634 config->filename, pc->linenum);
638 /* Get max byte size */
639 ret = silc_config_get_token(line, &tmp);
643 config->logging->maxsize = atoi(tmp);
648 checkmask |= (1L << pc->section->type);
651 case SILC_CONFIG_SERVER_SECTION_TYPE_CLIENT_CONNECTION:
653 SILC_SERVER_CONFIG_LIST_ALLOC(config->clients);
656 ret = silc_config_get_token(line, &config->clients->host);
661 config->clients->host = strdup("*");
663 /* Get authentication method */
664 ret = silc_config_get_token(line, &tmp);
668 if (strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PASSWD) &&
669 strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PUBKEY)) {
670 fprintf(stderr, "%s:%d: Unknown authentication method '%s'\n",
671 config->filename, pc->linenum, tmp);
675 if (!strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PASSWD))
676 config->clients->auth_meth = SILC_AUTH_PASSWORD;
678 if (!strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PUBKEY))
679 config->clients->auth_meth = SILC_AUTH_PUBLIC_KEY;
684 /* Get authentication data */
685 ret = silc_config_get_token(line, &config->clients->auth_data);
690 config->clients->host = strdup("*");
693 ret = silc_config_get_token(line, &tmp);
697 config->clients->port = atoi(tmp);
701 /* Get class number */
702 ret = silc_config_get_token(line, &tmp);
706 config->clients->class = atoi(tmp);
711 checkmask |= (1L << pc->section->type);
714 case SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_CONNECTION:
716 SILC_SERVER_CONFIG_LIST_ALLOC(config->servers);
719 ret = silc_config_get_token(line, &config->servers->host);
724 config->servers->host = strdup("*");
726 /* Get authentication method */
727 ret = silc_config_get_token(line, &tmp);
731 if (strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PASSWD) &&
732 strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PUBKEY)) {
733 fprintf(stderr, "%s:%d: Unknown authentication method '%s'\n",
734 config->filename, pc->linenum, tmp);
738 if (!strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PASSWD))
739 config->servers->auth_meth = SILC_AUTH_PASSWORD;
741 if (!strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PUBKEY))
742 config->servers->auth_meth = SILC_AUTH_PUBLIC_KEY;
747 /* Get authentication data */
748 ret = silc_config_get_token(line, &config->servers->auth_data);
753 ret = silc_config_get_token(line, &tmp);
757 config->servers->port = atoi(tmp);
762 ret = silc_config_get_token(line, &config->servers->version);
766 /* Get class number */
767 ret = silc_config_get_token(line, &tmp);
771 config->servers->class = atoi(tmp);
776 checkmask |= (1L << pc->section->type);
779 case SILC_CONFIG_SERVER_SECTION_TYPE_ROUTER_CONNECTION:
781 SILC_SERVER_CONFIG_LIST_ALLOC(config->routers);
784 ret = silc_config_get_token(line, &config->routers->host);
789 // config->routers->host = strdup("*");
791 /* Get authentication method */
792 ret = silc_config_get_token(line, &tmp);
796 if (strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PASSWD) &&
797 strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PUBKEY)) {
798 fprintf(stderr, "%s:%d: Unknown authentication method '%s'\n",
799 config->filename, pc->linenum, tmp);
803 if (!strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PASSWD))
804 config->routers->auth_meth = SILC_AUTH_PASSWORD;
806 if (!strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PUBKEY))
807 config->routers->auth_meth = SILC_AUTH_PUBLIC_KEY;
812 /* Get authentication data */
813 ret = silc_config_get_token(line, &config->routers->auth_data);
818 ret = silc_config_get_token(line, &tmp);
822 config->routers->port = atoi(tmp);
827 ret = silc_config_get_token(line, &config->routers->version);
831 /* Get class number */
832 ret = silc_config_get_token(line, &tmp);
836 config->routers->class = atoi(tmp);
840 /* Get whether we are initiator or not */
841 ret = silc_config_get_token(line, &tmp);
845 config->routers->initiator = atoi(tmp);
846 if (config->routers->initiator != 0)
847 config->routers->initiator = TRUE;
852 checkmask |= (1L << pc->section->type);
855 case SILC_CONFIG_SERVER_SECTION_TYPE_ADMIN_CONNECTION:
857 SILC_SERVER_CONFIG_LIST_ALLOC(config->admins);
860 ret = silc_config_get_token(line, &config->admins->host);
865 config->admins->host = strdup("*");
868 ret = silc_config_get_token(line, &config->admins->username);
873 config->admins->username = strdup("*");
876 ret = silc_config_get_token(line, &config->admins->nickname);
881 config->admins->nickname = strdup("*");
883 /* Get authentication method */
884 ret = silc_config_get_token(line, &tmp);
888 if (strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PASSWD) &&
889 strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PUBKEY)) {
890 fprintf(stderr, "%s:%d: Unknown authentication method '%s'\n",
891 config->filename, pc->linenum, tmp);
895 if (!strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PASSWD))
896 config->admins->auth_meth = SILC_AUTH_PASSWORD;
898 if (!strcmp(tmp, SILC_CONFIG_SERVER_AUTH_METH_PUBKEY))
899 config->admins->auth_meth = SILC_AUTH_PUBLIC_KEY;
904 /* Get authentication data */
905 ret = silc_config_get_token(line, &config->admins->auth_data);
910 checkmask |= (1L << pc->section->type);
913 case SILC_CONFIG_SERVER_SECTION_TYPE_DENY_CONNECTION:
914 /* Not implemented yet */
918 case SILC_CONFIG_SERVER_SECTION_TYPE_REDIRECT_CLIENT:
919 /* Not implemented yet */
923 case SILC_CONFIG_SERVER_SECTION_TYPE_MOTD:
926 config->motd = silc_calloc(1, sizeof(*config->motd));
929 ret = silc_config_get_token(line, &config->motd->motd_file);
934 checkmask |= (1L << pc->section->type);
937 case SILC_CONFIG_SERVER_SECTION_TYPE_NONE:
943 /* Check for error */
944 if (check == FALSE) {
945 /* Line could not be parsed */
946 fprintf(stderr, "%s:%d: Parse error\n", config->filename, pc->linenum);
952 // silc_free(pc->prev);
959 /* Check that all mandatory sections really were found. If not, the server
960 cannot function and we return error. */
961 ret = silc_server_config_check_sections(checkmask);
967 /* Before returning all the lists in the config object must be set
968 to their first values (the last value is first here). */
969 while (config->cipher && config->cipher->prev)
970 config->cipher = config->cipher->prev;
971 while (config->pkcs && config->pkcs->prev)
972 config->pkcs = config->pkcs->prev;
973 while (config->hash_func && config->hash_func->prev)
974 config->hash_func = config->hash_func->prev;
975 while (config->hmac && config->hmac->prev)
976 config->hmac = config->hmac->prev;
977 while (config->listen_port && config->listen_port->prev)
978 config->listen_port = config->listen_port->prev;
979 while (config->logging && config->logging->prev)
980 config->logging = config->logging->prev;
981 while (config->conn_class && config->conn_class->prev)
982 config->conn_class = config->conn_class->prev;
983 while (config->clients && config->clients->prev)
984 config->clients = config->clients->prev;
985 while (config->servers && config->servers->prev)
986 config->servers = config->servers->prev;
987 while (config->routers && config->routers->prev)
988 config->routers = config->routers->prev;
990 SILC_LOG_DEBUG(("Done"));
995 /* This function checks that the mask sent as argument includes all the
996 sections that are mandatory in SILC server. */
998 int silc_server_config_check_sections(unsigned int checkmask)
1000 if (!(checkmask & (1L << SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_INFO))) {
1004 if (!(checkmask & (1L << SILC_CONFIG_SERVER_SECTION_TYPE_ADMIN_INFO))) {
1008 if (!(checkmask & (1L << SILC_CONFIG_SERVER_SECTION_TYPE_LISTEN_PORT))) {
1012 if (!(checkmask & (1L << SILC_CONFIG_SERVER_SECTION_TYPE_CLIENT_CONNECTION))) {
1017 & (1L << SILC_CONFIG_SERVER_SECTION_TYPE_SERVER_CONNECTION))) {
1022 & (1L << SILC_CONFIG_SERVER_SECTION_TYPE_ROUTER_CONNECTION))) {
1030 /* Sets log files where log messages is saved by the server. */
1032 void silc_server_config_setlogfiles(SilcServerConfig config)
1034 SilcServerConfigSectionLogging *log;
1035 char *info, *warning, *error, *fatal;
1036 unsigned int info_size, warning_size, error_size, fatal_size;
1038 SILC_LOG_DEBUG(("Setting configured log file names"));
1040 /* Set default files before checking configuration */
1041 info = SILC_LOG_FILE_INFO;
1042 warning = SILC_LOG_FILE_WARNING;
1043 error = SILC_LOG_FILE_ERROR;
1044 fatal = SILC_LOG_FILE_FATAL;
1050 log = config->logging;
1052 if (!strcmp(log->logtype, SILC_CONFIG_SERVER_LF_INFO)) {
1053 info = log->filename;
1054 info_size = log->maxsize;
1056 if (!strcmp(log->logtype, SILC_CONFIG_SERVER_LF_WARNING)) {
1057 warning = log->filename;
1058 warning_size = log->maxsize;
1060 if (!strcmp(log->logtype, SILC_CONFIG_SERVER_LF_ERROR)) {
1061 error = log->filename;
1062 error_size = log->maxsize;
1064 if (!strcmp(log->logtype, SILC_CONFIG_SERVER_LF_FATAL)) {
1065 fatal = log->filename;
1066 fatal_size = log->maxsize;
1072 silc_log_set_files(info, info_size, warning, warning_size,
1073 error, error_size, fatal, fatal_size);
1076 /* Registers configured ciphers. These can then be allocated by the
1077 server when needed. */
1079 void silc_server_config_register_ciphers(SilcServerConfig config)
1081 SilcServerConfigSectionAlg *alg;
1082 SilcServer server = (SilcServer)config->server;
1084 SILC_LOG_DEBUG(("Registering configured ciphers"));
1086 alg = config->cipher;
1089 if (!alg->sim_name) {
1090 /* Crypto module is supposed to be built in. Nothing to be done
1091 here except to test that the cipher really is built in. */
1092 SilcCipher tmp = NULL;
1094 if (silc_cipher_alloc(alg->alg_name, &tmp) == FALSE) {
1095 SILC_LOG_ERROR(("Unsupported cipher `%s'", alg->alg_name));
1096 silc_server_stop(server);
1099 silc_cipher_free(tmp);
1103 /* Load (try at least) the crypto SIM module */
1104 SilcCipherObject cipher;
1105 SilcSimContext *sim;
1108 memset(&cipher, 0, sizeof(cipher));
1109 cipher.name = alg->alg_name;
1110 cipher.block_len = alg->block_len;
1111 cipher.key_len = alg->key_len * 8;
1113 sim = silc_sim_alloc();
1114 sim->type = SILC_SIM_CIPHER;
1115 sim->libname = alg->sim_name;
1117 alg_name = strdup(alg->alg_name);
1118 if (strchr(alg_name, '-'))
1119 *strchr(alg_name, '-') = '\0';
1121 if ((silc_sim_load(sim))) {
1123 silc_sim_getsym(sim, silc_sim_symname(alg_name,
1124 SILC_CIPHER_SIM_SET_KEY));
1125 SILC_LOG_DEBUG(("set_key=%p", cipher.set_key));
1126 cipher.set_key_with_string =
1127 silc_sim_getsym(sim, silc_sim_symname(alg_name,
1128 SILC_CIPHER_SIM_SET_KEY_WITH_STRING));
1129 SILC_LOG_DEBUG(("set_key_with_string=%p", cipher.set_key_with_string));
1131 silc_sim_getsym(sim, silc_sim_symname(alg_name,
1132 SILC_CIPHER_SIM_ENCRYPT_CBC));
1133 SILC_LOG_DEBUG(("encrypt_cbc=%p", cipher.encrypt));
1135 silc_sim_getsym(sim, silc_sim_symname(alg_name,
1136 SILC_CIPHER_SIM_DECRYPT_CBC));
1137 SILC_LOG_DEBUG(("decrypt_cbc=%p", cipher.decrypt));
1138 cipher.context_len =
1139 silc_sim_getsym(sim, silc_sim_symname(alg_name,
1140 SILC_CIPHER_SIM_CONTEXT_LEN));
1141 SILC_LOG_DEBUG(("context_len=%p", cipher.context_len));
1143 /* Put the SIM to the list of all SIM's in server */
1144 silc_dlist_add(server->sim, sim);
1146 silc_free(alg_name);
1148 SILC_LOG_ERROR(("Error configuring ciphers"));
1149 silc_server_stop(server);
1153 /* Register the cipher */
1154 silc_cipher_register(&cipher);
1162 /* Registers configured PKCS's. */
1163 /* XXX: This really doesn't do anything now since we have statically
1164 registered our PKCS's. This should be implemented when PKCS works
1165 as SIM's. This checks now only that the PKCS user requested is
1166 really out there. */
1168 void silc_server_config_register_pkcs(SilcServerConfig config)
1170 SilcServerConfigSectionAlg *alg = config->pkcs;
1171 SilcServer server = (SilcServer)config->server;
1172 SilcPKCS tmp = NULL;
1174 SILC_LOG_DEBUG(("Registering configured PKCS"));
1178 if (silc_pkcs_alloc(alg->alg_name, &tmp) == FALSE) {
1179 SILC_LOG_ERROR(("Unsupported PKCS `%s'", alg->alg_name));
1180 silc_server_stop(server);
1189 /* Registers configured hash functions. These can then be allocated by the
1190 server when needed. */
1192 void silc_server_config_register_hashfuncs(SilcServerConfig config)
1194 SilcServerConfigSectionAlg *alg;
1195 SilcServer server = (SilcServer)config->server;
1197 SILC_LOG_DEBUG(("Registering configured hash functions"));
1199 alg = config->hash_func;
1202 if (!alg->sim_name) {
1203 /* Hash module is supposed to be built in. Nothing to be done
1204 here except to test that the hash function really is built in. */
1205 SilcHash tmp = NULL;
1207 if (silc_hash_alloc(alg->alg_name, &tmp) == FALSE) {
1208 SILC_LOG_ERROR(("Unsupported hash function `%s'", alg->alg_name));
1209 silc_server_stop(server);
1212 silc_hash_free(tmp);
1216 /* Load (try at least) the hash SIM module */
1217 SilcHashObject hash;
1218 SilcSimContext *sim;
1220 memset(&hash, 0, sizeof(hash));
1221 hash.name = alg->alg_name;
1222 hash.block_len = alg->block_len;
1223 hash.hash_len = alg->key_len;
1225 sim = silc_sim_alloc();
1226 sim->type = SILC_SIM_HASH;
1227 sim->libname = alg->sim_name;
1229 if ((silc_sim_load(sim))) {
1231 silc_sim_getsym(sim, silc_sim_symname(alg->alg_name,
1232 SILC_HASH_SIM_INIT));
1233 SILC_LOG_DEBUG(("init=%p", hash.init));
1235 silc_sim_getsym(sim, silc_sim_symname(alg->alg_name,
1236 SILC_HASH_SIM_UPDATE));
1237 SILC_LOG_DEBUG(("update=%p", hash.update));
1239 silc_sim_getsym(sim, silc_sim_symname(alg->alg_name,
1240 SILC_HASH_SIM_FINAL));
1241 SILC_LOG_DEBUG(("final=%p", hash.final));
1243 silc_sim_getsym(sim, silc_sim_symname(alg->alg_name,
1244 SILC_HASH_SIM_CONTEXT_LEN));
1245 SILC_LOG_DEBUG(("context_len=%p", hash.context_len));
1247 /* Put the SIM to the table of all SIM's in server */
1248 silc_dlist_add(server->sim, sim);
1250 SILC_LOG_ERROR(("Error configuring hash functions"));
1251 silc_server_stop(server);
1255 /* Register the hash function */
1256 silc_hash_register(&hash);
1264 /* Registers configure HMACs. These can then be allocated by the server
1267 void silc_server_config_register_hmacs(SilcServerConfig config)
1269 SilcServerConfigSectionAlg *alg;
1270 SilcServer server = (SilcServer)config->server;
1272 SILC_LOG_DEBUG(("Registering configured HMACs"));
1274 if (!config->hmac) {
1275 SILC_LOG_ERROR(("HMACs are not configured. SILC cannot work without "
1277 silc_server_stop(server);
1283 SilcHmacObject hmac;
1285 if (!silc_hash_is_supported(alg->sim_name)) {
1286 SILC_LOG_ERROR(("Unsupported hash function `%s'", alg->sim_name));
1287 silc_server_stop(server);
1291 /* Register the HMAC */
1292 memset(&hmac, 0, sizeof(hmac));
1293 hmac.name = alg->alg_name;
1294 hmac.len = alg->key_len;
1295 silc_hmac_register(&hmac);
1301 /* Returns client authentication information from server configuration
1302 by host (name or ip). */
1304 SilcServerConfigSectionClientConnection *
1305 silc_server_config_find_client_conn(SilcServerConfig config,
1306 char *host, int port)
1309 SilcServerConfigSectionClientConnection *client = NULL;
1314 if (!config->clients)
1317 client = config->clients;
1319 for (i = 0; client; i++) {
1320 if (silc_string_compare(client->host, host))
1322 client = client->next;
1331 /* Returns server connection info from server configuartion by host
1334 SilcServerConfigSectionServerConnection *
1335 silc_server_config_find_server_conn(SilcServerConfig config,
1336 char *host, int port)
1339 SilcServerConfigSectionServerConnection *serv = NULL;
1344 if (!config->servers)
1347 serv = config->servers;
1348 for (i = 0; serv; i++) {
1349 if (silc_string_compare(serv->host, host))
1360 /* Returns router connection info from server configuartion by
1361 host (name or ip). */
1363 SilcServerConfigSectionServerConnection *
1364 silc_server_config_find_router_conn(SilcServerConfig config,
1365 char *host, int port)
1368 SilcServerConfigSectionServerConnection *serv = NULL;
1373 if (!config->routers)
1376 serv = config->routers;
1377 for (i = 0; serv; i++) {
1378 if (silc_string_compare(serv->host, host))
1389 /* Returns Admin connection configuration by host, username and/or
1392 SilcServerConfigSectionAdminConnection *
1393 silc_server_config_find_admin(SilcServerConfig config,
1394 char *host, char *username, char *nickname)
1396 SilcServerConfigSectionAdminConnection *admin = NULL;
1399 if (!config->admins)
1409 admin = config->admins;
1410 for (i = 0; admin; i++) {
1411 if (silc_string_compare(admin->host, host) &&
1412 silc_string_compare(admin->username, username) &&
1413 silc_string_compare(admin->nickname, nickname))
1416 admin = admin->next;
1425 /* Prints out example configuration file with default built in
1426 configuration values. */
1428 void silc_server_config_print()
1434 # Automatically generated example SILCd configuration file with default\n\
1435 # built in values. Use this as a guide to configure your SILCd configuration\n\
1436 # file for your system. For detailed description of different configuration\n\
1437 # sections refer to silcd(8) manual page.\n\
1452 +lassi.kuo.fi.ssh.com:10.2.1.6:Kuopio, Finland:1333
1455 +Mun huone:Mun servo:Pekka Riikonen:priikone@poseidon.pspt.fi
1458 +10.2.1.6:10.2.1.6:1333
1461 +infologfile:silcd.log:10000
1462 #+warninglogfile:/var/log/silcd_warning.log:10000
1463 #+errorlogfile:ERROR.log:10000
1464 #+fatallogfile:/var/log/silcd_error.log:
1471 +10.2.1.199:priikone:333:1
1474 +10.2.1.199:priikone:priikone:1
1484 fprintf(stdout, "%s\n", buf);