Merged FileBasedUser into User.

This commit is contained in:
Relintai 2021-08-22 13:30:58 +02:00
parent 1ff328a3e6
commit 381df9b487
6 changed files with 114 additions and 196 deletions

View File

@ -1,118 +0,0 @@
#include "file_based_user.h"
#include "rapidjson/document.h"
#include "rapidjson/filewritestream.h"
#include "rapidjson/rapidjson.h"
#include "user_manager.h"
#include <rapidjson/writer.h>
#include <tinydir/tinydir.h>
#include <cstdio>
std::string FileBasedUser::get_path() {
return _path;
}
void FileBasedUser::set_path(const std::string &path) {
_path = path;
if (_path.size() > 0) {
if (_path[_path.size() - 1] != '/') {
_path += '/';
}
}
}
void FileBasedUser::save() {
}
void FileBasedUser::load(const std::string &p_name) {
//todo sanitize name!
//_file_path = _path + p_name;
//load();
}
void FileBasedUser::load() {
unregister_sessions();
FILE *f = fopen(_file_path.c_str(), "r");
if (!f) {
printf("FileBasedUser::load: Error opening file! %s\n", _file_path.c_str());
return;
}
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET); // same as rewind(f);
std::string fd;
fd.resize(fsize);
fread(&fd[0], 1, fsize, f);
fclose(f);
rapidjson::Document data;
data.Parse(fd.c_str());
rapidjson::Value uobj = data.GetObject();
set_id(uobj["id"].GetInt());
_nameui = uobj["name"].GetString();
_emailui = uobj["email"].GetString();
_rank = uobj["rank"].GetInt();
_pre_salt = uobj["pre_salt"].GetString();
_post_salt = uobj["post_salt"].GetString();
_password_hash = uobj["password_hash"].GetString();
_banned = uobj["banned"].GetBool();
_password_reset_token = uobj["password_reset_token"].GetString();
_locked = uobj["locked"].GetBool();
const rapidjson::Value &sess = uobj["sessions"].GetArray();
for (rapidjson::Value::ConstValueIterator itr = sess.Begin(); itr != sess.End(); ++itr) {
_sessions.push_back(itr->GetString());
}
register_sessions();
}
void FileBasedUser::load_all() {
tinydir_dir dir;
if (tinydir_open(&dir, _path.c_str()) == -1) {
return;
}
while (dir.has_next) {
tinydir_file file;
if (tinydir_readfile(&dir, &file) == -1) {
tinydir_next(&dir);
continue;
}
if (!file.is_dir) {
std::string np = file.path;
np = np.substr(_path.size(), np.size() - _path.size());
FileBasedUser *u = new FileBasedUser();
u->load(np);
UserManager::get_singleton()->add_user(u);
}
tinydir_next(&dir);
}
tinydir_close(&dir);
}
FileBasedUser::FileBasedUser() :
User() {
}
FileBasedUser::~FileBasedUser() {
}
std::string FileBasedUser::_path = "./";

View File

@ -1,26 +0,0 @@
#ifndef FILE_BASED_USER_H
#define FILE_BASED_USER_H
#include "user.h"
class FileBasedUser : public User {
public:
static std::string get_path();
static void set_path(const std::string &path);
void save();
void load(const std::string &p_name);
void load();
static void load_all();
FileBasedUser();
~FileBasedUser();
protected:
std::string _file_path;
static std::string _path;
};
#endif

View File

@ -1,26 +0,0 @@
#include "file_based_user_manager.h"
#include "file_based_user.h"
User *FileBasedUserManager::create_user() {
User *u = new FileBasedUser();
return u;
}
void FileBasedUserManager::load_all() {
FileBasedUser::load_all();
}
void FileBasedUserManager::set_path(const std::string &path) {
FileBasedUser::set_path(path);
}
FileBasedUserManager::FileBasedUserManager() :
UserManager() {
printf("Using FileBasedUserManager. Note: Please DON'T USE THIS IN PRODUCTION IT'S NOT SAFE FOR THAT!\n");
}
FileBasedUserManager::~FileBasedUserManager() {
}

View File

@ -1,24 +0,0 @@
#ifndef FILE_BASED_USER_MANAGER_H
#define FILE_BASED_USER_MANAGER_H
#include "core/object.h"
#include "user_manager.h"
class User;
class FileBasedUserManager : public UserManager {
public:
virtual User *create_user();
void load_all();
void set_path(const std::string &path);
FileBasedUserManager();
~FileBasedUserManager();
protected:
};
#endif

View File

@ -4,6 +4,10 @@
#include "rapidjson/rapidjson.h" #include "rapidjson/rapidjson.h"
#include "rapidjson/stringbuffer.h" #include "rapidjson/stringbuffer.h"
#include <rapidjson/writer.h> #include <rapidjson/writer.h>
#include "rapidjson/document.h"
#include "user_manager.h"
#include <tinydir/tinydir.h>
#include <cstdio>
#include "core/hash/sha256.h" #include "core/hash/sha256.h"
#include "core/html/form_validator.h" #include "core/html/form_validator.h"
@ -688,13 +692,85 @@ void User::create_validators() {
} }
} }
void User::file_save() {
}
void User::file_load() {
FILE *f = fopen(_file_path.c_str(), "r");
if (!f) {
printf("FileBasedUser::load: Error opening file! %s\n", _file_path.c_str());
return;
}
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET); // same as rewind(f);
std::string fd;
fd.resize(fsize);
fread(&fd[0], 1, fsize, f);
fclose(f);
from_json(fd);
}
void User::file_ensure_directory_exist() {
}
std::string User::file_get_base_path() {
return _path;
}
void User::file_load_all() {
tinydir_dir dir;
if (tinydir_open(&dir, _path.c_str()) == -1) {
return;
}
while (dir.has_next) {
tinydir_file file;
if (tinydir_readfile(&dir, &file) == -1) {
tinydir_next(&dir);
continue;
}
if (!file.is_dir) {
std::string np = file.path;
np = np.substr(_path.size(), np.size() - _path.size());
User *u = new User();
u->load(np);
UserManager::get_singleton()->add_user(u);
}
tinydir_next(&dir);
}
tinydir_close(&dir);
}
std::string User::file_get_path() {
return _path;
}
void User::file_set_path(const std::string &path) {
_path = path;
if (_path.size() > 0) {
if (_path[_path.size() - 1] != '/') {
_path += '/';
}
}
}
std::string User::to_json(rapidjson::Document *into) { std::string User::to_json(rapidjson::Document *into) {
rapidjson::Document *document; rapidjson::Document *document;
if (into) { if (into) {
document = into; document = into;
} else { } else {
document = new rapidjson::Document(); document = new rapidjson::Document();
} }
document->SetObject(); document->SetObject();
@ -734,8 +810,30 @@ std::string User::to_json(rapidjson::Document *into) {
return s; return s;
} }
void User::from_json(const std::string &data) { void User::from_json(const std::string &p_data) {
rapidjson::Document data;
data.Parse(p_data.c_str());
rapidjson::Value uobj = data.GetObject();
set_id(uobj["id"].GetInt());
_nameui = uobj["name"].GetString();
_emailui = uobj["email"].GetString();
_rank = uobj["rank"].GetInt();
_pre_salt = uobj["pre_salt"].GetString();
_post_salt = uobj["post_salt"].GetString();
_password_hash = uobj["password_hash"].GetString();
_banned = uobj["banned"].GetBool();
_password_reset_token = uobj["password_reset_token"].GetString();
_locked = uobj["locked"].GetBool();
const rapidjson::Value &sess = uobj["sessions"].GetArray();
for (rapidjson::Value::ConstValueIterator itr = sess.Begin(); itr != sess.End(); ++itr) {
_sessions.push_back(itr->GetString());
}
} }
User::User() : User::User() :
@ -753,3 +851,5 @@ User::~User() {
FormValidator *User::_login_validator = nullptr; FormValidator *User::_login_validator = nullptr;
FormValidator *User::_registration_validator = nullptr; FormValidator *User::_registration_validator = nullptr;
FormValidator *User::_profile_validator = nullptr; FormValidator *User::_profile_validator = nullptr;
std::string User::_path = "./";

View File

@ -72,6 +72,14 @@ public:
void register_sessions(); void register_sessions();
void unregister_sessions(); void unregister_sessions();
void file_save();
void file_load();
void file_ensure_directory_exist();
std::string file_get_base_path();
static void file_load_all();
static std::string file_get_path();
static void file_set_path(const std::string &path);
std::string to_json(rapidjson::Document *into = nullptr); std::string to_json(rapidjson::Document *into = nullptr);
void from_json(const std::string &data); void from_json(const std::string &data);
@ -93,6 +101,10 @@ protected:
static FormValidator *_login_validator; static FormValidator *_login_validator;
static FormValidator *_registration_validator; static FormValidator *_registration_validator;
static FormValidator *_profile_validator; static FormValidator *_profile_validator;
std::string _file_path;
static std::string _path;
}; };
#endif #endif