fixed env.sqlite not saving bug

master
jachoo 2012-02-20 02:47:45 +01:00
parent b384d9226f
commit 6b633307de
6 changed files with 42 additions and 34 deletions

View File

@ -121,7 +121,7 @@ AuthManager::AuthManager(Database* database, const std::string& authfilepath):
{ {
m_mutex.Init(); m_mutex.Init();
if(m_database!=NULL)init(database); if(m_database!=NULL)init();
} }
AuthManager::~AuthManager() AuthManager::~AuthManager()
@ -131,11 +131,13 @@ AuthManager::~AuthManager()
void AuthManager::init(Database* database, const std::string& authfilepath) void AuthManager::init(Database* database, const std::string& authfilepath)
{ {
JMutexAutoLock lock(m_mutex);
if(database!=NULL) m_database = database; if(database!=NULL) m_database = database;
if(authfilepath!="") m_authfilepath = authfilepath; if(authfilepath!="") m_authfilepath = authfilepath;
assert(m_database!=NULL); assert(m_database!=NULL);
m_authtable = &database->getTable<std::string,std::string>("auth"); m_authtable = &m_database->getTable<std::string,std::string>("auth");
try{ try{
load(); load();

View File

@ -90,7 +90,7 @@ class AuthManager
public: public:
AuthManager(Database* database = NULL, const std::string& file = ""); AuthManager(Database* database = NULL, const std::string& file = "");
~AuthManager(); ~AuthManager();
void init(Database* database, const std::string& file = ""); void init(Database* database = NULL, const std::string& file = "");
void load(); void load();
void save(); void save();
bool exists(const std::string &username); bool exists(const std::string &username);

View File

@ -44,11 +44,13 @@ BanManager::~BanManager()
void BanManager::init(Database* database, const std::string& file) void BanManager::init(Database* database, const std::string& file)
{ {
JMutexAutoLock lock(m_mutex);
if(database!=NULL)m_database = database; if(database!=NULL)m_database = database;
if(file!="")m_banfilepath = file; if(file!="")m_banfilepath = file;
assert(m_database != NULL); assert(m_database != NULL);
m_bantable = &database->getTable<std::string,std::string>("ipban"); m_bantable = &m_database->getTable<std::string,std::string>("ipban");
try{ try{
load(); load();

View File

@ -327,6 +327,8 @@ ServerEnvironment::~ServerEnvironment()
i = m_abms.begin(); i != m_abms.end(); i++){ i = m_abms.begin(); i != m_abms.end(); i++){
delete i->abm; delete i->abm;
} }
delete m_database;
} }
void ServerEnvironment::serializePlayers() void ServerEnvironment::serializePlayers()

View File

@ -940,8 +940,8 @@ Server::Server(
m_env = new ServerEnvironment(new ServerMap(mapsavedir, this), m_lua, m_env = new ServerEnvironment(new ServerMap(mapsavedir, this), m_lua,
this, this, mapsavedir); this, this, mapsavedir);
m_authmanager.init(m_env->getDatabase(),m_mapsavedir+DIR_DELIM"auth.txt"); m_authmanager = new AuthManager(m_env->getDatabase(),m_mapsavedir+DIR_DELIM"auth.txt");
m_banmanager.init(m_env->getDatabase(),m_mapsavedir+DIR_DELIM"ipban.txt"); m_banmanager = new BanManager(m_env->getDatabase(),m_mapsavedir+DIR_DELIM"ipban.txt");
// Give environment reference to scripting api // Give environment reference to scripting api
scriptapi_add_environment(m_lua, m_env); scriptapi_add_environment(m_lua, m_env);
@ -1040,6 +1040,8 @@ Server::~Server()
} }
// Delete Environment // Delete Environment
delete m_banmanager;
delete m_authmanager;
delete m_env; delete m_env;
delete m_itemdef; delete m_itemdef;
@ -1792,12 +1794,12 @@ void Server::AsyncRunStep()
ScopeProfiler sp(g_profiler, "Server: saving stuff"); ScopeProfiler sp(g_profiler, "Server: saving stuff");
// Auth stuff // Auth stuff
if(m_authmanager.isModified()) if(m_authmanager->isModified())
m_authmanager.save(); m_authmanager->save();
//Bann stuff //Bann stuff
if(m_banmanager.isModified()) if(m_banmanager->isModified())
m_banmanager.save(); m_banmanager->save();
// Map // Map
JMutexAutoLock lock(m_env_mutex); JMutexAutoLock lock(m_env_mutex);
@ -1866,10 +1868,10 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
Address address = m_con.GetPeerAddress(peer_id); Address address = m_con.GetPeerAddress(peer_id);
// drop player if is ip is banned // drop player if is ip is banned
if(m_banmanager.isIpBanned(address.serializeString())){ if(m_banmanager->isIpBanned(address.serializeString())){
SendAccessDenied(m_con, peer_id, SendAccessDenied(m_con, peer_id,
L"Your ip is banned. Banned name was " L"Your ip is banned. Banned name was "
+narrow_to_wide(m_banmanager.getBanName( +narrow_to_wide(m_banmanager->getBanName(
address.serializeString()))); address.serializeString())));
m_con.DeletePeer(peer_id); m_con.DeletePeer(peer_id);
return; return;
@ -2015,7 +2017,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
} }
// Add player to auth manager // Add player to auth manager
if(m_authmanager.exists(playername) == false) if(m_authmanager->exists(playername) == false)
{ {
std::wstring default_password = std::wstring default_password =
narrow_to_wide(g_settings->get("default_password")); narrow_to_wide(g_settings->get("default_password"));
@ -2028,14 +2030,14 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
infostream<<"Server: adding player "<<playername infostream<<"Server: adding player "<<playername
<<" to auth manager"<<std::endl; <<" to auth manager"<<std::endl;
m_authmanager.add(playername); m_authmanager->add(playername);
m_authmanager.setPassword(playername, translated_default_password); m_authmanager->setPassword(playername, translated_default_password);
m_authmanager.setPrivs(playername, m_authmanager->setPrivs(playername,
stringToPrivs(g_settings->get("default_privs"))); stringToPrivs(g_settings->get("default_privs")));
m_authmanager.save(); m_authmanager->save();
} }
std::string checkpwd = m_authmanager.getPassword(playername); std::string checkpwd = m_authmanager->getPassword(playername);
/*infostream<<"Server: Client gave password '"<<password /*infostream<<"Server: Client gave password '"<<password
<<"', the correct one is '"<<checkpwd<<"'"<<std::endl;*/ <<"', the correct one is '"<<checkpwd<<"'"<<std::endl;*/
@ -2052,7 +2054,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
// Enforce user limit. // Enforce user limit.
// Don't enforce for users that have some admin right // Don't enforce for users that have some admin right
if(m_clients.size() >= g_settings->getU16("max_users") && if(m_clients.size() >= g_settings->getU16("max_users") &&
(m_authmanager.getPrivs(playername) (m_authmanager->getPrivs(playername)
& (PRIV_SERVER|PRIV_BAN|PRIV_PRIVS|PRIV_PASSWORD)) == 0 && & (PRIV_SERVER|PRIV_BAN|PRIV_PRIVS|PRIV_PASSWORD)) == 0 &&
playername != g_settings->get("name")) playername != g_settings->get("name"))
{ {
@ -2720,7 +2722,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
std::string playername = player->getName(); std::string playername = player->getName();
if(m_authmanager.exists(playername) == false) if(m_authmanager->exists(playername) == false)
{ {
infostream<<"Server: playername not found in authmanager"<<std::endl; infostream<<"Server: playername not found in authmanager"<<std::endl;
// Wrong old password supplied!! // Wrong old password supplied!!
@ -2728,7 +2730,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
return; return;
} }
std::string checkpwd = m_authmanager.getPassword(playername); std::string checkpwd = m_authmanager->getPassword(playername);
if(oldpwd != checkpwd) if(oldpwd != checkpwd)
{ {
@ -2740,7 +2742,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
actionstream<<player->getName()<<" changes password"<<std::endl; actionstream<<player->getName()<<" changes password"<<std::endl;
m_authmanager.setPassword(playername, newpwd); m_authmanager->setPassword(playername, newpwd);
infostream<<"Server: password change successful for "<<playername infostream<<"Server: password change successful for "<<playername
<<std::endl; <<std::endl;
@ -4089,17 +4091,17 @@ std::wstring Server::getStatusString()
void Server::setPlayerPassword(const std::string &name, const std::wstring &password) void Server::setPlayerPassword(const std::string &name, const std::wstring &password)
{ {
// Add player to auth manager // Add player to auth manager
if(m_authmanager.exists(name) == false) if(m_authmanager->exists(name) == false)
{ {
infostream<<"Server: adding player "<<name infostream<<"Server: adding player "<<name
<<" to auth manager"<<std::endl; <<" to auth manager"<<std::endl;
m_authmanager.add(name); m_authmanager->add(name);
m_authmanager.setPrivs(name, m_authmanager->setPrivs(name,
stringToPrivs(g_settings->get("default_privs"))); stringToPrivs(g_settings->get("default_privs")));
} }
// Change password and save // Change password and save
m_authmanager.setPassword(name, translatePassword(name, password)); m_authmanager->setPassword(name, translatePassword(name, password));
m_authmanager.save(); m_authmanager->save();
} }
// Saves g_settings to configpath given at initialization // Saves g_settings to configpath given at initialization

View File

@ -454,7 +454,7 @@ public:
u64 getPlayerAuthPrivs(const std::string &name) u64 getPlayerAuthPrivs(const std::string &name)
{ {
try{ try{
return m_authmanager.getPrivs(name); return m_authmanager->getPrivs(name);
} }
catch(AuthNotFoundException &e) catch(AuthNotFoundException &e)
{ {
@ -466,7 +466,7 @@ public:
void setPlayerAuthPrivs(const std::string &name, u64 privs) void setPlayerAuthPrivs(const std::string &name, u64 privs)
{ {
try{ try{
return m_authmanager.setPrivs(name, privs); return m_authmanager->setPrivs(name, privs);
} }
catch(AuthNotFoundException &e) catch(AuthNotFoundException &e)
{ {
@ -483,19 +483,19 @@ public:
void setIpBanned(const std::string &ip, const std::string &name) void setIpBanned(const std::string &ip, const std::string &name)
{ {
m_banmanager.add(ip, name); m_banmanager->add(ip, name);
return; return;
} }
void unsetIpBanned(const std::string &ip_or_name) void unsetIpBanned(const std::string &ip_or_name)
{ {
m_banmanager.remove(ip_or_name); m_banmanager->remove(ip_or_name);
return; return;
} }
std::string getBanDescription(const std::string &ip_or_name) std::string getBanDescription(const std::string &ip_or_name)
{ {
return m_banmanager.getBanDescription(ip_or_name); return m_banmanager->getBanDescription(ip_or_name);
} }
Address getPeerAddress(u16 peer_id) Address getPeerAddress(u16 peer_id)
@ -651,10 +651,10 @@ private:
core::map<u16, RemoteClient*> m_clients; core::map<u16, RemoteClient*> m_clients;
// User authentication // User authentication
AuthManager m_authmanager; AuthManager* m_authmanager;
// Bann checking // Bann checking
BanManager m_banmanager; BanManager* m_banmanager;
// Scripting // Scripting
// Envlock and conlock should be locked when using Lua // Envlock and conlock should be locked when using Lua