X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient.h;h=7868d4602e1c91ec44a6e4c70bffcc78d17e099f;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=8caffe812c574e61d749268d4635165b25b3ef25;hpb=318d79b391bf6288e3e28c840217a7097f3d0392;p=silc.git diff --git a/lib/silcclient/client.h b/lib/silcclient/client.h index 8caffe81..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 - 2000 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 @@ -21,37 +20,33 @@ #ifndef CLIENT_H #define CLIENT_H -/* Forward declaration for client */ -typedef struct SilcClientObject *SilcClient; - -/* Forward declaration for client connection */ -typedef struct SilcClientConnectionObject *SilcClientConnection; - -#include "idlist.h" -#include "command.h" -#include "ops.h" - -/* Structure to hold ping time information. Every PING command will - add entry of this structure and is removed after reply to the ping - as been received. */ -typedef struct SilcClientPingStruct { - time_t start_time; - void *dest_id; - char *dest_name; -} SilcClientPing; - -/* Structure to hold away messages set by user. This is mainly created - for future extensions where away messages could be set according filters - such as nickname and hostname. For now only one away message can - be set in one connection. */ -typedef struct SilcClientAwayStruct { - char *away; - struct SilcClientAwayStruct *next; -} SilcClientAway; +/* Forward declarations */ +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; + SilcUInt32 enc_key_len; + int ske_group; + bool pfs; + 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 SilcClientConnectionObject { +struct SilcClientConnectionStruct { /* * Local data */ @@ -63,7 +58,7 @@ struct SilcClientConnectionObject { /* Decoded local ID so that the above defined ID would not have to be decoded for every packet. */ unsigned char *local_id_data; - unsigned int local_id_data_len; + SilcUInt32 local_id_data_len; /* Own client entry. */ SilcClientEntry local_entry; @@ -82,17 +77,19 @@ struct SilcClientConnectionObject { /* Decoded remote ID so that the above defined ID would not have to be decoded for every packet. */ unsigned char *remote_id_data; - unsigned int remote_id_data_len; + SilcUInt32 remote_id_data_len; /* * Common data */ - /* Keys */ + /* Keys and stuff negotiated in the SKE protocol */ SilcCipher send_key; SilcCipher receive_key; - SilcHmac hmac; - unsigned char *hmac_key; - unsigned int hmac_key_len; + 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 @@ -110,15 +107,32 @@ struct SilcClientConnectionObject { referencing (sock->user_data). */ SilcSocketConnection sock; + /* Pending command queue for this connection */ + SilcDList pending_commands; + + /* Current command identifier, 0 not used */ + SilcUInt16 cmd_ident; + /* Requested pings. */ SilcClientPing *ping; - unsigned int ping_count; + SilcUInt32 ping_count; /* Set away message */ SilcClientAway *away; + /* 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 thourh this pointer. */ + and the actual client object is accesible through this pointer. */ SilcClient client; /* User data context. Library does not touch this. */ @@ -126,154 +140,30 @@ struct SilcClientConnectionObject { }; /* Main client structure. */ -struct SilcClientObject { - /* - * Public data. All the following pointers must be set by the allocator - * of this structure. - */ +struct SilcClientStruct { + 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 */ - /* Users's username and realname. */ - char *username; - char *realname; + 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 */ - /* Private and public key of the user. */ - SilcPKCS pkcs; - SilcPublicKey public_key; - SilcPrivateKey private_key; - - /* 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; - - /* SILC client task queues */ - SilcTaskQueue io_queue; - SilcTaskQueue timeout_queue; - SilcTaskQueue generic_queue; - - /* Table of connections in client. All the connection data is saved here. */ - SilcClientConnection *conns; - unsigned int conns_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; + + /* Application specific user data pointer. Client library does not + touch this. This the context sent as argument to silc_client_alloc. */ + void *application; + + /* Internal data for client library. Application cannot access this + data at all. */ + SilcClientInternal internal; }; -/* 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(fd) \ -do { \ - silc_schedule_set_listen_fd((fd), (1L << SILC_TASK_READ)); \ -} while(0) \ - -#define SILC_CLIENT_SET_CONNECTION_FOR_OUTPUT(fd) \ -do { \ - silc_schedule_set_listen_fd((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]->sock->sock == (__fd)) \ - break; \ - \ - if (__i >= (__x)->conns_count) \ - (__sock) = NULL; \ - (__sock) = (__x)->conns[__i]->sock; \ -} while(0) - -/* Prototypes */ - -SilcClient silc_client_alloc(SilcClientOperations *ops, void *application); -void silc_client_free(SilcClient client); -int silc_client_init(SilcClient client); -void silc_client_stop(SilcClient client); -void silc_client_run(SilcClient client); -SilcClientConnection silc_client_add_connection(SilcClient client, - void *context); -int silc_client_connect_to_server(SilcClient client, int port, - char *host, void *context); -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, - unsigned int data_len, - int force_send); -void silc_client_packet_send_to_channel(SilcClient client, - SilcSocketConnection sock, - SilcChannelEntry channel, - unsigned char *data, - unsigned int data_len, - int force_send); -void silc_client_packet_send_private_message(SilcClient client, - SilcSocketConnection sock, - SilcClientEntry client_entry, - unsigned char *data, - unsigned int data_len, - int force_send); -void silc_client_close_connection(SilcClient client, - SilcSocketConnection sock); -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_notify_by_server(SilcClient client, - SilcSocketConnection sock, - SilcBuffer message); -void silc_client_receive_new_id(SilcClient client, - SilcSocketConnection sock, - unsigned char *id_string); -void silc_client_new_channel_id(SilcClient client, - SilcSocketConnection sock, - char *channel_name, - unsigned int mode, - unsigned char *id_string); -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_private_message(SilcClient client, - SilcSocketConnection sock, - SilcPacketContext *packet); #endif