Skip to content

Commit 74067f0

Browse files
author
Spacehuhn
committed
Readding settings
1 parent 24cd631 commit 74067f0

File tree

2 files changed

+461
-0
lines changed

2 files changed

+461
-0
lines changed

esp8266_deauther/settings.cpp

Lines changed: 323 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,323 @@
1+
/*
2+
Copyright (c) 2020 Stefan Kremser (@Spacehuhn)
3+
This software is licensed under the MIT License. See the license file for details.
4+
Source: github.com/spacehuhn/esp8266_deauther
5+
*/
6+
7+
#include "settings.h"
8+
9+
#include "A_config.h" // Default Settings
10+
#include "language.h" // prnt and prntln
11+
#include "EEPROMHelper.h" // To load and save settings_t
12+
#include "debug.h"
13+
14+
#define MAGIC_NUM 3416245
15+
16+
extern bool writeFile(String path, String& buf);
17+
extern void getRandomMac(uint8_t* mac);
18+
extern bool macValid(uint8_t* mac);
19+
20+
#define JSON_FLAG(_NAME,_VALUE)\
21+
str += String('"') + String(FPSTR(_NAME)) + String(F("\":")) + String(_VALUE?"true":"false") + String(',');
22+
23+
#define JSON_VALUE(_NAME,_VALUE)\
24+
str += String('"') + String(FPSTR(_NAME)) + String(F("\":\"")) + String(_VALUE) + String(F("\","));
25+
26+
#define JSON_INT(_NAME,_VALUE)\
27+
str += String('"') + String(FPSTR(_NAME)) + String(F("\":")) + String(_VALUE) + String(',');
28+
29+
#define JSON_HEX(_NAME,_BYTES,_LEN)\
30+
str += String('"') + String(FPSTR(_NAME)) + String(F("\":\""));\
31+
for (int i = 0; i<_LEN; i++) {\
32+
if (i > 0) str += ':';\
33+
if (_BYTES[i] < 0x10) str += '0';\
34+
str += String(_BYTES[i], HEX);\
35+
}\
36+
str += String(F("\","));
37+
38+
#define JSON_DEC(_NAME,_BYTES,_LEN)\
39+
str += String(F("\"")) + String(FPSTR(_NAME)) + String(F("\":\""));\
40+
for (int i = 0; i<_LEN; i++) {\
41+
if (i > 0) str += '.';\
42+
str += String(_BYTES[i]);\
43+
}\
44+
str += String(F("\","));
45+
46+
47+
namespace settings {
48+
// ========== PRIVATE ========== //
49+
const char* SETTINGS_PATH = "/settings.json";
50+
51+
settings_t data;
52+
bool changed = false;
53+
54+
void get_json(String& str) {
55+
str = String();
56+
str.reserve(600);
57+
58+
str += '{';
59+
60+
// Version
61+
JSON_VALUE(S_JSON_VERSION, DEAUTHER_VERSION);
62+
63+
// Autosave
64+
JSON_FLAG(S_JSON_AUTOSAVE, data.autosave.enabled);
65+
JSON_INT(S_JSON_AUTOSAVETIME, data.autosave.time);
66+
67+
// Attack
68+
JSON_FLAG(S_JSON_BEACONCHANNEL, data.attack.attack_all_ch);
69+
JSON_FLAG(S_JSON_RANDOMTX, data.attack.random_tx);
70+
JSON_INT(S_JSON_ATTACKTIMEOUT, data.attack.timeout);
71+
JSON_INT(S_JSON_DEAUTHSPERTARGET, data.attack.deauths_per_target);
72+
JSON_INT(S_JSON_DEAUTHREASON, data.attack.deauth_reason);
73+
JSON_FLAG(S_JSON_BEACONINTERVAL, data.attack.beacon_interval == INTERVAL_1S);
74+
JSON_INT(S_JSON_PROBESPERSSID, data.attack.probe_frames_per_ssid);
75+
76+
// WiFi
77+
JSON_INT(S_JSON_CHANNEL, data.wifi.channel);
78+
JSON_HEX(S_JSON_MACST, data.wifi.mac_st, 6);
79+
JSON_HEX(S_JSON_MACAP, data.wifi.mac_ap, 6);
80+
81+
// Sniffer
82+
JSON_INT(S_JSON_CHTIME, data.sniffer.channel_time);
83+
JSON_INT(S_JSON_MIN_DEAUTHS, data.sniffer.min_deauth_frames);
84+
85+
// Access Point
86+
JSON_VALUE(S_JSON_SSID, data.ap.ssid);
87+
JSON_VALUE(S_JSON_PASSWORD, data.ap.password);
88+
JSON_FLAG(S_JSON_HIDDEN, data.ap.hidden);
89+
JSON_DEC(S_JSON_IP, data.ap.ip, 4);
90+
91+
// Web Interface
92+
JSON_FLAG(S_JSON_WEBINTERFACE, data.web.enabled);
93+
JSON_FLAG(S_JSON_CAPTIVEPORTAL, data.web.captive_portal);
94+
JSON_FLAG(S_JSON_WEB_SPIFFS, data.web.use_spiffs);
95+
JSON_VALUE(S_JSON_LANG, data.web.lang);
96+
97+
// CLI
98+
JSON_FLAG(S_JSON_SERIALINTERFACE, data.cli.enabled);
99+
JSON_FLAG(S_JSON_SERIAL_ECHO, data.cli.serial_echo);
100+
101+
// LED
102+
JSON_FLAG(S_JSON_LEDENABLED, data.led.enabled);
103+
104+
// Display
105+
JSON_FLAG(S_JSON_DISPLAYINTERFACE, data.display.enabled);
106+
JSON_INT(S_JSON_DISPLAY_TIMEOUT, data.display.timeout);
107+
108+
str.setCharAt(str.length()-1, '}');
109+
}
110+
111+
// ========== PUBLIC ========== //
112+
void load() {
113+
debugF("Loading settings...");
114+
115+
// read data from eeproms
116+
settings_t newData;
117+
EEPROMHelper::getObject(SETTINGS_ADDR, newData);
118+
119+
// calc and check hash
120+
if (newData.magic_num == MAGIC_NUM) {
121+
data = newData;
122+
data.version.major = DEAUTHER_VERSION_MAJOR;
123+
data.version.minor = DEAUTHER_VERSION_MINOR;
124+
data.version.revision = DEAUTHER_VERSION_REVISION;
125+
debuglnF("OK");
126+
save();
127+
} else {
128+
debuglnF("Invalid Hash");
129+
/*debug(data.magic_num);
130+
debugF(" != ");
131+
debugln(MAGIC_NUM);*/
132+
133+
reset();
134+
save();
135+
}
136+
137+
// check and fix mac
138+
if (!macValid(data.wifi.mac_st)) getRandomMac(data.wifi.mac_st);
139+
if (!macValid(data.wifi.mac_ap)) getRandomMac(data.wifi.mac_ap);
140+
141+
changed = true;
142+
}
143+
144+
void reset() {
145+
data.magic_num = MAGIC_NUM;
146+
147+
data.version.major = DEAUTHER_VERSION_MAJOR;
148+
data.version.minor = DEAUTHER_VERSION_MINOR;
149+
data.version.revision = DEAUTHER_VERSION_REVISION;
150+
151+
data.attack.attack_all_ch = ATTACK_ALL_CH;
152+
data.attack.random_tx = RANDOM_TX;
153+
data.attack.timeout = ATTACK_TIMEOUT;
154+
data.attack.deauths_per_target = DEAUTHS_PER_TARGET;
155+
data.attack.deauth_reason = DEAUTH_REASON;
156+
data.attack.beacon_interval = beacon_interval_t::INTERVAL_100MS;
157+
data.attack.probe_frames_per_ssid = PROBE_FRAMES_PER_SSID;
158+
159+
data.wifi.channel = 1;
160+
getRandomMac(data.wifi.mac_st);
161+
getRandomMac(data.wifi.mac_ap);
162+
163+
data.sniffer.channel_time = CH_TIME;
164+
data.sniffer.min_deauth_frames = MIN_DEAUTH_FRAMES;
165+
166+
strncpy(data.ap.ssid, AP_SSID, 32);
167+
strncpy(data.ap.password, AP_PASSWD, 64);
168+
data.ap.hidden = AP_HIDDEN;
169+
uint8_t ip[4] = AP_IP_ADDR;
170+
memcpy(data.ap.ip, ip, 4);
171+
172+
data.web.enabled = WEB_ENABLED;
173+
data.web.captive_portal = WEB_CAPTIVE_PORTAL;
174+
data.web.use_spiffs = WEB_USE_SPIFFS;
175+
memcpy(data.web.lang, DEFAULT_LANG, 3);
176+
177+
data.cli.enabled = CLI_ENABLED;
178+
data.cli.serial_echo = CLI_ECHO;
179+
180+
data.led.enabled = USE_LED;
181+
182+
data.display.enabled = USE_DISPLAY;
183+
data.display.timeout = DISPLAY_TIMEOUT;
184+
185+
changed = true;
186+
187+
debuglnF("Settings reset to default");
188+
}
189+
190+
void save(bool force) {
191+
if (force || changed) {
192+
EEPROMHelper::saveObject(SETTINGS_ADDR, data);
193+
194+
changed = false;
195+
196+
String json_buffer;
197+
get_json(json_buffer);
198+
199+
if (writeFile(SETTINGS_PATH, json_buffer)) {
200+
debugF("Settings saved in ");
201+
} else {
202+
debugF("ERROR: saving ");
203+
}
204+
205+
debugln(SETTINGS_PATH);
206+
}
207+
}
208+
209+
void print() {
210+
String json_buffer;
211+
get_json(json_buffer);
212+
213+
json_buffer.replace("\":", ": ");
214+
json_buffer.replace(": 0\r\n", ": false\r\n");
215+
json_buffer.replace(": 1\r\n", ": true\r\n");
216+
json_buffer.replace("\"", "");
217+
json_buffer.replace("{", "");
218+
json_buffer.replace("}", "");
219+
json_buffer.replace(",", "\r\n");
220+
221+
debuglnF("[========== Settings ==========]");
222+
debugln(json_buffer);
223+
}
224+
225+
// ===== GETTERS ===== //
226+
227+
const settings_t& getAllSettings() {
228+
return data;
229+
}
230+
231+
const version_t& getVersion() {
232+
return data.version;
233+
}
234+
235+
const autosave_settings_t& getAutosaveSettings() {
236+
return data.autosave;
237+
}
238+
239+
const attack_settings_t& getAttackSettings() {
240+
return data.attack;
241+
}
242+
243+
const wifi_settings_t& getWifiSettings() {
244+
return data.wifi;
245+
}
246+
247+
const sniffer_settings_t& getSnifferSettings() {
248+
return data.sniffer;
249+
}
250+
251+
const access_point_settings_t& getAccessPointSettings() {
252+
return data.ap;
253+
}
254+
255+
const web_settings_t& getWebSettings() {
256+
return data.web;
257+
}
258+
259+
const cli_settings_t& getCLISettings() {
260+
return data.cli;
261+
}
262+
263+
const led_settings_t& getLEDSettings() {
264+
return data.led;
265+
}
266+
267+
const display_settings_t& getDisplaySettings() {
268+
return data.display;
269+
}
270+
271+
// ===== SETTERS ===== //
272+
273+
void setAllSettings(settings_t& newSettings) {
274+
newSettings.version = data.version;
275+
data = newSettings;
276+
changed = true;
277+
}
278+
279+
void setAutosaveSettings(const autosave_settings_t& autosave) {
280+
data.autosave = autosave;
281+
changed = true;
282+
}
283+
284+
void setAttackSettings(const attack_settings_t& attack) {
285+
data.attack = attack;
286+
changed = true;
287+
}
288+
289+
void setWifiSettings(const wifi_settings_t& wifi) {
290+
data.wifi = wifi;
291+
changed = true;
292+
}
293+
294+
void setSnifferSettings(const sniffer_settings_t& sniffer) {
295+
data.sniffer = sniffer;
296+
changed = true;
297+
}
298+
299+
void setAccessPointSettings(const access_point_settings_t& ap) {
300+
data.ap = ap;
301+
changed = true;
302+
}
303+
304+
void setWebSettings(const web_settings_t& web) {
305+
data.web = web;
306+
changed = true;
307+
}
308+
309+
void setCLISettings(const cli_settings_t& cli) {
310+
data.cli = cli;
311+
changed = true;
312+
}
313+
314+
void setLEDSettings(const led_settings_t& led) {
315+
data.led = led;
316+
changed = true;
317+
}
318+
319+
void setDisplaySettings(const display_settings_t& display) {
320+
data.display = display;
321+
changed = true;
322+
}
323+
}

0 commit comments

Comments
 (0)