From 2ad4fca2ed5d9b0cdbb263d8603333b1700ac077 Mon Sep 17 00:00:00 2001 From: Jaya Satish Date: Fri, 26 Jan 2024 18:24:31 +0530 Subject: [PATCH 1/3] Update Build_setup.md --- docs/Build_setup.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/Build_setup.md b/docs/Build_setup.md index 87763a5..b77d971 100644 --- a/docs/Build_setup.md +++ b/docs/Build_setup.md @@ -60,7 +60,7 @@ The `components/web_server/www` folder contains all the static files required ##### In our web interface building , we primarily use two folders: - `components/web_server/html` and `components/web_server/output` . Once we have completed building the site, the files will appear in the `components/web_server/output/html` folder. To optimize the memory usage and increase the speed of site loading, we have converted all of the building site files into *gzip* files in`components/web_server/output/gzip` folder. This helps to reduce the overall size of the files and ensure that the site loads quickly and efficiently. + `components/web_server/www/html` and `components/web_server/www/output` . Once we have completed building the site, the files will appear in the `components/web_server/www/output/html` folder. To optimize the memory usage and increase the speed of site loading, we have converted all of the building site files into *gzip* files in`components/web_server/www/output/gzip` folder. This helps to reduce the overall size of the files and ensure that the site loads quickly and efficiently. ### What is Jekyll? @@ -70,13 +70,13 @@ To start using Jekyll, you need to follow these steps: - Install Ruby, Gem package manager & Jekyll ( check [here](https://www.ruby-lang.org/ ) ) -- Run `bundle install` in the `components/web_server/html` folder to install dependencies +- Run `bundle install` in the `components/web_server/www/html` folder to install dependencies #### How to run a local server Once Jekyll is installed, you can start a local server by following these steps: -- Run `bundle exec jekyll serve --watch` in the `components/web_server/html` folder +- Run `bundle exec jekyll serve --watch` in the `components/web_server/www/html` folder - Navigate to `http://127.0.0.1:4000` to see the website @@ -90,7 +90,7 @@ Once Jekyll is installed, you can start a local server by following these steps: - Building is a mandatory step after making changes. you can run the command `JEKYLL_ENV=production bundle exec jekyll build` for Linux Terminal  OR -   `set JEKYLL_ENV=production bundle exec jekyll build`  for Windows CMD  in the `components/web_server/html` folder to generate and return to production mode minified files. +   `set JEKYLL_ENV=production bundle exec jekyll build`  for Windows CMD  in the `components/web_server/www/html` folder to generate and return to production mode minified files. - Alternatively, navigate to the root folder of the project and use `./build_web_pages.sh` in Linux terminal or `build_web_pages.bat` in Windows CMD. From d82673db4582971cf384a0436f8595ee62ff3589 Mon Sep 17 00:00:00 2001 From: Jaya Satish Date: Fri, 26 Jan 2024 19:06:42 +0530 Subject: [PATCH 2/3] New feature added: MAC Filter - Added a new MAC Filter feature for enhanced network security. --- components/utils/CMakeLists.txt | 2 +- components/utils/include/initialization.h | 2 +- components/utils/include/mac_filter.h | 32 +++++ components/utils/initialization.c | 9 +- components/utils/mac_filter.c | 82 +++++++++++++ components/utils/nvm.c | 113 ++++++++++++++++++ components/web_server/get_data_handler.c | 1 + components/web_server/storage_handler.c | 31 +++++ components/web_server/www/html/_config.yml | 1 + .../web_server/www/html/_i18n/english.yml | 18 ++- components/web_server/www/html/info.html | 21 ++-- components/web_server/www/html/js/info.js | 72 ++++++++++- components/web_server/www/html/js/settings.js | 3 + components/web_server/www/html/main.scss | 93 +++++++++++++- components/web_server/www/html/settings.html | 6 + components/web_server/www/html/sysinfo.json | 10 +- .../www/output/gzip/functions.js.gz | Bin 6594 -> 7707 bytes .../web_server/www/output/gzip/info.html.gz | Bin 1024 -> 1068 bytes .../web_server/www/output/gzip/info.js.gz | Bin 1350 -> 2228 bytes .../web_server/www/output/gzip/main.css.gz | Bin 5498 -> 5595 bytes .../www/output/gzip/settings.html.gz | Bin 1367 -> 1405 bytes .../web_server/www/output/gzip/settings.js.gz | Bin 1388 -> 1656 bytes components/wifi_handler/wifi_event_handler.c | 4 + components/wifi_handler/wifi_handler.c | 8 ++ docs/Advanced_topics.md | 1 + platformio.ini | 2 +- 26 files changed, 489 insertions(+), 22 deletions(-) create mode 100644 components/utils/include/mac_filter.h create mode 100644 components/utils/mac_filter.c diff --git a/components/utils/CMakeLists.txt b/components/utils/CMakeLists.txt index ee751e2..c249938 100644 --- a/components/utils/CMakeLists.txt +++ b/components/utils/CMakeLists.txt @@ -1,4 +1,4 @@ -idf_component_register(SRCS utils.c initialization.c nvm.c mac_generator.c +idf_component_register(SRCS utils.c initialization.c nvm.c mac_generator.c mac_filter.c INCLUDE_DIRS include REQUIRES cmd_router cmd_nvs nvs_flash json esp_http_server) \ No newline at end of file diff --git a/components/utils/include/initialization.h b/components/utils/include/initialization.h index 2e72624..9bc0266 100644 --- a/components/utils/include/initialization.h +++ b/components/utils/include/initialization.h @@ -24,7 +24,7 @@ extern "C" #define DEFAULT_SSID "ESP32_NAT_Router +" bool IsLedEnable, IsWebServerEnable, IsCustomDnsEnable, - IsRandomizeMacEnable, IsDarkModeEnable, IsWifiAuthFail; + IsRandomizeMacEnable, IsDarkModeEnable, IsWifiAuthFail, IsMacFilterEnable, IsAllowList; char *customDNSip, *authUsername, *authPass, *macAp, *dnsIP, *cache; diff --git a/components/utils/include/mac_filter.h b/components/utils/include/mac_filter.h new file mode 100644 index 0000000..9ab6800 --- /dev/null +++ b/components/utils/include/mac_filter.h @@ -0,0 +1,32 @@ +/** + * @author Jaya Satish + * + *@copyright Copyright (c) 2023 + *Licensed under MIT + * + */ + +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif +#include +#include +#include + +#define MAX_MAC_ADDRESSES 10 +#define NVS_KEY "stored_macs" + + +esp_err_t store_mac_address_in_nvs(const char *macAddress); +esp_err_t remove_mac_address_from_nvs(const char *macAddress); +bool check_mac_address_in_nvs(const char *macAddress); +cJSON *retrieve_mac_addresses_as_json(); +void mac_filter(const uint8_t mac[6],uint8_t aid); +void refresh_mac_filter(); + +#ifdef __cplusplus +} +#endif diff --git a/components/utils/initialization.c b/components/utils/initialization.c index 0eb7242..0e81fe8 100644 --- a/components/utils/initialization.c +++ b/components/utils/initialization.c @@ -16,7 +16,8 @@ static const char *TAG = "utils/initialization"; bool IsLedEnable = true, IsWebServerEnable = true, IsCustomDnsEnable = false, IsRandomizeMacEnable = false, - IsDarkModeEnable = false, IsWifiAuthFail = false; + IsDarkModeEnable = false, IsWifiAuthFail = false, + IsMacFilterEnable = false, IsAllowList = false; char *ssid, *ent_username, *ent_identity, *passwd, *static_ip, *subnet_mask, *gateway_addr, @@ -29,7 +30,7 @@ char currentMAC[18]; esp_err_t IRAM_ATTR parms_init() { int webServer = 1, ledEnable = 1, customDnsEnable = 0, - darkModeEnable = 0, randomizeMac = 0; + darkModeEnable = 0, randomizeMac = 0, isMacFilterEnable = 0, isAllowList = 0; // ESP_LOGW(TAG, "initialization Started"); get_config_param_str("ssid", &ssid); @@ -54,6 +55,8 @@ esp_err_t IRAM_ATTR parms_init() get_config_param_int("randomize_mac", &randomizeMac); get_config_param_int("max_login_attempts", &max_login_attempts); get_config_param_int("lock_out_time_minutes", &lock_out_time_minutes); + get_config_param_int("mac_Filter", &isMacFilterEnable); + get_config_param_int("Is_allow_list", &isAllowList); ap_ssid = (ap_ssid != NULL) ? ap_ssid : DEFAULT_SSID; ap_passwd = (ap_passwd != NULL) ? ap_passwd : ""; @@ -79,6 +82,8 @@ esp_err_t IRAM_ATTR parms_init() IsCustomDnsEnable = (customDnsEnable != 0); IsDarkModeEnable = (darkModeEnable != 0); IsRandomizeMacEnable = (randomizeMac != 0); + IsMacFilterEnable = (isMacFilterEnable != 0); + IsAllowList = (isAllowList != 0); auth_info.username = authUsername; auth_info.password = authPass; diff --git a/components/utils/mac_filter.c b/components/utils/mac_filter.c new file mode 100644 index 0000000..f9e0981 --- /dev/null +++ b/components/utils/mac_filter.c @@ -0,0 +1,82 @@ +/** + * @author Jaya Satish + * @license + * this software licensed under MIT + * + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mac_filter.h" +#include "initialization.h" + + +bool check_mac_address_in_nvs(const char *macAddress) { + cJSON *json = retrieve_mac_addresses_as_json(); + if (json == NULL) return false; + + int numMacs = cJSON_GetArraySize(json); + for (int i = 0; i < numMacs; i++) { + if (strcmp(cJSON_GetArrayItem(json, i)->valuestring, macAddress) == 0) { + cJSON_Delete(json); + return true; + } + } + + cJSON_Delete(json); + return false; +} + +//----------------------------------------------------------------------------- +void mac_filter(const uint8_t mac[6], uint8_t aid) { + char mac_address[18]; + sprintf(mac_address, MACSTR, MAC2STR(mac)); + if (IsMacFilterEnable) { + if ((IsAllowList && !check_mac_address_in_nvs(mac_address)) || + (!IsAllowList && check_mac_address_in_nvs(mac_address))) { + ESP_LOGI("MAC Filter","MAC Address %s not allowed, disconnecting...\n", IsAllowList ? "NOT found in Allow List" : "found in Deny List"); + esp_wifi_deauth_sta(aid); + } + } +} + +//----------------------------------------------------------------------------- +esp_err_t check_in_filter_list(const uint8_t mac[6]) { + uint16_t aid; + esp_err_t err = esp_wifi_ap_get_sta_aid(mac, &aid); + if (err == ESP_OK) { + mac_filter(mac, aid); + } else { + printf("Failed to get AID for MAC address\n"); + } + return err; +} + +//----------------------------------------------------------------------------- +void refresh_mac_filter() { + wifi_sta_list_t wifi_sta_list; + tcpip_adapter_sta_list_t adapter_sta_list; + memset(&wifi_sta_list, 0, sizeof(wifi_sta_list)); + memset(&adapter_sta_list, 0, sizeof(adapter_sta_list)); + ESP_ERROR_CHECK(esp_wifi_ap_get_sta_list(&wifi_sta_list)); + ESP_ERROR_CHECK(tcpip_adapter_get_sta_list(&wifi_sta_list, &adapter_sta_list)); + + for (int i = 0; i < adapter_sta_list.num; i++) { + tcpip_adapter_sta_info_t station = adapter_sta_list.sta[i]; + esp_err_t result = check_in_filter_list(station.mac); + if (result != ESP_OK) { + //printf("Error processing MAC address at index %d\n", i); + } + + } +} + +//----------------------------------------------------------------------------- \ No newline at end of file diff --git a/components/utils/nvm.c b/components/utils/nvm.c index 679f21e..13ab2ff 100644 --- a/components/utils/nvm.c +++ b/components/utils/nvm.c @@ -11,9 +11,12 @@ #include #include #include "esp_err.h" +#include + #include "nvm.h" #include "router_globals.h" #include "utils.h" +#include "mac_filter.h" static const char *TAG = "utils/nvm"; @@ -66,3 +69,113 @@ esp_err_t nvm_erase(void) nvs_close(nvs_handle); return ESP_OK; } + +//----------------------------------------------------------------------------- +cJSON *retrieve_mac_addresses_as_json() { + nvs_handle_t handle; + esp_err_t err = nvs_open(PARAM_NAMESPACE, NVS_READONLY, &handle); + if (err != ESP_OK) { + return NULL; + } + + size_t required_size; + err = nvs_get_str(handle, NVS_KEY, NULL, &required_size); + if (err != ESP_OK || required_size == 0) { + nvs_close(handle); + return NULL; + } + + char *buffer = malloc(required_size); + if (buffer == NULL) { + nvs_close(handle); + return NULL; + } + + err = nvs_get_str(handle, NVS_KEY, buffer, &required_size); + if (err != ESP_OK) { + free(buffer); + nvs_close(handle); + return NULL; + } + + cJSON *json = cJSON_Parse(buffer); + free(buffer); + nvs_close(handle); + return json; +} + +//----------------------------------------------------------------------------- +esp_err_t save_mac_addresses_as_json(cJSON *json) { + nvs_handle_t handle; + esp_err_t err = nvs_open(PARAM_NAMESPACE, NVS_READWRITE, &handle); + if (err != ESP_OK) { + cJSON_Delete(json); + return err; + } + + char *serialized = cJSON_Print(json); + if (serialized == NULL) { + cJSON_Delete(json); + nvs_close(handle); + return ESP_ERR_NO_MEM; + } + + err = nvs_set_str(handle, NVS_KEY, serialized); + + ESP_LOGI("MACS ARE","%s",serialized); + free(serialized); + nvs_close(handle); + return err; +} + +//----------------------------------------------------------------------------- +esp_err_t store_mac_address_in_nvs(const char *macAddress) { + cJSON *json = retrieve_mac_addresses_as_json(); + if (json == NULL) { + json = cJSON_CreateArray(); + } + + int numMacs = cJSON_GetArraySize(json); + if (numMacs >= MAX_MAC_ADDRESSES) { + cJSON_Delete(json); + return ESP_ERR_NO_MEM; + } + + for (int i = 0; i < numMacs; i++) { + const char *storedMac = cJSON_GetArrayItem(json, i)->valuestring; + if (strcmp(storedMac, macAddress) == 0) { + cJSON_Delete(json); + return ESP_OK; + } + } + + cJSON_AddItemToArray(json, cJSON_CreateString(macAddress)); + + esp_err_t err = save_mac_addresses_as_json(json); + cJSON_Delete(json); + return err; +} + +//----------------------------------------------------------------------------- +esp_err_t remove_mac_address_from_nvs(const char *macAddress) { + cJSON *json = retrieve_mac_addresses_as_json(); + if (json == NULL) { + return ESP_ERR_NVS_NOT_FOUND; + } + + int numMacs = cJSON_GetArraySize(json); + for (int i = 0; i < numMacs; i++) { + const char *storedMac = cJSON_GetArrayItem(json, i)->valuestring; + if (strcmp(storedMac, macAddress) == 0) { + cJSON_DeleteItemFromArray(json, i); + + esp_err_t err = save_mac_addresses_as_json(json); + cJSON_Delete(json); + return err; + } + } + cJSON_Delete(json); + return ESP_ERR_NOT_FOUND; +} + +//----------------------------------------------------------------------------- \ No newline at end of file diff --git a/components/web_server/get_data_handler.c b/components/web_server/get_data_handler.c index 1fa90af..5c66637 100644 --- a/components/web_server/get_data_handler.c +++ b/components/web_server/get_data_handler.c @@ -50,6 +50,7 @@ esp_err_t get_settings_data_handler(httpd_req_t *req) cJSON_AddBoolToObject(root, "ledEnable", IsLedEnable); cJSON_AddBoolToObject(root, "darkMode", IsDarkModeEnable); cJSON_AddBoolToObject(root, "webServer", IsWebServerEnable); + cJSON_AddBoolToObject(root, "macFilterEnabled", IsMacFilterEnable); cJSON_AddStringToObject(root, "authUsername", authUsername); cJSON_AddStringToObject(root, "authPassword", authPass); cJSON_AddNumberToObject(root, "maxLoginAttempts", max_login_attempts); diff --git a/components/web_server/storage_handler.c b/components/web_server/storage_handler.c index 79d9709..0358254 100644 --- a/components/web_server/storage_handler.c +++ b/components/web_server/storage_handler.c @@ -15,6 +15,7 @@ #include "request_handler.h" #include "initialization.h" #include "utils.h" +#include "mac_filter.h" static const char *TAG = "url_handler/get_data_handler"; @@ -185,6 +186,36 @@ esp_err_t save_settings_data_handler(httpd_req_t *req) IsDarkModeEnable = str_to_bool(html_escape(strdup(param_buf))); err = nvs_set_i32(handle, "dark_mode", bool_to_int(IsDarkModeEnable)); } + if (httpd_query_key_value(query_buf, "macFilterEnable", param_buf, sizeof(param_buf)) == ESP_OK) + { + IsMacFilterEnable = str_to_bool(html_escape(strdup(param_buf))); + err = nvs_set_i32(handle, "mac_Filter", bool_to_int(IsMacFilterEnable)); + printf("Commit failed! (%s)\n", esp_err_to_name(err)); + + } + /////////////////// + if (httpd_query_key_value(query_buf, "add_mac_address", param_buf, sizeof(param_buf)) == ESP_OK) + { + store_mac_address_in_nvs(html_escape(strdup(param_buf))); + refresh_mac_filter(); + + } + + if (httpd_query_key_value(query_buf, "remove_mac_address", param_buf, sizeof(param_buf)) == ESP_OK) + { + remove_mac_address_from_nvs(html_escape(strdup(param_buf))); + refresh_mac_filter(); + } + + if (httpd_query_key_value(query_buf, "filter_list_type", param_buf, sizeof(param_buf)) == ESP_OK) + { + IsAllowList = word_check(html_escape(strdup(param_buf)),"Allow"); + err = nvs_set_i32(handle, "Is_allow_list", bool_to_int(IsAllowList)); + refresh_mac_filter(); + } + + +///////////////// valid_query = (err == ESP_OK); diff --git a/components/web_server/www/html/_config.yml b/components/web_server/www/html/_config.yml index b9d29c7..675821f 100644 --- a/components/web_server/www/html/_config.yml +++ b/components/web_server/www/html/_config.yml @@ -22,6 +22,7 @@ sass: jekyll-minifier: + compress_javascript: false exclude: "*.json" uglifier_args: harmony: true diff --git a/components/web_server/www/html/_i18n/english.yml b/components/web_server/www/html/_i18n/english.yml index b012086..ff9f6cd 100644 --- a/components/web_server/www/html/_i18n/english.yml +++ b/components/web_server/www/html/_i18n/english.yml @@ -67,6 +67,7 @@ settings: toggle-1: "Enable dark mode" toggle-2: "Enable LED indicator" toggle-3: "Enable Web server" + toggle-4: "Enable MAC filter" card-2: header: "Admin Settings" field-1: "Username" @@ -113,11 +114,17 @@ info: card-2: header: "Connected Users ($$)" table: - A: "ID" - B: "IP Address" - C: "MAC Adress" + A: "IP Address" + B: "MAC Address" + C: "Add" card-3: header: "Acknowledgements" + card-4: + header: "MAC Filter($$)" + table: + A: "ID" + B: "MAC Address" + C: "Remove" strings: B: "OTA update" C: "upload" @@ -127,8 +134,11 @@ info: messages: message-1: "file uploading Status: $$" message-2: "OTA Update Success - Restarting" + message-3: "Settings have been saved." E0: "ERROR: Failed to load sysinfo.json" - E1: "ERROR: OTA update ERROR" + E1: "ERROR: OTA update ERROR" + E2: "Failed to save settings!" + E3: "ERROR: Failed to save settings!" error: title: "404" diff --git a/components/web_server/www/html/info.html b/components/web_server/www/html/info.html index 232059a..d66a015 100644 --- a/components/web_server/www/html/info.html +++ b/components/web_server/www/html/info.html @@ -34,22 +34,29 @@
+
+
{{site.translations[site.lang].info.card-4.header | replace_first: '$$', + ''}}
+
+
+
+
{% t info.card-3.header %}
@martin-ger(martin-ger)
@samdenty (Sam Denty)
- @kevinwolfe(Kevin Wolfe)
+ @kevinwolfe(Kevin Wolfe)
@nopnop2002
@dchristl
- - + +
-

- This software is based upon the work of martin-ger(ESP32 NAT Router). UI is based on the work of Sam Denty(Wi-PWN).
- +

+ This software is based upon the work of martin-ger(ESP32 NAT Router). UI is based on the work of Sam Denty(Wi-PWN).
+

-
\ No newline at end of file + \ No newline at end of file diff --git a/components/web_server/www/html/js/info.js b/components/web_server/www/html/js/info.js index 7f0bbcb..02c177f 100644 --- a/components/web_server/www/html/js/info.js +++ b/components/web_server/www/html/js/info.js @@ -8,11 +8,15 @@ var versionCell = getE("version"), connection = getE("connection"), connectedUserCount = getE('clientsFound'), connectedUsers = getE('users'), + filterList = getE("filterList"), + filterListCount = getE("filterListCount"), ap_rss = 0, wifiAuthFail, tableHeaderHTML, otaProgress = false, - clients = []; + filterListType, + clients = [], + filterListData = []; function getData() { if (otaProgress) return; @@ -35,9 +39,12 @@ function getData() { wifiAuthFail = res.wifiAuthFail; clients = res.clients; versionCell.innerHTML = version; + filterListData = res.filterList; + filterListType = res.filterListType; fadeIn(); users(); ap_connection(); + filter_list(); }, function () { notify('{% t info.messages.E0 %} (E0)'); @@ -148,8 +155,67 @@ function users() { for (var i = 0; i < clients.length; i++) { var id = i + 1; - tr += '' + id + '' + clients[i].ipAddress + ' ' + clients[i].macAddress + ''; + tr += '' + clients[i].ipAddress + ' ' + clients[i].macAddress + ''; connectedUsers.innerHTML = tr; } } -} \ No newline at end of file +} + + +function filter_list() { + console.log("clients: ", filterListData.length) + filterListCount.innerHTML = filterListData.length; + var tr = ''; + tableHeaderHTML = '{% t info.card-4.table.A %}{% t info.card-4.table.B %}{% t info.card-4.table.C %}'; + tr += tableHeaderHTML; + filterList.innerHTML = tr; + if (filterListData.length > 0) { + + for (var i = 0; i < filterListData.length; i++) { + var id = i + 1; + tr += '' + id + '' + filterListData[i] + ' '; + filterList.innerHTML = tr; + } + } + var IsAllowList = (filterListType === "Allow"); + tr += '' + tr += ''; + tr += ''; + tr += '' + filterList.innerHTML = tr; +} + + +function saveSettings(data) { + var url = '{% if jekyll.environment == "development" %}settingsSave.json{% else %}data/settingsSave.json{% endif %}'; + url += data; + showLoading(); + getResponse(url, function (responseText) { + if (responseText == "true") { + indicate(true); + notify("{% t info.messages.message-3 %} (M3)", 2000); + } else { + indicate(false); + notify("{% t info.messages.E2 %} (E2)"); + } + }, function () { + indicate(false); + notify("{% t info.messages.E3 %} (E3)"); + }, null, "POST"); + } + + +function add_mac_to_filter_list(num){ + var data = "?add_mac_address=" + encodeURI(clients[num].macAddress); + saveSettings(data); +} + +function remove_mac_to_filter_list(num){ + var data = "?remove_mac_address=" + encodeURI(filterListData[num]); + saveSettings(data); +} + +function filter_list_type(){ + var data = "?filter_list_type="+ encodeURI(getE("Allow").checked ? "Allow":"Deny") + saveSettings(data); +} diff --git a/components/web_server/www/html/js/settings.js b/components/web_server/www/html/js/settings.js index a22264e..ab010ad 100644 --- a/components/web_server/www/html/js/settings.js +++ b/components/web_server/www/html/js/settings.js @@ -16,6 +16,7 @@ var ssid = getE('ssid'), darkMode = getE('darkMode'), ledEnable = getE('useLed'), webServer = getE('webServer'), + macFilter = getE('macFilter'), apIP = getE('apIP'), macContainer = getE('macContainer'), dnsIpContainer = getE('dnsIpContainer'), @@ -69,6 +70,7 @@ function getData() { ledEnable.checked = res.ledEnable; darkMode.checked = res.darkMode; webServer.checked = res.webServer; + macFilter.checked = res.macFilterEnabled; adminUsername.value = res.authUsername; adminPassword.value = res.authPassword maxLoginAttempts.value = res.maxLoginAttempts @@ -107,6 +109,7 @@ function saveSettings() { url += "&CustomDns=" + CustomDns.checked; url += "&darkMode=" + darkMode.checked; url += "&webServer=" + webServer.checked; + url += "&macFilterEnable=" + macFilter.checked; getResponse(url, function (responseText) { diff --git a/components/web_server/www/html/main.scss b/components/web_server/www/html/main.scss index ac1851e..c485fd9 100644 --- a/components/web_server/www/html/main.scss +++ b/components/web_server/www/html/main.scss @@ -739,7 +739,7 @@ hr.small { } -/**************************** Buttons & checkboxes ****************************/ +/**************************** Buttons, checkboxes & radio button ****************************/ .button, button, input[type='submit'] { font-size: 14px; font-weight: 500; @@ -985,6 +985,97 @@ label.checkbox:active:before, .checkboxContainer:active label.checkbox:before { line-height: 18px; } + + +.radioContainer { + display: inline-block; + width: 100%; + cursor: pointer; +} + +input[type='radio'] { + display: none; +} + +input[type='radio']:checked + label { + border-color: #6d6d6d; + background: #6d6d6d; +} + +input[type='radio']:checked + label:after { + transform: scale(1.3); +} + +label.radio { + position: relative; + z-index: 1; + display: inline-block; + box-sizing: border-box; + width: 18px; + height: 18px; + cursor: pointer; + transition: 0.2s; + border: 2px solid #6d6d6d; + border-radius: 10%; + background: none; +} + +label.radio:before { + position: absolute; + z-index: 0; + top: 0; + left: 0; + display: block; + width: 200%; + height: 200%; + content: ''; + transition: 0.3s ease; + transform: translate(-27%, -27%); + pointer-events: none; + border-radius: 50%; +} + +label.radio:after { + display: block; + width: 100%; + height: 100%; + content: ''; + transition: 0.1s ease; + transform: scale(0); + background: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRkZGRkZGIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KICAgIDxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiLz4KPC9zdmc+) center center no-repeat; + background-size: contain; +} + +label.radio:active:before, +.radioContainer:active label.radio:before { + width: 300%; + height: 300%; + transform: translate(-34%, -34%); + background: rgba(0, 0, 0, 0.15); +} + +/* Additional styles for labels associated with radio buttons */ +.row.inputRadio .radio { + float: left; + margin-right: 10px; +} + +.row.inputRadio label:not(.radio) { + line-height: 18px; +} + +/* Adjustments specific to your layout */ +.row.inputRadio .col-6:nth-child(2) { + margin-top: 26px; +} + +.row.inputRadio .col-6:nth-child(2) { + margin-bottom: 20px; +} + + + + /*********************************** Footer ***********************************/ footer { height: 120px; diff --git a/components/web_server/www/html/settings.html b/components/web_server/www/html/settings.html index f77dce0..0ed4d76 100644 --- a/components/web_server/www/html/settings.html +++ b/components/web_server/www/html/settings.html @@ -29,6 +29,12 @@ +
+ +
diff --git a/components/web_server/www/html/sysinfo.json b/components/web_server/www/html/sysinfo.json index f711777..a5fe82c 100644 --- a/components/web_server/www/html/sysinfo.json +++ b/components/web_server/www/html/sysinfo.json @@ -1,7 +1,7 @@ { "ipAddress": "192.168.1.128", "dns": "192.168.1.1", - "rss": -70, + "rss": -70, "wifiAuthFail" : false, "clients": [ { @@ -16,5 +16,11 @@ "ipAddress": "192.168.4.2", "macAddress": "4c:bb:58:f0:94:de" } - ] + ], + "filterList": [ + "4c:bb:58:f0:94:de", + "4c:bb:58:f0:94:de", + "4c:bb:58:f0:94:de" + ], + "filterListType": "Allow" } diff --git a/components/web_server/www/output/gzip/functions.js.gz b/components/web_server/www/output/gzip/functions.js.gz index 6dc5db96de0d5da48a3233f7a38f35ac831ffc58..0944646283208bfd15a4aac992527231ec7466fc 100644 GIT binary patch literal 7707 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 V0n`6WB&rwv|2H7VcM3680004z8G`@- literal 6594 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 AhyVZp diff --git a/components/web_server/www/output/gzip/info.html.gz b/components/web_server/www/output/gzip/info.html.gz index fc50af76b02ca3d9fc64fdd79079e21ab1a006b4..80c5341213d5f916a28d73d217f1cbe6cbfe91ef 100644 GIT binary patch literal 1068 zcmV+{1k?K;iwFp`va@9Z|7mV!Z!TzbZEOIoR#9);HV}Rvu>U})Kw)o{nWn%nB$m)1 zTe@OfSJVmeGR&YvN@7fr0!i60uphrWO0sOnP1>P>5sG)G?~Zrh9W}26<0+Zf!ZVUr z%sSzd=rE>~0L?R*FBnnDWR-fukXKE6d6gmV3E|3}Nj% z^WHs$Th;^7rP7)IJ??ux~1f0_z{c%+`mNiG!+6(Sb z&Mc2VryP>{TVLf<%`xU;4>7bAQXE%{|9H9<)hzVqp4uIVLSjciNz88_s-S zu+&ZKiQhIrqe23!dpdVyN6FF&C35Homgk}YPR}x_BVsf(yeZeb!7i?*MnhwpW~6 zfi2z}(;;=obz(i}NbAb`#$8ZaN?)}ZFsP>GgEhuGDqQpCe5sjV+EA=zqgogap4k$| zU#6H|Eq4vk9WF{g2^?!AYfEg1FY$8(K|*Ui@{|4rlgEXYJM6ZD<^PiNy34xY z#G@V?u~&;;;nK) zGAr0BMgf%cwvvuGQ}_+Dz(Pkd=AZ%F2Ic_tI{~v5F~ygb{&-}8hfzBTw+|U_pXn@= z@b3NS_$%BFG@$n~{&@cZz8eN6OghOF(PtggP7bPmDPRf;3pwi_hFhOFo8x!KgQG>O m!{m0ehcHWa7xyDe{75-A8r=0?WVG_NO8*0s9+0}!3IG5lJOI1^ literal 1024 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 Cl1xJY literal 1350 zcmV-M1-bekiwFoF9P4BP|7mV!Z!T(c0DV@CZre5xeiep56SAUZDQT9~G94tb+hofh z>~t*<1chSJwmOy4L^^?&de6QiMago|4F+WLc*nc@?&FcOrJU+CmuN2ZFxD}lFS(9y z%Y0r6rGESX@mQ!Lmr4+vfI?TTR4Qk=|4ro*vzfCen!d?wN@%kxbV#%ON)~vF|mW78M8#1Ieb}Md@b!FeA#n4OHY=1 z@gYt#5Vfalnx#T&qv=NMNt6mwJrh~xr&5aY{O;xDnda=_OPO+hs6HsdhZ ze@7{eT)nKk%$G7Dx>73gXRE{%W&6~_*c12aVH5hYFqwXxLEfZ_Tyx;sh+rf7sze63 zVd|Tix(^;|Po?;4DU{|?JfkmHm*-j+<4VNblAjks5`23zxr3a$z-DYX)+{T-XgfR? zfN4qamyQ#Nr1Lq|3ozT>8gHztxcxXuMo&PB%M`4n*`#nsX8TA0+O6ZncLJvUOvt%j zoaNt(rH&snQ5UX-IVgb_k#x1M!9IH%1_6y~(ilt}fT^6LiH`MB^$c!=6Y1e+<0&Qh7A&=CYNW!r);Wbsnx zV_{M!l=jH0b7UMXD@RrWhbN@}y*)G(%`yI8AM16CIfma98qtQwz}d4rGbLlLkcuA$ zO!A|{nzAA1Vt1D){vOiNgK!@JBAT0$!t}kFN&X8=?(srp1T#1|!CMk`Dy0sbyI+qe z1tv^%X-XP`E^yS79)1IV3jQd5@W16L@E*7N!>bPDj#;q7t0u?<*T*V9>#2OmloLkH zvW>ZQvg@d-Rqr66-Of<}U0@KJnuD@ssc|AX?(1^U*U8{B^i)*Qqu+%&j-+Q+lR-a8 zp9Y4sd;P8%+Ie3Uu>}29COCeKr+?0^^In!p5tp5L39N>5N5X@{M9dl5^O_1MXfvpS zgO&5gm;}uJ{P2)k`5wSD=y#2WZ9h|E-)nDWI)=B02YY6_+N6roCc#`1Xqv@98tf5$ zjDbKx;vOzVf+3bc|8Za!%)QiW-z~@3%#fMd)()PFt z(1+@)({(z^n#?|d;ThCZw>I8Zjw+5~Y%Z$pr9nVnw8w4FtXj9VcMvQF7eh#8Q4MdA zOS};%x54gWp0M{aoXFJZ%+Z z1O663ss)Z-uh+JzY&~tvb7t%9!d`*WeyX@@)k)xXXsYX0nz`E@(-z;H&PITLR?b?h z%JhRdv9I-%)3Myaw0?&LubXfE?7Dx5nkOkUuOWDri1I1UI9%ZMm^c-703AO17kck) I^vntX0DHTbssI20 diff --git a/components/web_server/www/output/gzip/main.css.gz b/components/web_server/www/output/gzip/main.css.gz index 4a4344bc57283c5e8c0283cd303ca3902479ed5e..cc76aa171ebc79124bb85c520076df097cbb0f32 100644 GIT binary patch delta 5275 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 h2#2&1T7vu`5(^BN%QSm003CvGpYap delta 5178 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

ys6x06Pb zs~n#@bI&D4MBmglxh z9&B*2flupZ2$%~IX&!)+bAa@eieY{FQX6T-b20VJypXl) zUW>qHro}d_!=&F5l%ZO>g}zjocgA6}Q66g(;RG<$1jaKs0+offTNFS0xIztuDwzH= zE||!G8thk@9*>zW5ur6jg!F$1M-9)0YC<_Jk+`lOswFvpWF?~wiqY!PuD$s|f)+<$ zpvP5DBA9J(R)$FE(pJdr3w`TC(^l6|Gh$C#@mvT)bmyGuS_WyPS@oP&#WNZ`-C`_% z)aj>^45IR#wAx#bDJyxgJjGPKI2Defk=wgo~y0`c|V)XxF@^OxL-+ zJje|Sa=#vYUgAd54m5xDl4a7U(@`ft5gYh&sJ6ERLg!;^+ZsA}$8rkAOuUP{_mUMs z?#D4Zi+qF^Z)<= diff --git a/components/web_server/www/output/gzip/settings.html.gz b/components/web_server/www/output/gzip/settings.html.gz index 4abe0e93f4ad89b801dbeeaabdb085823fbab910..efb3a9b582aeb6b941fedcd3bc65ee0b20ac75a0 100644 GIT binary patch delta 1359 zcmV-V1+ek|L;6^vke;rp`8NiquHTZi@Z*9VO9{?Y!8D<2WB;9d$h3^W5=B zk*y)nBqpsCEG2A6wE^1>K3{(b-v!ugxfKw1!CEc{hJ@q^efR3^Vfe9gO_7Bse}-_$ zEvF(hj0$KUydk*(T}ZTt4g1ao!R3f(5beO&8v$krfM$mp`t4vZN-39n%$SEY6RJmr zCgDjta8lQ41+$LZA*2v8C6sRX{_0@===8K;B&rDOspJNKBpny_@YlUf_?R$3jcEtY zv(PDn_HUe`Py-e6bP&X?2-}<`e^R*H4vJBaU-kR_ATD@rMZI{2YvTJ%ts&$BJDuVT z;x41I715biQ-v__?onp>7}5LK&UfIlucpeH4~8~~&#|r4tK5hXcEcN~EbnthEmyL} z=ii!)ONrritRgp#7O!HM=9!Iu{DI(KwDb3WC%b={pHfVZl!|t=XTjK=e?+l7#c=E~ zrA8cf$?MmoZglb3;|Xb#pz0Uwo;ZW8sItBoor$JdGd2q(HC&zP&8SYoyIy)Le^#+S z&5czl|6b72B&BK0pu>U`{}&8uHJKk@iSXdC$a&fWLHbIUDSfFDsJ$No8}-z;(}tt( zrJGsA>5>$cNsG%Yx5VCLe^B=bs@YJR^mC?^##H3^x=)3H+KahigE_Y_+J&CWo9V+M z8@EBjvTy;(eZVSQ7w^xos3a~2mA)UFx9O1i=T&f3eV%}dQ8c*(s4sve0`wRjKs13~ zw@@oVHN;hL)!k+wJrlOe&ME10VIRVlQud)xE3q}iRj}3F?!$KLf6rrQe<#6mMCvNL z-s#_HEZCcMt0XiNl)+F5bf+DVl0WLa`ix2C*bOSqEqufEQp3MF*MLd^K_vllfa`W} zfD--YrMHIxp}AE|X$=flNQH}5*+MgJso>witp^f~n+${~0I$4T`chAeif7F-QKP}0_(NkzZL>FqnWye}bGiy8(GEaMMj?Ho5vjKm9nFFz4 zDK13Pr(8fnXw|$4P(7j82q)b&PvMfwW{O9)EtMl%zHF>D6}#7+e`zk_hm4NNPK(E1t~!Uf z(Zppo)7-!@xd1u_!Y%0uil1ocGjcS@1=X#H$Gh8-#pdO6*lad~v+c;=?6Hg9)6l~- zMgPfH*$VAH8xgm86xTC}Y;Y@8lXTl{HP*+Sev_nvk&Y&o(T;wqDejiy z5XQI)n`0M)lRJ`NYNhk29QbX0MXKDoK`3aRU0~*8K zpOeW19&jTju)h56?ACWkko<0^r!ZwNfETrziMWA?rlGiZ8^w4mu1p?O6=WOY{< R4Q(po{{hT>E&y^J000+htYZKG delta 1321 zcmV+^1=jlg3fBsMABzYG@*6m00{?SmbaZKMXLBxSbZu+^%~@@4+cpsXD})LZ$yP;4 zx@ART3-FR`3y>5+ouXfc4K#JOSyQA+Qg%}8$L}bKmTc$6PF%-dY#ntxKKI=5NRh1} z&?F|U6f7ldNVNgm4nE)f5q=1;*>Wo&?t-;k4h#v&dH4DT{bBgAb3>7cCx4D`$t|ZM zG>i&pAG{;E0bNM6hYkACR!?41BJ1VFPx4gGeo7p0WTJ!Z_)nhDjTLX+^M z9XP4$w1QdSb_gkiObMkM*xwxNADx~Sj6@Y-J(b+ypQPi$9{#(x2_F+Cs4?xpAq$-{ zX#d733N=t6PX|HVim=UDB7X(kc2JCZ{HEXU2XVo3E9%8FTod1CY7Jd3e5X@CgSgA6 zY(;dY)l?x2JUq%QAEWm^w(}jh?5nA==7XUP;tOmm^(q()LXy>2*PImt`Kc$!$DHZK#&w{Z#iDG$*fq&RzN{u+|zI|Ia zxj5`O^HrZ<_oNk7_7>wY(KKsDV}X_ixS8IJ>Lh&VrML1|746g9Se5ec1rbden#K%* z6{PrGFsRjJetadugTo@rX%7VHD_th>l}eySKLj@FsoT>A&~xeL5^=gDMP<_BGRrNo zcNx?@f-3)OlYW+z(tntW9AEdTFi@kI8#b7Oh4C%)T&7GP7TLJZH7o>|kUZvC<=5r; z8J3a6Wu4NG`{r#r&;0W$epP*5;1#22atWut02T$%V|c=&3G}*!TIp0nT*a@t+l)(d zzTNxx+!@kIaJrJZ_N;e`G#U%`W?_|tW`Z&pDuHm?0V(;T4u92WB;K(bRGeG5#Z^SZ zx14K0rGTK406DT(H{n!IC^o`Lcf(V-;&OSPex37a-VnOPMxk=U zg61kAJJ=t$EoOJQQu5M@a=m@!B~tTh$8H=SuN z;`Uz0WT(aBFV~$z+>GHqKGWR5F}Vaf2Er}r35p*sh<_P58sviNR>b4oZOLNu`Z;Vi zo59(3=iYm*CwC_5_gMd;)IQmFrXGD z^zM}z@P8=cKg);BY>tyLl?=9Uhy28pyqwuvT&^V^{%mAnyXfX6enzZsPL^kA(p+Sx z%kfd@ZVMqLnE32tcU4LnM#`hmGub#{owoSXuCj%=fgU~WYS?mQHN;g;yXtPM9^^e0 z>6EfM&i+t8Q`{}ZA&hYqHpeaoCl4gS)Jo@BIVJGh`ifM6fd=ta=akSS(O}GT6F^g$ zT$L_8eC+uNl`sPu!#$pp?*txjqfcOc`Q6#AZ&o1r-A+$o%3jEa({4qjSX-<5lv0Sh zyOioXQeMu~LmB+6Y>qT*x{GfcmS_FyD}}j=Y*Y{aW`-Ee+@;W06ZLb++_i?;`&!JP f=~c^ureB2S75$La4O%p`sfhmvvNJ?dh#UX_Jsgf- diff --git a/components/web_server/www/output/gzip/settings.js.gz b/components/web_server/www/output/gzip/settings.js.gz index 93ce3382c2327a5b83988a6b89f56fd1181e2812..fcc42461fc4a5ebe9de0e15a45f2afd66b5993d1 100644 GIT binary patch literal 1656 zcmV-;28a0{iwFp`va@9Z|8r$@bZKs9b1rIg0OeTUZ`(Eyeolb=53C+$xec7G+g?@# zg_op&w>SynwtFmS>1=C}DNUs87_0ZU@Ay+9B`3x9xR=Db`;I&w@4h=}Lo330mXZsy z1aTb?*!7{UPNQi# zYx|@ht?EAXs}X6)nkM7YY1NZfRFtJtPw6BYzy%dqGP!S}VFX59&l!j*<&O=(i8N$M z1#D?^MDwhbDdVlR<&)X>vgV>#Uoq~KPGT%+^*AlkCeT)()j6csjL!2$kI}yY6OS#- zXHadRa#|;G0sD~Uq6Kgg8}ydn^1<0%7EI8L`KC_T9J}lSeX)izcoKN%PgUN<_vnmw z={jSd!c_F6Enqi&+ERP4r<-D#v9S=aE(LEL&R1yoJTH>Rj4eNAYnW!tp#!-|LXgW1 z2J&~Zg5+^tJYB9RTLPD&jFq)8&+kr-Pma%ClX04oJmUiJ$ef6RSUX(m^_c{@JRZ?B zz20Cg-57ivC2Fzgl<;jPlGSv4c}f;E=P<h&T0RQnsv4ju$mcL{>0)(km)x zJS2a~^at?(yet?8nWKW9aS#GSz(;@Zf(>vDYZzAs_z~|_TOXaB5mD{jZxgFuXLq-w zl2*8;XYbn+i2)66QG=2?`kfx&F6lcYO(TC$7A#k)GD+GKA#6y<13{>KiT7kdlWr zT%>>=F9i;pT^suG^opMppv7GtLUEBosEMv`k9O&Xap{)zuxorMsNF&z2HyK6Y!1>_ z^qyT%%F3*_^gS!blM3HqQxEI-Sz$XY?qMBED{P0${o61!tS=;>Y7gnSSV23C9cDqB zk!?Qs?5zgFUV%eWH{08#n zi@}y$NsQ5_MN+S^$VYN8&q4nDWj9Ind(=$qa(qJ=A-iEpRN1^n!@;V81)_%5#piU0T#5*#S{d+EOH#doVU$9kB+H{O>2VT-&5`h;7@aYcVIVvw??^U zhLeQuI>9UK1m{B>7~h_spKFu-fv)l&XZHW)_4I`C`D^M-+@0I{!S?OF>Hnxp}^J=B1F7)Bsq5fVK#!t2|4qV;-;7z|ghqcDA-o?!w z2k-ms96OwTdrh;=AlJ;8E)6>UWN7AX_vvJmYSz|X%ZNT>QNg;{ zKwz|Q`DEu@=TN6Y{i|nP{d%lWhtzu$(|-W|%__DA7XSdK CR63jh literal 1388 zcmV-y1(W(8iwFo02kvA7|8r$@bZKs9b1rIg0IgR|Z{s!){VNI&frusCWVgK}FoHDe z0xptG5O21}1#OLEH8N$8l)Z-I{`L+(M2V78q-Za;_~wxu4d=~J%StSCUW()y^k=Sl zN)Pz-2x?Ob1u4l8`$>V;xp-EiKUFCRTlzUE(1Vuyg9J7HeRlt4wBZux0A)q_oRY`M z?BV{)Y?35@C4?b~ot)9*g6qX9N{Yl%r(eEZ-%dX#jtcDLoU#QvP!=!(DNBhH z*pg>36)9!gGS3oG>U_CR$>j0z{_!IDjpqeqi7s(Lo+XjTNjmvR2|X&6XQM4IDj1_T zBQsrcMAO&AT%Z~7qM=d4K@Hf}{m@@S!$3BG8VRj*$(D2kXw+EIiQSZ z>s&nbkBnD(70%3(hGLJT5dAg(aa%s;;#zB1Z?uX+7Ms|-C>Jl7ZC~>>+~uN0?O2%F z<(U0<*Eg8O7|-w1P1@x3u@M$MbkZ9I2|Cd$2$`K=R{xAy-At#)dVZq#7G|D^i>Xz) zyG2>xFr}AUE)y8X%AVl_r|wJmFeX<<8)NbT!~(H`byz2e}zSN05%*=|*}E zwt_^wB~)jy`a^^Hj|@@L$1m2G18vP24n|)cwDv5{d+X$oN*ukD`^X;Di6e&sfV5tT zaFkGEkkYF{juOfYQhJ5RN70uO6Ua`fafDDzkkKnQtlb+SYJ~YRC0bTM#$&KO)OAyq zi!8^U2Prl`D?L6IuuISimsz=})|kyBq)!SkkH7Axnd!RnWv2H95IRDMVt8dfuW%8v zlCUJq5=IN9t}ubjY!lLyVo`x5uL^w!n%|TK_D$o!rqVYnE}pSXpPV!MD)aJ310A7I zkTi~B^R3HI(^gGM3B~6Gi_aM)>?3@N%hvnv4*wV<_@840|2;-+&j&-*yNL86_Q_mA zFkYf63Pv98XJ1LHW=m7zTSfbPJjN@~GMDR=TuVsyWtFH3AEfIAW#V5X>~Tft>1i4j zd-nE$*p@PIqYGJll@6bfxyorSwRxr&X+Kq*gY7pzH@Wi5*;#v`bNX*Po^N>VC64r6 zhu1X5rU4&%MdS)=?oBB)&xMhEfkp5(S9-)VlWw^(H7O(X;tiUFb-9H$v)Q+9_J>|s zy0Z2Bed}Gk$?dp!G$QK6A&L{T4cmgdA2JWl~f!xSkL9lpY-Jbiz z+JZ#it{ue#aA0u?fL5VF)V?r()VWTW2 zTg*D65kT)#vatD2nwz-&)@)Sy_6#RsOAmF?HmhYR*W)+aR9(FYy)?vu4XiFn++W%i z?d*t`{Nbs!Z>_n#>UVauKJTz>mb-y9=75VsCCqm->0W8tp1i(x)}{w{pCQ*pkvLaW uvdeKW2mB0I`UKCye&wg|`sy73vpXF*{G0t!;*1}U^zv^Kmac, event->aid); connect_count++; ESP_LOGI(TAG, "%d. station connected", connect_count); } diff --git a/components/wifi_handler/wifi_handler.c b/components/wifi_handler/wifi_handler.c index e4c8c4c..453dc2f 100644 --- a/components/wifi_handler/wifi_handler.c +++ b/components/wifi_handler/wifi_handler.c @@ -16,6 +16,7 @@ #include "initialization.h" #include "wifi_handler.h" #include "wifi_event_handler.h" +#include "mac_filter.h" bool is_scanning_progress = false; //----------------------------------------------------------------------------- @@ -125,9 +126,12 @@ char* IRAM_ATTR wifi_info_handler(void) cJSON_AddStringToObject(root, "gatewayAddress", gateway_address); cJSON_AddStringToObject(root, "ipAddress", ip_address); cJSON_AddStringToObject(root, "dns", (has_static_ip || IsCustomDnsEnable) ? customDNSip : dns); + cJSON_AddStringToObject(root, "filterListType", (IsAllowList ? "Allow":"Deny")); cJSON_AddNumberToObject(root, "rss", rssi); cJSON_AddBoolToObject(root, "wifiAuthFail", IsWifiAuthFail); cJSON *clients = cJSON_AddArrayToObject(root, "clients"); + cJSON *json = retrieve_mac_addresses_as_json(); + for (int i = 0; i < adapter_sta_list.num; i++) { tcpip_adapter_sta_info_t station = adapter_sta_list.sta[i]; @@ -137,6 +141,10 @@ char* IRAM_ATTR wifi_info_handler(void) sprintf(mac_address, MACSTR, MAC2STR(station.mac)); cJSON_AddStringToObject(client, "macAddress", mac_address); cJSON_AddItemToArray(clients, client); + + } + if(json != NULL){ + cJSON_AddItemToObject(root,"filterList",json); } char *my_json_string = cJSON_Print(root); cJSON_Delete(root); diff --git a/docs/Advanced_topics.md b/docs/Advanced_topics.md index d04c770..bc837d9 100644 --- a/docs/Advanced_topics.md +++ b/docs/Advanced_topics.md @@ -68,6 +68,7 @@ They are several settings are provided to manage router insections : - Enable LED indicator: Enables or disables the onboard LED - Enable web server: Enables the web interface to access settings and other features. +- Enable MAC filter: Enables the MAC filter features. #### AP Sertings : The AP settings refer to the configuration of the access point. - SSID: diff --git a/platformio.ini b/platformio.ini index 07e210c..28bf39b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,7 +10,7 @@ [extra_script_settings] -version = 1.1.4 ; Set the version to the project +version = 1.2.0 ; Set the version to the project merge_to_single_bin = 1 ; (0 = disable) Enable the conversion of a multiple bins to single bin file of 0x0 format From b299b84a560bde9c0a16d4497afa65ad7d1c6271 Mon Sep 17 00:00:00 2001 From: Jaya Satish Date: Fri, 26 Jan 2024 19:11:14 +0530 Subject: [PATCH 3/3] New version 1.2.0 --- components/web_server/www/html/js/functions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/web_server/www/html/js/functions.js b/components/web_server/www/html/js/functions.js index 07300fa..430fe75 100644 --- a/components/web_server/www/html/js/functions.js +++ b/components/web_server/www/html/js/functions.js @@ -1,6 +1,6 @@ --- --- -var version="1.1.4", +var version="1.2.0", sL = getE('spinner-container'), notification = getE("notification"), themeColor = getComputedStyle(document.body),