updates.
authorPekka Riikonen <priikone@silcnet.org>
Sun, 10 Feb 2002 16:01:06 +0000 (16:01 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 10 Feb 2002 16:01:06 +0000 (16:01 +0000)
26 files changed:
CHANGES
TODO
apps/irssi/default.theme
apps/irssi/scripts/mail.pl [new file with mode: 0644]
apps/irssi/silc.conf
apps/irssi/src/fe-common/core/fe-common-core.c
apps/irssi/src/fe-common/core/fe-log.c
apps/irssi/src/fe-common/core/fe-windows.c
apps/irssi/src/fe-common/core/fe-windows.h
apps/irssi/src/fe-common/core/module-formats.c
apps/irssi/src/fe-common/core/module-formats.h
apps/irssi/src/fe-common/core/themes.c
apps/irssi/src/fe-common/core/window-commands.c
apps/irssi/src/fe-common/core/windows-layout.c
apps/irssi/src/fe-text/term-terminfo.c
apps/irssi/src/perl/ui/UI.xs
apps/irssi/src/silc/core/Makefile.am
apps/irssi/src/silc/core/clientconfig.c [deleted file]
apps/irssi/src/silc/core/clientconfig.h [deleted file]
apps/irssi/src/silc/core/silc-channels.c
apps/irssi/src/silc/core/silc-core.c
apps/irssi/src/silc/core/silc-core.h
lib/silccrypt/silccipher.c
lib/silccrypt/silchash.c
lib/silccrypt/silchmac.c
lib/silcutil/silcschedule.h

diff --git a/CHANGES b/CHANGES
index 4ba77bb01bc561b5b48c01fe404b053004094d43..65d6f219f68dd8c9b0a8adf5fed58f62761c3821 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,10 @@
+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.
diff --git a/TODO b/TODO
index d4d58361c523c563e3292edbcfc9fcbe3ec609c2..85ef25619b055091540efc5ae1092005e9f13593 100644 (file)
--- 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.
index 427f7f595c462e1328f69137466d26edab802214..9ffec4b7b8cb17a2cfe8c39d2b50c4bde705757d 100644 (file)
@@ -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 (file)
index 0000000..2d11a46
--- /dev/null
@@ -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 (<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'));
index f9f10528a1ee1a4cd4b0e63b7da669e2a39fac3d..3439e3c913fb0c4ac6195c059f3ca0ba925872ba 100644 (file)
@@ -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";
index 6b57098abc17a3cebbe4794962c52a5df7c776bb..fb0e0fec2c801c4cf78312360d033ea65f645d28 100644 (file)
@@ -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) {
index a0967e1ab7f0165626428f6f1c7478d0d9c68fb2..e7b4ae534d5aa113e67583e1220caa95cf6a72b5 100644 (file)
@@ -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));
 }
index fc4766d938a1d77d93379127af8ac4d6756b66e0..d3f068e5826f2795892bd77b24517455dce479ac 100644 (file)
@@ -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)
 {
index 320044598372751abfa3ab92868ae117b58c6386..9173459fd6ab2c0e0749bf409f1731898e74974d 100644 (file)
@@ -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);
index 2a5c8f93e63697070a71cc500a29050e9816948a..3972ea8b93ce747ab8663902e213c89729ab102e 100644 (file)
@@ -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 } },
index fcfd87d5c9ca3a4812373ebe175b2ca63b17c322..6ef7043cba25ec2708fe44d0922b421f78bd95dc 100644 (file)
@@ -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,
index f009f0ba9ac38729569cc5560f4561393b94a575..c80c9e2d1190aaadc5b97cc46bc71bd48759b6e0 100644 (file)
@@ -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 */
index e388f23bb20182b6eb00572fb3eb93881d8e6407..e54478d7ff2dc197cfa5d4e3f02d31e7ba6e2d3c 100644 (file)
@@ -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] <tag> */
 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);
index 56ebcb89e2d3be74560f7a02939a2461fe723e40..5d53f1ae177204fe3396bb5a5e4f0fefdbc49e69 100644 (file)
@@ -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);
 
index acf5430d9c1dc7a718cab5b9f786ceb4b9774098..a1b106a7a14163c5e4919de5a794f50da049ac4d 100644 (file)
@@ -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)
index 83c2a366bf7c6d52070672918494afdb8d26cbcc..c2ee46b48b82b3043e6c01d686512bb34f5c1db7 100644 (file)
@@ -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);
index 769899eed35dce696d227e24c344d7b6dfc203a6..c33f948425112a28dbfacad9d526dd900017d4ad 100644 (file)
@@ -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 (file)
index 450020a..0000000
+++ /dev/null
@@ -1,846 +0,0 @@
-/*
-
-  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;
-}
diff --git a/apps/irssi/src/silc/core/clientconfig.h b/apps/irssi/src/silc/core/clientconfig.h
deleted file mode 100644 (file)
index a9a7f19..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-
-  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
index 2d51590bb0fee209a85c82dacb087bcb472f3e4c..886e5e63fbb74d03761975a29ef3f852582e35a5 100644 (file)
@@ -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;
index 4f56eac6e34ce70a9c6d9830647b530aba3a83e8..2b5d9580603ed0785073d4b42e86d3ca64977d87 100644 (file)
@@ -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(&params, 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, &params, 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");
index 15ac7132d6fe5b467e9df47688126122be4c05cf..8736fab35003667c4aff743c9aaa592b7b9a381b 100644 (file)
@@ -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 */
index 70276c5144306df752f0a25b5c9fbc6bd4ffc18e..3517317ec5c352a99eee7bd41417e1d372d8f84e 100644 (file)
@@ -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;
index f508c836e3bfa87898cd59ad7bbe0a87f96461b1..d50374c1bfa3910211a678dba9e8ff515913dd11 100644 (file)
@@ -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;
index 77dce315b4693961ee662c34300b4eb7dac9f15b..1a00970e7f720f11dc8b386ef2f4353b09b209d0 100644 (file)
@@ -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;
index 3a387129215a1597a079060baa26a76abba4bea0..45a5defa78343ffabc7b527a3ba3d051ad7c01a7 100644 (file)
@@ -172,7 +172,7 @@ typedef enum {
  *
  * NAME
  * 
- *    typedef enum { ... } SilcTaskPriority
+ *    typedef enum { ... } SilcTaskPriority;
  *
  * DESCRIPTION
  *