From: Pekka Riikonen Date: Sun, 10 Feb 2002 16:01:06 +0000 (+0000) Subject: updates. X-Git-Tag: 1.2.beta1~1654 X-Git-Url: http://git.silcnet.org/gitweb/?p=crypto.git;a=commitdiff_plain;h=607d47fbea56cf5c85361e476abf81638a5f5f64 updates. --- diff --git a/CHANGES b/CHANGES index 4ba77bb0..65d6f219 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,10 @@ +Sun Feb 10 18:11:30 EET 2002 Pekka Riikonen + + * 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 * Merged new irssi from irssi.org's CVS, the version 0.7.99. diff --git a/TODO b/TODO index d4d58361..85ef2561 100644 --- a/TODO +++ b/TODO @@ -15,10 +15,6 @@ TODO/bugs in Irssi SILC client 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. diff --git a/apps/irssi/default.theme b/apps/irssi/default.theme index 427f7f59..9ffec4b7 100644 --- a/apps/irssi/default.theme +++ b/apps/irssi/default.theme @@ -238,7 +238,7 @@ abstracts = { # 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) diff --git a/apps/irssi/scripts/mail.pl b/apps/irssi/scripts/mail.pl new file mode 100644 index 00000000..2d11a46f --- /dev/null +++ b/apps/irssi/scripts/mail.pl @@ -0,0 +1,83 @@ +# 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 () { + $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')); diff --git a/apps/irssi/silc.conf b/apps/irssi/silc.conf index f9f10528..3439e3c9 100644 --- a/apps/irssi/silc.conf +++ b/apps/irssi/silc.conf @@ -1,17 +1,29 @@ +# +# 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"; @@ -54,6 +66,9 @@ aliases = { 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 @@ -159,7 +174,34 @@ statusbar = { }; }; +# +# 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"; diff --git a/apps/irssi/src/fe-common/core/fe-common-core.c b/apps/irssi/src/fe-common/core/fe-common-core.c index 6b57098a..fb0e0fec 100644 --- a/apps/irssi/src/fe-common/core/fe-common-core.c +++ b/apps/irssi/src/fe-common/core/fe-common-core.c @@ -292,12 +292,14 @@ static void create_windows(void) 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) { diff --git a/apps/irssi/src/fe-common/core/fe-log.c b/apps/irssi/src/fe-common/core/fe-log.c index a0967e1a..e7b4ae53 100644 --- a/apps/irssi/src/fe-common/core/fe-log.c +++ b/apps/irssi/src/fe-common/core/fe-log.c @@ -278,7 +278,7 @@ static void cmd_window_log(const char *data) 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; } @@ -600,13 +600,13 @@ static void sig_window_item_destroy(WINDOW_REC *window, WI_ITEM_REC *item) 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)); } diff --git a/apps/irssi/src/fe-common/core/fe-windows.c b/apps/irssi/src/fe-common/core/fe-windows.c index fc4766d9..d3f068e5 100644 --- a/apps/irssi/src/fe-common/core/fe-windows.c +++ b/apps/irssi/src/fe-common/core/fe-windows.c @@ -135,7 +135,7 @@ void window_auto_destroy(WINDOW_REC *window) { 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); } @@ -218,6 +218,14 @@ void window_set_level(WINDOW_REC *window, int level) 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) { diff --git a/apps/irssi/src/fe-common/core/fe-windows.h b/apps/irssi/src/fe-common/core/fe-windows.h index 32004459..9173459f 100644 --- a/apps/irssi/src/fe-common/core/fe-windows.h +++ b/apps/irssi/src/fe-common/core/fe-windows.h @@ -31,6 +31,7 @@ struct _WINDOW_REC { 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; @@ -65,6 +66,7 @@ void window_set_refnum(WINDOW_REC *window, int refnum); 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); diff --git a/apps/irssi/src/fe-common/core/module-formats.c b/apps/irssi/src/fe-common/core/module-formats.c index 2a5c8f93..3972ea8b 100644 --- a/apps/irssi/src/fe-common/core/module-formats.c +++ b/apps/irssi/src/fe-common/core/module-formats.c @@ -39,6 +39,9 @@ FORMAT_REC fecommon_core_formats[] = { { "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 }, @@ -50,6 +53,7 @@ FORMAT_REC fecommon_core_formats[] = { { "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 } }, diff --git a/apps/irssi/src/fe-common/core/module-formats.h b/apps/irssi/src/fe-common/core/module-formats.h index fcfd87d5..6ef7043c 100644 --- a/apps/irssi/src/fe-common/core/module-formats.h +++ b/apps/irssi/src/fe-common/core/module-formats.h @@ -17,6 +17,9 @@ enum { 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, @@ -28,6 +31,7 @@ enum { 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, diff --git a/apps/irssi/src/fe-common/core/themes.c b/apps/irssi/src/fe-common/core/themes.c index f009f0ba..c80c9e2d 100644 --- a/apps/irssi/src/fe-common/core/themes.c +++ b/apps/irssi/src/fe-common/core/themes.c @@ -443,7 +443,7 @@ static char *theme_format_compress_colors(THEME_REC *theme, const char *format) str = g_string_new(NULL); - last_fg = last_bg = 'n'; + last_fg = last_bg = '\0'; while (*format != '\0') { if (*format == '$') { /* $variable, skrip it entirely */ diff --git a/apps/irssi/src/fe-common/core/window-commands.c b/apps/irssi/src/fe-common/core/window-commands.c index e388f23b..e54478d7 100644 --- a/apps/irssi/src/fe-common/core/window-commands.c +++ b/apps/irssi/src/fe-common/core/window-commands.c @@ -94,16 +94,22 @@ static void cmd_window_info(WINDOW_REC *win) 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); @@ -209,8 +215,14 @@ static void cmd_window_close(const char *data) 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); } @@ -329,6 +341,33 @@ static void cmd_window_level(const char *data) 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] */ static void cmd_window_server(const char *data) { @@ -697,6 +736,7 @@ void window_commands_init(void) 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); @@ -735,6 +775,7 @@ void window_commands_deinit(void) 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); diff --git a/apps/irssi/src/fe-common/core/windows-layout.c b/apps/irssi/src/fe-common/core/windows-layout.c index 56ebcb89..5d53f1ae 100644 --- a/apps/irssi/src/fe-common/core/windows-layout.c +++ b/apps/irssi/src/fe-common/core/windows-layout.c @@ -117,6 +117,7 @@ static void sig_layout_restore(void) 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", ""))); @@ -171,6 +172,9 @@ static void window_save(WINDOW_REC *window, CONFIG_NODE *node) 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); diff --git a/apps/irssi/src/fe-text/term-terminfo.c b/apps/irssi/src/fe-text/term-terminfo.c index acf5430d..a1b106a7 100644 --- a/apps/irssi/src/fe-text/term-terminfo.c +++ b/apps/irssi/src/fe-text/term-terminfo.c @@ -95,15 +95,19 @@ int term_init(void) 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) diff --git a/apps/irssi/src/perl/ui/UI.xs b/apps/irssi/src/perl/ui/UI.xs index 83c2a366..c2ee46b4 100644 --- a/apps/irssi/src/perl/ui/UI.xs +++ b/apps/irssi/src/perl/ui/UI.xs @@ -36,6 +36,7 @@ static void perl_window_fill_hash(HV *hv, WINDOW_REC *window) 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); diff --git a/apps/irssi/src/silc/core/Makefile.am b/apps/irssi/src/silc/core/Makefile.am index 769899ee..c33f9484 100644 --- a/apps/irssi/src/silc/core/Makefile.am +++ b/apps/irssi/src/silc/core/Makefile.am @@ -16,7 +16,6 @@ noinst_LIBRARIES=libsilc_core.a libsilc_core_a_SOURCES = \ client_ops.c \ clientutil.c \ - clientconfig.c \ silc-channels.c \ silc-core.c \ silc-nicklist.c \ @@ -28,7 +27,6 @@ noinst_HEADERS = \ module.h \ client_ops.h \ clientutil.h \ - clientconfig.h \ silc-channels.h \ silc-core.h \ silc-nicklist.h \ diff --git a/apps/irssi/src/silc/core/clientconfig.c b/apps/irssi/src/silc/core/clientconfig.c deleted file mode 100644 index 450020a3..00000000 --- a/apps/irssi/src/silc/core/clientconfig.c +++ /dev/null @@ -1,846 +0,0 @@ -/* - - serverconfig.c - - Author: Pekka Riikonen - - 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; -} diff --git a/apps/irssi/src/silc/core/clientconfig.h b/apps/irssi/src/silc/core/clientconfig.h deleted file mode 100644 index a9a7f19e..00000000 --- a/apps/irssi/src/silc/core/clientconfig.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - - clientconfig.h - - Author: Pekka Riikonen - - 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 diff --git a/apps/irssi/src/silc/core/silc-channels.c b/apps/irssi/src/silc/core/silc-channels.c index 2d51590b..886e5e63 100644 --- a/apps/irssi/src/silc/core/silc-channels.c +++ b/apps/irssi/src/silc/core/silc-channels.c @@ -75,22 +75,16 @@ static void sig_channel_destroyed(SILC_CHANNEL_REC *channel) 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); @@ -1256,9 +1250,11 @@ static void command_key(const char *data, SILC_SERVER_REC *server, 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; diff --git a/apps/irssi/src/silc/core/silc-core.c b/apps/irssi/src/silc/core/silc-core.c index 4f56eac6..2b5d9580 100644 --- a/apps/irssi/src/silc/core/silc-core.c +++ b/apps/irssi/src/silc/core/silc-core.c @@ -177,49 +177,64 @@ static void silc_nickname_format_parse(const char *nickname, 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. */ @@ -297,33 +312,32 @@ void silc_core_init_finish(SERVER_REC *server) #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"); diff --git a/apps/irssi/src/silc/core/silc-core.h b/apps/irssi/src/silc/core/silc-core.h index 15ac7132..8736fab3 100644 --- a/apps/irssi/src/silc/core/silc-core.h +++ b/apps/irssi/src/silc/core/silc-core.h @@ -1,7 +1,6 @@ #ifndef __SILC_CORE_H #define __SILC_CORE_H -#include "clientconfig.h" #include "clientutil.h" /* Default client configuration file. This can be overridden at the @@ -27,7 +26,6 @@ #define SILC_CLIENT_DEF_PKCS_LEN 1024 extern SilcClient silc_client; -extern SilcClientConfig silc_config; #ifdef SILC_SIM /* SIM (SILC Module) table */ diff --git a/lib/silccrypt/silccipher.c b/lib/silccrypt/silccipher.c index 70276c51..3517317e 100644 --- a/lib/silccrypt/silccipher.c +++ b/lib/silccrypt/silccipher.c @@ -95,6 +95,16 @@ bool silc_cipher_register(SilcCipherObject *cipher) 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; diff --git a/lib/silccrypt/silchash.c b/lib/silccrypt/silchash.c index f508c836..d50374c1 100644 --- a/lib/silccrypt/silchash.c +++ b/lib/silccrypt/silchash.c @@ -47,6 +47,16 @@ bool silc_hash_register(SilcHashObject *hash) 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; diff --git a/lib/silccrypt/silchmac.c b/lib/silccrypt/silchmac.c index 77dce315..1a00970e 100644 --- a/lib/silccrypt/silchmac.c +++ b/lib/silccrypt/silchmac.c @@ -86,6 +86,16 @@ bool silc_hmac_register(SilcHmacObject *hmac) 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; diff --git a/lib/silcutil/silcschedule.h b/lib/silcutil/silcschedule.h index 3a387129..45a5defa 100644 --- a/lib/silcutil/silcschedule.h +++ b/lib/silcutil/silcschedule.h @@ -172,7 +172,7 @@ typedef enum { * * NAME * - * typedef enum { ... } SilcTaskPriority + * typedef enum { ... } SilcTaskPriority; * * DESCRIPTION *