diff --git a/License.cc b/License.cc index e5ecb5ef..843b3991 100644 --- a/License.cc +++ b/License.cc @@ -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(this->filename); for (const auto& read_license : licenses) { @@ -141,3 +141,38 @@ vector LicenseManager::snapshot() const { } return ret; } + + +shared_ptr LicenseManager::create_license_pc( + uint32_t serial_number,const char* access_key, const char* password) { + shared_ptr 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 LicenseManager::create_license_gc( + uint32_t serial_number, const char* access_key, const char* password) { + shared_ptr 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 LicenseManager::create_license_bb( + uint32_t serial_number, const char* username, const char* password) { + shared_ptr 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; +} diff --git a/License.hh b/License.hh index b3aa58e2..ba35165e 100644 --- a/License.hh +++ b/License.hh @@ -57,6 +57,13 @@ public: void remove(uint32_t serial_number); std::vector snapshot() const; + static std::shared_ptr create_license_pc( + uint32_t serial_number, const char* access_key, const char* password); + static std::shared_ptr create_license_gc( + uint32_t serial_number, const char* access_key, const char* password); + static std::shared_ptr create_license_bb( + uint32_t serial_number, const char* username, const char* password); + protected: void save() const; diff --git a/ReceiveCommands.cc b/ReceiveCommands.cc index 8e03e2c4..39d4d884 100644 --- a/ReceiveCommands.cc +++ b/ReceiveCommands.cc @@ -170,9 +170,9 @@ void process_verify_license_gc(shared_ptr s, shared_ptr c, check_size(size, sizeof(Cmd)); const auto* cmd = reinterpret_cast(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 s, shared_ptr 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 s, shared_ptr c, check_size(size, sizeof(Cmd)); const auto* cmd = reinterpret_cast(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 s, shared_ptr 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 s, shared_ptr 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 s, shared_ptr 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 s, shared_ptr 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 s, shared_ptr 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); + } } }