Make JSON reading safer
- Check that the file actually opened before reading it - If the JSON was discarded, then make just use an empty object
This commit is contained in:
parent
5343661069
commit
77edd99749
7 changed files with 65 additions and 39 deletions
|
|
@ -50,19 +50,15 @@ public:
|
|||
std::vector<std::string> GetInstalled(const std::string &unistoreName, const std::string &entry) const;
|
||||
|
||||
void SetUpdated(const std::string &unistoreName, const std::string &entry, const std::string &updated) {
|
||||
if (this->metadataJson.is_discarded()) return;
|
||||
this->metadataJson[unistoreName][entry]["updated"] = updated;
|
||||
};
|
||||
|
||||
void SetMarks(const std::string &unistoreName, const std::string &entry, int marks) {
|
||||
if (this->metadataJson.is_discarded()) return;
|
||||
this->metadataJson[unistoreName][entry]["marks"] = marks;
|
||||
};
|
||||
|
||||
/* TODO: Handle this better. */
|
||||
void SetInstalled(const std::string &unistoreName, const std::string &entry, const std::string &name) {
|
||||
if (this->metadataJson.is_discarded()) return;
|
||||
|
||||
const std::vector<std::string> installs = this->GetInstalled(unistoreName, entry);
|
||||
bool write = true;
|
||||
|
||||
|
|
@ -82,8 +78,6 @@ public:
|
|||
|
||||
/* Remove installed state from a download list entry. */
|
||||
void RemoveInstalled(const std::string &unistoreName, const std::string &entry, const std::string &name) {
|
||||
if (this->metadataJson.is_discarded()) return;
|
||||
|
||||
const std::vector<std::string> installs = this->GetInstalled(unistoreName, entry);
|
||||
int idx = -1;
|
||||
|
||||
|
|
|
|||
|
|
@ -59,9 +59,14 @@ static const std::vector<Structs::ButtonPos> mainButtons = {
|
|||
const std::string &file: The file of the UniStore.
|
||||
*/
|
||||
static void DeleteStore(const std::string &file) {
|
||||
nlohmann::json storeJson;
|
||||
FILE *temp = fopen((std::string(_STORE_PATH) + file).c_str(), "rt");
|
||||
nlohmann::json storeJson = nlohmann::json::parse(temp, nullptr, false);
|
||||
fclose(temp);
|
||||
if (temp) {
|
||||
storeJson = nlohmann::json::parse(temp, nullptr, false);
|
||||
fclose(temp);
|
||||
}
|
||||
if (storeJson.is_discarded())
|
||||
storeJson = {};
|
||||
|
||||
/* Check, if Spritesheet exist on UniStore. */
|
||||
if (storeJson["storeInfo"].contains("sheet") && storeJson["storeInfo"]["sheet"].is_array()) {
|
||||
|
|
@ -105,9 +110,14 @@ static bool DownloadStore() {
|
|||
if (URL != "") doSheet = DownloadUniStore(URL, -1, file, true);
|
||||
|
||||
if (doSheet) {
|
||||
nlohmann::json storeJson;
|
||||
FILE *temp = fopen(file.c_str(), "rt");
|
||||
nlohmann::json storeJson = nlohmann::json::parse(temp, nullptr, false);
|
||||
fclose(temp);
|
||||
if (temp) {
|
||||
storeJson = nlohmann::json::parse(temp, nullptr, false);
|
||||
fclose(temp);
|
||||
}
|
||||
if (storeJson.is_discarded())
|
||||
storeJson = { };
|
||||
|
||||
if (doSheet) {
|
||||
if (storeJson["storeInfo"].contains("sheetURL") && storeJson["storeInfo"]["sheetURL"].is_array()) {
|
||||
|
|
@ -158,9 +168,14 @@ static bool UpdateStore(const std::string &URL) {
|
|||
if (URL != "") doSheet = DownloadUniStore(URL, -1, file, false);
|
||||
|
||||
if (doSheet) {
|
||||
nlohmann::json storeJson;
|
||||
FILE *temp = fopen(file.c_str(), "rt");
|
||||
nlohmann::json storeJson = nlohmann::json::parse(temp, nullptr, false);
|
||||
fclose(temp);
|
||||
if (temp) {
|
||||
storeJson = nlohmann::json::parse(temp, nullptr, false);
|
||||
fclose(temp);
|
||||
}
|
||||
if (storeJson.is_discarded())
|
||||
storeJson = { };
|
||||
|
||||
if (doSheet) {
|
||||
if (storeJson["storeInfo"].contains("sheetURL") && storeJson["storeInfo"]["sheetURL"].is_array()) {
|
||||
|
|
|
|||
|
|
@ -43,8 +43,12 @@ Meta::Meta() {
|
|||
}
|
||||
|
||||
FILE *temp = fopen(_META_PATH, "rt");
|
||||
this->metadataJson = nlohmann::json::parse(temp, nullptr, false);
|
||||
fclose(temp);
|
||||
if (temp) {
|
||||
this->metadataJson = nlohmann::json::parse(temp, nullptr, false);
|
||||
fclose(temp);
|
||||
}
|
||||
if (this->metadataJson.is_discarded())
|
||||
this->metadataJson = { };
|
||||
|
||||
if (config->metadata()) this->ImportMetadata();
|
||||
}
|
||||
|
|
@ -59,9 +63,15 @@ void Meta::ImportMetadata() {
|
|||
}
|
||||
|
||||
Msg::DisplayMsg(Lang::get("FETCHING_METADATA"));
|
||||
FILE *old = fopen("sdmc:/3ds/Universal-Updater/updates.json", "r");
|
||||
nlohmann::json oldJson = nlohmann::json::parse(old, nullptr, false);
|
||||
fclose(old);
|
||||
|
||||
nlohmann::json oldJson;
|
||||
FILE *old = fopen("sdmc:/3ds/Universal-Updater/updates.json", "rt");
|
||||
if (old) {
|
||||
oldJson = nlohmann::json::parse(old, nullptr, false);
|
||||
fclose(old);
|
||||
}
|
||||
if (oldJson.is_discarded())
|
||||
oldJson = { };
|
||||
|
||||
std::vector<UniStoreInfo> info = GetUniStoreInfo(_STORE_PATH); // Fetch UniStores.
|
||||
|
||||
|
|
@ -83,7 +93,6 @@ void Meta::ImportMetadata() {
|
|||
const std::string &entry: The Entry name.
|
||||
*/
|
||||
std::string Meta::GetUpdated(const std::string &unistoreName, const std::string &entry) const {
|
||||
if (this->metadataJson.is_discarded()) return "";
|
||||
if (!this->metadataJson.contains(unistoreName)) return ""; // UniStore Name does not exist.
|
||||
|
||||
if (!this->metadataJson[unistoreName].contains(entry)) return ""; // Entry does not exist.
|
||||
|
|
@ -103,8 +112,6 @@ std::string Meta::GetUpdated(const std::string &unistoreName, const std::string
|
|||
int Meta::GetMarks(const std::string &unistoreName, const std::string &entry) const {
|
||||
int temp = 0;
|
||||
|
||||
if (this->metadataJson.is_discarded()) return temp;
|
||||
|
||||
if (!this->metadataJson.contains(unistoreName)) return temp; // UniStore Name does not exist.
|
||||
|
||||
if (!this->metadataJson[unistoreName].contains(entry)) return temp; // Entry does not exist.
|
||||
|
|
@ -137,8 +144,6 @@ bool Meta::UpdateAvailable(const std::string &unistoreName, const std::string &e
|
|||
const std::string &entry: The Entry name.
|
||||
*/
|
||||
std::vector<std::string> Meta::GetInstalled(const std::string &unistoreName, const std::string &entry) const {
|
||||
if (this->metadataJson.is_discarded()) return { };
|
||||
|
||||
if (!this->metadataJson.contains(unistoreName)) return { }; // UniStore Name does not exist.
|
||||
|
||||
if (!this->metadataJson[unistoreName].contains(entry)) return { }; // Entry does not exist.
|
||||
|
|
|
|||
|
|
@ -231,6 +231,8 @@ void Store::LoadFromFile(const std::string &file) {
|
|||
|
||||
this->storeJson = nlohmann::json::parse(in, nullptr, false);
|
||||
fclose(in);
|
||||
if (this->storeJson.is_discarded())
|
||||
this->storeJson = { };
|
||||
|
||||
/* Check, if valid. */
|
||||
if (this->storeJson.contains("storeInfo") && this->storeJson.contains("storeContent")) {
|
||||
|
|
|
|||
|
|
@ -110,9 +110,13 @@ Config::Config() {
|
|||
this->initialize();
|
||||
}
|
||||
|
||||
FILE *file = fopen("sdmc:/3ds/Universal-Updater/Config.json", "r");
|
||||
this->json = nlohmann::json::parse(file, nullptr, false);
|
||||
fclose(file);
|
||||
FILE *file = fopen("sdmc:/3ds/Universal-Updater/Config.json", "rt");
|
||||
if (file) {
|
||||
this->json = nlohmann::json::parse(file, nullptr, false);
|
||||
fclose(file);
|
||||
}
|
||||
if (this->json.is_discarded())
|
||||
this->json = { };
|
||||
|
||||
/* Let us create a new one. */
|
||||
if (!this->json.contains("Version")) this->initialize();
|
||||
|
|
@ -174,34 +178,28 @@ void Config::save() {
|
|||
|
||||
/* Helper functions. */
|
||||
bool Config::getBool(const std::string &key) {
|
||||
if (this->json.is_discarded()) return false;
|
||||
if (!this->json.contains(key)) return false;
|
||||
|
||||
return this->json.at(key).get_ref<const bool &>();
|
||||
}
|
||||
void Config::setBool(const std::string &key, bool v) {
|
||||
if (this->json.is_discarded()) return;
|
||||
this->json[key] = v;
|
||||
};
|
||||
|
||||
int Config::getInt(const std::string &key) {
|
||||
if (this->json.is_discarded()) return 0;
|
||||
if (!this->json.contains(key)) return 0;
|
||||
|
||||
return this->json.at(key).get_ref<const int64_t &>();
|
||||
}
|
||||
void Config::setInt(const std::string &key, int v) {
|
||||
if (this->json.is_discarded()) return;
|
||||
this->json[key] = v;
|
||||
};
|
||||
|
||||
std::string Config::getString(const std::string &key) {
|
||||
if (this->json.is_discarded()) return "";
|
||||
if (!this->json.contains(key)) return "";
|
||||
|
||||
return this->json.at(key).get_ref<const std::string &>();
|
||||
}
|
||||
void Config::setString(const std::string &key, const std::string &v) {
|
||||
if (this->json.is_discarded()) return;
|
||||
this->json[key] = v;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -113,11 +113,15 @@ UniStoreInfo GetInfo(const std::string &file, const std::string &fileName) {
|
|||
if(*(u32*)(fileName.c_str() + fileName.length() - 4) == (1886349435 & ~(1 << 3))) return Temp;
|
||||
}
|
||||
|
||||
nlohmann::json JSON = nullptr;
|
||||
nlohmann::json JSON;
|
||||
FILE *temp = fopen(file.c_str(), "rt");
|
||||
if(temp) {
|
||||
JSON = nlohmann::json::parse(temp, nullptr, false);
|
||||
fclose(temp);
|
||||
}
|
||||
if (JSON.is_discarded())
|
||||
JSON = { };
|
||||
|
||||
FILE *temp = fopen(file.c_str(), "r");
|
||||
JSON = nlohmann::json::parse(temp, nullptr, false);
|
||||
fclose(temp);
|
||||
|
||||
if (!JSON.contains("storeInfo")) return Temp; // storeInfo does not exist.
|
||||
|
||||
|
|
|
|||
|
|
@ -42,14 +42,22 @@ void Lang::load(const std::string &lang) {
|
|||
/* Check if exist. */
|
||||
if (access(("romfs:/lang/" + lang + "/app.json").c_str(), F_OK) == 0) {
|
||||
values = fopen(("romfs:/lang/" + lang + "/app.json").c_str(), "rt");
|
||||
appJson = nlohmann::json::parse(values, nullptr, false);
|
||||
fclose(values);
|
||||
if (values) {
|
||||
appJson = nlohmann::json::parse(values, nullptr, false);
|
||||
fclose(values);
|
||||
}
|
||||
if (appJson.is_discarded())
|
||||
appJson = { };
|
||||
return;
|
||||
|
||||
} else {
|
||||
values = fopen("romfs:/lang/en/app.json", "rt");
|
||||
appJson = nlohmann::json::parse(values, nullptr, false);
|
||||
fclose(values);
|
||||
if (values) {
|
||||
appJson = nlohmann::json::parse(values, nullptr, false);
|
||||
fclose(values);
|
||||
}
|
||||
if (appJson.is_discarded())
|
||||
appJson = { };
|
||||
return;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue