BOOMER TIME
This commit is contained in:
parent
8635b98a14
commit
9661b5367a
4 changed files with 62 additions and 24 deletions
13
PROTOCOL.md
13
PROTOCOL.md
|
@ -188,20 +188,9 @@ Communication between the master server and clients will be done over a WebSocke
|
||||||
<tr>
|
<tr>
|
||||||
<td class="center">2</td>
|
<td class="center">2</td>
|
||||||
<td>Secret</td>
|
<td>Secret</td>
|
||||||
<td>Bytes (16)</td>
|
<td>Bytes (128)</td>
|
||||||
<td>R<sub>1</sub></td>
|
<td>R<sub>1</sub></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td class="center">3</td>
|
|
||||||
<td>Server Address</td>
|
|
||||||
<td>IPv4 String</td>
|
|
||||||
<td>R<sub>1</sub></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="center">4</td>
|
|
||||||
<td>Server Port</td>
|
|
||||||
<td>Packed Unsigned Short</td>
|
|
||||||
<td>R<sub>1</sub></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
|
@ -14,15 +14,11 @@ const char* _mem_db_sql =
|
||||||
"`MAX_USERS` INTEGER NOT NULL DEFAULT 0"
|
"`MAX_USERS` INTEGER NOT NULL DEFAULT 0"
|
||||||
");\n"
|
");\n"
|
||||||
|
|
||||||
"CREATE UNIQUE INDEX `UIX_SERVER_LICENSES` ON `SERVER_LICENSES` ("
|
|
||||||
"`KEY_ID`, `SECRET`"
|
|
||||||
");\n"
|
|
||||||
|
|
||||||
"CREATE TABLE `USER_KEYS` ("
|
"CREATE TABLE `USER_KEYS` ("
|
||||||
"`ID` INTEGER,"
|
"`ID` INTEGER,"
|
||||||
"`SECRET` BLOB NOT NULL UNIQUE,"
|
"`SECRET` BLOB NOT NULL UNIQUE,"
|
||||||
"PRIMARY KEY(`ID`)"
|
"PRIMARY KEY(`ID`)"
|
||||||
");";
|
");\n";
|
||||||
|
|
||||||
const char* _hard_db_init_migration_sql =
|
const char* _hard_db_init_migration_sql =
|
||||||
"CREATE TABLE `MIGRATIONS` ("
|
"CREATE TABLE `MIGRATIONS` ("
|
||||||
|
@ -35,11 +31,15 @@ const char* _hard_db_init_migration_sql =
|
||||||
const std::vector<const char*> _hard_db_sql = {
|
const std::vector<const char*> _hard_db_sql = {
|
||||||
/** START MIGRATION 0 **/
|
/** START MIGRATION 0 **/
|
||||||
"CREATE TABLE `SERVER_LICENSES` ("
|
"CREATE TABLE `SERVER_LICENSES` ("
|
||||||
"`KEY_ID` TEXT NOT NULL UNIQUE,"
|
"`KEY_ID` TEXT NOT NULL PRIMARY KEY AUTOINCREMENT,"
|
||||||
"`SECRET` BLOB NOT NULL UNIQUE,"
|
"`SECRET` BLOB NOT NULL,"
|
||||||
"`ALLOWANCE` INTEGER NOT NULL DEFAULT 0"
|
"`ALLOWANCE` INTEGER NOT NULL DEFAULT 0"
|
||||||
");\n"
|
");\n"
|
||||||
|
|
||||||
|
"CREATE UNIQUE INDEX `UIX_SERVER_LICENSES` ON `SERVER_LICENSES` ("
|
||||||
|
"`KEY_ID`, `SECRET`"
|
||||||
|
");\n"
|
||||||
|
|
||||||
"CREATE TABLE `USERS` ("
|
"CREATE TABLE `USERS` ("
|
||||||
"`ID` INTEGER PRIMARY KEY AUTOINCREMENT,"
|
"`ID` INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||||
"`USERNAME` TEXT NOT NULL,"
|
"`USERNAME` TEXT NOT NULL,"
|
||||||
|
|
|
@ -17,9 +17,25 @@ namespace sosc {
|
||||||
|
|
||||||
class MasterClient {
|
class MasterClient {
|
||||||
public:
|
public:
|
||||||
|
explicit MasterClient(const ScapeConnection& client);
|
||||||
|
bool Process(const Queries* queries);
|
||||||
|
|
||||||
|
bool Close();
|
||||||
|
bool Close(const Packet& message);
|
||||||
private:
|
private:
|
||||||
|
enum MasterToClientId {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ClientToMasterId {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
ScapeConnection sock;
|
ScapeConnection sock;
|
||||||
|
|
||||||
|
bool authed;
|
||||||
|
int auth_attempts;
|
||||||
|
const int MAX_AUTH_ATTEMPTS = 5;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MasterClientPool : public Pool<MasterClient, ctx::MasterClientContext> {
|
class MasterClientPool : public Pool<MasterClient, ctx::MasterClientContext> {
|
||||||
|
@ -30,8 +46,7 @@ protected:
|
||||||
ctx::MasterClientContext* context,
|
ctx::MasterClientContext* context,
|
||||||
const Queries* queries) override
|
const Queries* queries) override
|
||||||
{
|
{
|
||||||
// TODO implement
|
return client.Process(queries);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,42 @@ static struct {
|
||||||
/** MASTERCLIENTPOOL CODE **/
|
/** MASTERCLIENTPOOL CODE **/
|
||||||
|
|
||||||
void sosc::MasterClientPool::SetupQueries(Queries *queries) {
|
void sosc::MasterClientPool::SetupQueries(Queries *queries) {
|
||||||
#define QRY_USER_REGISTER 0
|
#define QRY_USER_REG_CHECK 0
|
||||||
|
queries->push_back(new db::Query(
|
||||||
|
"SELECT COUNT(*) FROM `USERS` "
|
||||||
|
"WHERE `USERNAME` = ? OR `EMAIL` = ?"
|
||||||
|
));
|
||||||
|
|
||||||
|
#define QRY_USER_REGISTER 1
|
||||||
|
queries->push_back(new db::Query(
|
||||||
|
"INSERT INTO `USERS` "
|
||||||
|
"(`USERNAME`, `PASS_HASH`, `EMAIL`, `ACTIVATED`, `JOINED`) "
|
||||||
|
"VALUES (?, ?, ?, 0, CURRENT_TIMESTAMP)"
|
||||||
|
));
|
||||||
|
|
||||||
|
#define QRY_USER_GET_PWD_HASH 2
|
||||||
|
queries->push_back(new db::Query(
|
||||||
|
"SELECT `ID`, `PASS_HASH` FROM `USERS` "
|
||||||
|
"WHERE `USERNAME` = ?"
|
||||||
|
));
|
||||||
|
|
||||||
|
#define QRY_USER_GENERATE_KEY 3
|
||||||
|
queries->push_back(new db::Query(
|
||||||
|
"INSERT OR IGNORE INTO `USER_KEYS` "
|
||||||
|
"(`ID`, `SECRET`) VALUES (?, RANDOMBLOB(128))"
|
||||||
|
));
|
||||||
|
|
||||||
|
#define QRY_USER_GET_KEY 4
|
||||||
|
queries->push_back(new db::Query(
|
||||||
|
"SELECT `SECRET` FROM `USER_KEYS` "
|
||||||
|
"WHERE `ID` = ?"
|
||||||
|
));
|
||||||
|
|
||||||
|
#define QRY_USER_CHECK_KEY 5
|
||||||
|
queries->push_back(new db::Query(
|
||||||
|
"SELECT COUNT(*) FROM `USER_KEYS` "
|
||||||
|
"WHERE `ID` = ? AND `SECRET` = ?"
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** MASTERCLIENT CODE **/
|
/** MASTERCLIENT CODE **/
|
Loading…
Reference in a new issue