enable allowing unregistered users to connect

This commit is contained in:
Martin Michelsen
2020-02-21 10:20:39 -08:00
parent de63349b5d
commit 25dfd4a677
3 changed files with 78 additions and 9 deletions
+36 -1
View File
@@ -38,7 +38,7 @@ string License::str() const {
LicenseManager::LicenseManager(const std::string& filename) : filename(filename) {
LicenseManager::LicenseManager(const string& filename) : filename(filename) {
try {
auto licenses = load_vector_file<License>(this->filename);
for (const auto& read_license : licenses) {
@@ -141,3 +141,38 @@ vector<License> LicenseManager::snapshot() const {
}
return ret;
}
shared_ptr<const License> LicenseManager::create_license_pc(
uint32_t serial_number,const char* access_key, const char* password) {
shared_ptr<License> l(new License());
memset(l.get(), 0, sizeof(License));
l->serial_number = serial_number;
strncpy(l->access_key, access_key, 8);
if (password) {
strncpy(l->gc_password, password, 8);
}
return l;
}
shared_ptr<const License> LicenseManager::create_license_gc(
uint32_t serial_number, const char* access_key, const char* password) {
shared_ptr<License> l(new License());
memset(l.get(), 0, sizeof(License));
l->serial_number = serial_number;
strncpy(l->access_key, access_key, 12);
if (password) {
strncpy(l->gc_password, password, 8);
}
return l;
}
shared_ptr<const License> LicenseManager::create_license_bb(
uint32_t serial_number, const char* username, const char* password) {
shared_ptr<License> l(new License());
memset(l.get(), 0, sizeof(License));
l->serial_number = serial_number;
strncpy(l->username, username, 19);
strncpy(l->bb_password, password, 19);
return l;
}
+7
View File
@@ -57,6 +57,13 @@ public:
void remove(uint32_t serial_number);
std::vector<License> snapshot() const;
static std::shared_ptr<const License> create_license_pc(
uint32_t serial_number, const char* access_key, const char* password);
static std::shared_ptr<const License> create_license_gc(
uint32_t serial_number, const char* access_key, const char* password);
static std::shared_ptr<const License> create_license_bb(
uint32_t serial_number, const char* username, const char* password);
protected:
void save() const;
+35 -8
View File
@@ -170,9 +170,9 @@ void process_verify_license_gc(shared_ptr<ServerState> s, shared_ptr<Client> c,
check_size(size, sizeof(Cmd));
const auto* cmd = reinterpret_cast<const Cmd*>(data);
uint32_t serial_number = 0;
sscanf(cmd->serial_number, "%8" PRIX32, &serial_number);
try {
uint32_t serial_number;
sscanf(cmd->serial_number, "%8" PRIX32, &serial_number);
c->license = s->license_manager->verify_gc(serial_number, cmd->access_key,
cmd->password);
} catch (const exception& e) {
@@ -181,6 +181,9 @@ void process_verify_license_gc(shared_ptr<ServerState> s, shared_ptr<Client> c,
send_message_box(c, message.c_str());
c->should_disconnect = true;
return;
} else {
c->license = LicenseManager::create_license_pc(serial_number,
cmd->access_key, cmd->password);
}
}
@@ -198,9 +201,9 @@ void process_login_a_dc_pc_gc(shared_ptr<ServerState> s, shared_ptr<Client> c,
check_size(size, sizeof(Cmd));
const auto* cmd = reinterpret_cast<const Cmd*>(data);
uint32_t serial_number = 0;
sscanf(cmd->serial_number, "%8" PRIX32, &serial_number);
try {
uint32_t serial_number;
sscanf(cmd->serial_number, "%8" PRIX32, &serial_number);
if (c->version == GameVersion::GC) {
c->license = s->license_manager->verify_gc(serial_number, cmd->access_key,
NULL);
@@ -214,6 +217,14 @@ void process_login_a_dc_pc_gc(shared_ptr<ServerState> s, shared_ptr<Client> c,
send_message_box(c, message.c_str());
c->should_disconnect = true;
return;
} else {
if (c->version == GameVersion::GC) {
c->license = LicenseManager::create_license_gc(serial_number,
cmd->access_key, NULL);
} else {
c->license = LicenseManager::create_license_pc(serial_number,
cmd->access_key, NULL);
}
}
}
@@ -235,9 +246,9 @@ void process_login_c_dc_pc_gc(shared_ptr<ServerState> s, shared_ptr<Client> c,
c->flags |= flags_for_version(c->version, cmd->sub_version);
uint32_t serial_number = 0;
sscanf(cmd->serial_number, "%8" PRIX32, &serial_number);
try {
uint32_t serial_number;
sscanf(cmd->serial_number, "%8" PRIX32, &serial_number);
if (c->version == GameVersion::GC) {
c->license = s->license_manager->verify_gc(serial_number, cmd->access_key,
cmd->password);
@@ -251,6 +262,14 @@ void process_login_c_dc_pc_gc(shared_ptr<ServerState> s, shared_ptr<Client> c,
send_message_box(c, message.c_str());
c->should_disconnect = true;
return;
} else {
if (c->version == GameVersion::GC) {
c->license = LicenseManager::create_license_gc(serial_number,
cmd->access_key, cmd->password);
} else {
c->license = LicenseManager::create_license_pc(serial_number,
cmd->access_key, cmd->password);
}
}
}
@@ -276,9 +295,9 @@ void process_login_d_e_pc_gc(shared_ptr<ServerState> s, shared_ptr<Client> c,
c->flags |= flags_for_version(c->version, cmd->sub_version);
uint32_t serial_number = 0;
sscanf(cmd->serial_number, "%8" PRIX32, &serial_number);
try {
uint32_t serial_number;
sscanf(cmd->serial_number, "%8" PRIX32, &serial_number);
if (c->version == GameVersion::GC) {
c->license = s->license_manager->verify_gc(serial_number, cmd->access_key,
NULL);
@@ -292,6 +311,14 @@ void process_login_d_e_pc_gc(shared_ptr<ServerState> s, shared_ptr<Client> c,
send_message_box(c, message.c_str());
c->should_disconnect = true;
return;
} else {
if (c->version == GameVersion::GC) {
c->license = LicenseManager::create_license_gc(serial_number,
cmd->access_key, NULL);
} else {
c->license = LicenseManager::create_license_pc(serial_number,
cmd->access_key, NULL);
}
}
}