Save
This commit is contained in:
parent
b6b4786b87
commit
c91ab95a59
64
src/UserDb.h
64
src/UserDb.h
@ -22,7 +22,7 @@ namespace userdb
|
|||||||
{
|
{
|
||||||
// User(unsigned long new_uid): uid(new_uid){}
|
// User(unsigned long new_uid): uid(new_uid){}
|
||||||
unsigned long uid;
|
unsigned long uid;
|
||||||
unsigned int line;
|
uint32_t line;
|
||||||
mutable String first_name;
|
mutable String first_name;
|
||||||
mutable String last_name;
|
mutable String last_name;
|
||||||
mutable String rfid_uid;
|
mutable String rfid_uid;
|
||||||
@ -47,7 +47,7 @@ namespace userdb
|
|||||||
User user_by_pin(String);
|
User user_by_pin(String);
|
||||||
User user_by_rfid(String);
|
User user_by_rfid(String);
|
||||||
User user_by_uid(unsigned long);
|
User user_by_uid(unsigned long);
|
||||||
static User read_csv_line(String &instring, int line, String *match, USERATTRIBUTES attr)
|
static User read_csv_line(String &instring, uint32_t line, String *match, USERATTRIBUTES attr)
|
||||||
{
|
{
|
||||||
int locations[5];
|
int locations[5];
|
||||||
int location_index = 0;
|
int location_index = 0;
|
||||||
@ -87,7 +87,65 @@ namespace userdb
|
|||||||
res.line = line;
|
res.line = line;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
static User read_csv_line(String &instring, uint32_t line)
|
||||||
|
{
|
||||||
|
int locations[5];
|
||||||
|
int location_index = 0;
|
||||||
|
int str_length = instring.length() - 1;
|
||||||
|
for (int i = 0; i < str_length; i++)
|
||||||
|
{
|
||||||
|
if (instring.charAt(i) == ';')
|
||||||
|
{
|
||||||
|
locations[location_index] = i;
|
||||||
|
location_index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
User res;
|
||||||
|
res.rfid_uid = instring.substring(locations[2] + 1, locations[3]);
|
||||||
|
res.user_pin = instring.substring(locations[3] + 1, locations[4]);
|
||||||
|
res.uid = instring.substring(0, locations[0]).toInt();
|
||||||
|
res.first_name = instring.substring(locations[0] + 1, locations[1]);
|
||||||
|
res.last_name = instring.substring(locations[1] + 1, locations[2]);
|
||||||
|
res.enabled = instring.charAt(locations[4] + 1) == '1' ? true : false;
|
||||||
|
res.line = line;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static bool remove_user(User &user)
|
||||||
|
{
|
||||||
|
return remove_user_by_line("userdb.csv", user.line);
|
||||||
|
}
|
||||||
|
static bool remove_user_by_line(const char *file, uint32_t line)
|
||||||
|
{
|
||||||
|
const char *temp_file = ".tmp.csv";
|
||||||
|
File old_db = LittleFS.open(file, "r");
|
||||||
|
File new_db = LittleFS.open(temp_file, "w+");
|
||||||
|
uint32_t curr_line = 0;
|
||||||
|
|
||||||
|
while (old_db.available())
|
||||||
|
{
|
||||||
|
if (curr_line == line)
|
||||||
|
while (old_db.read() != '\n')
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (new_db.position() > 0)
|
||||||
|
new_db.write('\n');
|
||||||
|
old_db.sendUntil(new_db, '\n');
|
||||||
|
}
|
||||||
|
curr_line++;
|
||||||
|
}
|
||||||
|
old_db.close();
|
||||||
|
#ifdef DEBUG
|
||||||
|
new_db.seek(0);
|
||||||
|
while (new_db.available())
|
||||||
|
new_db.sendAvailable(Serial);
|
||||||
|
#endif
|
||||||
|
new_db.close();
|
||||||
|
LittleFS.remove(file);
|
||||||
|
LittleFS.rename(temp_file, file);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
struct Iterator
|
struct Iterator
|
||||||
{
|
{
|
||||||
using iterator_category = std::input_iterator_tag;
|
using iterator_category = std::input_iterator_tag;
|
||||||
@ -156,7 +214,7 @@ namespace userdb
|
|||||||
USERATTRIBUTES filter_attr;
|
USERATTRIBUTES filter_attr;
|
||||||
String *match;
|
String *match;
|
||||||
bool available = true;
|
bool available = true;
|
||||||
unsigned int line = 0;
|
uint32_t line = 0;
|
||||||
};
|
};
|
||||||
Iterator begin() { return Iterator(LittleFS.open("userdb.csv", "r")); }
|
Iterator begin() { return Iterator(LittleFS.open("userdb.csv", "r")); }
|
||||||
Iterator begin_with_filter(String *match, USERATTRIBUTES attr) { return Iterator(LittleFS.open("userdb.csv", "r"), match, attr); }
|
Iterator begin_with_filter(String *match, USERATTRIBUTES attr) { return Iterator(LittleFS.open("userdb.csv", "r"), match, attr); }
|
||||||
|
@ -47,6 +47,7 @@ void setup()
|
|||||||
keyboard.begin(&Wire);
|
keyboard.begin(&Wire);
|
||||||
rfid.begin();
|
rfid.begin();
|
||||||
iface.begin(&keyboard);
|
iface.begin(&keyboard);
|
||||||
|
userdatabase.remove_user_by_line("userdb.csv",2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
@ -56,21 +57,27 @@ void loop()
|
|||||||
userdb::User login_user;
|
userdb::User login_user;
|
||||||
if (iface.pinAvailable())
|
if (iface.pinAvailable())
|
||||||
{
|
{
|
||||||
|
unsigned long delta = millis();
|
||||||
login_user = userdatabase.user_by_pin(iface.getPin());
|
login_user = userdatabase.user_by_pin(iface.getPin());
|
||||||
|
Serial.println("Query duration: " +String(millis()-delta));
|
||||||
if (login_user.enabled == false)
|
if (login_user.enabled == false)
|
||||||
{
|
{
|
||||||
iface.showMessage("Login failed!", "-> Pin incorrect", 3000);
|
iface.showMessage("Login failed!", "-> Pin incorrect", 3000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (rfid.available())
|
else if (rfid.available())
|
||||||
{
|
{
|
||||||
|
unsigned long delta = millis();
|
||||||
login_user = userdatabase.user_by_rfid(rfid.getID());
|
login_user = userdatabase.user_by_rfid(rfid.getID());
|
||||||
|
Serial.println("Query duration: " +String(millis()-delta));
|
||||||
if (login_user.enabled == false)
|
if (login_user.enabled == false)
|
||||||
{
|
{
|
||||||
iface.showMessage("Login failed!", "-> Unkown Card", 3000);
|
iface.showMessage("Login failed!", "-> Unkown Card", 3000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (login_user.enabled == true)
|
if (login_user.enabled == true)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user