updates.
authorPekka Riikonen <priikone@silcnet.org>
Thu, 28 Nov 2002 18:23:16 +0000 (18:23 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Thu, 28 Nov 2002 18:23:16 +0000 (18:23 +0000)
TODO
lib/silcsftp/tests/sftp_client.c
lib/silcsftp/tests/sftp_server.c
win32/libsilc/libsilc.def

diff --git a/TODO b/TODO
index 7ed56659ea7521b3930089779c6844db05725c20..e6087a0b87ff7491840c5c0d5016c7dedf732cbb 100644 (file)
--- a/TODO
+++ b/TODO
@@ -25,9 +25,11 @@ TODO for SILC Server 1.0
 TODO/bugs In SILC Libraries
 ===========================
 
- o WIN32 silc_net_create_connection_async does not work the same way
-   than on Unix.  Do it with threads on WIN32.  The function works but
-   is not actually async currently (Fix this to 0.9.x).
+ o Test cases for all cryptographic primitive in lib/silccrypt/
+
+ o Test cases for all payload encoding and decoding routins in lib/silccore/
+
+ o Test cases for math library routines in lib/silcmath/
 
 
 TODO in Toolkit Documentation
index f0c24d81852a67bd3e158f702853d5d0cabc1dab..d74a98ecd7ecf0170a7dbdffb6876e3048b0c7d2 100644 (file)
 
 */
 
+/* Tests:
+   silc_sftp_client_start();
+   silc_sftp_client_receive_process();
+   silc_sftp_opendir();
+   silc_sftp_readdir();
+   silc_sftp_open();
+   silc_sftp_read();
+   silc_sftp_fstat();
+   silc_sftp_lstat();
+   silc_sftp_close();
+*/
+
 #include "silcincludes.h"
 #include "silcsftp.h"
 
@@ -32,6 +44,7 @@ char *dir;
 char *file;
 bool opendir;
 SilcUInt64 offset;
+bool success = FALSE;
 
 static void sftp_name(SilcSFTP sftp, SilcSFTPStatus status,
                      const SilcSFTPName name, void *context);
@@ -40,29 +53,26 @@ static void sftp_handle(SilcSFTP sftp, SilcSFTPStatus status,
 static void sftp_data(SilcSFTP sftp, SilcSFTPStatus status,
                      const unsigned char *data, SilcUInt32 data_len,
                      void *context);
+static void end_test(void);
 
-static void send_packet(SilcSocketConnection sock,
-                       SilcBuffer packet, void *context)
+static void send_packet(SilcBuffer packet, void *context)
 {
   Client client = (Client)context;
+  SilcSocketConnection sock = client->sock;
   SilcPacketContext packetdata;
+  const SilcBufferStruct p;
   int ret;
 
   memset(&packetdata, 0, sizeof(packetdata));
   packetdata.type = SILC_PACKET_FTP;
   packetdata.truelen = packet->len + SILC_PACKET_HEADER_LEN;
-  packetdata.padlen = SILC_PACKET_PADLEN(packetdata.truelen, 0);
-  silc_packet_send_prepare(sock,
-                          SILC_PACKET_HEADER_LEN,
-                          packetdata.padlen,
-                          packet->len);
-  packetdata.buffer = sock->outbuf;
-  silc_buffer_put(sock->outbuf, packet->data, packet->len);
-  silc_packet_assemble(&packetdata, NULL);
+  SILC_PACKET_PADLEN(packetdata.truelen, 0, packetdata.padlen);
+  silc_packet_assemble(&packetdata, NULL, NULL, NULL, sock,
+                      packet->data, packet->len, (const SilcBuffer)&p);
   ret = silc_packet_send(sock, TRUE);
   if (ret != -2)
     return;
-
+  
   silc_schedule_set_listen_fd(client->schedule, sock->sock, 
                              (SILC_TASK_READ | SILC_TASK_WRITE), FALSE);
   SILC_SET_OUTBUF_PENDING(sock);
@@ -79,7 +89,7 @@ static bool packet_parse(SilcPacketParserContext *parser, void *context)
   assert(packet->type == SILC_PACKET_FTP);
 
   silc_sftp_client_receive_process(client->sftp, sock, packet);
-
+    
   return TRUE;
 }
 
@@ -91,23 +101,24 @@ SILC_TASK_CALLBACK(packet_process)
 
   if (type == SILC_TASK_WRITE) {
     if (sock->outbuf->data - sock->outbuf->head)
-     silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
+      silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
 
     ret = silc_packet_send(sock, TRUE);
     if (ret < 0)
       return;
-
+      
     silc_schedule_set_listen_fd(client->schedule, fd, SILC_TASK_READ, FALSE);
     SILC_UNSET_OUTBUF_PENDING(sock);
     silc_buffer_clear(sock->outbuf);
     return;
+    
   }
 
   if (type == SILC_TASK_READ) {
     ret = silc_packet_receive(sock);
     if (ret < 0)
       return;
-
+  
     if (ret == 0) {
       silc_net_close_connection(sock->sock);
       silc_socket_free(sock);
@@ -119,6 +130,70 @@ SILC_TASK_CALLBACK(packet_process)
   }
 }
 
+static void sftp_status(SilcSFTP sftp, SilcSFTPStatus status,
+                       const char *message, const char *lang_tag,
+                       void *context)
+{
+  fprintf(stderr, "Status %d\n", status);
+  if (status != SILC_SFTP_STATUS_OK) {
+    SILC_LOG_DEBUG(("Error status"));
+    success = FALSE;
+    end_test();
+    return;
+  }
+
+  success = TRUE;
+  end_test();
+}
+
+static void sftp_attr(SilcSFTP sftp, SilcSFTPStatus status,
+                     const SilcSFTPAttributes attrs, void *context)
+{
+  SilcSFTPHandle handle = (SilcSFTPHandle)context;
+  int debug = silc_debug;
+  int i;
+  
+  fprintf(stderr, "Status %d\n", status);
+  if (status != SILC_SFTP_STATUS_OK) {
+    SILC_LOG_DEBUG(("Error status"));
+    success = FALSE;
+    end_test();
+    return;
+  }
+    
+  if (!debug)
+    silc_debug = 1;
+
+  SILC_LOG_DEBUG(("Attr.flags: %d", attrs->flags));
+  SILC_LOG_DEBUG(("Attr.size: %lu", attrs->size));
+  SILC_LOG_DEBUG(("Attr.uid: %d", attrs->uid));
+  SILC_LOG_DEBUG(("Attr.gid: %d", attrs->gid));
+  SILC_LOG_DEBUG(("Attr.permissions: %d", attrs->permissions));
+  SILC_LOG_DEBUG(("Attr.atime: %d", attrs->atime));
+  SILC_LOG_DEBUG(("Attr.mtime: %d", attrs->mtime));
+  SILC_LOG_DEBUG(("Attr.extended count: %d", attrs->extended_count));
+  for (i = 0; i < attrs->extended_count; i++) {
+    SILC_LOG_HEXDUMP(("Attr.extended_type[i]:", i),
+                    attrs->extended_type[i]->data,
+                    attrs->extended_type[i]->len);
+    SILC_LOG_HEXDUMP(("Attr.extended_data[i]:", i),
+                    attrs->extended_data[i]->data,
+                    attrs->extended_data[i]->len);
+  }
+    
+  silc_debug = debug;
+
+  if (!file) {
+    fprintf(stderr, "Closing file\n"); 
+    silc_sftp_close(sftp, handle, sftp_status, context);
+    return;
+  }
+  
+  fprintf(stderr, "LStatting file %s\n", file); 
+  silc_sftp_lstat(sftp, file, sftp_attr, context);
+  file = NULL;
+}
+
 static void sftp_data(SilcSFTP sftp, SilcSFTPStatus status,
                      const unsigned char *data, SilcUInt32 data_len,
                      void *context)
@@ -131,9 +206,19 @@ static void sftp_data(SilcSFTP sftp, SilcSFTPStatus status,
 
     fprintf(stderr, "Status %d\n", status);
 
-    if (!strcmp(file, "/sftp/sftp_server.c"))
+    if (status != SILC_SFTP_STATUS_EOF) {
+      SILC_LOG_DEBUG(("Error status"));
+      success = FALSE;
+      end_test();
       return;
-
+    }
+    
+    if (!strcmp(file, "/sftp/sftp_server.c")) {
+      fprintf(stderr, "FStatting file handle %s\n", file); 
+      silc_sftp_fstat(sftp, handle, sftp_attr, context);
+      return;
+    }
+      
     /* Open another file */
     opendir = FALSE;
     memset(&attrs, 0, sizeof(attrs));
@@ -166,6 +251,13 @@ static void sftp_name(SilcSFTP sftp, SilcSFTPStatus status,
   SILC_LOG_DEBUG(("Name"));
   fprintf(stderr, "Status %d\n", status);
 
+  if (status != SILC_SFTP_STATUS_OK) {
+    SILC_LOG_DEBUG(("Error status"));
+    success = FALSE;
+    end_test();
+    return;
+  }
+  
   fprintf(stderr, "Directory: %s\n", dir);
   for (i = 0; i < name->count; i++) {
     fprintf(stderr, "%s\n", name->long_filename[i]);
@@ -202,9 +294,13 @@ static void sftp_handle(SilcSFTP sftp, SilcSFTPStatus status,
 
   SILC_LOG_DEBUG(("Handle"));
   fprintf(stderr, "Status %d\n", status);
-  if (status != SILC_SFTP_STATUS_OK)
+  if (status != SILC_SFTP_STATUS_OK) {
+    SILC_LOG_DEBUG(("Error status"));
+    success = FALSE;
+    end_test();
     return;
-
+  }
+  
   if (opendir) {
     fprintf(stderr, "Reading %s\n", dir);
     /* Readdir */
@@ -225,6 +321,12 @@ static void sftp_version(SilcSFTP sftp, SilcSFTPStatus status,
 
   SILC_LOG_DEBUG(("Version"));
   fprintf(stderr, "Status %d\n", status);
+  if (status != SILC_SFTP_STATUS_OK) {
+    SILC_LOG_DEBUG(("Error status"));
+    success = FALSE;
+    end_test();
+    return;
+  }
 
   /* opendir */
   dir = "/";
@@ -243,10 +345,10 @@ int main(int argc, char **argv)
   if (argc > 1 && !strcmp(argv[1], "-d")) {
     silc_debug = 1;
     silc_debug_hexdump = 1;
-    silc_log_set_debug_string("");
+    silc_log_set_debug_string("*sftp*");
   }
 
-  client->schedule = silc_schedule_init(100);
+  client->schedule = silc_schedule_init(100, NULL);
   if (!client->schedule)
     return -1;
 
@@ -260,9 +362,16 @@ int main(int argc, char **argv)
                         SILC_TASK_GENERIC, SILC_TASK_PRI_NORMAL);
 
   /* Start SFTP session */
-  client->sftp = silc_sftp_client_start(client->sock, send_packet, client,
+  client->sftp = silc_sftp_client_start(send_packet, client,
                                        sftp_version, client);
 
   silc_schedule(client->schedule);
   return 0;
 }
+
+static void end_test(void)
+{
+  SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
+  fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
+  exit(success);
+}
index 61e451cccafaf45e8f5079637234528bebe23c76..29d39d6b7a8ca4423d69fb05b6357c6a9af80d69 100644 (file)
 #include "silcincludes.h"
 #include "silcsftp.h"
 
+typedef struct {
+  SilcSocketConnection sock;
+  void *server;
+} *ServerSession;
+
 typedef struct {
   SilcSchedule schedule;
   int sock;
   SilcSFTPFilesystem fs;
-  SilcSocketConnection socks[100];
+  ServerSession sessions[100];
   SilcSFTP sftp[100];
 } *Server;
 
-static void send_packet(SilcSocketConnection sock,
-                       SilcBuffer packet, void *context)
+static void send_packet(SilcBuffer packet, void *context)
 {
-  Server server = (Server)context;
+  ServerSession session = context;
+  Server server = session->server;
   SilcPacketContext packetdata;
+  const SilcBufferStruct p;
   int ret;
 
   memset(&packetdata, 0, sizeof(packetdata));
   packetdata.type = SILC_PACKET_FTP;
   packetdata.truelen = packet->len + SILC_PACKET_HEADER_LEN;
-  packetdata.padlen = SILC_PACKET_PADLEN(packetdata.truelen, 0);
-  silc_packet_send_prepare(sock,
-                          SILC_PACKET_HEADER_LEN,
-                          packetdata.padlen,
-                          packet->len);
-  packetdata.buffer = sock->outbuf;
-  silc_buffer_put(sock->outbuf, packet->data, packet->len);
-  silc_packet_assemble(&packetdata, NULL);
-  ret = silc_packet_send(sock, TRUE);
+  SILC_PACKET_PADLEN(packetdata.truelen, 0, packetdata.padlen);
+  silc_packet_assemble(&packetdata, NULL, NULL, NULL, session->sock,
+                      packet->data, packet->len, (const SilcBuffer)&p);
+  ret = silc_packet_send(session->sock, TRUE);
   if (ret != -2)
     return;
 
-  silc_schedule_set_listen_fd(server->schedule, sock->sock, 
+  silc_schedule_set_listen_fd(server->schedule, session->sock->sock, 
                              (SILC_TASK_READ | SILC_TASK_WRITE), FALSE);
-  SILC_SET_OUTBUF_PENDING(sock);
+  SILC_SET_OUTBUF_PENDING(session->sock);
 }
 
 static bool packet_parse(SilcPacketParserContext *parser, void *context)
@@ -72,12 +73,14 @@ static bool packet_parse(SilcPacketParserContext *parser, void *context)
 
 SILC_TASK_CALLBACK(packet_process)
 {
-  Server server = (Server)context;
-  SilcSocketConnection sock = server->socks[fd];
+  Server server = context;
+  ServerSession session = server->sessions[fd];
+  SilcSocketConnection sock;
   int ret;
 
-  if (!sock)
+  if (!session)
     return;
+  sock = session->sock;
 
   if (type == SILC_TASK_WRITE) {
     if (sock->outbuf->data - sock->outbuf->head)
@@ -101,7 +104,8 @@ SILC_TASK_CALLBACK(packet_process)
     if (ret == 0) {
       silc_net_close_connection(sock->sock);
       silc_schedule_unset_listen_fd(server->schedule, sock->sock);
-      server->socks[sock->sock] = NULL;
+      silc_free(server->sessions[sock->sock]);
+      server->sessions[sock->sock] = NULL;
       silc_socket_free(sock);
       return;
     }
@@ -125,9 +129,11 @@ SILC_TASK_CALLBACK(accept_connection)
   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
 
   silc_socket_alloc(sock, 0, NULL, &sc);
-  server->socks[sock] = sc;
+  server->sessions[sock] = silc_calloc(1, sizeof(server->sessions[0]));
+  server->sessions[sock]->sock = sc;
+  server->sessions[sock]->server = server;
   server->sftp[sock] = 
-    silc_sftp_server_start(sc, send_packet, server,
+    silc_sftp_server_start(send_packet, server->sessions[sock],
                           server->fs);
   silc_schedule_task_add(server->schedule, sock, packet_process,
                         server, 0, 0, SILC_TASK_GENERIC,
@@ -140,8 +146,10 @@ int main()
   void *dir;
 
   silc_debug = 1;
-
-  server->schedule = silc_schedule_init(100);
+  silc_debug_hexdump = 1;
+  silc_log_set_debug_string("*sftp*");
+  
+  server->schedule = silc_schedule_init(100, NULL);
   if (!server->schedule)
     return -1;
 
index 487db212d2b201cef43a16186c452a0a388d7a81..9d8741898b4a6d4391f6bf78a1017421ccfcfcca 100644 (file)
@@ -61,14 +61,6 @@ EXPORTS
        silc_channel_key_payload_encode @ 278 ; 
        silc_channel_key_payload_free @ 279 ; 
        silc_channel_key_payload_parse @ 280 ; 
-       silc_channel_message_get_mac @ 281 ; 
-       silc_channel_message_get_data @ 282 ; 
-       silc_channel_message_get_flags @ 283 ; 
-       silc_channel_message_get_iv @ 284 ; 
-       silc_channel_message_payload_decrypt @ 285 ; 
-       silc_channel_message_payload_encode @ 286 ; 
-       silc_channel_message_payload_free @ 287 ; 
-       silc_channel_message_payload_parse @ 288 ; 
        silc_channel_payload_encode @ 289 ; 
        silc_channel_payload_free @ 290 ; 
        silc_channel_payload_list_free @ 291 ; 
@@ -370,11 +362,6 @@ EXPORTS
        silc_pkcs_unregister @ 594 ; 
        silc_pkcs_verify @ 595 ; 
        silc_pkcs_verify_with_hash @ 596 ; 
-       silc_private_message_get_flags @ 597 ; 
-       silc_private_message_get_message @ 598 ; 
-       silc_private_message_payload_encode @ 599 ; 
-       silc_private_message_payload_free @ 600 ; 
-       silc_private_message_payload_parse @ 601 ; 
        silc_protocol_alloc @ 602 ; 
        silc_protocol_cancel @ 603 ; 
        silc_protocol_execute @ 604 ; 
@@ -583,3 +570,18 @@ EXPORTS
        silc_load_key_pair @ 882 ;
        silc_show_public_key @ 883 ;
        silc_change_private_key_passphrase @ 884 ;
+       silc_argument_payload_encode_one @ 885 ; 
+       silc_message_payload_decrypt @ 886 ; 
+       silc_message_payload_parse @ 887 ; 
+       silc_message_payload_encrypt @ 888 ; 
+       silc_message_payload_encode @ 889 ; 
+       silc_message_payload_free @ 890 ; 
+       silc_message_get_flags @ 891 ; 
+       silc_message_get_data @ 892 ; 
+       silc_message_get_mac @ 893 ; 
+       silc_message_get_iv @ 894 ; 
+       silc_message_signed_payload_parse @ 895 ; 
+       silc_message_signed_payload_encode @ 896 ; 
+       silc_message_signed_payload_free @ 897 ; 
+       silc_message_signed_verify @ 898 ; 
+       silc_message_signed_get_public_key @ 899 ;