123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- /********************************* (C) РОТЕК ***********************************
- * @module template
- * @file template.c
- * @version 1.0.0
- * @date XX.XX.XXXX
- * $brief template
- *******************************************************************************
- * @history Version Author Comment
- * XX.XX.XXXX 1.0.0 Telenkov D.A. First release.
- *******************************************************************************
- */
- #include "stm32f4xx.h"
- #include "radius_user.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "freeradius-client.h"
- #include "fr_options.h"
- rc_handle rcHandle;
- int auth_order = AUTH_LOCAL_SND;
- int login_tries = 4;
- int login_timeout = 60;
- char* nologin = "?";
- char* issue = "?";
- char* authserver = "192.168.1.2:1645";
- char* acctserver = "0";
- char* servers = "?";
- char* dictionary = "?";
- char *login_radius = "?";
- char *mapfile = "?";
- char *default_realm = NULL;
- int radius_timeout = 10;
- int radius_retries = 3;
- int radius_deadtime = 0;
- char *bindaddr = "*";
- char *login_local = "?";
- OPTION rcOptions[] = {
- {"auth_order", OT_AUO, ST_UNDEF, (void*)&auth_order}, // AUTH_LOCAL_FST AUTH_RADIUS_FST AUTH_LOCAL_SND AUTH_RADIUS_SND
- {"login_tries", OT_INT, ST_UNDEF, (void*)&login_tries},
- {"login_timeout", OT_INT, ST_UNDEF, (void*)&login_timeout},
- {"nologin", OT_STR, ST_UNDEF, NULL},
- {"issue", OT_STR, ST_UNDEF, NULL},
- // RADIUS specific options
- {"authserver", OT_SRV, ST_UNDEF, (void*)&authserver},
- {"acctserver", OT_SRV, ST_UNDEF, (void*)&acctserver},
- {"servers", OT_STR, ST_UNDEF, (void*)&servers},
- {"dictionary", OT_STR, ST_UNDEF, (void*)&dictionary},
- {"login_radius", OT_STR, ST_UNDEF, (void*)&login_radius},
- {"mapfile", OT_STR, ST_UNDEF, (void*)&mapfile},
- {"default_realm", OT_STR, ST_UNDEF, (void*)&default_realm},
- {"radius_timeout", OT_INT, ST_UNDEF, (void*)&radius_timeout},
- {"radius_retries", OT_INT, ST_UNDEF, (void*)&radius_retries},
- {"radius_deadtime", OT_INT, ST_UNDEF, (void*)&radius_deadtime},
- {"bindaddr", OT_STR, ST_UNDEF, (void*)&bindaddr},
- // local options
- {"login_local", OT_STR, ST_UNDEF, (void*)&login_local},
- };
- static DICT_ATTR attr_1;
- static DICT_ATTR attr_2;
- static DICT_ATTR attr_3;
- static char rc_msg[PW_MAX_MSG_SIZE];
- RadiusClientResult RC_Login(char* login, char* pas)
- {
- VALUE_PAIR* send;
- VALUE_PAIR* received;
- uint32_t service;
-
- int result;
-
- memset(rc_msg, 0, PW_MAX_MSG_SIZE);
- memset(&rcHandle, 0, sizeof(rc_handle));
-
- rc_read_config(&rcHandle);
-
- // Формирование атрибутов
- // 1. User name
- strncpy(attr_1.name, login, strlen(login));
- attr_1.value = 1;
- attr_1.type = PW_TYPE_STRING;
- attr_1.next = NULL;
-
- // 2. Password
- strncpy(attr_2.name, pas, strlen(pas));
- attr_2.value = 2;
- attr_2.type = PW_TYPE_STRING;
- attr_2.next = &attr_1;
-
- // 3. Service type
- strcpy(attr_3.name, "Service-Type");
- attr_3.value = 6;
- attr_3.type = PW_TYPE_INTEGER;
- attr_3.next = &attr_2;
-
- rcHandle.dictionary_attributes = &attr_3;
-
- send = NULL;
-
- // User-Name
- if (rc_avpair_add(&rcHandle, &send, PW_USER_NAME, login, -1, 0) == NULL)
- return RC_ERROR;
-
- // User-Password
- if (rc_avpair_add(&rcHandle, &send, PW_USER_PASSWORD, pas, -1, 0) == NULL)
- return RC_ERROR;
-
- // 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;
- }
- return RC_ERROR;
- //printf("\r\n");
- //printf("Radius client result: %i\r\n", result);
-
- }
- /**
- * @brief
- */
- int RD_TestInit(void)
- {
- int result;
- char username[128];
- char passwd[AUTH_PASS_LEN + 1];
- VALUE_PAIR *send, *received;
- uint32_t service;
- char msg[PW_MAX_MSG_SIZE], username_realm[256];
- char *default_realm;
-
- // Моя подготовка
- memset(username, 0, 128);
- memset(passwd, 0, AUTH_PASS_LEN + 1);
- memset(msg, 0, PW_MAX_MSG_SIZE);
- memset(username_realm, 0, 256);
-
-
- // Просто копируем структуру настроек которая жесто задана
- rc_read_config(&rcHandle);
-
- // Словарь пока опускаем и не инициализируем
- //if (rc_read_dictionary(&rcHandle, rc_conf_str(&rcHandle, "dictionary")) != 0)
- // return ERROR_RC;
-
- // Заполняем словарь
- // 1. User name
- strcpy(attr_1.name, "test1");
- attr_1.value = 1;
- attr_1.type = PW_TYPE_STRING;
- attr_1.next = NULL;
-
- // 2. Password
- strcpy(attr_2.name, "12345");
- attr_2.value = 2;
- attr_2.type = PW_TYPE_STRING;
- attr_2.next = &attr_1;
-
- // 3. Service type
- strcpy(attr_3.name, "Service-Type");
- attr_3.value = 6;
- attr_3.type = PW_TYPE_INTEGER;
- attr_3.next = &attr_2;
-
- /*
- attr_3.value = 244;
- attr_3.type = PW_TYPE_STRING;
- attr_3.next = &attr_2;
- */
- rcHandle.dictionary_attributes = &attr_3;
-
- // Не понял что за параметра, пока NULL
- //default_realm = rc_conf_str(rh, "default_realm");
- default_realm = NULL;
- // Рараметры ожидаются от пользователя
- //strncpy(username, "dtelenkov", 9);
- strncpy(username, "test1", 5);
- strncpy(passwd, "12345", 5);
- //strncpy(username, rc_getstr (rh, "login: ",1), sizeof(username));
- //strncpy (passwd, rc_getstr(rh, "Password: ",0), sizeof (passwd));
-
- send = NULL;
-
- /*
- * Fill in User-Name
- */
- strncpy(username_realm, username, sizeof(username_realm));
- /* Append default realm */
- /*
- if ((strchr(username_realm, '@') == NULL) && default_realm &&
- (*default_realm != '\0'))
- {
- strncat(username_realm, "@", sizeof(username_realm)-strlen(username_realm)-1);
- strncat(username_realm, default_realm, sizeof(username_realm)-strlen(username_realm)-1);
- }
- */
-
- if (rc_avpair_add(&rcHandle, &send, PW_USER_NAME, username_realm, -1, 0) == NULL)
- return ERROR_RC;
-
- /*
- * Fill in User-Password
- */
- if (rc_avpair_add(&rcHandle, &send, PW_USER_PASSWORD, passwd, -1, 0) == NULL)
- return ERROR_RC;
- /*
- * Fill in Service-Type
- */
- service = PW_AUTHENTICATE_ONLY;
- if (rc_avpair_add(&rcHandle, &send, PW_SERVICE_TYPE, &service, -1, 0) == NULL)
- return ERROR_RC;
- #if 0
- result = rc_auth(&rcHandle, 0, send, &received, msg);
- if (result == OK_RC)
- {
- fprintf(stderr, "\"%s\" RADIUS Authentication OK\n", username);
- }
- else
- {
- fprintf(stderr, "\"%s\" RADIUS Authentication failure (RC=%i)\n", username, result);
- }
-
- #endif
- send = NULL;
-
- return 0;
- }
- void initFdsets(fdsets *sets)
- {
- memset((sets)->buf1, 0xab, 8);
- memset((sets)->buf2, 0xab, 8);
- memset((sets)->buf3, 0xab, 8);
- memset((sets)->buf4, 0xab, 8);
- }
- bool recvSelect(fdsets *sets, int *socket, uint32_t timeout)
- {
- struct timeval tv;
- tv.tv_sec = 0;
- tv.tv_usec = timeout * 1000;
-
- FD_ZERO(&(sets->readset));
- FD_SET(*socket, &sets->readset);
- FD_ZERO(&sets->errset);
- FD_SET(*socket, &sets->errset);
-
- lwip_select(*socket + 1, &sets->readset, NULL, &sets->errset, &tv);
-
- if (FD_ISSET(*socket, &sets->readset))
- return true;
- 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) РОТЕК **********************************/
|