Skip to content

Commit dae90a5

Browse files
committed
Added examples
No need to specify file to save settings Added tokenLifespan for checking if it's expired Removed decryption error (it will fail anyway) Removed header that verified successful decryption (it will wail anyway and gives known good pattern) Moved strings to flash Added some examples
1 parent 008e618 commit dae90a5

9 files changed

Lines changed: 377 additions & 48 deletions

File tree

README.md

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,27 @@
11
# settingsManager
2-
Handler for ESP8266 settings such as WiFi, NTP and update server
2+
Handler for ESP8266 settings such as WiFi, NTP and update server.
3+
It's meant to be an universal, secure toolbox.
4+
5+
## Features
6+
7+
* Handling WiFi connection
8+
* Configuring AP
9+
* Storing your server's login and password
10+
* Cookie-based authentication ready
11+
* Integrated unique key generator:
12+
* Device-specific key
13+
* Encrypted with Vigenere's cipher
14+
* Expiration time checked on server
15+
* Saving and loading from SPIFFS
16+
* Handling OTA and HTTP updates
17+
18+
## Examples
19+
* basicAuth - simple authentication using HTTP server
20+
* basicConfiguration - configuring everything on the device
21+
* connectToWiFi - how to connect to the WiFi
22+
* cookieAuth - cookie based authentication example using
23+
* keyTesting - a bunch of tests for key generator
24+
* OTAUpdateConfiguration - how to configure OTA update service
25+
* saveToSPIFFS - saving and loading settings
26+
* setUpAP - configure Access Point
27+
* updateServerConfiguration - how to configure default HTTP update server

examples/basicAuth/basicAuth.ino

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#include <settingsManager.h>
2+
#include <ESP8266WebServer.h>
3+
4+
settingsManager settings;
5+
ESP8266WebServer server;
6+
7+
/* Remember that passwords stored in global variables aren't very safe */
8+
const char* username = "admin";
9+
const char* password = "admin";
10+
const char* ssid = "";
11+
const char* wifipass = "";
12+
13+
void setup() {
14+
Serial.begin(115200);
15+
Serial.println();
16+
17+
Serial.println("Configuring device...");
18+
settings.configUser(username, password);
19+
settings.configSTA(ssid, wifipass);
20+
21+
server.on("/", handleRoot);
22+
server.begin();
23+
24+
if (settings.beginSTA()) {
25+
Serial.print("Connected to ");
26+
Serial.println(ssid);
27+
Serial.print("Connect to ");
28+
Serial.println(WiFi.localIP());
29+
} else {
30+
Serial.print("Could not connect to");
31+
Serial.println(ssid);
32+
delay(1000);
33+
ESP.reset();
34+
}
35+
}
36+
37+
void handleRoot() {
38+
/* Check if we're logged in */
39+
if (!settings.webAuthenticate(&server))
40+
return server.requestAuthentication();
41+
42+
server.sendContent(F("<html><head><title>ESP8266 Server</title>"));
43+
server.sendContent(F("</head><body><h1>You have successfully lo"));
44+
server.sendContent(F("gged in!</h1></body></html>"));
45+
}
46+
47+
void loop() {
48+
server.handleClient();
49+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include <settingsManager.h>
2+
3+
settingsManager settings;
4+
5+
const char* ssid = "";
6+
const char* wifipass = "";
7+
8+
void setup() {
9+
Serial.begin(115200);
10+
Serial.println();
11+
12+
Serial.println("Configuring device...");
13+
settings.configSTA(ssid, wifipass);
14+
15+
if (settings.beginSTA()) {
16+
Serial.print("Connected to ");
17+
Serial.println(ssid);
18+
Serial.print("Connect to ");
19+
Serial.println(WiFi.localIP());
20+
} else {
21+
Serial.print("Could not connect to");
22+
Serial.println(ssid);
23+
delay(1000);
24+
ESP.reset();
25+
}
26+
}
27+
28+
void loop() {
29+
}

examples/keyTesting/keyTesting.ino

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
#include <settingsManager.h>
2+
3+
/*
4+
This sketch is used to test library crypto capacibilities.
5+
All printable ASCII input is supported.
6+
Any whitespace characters are prohibited and will return an error.
7+
*/
8+
9+
/* Basic setup only for purpose of generating test keys */
10+
const char* _name = "Testbench";
11+
const char* _user = "username";
12+
const char* _password = "password";
13+
14+
/*
15+
Kind of canary. It's intended to use with time, but any value
16+
that changes is fine.
17+
In case of using custom generated number set tokenLifespan to 0
18+
*/
19+
const uint32_t validityBase = 100;
20+
const String _chipID = String(ESP.getChipId(), HEX);
21+
String _expiry;
22+
23+
settingsManager settings;
24+
25+
void setup() {
26+
Serial.begin(115200);
27+
Serial.println("Encryption test");
28+
29+
/* Configuring settings */
30+
#ifdef DEBUG_INSECURE
31+
settings.serialDebug(&Serial);
32+
#endif
33+
settings.name(_name);
34+
settings.configUser(_user, _password);
35+
settings.tokenLifespan = 10;
36+
_expiry = String(settings.tokenLifespan);
37+
38+
/* First, let's check if it en- and decrypts correctly */
39+
40+
String enc = settings.encryptKey(validityBase);
41+
Serial.print("Generated key:\t\t");
42+
Serial.println(enc);
43+
44+
String dec = settings.decryptKey(enc);
45+
Serial.print("Valid decrypted key:\t");
46+
Serial.println(dec);
47+
48+
Serial.print("Encrypting key:\t\t");
49+
Serial.println(settings.validateEncryptedKey(enc, validityBase) == 0 ? "Pass" : "Fail");
50+
51+
Serial.print("Decrypting key:\t\t");
52+
Serial.println(performTest(&settings, dec, validityBase, 0) ? "Pass" : "Fail");
53+
54+
String test = dec;
55+
test[test.length() - 2] = ' ';
56+
Serial.print("White characters:\t");
57+
Serial.println(performTest(&settings, test, validityBase, 1) ? "Pass" : "Fail");
58+
59+
Serial.print("No timestamp:\t\t");
60+
test = _name + String("++") + _chipID + String("+") + _expiry;
61+
Serial.println(performTest(&settings, test, validityBase, 2) ? "Pass" : "Fail");
62+
63+
test = _name + String("+") + String(validityBase) + String("+") + _chipID + String("+") + _expiry;
64+
test[strlen(_name) + 2] = 'a';
65+
Serial.print("Conversion error:\t");
66+
Serial.println(performTest(&settings, test, validityBase, 2) ? "Pass" : "Fail");
67+
68+
test = _name + String("+") + String(validityBase) + String("+") + _chipID + String("+") + _expiry;
69+
test += 'a';
70+
Serial.print("Conversion error 2:\t");
71+
Serial.println(performTest(&settings, test, validityBase, 2) ? "Pass" : "Fail");
72+
73+
test = _name + String("+") + String(validityBase) + String("+") + _chipID + String("+a") + _expiry;
74+
test += 'a';
75+
Serial.print("Conversion error 3:\t");
76+
Serial.println(performTest(&settings, test, validityBase, 2) ? "Pass" : "Fail");
77+
78+
test = _name + String("+") + String(validityBase) + String("+") + _chipID + String("+");
79+
Serial.print("No token lifespan:\t");
80+
Serial.println(performTest(&settings, test, validityBase, 2) ? "Pass" : "Fail");
81+
82+
test = _name + String("+") + String(validityBase) + String("+") + _chipID + String("+") + _expiry;
83+
test[strlen(_name) - 1] = '!';
84+
Serial.print("Invalid name:\t\t");
85+
Serial.println(performTest(&settings, test, validityBase, 3) ? "Pass" : "Fail");
86+
87+
test = String(_name).substring(1) + String("+") + String(validityBase) + String("+") + _chipID + String("+") + _expiry;
88+
Serial.print("Invalid name length:\t");
89+
Serial.println(performTest(&settings, test, validityBase, 3) ? "Pass" : "Fail");
90+
91+
test = String("+") + String(validityBase) + String("+") + _chipID + String("+") + _expiry;
92+
Serial.print("No name:\t\t");
93+
Serial.println(performTest(&settings, test, validityBase, 3) ? "Pass" : "Fail");
94+
95+
test = _name + String("+") + String(validityBase) + String("+") + _chipID.substring(1) + String("+") + _expiry;
96+
Serial.print("Invalid chip id length:\t");
97+
Serial.println(performTest(&settings, test, validityBase, 4) ? "Pass" : "Fail");
98+
99+
test = _name + String("+") + String(validityBase) + String("+FFFFF+") + _expiry;
100+
Serial.print("Invalid chip id:\t");
101+
Serial.println(performTest(&settings, test, validityBase, 4) ? "Pass" : "Fail");
102+
103+
test = _name + String("+") + String(validityBase) + String("+z") + _chipID.substring(1) + String("+") + _expiry;
104+
Serial.print("Invalid chip id 2:\t");
105+
Serial.println(performTest(&settings, test, validityBase, 4) ? "Pass" : "Fail");
106+
107+
test = _name + String("+") + String(validityBase) + String("+") + _chipID.substring(0, _chipID.length() - 2) + String("A+") + _expiry;
108+
Serial.print("Invalid chip id 3:\t");
109+
Serial.println(performTest(&settings, test, validityBase, 4) ? "Pass" : "Fail");
110+
111+
test = _name + String("+") + String(validityBase) + String("++") + _expiry;
112+
Serial.print("No chip id:\t\t");
113+
Serial.println(performTest(&settings, test, validityBase, 4) ? "Pass" : "Fail");
114+
115+
test = dec;
116+
Serial.print("Invalid time:\t\t");
117+
Serial.println(performTest(&settings, test, validityBase + (settings.tokenLifespan * 2), 5) ? "Pass" : "Fail");
118+
119+
Serial.print("Invalid time 2:\t\t");
120+
Serial.println(performTest(&settings, test, validityBase - (settings.tokenLifespan * 2), 5) ? "Pass" : "Fail");
121+
}
122+
123+
/* Try to use pointers whenever you can. It's really memory-consuming */
124+
bool performTest(settingsManager* set, String test, uint32_t t, uint8_t code) {
125+
return (set->validateKey(test, t) == code);
126+
}
127+
128+
void loop() {}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#include <settingsManager.h>
2+
#include "FS.h"
3+
4+
/*
5+
Simple example of saving/loading config
6+
What is saved:
7+
- Name
8+
- Login and password
9+
- AP ssid and password
10+
- WiFi ssid and password
11+
- IP settings
12+
- DHCP settings
13+
- NTP settings
14+
- Auth token lifespan
15+
- 'Some' interval (generic purpose)
16+
- Time of last NTP update (set manually)
17+
18+
*/
19+
20+
/* Remember name shouldn't contain space */
21+
const char* _name = "DemoName";
22+
23+
void setup() {
24+
Serial.begin(115200);
25+
Serial.println();
26+
SPIFFS.begin();
27+
28+
/* Creating an object with filename allows it to be saved */
29+
Serial.println("Creating settings object");
30+
settingsManager settings("/testFile.txt");
31+
Serial.print("Setting name ");
32+
settings.name(_name);
33+
Serial.println(settings.name());
34+
settings.save();
35+
36+
/* Load new settings */
37+
Serial.println("Creating new settings object");
38+
settingsManager settings2("/testFile.txt");
39+
Serial.println("Loading settings...");
40+
bool loadStatus = settings2.load();
41+
if (loadStatus) {
42+
Serial.print("Device name is ");
43+
Serial.println(settings2.name());
44+
} else {
45+
Serial.println("Unable to load settings");
46+
}
47+
48+
SPIFFS.end();
49+
}
50+
51+
void loop() {
52+
53+
}

examples/setUpAP/setUpAP.ino

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include <settingsManager.h>
2+
3+
settingsManager settings;
4+
5+
const char* ssid = "AccessPointDemo";
6+
const char* wifipass = "password";
7+
8+
void setup() {
9+
Serial.begin(115200);
10+
Serial.println();
11+
12+
Serial.println("Configuring device...");
13+
settings.configAP(ssid, wifipass);
14+
15+
if (settings.beginAP()) {
16+
Serial.print("Connected to ");
17+
Serial.println(ssid);
18+
Serial.print("Gateway: ");
19+
Serial.println(WiFi.localIP());
20+
} else {
21+
Serial.print("Could not start Access Point");
22+
Serial.println(ssid);
23+
delay(1000);
24+
ESP.reset();
25+
}
26+
}
27+
28+
void loop() {
29+
}

keywords.txt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ useDHCP KEYWORD2
1111
name KEYWORD2
1212
configUser KEYWORD2
1313
authenticate KEYWORD2
14-
beginWiFi KEYWORD2
14+
beginSTA KEYWORD2
1515
beginAP KEYWORD2
1616
ntpServer KEYWORD2
1717
configUpdateServer KEYWORD2
@@ -34,4 +34,9 @@ stringToIP KEYWORD2
3434
serialDebug KEYWORD2
3535
printConfigFile KEYWORD2
3636
printConfig KEYWORD2
37-
readInterval KEYWORD2
37+
readInterval KEYWORD2
38+
validateKey KEYWORD2
39+
validateEncryptedKey KEYWORD2
40+
encryptKey KEYWORD2
41+
decryptKey KEYWORD2
42+
tokenLifespan KEYWORD2

0 commit comments

Comments
 (0)