diff --git a/Dotnet/AppApi/Cef/Folders.cs b/Dotnet/AppApi/Cef/Folders.cs index 587f97c9..a3110159 100644 --- a/Dotnet/AppApi/Cef/Folders.cs +++ b/Dotnet/AppApi/Cef/Folders.cs @@ -28,7 +28,7 @@ namespace VRCX if (string.IsNullOrEmpty(json)) return defaultPath; - var obj = JsonConvert.DeserializeObject(json); + var obj = JsonConvert.DeserializeObject(json, JsonSerializerSettings); if (obj["cache_directory"] == null) return defaultPath; @@ -58,7 +58,7 @@ namespace VRCX if (string.IsNullOrEmpty(json)) return defaultPath; - var obj = JsonConvert.DeserializeObject(json); + var obj = JsonConvert.DeserializeObject(json, JsonSerializerSettings); if (obj["picture_output_folder"] == null) return defaultPath; diff --git a/Dotnet/AppApi/Common/AppApiCommon.cs b/Dotnet/AppApi/Common/AppApiCommon.cs index 2b302b6a..b9d9d95d 100644 --- a/Dotnet/AppApi/Common/AppApiCommon.cs +++ b/Dotnet/AppApi/Common/AppApiCommon.cs @@ -6,6 +6,7 @@ using System.IO; using System.Security.Cryptography; using System.Text; using librsync.net; +using Newtonsoft.Json; using NLog; namespace VRCX @@ -18,6 +19,14 @@ namespace VRCX public void Init() { } + + public JsonSerializerSettings JsonSerializerSettings = new JsonSerializerSettings + { + Error = delegate(object _, Newtonsoft.Json.Serialization.ErrorEventArgs args) + { + args.ErrorContext.Handled = true; + } + }; public string MD5File(string blob) { diff --git a/Dotnet/AppApi/Common/VrcConfigFile.cs b/Dotnet/AppApi/Common/VrcConfigFile.cs index 86b92730..062679fd 100644 --- a/Dotnet/AppApi/Common/VrcConfigFile.cs +++ b/Dotnet/AppApi/Common/VrcConfigFile.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using Newtonsoft.Json; namespace VRCX { @@ -18,6 +19,27 @@ namespace VRCX return json; } + public string ReadConfigFileSafe() + { + try + { + var configFile = ReadConfigFile(); + if (string.IsNullOrEmpty(configFile)) + return string.Empty; + + var jObject = JsonConvert.DeserializeObject(configFile, JsonSerializerSettings); + if (jObject == null) + return string.Empty; + + return JsonConvert.SerializeObject(jObject, Formatting.Indented); + } + catch (Exception ex) + { + logger.Warn(ex, "Failed to parse VRC config.json file"); + return string.Empty; + } + } + public void WriteConfigFile(string json) { var path = GetVRChatAppDataLocation(); diff --git a/Dotnet/AppApi/Electron/Folders.cs b/Dotnet/AppApi/Electron/Folders.cs index 467c2459..435dc5d8 100644 --- a/Dotnet/AppApi/Electron/Folders.cs +++ b/Dotnet/AppApi/Electron/Folders.cs @@ -93,7 +93,7 @@ namespace VRCX if (string.IsNullOrEmpty(json)) return defaultPath; - var obj = JsonConvert.DeserializeObject(json); + var obj = JsonConvert.DeserializeObject(json, JsonSerializerSettings); if (obj["cache_directory"] == null) return defaultPath; @@ -123,7 +123,7 @@ namespace VRCX if (string.IsNullOrEmpty(json)) return defaultPath; - var obj = JsonConvert.DeserializeObject(json); + var obj = JsonConvert.DeserializeObject(json, JsonSerializerSettings); if (obj["picture_output_folder"] == null) return defaultPath; diff --git a/src/views/Settings/dialogs/VRChatConfigDialog.vue b/src/views/Settings/dialogs/VRChatConfigDialog.vue index 7b89a6b7..123f4c41 100644 --- a/src/views/Settings/dialogs/VRChatConfigDialog.vue +++ b/src/views/Settings/dialogs/VRChatConfigDialog.vue @@ -401,7 +401,7 @@ } async function readVRChatConfigFile() { - const config = await AppApi.ReadConfigFile(); + const config = await AppApi.ReadConfigFileSafe(); if (config) { try { const parsedConfig = JSON.parse(config);