flat outthunder

This commit is contained in:
malloc 2018-05-16 17:03:31 -05:00
parent 2e2b57fb91
commit 89bb08efaf
5 changed files with 54 additions and 20 deletions

View file

@ -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

Binary file not shown.

View file

@ -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 =

View file

@ -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,

View file

@ -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,12 +165,25 @@ 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::NotAuthorized(const std::string &packetId) {
return this->Close(
Packet(kNegativeAck, { packetId, net::htonv<uint16_t>(0x200) })
);
}
bool sosc::MasterIntra::StatusUpdate(sosc::Packet &pck) { 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();
} }