diff --git a/src/dedicated_room/CMakeLists.txt b/src/dedicated_room/CMakeLists.txt index 2492bc5234..2b91daa705 100644 --- a/src/dedicated_room/CMakeLists.txt +++ b/src/dedicated_room/CMakeLists.txt @@ -13,7 +13,7 @@ if (ENABLE_WEB_SERVICE) target_link_libraries(citra-room PRIVATE web_service) endif() -target_link_libraries(citra-room PRIVATE glad) +target_link_libraries(citra-room PRIVATE cryptopp glad) if (MSVC) target_link_libraries(citra-room PRIVATE getopt) endif() diff --git a/src/dedicated_room/citra-room.cpp b/src/dedicated_room/citra-room.cpp index 3ba3972acd..ea9262046f 100644 --- a/src/dedicated_room/citra-room.cpp +++ b/src/dedicated_room/citra-room.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #ifdef _WIN32 @@ -66,6 +67,24 @@ static void PrintVersion() { /// The magic text at the beginning of a citra-room ban list file. static constexpr char BanListMagic[] = "CitraRoom-BanList-1"; +static constexpr char token_delimiter{':'}; + +static std::string UsernameFromDisplayToken(const std::string& display_token) { + std::string unencoded_display_token; + CryptoPP::StringSource ss( + display_token, true, + new CryptoPP::Base64Decoder(new CryptoPP::StringSink(unencoded_display_token))); + return unencoded_display_token.substr(0, unencoded_display_token.find(token_delimiter)); +} + +static std::string TokenFromDisplayToken(const std::string& display_token) { + std::string unencoded_display_token; + CryptoPP::StringSource ss( + display_token, true, + new CryptoPP::Base64Decoder(new CryptoPP::StringSink(unencoded_display_token))); + return unencoded_display_token.substr(unencoded_display_token.find(token_delimiter) + 1); +} + static Network::Room::BanList LoadBanList(const std::string& path) { std::ifstream file; OpenFStream(file, path, std::ios_base::in); @@ -158,7 +177,7 @@ int main(int argc, char** argv) { {"password", required_argument, 0, 'w'}, {"preferred-game", required_argument, 0, 'g'}, {"preferred-game-id", required_argument, 0, 'i'}, - {"username", required_argument, 0, 'u'}, + {"username", optional_argument, 0, 'u'}, {"token", required_argument, 0, 't'}, {"web-api-url", required_argument, 0, 'a'}, {"ban-list-file", required_argument, 0, 'b'}, @@ -248,10 +267,6 @@ int main(int argc, char** argv) { "list.\nSet with --ban-list-file \n\n"; } bool announce = true; - if (username.empty()) { - announce = false; - std::cout << "username is empty: Hosting a private room\n\n"; - } if (token.empty() && announce) { announce = false; std::cout << "token is empty: Hosting a private room\n\n"; @@ -261,10 +276,17 @@ int main(int argc, char** argv) { std::cout << "endpoint url is empty: Hosting a private room\n\n"; } if (announce) { - std::cout << "Hosting a public room\n\n"; - Settings::values.web_api_url = web_api_url; - Settings::values.citra_username = username; - Settings::values.citra_token = token; + if (username.empty()) { + std::cout << "Hosting a public room\n\n"; + Settings::values.web_api_url = web_api_url; + Settings::values.citra_username = UsernameFromDisplayToken(token); + Settings::values.citra_token = TokenFromDisplayToken(token); + } else { + std::cout << "Hosting a public room\n\n"; + Settings::values.web_api_url = web_api_url; + Settings::values.citra_username = username; + Settings::values.citra_token = token; + } } if (!announce && enable_citra_mods) { enable_citra_mods = false;