Skip to content

Commit 4bf8061

Browse files
authored
Merge pull request #21 from gjroots/dev
v1.2.0
2 parents 2229cac + b299b84 commit 4bf8061

28 files changed

+494
-27
lines changed

components/utils/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
idf_component_register(SRCS utils.c initialization.c nvm.c mac_generator.c
1+
idf_component_register(SRCS utils.c initialization.c nvm.c mac_generator.c mac_filter.c
22

33
INCLUDE_DIRS include
44
REQUIRES cmd_router cmd_nvs nvs_flash json esp_http_server)

components/utils/include/initialization.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ extern "C"
2424
#define DEFAULT_SSID "ESP32_NAT_Router +"
2525

2626
bool IsLedEnable, IsWebServerEnable, IsCustomDnsEnable,
27-
IsRandomizeMacEnable, IsDarkModeEnable, IsWifiAuthFail;
27+
IsRandomizeMacEnable, IsDarkModeEnable, IsWifiAuthFail, IsMacFilterEnable, IsAllowList;
2828

2929
char *customDNSip, *authUsername,
3030
*authPass, *macAp, *dnsIP, *cache;

components/utils/include/mac_filter.h

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* @author Jaya Satish
3+
*
4+
*@copyright Copyright (c) 2023
5+
*Licensed under MIT
6+
*
7+
*/
8+
9+
#pragma once
10+
11+
#ifdef __cplusplus
12+
extern "C"
13+
{
14+
#endif
15+
#include <stdbool.h>
16+
#include <esp_err.h>
17+
#include <cJSON.h>
18+
19+
#define MAX_MAC_ADDRESSES 10
20+
#define NVS_KEY "stored_macs"
21+
22+
23+
esp_err_t store_mac_address_in_nvs(const char *macAddress);
24+
esp_err_t remove_mac_address_from_nvs(const char *macAddress);
25+
bool check_mac_address_in_nvs(const char *macAddress);
26+
cJSON *retrieve_mac_addresses_as_json();
27+
void mac_filter(const uint8_t mac[6],uint8_t aid);
28+
void refresh_mac_filter();
29+
30+
#ifdef __cplusplus
31+
}
32+
#endif

components/utils/initialization.c

+7-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ static const char *TAG = "utils/initialization";
1616

1717
bool IsLedEnable = true, IsWebServerEnable = true,
1818
IsCustomDnsEnable = false, IsRandomizeMacEnable = false,
19-
IsDarkModeEnable = false, IsWifiAuthFail = false;
19+
IsDarkModeEnable = false, IsWifiAuthFail = false,
20+
IsMacFilterEnable = false, IsAllowList = false;
2021

2122
char *ssid, *ent_username, *ent_identity,
2223
*passwd, *static_ip, *subnet_mask, *gateway_addr,
@@ -29,7 +30,7 @@ char currentMAC[18];
2930
esp_err_t IRAM_ATTR parms_init()
3031
{
3132
int webServer = 1, ledEnable = 1, customDnsEnable = 0,
32-
darkModeEnable = 0, randomizeMac = 0;
33+
darkModeEnable = 0, randomizeMac = 0, isMacFilterEnable = 0, isAllowList = 0;
3334

3435
// ESP_LOGW(TAG, "initialization Started");
3536
get_config_param_str("ssid", &ssid);
@@ -54,6 +55,8 @@ esp_err_t IRAM_ATTR parms_init()
5455
get_config_param_int("randomize_mac", &randomizeMac);
5556
get_config_param_int("max_login_attempts", &max_login_attempts);
5657
get_config_param_int("lock_out_time_minutes", &lock_out_time_minutes);
58+
get_config_param_int("mac_Filter", &isMacFilterEnable);
59+
get_config_param_int("Is_allow_list", &isAllowList);
5760

5861
ap_ssid = (ap_ssid != NULL) ? ap_ssid : DEFAULT_SSID;
5962
ap_passwd = (ap_passwd != NULL) ? ap_passwd : "";
@@ -79,6 +82,8 @@ esp_err_t IRAM_ATTR parms_init()
7982
IsCustomDnsEnable = (customDnsEnable != 0);
8083
IsDarkModeEnable = (darkModeEnable != 0);
8184
IsRandomizeMacEnable = (randomizeMac != 0);
85+
IsMacFilterEnable = (isMacFilterEnable != 0);
86+
IsAllowList = (isAllowList != 0);
8287
auth_info.username = authUsername;
8388
auth_info.password = authPass;
8489

components/utils/mac_filter.c

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/**
2+
* @author Jaya Satish
3+
* @license
4+
* this software licensed under MIT
5+
*
6+
*
7+
*/
8+
9+
#include <stdio.h>
10+
#include <nvs_flash.h>
11+
#include <cJSON.h>
12+
#include <string.h>
13+
#include <esp_log.h>
14+
#include <esp_wifi.h>
15+
#include <esp_netif.h>
16+
#include <esp_wifi_types.h>
17+
18+
#include "mac_filter.h"
19+
#include "initialization.h"
20+
21+
22+
bool check_mac_address_in_nvs(const char *macAddress) {
23+
cJSON *json = retrieve_mac_addresses_as_json();
24+
if (json == NULL) return false;
25+
26+
int numMacs = cJSON_GetArraySize(json);
27+
for (int i = 0; i < numMacs; i++) {
28+
if (strcmp(cJSON_GetArrayItem(json, i)->valuestring, macAddress) == 0) {
29+
cJSON_Delete(json);
30+
return true;
31+
}
32+
}
33+
34+
cJSON_Delete(json);
35+
return false;
36+
}
37+
38+
//-----------------------------------------------------------------------------
39+
void mac_filter(const uint8_t mac[6], uint8_t aid) {
40+
char mac_address[18];
41+
sprintf(mac_address, MACSTR, MAC2STR(mac));
42+
if (IsMacFilterEnable) {
43+
if ((IsAllowList && !check_mac_address_in_nvs(mac_address)) ||
44+
(!IsAllowList && check_mac_address_in_nvs(mac_address))) {
45+
ESP_LOGI("MAC Filter","MAC Address %s not allowed, disconnecting...\n", IsAllowList ? "NOT found in Allow List" : "found in Deny List");
46+
esp_wifi_deauth_sta(aid);
47+
}
48+
}
49+
}
50+
51+
//-----------------------------------------------------------------------------
52+
esp_err_t check_in_filter_list(const uint8_t mac[6]) {
53+
uint16_t aid;
54+
esp_err_t err = esp_wifi_ap_get_sta_aid(mac, &aid);
55+
if (err == ESP_OK) {
56+
mac_filter(mac, aid);
57+
} else {
58+
printf("Failed to get AID for MAC address\n");
59+
}
60+
return err;
61+
}
62+
63+
//-----------------------------------------------------------------------------
64+
void refresh_mac_filter() {
65+
wifi_sta_list_t wifi_sta_list;
66+
tcpip_adapter_sta_list_t adapter_sta_list;
67+
memset(&wifi_sta_list, 0, sizeof(wifi_sta_list));
68+
memset(&adapter_sta_list, 0, sizeof(adapter_sta_list));
69+
ESP_ERROR_CHECK(esp_wifi_ap_get_sta_list(&wifi_sta_list));
70+
ESP_ERROR_CHECK(tcpip_adapter_get_sta_list(&wifi_sta_list, &adapter_sta_list));
71+
72+
for (int i = 0; i < adapter_sta_list.num; i++) {
73+
tcpip_adapter_sta_info_t station = adapter_sta_list.sta[i];
74+
esp_err_t result = check_in_filter_list(station.mac);
75+
if (result != ESP_OK) {
76+
//printf("Error processing MAC address at index %d\n", i);
77+
}
78+
79+
}
80+
}
81+
82+
//-----------------------------------------------------------------------------

components/utils/nvm.c

+113
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@
1111
#include <nvs_flash.h>
1212
#include <esp_log.h>
1313
#include "esp_err.h"
14+
#include <cJSON.h>
15+
1416
#include "nvm.h"
1517
#include "router_globals.h"
1618
#include "utils.h"
19+
#include "mac_filter.h"
1720

1821
static const char *TAG = "utils/nvm";
1922

@@ -66,3 +69,113 @@ esp_err_t nvm_erase(void)
6669
nvs_close(nvs_handle);
6770
return ESP_OK;
6871
}
72+
73+
//-----------------------------------------------------------------------------
74+
cJSON *retrieve_mac_addresses_as_json() {
75+
nvs_handle_t handle;
76+
esp_err_t err = nvs_open(PARAM_NAMESPACE, NVS_READONLY, &handle);
77+
if (err != ESP_OK) {
78+
return NULL;
79+
}
80+
81+
size_t required_size;
82+
err = nvs_get_str(handle, NVS_KEY, NULL, &required_size);
83+
if (err != ESP_OK || required_size == 0) {
84+
nvs_close(handle);
85+
return NULL;
86+
}
87+
88+
char *buffer = malloc(required_size);
89+
if (buffer == NULL) {
90+
nvs_close(handle);
91+
return NULL;
92+
}
93+
94+
err = nvs_get_str(handle, NVS_KEY, buffer, &required_size);
95+
if (err != ESP_OK) {
96+
free(buffer);
97+
nvs_close(handle);
98+
return NULL;
99+
}
100+
101+
cJSON *json = cJSON_Parse(buffer);
102+
free(buffer);
103+
nvs_close(handle);
104+
return json;
105+
}
106+
107+
//-----------------------------------------------------------------------------
108+
esp_err_t save_mac_addresses_as_json(cJSON *json) {
109+
nvs_handle_t handle;
110+
esp_err_t err = nvs_open(PARAM_NAMESPACE, NVS_READWRITE, &handle);
111+
if (err != ESP_OK) {
112+
cJSON_Delete(json);
113+
return err;
114+
}
115+
116+
char *serialized = cJSON_Print(json);
117+
if (serialized == NULL) {
118+
cJSON_Delete(json);
119+
nvs_close(handle);
120+
return ESP_ERR_NO_MEM;
121+
}
122+
123+
err = nvs_set_str(handle, NVS_KEY, serialized);
124+
125+
ESP_LOGI("MACS ARE","%s",serialized);
126+
free(serialized);
127+
nvs_close(handle);
128+
return err;
129+
}
130+
131+
//-----------------------------------------------------------------------------
132+
esp_err_t store_mac_address_in_nvs(const char *macAddress) {
133+
cJSON *json = retrieve_mac_addresses_as_json();
134+
if (json == NULL) {
135+
json = cJSON_CreateArray();
136+
}
137+
138+
int numMacs = cJSON_GetArraySize(json);
139+
if (numMacs >= MAX_MAC_ADDRESSES) {
140+
cJSON_Delete(json);
141+
return ESP_ERR_NO_MEM;
142+
}
143+
144+
for (int i = 0; i < numMacs; i++) {
145+
const char *storedMac = cJSON_GetArrayItem(json, i)->valuestring;
146+
if (strcmp(storedMac, macAddress) == 0) {
147+
cJSON_Delete(json);
148+
return ESP_OK;
149+
}
150+
}
151+
152+
cJSON_AddItemToArray(json, cJSON_CreateString(macAddress));
153+
154+
esp_err_t err = save_mac_addresses_as_json(json);
155+
cJSON_Delete(json);
156+
return err;
157+
}
158+
159+
//-----------------------------------------------------------------------------
160+
esp_err_t remove_mac_address_from_nvs(const char *macAddress) {
161+
cJSON *json = retrieve_mac_addresses_as_json();
162+
if (json == NULL) {
163+
return ESP_ERR_NVS_NOT_FOUND;
164+
}
165+
166+
int numMacs = cJSON_GetArraySize(json);
167+
for (int i = 0; i < numMacs; i++) {
168+
const char *storedMac = cJSON_GetArrayItem(json, i)->valuestring;
169+
if (strcmp(storedMac, macAddress) == 0) {
170+
cJSON_DeleteItemFromArray(json, i);
171+
172+
esp_err_t err = save_mac_addresses_as_json(json);
173+
cJSON_Delete(json);
174+
return err;
175+
}
176+
}
177+
cJSON_Delete(json);
178+
return ESP_ERR_NOT_FOUND;
179+
}
180+
181+
//-----------------------------------------------------------------------------

components/web_server/get_data_handler.c

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ esp_err_t get_settings_data_handler(httpd_req_t *req)
5050
cJSON_AddBoolToObject(root, "ledEnable", IsLedEnable);
5151
cJSON_AddBoolToObject(root, "darkMode", IsDarkModeEnable);
5252
cJSON_AddBoolToObject(root, "webServer", IsWebServerEnable);
53+
cJSON_AddBoolToObject(root, "macFilterEnabled", IsMacFilterEnable);
5354
cJSON_AddStringToObject(root, "authUsername", authUsername);
5455
cJSON_AddStringToObject(root, "authPassword", authPass);
5556
cJSON_AddNumberToObject(root, "maxLoginAttempts", max_login_attempts);

components/web_server/storage_handler.c

+31
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "request_handler.h"
1616
#include "initialization.h"
1717
#include "utils.h"
18+
#include "mac_filter.h"
1819

1920
static const char *TAG = "url_handler/get_data_handler";
2021

@@ -185,6 +186,36 @@ esp_err_t save_settings_data_handler(httpd_req_t *req)
185186
IsDarkModeEnable = str_to_bool(html_escape(strdup(param_buf)));
186187
err = nvs_set_i32(handle, "dark_mode", bool_to_int(IsDarkModeEnable));
187188
}
189+
if (httpd_query_key_value(query_buf, "macFilterEnable", param_buf, sizeof(param_buf)) == ESP_OK)
190+
{
191+
IsMacFilterEnable = str_to_bool(html_escape(strdup(param_buf)));
192+
err = nvs_set_i32(handle, "mac_Filter", bool_to_int(IsMacFilterEnable));
193+
printf("Commit failed! (%s)\n", esp_err_to_name(err));
194+
195+
}
196+
///////////////////
197+
if (httpd_query_key_value(query_buf, "add_mac_address", param_buf, sizeof(param_buf)) == ESP_OK)
198+
{
199+
store_mac_address_in_nvs(html_escape(strdup(param_buf)));
200+
refresh_mac_filter();
201+
202+
}
203+
204+
if (httpd_query_key_value(query_buf, "remove_mac_address", param_buf, sizeof(param_buf)) == ESP_OK)
205+
{
206+
remove_mac_address_from_nvs(html_escape(strdup(param_buf)));
207+
refresh_mac_filter();
208+
}
209+
210+
if (httpd_query_key_value(query_buf, "filter_list_type", param_buf, sizeof(param_buf)) == ESP_OK)
211+
{
212+
IsAllowList = word_check(html_escape(strdup(param_buf)),"Allow");
213+
err = nvs_set_i32(handle, "Is_allow_list", bool_to_int(IsAllowList));
214+
refresh_mac_filter();
215+
}
216+
217+
218+
/////////////////
188219

189220
valid_query = (err == ESP_OK);
190221

components/web_server/www/html/_config.yml

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ sass:
2222

2323

2424
jekyll-minifier:
25+
compress_javascript: false
2526
exclude: "*.json"
2627
uglifier_args:
2728
harmony: true

0 commit comments

Comments
 (0)