Skip to content

Commit 914dbea

Browse files
authoredApr 23, 2020
Add LevelDB auth database. (#9476)
* Add leveldb auth database.
1 parent ce5b093 commit 914dbea

File tree

3 files changed

+122
-1
lines changed

3 files changed

+122
-1
lines changed
 

‎src/database/database-leveldb.cpp

+97-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2626
#include "log.h"
2727
#include "filesys.h"
2828
#include "exceptions.h"
29+
#include "util/serialize.h"
2930
#include "util/string.h"
3031

3132
#include "leveldb/db.h"
@@ -97,5 +98,100 @@ void Database_LevelDB::listAllLoadableBlocks(std::vector<v3s16> &dst)
9798
delete it;
9899
}
99100

100-
#endif // USE_LEVELDB
101+
AuthDatabaseLevelDB::AuthDatabaseLevelDB(const std::string &savedir)
102+
{
103+
leveldb::Options options;
104+
options.create_if_missing = true;
105+
leveldb::Status status = leveldb::DB::Open(options,
106+
savedir + DIR_DELIM + "auth.db", &m_database);
107+
ENSURE_STATUS_OK(status);
108+
}
109+
110+
AuthDatabaseLevelDB::~AuthDatabaseLevelDB()
111+
{
112+
delete m_database;
113+
}
114+
115+
bool AuthDatabaseLevelDB::getAuth(const std::string &name, AuthEntry &res)
116+
{
117+
std::string raw;
118+
leveldb::Status s = m_database->Get(leveldb::ReadOptions(), name, &raw);
119+
if (!s.ok())
120+
return false;
121+
std::istringstream is(raw);
122+
123+
/*
124+
u8 version = 1
125+
std::string password
126+
u16 number of privileges
127+
for each privilege {
128+
std::string privilege
129+
}
130+
s64 last_login
131+
*/
132+
133+
if (readU8(is) > 1)
134+
return false;
135+
136+
res.id = 1;
137+
res.name = name;
138+
res.password = deSerializeString(is);
139+
140+
u16 privilege_count = readU16(is);
141+
res.privileges.clear();
142+
res.privileges.reserve(privilege_count);
143+
for (u16 i = 0; i < privilege_count; i++) {
144+
res.privileges.push_back(deSerializeString(is));
145+
}
146+
147+
res.last_login = readS64(is);
148+
return true;
149+
}
101150

151+
bool AuthDatabaseLevelDB::saveAuth(const AuthEntry &authEntry)
152+
{
153+
std::ostringstream os;
154+
writeU8(os, 1);
155+
os << serializeString(authEntry.password);
156+
157+
size_t privilege_count = authEntry.privileges.size();
158+
FATAL_ERROR_IF(privilege_count > U16_MAX,
159+
"Unsupported number of privileges");
160+
writeU16(os, privilege_count);
161+
for (const std::string &privilege : authEntry.privileges) {
162+
os << serializeString(privilege);
163+
}
164+
165+
writeS64(os, authEntry.last_login);
166+
leveldb::Status s = m_database->Put(leveldb::WriteOptions(),
167+
authEntry.name, os.str());
168+
return s.ok();
169+
}
170+
171+
bool AuthDatabaseLevelDB::createAuth(AuthEntry &authEntry)
172+
{
173+
return saveAuth(authEntry);
174+
}
175+
176+
bool AuthDatabaseLevelDB::deleteAuth(const std::string &name)
177+
{
178+
leveldb::Status s = m_database->Delete(leveldb::WriteOptions(), name);
179+
return s.ok();
180+
}
181+
182+
void AuthDatabaseLevelDB::listNames(std::vector<std::string> &res)
183+
{
184+
leveldb::Iterator* it = m_database->NewIterator(leveldb::ReadOptions());
185+
res.clear();
186+
for (it->SeekToFirst(); it->Valid(); it->Next()) {
187+
res.emplace_back(it->key().ToString());
188+
}
189+
delete it;
190+
}
191+
192+
void AuthDatabaseLevelDB::reload()
193+
{
194+
// No-op for LevelDB.
195+
}
196+
197+
#endif // USE_LEVELDB

‎src/database/database-leveldb.h

+17
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,21 @@ class Database_LevelDB : public MapDatabase
4545
leveldb::DB *m_database;
4646
};
4747

48+
class AuthDatabaseLevelDB : public AuthDatabase
49+
{
50+
public:
51+
AuthDatabaseLevelDB(const std::string &savedir);
52+
virtual ~AuthDatabaseLevelDB();
53+
54+
virtual bool getAuth(const std::string &name, AuthEntry &res);
55+
virtual bool saveAuth(const AuthEntry &authEntry);
56+
virtual bool createAuth(AuthEntry &authEntry);
57+
virtual bool deleteAuth(const std::string &name);
58+
virtual void listNames(std::vector<std::string> &res);
59+
virtual void reload();
60+
61+
private:
62+
leveldb::DB *m_database;
63+
};
64+
4865
#endif // USE_LEVELDB

‎src/serverenvironment.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
4444
#if USE_POSTGRESQL
4545
#include "database/database-postgresql.h"
4646
#endif
47+
#if USE_LEVELDB
48+
#include "database/database-leveldb.h"
49+
#endif
4750
#include "server/luaentity_sao.h"
4851
#include "server/player_sao.h"
4952

@@ -2187,6 +2190,11 @@ AuthDatabase *ServerEnvironment::openAuthDatabase(
21872190
if (name == "files")
21882191
return new AuthDatabaseFiles(savedir);
21892192

2193+
#if USE_LEVELDB
2194+
if (name == "leveldb")
2195+
return new AuthDatabaseLevelDB(savedir);
2196+
#endif
2197+
21902198
throw BaseException(std::string("Database backend ") + name + " not supported.");
21912199
}
21922200

0 commit comments

Comments
 (0)
Please sign in to comment.