From 63bbc710b23893742e5ccbd430f95bf2d29c2da6 Mon Sep 17 00:00:00 2001 From: Jakub Sławiński Date: Thu, 3 Nov 2005 20:37:56 +0100 Subject: v0.7.4 - Fixed: sockets in CLOSE_WAIT state left by afclient - Added: --localname and --localport options - Added: --localdesname option - Added: kicking user in 'opening' state - Fixed: info about kicked user - Fixed: TERM signal handling - Fixed: id lost after reconnection - Fixed: printing wrong client name in 'SSL_accept failed (timeout)' message - Fixed: ignored 'certificate' and 'key' options from config file - Added: config files for afclient - Modified: some options in afserver config file --- src/afserver.c | 1681 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 905 insertions(+), 776 deletions(-) (limited to 'src/afserver.c') diff --git a/src/afserver.c b/src/afserver.c index 1066176..2d6e1eb 100644 --- a/src/afserver.c +++ b/src/afserver.c @@ -61,7 +61,7 @@ static struct option long_options[] = { {0, 0, 0, 0} }; -ConfigurationT config; +ServerConfiguration* config; int main(int argc, char **argv) @@ -96,13 +96,19 @@ main(int argc, char **argv) char baseport = 0; char audit = 0; char dnslookups = 0; - RealmT* pointer = NULL; + ServerRealm* pointer = NULL; struct sigaction act; time_t now; + ServerRealm** scRealmsTable; + UsrCli** srUsersClientsTable; + ConnectUser** srUsersTable; + ConnectClient** srClientsTable; + ConnectClient** srRaClientsTable; char* certif = NULL; char* keys = NULL; char* dateformat = NULL; + char* stemp = NULL; SSL_METHOD* method; SSL_CTX* ctx; @@ -115,17 +121,10 @@ main(int argc, char **argv) sigaction(SIGPIPE, &act, NULL); act.sa_handler = server_sig_int; sigaction(SIGINT, &act, NULL); + sigaction(SIGTERM, &act, NULL); TYPE_SET_SSL(mode); TYPE_SET_ZLIB(mode); - - memset(&config, 0, sizeof(config)); - - config.certif = NULL; - config.keys = NULL; - config.size = 0; - config.realmtable = NULL; - config.dateformat = NULL; #ifdef HAVE_LIBPTHREAD remember_mainthread(); @@ -322,25 +321,29 @@ main(int argc, char **argv) } else { if (certif == NULL) { - config.certif = "cacert.pem"; + if (ServerConfiguration_get_certificateFile(config) == NULL) { + ServerConfiguration_set_certificateFile(config, "cacert.pem"); + } } else { - config.certif = certif; + ServerConfiguration_set_certificateFile(config, certif); } if (keys == NULL) { - config.keys = "server.rsa"; + if (ServerConfiguration_get_keysFile(config) == NULL) { + ServerConfiguration_set_keysFile(config, "server.rsa"); + } } else { - config.keys = keys; + ServerConfiguration_set_keysFile(config, keys); } if (dateformat != NULL) { - config.dateformat = dateformat; + ServerConfiguration_set_dateFormat(config, dateformat); } - initializelogging(verbose, config.dateformat); + initializelogging(verbose, ServerConfiguration_get_dateFormat(config)); aflog(LOG_T_INIT, LOG_I_INFO, - "cfg file OK! (readed realms: %d)", config.size); + "cfg file OK! (readed realms: %d)", ServerConfiguration_get_realmsNumber(config)); if (name != NULL) aflog(LOG_T_INIT, LOG_I_WARNING, "Warning: hostname=%s will be ignored", name); @@ -358,12 +361,17 @@ main(int argc, char **argv) "Warning: password from command line will be ignored"); } } - else { - config.certif = certif; - config.keys = keys; - config.dateformat = dateformat; - - initializelogging(verbose, config.dateformat); + else { + config = ServerConfiguration_new(); + if (config == NULL) { + printf("Can't allocate memory for server configuration... exiting\n"); + exit(1); + } + ServerConfiguration_set_certificateFile(config, certif); + ServerConfiguration_set_keysFile(config, keys); + ServerConfiguration_set_dateFormat(config, dateformat); + + initializelogging(verbose, ServerConfiguration_get_dateFormat(config)); if (listen == NULL) { listencount = 1; @@ -380,52 +388,77 @@ main(int argc, char **argv) "Number of listen and manage options are not the same... exiting"); exit(1); } - if (config.certif == NULL) { - config.certif = "cacert.pem"; - } - if (config.keys == NULL) { - config.keys = "server.rsa"; - } + if (ServerConfiguration_get_certificateFile(config) == NULL) { + ServerConfiguration_set_certificateFile(config, "cacert.pem"); + } + if (ServerConfiguration_get_keysFile(config) == NULL) { + ServerConfiguration_set_keysFile(config, "server.rsa"); + } if (type == NULL) { type = "tcp"; } - config.size = 1; - config.realmtable = calloc(config.size, sizeof(RealmT)); - config.realmtable[0].hostname = name; - config.realmtable[0].usrclinum = managecount; - config.realmtable[0].usrclitable = calloc(managecount, sizeof(UsrCli*)); - for (i = 0; i < config.realmtable[0].usrclinum; ++i) { - config.realmtable[0].usrclitable[i] = UsrCli_new(); - if (config.realmtable[0].usrclitable[i] == NULL) { + ServerConfiguration_set_realmsNumber(config, 1); + scRealmsTable = calloc(1, sizeof(ServerRealm*)); + if (scRealmsTable == NULL) { + aflog(LOG_T_INIT, LOG_I_CRIT, + "Problem with allocating memory for ServerRealm* table... exiting"); + exit(1); + } + ServerConfiguration_set_realmsTable(config, scRealmsTable); + pointer = ServerRealm_new(); + if (pointer == NULL) { + aflog(LOG_T_INIT, LOG_I_CRIT, + "Problem with allocating memory for ServerRealm structure... exiting"); + exit(1); + } + scRealmsTable[0] = pointer; + ServerRealm_set_hostName(pointer, name); + ServerRealm_set_userClientPairs(pointer, managecount); + srUsersClientsTable = calloc(managecount, sizeof(UsrCli*)); + if (srUsersClientsTable == NULL) { + aflog(LOG_T_INIT, LOG_I_CRIT, + "Problem with allocating memory for UsrCli* table... exiting"); + exit(1); + } + ServerRealm_set_usersClientsTable(pointer, srUsersClientsTable); + for (i = 0; i < managecount; ++i) { + srUsersClientsTable[i] = UsrCli_new(); + if (srUsersClientsTable[i] == NULL) { aflog(LOG_T_INIT, LOG_I_CRIT, "Problem with allocating memory for UsrCli structure... exiting"); exit(1); } - UsrCli_set_listenPortName(config.realmtable[0].usrclitable[i], listen[i]); - UsrCli_set_managePortName(config.realmtable[0].usrclitable[i], manage[i]); + UsrCli_set_listenPortName(srUsersClientsTable[i], listen[i]); + UsrCli_set_managePortName(srUsersClientsTable[i], manage[i]); } - config.realmtable[0].users = amount; - config.realmtable[0].clients = clients; - config.realmtable[0].raclients = raclients; - config.realmtable[0].timeout = timeout; - config.realmtable[0].usrpcli = usrpcli; - config.realmtable[0].clim = clim; - config.realmtable[0].baseport = baseport; - config.realmtable[0].audit = audit; + ServerRealm_set_sUsersLimit(pointer, amount); + ServerRealm_set_sClientsLimit(pointer, clients); + ServerRealm_set_sRaClientsLimit(pointer, raclients); + ServerRealm_set_sTimeout(pointer, timeout); + ServerRealm_set_sUsersPerClient(pointer, usrpcli); + ServerRealm_set_sClientMode(pointer, clim); + ServerRealm_set_basePortOn(pointer, baseport); + ServerRealm_set_auditOn(pointer, audit); #ifdef HAVE_LIBPTHREAD - config.realmtable[0].tunneltype = tunneltype; + ServerRealm_set_tunnelType(pointer, tunneltype); #endif - config.realmtable[0].dnslookups = dnslookups; - config.realmtable[0].realmname = realmname; - memcpy(config.realmtable[0].pass, pass, 4); + ServerRealm_set_dnsLookupsOn(pointer, dnslookups); + ServerRealm_set_realmName(pointer, realmname); + ServerRealm_set_password(pointer, pass); if (strcmp(type, "tcp") == 0) { - TYPE_SET_TCP(config.realmtable[0].type); + temp = ServerRealm_get_realmType(pointer); + TYPE_SET_TCP(temp); + ServerRealm_set_realmType(pointer, temp); } else if (strcmp(type, "udp") == 0) { - TYPE_SET_UDP(config.realmtable[0].type); + temp = ServerRealm_get_realmType(pointer); + TYPE_SET_UDP(temp); + ServerRealm_set_realmType(pointer, temp); } else { - TYPE_SET_ZERO(config.realmtable[0].type); + temp = ServerRealm_get_realmType(pointer); + TYPE_SET_ZERO(temp); + ServerRealm_set_realmType(pointer, temp); } #ifdef AF_INET6 if (ipfam == -1) { @@ -434,13 +467,19 @@ main(int argc, char **argv) exit(1); } else if (ipfam == 4) { - TYPE_SET_IPV4(config.realmtable[0].type); + temp = ServerRealm_get_realmType(pointer); + TYPE_SET_IPV4(temp); + ServerRealm_set_realmType(pointer, temp); } else if (ipfam == 6) { - TYPE_SET_IPV6(config.realmtable[0].type); + temp = ServerRealm_get_realmType(pointer); + TYPE_SET_IPV6(temp); + ServerRealm_set_realmType(pointer, temp); } #endif - config.realmtable[0].type |= mode; + temp = ServerRealm_get_realmType(pointer); + temp |= mode; + ServerRealm_set_realmType(pointer, temp); } maxfdp1 = manconnecting = 0; @@ -461,25 +500,30 @@ main(int argc, char **argv) "Warning: Creating ./apf directory failed (%d)", flags); } } - if ((flags = generate_rsa_key(&config.keys))) { + keys = ServerConfiguration_get_keysFile(config); + if ((flags = generate_rsa_key(&keys))) { aflog(LOG_T_INIT, LOG_I_WARNING, "Warning: Something bad happened when generating rsa keys... (%d)", flags); } - if (SSL_CTX_use_RSAPrivateKey_file(ctx, config.keys, SSL_FILETYPE_PEM) != 1) { + ServerConfiguration_set_keysFile(config, keys); + if (SSL_CTX_use_RSAPrivateKey_file(ctx, ServerConfiguration_get_keysFile(config), SSL_FILETYPE_PEM) != 1) { aflog(LOG_T_INIT, LOG_I_CRIT, - "Setting rsa key failed (%s)... exiting", config.keys); + "Setting rsa key failed (%s)... exiting", ServerConfiguration_get_keysFile(config)); exit(1); } - if ((flags = generate_certificate(&config.certif, config.keys))) { + certif = ServerConfiguration_get_certificateFile(config); + if ((flags = generate_certificate(&certif, ServerConfiguration_get_keysFile(config)))) { aflog(LOG_T_INIT, LOG_I_WARNING, "Warning: Something bad happened when generating certificate... (%d)", flags); } - if (SSL_CTX_use_certificate_file(ctx, config.certif, SSL_FILETYPE_PEM) != 1) { + ServerConfiguration_set_certificateFile(config, certif); + if (SSL_CTX_use_certificate_file(ctx, + ServerConfiguration_get_certificateFile(config), SSL_FILETYPE_PEM) != 1) { aflog(LOG_T_INIT, LOG_I_CRIT, - "Setting certificate failed (%s)... exiting", config.certif); + "Setting certificate failed (%s)... exiting", ServerConfiguration_get_certificateFile(config)); exit(1); } - if (config.size == 0) { + if (ServerConfiguration_get_realmsNumber(config) == 0) { aflog(LOG_T_INIT, LOG_I_CRIT, "Working without sense is really without sense..."); exit(1); @@ -491,141 +535,180 @@ main(int argc, char **argv) if (!verbose) daemon(0, 0); - for (i = 0; i < config.size; ++i) { - if (config.realmtable[i].usrclinum == 0) { + scRealmsTable = ServerConfiguration_get_realmsTable(config); + for (i = 0; i < ServerConfiguration_get_realmsNumber(config); ++i) { + if (ServerRealm_get_userClientPairs(scRealmsTable[i]) == 0) { aflog(LOG_T_INIT, LOG_I_CRIT, "You have to specify at least one listen port and one manage port in each realm"); exit(1); } - for (j = 0; j < config.realmtable[i].usrclinum; ++j) { - if ((UsrCli_get_listenPortName(config.realmtable[i].usrclitable[j]) == NULL) || - (UsrCli_get_managePortName(config.realmtable[i].usrclitable[j]) == NULL)) { + srUsersClientsTable = ServerRealm_get_usersClientsTable(scRealmsTable[i]); + for (j = 0; j < ServerRealm_get_userClientPairs(scRealmsTable[i]); ++j) { + if ((UsrCli_get_listenPortName(srUsersClientsTable[j]) == NULL) || + (UsrCli_get_managePortName(srUsersClientsTable[j]) == NULL)) { aflog(LOG_T_INIT, LOG_I_CRIT, "Missing some of the variables...\nRealm: %d\nlistenport[%d]: %s\nmanageport[%d]: %s", - i, j, UsrCli_get_listenPortName(config.realmtable[i].usrclitable[j]), - j, UsrCli_get_managePortName(config.realmtable[i].usrclitable[j])); + i, j, UsrCli_get_listenPortName(srUsersClientsTable[j]), + j, UsrCli_get_managePortName(srUsersClientsTable[j])); exit(1); } } /* checking type of the realm */ - if (!TYPE_IS_SET(config.realmtable[i].type)) { + if (!TYPE_IS_SET(ServerRealm_get_realmType(scRealmsTable[i]))) { if (type != NULL) { if (strcmp(type, "tcp") == 0) { - TYPE_SET_TCP(config.realmtable[i].type); + temp = ServerRealm_get_realmType(scRealmsTable[i]); + TYPE_SET_TCP(temp); + ServerRealm_set_realmType(scRealmsTable[i], temp); } else if (strcmp(type, "udp") == 0) { - TYPE_SET_UDP(config.realmtable[i].type); + temp = ServerRealm_get_realmType(scRealmsTable[i]); + TYPE_SET_UDP(temp); + ServerRealm_set_realmType(scRealmsTable[i], temp); } else { - TYPE_SET_TCP(config.realmtable[i].type); + temp = ServerRealm_get_realmType(scRealmsTable[i]); + TYPE_SET_TCP(temp); + ServerRealm_set_realmType(scRealmsTable[i], temp); } } else { - TYPE_SET_TCP(config.realmtable[i].type); + temp = ServerRealm_get_realmType(scRealmsTable[i]); + TYPE_SET_TCP(temp); + ServerRealm_set_realmType(scRealmsTable[i], temp); } } #ifdef AF_INET6 /* using user's value for ipfam*/ - if (TYPE_IS_UNSPEC(config.realmtable[i].type)) { + if (TYPE_IS_UNSPEC(ServerRealm_get_realmType(scRealmsTable[i]))) { if (ipfam == -1) { aflog(LOG_T_INIT, LOG_I_CRIT, "Conflicting types of ip protocol family... exiting"); exit(1); } else if (ipfam == 4) { - TYPE_SET_IPV4(config.realmtable[i].type); + temp = ServerRealm_get_realmType(scRealmsTable[i]); + TYPE_SET_IPV4(temp); + ServerRealm_set_realmType(scRealmsTable[i], temp); } else if (ipfam == 6) { - TYPE_SET_IPV6(config.realmtable[i].type); + temp = ServerRealm_get_realmType(scRealmsTable[i]); + TYPE_SET_IPV6(temp); + ServerRealm_set_realmType(scRealmsTable[i], temp); } } #endif /* using user's values for zlib and ssl mode*/ if (!TYPE_IS_SSL(mode)) { - TYPE_UNSET_SSL(config.realmtable[i].type); + temp = ServerRealm_get_realmType(scRealmsTable[i]); + TYPE_UNSET_SSL(temp); + ServerRealm_set_realmType(scRealmsTable[i], temp); } if (!TYPE_IS_ZLIB(mode)) { - TYPE_UNSET_ZLIB(config.realmtable[i].type); + temp = ServerRealm_get_realmType(scRealmsTable[i]); + TYPE_UNSET_ZLIB(temp); + ServerRealm_set_realmType(scRealmsTable[i], temp); } /* using user's baseport value*/ - if (config.realmtable[i].baseport == 0) { - config.realmtable[i].baseport = baseport; + if (ServerRealm_get_basePortOn(scRealmsTable[i]) == 0) { + ServerRealm_set_basePortOn(scRealmsTable[i], baseport); } /* using user's audit value*/ - if (config.realmtable[i].audit == 0) { - config.realmtable[i].audit = audit; + if (ServerRealm_get_auditOn(scRealmsTable[i]) == 0) { + ServerRealm_set_auditOn(scRealmsTable[i], audit); } #ifdef HAVE_LIBPTHREAD /* using user's tunneltype value*/ - if (config.realmtable[i].tunneltype == 0) { + if (ServerRealm_get_tunnelType(scRealmsTable[i]) == 0) { if (tunneltype == -1) { aflog(LOG_T_INIT, LOG_I_CRIT, "Conflicting types of tunnel type... exiting"); exit(1); } - config.realmtable[i].tunneltype = tunneltype; + ServerRealm_set_tunnelType(scRealmsTable[i], tunneltype); } #endif /* using user's dnslookups value*/ - if (config.realmtable[i].dnslookups == 0) { - config.realmtable[i].dnslookups = dnslookups; + if (ServerRealm_get_dnsLookupsOn(scRealmsTable[i]) == 0) { + ServerRealm_set_dnsLookupsOn(scRealmsTable[i], dnslookups); } /* checking users amount */ - set_value(&(config.realmtable[i].users), amount, "5"); - check_value(&(config.realmtable[i].usernum), config.realmtable[i].users, "Invalid users amount"); + stemp = ServerRealm_get_sUsersLimit(scRealmsTable[i]); + set_value(&stemp, amount, "5"); + ServerRealm_set_sUsersLimit(scRealmsTable[i], stemp); + ServerRealm_set_usersLimit(scRealmsTable[i], + check_value(ServerRealm_get_sUsersLimit(scRealmsTable[i]), "Invalid users amount")); /* checking clients amount */ - set_value(&(config.realmtable[i].clients), clients, "1"); - check_value(&(config.realmtable[i].clinum), config.realmtable[i].clients, "Invalid clients amount"); + stemp = ServerRealm_get_sClientsLimit(scRealmsTable[i]); + set_value(&stemp, clients, "1"); + ServerRealm_set_sClientsLimit(scRealmsTable[i], stemp); + ServerRealm_set_clientsLimit(scRealmsTable[i], + check_value(ServerRealm_get_sClientsLimit(scRealmsTable[i]), "Invalid clients amount")); /* checking raclients amount */ - set_value(&(config.realmtable[i].raclients), raclients, "1"); - check_value(&(config.realmtable[i].raclinum), config.realmtable[i].raclients, "Invalid raclients amount"); + stemp = ServerRealm_get_sRaClientsLimit(scRealmsTable[i]); + set_value(&stemp, raclients, "1"); + ServerRealm_set_sRaClientsLimit(scRealmsTable[i], stemp); + ServerRealm_set_raClientsLimit(scRealmsTable[i], + check_value(ServerRealm_get_sRaClientsLimit(scRealmsTable[i]), "Invalid raclients amount")); /* checking usrpcli value */ - set_value(&(config.realmtable[i].usrpcli), usrpcli, config.realmtable[i].users); - check_value(&(config.realmtable[i].upcnum), config.realmtable[i].usrpcli, "Invalid usrpcli value"); + stemp = ServerRealm_get_sUsersPerClient(scRealmsTable[i]); + set_value(&stemp, usrpcli, ServerRealm_get_sUsersLimit(scRealmsTable[i])); + ServerRealm_set_sUsersPerClient(scRealmsTable[i], stemp); + ServerRealm_set_usersPerClient(scRealmsTable[i], + check_value(ServerRealm_get_sUsersPerClient(scRealmsTable[i]), "Invalid usrpcli value")); /* checking timeout value */ - set_value(&(config.realmtable[i].timeout), timeout, "5"); - check_value(&(config.realmtable[i].tmout), config.realmtable[i].timeout, "Invalid timeout value"); + stemp = ServerRealm_get_sTimeout(scRealmsTable[i]); + set_value(&stemp, timeout, "5"); + ServerRealm_set_sTimeout(scRealmsTable[i], stemp); + ServerRealm_set_timeout(scRealmsTable[i], + check_value(ServerRealm_get_sTimeout(scRealmsTable[i]), "Invalid timeout value")); /* checking climode value */ - set_value(&(config.realmtable[i].clim), clim, "1"); - check_value(&(config.realmtable[i].climode), config.realmtable[i].clim, "Invalid climode value"); + stemp = ServerRealm_get_sClientMode(scRealmsTable[i]); + set_value(&stemp, clim, "1"); + ServerRealm_set_sClientMode(scRealmsTable[i], stemp); + ServerRealm_set_clientMode(scRealmsTable[i], + check_value(ServerRealm_get_sClientMode(scRealmsTable[i]), "Invalid climode value")); /* allocating memory*/ - config.realmtable[i].contable = calloc(config.realmtable[i].usernum, sizeof(ConnectUser)); - if (config.realmtable[i].contable == NULL) { + srUsersTable = calloc(ServerRealm_get_usersLimit(scRealmsTable[i]), sizeof(ConnectUser*)); + if (srUsersTable == NULL) { aflog(LOG_T_INIT, LOG_I_CRIT, "Calloc error - try define smaller amount of users"); exit(1); } - for (j = 0; j < config.realmtable[i].usernum; ++j) { - config.realmtable[i].contable[j] = ConnectUser_new(); - if (config.realmtable[i].contable[j] == NULL) { + ServerRealm_set_usersTable(scRealmsTable[i], srUsersTable); + for (j = 0; j < ServerRealm_get_usersLimit(scRealmsTable[i]); ++j) { + srUsersTable[j] = ConnectUser_new(); + if (srUsersTable[j] == NULL) { aflog(LOG_T_INIT, LOG_I_CRIT, "Calloc error - try define smaller amount of users"); exit(1); } } - config.realmtable[i].clitable = calloc( config.realmtable[i].clinum, sizeof(ConnectClient)); - if (config.realmtable[i].clitable == NULL) { + srClientsTable = calloc(ServerRealm_get_clientsLimit(scRealmsTable[i]), sizeof(ConnectClient*)); + if (srClientsTable == NULL) { aflog(LOG_T_INIT, LOG_I_CRIT, "Calloc error - try define smaller amount of clients"); exit(1); } - for (j = 0; j < config.realmtable[i].clinum; ++j) { - config.realmtable[i].clitable[j] = ConnectClient_new(); - if (config.realmtable[i].clitable[j] == NULL) { + ServerRealm_set_clientsTable(scRealmsTable[i], srClientsTable); + for (j = 0; j < ServerRealm_get_clientsLimit(scRealmsTable[i]); ++j) { + srClientsTable[j] = ConnectClient_new(); + if (srClientsTable[j] == NULL) { aflog(LOG_T_INIT, LOG_I_CRIT, "Calloc error - try define smaller amount of clients"); exit(1); } } - config.realmtable[i].raclitable = calloc( config.realmtable[i].raclinum, sizeof(ConnectClient)); - if (config.realmtable[i].raclitable == NULL) { + srRaClientsTable = calloc(ServerRealm_get_raClientsLimit(scRealmsTable[i]), sizeof(ConnectClient*)); + if (srRaClientsTable == NULL) { aflog(LOG_T_INIT, LOG_I_CRIT, "Calloc error - try define smaller amount of raclients"); exit(1); } - for (j = 0; j < config.realmtable[i].raclinum; ++j) { - config.realmtable[i].raclitable[j] = ConnectClient_new(); - if (config.realmtable[i].raclitable[j] == NULL) { + ServerRealm_set_raClientsTable(scRealmsTable[i], srRaClientsTable); + for (j = 0; j < ServerRealm_get_raClientsLimit(scRealmsTable[i]); ++j) { + srRaClientsTable[j] = ConnectClient_new(); + if (srRaClientsTable[j] == NULL) { aflog(LOG_T_INIT, LOG_I_CRIT, "Calloc error - try define smaller amount of raclients"); exit(1); @@ -633,20 +716,20 @@ main(int argc, char **argv) } ipfam = 0x01; #ifdef AF_INET6 - if (TYPE_IS_IPV4(config.realmtable[i].type)) { + if (TYPE_IS_IPV4(ServerRealm_get_realmType(scRealmsTable[i]))) { ipfam |= 0x02; } - else if (TYPE_IS_IPV6(config.realmtable[i].type)) { + else if (TYPE_IS_IPV6(ServerRealm_get_realmType(scRealmsTable[i]))) { ipfam |= 0x04; } #endif - if (config.realmtable[i].baseport == 0) { - for (j = 0; j < config.realmtable[i].usrclinum; ++j) { - if (ip_listen(&temp, UsrCli_get_listenHostName(config.realmtable[i].usrclitable[j]) ? - UsrCli_get_listenHostName(config.realmtable[i].usrclitable[j]) : - config.realmtable[i].hostname, - UsrCli_get_listenPortName(config.realmtable[i].usrclitable[j]), - (&(config.realmtable[i].addrlen)), ipfam)) { + if (ServerRealm_get_basePortOn(scRealmsTable[i]) == 0) { + for (j = 0; j < ServerRealm_get_userClientPairs(scRealmsTable[i]); ++j) { + if (ip_listen(&temp, UsrCli_get_listenHostName(srUsersClientsTable[j]) ? + UsrCli_get_listenHostName(srUsersClientsTable[j]) : + ServerRealm_get_hostName(scRealmsTable[i]), + UsrCli_get_listenPortName(srUsersClientsTable[j]), + (&len), ipfam)) { aflog(LOG_T_INIT, LOG_I_CRIT, #ifdef AF_INET6 "tcp_listen_%s error for %s, %s", @@ -654,25 +737,27 @@ main(int argc, char **argv) #else "tcp_listen error for %s, %s", #endif - UsrCli_get_listenHostName(config.realmtable[i].usrclitable[j]) ? - UsrCli_get_listenHostName(config.realmtable[i].usrclitable[j]) : - config.realmtable[i].hostname, - UsrCli_get_listenPortName(config.realmtable[i].usrclitable[j])); + UsrCli_get_listenHostName(srUsersClientsTable[j]) ? + UsrCli_get_listenHostName(srUsersClientsTable[j]) : + ServerRealm_get_hostName(scRealmsTable[i]), + UsrCli_get_listenPortName(srUsersClientsTable[j])); exit(1); } - UsrCli_set_listenFd(config.realmtable[i].usrclitable[j], temp); - flags = fcntl(UsrCli_get_listenFd(config.realmtable[i].usrclitable[j]), F_GETFL, 0); - fcntl(UsrCli_get_listenFd(config.realmtable[i].usrclitable[j]), F_SETFL, flags | O_NONBLOCK); + ServerRealm_set_addressLength(scRealmsTable[i], len); + UsrCli_set_listenFd(srUsersClientsTable[j], temp); + flags = fcntl(UsrCli_get_listenFd(srUsersClientsTable[j]), F_GETFL, 0); + fcntl(UsrCli_get_listenFd(srUsersClientsTable[j]), F_SETFL, flags | O_NONBLOCK); } } - for (j = 0; j < config.realmtable[i].usrclinum; ++j) { - switch (config.realmtable[i].tunneltype) { + + for (j = 0; j < ServerRealm_get_userClientPairs(scRealmsTable[i]); ++j) { + switch (ServerRealm_get_tunnelType(scRealmsTable[i])) { case 0: { - if (ip_listen(&temp, UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) ? - UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) : - config.realmtable[i].hostname, - UsrCli_get_managePortName(config.realmtable[i].usrclitable[j]), - (&(config.realmtable[i].addrlen)), ipfam)) { + if (ip_listen(&temp, UsrCli_get_manageHostName(srUsersClientsTable[j]) ? + UsrCli_get_manageHostName(srUsersClientsTable[j]) : + ServerRealm_get_hostName(scRealmsTable[i]), + UsrCli_get_managePortName(srUsersClientsTable[j]), + (&len), ipfam)) { aflog(LOG_T_INIT, LOG_I_CRIT, #ifdef AF_INET6 "tcp_listen_%s error for %s, %s", @@ -680,46 +765,49 @@ main(int argc, char **argv) #else "tcp_listen error for %s, %s", #endif - UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) ? - UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) : - config.realmtable[i].hostname, - UsrCli_get_managePortName(config.realmtable[i].usrclitable[j])); + UsrCli_get_manageHostName(srUsersClientsTable[j]) ? + UsrCli_get_manageHostName(srUsersClientsTable[j]) : + ServerRealm_get_hostName(scRealmsTable[i]), + UsrCli_get_managePortName(srUsersClientsTable[j])); exit(1); } - UsrCli_set_manageFd(config.realmtable[i].usrclitable[j], temp); - flags = fcntl(UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]), F_GETFL, 0); - fcntl(UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]), F_SETFL, flags | O_NONBLOCK); + ServerRealm_set_addressLength(scRealmsTable[i], len); + UsrCli_set_manageFd(srUsersClientsTable[j], temp); + flags = fcntl(UsrCli_get_manageFd(srUsersClientsTable[j]), F_GETFL, 0); + fcntl(UsrCli_get_manageFd(srUsersClientsTable[j]), F_SETFL, flags | O_NONBLOCK); break; } #ifdef HAVE_LIBPTHREAD case 1: case 2: { if (initialize_http_proxy_server(&temp, - UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) ? - UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) : - config.realmtable[i].hostname, - UsrCli_get_managePortName(config.realmtable[i].usrclitable[j]), - (&(config.realmtable[i].addrlen)), ipfam, - config.realmtable[i].clinum + config.realmtable[i].raclinum, - (config.realmtable[i].tunneltype - 1), + UsrCli_get_manageHostName(srUsersClientsTable[j]) ? + UsrCli_get_manageHostName(srUsersClientsTable[j]) : + ServerRealm_get_hostName(scRealmsTable[i]), + UsrCli_get_managePortName(srUsersClientsTable[j]), + (&len), ipfam, + ServerRealm_get_clientsLimit(scRealmsTable[i]) + + ServerRealm_get_raClientsLimit(scRealmsTable[i]), + (ServerRealm_get_tunnelType(scRealmsTable[i]) - 1), ctx)) { aflog(LOG_T_INIT, LOG_I_CRIT, #ifdef AF_INET6 "http%s_proxy_listen_%s error for %s, %s", - (config.realmtable[i].tunneltype == 2) ? "s" : "", + (ServerRealm_get_tunnelType(scRealmsTable[i]) == 2) ? "s" : "", (ipfam & 0x02)?"ipv4":(ipfam & 0x04)?"ipv6":"unspec", #else "http%s_proxy_listen error for %s, %s", - (config.realmtable[i].tunneltype == 2) ? "s" : "", + (ServerRealm_get_tunnelType(scRealmsTable[i]) == 2) ? "s" : "", #endif - UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) ? - UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) : - config.realmtable[i].hostname, - UsrCli_get_managePortName(config.realmtable[i].usrclitable[j])); + UsrCli_get_manageHostName(srUsersClientsTable[j]) ? + UsrCli_get_manageHostName(srUsersClientsTable[j]) : + ServerRealm_get_hostName(scRealmsTable[i]), + UsrCli_get_managePortName(srUsersClientsTable[j])); exit(1); } - UsrCli_set_manageFd(config.realmtable[i].usrclitable[j], temp); - flags = fcntl(UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]), F_GETFL, 0); - fcntl(UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]), F_SETFL, flags | O_NONBLOCK); + ServerRealm_set_addressLength(scRealmsTable[i], len); + UsrCli_set_manageFd(srUsersClientsTable[j], temp); + flags = fcntl(UsrCli_get_manageFd(srUsersClientsTable[j]), F_GETFL, 0); + fcntl(UsrCli_get_manageFd(srUsersClientsTable[j]), F_SETFL, flags | O_NONBLOCK); break; } #endif @@ -731,58 +819,66 @@ main(int argc, char **argv) } } } - config.realmtable[i].cliaddr = malloc(config.realmtable[i].addrlen); + + ServerRealm_set_clientAddress(scRealmsTable[i], malloc(ServerRealm_get_addressLength(scRealmsTable[i]))); + if (ServerRealm_get_clientAddress(scRealmsTable[i]) == NULL) { + aflog(LOG_T_INIT, LOG_I_CRIT, + "Allocating memory for client addresses failed... exiting"); + exit(1); + } - for (j=0; j (UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]) + 1)) ? - maxfdp1 : (UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]) + 1); + for (j = 0; j < ServerRealm_get_userClientPairs(scRealmsTable[i]); ++j) { + FD_SET(UsrCli_get_manageFd(srUsersClientsTable[j]), &allset); + maxfdp1 = (maxfdp1 > (UsrCli_get_manageFd(srUsersClientsTable[j]) + 1)) ? + maxfdp1 : (UsrCli_get_manageFd(srUsersClientsTable[j]) + 1); } - if (config.realmtable[i].baseport == 0) { - for (j = 0; j < config.realmtable[i].usrclinum; ++j) { - FD_SET(UsrCli_get_listenFd(config.realmtable[i].usrclitable[j]), &allset); - maxfdp1 = (maxfdp1 > (UsrCli_get_listenFd(config.realmtable[i].usrclitable[j]) + 1)) ? - maxfdp1 : (UsrCli_get_listenFd(config.realmtable[i].usrclitable[j]) + 1); + if (ServerRealm_get_basePortOn(scRealmsTable[i]) == 0) { + for (j = 0; j < ServerRealm_get_userClientPairs(scRealmsTable[i]); ++j) { + FD_SET(UsrCli_get_listenFd(srUsersClientsTable[j]), &allset); + maxfdp1 = (maxfdp1 > (UsrCli_get_listenFd(srUsersClientsTable[j]) + 1)) ? + maxfdp1 : (UsrCli_get_listenFd(srUsersClientsTable[j]) + 1); } } - config.realmtable[i].usercon = 0; - config.realmtable[i].clicon = 0; - config.realmtable[i].raclicon = 0; - for (j=0; jusernum; ++i) { - if ((ConnectUser_get_state(pointer->contable[i]) == S_STATE_OPEN) || - (ConnectUser_get_state(pointer->contable[i]) == S_STATE_STOPPED)) - if (FD_ISSET(ConnectUser_get_connFd(pointer->contable[i]), &rset)) { - k = eval_usernum(pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])], i); + for (j = 0; j < ServerConfiguration_get_realmsNumber(config); ++j) { + pointer = scRealmsTable[j]; + srUsersTable = ServerRealm_get_usersTable(pointer); + srClientsTable = ServerRealm_get_clientsTable(pointer); + srRaClientsTable = ServerRealm_get_raClientsTable(pointer); + srUsersClientsTable = ServerRealm_get_usersClientsTable(pointer); + for (i = 0; i < ServerRealm_get_usersLimit(pointer); ++i) { + if ((ConnectUser_get_state(srUsersTable[i]) == S_STATE_OPEN) || + (ConnectUser_get_state(srUsersTable[i]) == S_STATE_STOPPED)) + if (FD_ISSET(ConnectUser_get_connFd(srUsersTable[i]), &rset)) { + k = eval_usernum(srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])], i); aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: Client[%s]: user[%d]: FD_ISSET", get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + "realm[%s]: Client[%s]: user[%d]: FD_ISSET", get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer,i)); - if (TYPE_IS_TCP(pointer->type)) { /* forwarding tcp packets */ - n = read(ConnectUser_get_connFd(pointer->contable[i]), &buff[5], 8091); + if (TYPE_IS_TCP(ServerRealm_get_realmType(pointer))) { /* forwarding tcp packets */ + n = read(ConnectUser_get_connFd(srUsersTable[i]), &buff[5], 8091); if (n == -1) { if (errno == EAGAIN) { continue; } aflog(LOG_T_USER, LOG_I_ERR, - "realm[%s]: Client[%s]: user[%d]: READ ERROR (%d)", get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + "realm[%s]: Client[%s]: user[%d]: READ ERROR (%d)", get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i), errno); n = 0; } if (n) { aflog(LOG_T_USER, LOG_I_DEBUG, - "realm[%s]: Client[%s]: FROM user[%d]: MESSAGE length=%d", get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + "realm[%s]: Client[%s]: FROM user[%d]: MESSAGE length=%d", get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i), n); - UserStats_add_upload(ConnectUser_get_stats(pointer->contable[i]), n); + UserStats_add_upload(ConnectUser_get_stats(srUsersTable[i]), n); if ((buff[5] == AF_S_MESSAGE) && (buff[6] == AF_S_LOGIN) && (buff[7] == AF_S_MESSAGE)) { aflog(LOG_T_USER, LOG_I_WARNING, "WARNING: got packet similiar to udp"); @@ -885,53 +989,53 @@ main(int argc, char **argv) buff[2] = k; /* low bits of user number */ buff[3] = n >> 8; /* high bits of message length */ buff[4] = n; /* low bits of message length */ - SslFd_send_message(pointer->type, + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]), + srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]), buff, n+5); } else { aflog(LOG_T_USER, LOG_I_INFO, - "realm[%s]: Client[%s]: user[%d]: CLOSED", get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + "realm[%s]: Client[%s]: user[%d]: CLOSED", get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i)); time(&now); aflog(LOG_T_USER, LOG_I_NOTICE, "REALM: %s CLIENT: %s USER: %d IP: %s PORT: %s DURATION: %s", - get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i), - ConnectUser_get_nameBuf(pointer->contable[i]), - ConnectUser_get_portBuf(pointer->contable[i]), - timeperiod(now - ConnectUser_get_connectTime(pointer->contable[i]))); - if (pointer->audit) { + ConnectUser_get_nameBuf(srUsersTable[i]), + ConnectUser_get_portBuf(srUsersTable[i]), + timeperiod(now - ConnectUser_get_connectTime(srUsersTable[i]))); + if (ServerRealm_get_auditOn(pointer)) { AuditList_insert_back( ConnectClient_get_auditList( - pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]), + srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]), AuditListNode_new_entry( get_username(pointer, i), - ConnectUser_get_nameBuf(pointer->contable[i]), - ConnectUser_get_portBuf(pointer->contable[i]), - ConnectUser_get_connectTime(pointer->contable[i]), - now - ConnectUser_get_connectTime(pointer->contable[i])) + ConnectUser_get_nameBuf(srUsersTable[i]), + ConnectUser_get_portBuf(srUsersTable[i]), + ConnectUser_get_connectTime(srUsersTable[i]), + now - ConnectUser_get_connectTime(srUsersTable[i])) ); } - close(ConnectUser_get_connFd(pointer->contable[i])); - FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &allset); - FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &wset); - ConnectUser_set_state(pointer->contable[i], S_STATE_CLOSING); - BufList_clear(ConnectUser_get_bufList(pointer->contable[i])); + close(ConnectUser_get_connFd(srUsersTable[i])); + FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &allset); + FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &wset); + ConnectUser_set_state(srUsersTable[i], S_STATE_CLOSING); + BufList_clear(ConnectUser_get_bufList(srUsersTable[i])); buff[0] = AF_S_CONCLOSED; /* closing connection */ buff[1] = k >> 8; /* high bits of user number */ buff[2] = k; /* low bits of user number */ - SslFd_send_message(pointer->type, + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]), + srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]), buff, 5); } } else { /* when forwarding udp packets */ - n = readn(ConnectUser_get_connFd(pointer->contable[i]), buff, 5 ); + n = readn(ConnectUser_get_connFd(srUsersTable[i]), buff, 5 ); if (n != 5) { n = 0; } @@ -940,17 +1044,17 @@ main(int argc, char **argv) length = buff[3]; length = length << 8; length += buff[4]; /* this is length of message */ - if ((n = readn(ConnectUser_get_connFd(pointer->contable[i]), &buff[5], length)) != 0) { + if ((n = readn(ConnectUser_get_connFd(srUsersTable[i]), &buff[5], length)) != 0) { aflog(LOG_T_USER, LOG_I_DEBUG, "realm[%s]: Client[%s]: FROM user[%d]: MESSAGE length=%d", - get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i), n); buff[1] = k >> 8; /* high bits of user number */ buff[2] = k; /* low bits of user number */ - SslFd_send_message(pointer->type, + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]), + srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]), buff, n+5); } } @@ -961,29 +1065,29 @@ main(int argc, char **argv) if (n == 0) { aflog(LOG_T_USER, LOG_I_INFO, - "realm[%s]: Client[%s]: user[%d]: CLOSED (udp mode)", get_realmname(&config, j), + "realm[%s]: Client[%s]: user[%d]: CLOSED (udp mode)", get_realmname(config, j), get_clientname(pointer, - ConnectUser_get_whatClient(pointer->contable[i])), get_username(pointer, i)); + ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i)); time(&now); aflog(LOG_T_USER, LOG_I_NOTICE, "REALM: %s CLIENT: %s USER: %d IP: %s PORT: %s DURATION: %s", - get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i), - ConnectUser_get_nameBuf(pointer->contable[i]), - ConnectUser_get_portBuf(pointer->contable[i]), - timeperiod(now - ConnectUser_get_connectTime(pointer->contable[i]))); - close(ConnectUser_get_connFd(pointer->contable[i])); - FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &allset); - FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &wset); - ConnectUser_set_state(pointer->contable[i], S_STATE_CLOSING); - BufList_clear(ConnectUser_get_bufList(pointer->contable[i])); + ConnectUser_get_nameBuf(srUsersTable[i]), + ConnectUser_get_portBuf(srUsersTable[i]), + timeperiod(now - ConnectUser_get_connectTime(srUsersTable[i]))); + close(ConnectUser_get_connFd(srUsersTable[i])); + FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &allset); + FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &wset); + ConnectUser_set_state(srUsersTable[i], S_STATE_CLOSING); + BufList_clear(ConnectUser_get_bufList(srUsersTable[i])); buff[0] = AF_S_CONCLOSED; /* closing connection */ buff[1] = k >> 8; /* high bits of user number */ buff[2] = k; /* low bits of user number */ - SslFd_send_message(pointer->type, + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]), + srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]), buff, 5); } @@ -991,149 +1095,149 @@ main(int argc, char **argv) } } /* ------------------------------------ */ - for (i = 0; i usernum; ++i) { - if (ConnectUser_get_state(pointer->contable[i]) == S_STATE_STOPPED) - if (FD_ISSET(ConnectUser_get_connFd(pointer->contable[i]), &tmpset)) { - k = eval_usernum(pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])], i); + for (i = 0; i < ServerRealm_get_usersLimit(pointer); ++i) { + if (ConnectUser_get_state(srUsersTable[i]) == S_STATE_STOPPED) + if (FD_ISSET(ConnectUser_get_connFd(srUsersTable[i]), &tmpset)) { + k = eval_usernum(srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])], i); aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: Client[%s]: user[%d]: FD_ISSET - WRITE", get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + "realm[%s]: Client[%s]: user[%d]: FD_ISSET - WRITE", get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i)); - n = BufListNode_readMessageLength(BufList_get_first(ConnectUser_get_bufList(pointer->contable[i]))); - sent = write(ConnectUser_get_connFd(pointer->contable[i]), - BufListNode_readMessage(BufList_get_first(ConnectUser_get_bufList(pointer->contable[i]))), n); + n = BufListNode_readMessageLength(BufList_get_first(ConnectUser_get_bufList(srUsersTable[i]))); + sent = write(ConnectUser_get_connFd(srUsersTable[i]), + BufListNode_readMessage(BufList_get_first(ConnectUser_get_bufList(srUsersTable[i]))), n); if ((sent > 0) && (sent != n)) { - BufListNode_set_actPtr(BufList_get_first(ConnectUser_get_bufList(pointer->contable[i])), - BufListNode_get_actPtr(BufList_get_first(ConnectUser_get_bufList(pointer->contable[i]))) + sent); + BufListNode_set_actPtr(BufList_get_first(ConnectUser_get_bufList(srUsersTable[i])), + BufListNode_get_actPtr(BufList_get_first(ConnectUser_get_bufList(srUsersTable[i]))) + sent); aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: Client[%s]: user[%d]: (%d/%d)", get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + "realm[%s]: Client[%s]: user[%d]: (%d/%d)", get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i), sent, n); } else if ((sent == -1) && (errno == EAGAIN)) { aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: Client[%s]: user[%d]: EAGAIN", get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + "realm[%s]: Client[%s]: user[%d]: EAGAIN", get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i)); } else if (sent == -1) { aflog(LOG_T_USER, LOG_I_INFO, - "realm[%s]: Client[%s]: user[%d]: CLOSED", get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + "realm[%s]: Client[%s]: user[%d]: CLOSED", get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i)); time(&now); aflog(LOG_T_USER, LOG_I_NOTICE, "REALM: %s CLIENT: %s USER: %d IP: %s PORT: %s DURATION: %s", - get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i), - ConnectUser_get_nameBuf(pointer->contable[i]), - ConnectUser_get_portBuf(pointer->contable[i]), - timeperiod(now - ConnectUser_get_connectTime(pointer->contable[i]))); - close(ConnectUser_get_connFd(pointer->contable[i])); - FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &allset); - FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &wset); - ConnectUser_set_state(pointer->contable[i], S_STATE_CLOSING); - BufList_clear(ConnectUser_get_bufList(pointer->contable[i])); + ConnectUser_get_nameBuf(srUsersTable[i]), + ConnectUser_get_portBuf(srUsersTable[i]), + timeperiod(now - ConnectUser_get_connectTime(srUsersTable[i]))); + close(ConnectUser_get_connFd(srUsersTable[i])); + FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &allset); + FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &wset); + ConnectUser_set_state(srUsersTable[i], S_STATE_CLOSING); + BufList_clear(ConnectUser_get_bufList(srUsersTable[i])); buff[0] = AF_S_CONCLOSED; /* closing connection */ buff[1] = k >> 8; /* high bits of user number */ buff[2] = k; /* low bits of user number */ - SslFd_send_message(pointer->type, + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]), + srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]), buff, 5); } else { aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: Client[%s]: user[%d]: (%d/%d)", get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + "realm[%s]: Client[%s]: user[%d]: (%d/%d)", get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i), sent, n); - BufList_delete_first(ConnectUser_get_bufList(pointer->contable[i])); - if (BufList_get_first(ConnectUser_get_bufList(pointer->contable[i])) == NULL) { - ConnectUser_set_state(pointer->contable[i], S_STATE_OPEN); - FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &wset); + BufList_delete_first(ConnectUser_get_bufList(srUsersTable[i])); + if (BufList_get_first(ConnectUser_get_bufList(srUsersTable[i])) == NULL) { + ConnectUser_set_state(srUsersTable[i], S_STATE_OPEN); + FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &wset); buff[0] = AF_S_CAN_SEND; /* stopping transfer */ buff[1] = k >> 8; /* high bits of user number */ buff[2] = k; /* low bits of user number */ aflog(LOG_T_USER, LOG_I_DDEBUG, "realm[%s]: Client[%s]: TO user[%d]: BUFFERING MESSAGE ENDED", - get_realmname(&config, j), - get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])), + get_realmname(config, j), + get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i)); - SslFd_send_message(pointer->type, + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]), + srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]), buff, 5); } } } } /* ------------------------------------ */ - if (pointer->baseport == 0) { - for (l = 0; l < pointer->usrclinum; ++l) { - if (FD_ISSET(UsrCli_get_listenFd(pointer->usrclitable[l]), &rset)) { - len = pointer->addrlen; - sent = accept(UsrCli_get_listenFd(pointer->usrclitable[l]), pointer->cliaddr, &len); + if (ServerRealm_get_basePortOn(pointer) == 0) { + for (l = 0; l < ServerRealm_get_userClientPairs(pointer); ++l) { + if (FD_ISSET(UsrCli_get_listenFd(srUsersClientsTable[l]), &rset)) { + len = ServerRealm_get_addressLength(pointer); + sent = accept(UsrCli_get_listenFd(srUsersClientsTable[l]), ServerRealm_get_clientAddress(pointer), &len); if (sent == -1) { if (errno == EAGAIN) { aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: listenfd: FD_ISSET --> EAGAIN", get_realmname(&config, j)); + "realm[%s]: listenfd: FD_ISSET --> EAGAIN", get_realmname(config, j)); } else { aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: listenfd: FD_ISSET --> errno=%d", get_realmname(&config, j), errno); + "realm[%s]: listenfd: FD_ISSET --> errno=%d", get_realmname(config, j), errno); } continue; } flags = fcntl(sent, F_GETFL, 0); fcntl(sent, F_SETFL, flags | O_NONBLOCK); aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: listenfd: FD_ISSET", get_realmname(&config, j)); - k = find_client(pointer, pointer->climode, l); - if (ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_ACCEPTED) { - if (pointer->usercon == pointer->usernum) { + "realm[%s]: listenfd: FD_ISSET", get_realmname(config, j)); + k = find_client(pointer, ServerRealm_get_clientMode(pointer), l); + if (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_ACCEPTED) { + if (ServerRealm_get_connectedUsers(pointer) == ServerRealm_get_usersLimit(pointer)) { close(sent); aflog(LOG_T_USER, LOG_I_WARNING, - "realm[%s]: user limit EXCEEDED", get_realmname(&config, j)); + "realm[%s]: user limit EXCEEDED", get_realmname(config, j)); } - else if (ConnectClient_get_connected(pointer->clitable[k]) == - ConnectClient_get_limit(pointer->clitable[k])) { + else if (ConnectClient_get_connected(srClientsTable[k]) == + ConnectClient_get_limit(srClientsTable[k])) { close(sent); aflog(LOG_T_USER, LOG_I_WARNING, "realm[%s]: Client[%s]: usrpcli limit EXCEEDED", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); } else { - for (i = 0; i < pointer->usernum; ++i) { - if (ConnectUser_get_state(pointer->contable[i]) == S_STATE_CLEAR) { - ConnectUser_set_userId(pointer->contable[i], pointer->usercounter); - ++(pointer->usercounter); + for (i = 0; i < ServerRealm_get_usersLimit(pointer); ++i) { + if (ConnectUser_get_state(srUsersTable[i]) == S_STATE_CLEAR) { + ConnectUser_set_userId(srUsersTable[i], ServerRealm_get_usersCounter(pointer)); + ServerRealm_increase_usersCounter(pointer); aflog(LOG_T_USER, LOG_I_INFO, "realm[%s]: Client[%s]: new user: CONNECTING from IP: %s", - get_realmname(&config, j), get_clientname(pointer, k), - sock_ntop(pointer->cliaddr, len, ConnectUser_get_nameBuf(pointer->contable[i]), - ConnectUser_get_portBuf(pointer->contable[i]), pointer->dnslookups)); - ConnectUser_set_connFd(pointer->contable[i], sent); - ConnectUser_set_state(pointer->contable[i], S_STATE_OPENING); - ConnectUser_set_whatClient(pointer->contable[i], k); + get_realmname(config, j), get_clientname(pointer, k), + sock_ntop(ServerRealm_get_clientAddress(pointer), len, ConnectUser_get_nameBuf(srUsersTable[i]), + ConnectUser_get_portBuf(srUsersTable[i]), ServerRealm_get_dnsLookupsOn(pointer))); + ConnectUser_set_connFd(srUsersTable[i], sent); + ConnectUser_set_state(srUsersTable[i], S_STATE_OPENING); + ConnectUser_set_whatClient(srUsersTable[i], k); time(&now); - ConnectUser_set_connectTime(pointer->contable[i], now); - UserStats_clear(ConnectUser_get_stats(pointer->contable[i])); - UserStats_set_lastActivity(ConnectUser_get_stats(pointer->contable[i]), now); - pointer->usercon++; - ConnectClient_increase_connected(pointer->clitable[k]); - memcpy(&buff[5], ConnectUser_get_nameBuf(pointer->contable[i]), 128); - memcpy(&buff[133], ConnectUser_get_portBuf(pointer->contable[i]), 7); + ConnectUser_set_connectTime(srUsersTable[i], now); + UserStats_clear(ConnectUser_get_stats(srUsersTable[i])); + UserStats_set_lastActivity(ConnectUser_get_stats(srUsersTable[i]), now); + ServerRealm_increase_connectedUsers(pointer); + ConnectClient_increase_connected(srClientsTable[k]); + memcpy(&buff[5], ConnectUser_get_nameBuf(srUsersTable[i]), 128); + memcpy(&buff[133], ConnectUser_get_portBuf(srUsersTable[i]), 7); n = 135; - i = find_usernum(pointer->clitable[k], i); + i = find_usernum(srClientsTable[k], i); buff[0] = AF_S_CONOPEN; /* opening connection */ buff[1] = i >> 8; /* high bits of user number */ buff[2] = i; /* low bits of user number */ buff[3] = n >> 8; /* high bits of message length */ buff[4] = n; /* low bits of message length */ - SslFd_send_message(pointer->type, + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, n+5); break; } @@ -1144,26 +1248,26 @@ main(int argc, char **argv) close(sent); aflog(LOG_T_USER, LOG_I_ERR, "realm[%s]: Client(%d) is NOT CONNECTED", - get_realmname(&config, j), k); + get_realmname(config, j), k); } } } } /* ------------------------------------ */ - if (pointer->baseport == 1) { - for (k = 0; k < pointer->clinum; ++k) { - if (ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_ACCEPTED) { - if (FD_ISSET(ConnectClient_get_listenFd(pointer->clitable[k]), &rset)) { - len = pointer->addrlen; - sent = accept(ConnectClient_get_listenFd(pointer->clitable[k]), pointer->cliaddr, &len); + if (ServerRealm_get_basePortOn(pointer) == 1) { + for (k = 0; k < ServerRealm_get_clientsLimit(pointer); ++k) { + if (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_ACCEPTED) { + if (FD_ISSET(ConnectClient_get_listenFd(srClientsTable[k]), &rset)) { + len = ServerRealm_get_addressLength(pointer); + sent = accept(ConnectClient_get_listenFd(srClientsTable[k]), ServerRealm_get_clientAddress(pointer), &len); if (sent == -1) { if (errno == EAGAIN) { aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: listenfd: FD_ISSET --> EAGAIN", get_realmname(&config, j)); + "realm[%s]: listenfd: FD_ISSET --> EAGAIN", get_realmname(config, j)); } else { aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: listenfd: FD_ISSET --> errno=%d", get_realmname(&config, j), errno); + "realm[%s]: listenfd: FD_ISSET --> errno=%d", get_realmname(config, j), errno); } continue; } @@ -1171,51 +1275,51 @@ main(int argc, char **argv) fcntl(sent, F_SETFL, flags | O_NONBLOCK); aflog(LOG_T_USER, LOG_I_DDEBUG, "realm[%s]: Client[%s]: listenfd: FD_ISSET", - get_realmname(&config, j), get_clientname(pointer, k)); - if (pointer->usercon == pointer->usernum) { + get_realmname(config, j), get_clientname(pointer, k)); + if (ServerRealm_get_connectedUsers(pointer) == ServerRealm_get_usersLimit(pointer)) { close(sent); aflog(LOG_T_USER, LOG_I_WARNING, - "realm[%s]: user limit EXCEEDED", get_realmname(&config, j)); + "realm[%s]: user limit EXCEEDED", get_realmname(config, j)); } - else if(ConnectClient_get_connected(pointer->clitable[k]) == - ConnectClient_get_limit(pointer->clitable[k])) { + else if(ConnectClient_get_connected(srClientsTable[k]) == + ConnectClient_get_limit(srClientsTable[k])) { close(sent); aflog(LOG_T_USER, LOG_I_WARNING, "realm[%s]: Client[%s]: usrpcli limit EXCEEDED", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); } else { - for (i = 0; i < pointer->usernum; ++i) { - if (ConnectUser_get_state(pointer->contable[i]) == S_STATE_CLEAR) { - ConnectUser_set_userId(pointer->contable[i], pointer->usercounter); - ++(pointer->usercounter); + for (i = 0; i < ServerRealm_get_usersLimit(pointer); ++i) { + if (ConnectUser_get_state(srUsersTable[i]) == S_STATE_CLEAR) { + ConnectUser_set_userId(srUsersTable[i], ServerRealm_get_usersCounter(pointer)); + ServerRealm_increase_usersCounter(pointer); aflog(LOG_T_USER, LOG_I_INFO, "realm[%s]: Client[%s]: new user: CONNECTING from IP: %s", - get_realmname(&config, j), get_clientname(pointer, k), - sock_ntop(pointer->cliaddr, len, - ConnectUser_get_nameBuf(pointer->contable[i]), - ConnectUser_get_portBuf(pointer->contable[i]), pointer->dnslookups)); - ConnectUser_set_connFd(pointer->contable[i], sent); - ConnectUser_set_state(pointer->contable[i], S_STATE_OPENING); - ConnectUser_set_whatClient(pointer->contable[i], k); + get_realmname(config, j), get_clientname(pointer, k), + sock_ntop(ServerRealm_get_clientAddress(pointer), len, + ConnectUser_get_nameBuf(srUsersTable[i]), + ConnectUser_get_portBuf(srUsersTable[i]), ServerRealm_get_dnsLookupsOn(pointer))); + ConnectUser_set_connFd(srUsersTable[i], sent); + ConnectUser_set_state(srUsersTable[i], S_STATE_OPENING); + ConnectUser_set_whatClient(srUsersTable[i], k); time(&now); - ConnectUser_set_connectTime(pointer->contable[i], now); - UserStats_clear(ConnectUser_get_stats(pointer->contable[i])); - UserStats_set_lastActivity(ConnectUser_get_stats(pointer->contable[i]), now); - pointer->usercon++; - ConnectClient_increase_connected(pointer->clitable[k]); - memcpy(&buff[5], ConnectUser_get_nameBuf(pointer->contable[i]), 128); - memcpy(&buff[133], ConnectUser_get_portBuf(pointer->contable[i]), 7); + ConnectUser_set_connectTime(srUsersTable[i], now); + UserStats_clear(ConnectUser_get_stats(srUsersTable[i])); + UserStats_set_lastActivity(ConnectUser_get_stats(srUsersTable[i]), now); + ServerRealm_increase_connectedUsers(pointer); + ConnectClient_increase_connected(srClientsTable[k]); + memcpy(&buff[5], ConnectUser_get_nameBuf(srUsersTable[i]), 128); + memcpy(&buff[133], ConnectUser_get_portBuf(srUsersTable[i]), 7); n = 135; - i = find_usernum(pointer->clitable[k], i); + i = find_usernum(srClientsTable[k], i); buff[0] = AF_S_CONOPEN; /* opening connection */ buff[1] = i >> 8; /* high bits of user number */ buff[2] = i; /* low bits of user number */ buff[3] = n >> 8; /* high bits of message length */ buff[4] = n; /* low bits of message length */ - SslFd_send_message(pointer->type, + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, n+5); break; } @@ -1226,25 +1330,25 @@ main(int argc, char **argv) } } /* ------------------------------------ */ - for (k = 0; k < pointer->clinum; ++k) - if ((ConnectClient_get_state(pointer->clitable[k]) > CONNECTCLIENT_STATE_FREE) && - (FD_ISSET(SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k])), &rset))) { - if (ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_CONNECTING) { - make_ssl_initialize(ConnectClient_get_sslFd(pointer->clitable[k])); + for (k = 0; k < ServerRealm_get_clientsLimit(pointer); ++k) + if ((ConnectClient_get_state(srClientsTable[k]) > CONNECTCLIENT_STATE_FREE) && + (FD_ISSET(SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k])), &rset))) { + if (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_CONNECTING) { + make_ssl_initialize(ConnectClient_get_sslFd(srClientsTable[k])); aflog(LOG_T_CLIENT, LOG_I_DDEBUG, "realm[%s]: new Client[%s]: SSL_accept", - get_realmname(&config, j), get_clientname(pointer, k)); - switch (make_ssl_accept(ConnectClient_get_sslFd(pointer->clitable[k]))) { + get_realmname(config, j), get_clientname(pointer, k)); + switch (make_ssl_accept(ConnectClient_get_sslFd(srClientsTable[k]))) { case 2: { - close(SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k]))); - FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k])), &allset); - SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(pointer->clitable[k]))); - ConnectClient_set_state(pointer->clitable[k], CONNECTCLIENT_STATE_FREE); + close(SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k]))); + FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k])), &allset); + SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(srClientsTable[k]))); + ConnectClient_set_state(srClientsTable[k], CONNECTCLIENT_STATE_FREE); manconnecting--; - pointer->clicon--; + ServerRealm_decrease_connectedClients(pointer); aflog(LOG_T_CLIENT, LOG_I_ERR, "realm[%s]: new Client[%s]: DENIED by SSL_accept", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); } case 1: { continue; @@ -1252,38 +1356,38 @@ main(int argc, char **argv) default: { aflog(LOG_T_CLIENT, LOG_I_DEBUG, "realm[%s]: new Client[%s]: ACCEPTED by SSL_accept", - get_realmname(&config, j), get_clientname(pointer, k)); - ConnectClient_set_state(pointer->clitable[k], CONNECTCLIENT_STATE_AUTHORIZING); + get_realmname(config, j), get_clientname(pointer, k)); + ConnectClient_set_state(srClientsTable[k], CONNECTCLIENT_STATE_AUTHORIZING); continue; } } } aflog(LOG_T_CLIENT, LOG_I_DDEBUG, "realm[%s]: Client[%s]: commfd: FD_ISSET", - get_realmname(&config, j), get_clientname(pointer, k)); - if (ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) { - n = SslFd_get_message(pointer->type | TYPE_SSL | TYPE_ZLIB, + get_realmname(config, j), get_clientname(pointer, k)); + if (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) { + n = SslFd_get_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB, ConnectClient_get_sslFd( - pointer->clitable[k]), - buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(pointer->clitable[k]))); + srClientsTable[k]), + buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(srClientsTable[k]))); } else { - n = SslFd_get_message(pointer->type, + n = SslFd_get_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[k]), - buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(pointer->clitable[k]))); + srClientsTable[k]), + buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(srClientsTable[k]))); } if (n == -1) { if (errno == EAGAIN) { aflog(LOG_T_CLIENT, LOG_I_DDEBUG, "realm[%s]: Client[%s]: commfd: EAGAIN", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); continue; } else { aflog(LOG_T_CLIENT, LOG_I_ERR, "realm[%s]: Client[%s]: commfd: ERROR: %d", - get_realmname(&config, j), get_clientname(pointer, k), errno); + get_realmname(config, j), get_clientname(pointer, k), errno); n = 0; } } @@ -1291,10 +1395,10 @@ main(int argc, char **argv) if (n != 0) { aflog(LOG_T_CLIENT, LOG_I_DEBUG, "realm[%s]: Client[%s]: header length = %d --> buffering", - get_realmname(&config, j), get_clientname(pointer, k), n); - HeaderBuffer_store(ConnectClient_get_header(pointer->clitable[k]), buff, n); - if (HeaderBuffer_to_read(ConnectClient_get_header(pointer->clitable[k])) == 0) { - HeaderBuffer_restore(ConnectClient_get_header(pointer->clitable[k]), buff); + get_realmname(config, j), get_clientname(pointer, k), n); + HeaderBuffer_store(ConnectClient_get_header(srClientsTable[k]), buff, n); + if (HeaderBuffer_to_read(ConnectClient_get_header(srClientsTable[k])) == 0) { + HeaderBuffer_restore(ConnectClient_get_header(srClientsTable[k]), buff); n = 5; } else { @@ -1305,35 +1409,35 @@ main(int argc, char **argv) if (n==0) { aflog(LOG_T_CLIENT, LOG_I_INFO, "realm[%s]: Client[%s]: commfd: CLOSED", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); time(&now); aflog(LOG_T_CLIENT, LOG_I_NOTICE, "REALM: %s CLIENT: %s IP: %s PORT: %s DURATION: %s", - get_realmname(&config, j), + get_realmname(config, j), get_clientname(pointer, k), - ConnectClient_get_nameBuf(pointer->clitable[k]), - ConnectClient_get_portBuf(pointer->clitable[k]), - timeperiod(now - ConnectClient_get_connectTime(pointer->clitable[k]))); - if (pointer->audit) { - while (AuditList_get_first(ConnectClient_get_auditList(pointer->clitable[k]))) { + ConnectClient_get_nameBuf(srClientsTable[k]), + ConnectClient_get_portBuf(srClientsTable[k]), + timeperiod(now - ConnectClient_get_connectTime(srClientsTable[k]))); + if (ServerRealm_get_auditOn(pointer)) { + while (AuditList_get_first(ConnectClient_get_auditList(srClientsTable[k]))) { aflog(LOG_T_CLIENT, LOG_I_NOTICE, "USERID: %d IP: %s PORT: %s CONNECTED: %s DURATION: %s", AuditListNode_get_userId( AuditList_get_first( - ConnectClient_get_auditList(pointer->clitable[k]))), + ConnectClient_get_auditList(srClientsTable[k]))), AuditListNode_get_nameBuf( AuditList_get_first( - ConnectClient_get_auditList(pointer->clitable[k]))), + ConnectClient_get_auditList(srClientsTable[k]))), AuditListNode_get_portBuf( AuditList_get_first( - ConnectClient_get_auditList(pointer->clitable[k]))), + ConnectClient_get_auditList(srClientsTable[k]))), localdate(AuditListNode_get_connectTimep( AuditList_get_first( - ConnectClient_get_auditList(pointer->clitable[k])))), + ConnectClient_get_auditList(srClientsTable[k])))), timeperiod(AuditListNode_get_duration( AuditList_get_first( - ConnectClient_get_auditList(pointer->clitable[k]))))); - AuditList_delete_first(ConnectClient_get_auditList(pointer->clitable[k])); + ConnectClient_get_auditList(srClientsTable[k]))))); + AuditList_delete_first(ConnectClient_get_auditList(srClientsTable[k])); } } remove_client(pointer, k, &allset, &wset, &manconnecting); @@ -1347,17 +1451,17 @@ main(int argc, char **argv) length = length << 8; length += buff[4]; /* this is length of message */ - if ((k == pointer->clinum) && (buff[0] != AF_S_LOGIN) && + if ((k == ServerRealm_get_clientsLimit(pointer)) && (buff[0] != AF_S_LOGIN) && (buff[0] != AF_S_ADMIN_LOGIN) && (buff[0] != AF_S_ADMIN_CMD)) { buff[0] = AF_S_WRONG; } - if (ConnectClient_get_state(pointer->clitable[k]) < CONNECTCLIENT_STATE_AUTHORIZING) { + if (ConnectClient_get_state(srClientsTable[k]) < CONNECTCLIENT_STATE_AUTHORIZING) { aflog(LOG_T_CLIENT, LOG_I_WARNING, "realm[%s]: Client[%s]: Impossible behaviour --> ignoring", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); continue; } - if ((ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) && + if ((ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) && (buff[0] != AF_S_LOGIN) && (buff[0] != AF_S_ADMIN_LOGIN)) { buff[0] = AF_S_WRONG; } @@ -1366,42 +1470,42 @@ main(int argc, char **argv) case AF_S_CONCLOSED : { n = numofcon; numofcon = eval_numofcon(pointer, k, numofcon); - if ((numofcon>=0) && (numofcon<(pointer->usernum)) && - (ConnectClient_get_state(pointer->clitable[k]) == + if ((numofcon>=0) && (numofcon<(ServerRealm_get_usersLimit(pointer))) && + (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_ACCEPTED)) { - pointer->usercon--; - ConnectClient_decrease_connected(pointer->clitable[k]); - ConnectClient_get_users(pointer->clitable[k])[n] = -1; - if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_CLOSING) { - ConnectUser_set_state(pointer->contable[numofcon], S_STATE_CLEAR); + ServerRealm_decrease_connectedUsers(pointer); + ConnectClient_decrease_connected(srClientsTable[k]); + ConnectClient_get_users(srClientsTable[k])[n] = -1; + if (ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_CLOSING) { + ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLEAR); aflog(LOG_T_USER, LOG_I_DEBUG, "realm[%s]: user[%d]: CLOSE CONFIRMED", - get_realmname(&config, j), get_username(pointer, numofcon)); + get_realmname(config, j), get_username(pointer, numofcon)); } - else if ((ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_OPEN) || - (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_STOPPED)) { + else if ((ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_OPEN) || + (ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_STOPPED)) { aflog(LOG_T_USER, LOG_I_INFO, "realm[%s]: user[%d]: KICKED", - get_realmname(&config, j), get_username(pointer, numofcon)); + get_realmname(config, j), get_username(pointer, numofcon)); time(&now); aflog(LOG_T_USER, LOG_I_NOTICE, "REALM: %s USER: %d IP: %s PORT: %s DURATION: %s", - get_realmname(&config, j), + get_realmname(config, j), get_username(pointer, numofcon), - ConnectUser_get_nameBuf(pointer->contable[numofcon]), - ConnectUser_get_portBuf(pointer->contable[numofcon]), - timeperiod(now - ConnectUser_get_connectTime(pointer->contable[numofcon]))); - close(ConnectUser_get_connFd(pointer->contable[numofcon])); - FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset); - FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &wset); - ConnectUser_set_state(pointer->contable[numofcon], S_STATE_CLEAR); - BufList_clear(ConnectUser_get_bufList(pointer->contable[numofcon])); + ConnectUser_get_nameBuf(srUsersTable[numofcon]), + ConnectUser_get_portBuf(srUsersTable[numofcon]), + timeperiod(now - ConnectUser_get_connectTime(srUsersTable[numofcon]))); + close(ConnectUser_get_connFd(srUsersTable[numofcon])); + FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset); + FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &wset); + ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLEAR); + BufList_clear(ConnectUser_get_bufList(srUsersTable[numofcon])); buff[0] = AF_S_CONCLOSED; /* closing connection */ buff[1] = numofcon >> 8; /* high bits of user number */ buff[2] = numofcon; /* low bits of user number */ - SslFd_send_message(pointer->type, + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, 5); } } @@ -1412,17 +1516,32 @@ main(int argc, char **argv) } case AF_S_CONOPEN : { numofcon = eval_numofcon(pointer, k, numofcon); - if ((numofcon>=0) && (numofcon<(pointer->usernum)) && - (ConnectClient_get_state(pointer->clitable[k]) == + if ((numofcon>=0) && (numofcon<(ServerRealm_get_usersLimit(pointer))) && + (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_ACCEPTED)) { - if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_OPENING) { + if (ConnectUser_get_state(srUsersTable[numofcon]) == + S_STATE_OPENING) { aflog(LOG_T_USER, LOG_I_INFO, "realm[%s]: user[%d]: NEW", - get_realmname(&config, j), get_username(pointer, numofcon)); - FD_SET(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset); - maxfdp1 = (maxfdp1 > (ConnectUser_get_connFd(pointer->contable[numofcon]) + 1)) ? - maxfdp1 : (ConnectUser_get_connFd(pointer->contable[numofcon]) + 1); - ConnectUser_set_state(pointer->contable[numofcon], S_STATE_OPEN); + get_realmname(config, j), get_username(pointer, numofcon)); + FD_SET(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset); + maxfdp1 = (maxfdp1 > (ConnectUser_get_connFd(srUsersTable[numofcon]) + 1)) ? + maxfdp1 : (ConnectUser_get_connFd(srUsersTable[numofcon]) + 1); + ConnectUser_set_state(srUsersTable[numofcon], S_STATE_OPEN); + } + if (ConnectUser_get_state(srUsersTable[numofcon]) == + S_STATE_OPENING_CLOSED) { + aflog(LOG_T_USER, LOG_I_INFO, + "realm[%s]: user[%d]: delayed CLOSING", + get_realmname(config, j), get_username(pointer, numofcon)); + ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLOSING); + buff[0] = AF_S_CONCLOSED; /* closing connection */ + buff[1] = numofcon >> 8; /* high bits of user number */ + buff[2] = numofcon; /* low bits of user number */ + SslFd_send_message(ServerRealm_get_realmType(pointer), + ConnectClient_get_sslFd( + srClientsTable[k]), + buff, 5); } } else { @@ -1433,18 +1552,24 @@ main(int argc, char **argv) case AF_S_CANT_OPEN : { n = numofcon; numofcon = eval_numofcon(pointer, k, numofcon); - if ((numofcon>=0) && (numofcon<(pointer->usernum)) && - (ConnectClient_get_state(pointer->clitable[k]) == + if ((numofcon>=0) && (numofcon<(ServerRealm_get_usersLimit(pointer))) && + (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_ACCEPTED)) { - if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_OPENING) { + if ((ConnectUser_get_state(srUsersTable[numofcon]) == + S_STATE_OPENING) || + (ConnectUser_get_state(srUsersTable[numofcon]) == + S_STATE_OPENING_CLOSED)) { aflog(LOG_T_USER, LOG_I_INFO, "realm[%s]: user[%d]: DROPPED", - get_realmname(&config, j), get_username(pointer, numofcon)); - pointer->usercon--; - ConnectClient_decrease_connected(pointer->clitable[k]); - ConnectClient_get_users(pointer->clitable[k])[n] = -1; - close(ConnectUser_get_connFd(pointer->contable[numofcon])); - ConnectUser_set_state(pointer->contable[numofcon], S_STATE_CLEAR); + get_realmname(config, j), get_username(pointer, numofcon)); + ServerRealm_decrease_connectedUsers(pointer); + ConnectClient_decrease_connected(srClientsTable[k]); + ConnectClient_get_users(srClientsTable[k])[n] = -1; + if (ConnectUser_get_state(srUsersTable[numofcon]) == + S_STATE_OPENING) { + close(ConnectUser_get_connFd(srUsersTable[numofcon])); + } + ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLEAR); } } else { @@ -1453,190 +1578,190 @@ main(int argc, char **argv) break; } case AF_S_MESSAGE : { - if (ConnectClient_get_state(pointer->clitable[k]) != + if (ConnectClient_get_state(srClientsTable[k]) != CONNECTCLIENT_STATE_ACCEPTED) { remove_client(pointer, k, &allset, &wset, &manconnecting); break; } - if (TYPE_IS_UDP(pointer->type)) { /* udp */ - n = SslFd_get_message(pointer->type, + if (TYPE_IS_UDP(ServerRealm_get_realmType(pointer))) { /* udp */ + n = SslFd_get_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), &buff[5], length); } else { - n = SslFd_get_message(pointer->type, + n = SslFd_get_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, length); } numofcon = eval_numofcon(pointer, k, numofcon); - if ((numofcon>=0) && (numofcon<(pointer->usernum))) { - if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_OPEN) { + if ((numofcon>=0) && (numofcon<(ServerRealm_get_usersLimit(pointer)))) { + if (ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_OPEN) { aflog(LOG_T_USER, LOG_I_DEBUG, "realm[%s]: TO user[%d]: MESSAGE length=%d", - get_realmname(&config, j), get_username(pointer, numofcon), n); - UserStats_add_download(ConnectUser_get_stats(pointer->contable[numofcon]), n); - if (TYPE_IS_UDP(pointer->type)) { /* udp */ + get_realmname(config, j), get_username(pointer, numofcon), n); + UserStats_add_download(ConnectUser_get_stats(srUsersTable[numofcon]), n); + if (TYPE_IS_UDP(ServerRealm_get_realmType(pointer))) { /* udp */ buff[1] = AF_S_LOGIN; buff[2] = AF_S_MESSAGE; buff[3] = n >> 8; /* high bits of message length */ buff[4] = n; /* low bits of message length */ - sent = write(ConnectUser_get_connFd(pointer->contable[numofcon]), buff, n+5); + sent = write(ConnectUser_get_connFd(srUsersTable[numofcon]), buff, n+5); if (sent == -1) { aflog(LOG_T_USER, LOG_I_INFO, "realm[%s]: user[%d]: CLOSED (write-udp)", - get_realmname(&config, j), get_username(pointer, numofcon)); + get_realmname(config, j), get_username(pointer, numofcon)); time(&now); aflog(LOG_T_USER, LOG_I_NOTICE, "REALM: %s USER: %d IP: %s PORT: %s DURATION: %s", - get_realmname(&config, j), + get_realmname(config, j), get_username(pointer, numofcon), - ConnectUser_get_nameBuf(pointer->contable[numofcon]), - ConnectUser_get_portBuf(pointer->contable[numofcon]), - timeperiod(now - ConnectUser_get_connectTime(pointer->contable[numofcon]))); - close(ConnectUser_get_connFd(pointer->contable[numofcon])); - FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset); - FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &wset); - ConnectUser_set_state(pointer->contable[numofcon], S_STATE_CLOSING); - BufList_clear(ConnectUser_get_bufList(pointer->contable[numofcon])); + ConnectUser_get_nameBuf(srUsersTable[numofcon]), + ConnectUser_get_portBuf(srUsersTable[numofcon]), + timeperiod(now - ConnectUser_get_connectTime(srUsersTable[numofcon]))); + close(ConnectUser_get_connFd(srUsersTable[numofcon])); + FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset); + FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &wset); + ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLOSING); + BufList_clear(ConnectUser_get_bufList(srUsersTable[numofcon])); buff[0] = AF_S_CONCLOSED; /* closing connection */ buff[1] = numofcon >> 8; /* high bits of user number */ buff[2] = numofcon; /* low bits of user number */ - SslFd_send_message(pointer->type, + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, 5); } } else { /* tcp */ - sent = write(ConnectUser_get_connFd(pointer->contable[numofcon]), buff, n); + sent = write(ConnectUser_get_connFd(srUsersTable[numofcon]), buff, n); if ((sent > 0) && (sent != n)) { - BufList_insert_back(ConnectUser_get_bufList(pointer->contable[numofcon]), + BufList_insert_back(ConnectUser_get_bufList(srUsersTable[numofcon]), BufListNode_new_message(sent, n, buff)); - ConnectUser_set_state(pointer->contable[numofcon], S_STATE_STOPPED); - FD_SET(ConnectUser_get_connFd(pointer->contable[numofcon]), &wset); + ConnectUser_set_state(srUsersTable[numofcon], S_STATE_STOPPED); + FD_SET(ConnectUser_get_connFd(srUsersTable[numofcon]), &wset); buff[0] = AF_S_DONT_SEND; /* stopping transfer */ buff[1] = numofcon >> 8; /* high bits of user number */ buff[2] = numofcon; /* low bits of user number */ aflog(LOG_T_USER, LOG_I_DDEBUG, "realm[%s]: TO user[%d]: BUFFERING MESSAGE STARTED (%d/%d)", - get_realmname(&config, j), get_username(pointer, numofcon), sent, n); - SslFd_send_message(pointer->type, + get_realmname(config, j), get_username(pointer, numofcon), sent, n); + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, 5); } else if ((sent == -1) && (errno == EAGAIN)) { - BufList_insert_back(ConnectUser_get_bufList(pointer->contable[numofcon]), + BufList_insert_back(ConnectUser_get_bufList(srUsersTable[numofcon]), BufListNode_new_message(0, n, buff)); - ConnectUser_set_state(pointer->contable[numofcon], S_STATE_STOPPED); - FD_SET(ConnectUser_get_connFd(pointer->contable[numofcon]), &wset); + ConnectUser_set_state(srUsersTable[numofcon], S_STATE_STOPPED); + FD_SET(ConnectUser_get_connFd(srUsersTable[numofcon]), &wset); buff[0] = AF_S_DONT_SEND; /* stopping transfer */ buff[1] = numofcon >> 8; /* high bits of user number */ buff[2] = numofcon; /* low bits of user number */ aflog(LOG_T_USER, LOG_I_DDEBUG, "realm[%s]: TO user[%d]: BUFFERING MESSAGE STARTED (%d/%d)", - get_realmname(&config, j), get_username(pointer, numofcon), sent, n); - SslFd_send_message(pointer->type, + get_realmname(config, j), get_username(pointer, numofcon), sent, n); + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, 5); } else if (sent == -1) { aflog(LOG_T_USER, LOG_I_INFO, "realm[%s]: user[%d]: CLOSED (write-tcp)", - get_realmname(&config, j), get_username(pointer, numofcon)); + get_realmname(config, j), get_username(pointer, numofcon)); time(&now); aflog(LOG_T_USER, LOG_I_NOTICE, "REALM: %s USER: %d IP: %s PORT: %s DURATION: %s", - get_realmname(&config, j), + get_realmname(config, j), get_username(pointer, numofcon), - ConnectUser_get_nameBuf(pointer->contable[numofcon]), - ConnectUser_get_portBuf(pointer->contable[numofcon]), - timeperiod(now - ConnectUser_get_connectTime(pointer->contable[numofcon]))); - close(ConnectUser_get_connFd(pointer->contable[numofcon])); - FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset); - FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &wset); - ConnectUser_set_state(pointer->contable[numofcon], S_STATE_CLOSING); - BufList_clear(ConnectUser_get_bufList(pointer->contable[numofcon])); + ConnectUser_get_nameBuf(srUsersTable[numofcon]), + ConnectUser_get_portBuf(srUsersTable[numofcon]), + timeperiod(now - ConnectUser_get_connectTime(srUsersTable[numofcon]))); + close(ConnectUser_get_connFd(srUsersTable[numofcon])); + FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset); + FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &wset); + ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLOSING); + BufList_clear(ConnectUser_get_bufList(srUsersTable[numofcon])); buff[0] = AF_S_CONCLOSED; /* closing connection */ buff[1] = numofcon >> 8; /* high bits of user number */ buff[2] = numofcon; /* low bits of user number */ - SslFd_send_message(pointer->type, + SslFd_send_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, 5); } } } - else if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_STOPPED) { + else if (ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_STOPPED) { aflog(LOG_T_USER, LOG_I_DDEBUG, "realm[%s]: TO user[%d]: BUFFERING MESSAGE (%d)", - get_realmname(&config, j), get_username(pointer, numofcon), n); - if (TYPE_IS_UDP(pointer->type)) { /* udp */ + get_realmname(config, j), get_username(pointer, numofcon), n); + if (TYPE_IS_UDP(ServerRealm_get_realmType(pointer))) { /* udp */ buff[1] = AF_S_LOGIN; buff[2] = AF_S_MESSAGE; buff[3] = n >> 8; /* high bits of message length */ buff[4] = n; /* low bits of message length */ - BufList_insert_back(ConnectUser_get_bufList(pointer->contable[numofcon]), + BufList_insert_back(ConnectUser_get_bufList(srUsersTable[numofcon]), BufListNode_new_message(0, n+5, buff)); } else { - BufList_insert_back(ConnectUser_get_bufList(pointer->contable[numofcon]), + BufList_insert_back(ConnectUser_get_bufList(srUsersTable[numofcon]), BufListNode_new_message(0, n, buff)); } } - else if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_CLOSING) { + else if (ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_CLOSING) { aflog(LOG_T_USER, LOG_I_WARNING, "realm[%s]: TO user[%d]: IGNORED message length=%d", - get_realmname(&config, j), get_username(pointer, numofcon), n); + get_realmname(config, j), get_username(pointer, numofcon), n); } else { aflog(LOG_T_USER, LOG_I_WARNING, "realm[%s]: TO user[%d]: user in wrong state - IGNORED", - get_realmname(&config, j), get_username(pointer, numofcon)); + get_realmname(config, j), get_username(pointer, numofcon)); } } else { aflog(LOG_T_USER, LOG_I_WARNING, "realm[%s]: message to non-existing user - IGNORED", - get_realmname(&config, j)); + get_realmname(config, j)); } break; } case AF_S_LOGIN : { - if ((ConnectClient_get_state(pointer->clitable[k]) == + if ((ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) && - (numofcon==(pointer->pass[0]*256+pointer->pass[1])) && - (length==(pointer->pass[2]*256+pointer->pass[3]))) { - if (k != pointer->clinum) { - ConnectClient_set_state(pointer->clitable[k], CONNECTCLIENT_STATE_ACCEPTED); + (numofcon==(ServerRealm_get_password(pointer)[0]*256+ServerRealm_get_password(pointer)[1])) && + (length==(ServerRealm_get_password(pointer)[2]*256+ServerRealm_get_password(pointer)[3]))) { + if (k != ServerRealm_get_clientsLimit(pointer)) { + ConnectClient_set_state(srClientsTable[k], CONNECTCLIENT_STATE_ACCEPTED); aflog(LOG_T_CLIENT, LOG_I_INFO, "realm[%s]: Client[%s]: pass ok - ACCESS GRANTED", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); buff[0] = AF_S_LOGIN; /* sending message */ buff[1] = ConnectClient_get_limit( - pointer->clitable[k]) >> 8;/* high bits of user number */ + srClientsTable[k]) >> 8;/* high bits of user number */ buff[2] = ConnectClient_get_limit( - pointer->clitable[k]); /* low bits of user number */ - buff[3] = pointer->type; /* type of connection */ - SslFd_send_message(pointer->type | TYPE_SSL | TYPE_ZLIB, + srClientsTable[k]); /* low bits of user number */ + buff[3] = ServerRealm_get_realmType(pointer); /* type of connection */ + SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB, ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, 5); manconnecting--; - if (pointer->baseport == 1) { + if (ServerRealm_get_basePortOn(pointer) == 1) { long tmp_val; char tmp_tab[6]; if (check_long( UsrCli_get_listenPortName( - pointer->usrclitable[ - ConnectClient_get_usrCliPair(pointer->clitable[k])]), + srUsersClientsTable[ + ConnectClient_get_usrCliPair(srClientsTable[k])]), &tmp_val)) { aflog(LOG_T_CLIENT, LOG_I_ERR, "realm[%s]: INVALID listenport - removing Client[%s]", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); remove_client(pointer, k, &allset, &wset, &manconnecting); break; } @@ -1645,63 +1770,64 @@ main(int argc, char **argv) sprintf(tmp_tab, "%d", (int)tmp_val); ipfam = 0x01; #ifdef AF_INET6 - if (TYPE_IS_IPV4(pointer->type)) { + if (TYPE_IS_IPV4(ServerRealm_get_realmType(pointer))) { ipfam |= 0x02; } - else if (TYPE_IS_IPV6(pointer->type)) { + else if (TYPE_IS_IPV6(ServerRealm_get_realmType(pointer))) { ipfam |= 0x04; } #endif - while (ip_listen(ConnectClient_get_listenFdp(pointer->clitable[k]), - UsrCli_get_listenHostName(pointer->usrclitable[ - ConnectClient_get_usrCliPair(pointer->clitable[k])]) ? - UsrCli_get_listenHostName(pointer->usrclitable[ - ConnectClient_get_usrCliPair(pointer->clitable[k])]) : - pointer->hostname, - tmp_tab, (&(pointer->addrlen)), ipfam)) { + while (ip_listen(ConnectClient_get_listenFdp(srClientsTable[k]), + UsrCli_get_listenHostName(srUsersClientsTable[ + ConnectClient_get_usrCliPair(srClientsTable[k])]) ? + UsrCli_get_listenHostName(srUsersClientsTable[ + ConnectClient_get_usrCliPair(srClientsTable[k])]) : + ServerRealm_get_hostName(pointer), + tmp_tab, (&len), ipfam)) { tmp_val = (tmp_val+1)%65536; memset(tmp_tab, 0, 6); sprintf(tmp_tab, "%d", (int)tmp_val); } - FD_SET(ConnectClient_get_listenFd(pointer->clitable[k]), &allset); - maxfdp1 = (maxfdp1>(ConnectClient_get_listenFd(pointer->clitable[k])+1)) ? - maxfdp1 : (ConnectClient_get_listenFd(pointer->clitable[k]) + 1); + ServerRealm_set_addressLength(pointer, len); + FD_SET(ConnectClient_get_listenFd(srClientsTable[k]), &allset); + maxfdp1 = (maxfdp1>(ConnectClient_get_listenFd(srClientsTable[k])+1)) ? + maxfdp1 : (ConnectClient_get_listenFd(srClientsTable[k]) + 1); aflog(LOG_T_CLIENT, LOG_I_INFO, "realm[%s]: Client[%s]: listenport=%s", - get_realmname(&config, j), get_clientname(pointer, k), tmp_tab); + get_realmname(config, j), get_clientname(pointer, k), tmp_tab); } } else { aflog(LOG_T_CLIENT, LOG_I_WARNING, - "realm[%s]: client limit EXCEEDED", get_realmname(&config, j)); + "realm[%s]: client limit EXCEEDED", get_realmname(config, j)); buff[0] = AF_S_CANT_OPEN; /* sending message */ - SslFd_send_message(pointer->type | TYPE_SSL, + SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL, ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, 5); remove_client(pointer, k, &allset, &wset, &manconnecting); } } - else if ((ConnectClient_get_state(pointer->clitable[k]) == + else if ((ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_ACCEPTED) && (numofcon == 0)) { - n = SslFd_get_message(pointer->type, + n = SslFd_get_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, length); buff[n] = 0; aflog(LOG_T_CLIENT, LOG_I_INFO, "realm[%s]: Client[%s]: ID received: %s", - get_realmname(&config, j), get_clientname(pointer, k), buff); - ConnectClient_set_sClientId(pointer->clitable[k], (char*) buff); + get_realmname(config, j), get_clientname(pointer, k), buff); + ConnectClient_set_sClientId(srClientsTable[k], (char*) buff); } else { aflog(LOG_T_CLIENT, LOG_I_ERR, "realm[%s]: Client[%s]: Wrong password - CLOSING", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); buff[0] = AF_S_WRONG; /* sending message */ - SslFd_send_message(pointer->type | TYPE_SSL, + SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL, ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, 5); remove_client(pointer, k, &allset, &wset, &manconnecting); } @@ -1710,97 +1836,97 @@ main(int argc, char **argv) case AF_S_DONT_SEND: { aflog(LOG_T_CLIENT, LOG_I_DEBUG, "realm[%s]: user[%d]: STOP READING", - get_realmname(&config, j), get_username(pointer, numofcon)); - FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset); + get_realmname(config, j), get_username(pointer, numofcon)); + FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset); break; } case AF_S_CAN_SEND: { aflog(LOG_T_CLIENT, LOG_I_DEBUG, "realm[%s]: user[%d]: START READING", - get_realmname(&config, j), get_username(pointer, numofcon)); - FD_SET(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset); + get_realmname(config, j), get_username(pointer, numofcon)); + FD_SET(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset); break; } case AF_S_WRONG: { aflog(LOG_T_CLIENT, LOG_I_ERR, "realm[%s]: Client[%s]: Wrong message - CLOSING", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); remove_client(pointer, k, &allset, &wset, &manconnecting); break; } case AF_S_ADMIN_LOGIN: { - if ((ConnectClient_get_state(pointer->clitable[k]) == + if ((ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) && - (numofcon == (pointer->pass[0]*256 + pointer->pass[1])) && - (length == (pointer->pass[2]*256 + pointer->pass[3]))) { + (numofcon == (ServerRealm_get_password(pointer)[0]*256 + ServerRealm_get_password(pointer)[1])) && + (length == (ServerRealm_get_password(pointer)[2]*256 + ServerRealm_get_password(pointer)[3]))) { aflog(LOG_T_MANAGE, LOG_I_INFO, "realm[%s]: Client[%s]: NEW remote admin -- pass OK", - get_realmname(&config, j), get_clientname(pointer, k)); - for (l = 0; l < pointer->raclinum; ++l) { - if (ConnectClient_get_state(pointer->raclitable[l]) == + get_realmname(config, j), get_clientname(pointer, k)); + for (l = 0; l < ServerRealm_get_raClientsLimit(pointer); ++l) { + if (ConnectClient_get_state(srRaClientsTable[l]) == CONNECTCLIENT_STATE_FREE) { SslFd_set_fd( - ConnectClient_get_sslFd(pointer->raclitable[l]), + ConnectClient_get_sslFd(srRaClientsTable[l]), SslFd_get_fd( - ConnectClient_get_sslFd(pointer->clitable[k]))); + ConnectClient_get_sslFd(srClientsTable[k]))); ConnectClient_set_connectTime( - pointer->raclitable[l], - ConnectClient_get_connectTime(pointer->clitable[k])); + srRaClientsTable[l], + ConnectClient_get_connectTime(srClientsTable[k])); #ifdef HAVE_LIBPTHREAD ConnectClient_set_tunnelType( - pointer->raclitable[l], - ConnectClient_get_tunnelType(pointer->clitable[k])); + srRaClientsTable[l], + ConnectClient_get_tunnelType(srClientsTable[k])); #endif ConnectClient_set_clientId( - pointer->raclitable[l], - ConnectClient_get_clientId(pointer->clitable[k])); + srRaClientsTable[l], + ConnectClient_get_clientId(srClientsTable[k])); ConnectClient_set_nameBuf( - pointer->raclitable[l], - ConnectClient_get_nameBuf(pointer->clitable[k])); + srRaClientsTable[l], + ConnectClient_get_nameBuf(srClientsTable[k])); ConnectClient_set_portBuf( - pointer->raclitable[l], - ConnectClient_get_portBuf(pointer->clitable[k])); + srRaClientsTable[l], + ConnectClient_get_portBuf(srClientsTable[k])); tmp_ssl = SslFd_get_ssl( - ConnectClient_get_sslFd(pointer->raclitable[l])); + ConnectClient_get_sslFd(srRaClientsTable[l])); SslFd_set_ssl_nf( - ConnectClient_get_sslFd(pointer->raclitable[l]), + ConnectClient_get_sslFd(srRaClientsTable[l]), SslFd_get_ssl( - ConnectClient_get_sslFd(pointer->clitable[k]))); + ConnectClient_get_sslFd(srClientsTable[k]))); SslFd_set_ssl_nf( - ConnectClient_get_sslFd(pointer->clitable[k]), + ConnectClient_get_sslFd(srClientsTable[k]), tmp_ssl); ConnectClient_set_state( - pointer->clitable[k], + srClientsTable[k], CONNECTCLIENT_STATE_FREE); break; } } - if (l != pointer->raclinum) { + if (l != ServerRealm_get_raClientsLimit(pointer)) { ConnectClient_set_state( - pointer->raclitable[l], + srRaClientsTable[l], CONNECTCLIENT_STATE_ACCEPTED); - pointer->raclicon++; + ServerRealm_increase_connectedRaClients(pointer); manconnecting--; sprintf((char*) &buff[5], AF_VER("AFSERVER")); n = strlen((char*) &buff[5]); buff[0] = AF_S_ADMIN_LOGIN; /* sending message */ - buff[1] = pointer->type; /* type of connection */ + buff[1] = ServerRealm_get_realmType(pointer); /* type of connection */ buff[2] = AF_RA_UNDEFINED; buff[3] = n >> 8; /* high bits of message length */ buff[4] = n; /* low bits of message length */ - SslFd_send_message(pointer->type | TYPE_SSL, + SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL, ConnectClient_get_sslFd( - pointer->raclitable[l]), + srRaClientsTable[l]), buff, n+5); } else { aflog(LOG_T_MANAGE, LOG_I_WARNING, "realm[%s]: Client[%s]: remote admin -- limit EXCEEDED", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); buff[0] = AF_S_CANT_OPEN; /* sending message */ - SslFd_send_message(pointer->type | TYPE_SSL | TYPE_ZLIB, + SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB, ConnectClient_get_sslFd( - pointer->clitable[k]), + srClientsTable[k]), buff, 5); remove_client(pointer, k, &allset, &wset, &manconnecting); } @@ -1810,37 +1936,37 @@ main(int argc, char **argv) case AF_S_KEEP_ALIVE: { aflog(LOG_T_CLIENT, LOG_I_DEBUG, "realm[%s]: Client[%s]: Keep alive packet", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); break; } default : { aflog(LOG_T_CLIENT, LOG_I_ERR, "realm[%s]: Client[%s]: Unrecognized message - CLOSING", - get_realmname(&config, j), get_clientname(pointer, k)); + get_realmname(config, j), get_clientname(pointer, k)); remove_client(pointer, k, &allset, &wset, &manconnecting); } } } /* ------------------------------------ */ - for (k = 0; k < pointer->raclinum; ++k) - if ((ConnectClient_get_state(pointer->raclitable[k]) > CONNECTCLIENT_STATE_FREE) && - (FD_ISSET(SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k])), &rset))) { - if (ConnectClient_get_state(pointer->raclitable[k]) == CONNECTCLIENT_STATE_CONNECTING) { - make_ssl_initialize(ConnectClient_get_sslFd(pointer->raclitable[k])); + for (k = 0; k < ServerRealm_get_raClientsLimit(pointer); ++k) + if ((ConnectClient_get_state(srRaClientsTable[k]) > CONNECTCLIENT_STATE_FREE) && + (FD_ISSET(SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k])), &rset))) { + if (ConnectClient_get_state(srRaClientsTable[k]) == CONNECTCLIENT_STATE_CONNECTING) { + make_ssl_initialize(ConnectClient_get_sslFd(srRaClientsTable[k])); aflog(LOG_T_MANAGE, LOG_I_DDEBUG, "realm[%s]: new Client[%s] (ra): SSL_accept", - get_realmname(&config, j), get_raclientname(pointer, k)); - switch (make_ssl_accept(ConnectClient_get_sslFd(pointer->raclitable[k]))) { + get_realmname(config, j), get_raclientname(pointer, k)); + switch (make_ssl_accept(ConnectClient_get_sslFd(srRaClientsTable[k]))) { case 2: { - close (SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k]))); - FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k])), &allset); - SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(pointer->raclitable[k]))); - ConnectClient_set_state(pointer->raclitable[k], CONNECTCLIENT_STATE_FREE); + close (SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k]))); + FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k])), &allset); + SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(srRaClientsTable[k]))); + ConnectClient_set_state(srRaClientsTable[k], CONNECTCLIENT_STATE_FREE); manconnecting--; - pointer->clicon--; + ServerRealm_decrease_connectedClients(pointer); aflog(LOG_T_MANAGE, LOG_I_ERR, "realm[%s]: new Client[%s] (ra): DENIED by SSL_accept", - get_realmname(&config, j), get_raclientname(pointer, k)); + get_realmname(config, j), get_raclientname(pointer, k)); } case 1: { continue; @@ -1848,30 +1974,30 @@ main(int argc, char **argv) default: { aflog(LOG_T_MANAGE, LOG_I_DEBUG, "realm[%s]: new Client[%s] (ra): ACCEPTED by SSL_accept", - get_realmname(&config, j), get_raclientname(pointer, k)); - ConnectClient_set_state(pointer->raclitable[k], CONNECTCLIENT_STATE_AUTHORIZING); + get_realmname(config, j), get_raclientname(pointer, k)); + ConnectClient_set_state(srRaClientsTable[k], CONNECTCLIENT_STATE_AUTHORIZING); continue; } } } aflog(LOG_T_MANAGE, LOG_I_DDEBUG, "realm[%s]: Client[%s] (ra): commfd: FD_ISSET", - get_realmname(&config, j), get_raclientname(pointer, k)); - n = SslFd_get_message(pointer->type | TYPE_SSL | TYPE_ZLIB, + get_realmname(config, j), get_raclientname(pointer, k)); + n = SslFd_get_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB, ConnectClient_get_sslFd( - pointer->raclitable[k]), - buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(pointer->raclitable[k]))); + srRaClientsTable[k]), + buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(srRaClientsTable[k]))); if (n == -1) { if (errno == EAGAIN) { aflog(LOG_T_MANAGE, LOG_I_DDEBUG, "realm[%s]: Client[%s] (ra): commfd: EAGAIN", - get_realmname(&config, j), get_raclientname(pointer, k)); + get_realmname(config, j), get_raclientname(pointer, k)); continue; } else { aflog(LOG_T_MANAGE, LOG_I_ERR, "realm[%s]: Client[%s] (ra): commfd: ERROR: %d", - get_realmname(&config, j), get_raclientname(pointer, k), errno); + get_realmname(config, j), get_raclientname(pointer, k), errno); n = 0; } } @@ -1879,10 +2005,10 @@ main(int argc, char **argv) if (n != 0) { aflog(LOG_T_MANAGE, LOG_I_WARNING, "realm[%s]: Client[%s] (ra): header length = %d --> buffering", - get_realmname(&config, j), get_raclientname(pointer, k), n); - HeaderBuffer_store(ConnectClient_get_header(pointer->raclitable[k]), buff, n); - if (HeaderBuffer_to_read(ConnectClient_get_header(pointer->raclitable[k])) == 0) { - HeaderBuffer_restore(ConnectClient_get_header(pointer->raclitable[k]), buff); + get_realmname(config, j), get_raclientname(pointer, k), n); + HeaderBuffer_store(ConnectClient_get_header(srRaClientsTable[k]), buff, n); + if (HeaderBuffer_to_read(ConnectClient_get_header(srRaClientsTable[k])) == 0) { + HeaderBuffer_restore(ConnectClient_get_header(srRaClientsTable[k]), buff); n = 5; } else { @@ -1894,7 +2020,7 @@ main(int argc, char **argv) remove_raclient(pointer, k, &allset, &wset, &manconnecting); aflog(LOG_T_MANAGE, LOG_I_INFO, "realm[%s]: Client[%s] (ra): commfd: CLOSED", - get_realmname(&config, j), get_raclientname(pointer, k)); + get_realmname(config, j), get_raclientname(pointer, k)); continue; } @@ -1905,94 +2031,94 @@ main(int argc, char **argv) length = length << 8; length += buff[4]; /* this is length of message */ - if (ConnectClient_get_state(pointer->raclitable[k]) < CONNECTCLIENT_STATE_AUTHORIZING) { + if (ConnectClient_get_state(srRaClientsTable[k]) < CONNECTCLIENT_STATE_AUTHORIZING) { aflog(LOG_T_MANAGE, LOG_I_WARNING, "realm[%s]: Client[%s] (ra): Impossible behaviour --> ignoring", - get_realmname(&config, j), get_raclientname(pointer, k)); + get_realmname(config, j), get_raclientname(pointer, k)); continue; } - if ((ConnectClient_get_state(pointer->raclitable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) && + if ((ConnectClient_get_state(srRaClientsTable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) && (buff[0] != AF_S_LOGIN) && (buff[0] != AF_S_ADMIN_LOGIN)) { buff[0] = AF_S_WRONG; } switch (buff[0]) { case AF_S_LOGIN : { - if ((ConnectClient_get_state(pointer->raclitable[k]) == + if ((ConnectClient_get_state(srRaClientsTable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) && - (numofcon==(pointer->pass[0]*256+pointer->pass[1])) && - (length==(pointer->pass[2]*256+pointer->pass[3]))) { - for (l = 0; l < pointer->clinum; ++l) { - if (ConnectClient_get_state(pointer->clitable[l]) == + (numofcon==(ServerRealm_get_password(pointer)[0]*256+ServerRealm_get_password(pointer)[1])) && + (length==(ServerRealm_get_password(pointer)[2]*256+ServerRealm_get_password(pointer)[3]))) { + for (l = 0; l < ServerRealm_get_clientsLimit(pointer); ++l) { + if (ConnectClient_get_state(srClientsTable[l]) == CONNECTCLIENT_STATE_FREE) { aflog(LOG_T_MANAGE | LOG_T_CLIENT, LOG_I_INFO, "realm[%s]: Client[%s] (ra) --> Client[%s]", - get_realmname(&config, j), + get_realmname(config, j), get_raclientname(pointer, k), get_clientname(pointer, l)); SslFd_set_fd( - ConnectClient_get_sslFd(pointer->clitable[l]), + ConnectClient_get_sslFd(srClientsTable[l]), SslFd_get_fd( - ConnectClient_get_sslFd(pointer->raclitable[k]))); + ConnectClient_get_sslFd(srRaClientsTable[k]))); ConnectClient_set_connectTime( - pointer->clitable[l], - ConnectClient_get_connectTime(pointer->raclitable[k])); + srClientsTable[l], + ConnectClient_get_connectTime(srRaClientsTable[k])); #ifdef HAVE_LIBPTHREAD ConnectClient_set_tunnelType( - pointer->clitable[l], - ConnectClient_get_tunnelType(pointer->raclitable[k])); + srClientsTable[l], + ConnectClient_get_tunnelType(srRaClientsTable[k])); #endif ConnectClient_set_clientId( - pointer->clitable[l], - ConnectClient_get_clientId(pointer->raclitable[k])); + srClientsTable[l], + ConnectClient_get_clientId(srRaClientsTable[k])); ConnectClient_set_nameBuf( - pointer->clitable[l], - ConnectClient_get_nameBuf(pointer->raclitable[k])); + srClientsTable[l], + ConnectClient_get_nameBuf(srRaClientsTable[k])); ConnectClient_set_portBuf( - pointer->clitable[l], - ConnectClient_get_portBuf(pointer->raclitable[k])); + srClientsTable[l], + ConnectClient_get_portBuf(srRaClientsTable[k])); tmp_ssl = SslFd_get_ssl( - ConnectClient_get_sslFd(pointer->clitable[l])); + ConnectClient_get_sslFd(srClientsTable[l])); SslFd_set_ssl_nf( - ConnectClient_get_sslFd(pointer->clitable[l]), + ConnectClient_get_sslFd(srClientsTable[l]), SslFd_get_ssl( - ConnectClient_get_sslFd(pointer->raclitable[k]))); + ConnectClient_get_sslFd(srRaClientsTable[k]))); SslFd_set_ssl_nf( - ConnectClient_get_sslFd(pointer->raclitable[k]), + ConnectClient_get_sslFd(srRaClientsTable[k]), tmp_ssl); ConnectClient_set_usrCliPair( - pointer->clitable[l], - ConnectClient_get_usrCliPair(pointer->raclitable[k])); - ConnectClient_set_state(pointer->raclitable[k], CONNECTCLIENT_STATE_FREE); + srClientsTable[l], + ConnectClient_get_usrCliPair(srRaClientsTable[k])); + ConnectClient_set_state(srRaClientsTable[k], CONNECTCLIENT_STATE_FREE); break; } } - if (l != pointer->clinum) { - ConnectClient_set_state(pointer->clitable[l], CONNECTCLIENT_STATE_ACCEPTED); + if (l != ServerRealm_get_clientsLimit(pointer)) { + ConnectClient_set_state(srClientsTable[l], CONNECTCLIENT_STATE_ACCEPTED); aflog(LOG_T_CLIENT, LOG_I_INFO, "realm[%s]: Client[%s]: pass ok - ACCESS GRANTED", - get_realmname(&config, j), get_clientname(pointer, l)); + get_realmname(config, j), get_clientname(pointer, l)); buff[0] = AF_S_LOGIN; /* sending message */ buff[1] = ConnectClient_get_limit( - pointer->clitable[l]) >> 8;/* high bits of user number */ + srClientsTable[l]) >> 8;/* high bits of user number */ buff[2] = ConnectClient_get_limit( - pointer->clitable[l]); /* low bits of user number */ - buff[3] = pointer->type; /* type of connection */ - SslFd_send_message(pointer->type | TYPE_SSL | TYPE_ZLIB, + srClientsTable[l]); /* low bits of user number */ + buff[3] = ServerRealm_get_realmType(pointer); /* type of connection */ + SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB, ConnectClient_get_sslFd( - pointer->clitable[l]), + srClientsTable[l]), buff, 5); manconnecting--; - if (pointer->baseport == 1) { + if (ServerRealm_get_basePortOn(pointer) == 1) { long tmp_val; char tmp_tab[6]; if (check_long( UsrCli_get_listenPortName( - pointer->usrclitable[ - ConnectClient_get_usrCliPair(pointer->clitable[l])]), + srUsersClientsTable[ + ConnectClient_get_usrCliPair(srClientsTable[l])]), &tmp_val)) { aflog(LOG_T_CLIENT, LOG_I_ERR, "realm[%s]: INVALID listenport - removing Client[%s]", - get_realmname(&config, j), get_clientname(pointer, l)); + get_realmname(config, j), get_clientname(pointer, l)); remove_client(pointer, l, &allset, &wset, &manconnecting); break; } @@ -2001,59 +2127,60 @@ main(int argc, char **argv) sprintf(tmp_tab, "%d", (int)tmp_val); ipfam = 0x01; #ifdef AF_INET6 - if (TYPE_IS_IPV4(pointer->type)) { + if (TYPE_IS_IPV4(ServerRealm_get_realmType(pointer))) { ipfam |= 0x02; } - else if (TYPE_IS_IPV6(pointer->type)) { + else if (TYPE_IS_IPV6(ServerRealm_get_realmType(pointer))) { ipfam |= 0x04; } #endif - while (ip_listen(ConnectClient_get_listenFdp(pointer->clitable[l]), - UsrCli_get_listenHostName(pointer->usrclitable[ - ConnectClient_get_usrCliPair(pointer->clitable[l])]) ? - UsrCli_get_listenHostName(pointer->usrclitable[ - ConnectClient_get_usrCliPair(pointer->clitable[l])]) : - pointer->hostname, - tmp_tab, (&(pointer->addrlen)), ipfam)) { + while (ip_listen(ConnectClient_get_listenFdp(srClientsTable[l]), + UsrCli_get_listenHostName(srUsersClientsTable[ + ConnectClient_get_usrCliPair(srClientsTable[l])]) ? + UsrCli_get_listenHostName(srUsersClientsTable[ + ConnectClient_get_usrCliPair(srClientsTable[l])]) : + ServerRealm_get_hostName(pointer), + tmp_tab, (&len), ipfam)) { tmp_val = (tmp_val+1)%65536; memset(tmp_tab, 0, 6); sprintf(tmp_tab, "%d", (int)tmp_val); } - FD_SET(ConnectClient_get_listenFd(pointer->clitable[l]), &allset); - maxfdp1 = (maxfdp1>(ConnectClient_get_listenFd(pointer->clitable[l])+1)) ? - maxfdp1 : (ConnectClient_get_listenFd(pointer->clitable[l])+1); + ServerRealm_set_addressLength(pointer, len); + FD_SET(ConnectClient_get_listenFd(srClientsTable[l]), &allset); + maxfdp1 = (maxfdp1>(ConnectClient_get_listenFd(srClientsTable[l])+1)) ? + maxfdp1 : (ConnectClient_get_listenFd(srClientsTable[l])+1); aflog(LOG_T_CLIENT, LOG_I_INFO, "realm[%s]: Client[%s]: listenport=%s", - get_realmname(&config, j), get_clientname(pointer, l), tmp_tab); + get_realmname(config, j), get_clientname(pointer, l), tmp_tab); } } else { aflog(LOG_T_CLIENT, LOG_I_WARNING, - "realm[%s]: client limit EXCEEDED", get_realmname(&config, j)); + "realm[%s]: client limit EXCEEDED", get_realmname(config, j)); buff[0] = AF_S_CANT_OPEN; /* sending message */ - SslFd_send_message(pointer->type | TYPE_SSL | TYPE_ZLIB, + SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB, ConnectClient_get_sslFd( - pointer->raclitable[k]), + srRaClientsTable[k]), buff, 5); remove_raclient(pointer, k, &allset, &wset, &manconnecting); } } - else if ((ConnectClient_get_state(pointer->raclitable[k]) == + else if ((ConnectClient_get_state(srRaClientsTable[k]) == CONNECTCLIENT_STATE_ACCEPTED) && (numofcon == 0)) { - n = SslFd_get_message(pointer->type, + n = SslFd_get_message(ServerRealm_get_realmType(pointer), ConnectClient_get_sslFd( - pointer->raclitable[k]), + srRaClientsTable[k]), buff, length); buff[n] = 0; aflog(LOG_T_MANAGE, LOG_I_INFO, "realm[%s]: Client[%s] (ra): ID received: %s", - get_realmname(&config, j), get_raclientname(pointer, k), buff); - ConnectClient_set_sClientId(pointer->raclitable[k], (char*) buff); + get_realmname(config, j), get_raclientname(pointer, k), buff); + ConnectClient_set_sClientId(srRaClientsTable[k], (char*) buff); } else { aflog(LOG_T_MANAGE, LOG_I_ERR, "realm[%s]: Client[%s] (ra): Wrong password - CLOSING", - get_realmname(&config, j), get_raclientname(pointer, k)); + get_realmname(config, j), get_raclientname(pointer, k)); remove_raclient(pointer, k, &allset, &wset, &manconnecting); } break; @@ -2061,104 +2188,105 @@ main(int argc, char **argv) case AF_S_WRONG: { aflog(LOG_T_MANAGE, LOG_I_ERR, "realm[%s]: Client[%s] (ra): Wrong message - CLOSING", - get_realmname(&config, j), get_raclientname(pointer, k)); + get_realmname(config, j), get_raclientname(pointer, k)); remove_raclient(pointer, k, &allset, &wset, &manconnecting); break; } case AF_S_ADMIN_LOGIN: { - if ((ConnectClient_get_state(pointer->raclitable[k]) == + if ((ConnectClient_get_state(srRaClientsTable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) && - (numofcon==(pointer->pass[0]*256+pointer->pass[1])) && - (length==(pointer->pass[2]*256+pointer->pass[3]))) { + (numofcon==(ServerRealm_get_password(pointer)[0]*256+ServerRealm_get_password(pointer)[1])) && + (length==(ServerRealm_get_password(pointer)[2]*256+ServerRealm_get_password(pointer)[3]))) { aflog(LOG_T_MANAGE, LOG_I_INFO, "realm[%s]: Client[%s] (ra): NEW remote admin -- pass OK", - get_realmname(&config, j), get_raclientname(pointer, k)); + get_realmname(config, j), get_raclientname(pointer, k)); ConnectClient_set_state( - pointer->raclitable[k], + srRaClientsTable[k], CONNECTCLIENT_STATE_ACCEPTED); - pointer->raclicon++; + ServerRealm_increase_connectedRaClients(pointer); manconnecting--; sprintf((char*) &buff[5], AF_VER("AFSERVER")); n = strlen((char*) &buff[5]); buff[0] = AF_S_ADMIN_LOGIN; /* sending message */ - buff[1] = pointer->type; /* type of connection */ + buff[1] = ServerRealm_get_realmType(pointer); /* type of connection */ buff[2] = AF_RA_UNDEFINED; buff[3] = n >> 8; /* high bits of message length */ buff[4] = n; /* low bits of message length */ - SslFd_send_message(pointer->type | TYPE_SSL | TYPE_ZLIB, + SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB, ConnectClient_get_sslFd( - pointer->raclitable[k]), + srRaClientsTable[k]), buff, n+5); } break; } case AF_S_ADMIN_CMD: { - if (ConnectClient_get_state(pointer->raclitable[k]) == + if (ConnectClient_get_state(srRaClientsTable[k]) == CONNECTCLIENT_STATE_ACCEPTED) { - if ((n = serve_admin(&config, j, k, buff))) { + if ((n = serve_admin(config, j, k, buff))) { if (n == 1) { aflog(LOG_T_MANAGE, LOG_I_NOTICE, "realm[%s]: Client[%s] (ra): remote admin -- closing", - get_realmname(&config, j), get_raclientname(pointer, k)); + get_realmname(config, j), get_raclientname(pointer, k)); remove_raclient(pointer, k, &allset, &wset, &manconnecting); } else { - for (i = 0; i < config.size; ++i) { - l = get_clientnumber(&(config.realmtable[i]), n-2); + for (i = 0; i < ServerConfiguration_get_realmsNumber(config); ++i) { + srClientsTable = ServerRealm_get_clientsTable(scRealmsTable[i]); + l = get_clientnumber(scRealmsTable[i], n-2); if (l != -1) { aflog(LOG_T_MANAGE, LOG_I_NOTICE, "realm[%s]: Client[%s] (ra): remote admin: KICKING realm[%s]: Client[%s]", - get_realmname(&config, j), get_raclientname(pointer, k), - get_realmname(&config, i), - get_clientname(&(config.realmtable[i]), l)); + get_realmname(config, j), get_raclientname(pointer, k), + get_realmname(config, i), + get_clientname(scRealmsTable[i], l)); buff[0] = AF_S_CLOSING; /* closing */ - SslFd_send_message(config.realmtable[i].type, + SslFd_send_message(ServerRealm_get_realmType(scRealmsTable[i]), ConnectClient_get_sslFd( - config.realmtable[i].clitable[l]), + srClientsTable[l]), buff, 5); time(&now); aflog(LOG_T_CLIENT, LOG_I_NOTICE, "REALM: %s CLIENT: %s IP: %s PORT: %s DURATION: %s", - get_realmname(&config, j), - get_clientname(&(config.realmtable[i]), l), - ConnectClient_get_nameBuf(config.realmtable[i].clitable[l]), - ConnectClient_get_portBuf(config.realmtable[i].clitable[l]), + get_realmname(config, j), + get_clientname(scRealmsTable[i], l), + ConnectClient_get_nameBuf(srClientsTable[l]), + ConnectClient_get_portBuf(srClientsTable[l]), timeperiod(now - ConnectClient_get_connectTime( - config.realmtable[i].clitable[l]))); - if (config.realmtable[i].audit) { + srClientsTable[l]))); + if (ServerRealm_get_auditOn(scRealmsTable[i])) { while (AuditList_get_first( ConnectClient_get_auditList( - config.realmtable[i].clitable[l]))) { + srClientsTable[l]))) { aflog(LOG_T_CLIENT, LOG_I_NOTICE, "USERID: %d IP: %s PORT: %s CONNECTED: %s DURATION: %s", AuditListNode_get_userId( AuditList_get_first( ConnectClient_get_auditList( - config.realmtable[i].clitable[l]))), + srClientsTable[l]))), AuditListNode_get_nameBuf( AuditList_get_first( ConnectClient_get_auditList( - config.realmtable[i].clitable[l]))), + srClientsTable[l]))), AuditListNode_get_portBuf( AuditList_get_first( ConnectClient_get_auditList( - config.realmtable[i].clitable[l]))), + srClientsTable[l]))), localdate( AuditListNode_get_connectTimep( AuditList_get_first( ConnectClient_get_auditList( - config.realmtable[i].clitable[l])))), + srClientsTable[l])))), timeperiod( AuditListNode_get_duration( AuditList_get_first( ConnectClient_get_auditList( - config.realmtable[i].clitable[l]))))); + srClientsTable[l]))))); AuditList_delete_first( ConnectClient_get_auditList( - config.realmtable[i].clitable[l])); + srClientsTable[l])); } } - remove_client(&(config.realmtable[i]), l, + remove_client(scRealmsTable[i], l, &allset, &wset, &manconnecting); break; } @@ -2169,7 +2297,7 @@ main(int argc, char **argv) else { aflog(LOG_T_MANAGE, LOG_I_ERR, "realm[%s]: Client[%s] (ra): remote admin -- security VIOLATION", - get_realmname(&config, j), get_raclientname(pointer, k)); + get_realmname(config, j), get_raclientname(pointer, k)); remove_raclient(pointer, k, &allset, &wset, &manconnecting); } break; @@ -2177,104 +2305,105 @@ main(int argc, char **argv) case AF_S_KEEP_ALIVE: { aflog(LOG_T_MANAGE, LOG_I_DEBUG, "realm[%s]: Client[%s] (ra): Keep alive packet", - get_realmname(&config, j), get_raclientname(pointer, k)); + get_realmname(config, j), get_raclientname(pointer, k)); break; } default : { aflog(LOG_T_MANAGE, LOG_I_ERR, "realm[%s]: Client[%s] (ra): Unrecognized message - CLOSING", - get_realmname(&config, j), get_raclientname(pointer, k)); + get_realmname(config, j), get_raclientname(pointer, k)); remove_raclient(pointer, k, &allset, &wset, &manconnecting); } } } /* ------------------------------------ */ - for (l = 0; l < pointer->usrclinum; ++l) { - if (FD_ISSET(UsrCli_get_manageFd(pointer->usrclitable[l]), &rset)) { + for (l = 0; l < ServerRealm_get_userClientPairs(pointer); ++l) { + if (FD_ISSET(UsrCli_get_manageFd(srUsersClientsTable[l]), &rset)) { aflog(LOG_T_CLIENT, LOG_I_DDEBUG, - "realm[%s]: managefd: FD_ISSET", get_realmname(&config, j)); - len = pointer->addrlen; + "realm[%s]: managefd: FD_ISSET", get_realmname(config, j)); + len = ServerRealm_get_addressLength(pointer); #ifdef HAVE_LIBPTHREAD - sent = get_new_socket(UsrCli_get_manageFd(pointer->usrclitable[l]), - pointer->tunneltype,pointer->cliaddr, &len, &tunneltype); + sent = get_new_socket(UsrCli_get_manageFd(srUsersClientsTable[l]), + ServerRealm_get_tunnelType(pointer),ServerRealm_get_clientAddress(pointer), &len, &tunneltype); #else - sent = accept(UsrCli_get_manageFd(pointer->usrclitable[l]), pointer->cliaddr, &len); + sent = accept(UsrCli_get_manageFd(srUsersClientsTable[l]), ServerRealm_get_clientAddress(pointer), &len); #endif if (sent == -1) { if (errno == EAGAIN) { aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: managefd: FD_ISSET --> EAGAIN", get_realmname(&config, j)); + "realm[%s]: managefd: FD_ISSET --> EAGAIN", get_realmname(config, j)); } else { aflog(LOG_T_USER, LOG_I_DDEBUG, - "realm[%s]: managefd: FD_ISSET --> errno=%d", get_realmname(&config, j), errno); + "realm[%s]: managefd: FD_ISSET --> errno=%d", get_realmname(config, j), errno); } continue; } flags = fcntl(sent, F_GETFL, 0); fcntl(sent, F_SETFL, flags | O_NONBLOCK); - for (k = 0; k < pointer->clinum; ++k) { - if (ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_FREE) { - ConnectClient_set_clientId(pointer->clitable[k], pointer->clientcounter); - ++(pointer->clientcounter); + for (k = 0; k < ServerRealm_get_clientsLimit(pointer); ++k) { + if (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_FREE) { + ConnectClient_set_clientId(srClientsTable[k], ServerRealm_get_clientsCounter(pointer)); + ServerRealm_increase_clientsCounter(pointer); aflog(LOG_T_CLIENT, LOG_I_INFO, "realm[%s]: new Client[%s]: CONNECTING", - get_realmname(&config, j), get_clientname(pointer, k)); - SslFd_set_fd(ConnectClient_get_sslFd(pointer->clitable[k]), sent); - ConnectClient_set_usrCliPair(pointer->clitable[k], l); + get_realmname(config, j), get_clientname(pointer, k)); + SslFd_set_fd(ConnectClient_get_sslFd(srClientsTable[k]), sent); + ConnectClient_set_usrCliPair(srClientsTable[k], l); time(&now); - ConnectClient_set_connectTime(pointer->clitable[k], now); + ConnectClient_set_connectTime(srClientsTable[k], now); #ifdef HAVE_LIBPTHREAD - ConnectClient_set_tunnelType(pointer->clitable[k], tunneltype); + ConnectClient_set_tunnelType(srClientsTable[k], tunneltype); #endif aflog(LOG_T_CLIENT, LOG_I_INFO, - "realm[%s]: new Client[%s] IP:%s", get_realmname(&config, j), get_clientname(pointer, k), - sock_ntop(pointer->cliaddr, len, ConnectClient_get_nameBuf(pointer->clitable[k]), - ConnectClient_get_portBuf(pointer->clitable[k]), pointer->dnslookups)); - FD_SET(SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k])), &allset); - maxfdp1 = (maxfdp1 > (SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k])) + 1)) ? - maxfdp1 : (SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k])) + 1); - pointer->clicon++; - ConnectClient_set_timer(pointer->clitable[k], timeval_create(pointer->tmout, 0)); + "realm[%s]: new Client[%s] IP:%s", get_realmname(config, j), get_clientname(pointer, k), + sock_ntop(ServerRealm_get_clientAddress(pointer), len, ConnectClient_get_nameBuf(srClientsTable[k]), + ConnectClient_get_portBuf(srClientsTable[k]), ServerRealm_get_dnsLookupsOn(pointer))); + FD_SET(SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k])), &allset); + maxfdp1 = (maxfdp1 > (SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k])) + 1)) ? + maxfdp1 : (SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k])) + 1); + ServerRealm_increase_connectedClients(pointer); + ConnectClient_set_timer(srClientsTable[k], timeval_create(ServerRealm_get_timeout(pointer), 0)); manconnecting++; - ConnectClient_set_state(pointer->clitable[k], CONNECTCLIENT_STATE_CONNECTING); + ConnectClient_set_state(srClientsTable[k], CONNECTCLIENT_STATE_CONNECTING); break; } } - if (k == pointer->clinum) { - for (k = 0; k < pointer->raclinum; ++k) { - if (ConnectClient_get_state(pointer->raclitable[k]) == + if (k == ServerRealm_get_clientsLimit(pointer)) { + for (k = 0; k < ServerRealm_get_raClientsLimit(pointer); ++k) { + if (ConnectClient_get_state(srRaClientsTable[k]) == CONNECTCLIENT_STATE_FREE) { - ConnectClient_set_clientId(pointer->raclitable[k], pointer->clientcounter); - ++(pointer->clientcounter); + ConnectClient_set_clientId(srRaClientsTable[k], ServerRealm_get_clientsCounter(pointer)); + ServerRealm_increase_clientsCounter(pointer); aflog(LOG_T_MANAGE, LOG_I_INFO, "realm[%s]: new Client[%s] (ra): CONNECTING", - get_realmname(&config, j), get_raclientname(pointer, k)); - SslFd_set_fd(ConnectClient_get_sslFd(pointer->raclitable[k]), sent); - ConnectClient_set_usrCliPair(pointer->raclitable[k], l); + get_realmname(config, j), get_raclientname(pointer, k)); + SslFd_set_fd(ConnectClient_get_sslFd(srRaClientsTable[k]), sent); + ConnectClient_set_usrCliPair(srRaClientsTable[k], l); time(&now); - ConnectClient_set_connectTime(pointer->raclitable[k], now); + ConnectClient_set_connectTime(srRaClientsTable[k], now); #ifdef HAVE_LIBPTHREAD - ConnectClient_set_tunnelType(pointer->raclitable[k], tunneltype); + ConnectClient_set_tunnelType(srRaClientsTable[k], tunneltype); #endif aflog(LOG_T_MANAGE, LOG_I_INFO, "realm[%s]: new Client[%s] (ra) IP:%s", - get_realmname(&config, j), get_raclientname(pointer, k), - sock_ntop(pointer->cliaddr, len, ConnectClient_get_nameBuf(pointer->raclitable[k]), - ConnectClient_get_portBuf(pointer->raclitable[k]), pointer->dnslookups)); - FD_SET(SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k])), &allset); - maxfdp1 = (maxfdp1 > (SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k])) + 1)) ? - maxfdp1 : (SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k])) + 1); - pointer->clicon++; - ConnectClient_set_timer(pointer->raclitable[k], timeval_create(pointer->tmout, 0)); + get_realmname(config, j), get_raclientname(pointer, k), + sock_ntop(ServerRealm_get_clientAddress(pointer), len, ConnectClient_get_nameBuf(srRaClientsTable[k]), + ConnectClient_get_portBuf(srRaClientsTable[k]), ServerRealm_get_dnsLookupsOn(pointer))); + FD_SET(SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k])), &allset); + maxfdp1 = (maxfdp1 > (SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k])) + 1)) ? + maxfdp1 : (SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k])) + 1); + ServerRealm_increase_connectedClients(pointer); + ConnectClient_set_timer(srRaClientsTable[k], + timeval_create(ServerRealm_get_timeout(pointer), 0)); manconnecting++; - ConnectClient_set_state(pointer->raclitable[k], CONNECTCLIENT_STATE_CONNECTING); + ConnectClient_set_state(srRaClientsTable[k], CONNECTCLIENT_STATE_CONNECTING); break; } } - if (k == pointer->raclinum) { + if (k == ServerRealm_get_raClientsLimit(pointer)) { aflog(LOG_T_CLIENT | LOG_T_MANAGE, LOG_I_WARNING, - "realm[%s]: client limit EXCEEDED", get_realmname(&config, j)); + "realm[%s]: client limit EXCEEDED", get_realmname(config, j)); close(sent); } } -- cgit v1.1