Răsfoiți Sursa

web_services: Refactor to remove dependency on Core.

bunnei 9 ani în urmă
părinte
comite
04bd0c957e

+ 7 - 1
src/core/telemetry_session.cpp

@@ -77,7 +77,13 @@ u64 RegenerateTelemetryId() {
 
 TelemetrySession::TelemetrySession() {
 #ifdef ENABLE_WEB_SERVICE
-    backend = std::make_unique<WebService::TelemetryJson>();
+    if (Settings::values.enable_telemetry) {
+        backend = std::make_unique<WebService::TelemetryJson>(
+            Settings::values.telemetry_endpoint_url, Settings::values.citra_username,
+            Settings::values.citra_token);
+    } else {
+        backend = std::make_unique<Telemetry::NullVisitor>();
+    }
 #else
     backend = std::make_unique<Telemetry::NullVisitor>();
 #endif

+ 1 - 2
src/web_service/telemetry_json.cpp

@@ -3,7 +3,6 @@
 // Refer to the license.txt file included.
 
 #include "common/assert.h"
-#include "core/settings.h"
 #include "web_service/telemetry_json.h"
 #include "web_service/web_backend.h"
 
@@ -81,7 +80,7 @@ void TelemetryJson::Complete() {
     SerializeSection(Telemetry::FieldType::UserFeedback, "UserFeedback");
     SerializeSection(Telemetry::FieldType::UserConfig, "UserConfig");
     SerializeSection(Telemetry::FieldType::UserSystem, "UserSystem");
-    PostJson(Settings::values.telemetry_endpoint_url, TopSection().dump());
+    PostJson(endpoint_url, TopSection().dump(), true, username, token);
 }
 
 } // namespace WebService

+ 6 - 1
src/web_service/telemetry_json.h

@@ -17,7 +17,9 @@ namespace WebService {
  */
 class TelemetryJson : public Telemetry::VisitorInterface {
 public:
-    TelemetryJson() = default;
+    TelemetryJson(const std::string& endpoint_url, const std::string& username,
+                  const std::string& token)
+        : endpoint_url(endpoint_url), username(username), token(token) {}
     ~TelemetryJson() = default;
 
     void Visit(const Telemetry::Field<bool>& field) override;
@@ -49,6 +51,9 @@ private:
 
     nlohmann::json output;
     std::array<nlohmann::json, 7> sections;
+    std::string endpoint_url;
+    std::string username;
+    std::string token;
 };
 
 } // namespace WebService

+ 16 - 15
src/web_service/web_backend.cpp

@@ -5,36 +5,37 @@
 #include <cpr/cpr.h>
 #include <stdlib.h>
 #include "common/logging/log.h"
-#include "core/settings.h"
 #include "web_service/web_backend.h"
 
 namespace WebService {
 
 static constexpr char API_VERSION[]{"1"};
 
-void PostJson(const std::string& url, const std::string& data) {
-    if (!Settings::values.enable_telemetry) {
-        // Telemetry disabled by user configuration
+void PostJson(const std::string& url, const std::string& data, bool allow_anonymous,
+              const std::string& username, const std::string& token) {
+    if (url.empty()) {
+        LOG_ERROR(WebService, "URL is invalid");
         return;
     }
 
-    if (url.empty()) {
-        LOG_ERROR(WebService, "URL is invalid");
+    const bool are_credentials_provided{!token.empty() && !username.empty()};
+    if (!allow_anonymous && !are_credentials_provided) {
+        LOG_ERROR(WebService, "Credentials must be provided for authenticated requests");
         return;
     }
 
-    if (Settings::values.citra_token.empty() || Settings::values.citra_username.empty()) {
-        // Anonymous request if citra token or username are empty
-        cpr::PostAsync(
-            cpr::Url{url}, cpr::Body{data},
-            cpr::Header{{"Content-Type", "application/json"}, {"api-version", API_VERSION}});
-    } else {
-        // We have both, do an authenticated request
+    if (are_credentials_provided) {
+        // Authenticated request if credentials are provided
         cpr::PostAsync(cpr::Url{url}, cpr::Body{data},
                        cpr::Header{{"Content-Type", "application/json"},
-                                   {"x-username", Settings::values.citra_username},
-                                   {"x-token", Settings::values.citra_token},
+                                   {"x-username", username},
+                                   {"x-token", token},
                                    {"api-version", API_VERSION}});
+    } else {
+        // Otherwise, anonymous request
+        cpr::PostAsync(
+            cpr::Url{url}, cpr::Body{data},
+            cpr::Header{{"Content-Type", "application/json"}, {"api-version", API_VERSION}});
     }
 }
 

+ 5 - 1
src/web_service/web_backend.h

@@ -13,7 +13,11 @@ namespace WebService {
  * Posts JSON to services.citra-emu.org.
  * @param url URL of the services.citra-emu.org endpoint to post data to.
  * @param data String of JSON data to use for the body of the POST request.
+ * @param allow_anonymous If true, allow anonymous unauthenticated requests.
+ * @param username Citra username to use for authentication.
+ * @param token Citra token to use for authentication.
  */
-void PostJson(const std::string& url, const std::string& data);
+void PostJson(const std::string& url, const std::string& data, bool allow_anonymous,
+              const std::string& username = {}, const std::string& token = {});
 
 } // namespace WebService