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

View File

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

View File

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

View File

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

View File

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

View File

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