From e713c325ac297ad0ed8c91f32e3aa836c0af1b23 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Thu, 28 Nov 2002 18:23:16 +0000 Subject: [PATCH] updates. --- TODO | 8 +- lib/silcsftp/tests/sftp_client.c | 153 ++++++++++++++++++++++++++----- lib/silcsftp/tests/sftp_server.c | 54 ++++++----- win32/libsilc/libsilc.def | 28 +++--- 4 files changed, 182 insertions(+), 61 deletions(-) diff --git a/TODO b/TODO index 7ed56659..e6087a0b 100644 --- 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 diff --git a/lib/silcsftp/tests/sftp_client.c b/lib/silcsftp/tests/sftp_client.c index f0c24d81..d74a98ec 100644 --- a/lib/silcsftp/tests/sftp_client.c +++ b/lib/silcsftp/tests/sftp_client.c @@ -17,6 +17,18 @@ */ +/* 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); +} diff --git a/lib/silcsftp/tests/sftp_server.c b/lib/silcsftp/tests/sftp_server.c index 61e451cc..29d39d6b 100644 --- a/lib/silcsftp/tests/sftp_server.c +++ b/lib/silcsftp/tests/sftp_server.c @@ -20,39 +20,40 @@ #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; diff --git a/win32/libsilc/libsilc.def b/win32/libsilc/libsilc.def index 487db212..9d874189 100644 --- a/win32/libsilc/libsilc.def +++ b/win32/libsilc/libsilc.def @@ -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 ; -- 2.24.0