flat outthunder
This commit is contained in:
parent
2e2b57fb91
commit
89bb08efaf
5 changed files with 54 additions and 20 deletions
21
protocol.md
21
protocol.md
|
@ -190,11 +190,16 @@ Communication between the master server and clients will be done over a WebSocke
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="center">2</td>
|
<td class="center">2</td>
|
||||||
|
<td>Port</td>
|
||||||
|
<td>Packed Unsigned Short</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="center">3</td>
|
||||||
<td>License</td>
|
<td>License</td>
|
||||||
<td>Text</td>
|
<td>Text</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="center">3</td>
|
<td class="center">4</td>
|
||||||
<td>Secret</td>
|
<td>Secret</td>
|
||||||
<td>Blob (512b)</td>
|
<td>Blob (512b)</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -219,7 +224,7 @@ Communication between the master server and clients will be done over a WebSocke
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="center">2</td>
|
<td class="center">2</td>
|
||||||
<td>Port</td>
|
<td>Max Users</td>
|
||||||
<td>Packed Unsigned Short</td>
|
<td>Packed Unsigned Short</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
@ -477,16 +482,18 @@ TODO: MAKE THIS SECTION NOT LOOK LIKE SHIT
|
||||||
### Master / Slave
|
### Master / Slave
|
||||||
|
|
||||||
#### M -> S (ID 2)
|
#### M -> S (ID 2)
|
||||||
100: KEY SIZE WAS INCORRECT
|
0x100: KEY SIZE WAS INCORRECT
|
||||||
|
|
||||||
101: COULD NOT PARSE KEY
|
0x101: COULD NOT PARSE KEY
|
||||||
|
|
||||||
#### M -> S (ID 4)
|
#### M -> S (ID 4)
|
||||||
100: MAX AUTH ATTEMPTS REACHED
|
0x100: MAX AUTH ATTEMPTS REACHED
|
||||||
|
|
||||||
101: LICENSE DATA INCORRECT
|
0x101: LICENSE DATA INCORRECT
|
||||||
|
|
||||||
102: LICENSE LIMIT REACHED
|
0x102: LICENSE LIMIT REACHED
|
||||||
|
|
||||||
|
0x200: NOT AUTHORIZED TO PERFORM ACTION
|
||||||
|
|
||||||
### Master / Client
|
### Master / Client
|
||||||
|
|
||||||
|
|
BIN
server/hard_schema.db-journal
Normal file
BIN
server/hard_schema.db-journal
Normal file
Binary file not shown.
|
@ -9,7 +9,13 @@ const char* _mem_db_sql =
|
||||||
"`NAME` TEXT NOT NULL,"
|
"`NAME` TEXT NOT NULL,"
|
||||||
"`LICENSE` TEXT NOT NULL,"
|
"`LICENSE` TEXT NOT NULL,"
|
||||||
"`IP_ADDR` TEXT NOT NULL,"
|
"`IP_ADDR` TEXT NOT NULL,"
|
||||||
"`PORT` INTEGER NOT NULL"
|
"`PORT` INTEGER NOT NULL,"
|
||||||
|
"`USERS` INTEGER NOT NULL DEFAULT 0,"
|
||||||
|
"`MAX_USERS` INTEGER NOT NULL DEFAULT 0"
|
||||||
|
");\n"
|
||||||
|
|
||||||
|
"CREATE UNIQUE INDEX `UIX_SERVER_LICENSES` ON `SERVER_LICENSES` ("
|
||||||
|
"`KEY_ID`, `SECRET`"
|
||||||
");\n";
|
");\n";
|
||||||
|
|
||||||
const char* _hard_db_init_migration_sql =
|
const char* _hard_db_init_migration_sql =
|
||||||
|
|
|
@ -50,6 +50,8 @@ private:
|
||||||
bool AuthenticationFailure
|
bool AuthenticationFailure
|
||||||
(const std::string& packetId, uint16_t errorCode);
|
(const std::string& packetId, uint16_t errorCode);
|
||||||
|
|
||||||
|
bool NotAuthorized(const std::string& packetId);
|
||||||
|
|
||||||
enum SlaveToMasterId {
|
enum SlaveToMasterId {
|
||||||
kInitAttempt = 1,
|
kInitAttempt = 1,
|
||||||
kAuthentication,
|
kAuthentication,
|
||||||
|
|
|
@ -98,11 +98,13 @@ bool sosc::MasterIntra::Process(const db::QueryList* queries) {
|
||||||
|
|
||||||
bool sosc::MasterIntra::InitAttempt(sosc::Packet &pck) {
|
bool sosc::MasterIntra::InitAttempt(sosc::Packet &pck) {
|
||||||
if(!pck.Check(1, key.key_size_bytes))
|
if(!pck.Check(1, key.key_size_bytes))
|
||||||
return this->Close(Packet(kEncryptionError, { "\x01" }));
|
return this->Close(
|
||||||
|
Packet(kEncryptionError, { net::htonv<uint16_t>(0x100) }));
|
||||||
|
|
||||||
Packet response;
|
Packet response;
|
||||||
if(!this->key.ParseRequest(pck, &response, kKeyExchange))
|
if(!this->key.ParseRequest(pck, &response, kKeyExchange))
|
||||||
return this->Close(Packet(kEncryptionError, { "\x02" }));
|
return this->Close(
|
||||||
|
Packet(kEncryptionError, { net::htonv<uint16_t>(0x101) }));
|
||||||
|
|
||||||
this->sock.Send(response);
|
this->sock.Send(response);
|
||||||
}
|
}
|
||||||
|
@ -112,39 +114,43 @@ bool sosc::MasterIntra::Authentication(sosc::Packet &pck) {
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
std::string packetId = BYTESTR(kAuthentication);
|
std::string packetId = BYTESTR(kAuthentication);
|
||||||
if(!pck.Check(3, PCK_ANY, PCK_ANY, 512))
|
if(!pck.Check(4, PCK_ANY, 2, PCK_ANY, 512))
|
||||||
return this->Close();
|
return this->Close();
|
||||||
|
|
||||||
db::Query* query = this->queries->at(QRY_LICENSE_CHECK);
|
db::Query* query = this->queries->at(QRY_LICENSE_CHECK);
|
||||||
query->Reset();
|
query->Reset();
|
||||||
query->BindText(pck[1], 0);
|
query->BindText(pck[2], 0);
|
||||||
query->BindBlob(pck[2], 1);
|
query->BindBlob(pck[3], 1);
|
||||||
if(query->ScalarInt32() == 0)
|
if(query->ScalarInt32() == 0)
|
||||||
return AuthenticationFailure(packetId, 2);
|
return AuthenticationFailure(packetId, 0x101);
|
||||||
|
|
||||||
_ctx.license_check_mtx.lock();
|
_ctx.license_check_mtx.lock();
|
||||||
|
|
||||||
int limit;
|
int limit;
|
||||||
query = this->queries->at(QRY_LICENSE_LIMIT);
|
query = this->queries->at(QRY_LICENSE_LIMIT);
|
||||||
query->Reset();
|
query->Reset();
|
||||||
query->BindText(pck[1], 0);
|
query->BindText(pck[2], 0);
|
||||||
if((limit = query->ScalarInt32()) != 0) {
|
if((limit = query->ScalarInt32()) != 0) {
|
||||||
query = this->queries->at(QRY_LICENSE_ACTIVE_COUNT);
|
query = this->queries->at(QRY_LICENSE_ACTIVE_COUNT);
|
||||||
query->Reset();
|
query->Reset();
|
||||||
query->BindText(pck[1], 0);
|
query->BindText(pck[2], 0);
|
||||||
if(query->ScalarInt32() < limit) {
|
if(query->ScalarInt32() < limit) {
|
||||||
_ctx.license_check_mtx.unlock();
|
_ctx.license_check_mtx.unlock();
|
||||||
return AuthenticationFailure(packetId, 3);
|
return AuthenticationFailure(packetId, 0x102);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
query = this->queries->at(QRY_SERVER_LIST_ADD);
|
query = this->queries->at(QRY_SERVER_LIST_ADD);
|
||||||
query->Reset();
|
query->Reset();
|
||||||
query->BindText(pck[0], pck[1], );
|
query->BindText(pck[0], 0);
|
||||||
|
query->BindText(pck[2], 1);
|
||||||
|
query->BindText(this->sock.GetIpAddress(), 2);
|
||||||
|
query->BindInt32(net::ntohv<uint16_t>(pck[1]), 3);
|
||||||
query->NonQuery();
|
query->NonQuery();
|
||||||
|
|
||||||
_ctx.license_check_mtx.unlock();
|
_ctx.license_check_mtx.unlock();
|
||||||
|
|
||||||
|
this->license = pck[2];
|
||||||
this->authed = true;
|
this->authed = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -159,13 +165,26 @@ bool sosc::MasterIntra::AuthenticationFailure
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return this->Close(
|
return this->Close(
|
||||||
Packet(kNegativeAck, { packetId, net::htonv<uint16_t>(1) })
|
Packet(kNegativeAck, { packetId, net::htonv<uint16_t>(0x100) })
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sosc::MasterIntra::StatusUpdate(sosc::Packet &pck) {
|
bool sosc::MasterIntra::NotAuthorized(const std::string &packetId) {
|
||||||
|
return this->Close(
|
||||||
|
Packet(kNegativeAck, { packetId, net::htonv<uint16_t>(0x200) })
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sosc::MasterIntra::StatusUpdate(sosc::Packet &pck) {
|
||||||
|
std::string packetId = BYTESTR(kStatusUpdate);
|
||||||
|
if(!this->authed)
|
||||||
|
return this->NotAuthorized(packetId);
|
||||||
|
|
||||||
|
if(!pck.Check(2, 2, 2))
|
||||||
|
return this->Close();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sosc::MasterIntra::Close() {
|
bool sosc::MasterIntra::Close() {
|
||||||
|
|
Loading…
Reference in a new issue