updates. SILC.0.1
authorPekka Riikonen <priikone@silcnet.org>
Thu, 19 Apr 2001 16:29:20 +0000 (16:29 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Thu, 19 Apr 2001 16:29:20 +0000 (16:29 +0000)
CHANGES
TODO
apps/silcd/packet_receive.c
apps/silcd/protocol.c
apps/silcd/protocol.h
apps/silcd/server.c

diff --git a/CHANGES b/CHANGES
index f9f60f10e1438b9a652b37f938ceb3ce76ae9fc2..ff6ffe7812df3b341b469f1d635e0615ff708db8 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+Thu Apr 19 19:52:46 EEST 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Fixed the configuration data fetching when accepting new
+         connections in the server.  Affected file silcd/server.c.
+
 Thu Apr 19 11:40:20 EEST 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
 
        * Added `sender_entry' argument to the function
diff --git a/TODO b/TODO
index 0445423393a3d9de2b6b06566d3a8a3cf5978deb..319c982625a8aed0ab47f690cc24760b5daac3c4 100644 (file)
--- a/TODO
+++ b/TODO
@@ -40,6 +40,12 @@ TODO/bugs In SILC Server
    own resolver stuff (through scheduler, if possible without writing
    too much own stuff) or use threads.
 
+ o The ID List must be optimized.  When the lists grow the searching
+   becomes a lot slower and is some cases the lists are searched many
+   times, like with channel messages (twice at least).  Some sort of
+   hash tables should replace the lists.  Thus, the ID cache should be
+   rewritten to use hash tables internally.
+
  o [DenyConnection] config section is not implemented.
 
  o The backup router support described in the protocol specification
@@ -73,12 +79,6 @@ TODO/bugs In SILC Libraries
    does not want to register them one by one (if for example SILC client
    is run without config files at all).
 
- o The ID List must be optimized.  When the lists grow the searching
-   becomes a lot slower and is some cases the lists are searched many
-   times, like with channel messages (twice at least).  Some sort of
-   hash tables should replace the lists.  Thus, the ID cache should be
-   rewritten to use hash tables internally.
-
  o Compression routines are missing.  The protocol supports packet
    compression thus it must be implemented.  SILC Comp API must be
    defined.  zlib package is already included into the lib dir (in CVS,
index e4c3bd3572061988e8fa33b66e8eaf53fb53b441..50111068f314d9ca3448a3675b2cd8dc566835ec 100644 (file)
@@ -1537,9 +1537,9 @@ static void silc_server_new_id_real(SilcServer server,
   else
     id_list = server->global_list;
 
-  /* If the packet is coming from router then use the sender as the
+  /* If the packet is coming from server then use the sender as the
      origin of the the packet. If it came from router then check the real
-     sender of the packet and use that as he origin. */
+     sender of the packet and use that as the origin. */
   if (sock->type == SILC_SOCKET_TYPE_SERVER) {
     router_sock = sock;
     router = sock->user_data;
@@ -1551,9 +1551,10 @@ static void silc_server_new_id_real(SilcServer server,
     if (!router)
       router = silc_idlist_find_server_by_id(server->local_list,
                                             sender_id, NULL);
-    assert(router != NULL);
-    router_sock = sock;
     silc_free(sender_id);
+    if (!router)
+      goto out;
+    router_sock = sock;
   }
 
   switch(id_type) {
index 10e74a9d14dffe960661bfd90407f1d6809cccb1..b6b1700708cf1a9d169815ccf801df6eb6d10f0a 100644 (file)
@@ -665,7 +665,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_connection_auth)
 
        /* Remote end is client */
        if (conn_type == SILC_SOCKET_TYPE_CLIENT) {
-         SilcServerConfigSectionClientConnection *client = ctx->config;
+         SilcServerConfigSectionClientConnection *client = ctx->cconfig;
          
          if (client) {
            switch(client->auth_meth) {
@@ -727,7 +727,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_connection_auth)
        
        /* Remote end is server */
        if (conn_type == SILC_SOCKET_TYPE_SERVER) {
-         SilcServerConfigSectionServerConnection *serv = ctx->config;
+         SilcServerConfigSectionServerConnection *serv = ctx->sconfig;
          
          if (serv) {
            switch(serv->auth_meth) {
@@ -789,7 +789,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_connection_auth)
        
        /* Remote end is router */
        if (conn_type == SILC_SOCKET_TYPE_ROUTER) {
-         SilcServerConfigSectionServerConnection *serv = ctx->config;
+         SilcServerConfigSectionServerConnection *serv = ctx->rconfig;
 
          if (serv) {
            switch(serv->auth_meth) {
index f5ab3c5b2a48d764ad2bd3f0b0d9603c9e72133a..09e2aac3a4e4af5abde6279e68852eaac41355df 100644 (file)
@@ -43,8 +43,10 @@ typedef struct {
   void *dest_id;
   SilcIdType dest_id_type;
 
-  /* Pointer to the configuration. */
-  void *config;
+  /* Pointer to the configurations. */
+  void *cconfig;
+  void *sconfig;
+  void *rconfig;
 
   SilcTask timeout_task;
   SilcPacketContext *packet;
@@ -79,8 +81,10 @@ typedef struct {
   void *dest_id;
   SilcIdType dest_id_type;
 
-  /* Pointer to the configuration. */
-  void *config;
+  /* Pointer to the configurations. */
+  void *cconfig;
+  void *sconfig;
+  void *rconfig;
 
   SilcTask timeout_task;
   SilcPacketContext *packet;
index 7a88cad30610d813ca94849c8330c06649ee582c..4892cd065864cae453981326a1b592d73dc6438b 100644 (file)
@@ -947,7 +947,7 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection)
   SilcSocketConnection newsocket;
   SilcServerKEInternalContext *proto_ctx;
   int sock, port;
-  void *config;
+  void *cconfig, *sconfig, *rconfig;
 
   SILC_LOG_DEBUG(("Accepting new connection"));
 
@@ -1007,30 +1007,29 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection)
      have to check all configurations since we don't know what type of
      connection this is. */
   port = server->sockets[fd]->port; /* Listenning port */
-  if (!(config = silc_server_config_find_client_conn(server->config,
+  if (!(cconfig = silc_server_config_find_client_conn(server->config,
+                                                     newsocket->ip, port)))
+    cconfig = silc_server_config_find_client_conn(server->config,
+                                                 newsocket->hostname, 
+                                                 port);
+  if (!(sconfig = silc_server_config_find_server_conn(server->config,
+                                                    newsocket->ip, 
+                                                    port)))
+    sconfig = silc_server_config_find_server_conn(server->config,
+                                                 newsocket->hostname,
+                                                 port);
+  if (!(rconfig = silc_server_config_find_router_conn(server->config,
                                                     newsocket->ip, port)))
-    if (!(config = silc_server_config_find_client_conn(server->config,
-                                                      newsocket->hostname, 
-                                                      port)))
-      if (!(config = silc_server_config_find_server_conn(server->config,
-                                                        newsocket->ip, 
-                                                        port)))
-       if (!(config = silc_server_config_find_server_conn(server->config,
-                                                          newsocket->hostname,
-                                                          port)))
-         if (!(config = 
-               silc_server_config_find_router_conn(server->config,
-                                                   newsocket->ip, port)))
-           if (!(config = 
-                 silc_server_config_find_router_conn(server->config,
-                                                     newsocket->hostname, 
-                                                     port))) {
-             silc_server_disconnect_remote(server, newsocket, 
-                                           "Server closed connection: "
-                                           "Connection refused");
-             server->stat.conn_failures++;
-             return;
-           }
+    rconfig = silc_server_config_find_router_conn(server->config,
+                                                 newsocket->hostname, 
+                                                 port);
+  if (!cconfig && !sconfig && !rconfig) {
+    silc_server_disconnect_remote(server, newsocket, 
+                                 "Server closed connection: "
+                                 "Connection refused");
+    server->stat.conn_failures++;
+    return;
+  }
 
   /* The connection is allowed */
 
@@ -1044,7 +1043,9 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection)
   proto_ctx->sock = newsocket;
   proto_ctx->rng = server->rng;
   proto_ctx->responder = TRUE;
-  proto_ctx->config = config;
+  proto_ctx->cconfig = cconfig;
+  proto_ctx->sconfig = sconfig;
+  proto_ctx->rconfig = rconfig;
 
   /* Prepare the connection for key exchange protocol. We allocate the
      protocol but will not start it yet. The connector will be the
@@ -1143,7 +1144,9 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection_second)
   proto_ctx->responder = TRUE;
   proto_ctx->dest_id_type = ctx->dest_id_type;
   proto_ctx->dest_id = ctx->dest_id;
-  proto_ctx->config = ctx->config;
+  proto_ctx->cconfig = ctx->cconfig;
+  proto_ctx->sconfig = ctx->sconfig;
+  proto_ctx->rconfig = ctx->rconfig;
 
   /* Free old protocol as it is finished now */
   silc_protocol_free(protocol);
@@ -1243,7 +1246,8 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection_final)
   case SILC_SOCKET_TYPE_ROUTER:
     {
       SilcServerEntry new_server;
-      SilcServerConfigSectionServerConnection *conn = ctx->config;
+      SilcServerConfigSectionServerConnection *conn = 
+       sock->type == SILC_SOCKET_TYPE_SERVER ? ctx->sconfig : ctx->rconfig;
 
       SILC_LOG_DEBUG(("Remote host is %s", 
                      sock->type == SILC_SOCKET_TYPE_SERVER ? 
@@ -2209,7 +2213,8 @@ void silc_server_free_sock_user_data(SilcServer server,
 
       /* Free all client entries that this server owns as they will
         become invalid now as well. */
-      silc_server_remove_clients_by_server(server, user_data, TRUE);
+      if (user_data->id)
+       silc_server_remove_clients_by_server(server, user_data, TRUE);
 
       /* If this was our primary router connection then we're lost to
         the outside world. */
@@ -2534,8 +2539,6 @@ void silc_server_remove_from_channels(SilcServer server,
                                           signoff_message, signoff_message ?
                                           strlen(signoff_message) : 0);
 
-      server->stat.my_channels--;
-
       if (channel->rekey)
        silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
 
@@ -2556,6 +2559,7 @@ void silc_server_remove_from_channels(SilcServer server,
 
       if (!silc_idlist_del_channel(server->local_list, channel))
        silc_idlist_del_channel(server->global_list, channel);
+      server->stat.my_channels--;
       continue;
     }
 
@@ -2649,7 +2653,6 @@ int silc_server_remove_from_one_channel(SilcServer server,
                                           SILC_NOTIFY_TYPE_LEAVE, 1,
                                           clidp->data, clidp->len);
 
-      server->stat.my_channels--;
       silc_buffer_free(clidp);
 
       if (channel->rekey)
@@ -2672,6 +2675,7 @@ int silc_server_remove_from_one_channel(SilcServer server,
 
       if (!silc_idlist_del_channel(server->local_list, channel))
        silc_idlist_del_channel(server->global_list, channel);
+      server->stat.my_channels--;
       return FALSE;
     }