+Sun Feb 10 18:11:30 EET 2002 Pekka Riikonen <priikone@silcnet.org>
+
+ * The silc_cipher_register, silc_hash_register and
+ silc_hmac_register now checks if the object to be registered
+ is registered already. Affected files are
+ lib/silccrypt/silccipher.c, silchash.c and silchmac.c.
+
Sun Feb 10 15:48:38 EET 2002 Pekka Riikonen <priikone@silcnet.org>
* Merged new irssi from irssi.org's CVS, the version 0.7.99.
that the user has. And a local command to dump the contents of the
public key to the screen. Something like LISTKEYS, SHOWKEY...
- o We should get rid of the clientconfig.[ch] in Irssi SILC and move the
- cipher, hash, hmac and pkcs configuration to the Irssi SILC's config
- file.
-
o Extend the /HELP command to support sub commands or something. So
that user can say /help set mutual_authentication they would get
help of the mutual_authentication setting.
# default backround for "default" statusbar group
#sb_default_bg = "%4";
# background for prompt / input line
- sb_prompt_bg = "%0";
+ sb_prompt_bg = "%n";
# background for info statusbar
sb_info_bg = "%8";
# background for topicbar (same default)
--- /dev/null
+# Mail counter statusbar item
+# for irssi 0.7.99 by Timo Sirainen
+# /SET mail_ext_program - specify external mail checker program
+# /SET mail_file - specifies mbox file location
+# /SET mail_refresh_time - in seconds, how often to check for new mail
+
+use strict;
+use Irssi::TextUI;
+
+my $extprog;
+my ($last_refresh_time, $refresh_tag);
+
+# for mbox caching
+my ($last_size, $last_mtime, $last_mailcount);
+
+sub mbox_count {
+ my $mailfile = shift;
+
+ my @stat = stat($mailfile);
+ my $size = $stat[7];
+ my $mtime = $stat[9];
+
+ # if the file hasn't changed, get the count from cache
+ return $last_mailcount if ($last_size == $size && $last_mtime == $mtime);
+ $last_size = $size;
+ $last_mtime = $mtime;
+
+ my $count;
+ if ($extprog ne "") {
+ $count = `$extprog`;
+ chomp $count;
+ } else {
+ return 0 if (!open(F, $mailfile));
+
+ $count = 0;
+ while (<F>) {
+ $count++ if (/^From /);
+ $count-- if (/^Subject: .*FOLDER INTERNAL DATA/);
+ }
+ close(F);
+ }
+
+ $last_mailcount = $count;
+ return $count;
+}
+
+sub mail {
+ my ($item, $get_size_only) = @_;
+
+ my $count = mbox_count(Irssi::settings_get_str('mail_file'));
+ if ($count == 0) {
+ # no mail - don't print the [Mail: ] at all
+ if ($get_size_only) {
+ $item->{min_size} = $item->{max_size} = 0;
+ }
+ } else {
+ $item->default_handler($get_size_only, undef, $count, 1);
+ }
+}
+
+sub refresh_mail {
+ Irssi::statusbar_items_redraw('mail');
+}
+
+sub read_settings {
+ $extprog = Irssi::settings_get_str('mail_ext_program');
+ my $time = Irssi::settings_get_int('mail_refresh_time');
+ return if ($time == $last_refresh_time);
+
+ $last_refresh_time = $time;
+ Irssi::timeout_remove($refresh_tag) if ($refresh_tag);
+ $refresh_tag = Irssi::timeout_add($time*1000, 'refresh_mail', undef);
+}
+
+Irssi::settings_add_str('misc', 'mail_ext_program', '');
+Irssi::settings_add_str('misc', 'mail_file', $ENV{'MAIL'});
+Irssi::settings_add_int('misc', 'mail_refresh_time', 60);
+
+Irssi::statusbar_item_register('mail', '{sb Mail: $0-}', 'mail');
+
+read_settings();
+Irssi::signal_add('setup changed', 'read_settings');
+mbox_count(Irssi::settings_get_str('mail_file'));
+#
+# Configured servers
+#
servers = (
{ address = "silc.silcnet.org"; chatnet = SILCNet; port = 706; },
{ address = "silc.ytti.fi"; chatnet = SILCNet; port = 706; },
{ address = "silc.peelo.com"; chatnet = SILCNet; port = 706; },
);
+#
+# Configured chat networks
+#
chatnets = {
SILCNet = { type = "SILC"; };
};
+#
+# Configured channels
+#
channels = (
{ name = "#silc"; chatnet = silcnet; autojoin = No; }
);
+#
+# Your favorite aliases
+#
aliases = {
JOIN = "join -window";
QUERY = "query -window";
CALC = "exec - if which bc &>/dev/null\\; then echo '$*' | bc | awk '{print \"$*=\"$$1}'\\; else echo bc was not found\\; fi";
};
+#
+# Configuration for statusbar and other bars that appear on the screen
+#
statusbar = {
# formats:
# when using {templates}, the template is shown only if it's argument isn't
};
};
+#
+# Settings (can be changed with /SET command)
+#
+# You can set the default cipher, hash function and HMAC to be used
+# as setting as well. You can set it here or use the /SET command.
+#
+# Available ciphers are (default: aes-256-cbc):
+#
+# aes-256-cbc, aes-192-cbc, aes-128-cbc,
+# twofish-256-cbc, twofish-192-cbc, twofish-128-cbc,
+# rc6-256-cbc, rc6-192-cbc, rc6-128-cbc,
+# mars-256-cbc, mars-192-cbc, mars-128-cbc,
+# cast-256-cbc, cast-192-cbc and cast-128-cbc
+#
+# Available hash functions are (default: sha1):
+#
+# sha1 and md5
+#
+# Available HMAC's are (default: hmac-sha1-96):
+#
+# hmac-sha1-96, hmac-md5-96, hmac-sha1 and hmac-md5
+#
settings = {
+ "server" = {
+ crypto_default_cipher = "aes-256-cbc";
+ crypto_default_hash = "sha1";
+ crypto_default_hmac = "hmac-sha1-96";
+ };
"fe-common/core" = {
autocreate_own_query = "no";
use_status_window = "no";
window_set_level(window, MSGLEVEL_ALL ^
(settings_get_bool("use_msgs_window") ?
(MSGLEVEL_MSGS|MSGLEVEL_DCCMSGS) : 0));
+ window_set_immortal(window, TRUE);
}
if (settings_get_bool("use_msgs_window")) {
window = window_create(NULL, TRUE);
window_set_name(window, "(msgs)");
window_set_level(window, MSGLEVEL_MSGS|MSGLEVEL_DCCMSGS);
+ window_set_immortal(window, TRUE);
}
if (windows == NULL) {
open_log = log == NULL;
close_log = log != NULL;
} else {
- printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_NOT_TOGGLE);
+ printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, TXT_NOT_TOGGLE);
cmd_params_free(free_arg);
return;
}
static void sig_log_locked(LOG_REC *log)
{
- printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
+ printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
TXT_LOG_LOCKED, log->fname);
}
static void sig_log_create_failed(LOG_REC *log)
{
- printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
+ printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
TXT_LOG_CREATE_FAILED,
log->real_fname, g_strerror(errno));
}
{
if (settings_get_bool("autoclose_windows") && windows->next != NULL &&
window->items == NULL && window->bound_items == NULL &&
- window->level == 0)
+ window->level == 0 && !window->immortal)
window_destroy(window);
}
signal_emit("window level changed", 1, window);
}
+void window_set_immortal(WINDOW_REC *window, int immortal)
+{
+ g_return_if_fail(window != NULL);
+
+ window->immortal = immortal;
+ signal_emit("window immortal changed", 1, window);
+}
+
/* return active item's name, or if none is active, window's name */
char *window_get_active_name(WINDOW_REC *window)
{
int level; /* message level */
GSList *bound_items; /* list of WINDOW_BIND_RECs */
+ unsigned int immortal:1;
unsigned int sticky_refnum:1;
unsigned int destroying:1;
void window_set_name(WINDOW_REC *window, const char *name);
void window_set_history(WINDOW_REC *window, const char *name);
void window_set_level(WINDOW_REC *window, int level);
+void window_set_immortal(WINDOW_REC *window, int immortal);
/* return active item's name, or if none is active, window's name */
char *window_get_active_name(WINDOW_REC *window);
{ "unset_server_sticky", "Window's server isn't sticky anymore", 0 },
{ "window_name_not_unique", "Window names must be unique", 1, { 0 } },
{ "window_level", "Window level is now $0", 1, { 0 } },
+ { "window_set_immortal", "Window is now immortal", 0 },
+ { "window_unset_immortal", "Window isn't immortal anymore", 0 },
+ { "window_immortal_error", "Window is immortal, if you really want to close it, say /WINDOW IMMORTAL OFF", 0 },
{ "windowlist_header", "Ref Name Active item Server Level", 0 },
{ "windowlist_line", "$[3]0 %|$[20]1 $[15]2 $[15]3 $4", 5, { 1, 0, 0, 0, 0 } },
{ "windowlist_footer", "", 0 },
{ "window_info_refnum_sticky", "Window : {hilight #$0 (sticky)}", 1, { 1 } },
{ "window_info_name", "Name : $0", 1, { 0 } },
{ "window_info_history", "History : $0", 1, { 0 } },
+ { "window_info_immortal", "Immortal: yes", 0 },
{ "window_info_size", "Size : $0x$1", 2, { 1, 1 } },
{ "window_info_level", "Level : $0", 1, { 0 } },
{ "window_info_server", "Server : $0", 1, { 0 } },
TXT_UNSET_SERVER_STICKY,
TXT_WINDOW_NAME_NOT_UNIQUE,
TXT_WINDOW_LEVEL,
+ TXT_WINDOW_SET_IMMORTAL,
+ TXT_WINDOW_UNSET_IMMORTAL,
+ TXT_WINDOW_IMMORTAL_ERROR,
TXT_WINDOWLIST_HEADER,
TXT_WINDOWLIST_LINE,
TXT_WINDOWLIST_FOOTER,
TXT_WINDOW_INFO_REFNUM_STICKY,
TXT_WINDOW_INFO_NAME,
TXT_WINDOW_INFO_HISTORY,
+ TXT_WINDOW_INFO_IMMORTAL,
TXT_WINDOW_INFO_SIZE,
TXT_WINDOW_INFO_LEVEL,
TXT_WINDOW_INFO_SERVER,
str = g_string_new(NULL);
- last_fg = last_bg = 'n';
+ last_fg = last_bg = '\0';
while (*format != '\0') {
if (*format == '$') {
/* $variable, skrip it entirely */
TXT_WINDOW_INFO_NAME, win->name);
}
+ /* Window width / height */
+ printformat_window(win, MSGLEVEL_CLIENTCRAP, TXT_WINDOW_INFO_SIZE,
+ win->width, win->height);
+
+ /* Window immortality */
+ if (win->immortal) {
+ printformat_window(win, MSGLEVEL_CLIENTCRAP,
+ TXT_WINDOW_INFO_IMMORTAL);
+ }
+
/* Window history name */
if (win->history_name != NULL) {
printformat_window(win, MSGLEVEL_CLIENTCRAP,
TXT_WINDOW_INFO_HISTORY, win->history_name);
}
- /* Window width / height */
- printformat_window(win, MSGLEVEL_CLIENTCRAP, TXT_WINDOW_INFO_SIZE,
- win->width, win->height);
-
/* Window level */
levelstr = win->level == 0 ?
g_strdup("NONE") : bits2level(win->level);
while (destroys != NULL) {
WINDOW_REC *rec = destroys->data;
- if (windows->next != NULL)
- window_destroy(rec);
+ if (windows->next != NULL) {
+ if (!rec->immortal)
+ window_destroy(rec);
+ else {
+ printformat_window(rec, MSGLEVEL_CLIENTERROR,
+ TXT_WINDOW_IMMORTAL_ERROR);
+ }
+ }
destroys = g_slist_remove(destroys, rec);
}
g_free(level);
}
+/* SYNTAX: WINDOW IMMORTAL on|off|toggle */
+static void cmd_window_immortal(const char *data)
+{
+ int set;
+
+ if (g_strcasecmp(data, "ON") == 0)
+ set = TRUE;
+ else if (g_strcasecmp(data, "OFF") == 0)
+ set = FALSE;
+ else if (g_strcasecmp(data, "TOGGLE") == 0)
+ set = !active_win->immortal;
+ else {
+ printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, TXT_NOT_TOGGLE);
+ return;
+ }
+
+ if (set) {
+ window_set_immortal(active_win, TRUE);
+ printformat_window(active_win, MSGLEVEL_CLIENTNOTICE,
+ TXT_WINDOW_SET_IMMORTAL);
+ } else {
+ window_set_immortal(active_win, FALSE);
+ printformat_window(active_win, MSGLEVEL_CLIENTNOTICE,
+ TXT_WINDOW_UNSET_IMMORTAL);
+ }
+}
+
/* SYNTAX: WINDOW SERVER [-sticky | -unsticky] <tag> */
static void cmd_window_server(const char *data)
{
command_bind("window next", NULL, (SIGNAL_FUNC) cmd_window_next);
command_bind("window last", NULL, (SIGNAL_FUNC) cmd_window_last);
command_bind("window level", NULL, (SIGNAL_FUNC) cmd_window_level);
+ command_bind("window immortal", NULL, (SIGNAL_FUNC) cmd_window_immortal);
command_bind("window item", NULL, (SIGNAL_FUNC) cmd_window_item);
command_bind("window item prev", NULL, (SIGNAL_FUNC) cmd_window_item_prev);
command_bind("window item next", NULL, (SIGNAL_FUNC) cmd_window_item_next);
command_unbind("window next", (SIGNAL_FUNC) cmd_window_next);
command_unbind("window last", (SIGNAL_FUNC) cmd_window_last);
command_unbind("window level", (SIGNAL_FUNC) cmd_window_level);
+ command_unbind("window immortal", (SIGNAL_FUNC) cmd_window_immortal);
command_unbind("window item", (SIGNAL_FUNC) cmd_window_item);
command_unbind("window item prev", (SIGNAL_FUNC) cmd_window_item_prev);
command_unbind("window item next", (SIGNAL_FUNC) cmd_window_item_next);
window_set_refnum(window, atoi(node->key));
window->sticky_refnum = config_node_get_bool(node, "sticky_refnum", FALSE);
+ window->immortal = config_node_get_bool(node, "immortal", FALSE);
window_set_name(window, config_node_get_str(node, "name", NULL));
window_set_history(window, config_node_get_str(node, "history_name", NULL));
window_set_level(window, level2bits(config_node_get_str(node, "level", "")));
if (window->sticky_refnum)
iconfig_node_set_bool(node, "sticky_refnum", TRUE);
+ if (window->immortal)
+ iconfig_node_set_bool(node, "immortal", TRUE);
+
if (window->name != NULL)
iconfig_node_set_str(node, "name", window->name);
term_lines_empty = g_new0(char, term_height);
term_common_init();
+ g_atexit(term_deinit);
return TRUE;
}
void term_deinit(void)
{
- g_source_remove(redraw_tag);
+ if (current_term != NULL) {
+ g_source_remove(redraw_tag);
- term_common_deinit();
- terminfo_core_deinit(current_term);
+ term_common_deinit();
+ terminfo_core_deinit(current_term);
+ current_term = NULL;
+ }
}
static void term_move_real(void)
hv_store(hv, "servertag", 9, new_pv(window->servertag), 0);
hv_store(hv, "level", 5, newSViv(window->level), 0);
+ hv_store(hv, "immortal", 8, newSViv(window->immortal), 0);
hv_store(hv, "sticky_refnum", 13, newSViv(window->sticky_refnum), 0);
hv_store(hv, "data_level", 10, newSViv(window->data_level), 0);
libsilc_core_a_SOURCES = \
client_ops.c \
clientutil.c \
- clientconfig.c \
silc-channels.c \
silc-core.c \
silc-nicklist.c \
module.h \
client_ops.h \
clientutil.h \
- clientconfig.h \
silc-channels.h \
silc-core.h \
silc-nicklist.h \
+++ /dev/null
-/*
-
- serverconfig.c
-
- Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
-
- Copyright (C) 1997 - 2001 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.
-
- 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
- GNU General Public License for more details.
-
-*/
-/* $Id$ */
-
-#include "module.h"
-
-#include "net-nonblock.h"
-#include "net-sendbuffer.h"
-#include "signals.h"
-#include "servers.h"
-#include "commands.h"
-#include "levels.h"
-#include "modules.h"
-#include "rawlog.h"
-#include "misc.h"
-#include "settings.h"
-
-#include "servers-setup.h"
-
-#include "silc-servers.h"
-#include "silc-channels.h"
-#include "silc-queries.h"
-#include "window-item-def.h"
-
-#include "fe-common/core/printtext.h"
-
-/*
- All possible configuration sections for SILC client.
-*/
-SilcClientConfigSection silc_client_config_sections[] = {
- { "[cipher]",
- SILC_CLIENT_CONFIG_SECTION_TYPE_CIPHER, 4 },
- { "[pkcs]",
- SILC_CLIENT_CONFIG_SECTION_TYPE_PKCS, 1 },
- { "[hash]",
- SILC_CLIENT_CONFIG_SECTION_TYPE_HASH_FUNCTION, 4 },
- { "[hmac]",
- SILC_CLIENT_CONFIG_SECTION_TYPE_HMAC, 3 },
- { "[connection]",
- SILC_CLIENT_CONFIG_SECTION_TYPE_CONNECTION, 4 },
-
- { NULL, SILC_CLIENT_CONFIG_SECTION_TYPE_NONE, 0 }
-};
-
-/* Allocates a new configuration object, opens configuration file and
- parses the file. The parsed data is returned to the newly allocated
- configuration object. */
-
-SilcClientConfig silc_client_config_alloc(char *filename)
-{
- SilcClientConfig new;
- SilcBuffer buffer;
- SilcClientConfigParse config_parse;
- char *str;
-
- SILC_LOG_DEBUG(("Allocating new configuration object"));
-
- new = silc_calloc(1, sizeof(*new));
- new->filename = filename;
-
- /* Open configuration file and parse it */
- config_parse = NULL;
- buffer = NULL;
- str = convert_home(filename);
- silc_config_open(str, &buffer);
- g_free(str);
- if (!buffer)
- goto fail;
- if ((silc_client_config_parse(new, buffer, &config_parse)) == FALSE)
- goto fail;
- if ((silc_client_config_parse_lines(new, config_parse)) == FALSE)
- goto fail;
-
- silc_free(buffer);
-
- return new;
-
- fail:
- silc_free(new);
- return NULL;
-}
-
-/* Free's a configuration object. */
-
-void silc_client_config_free(SilcClientConfig config)
-{
- if (config) {
-
- silc_free(config);
- }
-}
-
-/* Parses the the buffer and returns the parsed lines into return_config
- argument. The return_config argument doesn't have to be initialized
- before calling this. It will be initialized during the parsing. The
- buffer sent as argument can be safely free'd after this function has
- succesfully returned. */
-
-int silc_client_config_parse(SilcClientConfig config, SilcBuffer buffer,
- SilcClientConfigParse *return_config)
-{
- int i, begin;
- int linenum;
- char line[1024], *cp;
- SilcClientConfigSection *cptr = NULL;
- SilcClientConfigParse parse = *return_config, first = NULL;
-
- SILC_LOG_DEBUG(("Parsing configuration file"));
-
- begin = 0;
- linenum = 0;
- while((begin = silc_gets(line, sizeof(line),
- buffer->data, buffer->len, begin)) != EOF) {
- cp = line;
- linenum++;
-
- /* Check for bad line */
- if (silc_check_line(cp))
- continue;
-
- /* Remove tabs and whitespaces from the line */
- if (strchr(cp, '\t')) {
- i = 0;
- while(strchr(cp + i, '\t')) {
- *strchr(cp + i, '\t') = ' ';
- i++;
- }
- }
- for (i = 0; i < strlen(cp); i++) {
- if (cp[i] != ' ') {
- if (i)
- cp++;
- break;
- }
- cp++;
- }
-
- /* Parse line */
- switch(cp[0]) {
- case '[':
- /*
- * Start of a section
- */
-
- /* Remove new line sign */
- if (strchr(cp, '\n'))
- *strchr(cp, '\n') = '\0';
-
- /* Check for matching sections */
- for (cptr = silc_client_config_sections; cptr->section; cptr++)
- if (!strncasecmp(cp, cptr->section, strlen(cptr->section)))
- break;
-
- if (!cptr->section) {
- fprintf(stderr, "%s:%d: Unknown section `%s'\n",
- config->filename, linenum, cp);
- return FALSE;
- }
-
- break;
- default:
- /*
- * Start of a configuration line
- */
-
- if (!cptr) {
- fprintf(stderr, "%s:%d: Unknown start of a section `%s'\n",
- config->filename, linenum, cp);
- return FALSE;
- }
-
- /* Handle config section */
- if (cptr->type != SILC_CLIENT_CONFIG_SECTION_TYPE_NONE) {
-
- if (strchr(cp, '\n'))
- *strchr(cp, '\n') = ':';
-
- if (parse == NULL) {
- parse = silc_calloc(1, sizeof(*parse));
- parse->line = NULL;
- parse->section = NULL;
- parse->next = NULL;
- parse->prev = NULL;
- } else {
- if (parse->next == NULL) {
- parse->next = silc_calloc(1, sizeof(*parse->next));
- parse->next->line = NULL;
- parse->next->section = NULL;
- parse->next->next = NULL;
- parse->next->prev = parse;
- parse = parse->next;
- }
- }
-
- if (first == NULL)
- first = parse;
-
- /* Add the line to parsing structure for further parsing. */
- if (parse) {
- parse->section = cptr;
- parse->line = silc_buffer_alloc(strlen(cp) + 1);
- parse->linenum = linenum;
- silc_buffer_pull_tail(parse->line, strlen(cp));
- silc_buffer_put(parse->line, cp, strlen(cp));
- }
- }
- break;
- }
- }
-
- /* Set the return_config argument to its first value so that further
- parsing can be started from the first line. */
- *return_config = first;
-
- return TRUE;
-}
-
-/* Parses the lines earlier read from configuration file. The config object
- must not be initialized, it will be initialized in this function. The
- parse_config argument is uninitialized automatically during this
- function. */
-
-int silc_client_config_parse_lines(SilcClientConfig config,
- SilcClientConfigParse parse_config)
-{
- int ret, check = FALSE;
- char *tmp;
- SilcClientConfigParse pc = parse_config;
- SilcBuffer line;
-
- SILC_LOG_DEBUG(("Parsing configuration lines"));
-
- if (!config)
- return FALSE;
-
- while(pc) {
- check = FALSE;
- line = pc->line;
-
- /* Get number of tokens in line (command section is handeled
- specially and has no tokens at all). */
- ret = silc_config_check_num_token(line);
- if (ret != pc->section->maxfields) {
- /* Bad line */
- fprintf(stderr, "%s:%d: Missing tokens, %d tokens (should be %d)\n",
- config->filename, pc->linenum, ret,
- pc->section->maxfields);
- break;
- }
-
- /* Parse the line */
- switch(pc->section->type) {
- case SILC_CLIENT_CONFIG_SECTION_TYPE_CIPHER:
-
- if (!config->cipher) {
- config->cipher = silc_calloc(1, sizeof(*config->cipher));
- config->cipher->next = NULL;
- config->cipher->prev = NULL;
- } else {
- if (!config->cipher->next) {
- config->cipher->next =
- silc_calloc(1, sizeof(*config->cipher->next));
- config->cipher->next->next = NULL;
- config->cipher->next->prev = config->cipher;
- config->cipher = config->cipher->next;
- }
- }
-
- /* Get cipher name */
- ret = silc_config_get_token(line, &config->cipher->alg_name);
- if (ret < 0)
- break;
- if (ret == 0) {
- fprintf(stderr, "%s:%d: Cipher name not defined\n",
- config->filename, pc->linenum);
- break;
- }
-
- /* Get module name */
- config->cipher->sim_name = NULL;
- ret = silc_config_get_token(line, &config->cipher->sim_name);
- if (ret < 0)
- break;
-
- /* Get key length */
- ret = silc_config_get_token(line, &tmp);
- if (ret < 0)
- break;
- if (ret == 0) {
- fprintf(stderr, "%s:%d: Cipher key length not defined\n",
- config->filename, pc->linenum);
- break;
- }
- config->cipher->key_len = atoi(tmp);
- silc_free(tmp);
-
- /* Get block length */
- ret = silc_config_get_token(line, &tmp);
- if (ret < 0)
- break;
- if (ret == 0) {
- fprintf(stderr, "%s:%d: Cipher block length not defined\n",
- config->filename, pc->linenum);
- break;
- }
- config->cipher->block_len = atoi(tmp);
- silc_free(tmp);
-
- check = TRUE;
- break;
-
- case SILC_CLIENT_CONFIG_SECTION_TYPE_PKCS:
-
- if (!config->pkcs) {
- config->pkcs = silc_calloc(1, sizeof(*config->pkcs));
- config->pkcs->next = NULL;
- config->pkcs->prev = NULL;
- } else {
- if (!config->pkcs->next) {
- config->pkcs->next =
- silc_calloc(1, sizeof(*config->pkcs->next));
- config->pkcs->next->next = NULL;
- config->pkcs->next->prev = config->pkcs;
- config->pkcs = config->pkcs->next;
- }
- }
-
- /* Get PKCS name */
- ret = silc_config_get_token(line, &config->pkcs->alg_name);
- if (ret < 0)
- break;
- if (ret == 0) {
- fprintf(stderr, "%s:%d: PKCS name not defined\n",
- config->filename, pc->linenum);
- break;
- }
-
- check = TRUE;
- break;
-
- case SILC_CLIENT_CONFIG_SECTION_TYPE_HASH_FUNCTION:
-
- if (!config->hash_func) {
- config->hash_func = silc_calloc(1, sizeof(*config->hash_func));
- config->hash_func->next = NULL;
- config->hash_func->prev = NULL;
- } else {
- if (!config->hash_func->next) {
- config->hash_func->next =
- silc_calloc(1, sizeof(*config->hash_func->next));
- config->hash_func->next->next = NULL;
- config->hash_func->next->prev = config->hash_func;
- config->hash_func = config->hash_func->next;
- }
- }
-
- /* Get Hash function name */
- ret = silc_config_get_token(line, &config->hash_func->alg_name);
- if (ret < 0)
- break;
- if (ret == 0) {
- fprintf(stderr, "%s:%d: Hash function name not defined\n",
- config->filename, pc->linenum);
- break;
- }
-
- /* Get Hash function module name */
- config->hash_func->sim_name = NULL;
- ret = silc_config_get_token(line, &config->hash_func->sim_name);
- if (ret < 0)
- break;
-
- /* Get block length */
- ret = silc_config_get_token(line, &tmp);
- if (ret < 0)
- break;
- if (ret == 0) {
- fprintf(stderr, "%s:%d: Hash function block length not defined\n",
- config->filename, pc->linenum);
- break;
- }
- config->hash_func->block_len = atoi(tmp);
- silc_free(tmp);
-
- /* Get hash length */
- ret = silc_config_get_token(line, &tmp);
- if (ret < 0)
- break;
- if (ret == 0) {
- fprintf(stderr, "%s:%d: Hash function hash length not defined\n",
- config->filename, pc->linenum);
- break;
- }
- config->hash_func->key_len = atoi(tmp);
- silc_free(tmp);
-
- check = TRUE;
- break;
-
- case SILC_CLIENT_CONFIG_SECTION_TYPE_HMAC:
-
- if (!config->hmac) {
- config->hmac = silc_calloc(1, sizeof(*config->hmac));
- config->hmac->next = NULL;
- config->hmac->prev = NULL;
- } else {
- if (!config->hmac->next) {
- config->hmac->next =
- silc_calloc(1, sizeof(*config->hmac->next));
- config->hmac->next->next = NULL;
- config->hmac->next->prev = config->hmac;
- config->hmac = config->hmac->next;
- }
- }
-
- /* Get HMAC name */
- ret = silc_config_get_token(line, &config->hmac->alg_name);
- if (ret < 0)
- break;
- if (ret == 0) {
- fprintf(stderr, "%s:%d: HMAC name not defined\n",
- config->filename, pc->linenum);
- break;
- }
-
- /* Get Hash function name */
- ret = silc_config_get_token(line, &config->hmac->sim_name);
- if (ret < 0)
- break;
- if (ret == 0) {
- fprintf(stderr, "%s:%d: Hash function name not defined\n",
- config->filename, pc->linenum);
- break;
- }
-
- /* Get MAC length */
- ret = silc_config_get_token(line, &tmp);
- if (ret < 0)
- break;
- if (ret == 0) {
- fprintf(stderr, "%s:%d: HMAC's MAC length not defined\n",
- config->filename, pc->linenum);
- break;
- }
- config->hmac->key_len = atoi(tmp);
- silc_free(tmp);
-
- check = TRUE;
- break;
-
- case SILC_CLIENT_CONFIG_SECTION_TYPE_CONNECTION:
-
- if (!config->conns) {
- config->conns = silc_calloc(1, sizeof(*config->conns));
- config->conns->next = NULL;
- config->conns->prev = NULL;
- } else {
- if (!config->conns->next) {
- config->conns->next = silc_calloc(1, sizeof(*config->conns));
- config->conns->next->next = NULL;
- config->conns->next->prev = config->conns;
- config->conns = config->conns->next;
- }
- }
-
- /* Get host */
- ret = silc_config_get_token(line, &config->conns->host);
- if (ret < 0)
- break;
- if (ret == 0)
- /* Any host */
- config->conns->host = strdup("*");
-
- /* Get authentication method */
- ret = silc_config_get_token(line, &tmp);
- if (ret < 0)
- break;
- if (ret) {
- if (strcmp(tmp, SILC_CLIENT_CONFIG_AUTH_METH_PASSWD) &&
- strcmp(tmp, SILC_CLIENT_CONFIG_AUTH_METH_PUBKEY)) {
- fprintf(stderr, "%s:%d: Unknown authentication method '%s'\n",
- config->filename, pc->linenum, tmp);
- break;
- }
-
- if (!strcmp(tmp, SILC_CLIENT_CONFIG_AUTH_METH_PASSWD))
- config->conns->auth_meth = SILC_AUTH_PASSWORD;
-
- if (!strcmp(tmp, SILC_CLIENT_CONFIG_AUTH_METH_PUBKEY))
- config->conns->auth_meth = SILC_AUTH_PUBLIC_KEY;
-
- silc_free(tmp);
- }
-
- /* Get authentication data */
- ret = silc_config_get_token(line, &config->conns->auth_data);
- if (ret < 0)
- break;
-
- /* Get port */
- ret = silc_config_get_token(line, &tmp);
- if (ret < 0)
- break;
- if (ret) {
- config->conns->port = atoi(tmp);
- silc_free(tmp);
- }
-
- check = TRUE;
- break;
-
- case SILC_CLIENT_CONFIG_SECTION_TYPE_NONE:
- default:
- break;
- }
-
- /* Check for error */
- if (check == FALSE) {
- /* Line could not be parsed */
- fprintf(stderr, "%s:%d: Parse error\n", config->filename, pc->linenum);
- break;
- }
-
- pc = pc->next;
- }
-
- if (check == FALSE)
- return FALSE;;
-
- /* Before returning all the lists in the config object must be set
- to their first values (the last value is first here). */
- while (config->cipher && config->cipher->prev)
- config->cipher = config->cipher->prev;
- while (config->pkcs && config->pkcs->prev)
- config->pkcs = config->pkcs->prev;
- while (config->hash_func && config->hash_func->prev)
- config->hash_func = config->hash_func->prev;
- while (config->hmac && config->hmac->prev)
- config->hmac = config->hmac->prev;
- while (config->conns && config->conns->prev)
- config->conns = config->conns->prev;
-
- SILC_LOG_DEBUG(("Done"));
-
- return TRUE;
-}
-
-/* Registers configured ciphers. These can then be allocated by the
- client when needed. */
-
-bool silc_client_config_register_ciphers(SilcClientConfig config)
-{
- SilcClientConfigSectionAlg *alg;
- SilcClient client = config->client;
-
- SILC_LOG_DEBUG(("Registering configured ciphers"));
-
- if (!config->cipher)
- return FALSE;
-
- alg = config->cipher;
- while(alg) {
-
- if (!alg->sim_name) {
- /* Crypto module is supposed to be built in. Get the pointer to the
- built in cipher and register it. */
- int i;
-
- for (i = 0; silc_default_ciphers[i].name; i++)
- if (!strcmp(silc_default_ciphers[i].name, alg->alg_name)) {
- silc_cipher_register(&silc_default_ciphers[i]);
- break;
- }
-
- if (!silc_cipher_is_supported(alg->alg_name)) {
- SILC_LOG_ERROR(("Unknown cipher `%s'", alg->alg_name));
- silc_client_stop(client);
- exit(1);
- }
-
-#ifdef SILC_SIM
- } else {
- /* Load (try at least) the crypto SIM module */
- SilcCipherObject cipher;
- SilcSimContext *sim;
- char *alg_name;
-
- memset(&cipher, 0, sizeof(cipher));
- cipher.name = alg->alg_name;
- cipher.block_len = alg->block_len;
- cipher.key_len = alg->key_len * 8;
-
- sim = silc_sim_alloc();
- sim->type = SILC_SIM_CIPHER;
- sim->libname = alg->sim_name;
-
- alg_name = strdup(alg->alg_name);
- if (strchr(alg_name, '-'))
- *strchr(alg_name, '-') = '\0';
-
- if ((silc_sim_load(sim))) {
- cipher.set_key =
- silc_sim_getsym(sim, silc_sim_symname(alg_name,
- SILC_CIPHER_SIM_SET_KEY));
- SILC_LOG_DEBUG(("set_key=%p", cipher.set_key));
- cipher.set_key_with_string =
- silc_sim_getsym(sim, silc_sim_symname(alg_name,
- SILC_CIPHER_SIM_SET_KEY_WITH_STRING));
- SILC_LOG_DEBUG(("set_key_with_string=%p", cipher.set_key_with_string));
- cipher.encrypt =
- silc_sim_getsym(sim, silc_sim_symname(alg_name,
- SILC_CIPHER_SIM_ENCRYPT_CBC));
- SILC_LOG_DEBUG(("encrypt_cbc=%p", cipher.encrypt));
- cipher.decrypt =
- silc_sim_getsym(sim, silc_sim_symname(alg_name,
- SILC_CIPHER_SIM_DECRYPT_CBC));
- SILC_LOG_DEBUG(("decrypt_cbc=%p", cipher.decrypt));
- cipher.context_len =
- silc_sim_getsym(sim, silc_sim_symname(alg_name,
- SILC_CIPHER_SIM_CONTEXT_LEN));
- SILC_LOG_DEBUG(("context_len=%p", cipher.context_len));
-
- /* Put the SIM to the table of all SIM's in client */
- sims = silc_realloc(sims,
- sizeof(*sims) *
- (sims_count + 1));
- sims[sims_count] = sim;
- sims_count++;
-
- silc_free(alg_name);
- } else {
- SILC_LOG_ERROR(("Error configuring ciphers"));
- silc_client_stop(client);
- exit(1);
- }
-
- /* Register the cipher */
- silc_cipher_register(&cipher);
-#endif
- }
-
- alg = alg->next;
- }
-
- return TRUE;
-}
-
-/* Registers configured PKCS's. */
-
-bool silc_client_config_register_pkcs(SilcClientConfig config)
-{
- SilcClientConfigSectionAlg *alg = config->pkcs;
- SilcClient client = config->client;
-
- SILC_LOG_DEBUG(("Registering configured PKCS"));
-
- if (!alg)
- return FALSE;
-
- while(alg) {
- int i;
-
- for (i = 0; silc_default_pkcs[i].name; i++)
- if (!strcmp(silc_default_pkcs[i].name, alg->alg_name)) {
- silc_pkcs_register(&silc_default_pkcs[i]);
- break;
- }
-
- if (!silc_pkcs_is_supported(alg->alg_name)) {
- SILC_LOG_ERROR(("Unknown PKCS `%s'", alg->alg_name));
- silc_client_stop(client);
- exit(1);
- }
-
- alg = alg->next;
- }
-
- return TRUE;
-}
-
-/* Registers configured hash funtions. These can then be allocated by the
- client when needed. */
-
-bool silc_client_config_register_hashfuncs(SilcClientConfig config)
-{
- SilcClientConfigSectionAlg *alg;
- SilcClient client = config->client;
-
- SILC_LOG_DEBUG(("Registering configured hash functions"));
-
- if (!config->hash_func)
- return FALSE;
-
- alg = config->hash_func;
- while(alg) {
- if (!alg->sim_name) {
- int i;
-
- for (i = 0; silc_default_hash[i].name; i++)
- if (!strcmp(silc_default_hash[i].name, alg->alg_name)) {
- silc_hash_register(&silc_default_hash[i]);
- break;
- }
-
- if (!silc_hash_is_supported(alg->alg_name)) {
- SILC_LOG_ERROR(("Unknown hash function `%s'", alg->alg_name));
- silc_client_stop(client);
- exit(1);
- }
-#ifdef SILC_SIM
- } else {
- /* Load (try at least) the hash SIM module */
- SilcHashObject hash;
- SilcSimContext *sim;
-
- memset(&hash, 0, sizeof(hash));
- hash.name = alg->alg_name;
- hash.block_len = alg->block_len;
- hash.hash_len = alg->key_len;
-
- sim = silc_sim_alloc();
- sim->type = SILC_SIM_HASH;
- sim->libname = alg->sim_name;
-
- if ((silc_sim_load(sim))) {
- hash.init =
- silc_sim_getsym(sim, silc_sim_symname(alg->alg_name,
- SILC_HASH_SIM_INIT));
- SILC_LOG_DEBUG(("init=%p", hash.init));
- hash.update =
- silc_sim_getsym(sim, silc_sim_symname(alg->alg_name,
- SILC_HASH_SIM_UPDATE));
- SILC_LOG_DEBUG(("update=%p", hash.update));
- hash.final =
- silc_sim_getsym(sim, silc_sim_symname(alg->alg_name,
- SILC_HASH_SIM_FINAL));
- SILC_LOG_DEBUG(("final=%p", hash.final));
- hash.context_len =
- silc_sim_getsym(sim, silc_sim_symname(alg->alg_name,
- SILC_HASH_SIM_CONTEXT_LEN));
- SILC_LOG_DEBUG(("context_len=%p", hash.context_len));
-
- /* Put the SIM to the table of all SIM's in client */
- sims = silc_realloc(sims,
- sizeof(*sims) *
- (sims_count + 1));
- sims[sims_count] = sim;
- sims_count++;
- } else {
- SILC_LOG_ERROR(("Error configuring hash functions"));
- silc_client_stop(client);
- exit(1);
- }
-
- /* Register the hash function */
- silc_hash_register(&hash);
-#endif
- }
- alg = alg->next;
- }
-
- return TRUE;
-}
-
-/* Registers configured HMACs. These can then be allocated by the
- client when needed. */
-
-bool silc_client_config_register_hmacs(SilcClientConfig config)
-{
- SilcClientConfigSectionAlg *alg;
- SilcClient client = config->client;
-
- SILC_LOG_DEBUG(("Registering configured HMACs"));
-
- if (!config->hmac)
- return FALSE;
-
- alg = config->hmac;
- while(alg) {
- SilcHmacObject hmac;
-
- if (!silc_hash_is_supported(alg->sim_name)) {
- SILC_LOG_ERROR(("Unknown hash function `%s' for HMAC `%s'",
- alg->sim_name, alg->alg_name));
- silc_client_stop(client);
- exit(1);
- }
-
- /* Register the HMAC */
- memset(&hmac, 0, sizeof(hmac));
- hmac.name = alg->alg_name;
- hmac.len = alg->key_len;
- silc_hmac_register(&hmac);
-
- alg = alg->next;
- }
-
- return TRUE;
-}
-
-SilcClientConfigSectionConnection *
-silc_client_config_find_connection(SilcClientConfig config,
- char *host, int port)
-{
- int i;
- SilcClientConfigSectionConnection *conn = NULL;
-
- SILC_LOG_DEBUG(("Finding connection"));
-
- if (!host)
- return NULL;
-
- if (!config->conns)
- return NULL;
-
- conn = config->conns;
- for (i = 0; conn; i++) {
- if (silc_string_compare(conn->host, host))
- break;
- conn = conn->next;
- }
-
- if (!conn)
- return NULL;
-
- SILC_LOG_DEBUG(("Found match"));
-
- return conn;
-}
+++ /dev/null
-/*
-
- clientconfig.h
-
- Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
-
- Copyright (C) 1997 - 2000 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.
-
- 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
- GNU General Public License for more details.
-
-*/
-
-#ifndef CLIENTCONFIG_H
-#define CLIENTCONFIG_H
-
-/* Holds information of configured algorithms */
-typedef struct SilcClientConfigSectionAlgStruct {
- char *alg_name;
- char *sim_name;
- uint32 block_len;
- uint32 key_len;
- struct SilcClientConfigSectionAlgStruct *next;
- struct SilcClientConfigSectionAlgStruct *prev;
-#define SILC_CLIENT_CONFIG_MODNAME "builtin"
-} SilcClientConfigSectionAlg;
-
-/* Holds all server connections from config file */
-typedef struct SilcClientConfigSectionConnectionStruct {
- char *host;
- int auth_meth;
- char *auth_data;
- uint16 port;
- struct SilcClientConfigSectionConnectionStruct *next;
- struct SilcClientConfigSectionConnectionStruct *prev;
-#define SILC_CLIENT_CONFIG_AUTH_METH_PASSWD "passwd"
-#define SILC_CLIENT_CONFIG_AUTH_METH_PUBKEY "pubkey"
-} SilcClientConfigSectionConnection;
-
-/*
- SILC Client Config object.
-
- This object holds all the data parsed from the SILC client configuration
- file. This is mainly used at the initialization of the client.
-
-*/
-typedef struct {
- /* Pointer back to the client */
- void *client;
-
- /* Filename of the configuration file */
- char *filename;
-
- /* Configuration sections */
- SilcClientConfigSectionAlg *cipher;
- SilcClientConfigSectionAlg *pkcs;
- SilcClientConfigSectionAlg *hash_func;
- SilcClientConfigSectionAlg *hmac;
- SilcClientConfigSectionConnection *conns;
-} SilcClientConfigObject;
-
-typedef SilcClientConfigObject *SilcClientConfig;
-
-/* Configuration section type enumerations. */
-typedef enum {
- SILC_CLIENT_CONFIG_SECTION_TYPE_NONE = 0,
- SILC_CLIENT_CONFIG_SECTION_TYPE_CIPHER,
- SILC_CLIENT_CONFIG_SECTION_TYPE_PKCS,
- SILC_CLIENT_CONFIG_SECTION_TYPE_HASH_FUNCTION,
- SILC_CLIENT_CONFIG_SECTION_TYPE_HMAC,
- SILC_CLIENT_CONFIG_SECTION_TYPE_CONNECTION,
-} SilcClientConfigSectionType;
-
-/* SILC Configuration Section structure. */
-typedef struct {
- const char *section;
- SilcClientConfigSectionType type;
- int maxfields;
-} SilcClientConfigSection;
-
-/* List of all possible config sections in SILC client */
-extern SilcClientConfigSection silc_client_config_sections[];
-
-/* Structure used in parsing the configuration lines. The line is read
- from a file to this structure before parsing it further. */
-typedef struct SilcClientConfigParseStruct {
- SilcBuffer line;
- int linenum;
- SilcClientConfigSection *section;
- struct SilcClientConfigParseStruct *next;
- struct SilcClientConfigParseStruct *prev;
-} *SilcClientConfigParse;
-
-/* Prototypes */
-SilcClientConfig silc_client_config_alloc(char *filename);
-void silc_client_config_free(SilcClientConfig config);
-int silc_client_config_parse(SilcClientConfig config, SilcBuffer buffer,
- SilcClientConfigParse *return_config);
-int silc_client_config_parse_lines(SilcClientConfig config,
- SilcClientConfigParse parse_config);
-int silc_client_config_check_sections(uint32 checkmask);
-void silc_client_config_setlogfiles(SilcClientConfig config);
-bool silc_client_config_register_ciphers(SilcClientConfig config);
-bool silc_client_config_register_pkcs(SilcClientConfig config);
-bool silc_client_config_register_hashfuncs(SilcClientConfig config);
-bool silc_client_config_register_hmacs(SilcClientConfig config);
-SilcClientConfigSectionConnection *
-silc_client_config_find_connection(SilcClientConfig config,
- char *host, int port);
-
-#endif
static void silc_channels_join(SILC_SERVER_REC *server,
const char *channels, int automatic)
{
- char **list, **tmp, *channel;
+ char **list, **tmp;
SILC_CHANNEL_REC *chanrec;
list = g_strsplit(channels, ",", -1);
for (tmp = list; *tmp != NULL; tmp++) {
- channel = **tmp == '#' ? g_strdup(*tmp) :
- g_strconcat("#", *tmp, NULL);
-
- chanrec = silc_channel_find(server, channel);
- if (chanrec) {
- g_free(channel);
+ chanrec = silc_channel_find(server, *tmp);
+ if (chanrec)
continue;
- }
- silc_command_exec(server, "JOIN", channel);
- g_free(channel);
+ silc_command_exec(server, "JOIN", *tmp);
}
g_strfreev(list);
printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
SILCTXT_KEY_AGREEMENT, argv[2]);
internal->responder = TRUE;
- silc_client_send_key_agreement(silc_client, conn, client_entry, hostname,
- bindhost, port, 120, keyagr_completion,
- internal);
+ silc_client_send_key_agreement(
+ silc_client, conn, client_entry, hostname,
+ bindhost, port,
+ settings_get_int("key_exchange_timeout_secs"),
+ keyagr_completion, internal);
if (!hostname)
silc_free(internal);
goto out;
static void silc_register_cipher(SilcClient client, const char *cipher)
{
int i;
-
- for (i = 0; silc_default_ciphers[i].name; i++)
- if (!strcmp(silc_default_ciphers[i].name, cipher)) {
- silc_cipher_register(&silc_default_ciphers[i]);
- break;
- }
- if (!silc_cipher_is_supported(cipher)) {
- SILC_LOG_ERROR(("Unknown cipher `%s'", cipher));
- exit(1);
+ if (cipher) {
+ for (i = 0; silc_default_ciphers[i].name; i++)
+ if (!strcmp(silc_default_ciphers[i].name, cipher)) {
+ silc_cipher_register(&silc_default_ciphers[i]);
+ break;
+ }
+
+ if (!silc_cipher_is_supported(cipher)) {
+ SILC_LOG_ERROR(("Unknown cipher `%s'", cipher));
+ exit(1);
+ }
}
+
+ /* Register other defaults */
+ silc_cipher_register_default();
}
static void silc_register_hash(SilcClient client, const char *hash)
{
int i;
-
- for (i = 0; silc_default_hash[i].name; i++)
- if (!strcmp(silc_default_hash[i].name, hash)) {
- silc_hash_register(&silc_default_hash[i]);
- break;
+
+ if (hash) {
+ for (i = 0; silc_default_hash[i].name; i++)
+ if (!strcmp(silc_default_hash[i].name, hash)) {
+ silc_hash_register(&silc_default_hash[i]);
+ break;
+ }
+
+ if (!silc_hash_is_supported(hash)) {
+ SILC_LOG_ERROR(("Unknown hash function `%s'", hash));
+ exit(1);
}
-
- if (!silc_hash_is_supported(hash)) {
- SILC_LOG_ERROR(("Unknown hash function `%s'", hash));
- exit(1);
}
+
+ /* Register other defaults */
+ silc_hash_register_default();
}
static void silc_register_hmac(SilcClient client, const char *hmac)
{
int i;
-
- for (i = 0; silc_default_hmacs[i].name; i++)
- if (!strcmp(silc_default_hmacs[i].name, hmac)) {
- silc_hmac_register(&silc_default_hmacs[i]);
- break;
+
+ if (hmac) {
+ for (i = 0; silc_default_hmacs[i].name; i++)
+ if (!strcmp(silc_default_hmacs[i].name, hmac)) {
+ silc_hmac_register(&silc_default_hmacs[i]);
+ break;
+ }
+
+ if (!silc_hmac_is_supported(hmac)) {
+ SILC_LOG_ERROR(("Unknown HMAC `%s'", hmac));
+ exit(1);
}
-
- if (!silc_hmac_is_supported(hmac)) {
- SILC_LOG_ERROR(("Unknown HMAC `%s'", hmac));
- exit(1);
}
+
+ /* Register other defaults */
+ silc_hmac_register_default();
}
/* Finalize init. Init finish signal calls this. */
#endif
}
- /* Do some irssi initializing */
+ /* Settings */
settings_add_bool("server", "skip_motd", FALSE);
settings_add_str("server", "alternate_nick", NULL);
-
- /* Initialize the auto_addr variables Is "server" the best choice for
- * this? No existing category seems to apply.
- */
settings_add_bool("server", "use_auto_addr", FALSE);
settings_add_str("server", "auto_bind_ip", "");
settings_add_str("server", "auto_public_ip", "");
settings_add_int("server", "auto_bind_port", 0);
-
+ settings_add_str("server", "crypto_default_cipher", SILC_DEFAULT_CIPHER);
+ settings_add_str("server", "crypto_default_hash", SILC_DEFAULT_HASH);
+ settings_add_str("server", "crypto_default_hmac", SILC_DEFAULT_HMAC);
+ settings_add_int("server", "key_exchange_timeout_secs", 120);
+ settings_add_int("server", "key_exchange_rekey_secs", 3600);
+ settings_add_int("server", "connauth_request_secs", 2);
+
silc_init_userinfo();
/* Initialize client parameters */
memset(¶ms, 0, sizeof(params));
strcat(params.nickname_format, "%n@%h%a");
params.nickname_parse = silc_nickname_format_parse;
+ params.rekey_secs = settings_get_int("key_exchange_rekey_secs");
+ params.connauth_request_secs = settings_get_int("connauth_request_secs");
/* Allocate SILC client */
silc_client = silc_client_alloc(&ops, ¶ms, NULL, silc_version_string);
- /* Crypto settings */
- settings_add_str("server", "crypto_default_cipher", "aes-256-cbc");
- settings_add_str("server", "crypto_default_hash", "sha1");
- settings_add_str("server", "crypto_default_hmac", "hmac-sha1-96");
-
/* Get the ciphers and stuff from config file */
def_cipher = settings_get_str("crypto_default_cipher");
def_hash = settings_get_str("crypto_default_hash");
#ifndef __SILC_CORE_H
#define __SILC_CORE_H
-#include "clientconfig.h"
#include "clientutil.h"
/* Default client configuration file. This can be overridden at the
#define SILC_CLIENT_DEF_PKCS_LEN 1024
extern SilcClient silc_client;
-extern SilcClientConfig silc_config;
#ifdef SILC_SIM
/* SIM (SILC Module) table */
SILC_LOG_DEBUG(("Registering new cipher `%s'", cipher->name));
+ /* Check if exists already */
+ if (silc_cipher_list) {
+ SilcCipherObject *entry;
+ silc_dlist_start(silc_cipher_list);
+ while ((entry = silc_dlist_get(silc_cipher_list)) != SILC_LIST_END) {
+ if (!strcmp(entry->name, cipher->name))
+ return FALSE;
+ }
+ }
+
new = silc_calloc(1, sizeof(*new));
new->name = strdup(cipher->name);
new->block_len = cipher->block_len;
SILC_LOG_DEBUG(("Registering new hash function `%s'", hash->name));
+ /* Check for existing */
+ if (silc_hash_list) {
+ SilcHashObject *entry;
+ silc_dlist_start(silc_hash_list);
+ while ((entry = silc_dlist_get(silc_hash_list)) != SILC_LIST_END) {
+ if (!strcmp(entry->name, hash->name))
+ return FALSE;
+ }
+ }
+
new = silc_calloc(1, sizeof(*new));
new->name = strdup(hash->name);
new->hash_len = hash->hash_len;
SILC_LOG_DEBUG(("Registering new HMAC `%s'", hmac->name));
+ /* Check for existing */
+ if (silc_hmac_list) {
+ SilcHmacObject *entry;
+ silc_dlist_start(silc_hmac_list);
+ while ((entry = silc_dlist_get(silc_hmac_list)) != SILC_LIST_END) {
+ if (!strcmp(entry->name, hmac->name))
+ return FALSE;
+ }
+ }
+
new = silc_calloc(1, sizeof(*new));
new->name = strdup(hmac->name);
new->len = hmac->len;
*
* NAME
*
- * typedef enum { ... } SilcTaskPriority
+ * typedef enum { ... } SilcTaskPriority;
*
* DESCRIPTION
*