Kaynağa Gözat

Test radius api

TelenkovDmitry 7 yıl önce
ebeveyn
işleme
4af9dbe65b

+ 76 - 14
modules/radius/radius_user.c

@@ -61,11 +61,11 @@ OPTION      rcOptions[] = {
 {"login_local",		OT_STR, ST_UNDEF, (void*)&login_local},
 };
 
-DICT_ATTR   attr_1;
-DICT_ATTR   attr_2;
-DICT_ATTR   attr_3;
+static DICT_ATTR   attr_1;
+static DICT_ATTR   attr_2;
+static DICT_ATTR   attr_3;
 
-static char fr_msg[PW_MAX_MSG_SIZE];
+static char rc_msg[PW_MAX_MSG_SIZE];
 
 
 RadiusClientResult RC_Login(char* login, char* pas)
@@ -74,9 +74,12 @@ RadiusClientResult RC_Login(char* login, char* pas)
     VALUE_PAIR* received;
     uint32_t	service;
     
+    int result;
     
-    memset(fr_msg, 0, PW_MAX_MSG_SIZE);
+    memset(rc_msg, 0, PW_MAX_MSG_SIZE);
   
+    rc_read_config(&rcHandle);
+    
     // Формирование атрибутов
     // 1. User name
     strncpy(attr_1.name, login, strlen(login));
@@ -98,21 +101,57 @@ RadiusClientResult RC_Login(char* login, char* pas)
     
     rcHandle.dictionary_attributes = &attr_3;
     
-/*    
-	// Fill in User-Name
-    if (rc_avpair_add(&rcHandle, &send, PW_USER_NAME, username_realm, -1, 0) == NULL)
+    send = NULL;
+    
+	// User-Name
+    if (rc_avpair_add(&rcHandle, &send, PW_USER_NAME, login, -1, 0) == NULL)
 		return RC_ERROR;
     
-	// Fill in User-Password
-	if (rc_avpair_add(&rcHandle, &send, PW_USER_PASSWORD, passwd, -1, 0) == NULL)
+	// User-Password
+	if (rc_avpair_add(&rcHandle, &send, PW_USER_PASSWORD, pas, -1, 0) == NULL)
 		return RC_ERROR;
-
 	
-	// Fill in Service-Type
+	// Service-Type
 	service = PW_AUTHENTICATE_ONLY;
 	if (rc_avpair_add(&rcHandle, &send, PW_SERVICE_TYPE, &service, -1, 0) == NULL)
 		return RC_ERROR;
-*/
+
+    result = rc_auth(&rcHandle, 0, send, &received, rc_msg);
+    
+    switch (result)
+    {
+    case USER_RC :
+        return RC_LOGIN_USER_OK;
+    break;
+    
+    case ADMIN_RC :
+        return RC_LOGIN_ADMIN_OK;
+    break;
+    
+    case NET_ERR_RC :
+        return RC_NET_ERR;
+    break;
+    
+    case ERROR_RC :
+        return RC_ERROR;
+    break;
+    
+    case BADRESP_RC :
+        return RC_ACC_DENIED;
+    break;
+    
+    case REJECT_RC :
+        return RC_ACC_DENIED;
+    break;
+    
+    default :
+        return RC_ERROR;
+    break;
+    }
+    
+    //printf("\r\n");
+    //printf("Radius client result: %i\r\n", result);
+    
 }
 
 /**
@@ -212,7 +251,7 @@ int RD_TestInit(void)
 	service = PW_AUTHENTICATE_ONLY;
 	if (rc_avpair_add(&rcHandle, &send, PW_SERVICE_TYPE, &service, -1, 0) == NULL)
 		return ERROR_RC;
-#if 1
+#if 0
 	result = rc_auth(&rcHandle, 0, send, &received, msg);
 
 	if (result == OK_RC)
@@ -259,4 +298,27 @@ bool recvSelect(fdsets *sets, int *socket, uint32_t timeout)
     return false;
 }
 
+//
+int RC_GetAccessRights(char* buf)
+{
+    uint16_t tmpLen = 0;
+    uint8_t att = 10;
+    
+    while (att)
+    {
+        att--;  // Предохранитель
+        
+        if (strstr(buf, "user") != 0) {
+            return USER_RC; }
+        else if (strstr(buf, "admin") != 0) {
+            return ADMIN_RC; }
+        
+        tmpLen = strlen(buf);
+        buf += tmpLen + 1;            
+    }
+    
+    return ERROR_RC;
+}
+
+
 /********************************* (C) РОТЕК **********************************/

+ 7 - 2
modules/radius/radius_user.h

@@ -19,8 +19,11 @@
 
 typedef enum
 {
-    RC_ERROR = 0,   // Внутренняя ошибка FreeRadius
-    RC_EMPTY,
+    RC_ERROR = 0,       // Внутренняя ошибка FreeRadius. 
+    RC_LOGIN_ADMIN_OK,  // Успешный логин под admin
+    RC_LOGIN_USER_OK,   // Успешный логин под user
+    RC_NET_ERR,         // Ошибка сетевого взаимодействия
+    RC_ACC_DENIED,      // Не удалось залогиниться, доступ закрыт
     
 } RadiusClientResult;
 
@@ -49,6 +52,8 @@ void initFdsets(fdsets *sets);
 
 bool recvSelect(fdsets *sets, int *socket, uint32_t timeout);
 
+int RC_GetAccessRights(char* buf);
+
 #endif /* #ifndef __RADIUS_USER_H */
 
 /****************************** (C) LiteMesh ***************** end of file ****/

+ 5 - 2
thirdparty/FreeRadius/include/freeradius-client.h

@@ -411,11 +411,14 @@ typedef struct value_pair
 
 /* Define return codes from "SendServer" utility */
 
-#define BADRESP_RC	-2
+#define NET_ERR_RC  -3  // Ошибка создания сокета, соединения/отправки/приема
+#define BADRESP_RC	-2  // Неверный пароль
 #define ERROR_RC	-1
 #define OK_RC		0
 #define TIMEOUT_RC	1
-#define REJECT_RC	2
+#define REJECT_RC	2  // Неверный логин
+#define USER_RC     3
+#define ADMIN_RC    4
 
 typedef struct send_data /* Used to pass information to sendserver() function */
 {

+ 24 - 238
thirdparty/FreeRadius/lib/buildreq.c

@@ -62,31 +62,19 @@ int rc_aaa(rc_handle *rh, uint32_t client_port, VALUE_PAIR *send, VALUE_PAIR **r
 	   char *msg, int add_nas_port, int request_type)
 {
 	SEND_DATA   data;
-	VALUE_PAIR	*adt_vp = NULL;
-	int		    result;
-	int		    i, skip_count;
+    VALUE_PAIR* myVp;
 	SERVER		*aaaserver;
 	int		    timeout = rc_conf_int(rh, "radius_timeout");
 	int		    retries = rc_conf_int(rh, "radius_retries");
 	int		    radius_deadtime = rc_conf_int(rh, "radius_deadtime");
-	double		start_time = 0;
-	double		now = 0;
-	time_t		dtime;
 	unsigned	type;
-
-// -----------------------------------------------------------------------------
-// Мои дополнения    
+    int         result;
 
     SERVER myServer;
-    char   myServerName[NAME_LENGTH] = "192.168.14.234";  
-    char   mySecret[MAX_SECRET_LENGTH] = "12345";
-    
-    myServer.max = 1;
-    myServer.name[0] = myServerName;
-    myServer.port[0] = 1645;
-    myServer.secret[0] = mySecret;
-    myServer.deadtime_ends[0] = 5000;
-    
+   
+    myVp = rc_avpair_get(send, PW_USER_PASSWORD, 0);
+    myServer.secret[0] = myVp->name;
+       
     aaaserver = &myServer;
     type = AUTH;
     
@@ -97,199 +85,31 @@ int rc_aaa(rc_handle *rh, uint32_t client_port, VALUE_PAIR *send, VALUE_PAIR **r
 	data.receive_pairs = NULL;
     
     if (add_nas_port != 0) {
-		/*
-		 * Fill in NAS-Port
-		 */
+		// Fill in NAS-Port
 		if (rc_avpair_add(rh, &(data.send_pairs), PW_NAS_PORT,
 		    &client_port, 0, 0) == NULL)
 			return ERROR_RC;
 	}
     
-// -----------------------------------------------------------------------------    
-//
-#if 1    
-
-	skip_count = 0;
-	result = ERROR_RC;
-	for (i=0; (i < aaaserver->max) && (result != OK_RC) && (result != REJECT_RC)
-	    ; i++, now = rc_getctime())
-	{
-		if (aaaserver->deadtime_ends[i] != -1 &&
-		    aaaserver->deadtime_ends[i] > start_time) {
-			skip_count++;
-			continue;
-		}
-		if (data.receive_pairs != NULL) {
-			rc_avpair_free(data.receive_pairs);
-			data.receive_pairs = NULL;
-		}
-		rc_buildreq(rh, &data, request_type, aaaserver->name[i],
-		    aaaserver->port[i], aaaserver->secret[i], timeout, retries);
-
-		if (request_type == PW_ACCOUNTING_REQUEST) {
-			dtime = now - start_time;
-			rc_avpair_assign(adt_vp, &dtime, 0);
-		}
-
-		//result = rc_send_server (rh, &data, msg, type);
-		if (result == TIMEOUT_RC && radius_deadtime > 0)
-			aaaserver->deadtime_ends[i] = start_time + (double)radius_deadtime;
-	}
-	if (result == OK_RC || result == REJECT_RC || skip_count == 0)
-		goto exit;
-
-	result = ERROR_RC;
-	for (i=0; (i < aaaserver->max) && (result != OK_RC) && (result != REJECT_RC)
-	    ; i++)
-	{
-		if (aaaserver->deadtime_ends[i] == -1 ||
-		    aaaserver->deadtime_ends[i] <= start_time) {
-			continue;
-		}
-		if (data.receive_pairs != NULL) {
-			rc_avpair_free(data.receive_pairs);
-			data.receive_pairs = NULL;
-		}
-		rc_buildreq(rh, &data, request_type, aaaserver->name[i],
-		    aaaserver->port[i], aaaserver->secret[i], timeout, retries);
-
-		if (request_type == PW_ACCOUNTING_REQUEST) {
-			dtime = rc_getctime() - start_time;
-			rc_avpair_assign(adt_vp, &dtime, 0);
-		}
-
-		result = rc_send_server (rh, &data, msg, type);
-		if (result != TIMEOUT_RC)
-			aaaserver->deadtime_ends[i] = -1;
-	}
-
-exit:
-	if (request_type != PW_ACCOUNTING_REQUEST) {
-		*received = data.receive_pairs;
-	} else {
-		rc_avpair_free(data.receive_pairs);
-	}
-#endif
-	return result;
-  
-
-#if 0  
-	SEND_DATA   data;
-	VALUE_PAIR	*adt_vp = NULL;
-	int		    result;
-	int		    i, skip_count;
-	SERVER		*aaaserver;
-	int		    timeout = rc_conf_int(rh, "radius_timeout");
-	int		    retries = rc_conf_int(rh, "radius_retries");
-	int		    radius_deadtime = rc_conf_int(rh, "radius_deadtime");
-	double		start_time = 0;
-	double		now = 0;
-	time_t		dtime;
-	unsigned	type;
-
-	if (request_type != PW_ACCOUNTING_REQUEST) {
-		aaaserver = rc_conf_srv(rh, "authserver");
-		type = AUTH;
-	} else {
-		aaaserver = rc_conf_srv(rh, "acctserver");
-		type = ACCT;
-	}
-	if (aaaserver == NULL)
-		return ERROR_RC;
-
-	data.send_pairs = send;
-	data.receive_pairs = NULL;
-
-	if (add_nas_port != 0) {
-		/*
-		 * Fill in NAS-Port
-		 */
-		if (rc_avpair_add(rh, &(data.send_pairs), PW_NAS_PORT,
-		    &client_port, 0, 0) == NULL)
-			return ERROR_RC;
-	}
-
-	if (request_type == PW_ACCOUNTING_REQUEST) {
-		/*
-		 * Fill in Acct-Delay-Time
-		 */
-		dtime = 0;
-		now = rc_getctime();
-		adt_vp = rc_avpair_get(data.send_pairs, PW_ACCT_DELAY_TIME, 0);
-		if (adt_vp == NULL) {
-			adt_vp = rc_avpair_add(rh, &(data.send_pairs),
-			    PW_ACCT_DELAY_TIME, &dtime, 0, 0);
-			if (adt_vp == NULL)
-				return ERROR_RC;
-			start_time = now;
-		} else {
-			start_time = now - adt_vp->lvalue;
-		}
-	}
-
-	skip_count = 0;
-	result = ERROR_RC;
-	for (i=0; (i < aaaserver->max) && (result != OK_RC) && (result != REJECT_RC)
-	    ; i++, now = rc_getctime())
-	{
-		if (aaaserver->deadtime_ends[i] != -1 &&
-		    aaaserver->deadtime_ends[i] > start_time) {
-			skip_count++;
-			continue;
-		}
-		if (data.receive_pairs != NULL) {
-			rc_avpair_free(data.receive_pairs);
-			data.receive_pairs = NULL;
-		}
-		rc_buildreq(rh, &data, request_type, aaaserver->name[i],
-		    aaaserver->port[i], aaaserver->secret[i], timeout, retries);
-
-		if (request_type == PW_ACCOUNTING_REQUEST) {
-			dtime = now - start_time;
-			rc_avpair_assign(adt_vp, &dtime, 0);
-		}
-
-		//result = rc_send_server (rh, &data, msg, type);
-		if (result == TIMEOUT_RC && radius_deadtime > 0)
-			aaaserver->deadtime_ends[i] = start_time + (double)radius_deadtime;
-	}
-	if (result == OK_RC || result == REJECT_RC || skip_count == 0)
-		goto exit;
-
-	result = ERROR_RC;
-	for (i=0; (i < aaaserver->max) && (result != OK_RC) && (result != REJECT_RC)
-	    ; i++)
-	{
-		if (aaaserver->deadtime_ends[i] == -1 ||
-		    aaaserver->deadtime_ends[i] <= start_time) {
-			continue;
-		}
-		if (data.receive_pairs != NULL) {
-			rc_avpair_free(data.receive_pairs);
-			data.receive_pairs = NULL;
-		}
-		rc_buildreq(rh, &data, request_type, aaaserver->name[i],
-		    aaaserver->port[i], aaaserver->secret[i], timeout, retries);
-
-		if (request_type == PW_ACCOUNTING_REQUEST) {
-			dtime = rc_getctime() - start_time;
-			rc_avpair_assign(adt_vp, &dtime, 0);
-		}
-
-		//result = rc_send_server (rh, &data, msg, type);
-		if (result != TIMEOUT_RC)
-			aaaserver->deadtime_ends[i] = -1;
-	}
-
-exit:
-	if (request_type != PW_ACCOUNTING_REQUEST) {
-		*received = data.receive_pairs;
-	} else {
+	if (data.receive_pairs != NULL) {
 		rc_avpair_free(data.receive_pairs);
+		data.receive_pairs = NULL;
 	}
-
-	return result;
-#endif    
+	rc_buildreq(rh, &data, request_type, aaaserver->name[0],
+		    aaaserver->port[0], aaaserver->secret[0], timeout, retries);
+
+    // Делаем 3 попытки если есть какие-либо проблемы с обменом
+    for (uint8_t i = 0; i < 3; i++)
+    {
+        //printf ("Radius trying\r\n");
+        result = rc_send_server(rh, &data, msg, type);     
+                
+        if (result != NET_ERR_RC)
+            break;
+    }
+    
+    return result;
+    
 }
 
 /** Builds an authentication request for port id client_port with the value_pairs send and submits it to a server
@@ -356,37 +176,3 @@ int rc_acct_proxy(rc_handle *rh, VALUE_PAIR *send)
 	return rc_aaa(rh, 0, send, NULL, NULL, 0, PW_ACCOUNTING_REQUEST);
 }
 
-/** Asks the server hostname on the specified port for a status message
- *
- * @param rh a handle to parsed configuration.
- * @param host the name of the server.
- * @param secret the secret used by the server.
- * @param port the server's port number.
- * @param msg must be an array of %PW_MAX_MSG_SIZE or %NULL; will contain the concatenation of any
- *	%PW_REPLY_MESSAGE received.
- * @return %OK_RC (0) on success, negative on failure as return value.
- */
-int rc_check(rc_handle *rh, char *host, char *secret, unsigned short port, char *msg)
-{
-	SEND_DATA       data;
-	int		result;
-	uint32_t		service_type;
-	int		timeout = rc_conf_int(rh, "radius_timeout");
-	int		retries = rc_conf_int(rh, "radius_retries");
-
-	data.send_pairs = data.receive_pairs = NULL;
-
-	/*
-	 * Fill in Service-Type
-	 */
-
-	service_type = PW_ADMINISTRATIVE;
-	rc_avpair_add(rh, &(data.send_pairs), PW_SERVICE_TYPE, &service_type, 0, 0);
-
-	rc_buildreq(rh, &data, PW_STATUS_SERVER, host, port, secret, timeout, retries);
-	//result = rc_send_server (rh, &data, msg, ACCT);
-
-	rc_avpair_free(data.receive_pairs);
-
-	return result;
-}

+ 0 - 2
thirdparty/FreeRadius/lib/config.c

@@ -397,8 +397,6 @@ rc_handle *rc_config_init(rc_handle *rh)
  */
 void rc_read_config(rc_handle* rh)
 {
-    // TODO запускаем random generator
-        
     rh->config_options = &rcOptions;
     
     //memcpy(rh->config_options, &config_options_default, sizeof(config_options_default));

+ 51 - 369
thirdparty/FreeRadius/lib/sendserver.c

@@ -20,8 +20,10 @@
 #include <includes.h>
 #include <freeradius-client.h>
 #include <pathnames.h>
+#include "freeradius-client.h"
 #include "util.h"
 #include "radius_user.h"
+#include "parameters.h"
 
 #include "lwip/sockets.h"
 
@@ -194,22 +196,12 @@ static void strappend(char *dest, unsigned max_size, int *pos, const char *src)
  *	on failure as return value.
  */
 
-#define RS_PORT_NUM 1812
-//#define RS_IP_ADDR "192.168.1.2"
-#define RS_IP_ADDR "192.168.14.234"
 
-#define DEVICE_PORT_NUM 1812
-//#define DEVICE_IP_ADDR "192.168.1.6"
-#define DEVICE_IP_ADDR "192.168.14.37"
-
-#define BUF_LEN    300
-
-static uint8_t send_buffer[BUF_LEN];
-static uint8_t recv_buffer[BUF_LEN];
+#define RECV_BUF_LEN    100
+static char recv_buffer[RECV_BUF_LEN];
 
 int rc_send_server (rc_handle *rh, SEND_DATA *data, char *msg, unsigned flags)
 {
-#if 1
     struct sockaddr_in sa,ra;
     int             socket;
     fdsets          sets;
@@ -225,80 +217,94 @@ int rc_send_server (rc_handle *rh, SEND_DATA *data, char *msg, unsigned flags)
     int             result = 0;
     VALUE_PAIR*     vp;
     
-  
+    char            rcNetParams[20];
+    uint32_t        port;
+    uint8_t         tmpLen;
+    
     initFdsets(&sets);
     
 	if(data->secret != NULL) {
 		strlcpy(secret, data->secret, MAX_SECRET_LENGTH);
     }
 
+    // Устанавливаем сетевые параметры
+    memset(rcNetParams, 0, 20);
+    GetRDSIpStr(rcNetParams, &tmpLen);
+        
+    // IP radius server
     memset(&ra, 0, sizeof(struct sockaddr_in));
     ra.sin_family = AF_INET;
-    ra.sin_addr.s_addr = inet_addr(RS_IP_ADDR);
-    ra.sin_port = htons(RS_PORT_NUM);
+    ra.sin_addr.s_addr = inet_addr(rcNetParams);
     
+    // port
+    memset(rcNetParams, 0, 20);
+    GetRDSPortStr(rcNetParams, &tmpLen);
+    port = atoi(rcNetParams);
+    ra.sin_port = htons(port);
+        
     socket = socket(PF_INET, SOCK_DGRAM, 0);
     if ( socket < 0 )
     {
-        printf("socket call failed");
+        //printf("socket call failed");
         return -1;
     }
-    
-    // TODO bind?
-    
+        
     // Build a request  (PW_ACCESS_REQUEST)
-	auth = (AUTH_HDR *) send_buffer;
+    auth = (AUTH_HDR *) msg;
 	auth->code = data->code;
 	auth->id = data->seq_nbr;
 
     rc_random_vector(vector);
-	memcpy ((char *) auth->vector, (char *) vector, AUTH_VECTOR_LEN);
+	memcpy((char *) auth->vector, (char *) vector, AUTH_VECTOR_LEN);
 
 	total_length = rc_pack_list(data->send_pairs, secret, auth) + AUTH_HDR_LEN;
-
 	auth->length = htons ((unsigned short) total_length);
-	    
-    
+	        
     // Bind socket
+    memset(rcNetParams, 0, 20);
+    GetIpStr(rcNetParams, &tmpLen);
+    
     memset(&sa, 0, sizeof(struct sockaddr_in));
     sa.sin_family = AF_INET;
-    sa.sin_addr.s_addr = inet_addr(DEVICE_IP_ADDR);
-    sa.sin_port = htons(DEVICE_PORT_NUM);
+    sa.sin_addr.s_addr = inet_addr(rcNetParams);
+    sa.sin_port = htons(port);
     
     if (bind(socket, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)) == -1)
     {
-        printf("Bind to Port Number %d ,IP address %s failed\n", DEVICE_PORT_NUM, DEVICE_IP_ADDR);
+        //printf("Bind to Port Number %d ,IP address %s failed\n", DEVICE_PORT_NUM, DEVICE_IP_ADDR);
         close(socket);
-        return 0;
+        return -1;
     }
        
     sendLen = sendto(socket, (char*)auth, total_length, 0, (struct sockaddr*)&ra, sizeof(ra));
     if(sendLen < 0)
     {
-        printf("send failed\n");
+        //printf("send failed\n");
         close(socket);
-        return 0;
+        return NET_ERR_RC;
     }
    
+    // Подготовка буфера для приема
+    memset(recv_buffer, 0, RECV_BUF_LEN);
+    
     // Получение ответа, select
     if (!recvSelect(&sets, &socket, 2000)) {
-        //timeCount = HAL_GetTick() - timeCount;
-        printf("SOCK recv timeout!\r\n");
+        //printf("SOCK recv timeout!\r\n");
         close(socket);
-        return 0;
+        return NET_ERR_RC;
     }
     
     // Данные можно принимать
     socklen_t sl = sizeof(sa);
-    recvLen = recvfrom(socket, recv_buffer, BUF_LEN, 0, (struct sockaddr*)&ra, &sl);
+    recvLen = recvfrom(socket, recv_buffer, RECV_BUF_LEN, 0, (struct sockaddr*)&ra, &sl);
 
     recv_auth = (AUTH_HDR*)recv_buffer;
     
     // Проверки размера входящего сообщения
     if (recvLen < AUTH_HDR_LEN || recvLen < ntohs(recv_auth->length)) {
-		printf("radius_server: reply is too short\r\n");
+		//printf("radius_server: reply is too short\r\n");
 		close(socket);
-        return 0;
+        return NET_ERR_RC;
 	}
     
     if (recvLen > ntohs(recv_auth->length)) 
@@ -310,28 +316,28 @@ int rc_send_server (rc_handle *rh, SEND_DATA *data, char *msg, unsigned flags)
 	attr = recv_buffer + AUTH_HDR_LEN;
 	while (attr < (recv_buffer + recvLen)) {
 		if (attr[0] == 0) {
-            printf("radius_server: attribute zero is invalid\r\n");
+            //printf("radius_server: attribute zero is invalid\r\n");
             close(socket);
-            return 0;
+            return NET_ERR_RC;
 		}
 
 		if (attr[1] < 2) {
-            printf("radius_server: attribute length is too small\r\n");
+            //printf("radius_server: attribute length is too small\r\n");
             close(socket);
-            return 0;
+            return NET_ERR_RC;
 		}
 
 		if ((attr + attr[1]) > (recv_buffer + recvLen)) {
-            printf("radius_server: attribute overflows the packet\r\n");
+            //printf("radius_server: attribute overflows the packet\r\n");
             close(socket);
-            return 0;
+            return NET_ERR_RC;
 		}
 
 		attr += attr[1];
 	}
     
     
-    result = rc_check_reply (recv_auth, BUF_LEN, secret, vector, data->seq_nbr);
+    result = rc_check_reply(recv_auth, RECV_BUF_LEN, secret, vector, data->seq_nbr);
     
     length = ntohs(recv_auth->length)  - AUTH_HDR_LEN;
 	if (length > 0) {
@@ -363,7 +369,7 @@ int rc_send_server (rc_handle *rh, SEND_DATA *data, char *msg, unsigned flags)
 		(recv_auth->code == PW_PASSWORD_ACK) ||
 		(recv_auth->code == PW_ACCOUNTING_RESPONSE))
 	{
-		result = OK_RC;
+        result = RC_GetAccessRights(recv_buffer);
 	}
 	else if ((recv_auth->code == PW_ACCESS_REJECT) ||
 		(recv_auth->code == PW_PASSWORD_REJECT))
@@ -376,333 +382,9 @@ int rc_send_server (rc_handle *rh, SEND_DATA *data, char *msg, unsigned flags)
 		result = BADRESP_RC;
 	}
     
-    
-    
-    
-    printf("Radius server end communication\r\n");
+    //printf("\r\nRadius server end communication\r\n");
     close(socket);
     return result;
-    
-	//getnameinfo(SA(&our_sockaddr), SS_LEN(&our_sockaddr), NULL, 0, our_addr_txt, sizeof(our_addr_txt), NI_NUMERICHOST);
-	//getnameinfo(auth_addr->ai_addr, auth_addr->ai_addrlen, NULL, 0, auth_addr_txt, sizeof(auth_addr_txt), NI_NUMERICHOST);
-
-    
-#endif    
-  
-#if 0
-	int             sockfd;
-	AUTH_HDR       *auth, *recv_auth;
-	char           *server_name;	/* Name of server to query */
-	struct sockaddr_storage our_sockaddr;
-	struct addrinfo *auth_addr = NULL;
-	socklen_t       salen;
-	int             result = 0;
-	int             total_length;
-	int             length, pos;
-	int             retry_max;
-	unsigned	    discover_local_ip;
-    size_t		    secretlen;
-	char            secret[MAX_SECRET_LENGTH + 1];
-	unsigned char   vector[AUTH_VECTOR_LEN];
-	uint8_t         recv_buffer[BUFFER_LEN];
-	uint8_t         send_buffer[BUFFER_LEN];
-	char		    our_addr_txt[50]; /* hold a text IP */
-	char		    auth_addr_txt[50]; /* hold a text IP */
-	uint8_t		    *attr;
-	int		        retries;
-	VALUE_PAIR 	    *vp;
-	//struct pollfd	pfd;
-	double		    start_time, timeout;
-
-    
-	server_name = data->server;
-	if (server_name == NULL || server_name[0] == '\0')
-		return ERROR_RC;
-
-	if(data->secret != NULL)
-	{
-		//strlcpy(secret, data->secret, MAX_SECRET_LENGTH);
-        memcpy(secret, data->secret, MAX_SECRET_LENGTH);
-	}
-  
-	if (rc_find_server_addr (rh, server_name, &auth_addr, secret, flags) != 0)
-	{
-		rc_log(LOG_ERR, "rc_send_server: unable to find server: %s", server_name);
-		return ERROR_RC;
-	}
-
-	rc_own_bind_addr(rh, &our_sockaddr);
-	discover_local_ip = 0;
-	if (our_sockaddr.ss_family == AF_INET) {
-		if (((struct sockaddr_in*)(&our_sockaddr))->sin_addr.s_addr == INADDR_ANY) {
-			discover_local_ip = 1;
-		}
-	}
-
-	DEBUG(LOG_ERR, "DEBUG: rc_send_server: creating socket to: %s", server_name);
-	if (discover_local_ip) {
-		result = rc_get_srcaddr(SA(&our_sockaddr), auth_addr->ai_addr);
-		if (result != 0) {
-			memset (secret, '\0', sizeof (secret));
-			rc_log(LOG_ERR, "rc_send_server: cannot figure our own address");
-			result = ERROR_RC;
-			goto cleanup;
-		}
-	}
-
-	sockfd = socket (our_sockaddr.ss_family, SOCK_DGRAM, 0);
-	if (sockfd < 0)
-	{
-		memset (secret, '\0', sizeof (secret));
-		rc_log(LOG_ERR, "rc_send_server: socket: %s", strerror(errno));
-		result = ERROR_RC;
-		goto cleanup;
-	}
-
-	if (our_sockaddr.ss_family == AF_INET)
-		((struct sockaddr_in*)&our_sockaddr)->sin_port = 0;
-	else
-		((struct sockaddr_in6*)&our_sockaddr)->sin6_port = 0;
-
-	if (bind(sockfd, SA(&our_sockaddr), SS_LEN(&our_sockaddr)) < 0)
-	{
-		close (sockfd);
-		memset (secret, '\0', sizeof (secret));
-		rc_log(LOG_ERR, "rc_send_server: bind: %s: %s", server_name, strerror(errno));
-		result = ERROR_RC;
-		goto cleanup;
-	}
-
-	retry_max = data->retries;	/* Max. numbers to try for reply */
-	retries = 0;			/* Init retry cnt for blocking call */
-
-	if (data->svc_port) {
-		if (our_sockaddr.ss_family == AF_INET)
-			((struct sockaddr_in*)auth_addr->ai_addr)->sin_port = htons ((unsigned short) data->svc_port);
-		else
-			((struct sockaddr_in6*)auth_addr->ai_addr)->sin6_port = htons ((unsigned short) data->svc_port);
-	}
-
-	/*
-	 * Fill in NAS-IP-Address (if needed)
-	 */
-	if (rc_avpair_get(data->send_pairs, PW_NAS_IP_ADDRESS, 0) == NULL &&
-	    rc_avpair_get(data->send_pairs, PW_NAS_IPV6_ADDRESS, 0) == NULL) {
-		if (our_sockaddr.ss_family == AF_INET) {
-			uint32_t ip;
-			ip = *((uint32_t*)(&((struct sockaddr_in*)&our_sockaddr)->sin_addr));
-			ip = ntohl(ip);
-
-			rc_avpair_add(rh, &(data->send_pairs), PW_NAS_IP_ADDRESS,
-			    &ip, 0, 0);
-		} else {
-			void *p;
-			p = &((struct sockaddr_in6*)&our_sockaddr)->sin6_addr;
-
-			rc_avpair_add(rh, &(data->send_pairs), PW_NAS_IPV6_ADDRESS,
-			    p, 0, 0);
-		}
-	}
-
-	/* Build a request */
-	auth = (AUTH_HDR *) send_buffer;
-	auth->code = data->code;
-	auth->id = data->seq_nbr;
-
-	if (data->code == PW_ACCOUNTING_REQUEST)
-	{
-		total_length = rc_pack_list(data->send_pairs, secret, auth) + AUTH_HDR_LEN;
-
-		auth->length = htons ((unsigned short) total_length);
-
-		memset((char *) auth->vector, 0, AUTH_VECTOR_LEN);
-		secretlen = strlen (secret);
-		memcpy ((char *) auth + total_length, secret, secretlen);
-		rc_md5_calc (vector, (unsigned char *) auth, total_length + secretlen);
-		memcpy ((char *) auth->vector, (char *) vector, AUTH_VECTOR_LEN);
-	}
-	else
-	{
-		rc_random_vector (vector);
-		memcpy ((char *) auth->vector, (char *) vector, AUTH_VECTOR_LEN);
-
-		total_length = rc_pack_list(data->send_pairs, secret, auth) + AUTH_HDR_LEN;
-
-		auth->length = htons ((unsigned short) total_length);
-	}
-
-	getnameinfo(SA(&our_sockaddr), SS_LEN(&our_sockaddr), NULL, 0, our_addr_txt, sizeof(our_addr_txt), NI_NUMERICHOST);
-	getnameinfo(auth_addr->ai_addr, auth_addr->ai_addrlen, NULL, 0, auth_addr_txt, sizeof(auth_addr_txt), NI_NUMERICHOST);
-
-	DEBUG(LOG_ERR, "DEBUG: local %s : 0, remote %s : %u\n", 
-	      our_addr_txt, auth_addr_txt, data->svc_port);
-
-	for (;;)
-	{
-		do {
-			result = sendto (sockfd, (char *) auth, (unsigned int)total_length, 
-				(int) 0, SA(auth_addr->ai_addr), auth_addr->ai_addrlen);
-		} while (result == -1 && errno == EINTR);
-		if (result == -1) {
-			rc_log(LOG_ERR, "%s: socket: %s", __FUNCTION__, strerror(errno));
-		}
-
-		pfd.fd = sockfd;
-		pfd.events = POLLIN;
-		pfd.revents = 0;
-		start_time = rc_getctime();
-		for (timeout = data->timeout; timeout > 0;
-		    timeout -= rc_getctime() - start_time) {
-			result = poll(&pfd, 1, timeout * 1000);
-			if (result != -1 || errno != EINTR)
-				break;
-		}
-		if (result == -1)
-		{
-			rc_log(LOG_ERR, "rc_send_server: poll: %s", strerror(errno));
-			memset (secret, '\0', sizeof (secret));
-			close (sockfd);
-			result = ERROR_RC;
-			goto cleanup;
-		}
-		if (result == 1 && (pfd.revents & POLLIN) != 0)
-			break;
-
-		/*
-		 * Timed out waiting for response.  Retry "retry_max" times
-		 * before giving up.  If retry_max = 0, don't retry at all.
-		 */
-		if (retries++ >= retry_max)
-		{
-			rc_log(LOG_ERR,
-				"rc_send_server: no reply from RADIUS server %s:%u",
-				 auth_addr_txt, data->svc_port);
-			close (sockfd);
-			memset (secret, '\0', sizeof (secret));
-			result = TIMEOUT_RC;
-			goto cleanup;
-		}
-	}
-	salen = auth_addr->ai_addrlen;
-	do {
-		length = recvfrom (sockfd, (char *) recv_buffer,
-				   (int) sizeof (recv_buffer),
-				   (int) 0, SA(auth_addr->ai_addr), &salen);
-	} while(length == -1 && errno == EINTR);
-
-	if (length <= 0)
-	{
-		rc_log(LOG_ERR, "rc_send_server: recvfrom: %s:%d: %s", server_name,\
-			 data->svc_port, strerror(errno));
-		close (sockfd);
-		memset (secret, '\0', sizeof (secret));
-		result = ERROR_RC;
-		goto cleanup;
-	}
-
-	recv_auth = (AUTH_HDR *)recv_buffer;
-
-	if (length < AUTH_HDR_LEN || length < ntohs(recv_auth->length)) {
-		rc_log(LOG_ERR, "rc_send_server: recvfrom: %s:%d: reply is too short",
-		    server_name, data->svc_port);
-		close(sockfd);
-		memset(secret, '\0', sizeof(secret));
-		result = ERROR_RC;
-		goto cleanup;
-	}
-
-	/*
-	 *	If UDP is larger than RADIUS, shorten it to RADIUS.
-	 */
-	if (length > ntohs(recv_auth->length)) length = ntohs(recv_auth->length);
-
-	/*
-	 *	Verify that it's a valid RADIUS packet before doing ANYTHING with it.
-	 */
-	attr = recv_buffer + AUTH_HDR_LEN;
-	while (attr < (recv_buffer + length)) {
-		if (attr[0] == 0) {
-			rc_log(LOG_ERR, "rc_send_server: recvfrom: %s:%d: attribute zero is invalid",
-			       server_name, data->svc_port);
-			close(sockfd);
-			memset(secret, '\0', sizeof(secret));
-			return ERROR_RC;
-		}
-
-		if (attr[1] < 2) {
-			rc_log(LOG_ERR, "rc_send_server: recvfrom: %s:%d: attribute length is too small",
-			       server_name, data->svc_port);
-			close(sockfd);
-			memset(secret, '\0', sizeof(secret));
-			return ERROR_RC;
-		}
-
-		if ((attr + attr[1]) > (recv_buffer + length)) {
-			rc_log(LOG_ERR, "rc_send_server: recvfrom: %s:%d: attribute overflows the packet",
-			       server_name, data->svc_port);
-			close(sockfd);
-			memset(secret, '\0', sizeof(secret));
-			return ERROR_RC;
-		}
-
-		attr += attr[1];
-	}
-
-	result = rc_check_reply (recv_auth, BUFFER_LEN, secret, vector, data->seq_nbr);
-
-	length = ntohs(recv_auth->length)  - AUTH_HDR_LEN;
-	if (length > 0) {
-		data->receive_pairs = rc_avpair_gen(rh, NULL, recv_auth->data,
-		    length, 0);
-	} else {
-		data->receive_pairs = NULL;
-	}
-
-	close (sockfd);
-	memset (secret, '\0', sizeof (secret));
-
-	if (result != OK_RC) {
-		goto cleanup;
-	}
-
-	if (msg) {
-		*msg = '\0';
-		pos = 0;
-		vp = data->receive_pairs;
-		while (vp)
-		{
-			if ((vp = rc_avpair_get(vp, PW_REPLY_MESSAGE, 0)))
-			{
-				strappend(msg, PW_MAX_MSG_SIZE, &pos, vp->strvalue);
-				strappend(msg, PW_MAX_MSG_SIZE, &pos, "\n");
-				vp = vp->next;
-			}
-		}
-	}
-
-	if ((recv_auth->code == PW_ACCESS_ACCEPT) ||
-		(recv_auth->code == PW_PASSWORD_ACK) ||
-		(recv_auth->code == PW_ACCOUNTING_RESPONSE))
-	{
-		result = OK_RC;
-	}
-	else if ((recv_auth->code == PW_ACCESS_REJECT) ||
-		(recv_auth->code == PW_PASSWORD_REJECT))
-	{
-		result = REJECT_RC;
-	}
-	else
-	{
-		rc_log(LOG_ERR, "rc_send_server: received RADIUS server response neither ACCEPT nor REJECT, invalid");
-		result = BADRESP_RC;
-	}
-
- cleanup:
- 	if (auth_addr)
- 		freeaddrinfo(auth_addr);
-
-	return result;
-#endif    
 }
 
 /** Verify items in returned packet

+ 1 - 1
user/init_task.c

@@ -190,7 +190,7 @@ void InitTask(void *params)
  
   SETTINGS_ResetBootTry();
 
-  RD_TestInit();
+  RC_Login("test1","12345");
   
   // Отправка трапа о перезагрузке в случае статического IP
  /* if (!dhcp)