302 lines
6.6 KiB
C++
302 lines
6.6 KiB
C++
#include "SSIDs.h"
|
|
|
|
SSIDs::SSIDs() {
|
|
list = new LinkedList<SSID>;
|
|
}
|
|
|
|
void SSIDs::load() {
|
|
internal_removeAll();
|
|
DynamicJsonBuffer jsonBuffer(4000);
|
|
|
|
checkFile(FILE_PATH, str(SS_JSON_DEFAULT));
|
|
JsonObject &obj = parseJSONFile(FILE_PATH, jsonBuffer);
|
|
JsonArray &arr = obj.get<JsonArray>(str(SS_JSON_SSIDS));
|
|
|
|
for (int i = 0; i < arr.size() && i < SSID_LIST_SIZE; i++) {
|
|
JsonArray &tmpArray = arr.get<JsonVariant>(i);
|
|
internal_add(tmpArray.get<String>(0), tmpArray.get<bool>(1), tmpArray.get<int>(2));
|
|
}
|
|
|
|
prnt(SS_LOADED);
|
|
prntln(FILE_PATH);
|
|
}
|
|
|
|
void SSIDs::load(String filepath) {
|
|
String tmp = FILE_PATH;
|
|
FILE_PATH = filepath;
|
|
load();
|
|
FILE_PATH = tmp;
|
|
}
|
|
|
|
void SSIDs::removeAll() {
|
|
internal_removeAll();
|
|
prntln(SS_CLEARED);
|
|
changed = true;
|
|
}
|
|
|
|
void SSIDs::save(bool force) {
|
|
if (!force && !changed) return;
|
|
|
|
String buf = String(); // create buffer
|
|
buf += String(OPEN_CURLY_BRACKET) + String(DOUBLEQUOTES) + str(SS_JSON_RANDOM) + String(DOUBLEQUOTES) + String(DOUBLEPOINT) + b2s(randomMode) + String(COMMA); // {"random":false,
|
|
buf += String(DOUBLEQUOTES) + str(SS_JSON_SSIDS) + String(DOUBLEQUOTES) + String(DOUBLEPOINT) + String(OPEN_BRACKET); // "ssids":[
|
|
|
|
if (!writeFile(FILE_PATH, buf)) {
|
|
prnt(SS_ERROR_SAVING);
|
|
prntln(FILE_PATH);
|
|
return;
|
|
}
|
|
buf = String(); // clear buffer
|
|
|
|
String name;
|
|
int size = list->size();
|
|
|
|
for (int i = 0; i < size; i++) {
|
|
name = escape(getName(i));
|
|
|
|
buf += String(OPEN_BRACKET) + String(DOUBLEQUOTES) + name + String(DOUBLEQUOTES) + String(COMMA); // ["name",
|
|
buf += b2s(getWPA2(i)) + String(COMMA); // false,
|
|
buf += String(getLen(i)) + String(CLOSE_BRACKET); // 12]
|
|
if(i<size-1) buf += COMMA; // ,
|
|
|
|
if(buf.length() >= 1024){
|
|
if (!appendFile(FILE_PATH, buf)) {
|
|
prnt(SS_ERROR_SAVING);
|
|
prntln(FILE_PATH);
|
|
return;
|
|
}
|
|
|
|
buf = String(); // clear buffer
|
|
}
|
|
}
|
|
|
|
buf += String(CLOSE_BRACKET) + String(CLOSE_CURLY_BRACKET); // ]}
|
|
|
|
if (!appendFile(FILE_PATH, buf)) {
|
|
prnt(SS_ERROR_SAVING);
|
|
prntln(FILE_PATH);
|
|
return;
|
|
}
|
|
|
|
prnt(SS_SAVED_IN);
|
|
prntln(FILE_PATH);
|
|
changed = false;
|
|
}
|
|
|
|
void SSIDs::save(bool force, String filepath) {
|
|
String tmp = FILE_PATH;
|
|
FILE_PATH = filepath;
|
|
save(force);
|
|
FILE_PATH = tmp;
|
|
}
|
|
|
|
void SSIDs::update() {
|
|
if (randomMode) {
|
|
if (currentTime - randomTime > randomInterval*1000) {
|
|
prntln(SS_RANDOM_INFO);
|
|
|
|
for (int i = 0; i < SSID_LIST_SIZE; i++) {
|
|
SSID newSSID;
|
|
|
|
if (check(i)) newSSID = list->get(i);
|
|
|
|
newSSID.name = String();
|
|
newSSID.len = 32;
|
|
for (int i = 0; i < 32; i++)
|
|
newSSID.name += char(random(32, 127));
|
|
|
|
newSSID.wpa2 = random(0, 2);
|
|
|
|
if (check(i)) list->set(i, newSSID);
|
|
else list->add(newSSID);
|
|
}
|
|
|
|
randomTime = currentTime;
|
|
changed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
String SSIDs::getName(int num) {
|
|
return check(num) ? list->get(num).name : String();
|
|
}
|
|
|
|
bool SSIDs::getWPA2(int num) {
|
|
return check(num) ? list->get(num).wpa2 : false;
|
|
}
|
|
|
|
int SSIDs::getLen(int num){
|
|
return check(num) ? list->get(num).len : 0;
|
|
}
|
|
|
|
void SSIDs::setWPA2(int num, bool wpa2) {
|
|
SSID newSSID = list->get(num);
|
|
newSSID.wpa2 = wpa2;
|
|
list->set(num, newSSID);
|
|
}
|
|
|
|
String SSIDs::getEncStr(int num) {
|
|
if (getWPA2(num)) return "WPA2";
|
|
else return "-";
|
|
}
|
|
|
|
void SSIDs::remove(int num) {
|
|
if (!check(num)) return;
|
|
internal_remove(num);
|
|
prnt(SS_REMOVED);
|
|
prntln(getName(num));
|
|
changed = true;
|
|
}
|
|
|
|
String SSIDs::randomize(String name) {
|
|
int ssidlen = name.length();
|
|
if (ssidlen > 32) name = name.substring(0, 32);
|
|
if (ssidlen < 32) {
|
|
for (int i = ssidlen; i < 32; i++) {
|
|
int rnd = random(3);
|
|
if (i < 29 && rnd == 0) { // ZERO WIDTH SPACE
|
|
name += char(0xE2);
|
|
name += char(0x80);
|
|
name += char(0x8B);
|
|
i += 2;
|
|
} else if (i < 30 && rnd == 1) { // NO-BREAK SPACE
|
|
name += char(0xC2);
|
|
name += char(0xA0);
|
|
i += 1;
|
|
} else {
|
|
name += char(0x20); // SPACE
|
|
}
|
|
}
|
|
}
|
|
return name;
|
|
}
|
|
|
|
void SSIDs::add(String name, bool wpa2, int clones, bool force) {
|
|
if (list->size() >= SSID_LIST_SIZE) {
|
|
if (force) {
|
|
internal_remove(0);
|
|
} else {
|
|
prntln(SS_ERROR_FULL);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (clones > SSID_LIST_SIZE) clones = SSID_LIST_SIZE;
|
|
|
|
for (int i = 0; i < clones; i++) {
|
|
internal_add(name, wpa2, name.length());
|
|
if (list->size() > SSID_LIST_SIZE) internal_remove(0);
|
|
}
|
|
|
|
prnt(SS_ADDED);
|
|
prntln(name);
|
|
changed = true;
|
|
}
|
|
|
|
void SSIDs::cloneSelected(bool force){
|
|
if(accesspoints.selected() > 0){
|
|
int clones = SSID_LIST_SIZE;
|
|
if(!force) clones -= list->size();
|
|
clones /= accesspoints.selected();
|
|
|
|
int apCount = accesspoints.count();
|
|
for(int i=0;i<apCount;i++){
|
|
if(accesspoints.getSelected(i))
|
|
add(accesspoints.getSSID(i), accesspoints.getEnc(i) != 0, clones, force);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool SSIDs::getRandom(){
|
|
return randomMode;
|
|
}
|
|
|
|
void SSIDs::replace(int num, String name, bool wpa2){
|
|
if(!check(num)) return;
|
|
|
|
int len = name.length();
|
|
if(len > 32) len = 32;
|
|
list->set(num,SSID{randomize(name),wpa2,(uint8_t)len});
|
|
|
|
prnt(SS_REPLACED);
|
|
prntln(name);
|
|
changed = true;
|
|
}
|
|
|
|
void SSIDs::print(int num) {
|
|
print(num, true, false);
|
|
}
|
|
|
|
void SSIDs::print(int num, bool header, bool footer) {
|
|
if (!check(num)) return;
|
|
if (header) {
|
|
prntln(SS_TABLE_HEADER);
|
|
prntln(SS_TABLE_DIVIDER);
|
|
}
|
|
|
|
prnt(buildString(String(), (String)num, 2));
|
|
prnt(buildString(String(SPACE), getEncStr(num), 5));
|
|
prntln(buildString(String(SPACE) + getName(num), String(), 33));
|
|
|
|
if (footer) prntln(SS_TABLE_DIVIDER);
|
|
}
|
|
|
|
void SSIDs::printAll() {
|
|
prntln(SS_HEADER);
|
|
if (list->size() == 0)
|
|
prntln(SS_ERROR_EMPTY);
|
|
else
|
|
for (int i = 0; i < list->size(); i++)
|
|
print(i, i == 0, i == list->size() - 1);
|
|
}
|
|
|
|
int SSIDs::count() {
|
|
return list->size();
|
|
}
|
|
|
|
bool SSIDs::check(int num) {
|
|
return num >= 0 && num < list->size();
|
|
}
|
|
|
|
void SSIDs::enableRandom(uint32_t randomInterval) {
|
|
randomMode = true;
|
|
SSIDs::randomInterval = randomInterval;
|
|
prntln(SS_RANDOM_ENABLED);
|
|
update();
|
|
}
|
|
|
|
void SSIDs::disableRandom() {
|
|
randomMode = false;
|
|
internal_removeAll();
|
|
prntln(SS_RANDOM_DISABLED);
|
|
}
|
|
|
|
void SSIDs::internal_add(String name, bool wpa2, int len) {
|
|
if(len > 32) {
|
|
name = name.substring(0,32);
|
|
len = 32;
|
|
} else if (len < 32) {
|
|
name = randomize(name);
|
|
}
|
|
|
|
name = fixUtf8(name);
|
|
|
|
SSID newSSID;
|
|
newSSID.name = name;
|
|
newSSID.wpa2 = wpa2;
|
|
newSSID.len = (uint8_t)len;
|
|
|
|
list->add(newSSID);
|
|
}
|
|
|
|
void SSIDs::internal_remove(int num) {
|
|
list->remove(num);
|
|
}
|
|
|
|
void SSIDs::internal_removeAll() {
|
|
list->clear();
|
|
}
|
|
|
|
|
|
|