diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 9c6c343aa..8712a9829 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -1272,7 +1272,7 @@ static int CmdHF15Dump(const char *Cmd) { size_t datalen = blocknum * 4; saveFile(filename, ".bin", data, datalen); saveFileEML(filename, data, datalen, 4); - saveFileJSON(filename, jsf15, data, datalen); + saveFileJSON(filename, jsf15, data, datalen, NULL); return PM3_SUCCESS; } diff --git a/client/src/cmdhfcryptorf.c b/client/src/cmdhfcryptorf.c index 559dc0e35..7f727d4bf 100644 --- a/client/src/cmdhfcryptorf.c +++ b/client/src/cmdhfcryptorf.c @@ -495,7 +495,7 @@ static int CmdHFCryptoRFESave(const char *Cmd) { //needs to change saveFileEML(filename, data, numofbytes, 8); //needs to change - saveFileJSON(filename, jsfRaw, data, numofbytes); + saveFileJSON(filename, jsfRaw, data, numofbytes, NULL); return PM3_SUCCESS; } diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 85caf2364..d67deda5a 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -776,7 +776,7 @@ static int CmdHFiClassELoad(const char *Cmd) { break; } case JSON: { - res = loadFileJSON(filename, dump, 2048, &bytes_read); + res = loadFileJSON(filename, dump, 2048, &bytes_read, NULL); break; } case DICTIONARY: @@ -966,7 +966,7 @@ static int CmdHFiClassDecrypt(const char *Cmd) { saveFile(fptr, ".bin", decrypted, decryptedlen); saveFileEML(fptr, decrypted, decryptedlen, 8); - saveFileJSON(fptr, jsfIclass, decrypted, decryptedlen); + saveFileJSON(fptr, jsfIclass, decrypted, decryptedlen, NULL); PrintAndLogEx(INFO, "Following output skips CSN / block0"); printIclassDumpContents(decrypted, 1, (decryptedlen / 8), decryptedlen); @@ -1433,7 +1433,7 @@ static int CmdHFiClassReader_Dump(const char *Cmd) { PrintAndLogEx(SUCCESS, "saving dump file - %zu blocks read", gotBytes / 8); saveFile(filename, ".bin", tag_data, gotBytes); saveFileEML(filename, tag_data, gotBytes, 8); - saveFileJSON(filename, jsfIclass, tag_data, gotBytes); + saveFileJSON(filename, jsfIclass, tag_data, gotBytes, NULL); return PM3_SUCCESS; } diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index 28138f0ea..a97d13d3f 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -1026,7 +1026,7 @@ static int CmdLegicDump(const char *Cmd) { saveFile(filename, ".bin", data, readlen); saveFileEML(filename, data, readlen, 8); - saveFileJSON(filename, jsfLegic, data, readlen); + saveFileJSON(filename, jsfLegic, data, readlen, NULL); free(data); return PM3_SUCCESS; } @@ -1299,7 +1299,7 @@ static int CmdLegicESave(const char *Cmd) { saveFile(filename, ".bin", data, numofbytes); saveFileEML(filename, data, numofbytes, 8); - saveFileJSON(filename, jsfLegic, data, numofbytes); + saveFileJSON(filename, jsfLegic, data, numofbytes, NULL); return PM3_SUCCESS; } diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index e3813a5a2..9a4c36d9d 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1068,7 +1068,7 @@ static int CmdHF14AMfDump(const char *Cmd) { saveFile(dataFilename, ".bin", (uint8_t *)carddata, bytes); saveFileEML(dataFilename, (uint8_t *)carddata, bytes, MFBLOCK_SIZE); - saveFileJSON(dataFilename, jsfCardMemory, (uint8_t *)carddata, bytes); + saveFileJSON(dataFilename, jsfCardMemory, (uint8_t *)carddata, bytes, NULL); return PM3_SUCCESS; } @@ -2518,7 +2518,7 @@ all_found: saveFile(filename, ".bin", dump, bytes); saveFileEML(filename, dump, bytes, MFBLOCK_SIZE); - saveFileJSON(filename, jsfCardMemory, dump, bytes); + saveFileJSON(filename, jsfCardMemory, dump, bytes, NULL); // Generate and show statistics t1 = msclock() - t1; @@ -3832,7 +3832,7 @@ static int CmdHF14AMfESave(const char *Cmd) { saveFile(filename, ".bin", dump, bytes); saveFileEML(filename, dump, bytes, MFBLOCK_SIZE); - saveFileJSON(filename, jsfCardMemory, dump, bytes); + saveFileJSON(filename, jsfCardMemory, dump, bytes, NULL); free(dump); return PM3_SUCCESS; } @@ -4150,7 +4150,7 @@ static int CmdHF14AMfCLoad(const char *Cmd) { res = loadFile(fileName, ".bin", data, maxdatalen, &datalen); } else { if (fillFromJson) { - res = loadFileJSON(fileName, data, maxdatalen, &datalen); + res = loadFileJSON(fileName, data, maxdatalen, &datalen, NULL); } else { res = loadFileEML(Cmd, data, &datalen); } @@ -4412,7 +4412,7 @@ static int CmdHF14AMfCSave(const char *Cmd) { saveFile(filename, ".bin", dump, bytes); saveFileEML(filename, dump, bytes, MFBLOCK_SIZE); - saveFileJSON(filename, jsfCardMemory, dump, bytes); + saveFileJSON(filename, jsfCardMemory, dump, bytes, NULL); free(dump); return PM3_SUCCESS; } diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 7f79bd1dd..9d9cd68e0 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -4114,7 +4114,7 @@ static int CmdHF14aDesChk(const char *Cmd) { // length: UID(10b)+SAK(1b)+ATQA(2b)+ATSlen(1b)+ATS(atslen)+foundKeys[2][64][AES_KEY_LEN + 1] memcpy(&data[14 + atslen], foundKeys, 4 * 0xE * (24 + 1)); - saveFileJSON((char *)jsonname, jsfMfDesfireKeys, data, 0xE); + saveFileJSON((char *)jsonname, jsfMfDesfireKeys, data, 0xE, NULL); } return PM3_SUCCESS; diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 7cdeb5eb1..5f10406b1 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1277,7 +1277,7 @@ static int CmdHFMFPChk(const char *Cmd) { // length: UID(10b)+SAK(1b)+ATQA(2b)+ATSlen(1b)+ATS(atslen)+foundKeys[2][64][AES_KEY_LEN + 1] memcpy(&data[14 + atslen], foundKeys, 2 * 64 * (AES_KEY_LEN + 1)); - saveFileJSON((char *)jsonname, jsfMfPlusKeys, data, 64); + saveFileJSON((char *)jsonname, jsfMfPlusKeys, data, 64, NULL); } return PM3_SUCCESS; diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index dd812dd79..c5f22b628 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -2090,7 +2090,7 @@ static int CmdHF14AMfUDump(const char *Cmd) { } uint16_t datalen = pages * 4 + MFU_DUMP_PREFIX_LENGTH; saveFile(filename, ".bin", (uint8_t *)&dump_file_data, datalen); - saveFileJSON(filename, jsfMfuMemory, (uint8_t *)&dump_file_data, datalen); + saveFileJSON(filename, jsfMfuMemory, (uint8_t *)&dump_file_data, datalen, NULL); if (is_partial) PrintAndLogEx(WARNING, "Partial dump created. (%d of %d blocks)", pages, card_mem_size); diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 28cbd41d0..b05405465 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -330,7 +330,7 @@ static int CmdLFHitagSim(const char *Cmd) { break; case 'j': param_getstr(Cmd, cmdp + 1, filename, sizeof(filename)); - res = loadFileJSON(filename, data, maxdatalen, &datalen); + res = loadFileJSON(filename, data, maxdatalen, &datalen, NULL); if (res > 0) { errors = true; break; @@ -725,7 +725,7 @@ static int CmdLFHitag2Dump(const char *Cmd) { saveFile(filename, ".bin", data, 48); saveFileEML(filename, data, 48, 4); - saveFileJSON(filename, jsfHitag, data, 48); + saveFileJSON(filename, jsfHitag, data, 48, NULL); return PM3_SUCCESS; } diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index a4a885e1f..6294ffef6 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -2319,7 +2319,7 @@ static int CmdT55xxDump(const char *Cmd) { for (int i = 0; i < T55x7_BLOCK_COUNT; i++) data[i] = BSWAP_32(cardmem[i].blockdata); - saveFileJSON(preferredName, jsfT55x7, (uint8_t *)data, T55x7_BLOCK_COUNT * sizeof(uint32_t)); + saveFileJSON(preferredName, jsfT55x7, (uint8_t *)data, T55x7_BLOCK_COUNT * sizeof(uint32_t), NULL); saveFileEML(preferredName, (uint8_t *)data, T55x7_BLOCK_COUNT * sizeof(uint32_t), sizeof(uint32_t)); saveFile(preferredName, ".bin", data, sizeof(data)); } diff --git a/client/src/fileutils.c b/client/src/fileutils.c index d5315e3b9..d8176f65c 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -312,10 +312,10 @@ out: return retval; } -int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen) { - return saveFileJSONex(preferredName, ftype, data, datalen, true); +int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, void (*callback)(json_t *)) { + return saveFileJSONex(preferredName, ftype, data, datalen, true, callback); } -int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose) { +int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose, void (*callback)(json_t *)) { if (data == NULL) return PM3_EINVARG; @@ -548,8 +548,8 @@ int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, } } break; - case jsfSettings: - preferences_save_callback(root); + case jsfCustom: + (*callback)(root); break; default: break; @@ -855,10 +855,10 @@ out: return retval; } -int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen) { - return loadFileJSONex(preferredName, data, maxdatalen, datalen, true); +int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, void (*callback)(json_t *)) { + return loadFileJSONex(preferredName, data, maxdatalen, datalen, true, callback); } -int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose) { +int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose, void (*callback)(json_t *)) { if (data == NULL) return PM3_EINVARG; char *fileName = filenamemcopy(preferredName, ".json"); @@ -1001,8 +1001,8 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz if (verbose) PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), fileName); - if (!strcmp(ctype, "settings")) { - preferences_load_callback(root); + if (callback != NULL) { + (*callback)(root); } out: json_decref(root); diff --git a/client/src/fileutils.h b/client/src/fileutils.h index cf00efb03..96170a440 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -62,7 +62,7 @@ typedef enum { jsfT55x7, jsfT5555, jsfMfPlusKeys, - jsfSettings, + jsfCustom, jsfMfDesfireKeys, } JSONFileType; @@ -115,8 +115,8 @@ int saveFileEML(const char *preferredName, uint8_t *data, size_t datalen, size_t * @param datalen the length of the data * @return 0 for ok, 1 for failz */ -int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen); -int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose); +int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, void (*callback)(json_t *)); +int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose, void (*callback)(json_t *)); /** STUB * @brief Utility function to save WAVE data to a file. This method takes a preferred name, but if that @@ -198,8 +198,8 @@ int loadFileEML(const char *preferredName, void *data, size_t *datalen); * @param datalen the number of bytes loaded from file * @return 0 for ok, 1 for failz */ -int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen); -int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose); +int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, void (*callback)(json_t *)); +int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose, void (*callback)(json_t *)); /** diff --git a/client/src/preferences.c b/client/src/preferences.c index 89d9cc188..5ae73b902 100644 --- a/client/src/preferences.c +++ b/client/src/preferences.c @@ -89,7 +89,7 @@ int preferences_load(void) { char *fn = prefGetFilename(); if (fileExists(fn)) { PrintAndLogEx(INFO, "Loading Preferences..."); - if (loadFileJSON(fn, &dummyData, sizeof(dummyData), &dummyDL) == PM3_SUCCESS) { + if (loadFileJSON(fn, &dummyData, sizeof(dummyData), &dummyDL, &preferences_load_callback) == PM3_SUCCESS) { session.preferences_loaded = true; } } @@ -139,7 +139,7 @@ int preferences_save(void) { uint8_t dummyData = 0x00; size_t dummyDL = 0x00; - if (saveFileJSON(fn, jsfSettings, &dummyData, dummyDL) != PM3_SUCCESS) + if (saveFileJSON(fn, jsfCustom, &dummyData, dummyDL, &preferences_save_callback) != PM3_SUCCESS) PrintAndLogEx(ERR, "Error saving preferences to \"%s\"", fn); free(fn);