X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient.h;h=7868d4602e1c91ec44a6e4c70bffcc78d17e099f;hp=f886e3d374fe5064e67c5661f0d570b46acb3876;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hpb=a13a1924bf35d6f8d9422a2c60364329fd6511b3 diff --git a/lib/silcclient/client.h b/lib/silcclient/client.h index f886e3d3..7868d460 100644 --- a/lib/silcclient/client.h +++ b/lib/silcclient/client.h @@ -1,16 +1,15 @@ /* - client.h + client.h - Author: Pekka Riikonen + Author: Pekka Riikonen - Copyright (C) 1997 - 2001 Pekka Riikonen + Copyright (C) 1997 - 2002 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. - + the Free Software Foundation; version 2 of the License. + 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 @@ -22,28 +21,29 @@ #define CLIENT_H /* Forward declarations */ -typedef struct SilcClientStruct *SilcClient; -typedef struct SilcClientConnectionStruct *SilcClientConnection; -typedef struct SilcClientPingStruct SilcClientPing; -typedef struct SilcClientAwayStruct SilcClientAway; -typedef struct SilcClientKeyAgreementStruct *SilcClientKeyAgreement; - -#include "idlist.h" -#include "command.h" -#include "silcapi.h" +typedef struct SilcClientInternalStruct *SilcClientInternal; /* Generic rekey context for connections */ typedef struct { /* Current sending encryption key, provided for re-key. The `pfs' is TRUE if the Perfect Forward Secrecy is performed in re-key. */ unsigned char *send_enc_key; - uint32 enc_key_len; + SilcUInt32 enc_key_len; int ske_group; bool pfs; - uint32 timeout; + SilcUInt32 timeout; void *context; } *SilcClientRekey; +/* Context to hold the connection authentication request callbacks that + will be called when the server has replied back to our request about + current authentication method in the session. */ +typedef struct { + SilcConnectionAuthRequest callback; + void *context; + SilcTask timeout; +} *SilcClientConnAuthRequest; + /* Connection structure used in client to associate all the important connection specific data to this structure. */ struct SilcClientConnectionStruct { @@ -58,7 +58,7 @@ struct SilcClientConnectionStruct { /* Decoded local ID so that the above defined ID would not have to be decoded for every packet. */ unsigned char *local_id_data; - uint32 local_id_data_len; + SilcUInt32 local_id_data_len; /* Own client entry. */ SilcClientEntry local_entry; @@ -77,7 +77,7 @@ struct SilcClientConnectionStruct { /* Decoded remote ID so that the above defined ID would not have to be decoded for every packet. */ unsigned char *remote_id_data; - uint32 remote_id_data_len; + SilcUInt32 remote_id_data_len; /* * Common data @@ -88,6 +88,8 @@ struct SilcClientConnectionStruct { SilcHmac hmac_send; SilcHmac hmac_receive; SilcHash hash; + SilcUInt32 psn_send; + SilcUInt32 psn_receive; /* Client ID and Channel ID cache. Messages transmitted in SILC network are done using different unique ID's. These are the cache for @@ -109,11 +111,11 @@ struct SilcClientConnectionStruct { SilcDList pending_commands; /* Current command identifier, 0 not used */ - uint16 cmd_ident; + SilcUInt16 cmd_ident; /* Requested pings. */ SilcClientPing *ping; - uint32 ping_count; + SilcUInt32 ping_count; /* Set away message */ SilcClientAway *away; @@ -121,6 +123,14 @@ struct SilcClientConnectionStruct { /* Re-key context */ SilcClientRekey rekey; + /* Authentication request context. */ + SilcClientConnAuthRequest connauth; + + /* File transmission sessions */ + SilcDList ftp_sessions; + SilcUInt32 next_session_id; + SilcClientFtpSession active_session; + /* Pointer back to the SilcClient. This object is passed to the application and the actual client object is accesible through this pointer. */ SilcClient client; @@ -131,173 +141,29 @@ struct SilcClientConnectionStruct { /* Main client structure. */ struct SilcClientStruct { - /* - * Public data. All the following pointers must be set by the allocator - * of this structure. - */ - - /* Users's username, hostname and realname. */ - char *username; - char *hostname; - char *realname; + char *username; /* Username, must be set by application */ + char *nickname; /* Nickname, may be set by application */ + char *hostname; /* hostname, must be set by application */ + char *realname; /* Real name, must be set be application */ - /* Private and public key of the user. */ - SilcPKCS pkcs; - SilcPublicKey public_key; - SilcPrivateKey private_key; + SilcPublicKey public_key; /* Public key of user, set by application */ + SilcPrivateKey private_key; /* Private key of user, set by application */ + SilcPKCS pkcs; /* PKCS allocated by application */ - /* Application specific user data pointer. Client library does not - touch this. */ - void *application; - - /* - * Private data. Following pointers are used internally by the client - * library and should be considered read-only fields. - */ - - /* All client operations that are implemented in the application. */ - SilcClientOperations *ops; - - /* Client Parameters */ - SilcClientParams *params; - - /* SILC client scheduler and task queues */ - SilcSchedule schedule; - SilcTaskQueue io_queue; - SilcTaskQueue timeout_queue; - SilcTaskQueue generic_queue; - - /* Table of connections in client. All the connection data is saved here. */ - SilcClientConnection *conns; - uint32 conns_count; - - /* Table of listenning sockets in client. Client can have listeners - (like key agreement protocol server) and those sockets are saved here. - This table is checked always if the connection object cannot be found - from the `conns' table. */ - SilcSocketConnection *sockets; - uint32 sockets_count; - - /* Generic cipher and hash objects. These can be used and referenced - by the application as well. */ - SilcCipher none_cipher; - SilcHash md5hash; - SilcHash sha1hash; - SilcHmac md5hmac; - SilcHmac sha1hmac; + SilcSchedule schedule; /* Scheduler, automatically allocated by + the client library. */ /* Random Number Generator. Application should use this as its primary random number generator. */ SilcRng rng; - /* Client version. Used to compare to remote host's version strings. */ - char *silc_client_version; -}; + /* Application specific user data pointer. Client library does not + touch this. This the context sent as argument to silc_client_alloc. */ + void *application; -/* Macros */ - -/* Registers generic task for file descriptor for reading from network and - writing to network. As being generic task the actual task is allocated - only once and after that the same task applies to all registered fd's. */ -#define SILC_CLIENT_REGISTER_CONNECTION_FOR_IO(fd) \ -do { \ - SilcTask tmptask = silc_task_register(client->generic_queue, (fd), \ - silc_client_packet_process, \ - context, 0, 0, \ - SILC_TASK_GENERIC, \ - SILC_TASK_PRI_NORMAL); \ - silc_task_set_iotype(tmptask, SILC_TASK_WRITE); \ -} while(0) - -#define SILC_CLIENT_SET_CONNECTION_FOR_INPUT(s, fd) \ -do { \ - silc_schedule_set_listen_fd((s), (fd), (1L << SILC_TASK_READ)); \ -} while(0) - -#define SILC_CLIENT_SET_CONNECTION_FOR_OUTPUT(s, fd) \ -do { \ - silc_schedule_set_listen_fd((s), (fd), ((1L << SILC_TASK_READ) | \ - (1L << SILC_TASK_WRITE))); \ -} while(0) - -/* Finds socket connection object by file descriptor */ -#define SILC_CLIENT_GET_SOCK(__x, __fd, __sock) \ -do { \ - int __i; \ - \ - for (__i = 0; __i < (__x)->conns_count; __i++) \ - if ((__x)->conns[__i] && \ - (__x)->conns[__i]->sock->sock == (__fd)) \ - break; \ - \ - if (__i >= (__x)->conns_count) { \ - (__sock) = NULL; \ - for (__i = 0; __i < (__x)->sockets_count; __i++) \ - if ((__x)->sockets[__i] && \ - (__x)->sockets[__i]->sock == (__fd)) \ - (__sock) = (__x)->sockets[__i]; \ - } else \ - (__sock) = (__x)->conns[__i]->sock; \ -} while(0) - -/* Check whether rekey protocol is active */ -#define SILC_CLIENT_IS_REKEY(sock) \ - (sock->protocol && sock->protocol->protocol && \ - sock->protocol->protocol->type == SILC_PROTOCOL_CLIENT_REKEY) - -/* Prototypes (some of the prototypes are defined in the silcapi.h) */ - -void silc_client_packet_send(SilcClient client, - SilcSocketConnection sock, - SilcPacketType type, - void *dst_id, - SilcIdType dst_id_type, - SilcCipher cipher, - SilcHmac hmac, - unsigned char *data, - uint32 data_len, - int force_send); -void silc_client_disconnected_by_server(SilcClient client, - SilcSocketConnection sock, - SilcBuffer message); -void silc_client_error_by_server(SilcClient client, - SilcSocketConnection sock, - SilcBuffer message); -void silc_client_receive_new_id(SilcClient client, - SilcSocketConnection sock, - SilcIDPayload idp); -SilcChannelEntry silc_client_new_channel_id(SilcClient client, - SilcSocketConnection sock, - char *channel_name, - uint32 mode, - SilcIDPayload idp); -void silc_client_save_channel_key(SilcClientConnection conn, - SilcBuffer key_payload, - SilcChannelEntry channel); -void silc_client_receive_channel_key(SilcClient client, - SilcSocketConnection sock, - SilcBuffer packet); -void silc_client_channel_message(SilcClient client, - SilcSocketConnection sock, - SilcPacketContext *packet); -void silc_client_remove_from_channels(SilcClient client, - SilcClientConnection conn, - SilcClientEntry client_entry); -void silc_client_replace_from_channels(SilcClient client, - SilcClientConnection conn, - SilcClientEntry old, - SilcClientEntry new); -void silc_client_process_failure(SilcClient client, - SilcSocketConnection sock, - SilcPacketContext *packet); -void silc_client_key_agreement(SilcClient client, - SilcSocketConnection sock, - SilcPacketContext *packet); -void silc_client_notify_by_server(SilcClient client, - SilcSocketConnection sock, - SilcPacketContext *packet); -void silc_client_private_message(SilcClient client, - SilcSocketConnection sock, - SilcPacketContext *packet); + /* Internal data for client library. Application cannot access this + data at all. */ + SilcClientInternal internal; +}; #endif