Unset chat field on import/export Closes #3781

76c59cbc52c2569e4c4bf3f090dc224fa213735e

Cohee <18619528+Cohee1207@users.noreply.github.com>

2 files changed, +32 -9Ignore whitespace
src/endpoints/characters.js+15 -9
@@ -15,9 +15,9 @@ import storage from 'node-persist';
1515
1616import { AVATAR_WIDTH, AVATAR_HEIGHT } from '../constants.js';
1717import { default as validateAvatarUrlMiddleware, getFileNameValidationFunction } from '../middleware/validateFileName.js';
1818import { deepMerge, humanizedISO8601DateTime, tryParse, extractFileFromZipBuffer, MemoryLimitedMap, getConfigValue, mutateJsonString } from '../util.js';
1919import { TavernCardValidator } from '../validator/TavernCardValidator.js';
2020import { parse, read, write } from '../character-card-parser.js';
2121import { readWorldInfoFile } from './worldinfo.js';
2222import { invalidateThumbnail } from './thumbnails.js';
2323import { importRisuSprites } from './sprites.js';
@@ -490,10 +490,13 @@ function convertToV2(char, directories) {
490490 return result;
491491}
492492
493-
493+/**
494-function unsetFavFlag(char) {
494+ * Removes fields that are not meant to be shared.
495+ */
496+function unsetPrivateFields(char) {
495497 _.set(char, 'fav', false);
496498 _.set(char, 'data.extensions.fav', false);
499+ _.unset(char, 'chat');
497500}
498501
499502function readFromV2(char) {
@@ -779,7 +782,7 @@ async function importFromCharX(uploadPath, { request }, preservedFileName) {
779782 }
780783 }
781784
782785 unsetFavFlagunsetPrivateFields(card);
783786 card['create_date'] = humanizedISO8601DateTime();
784787 card.name = sanitize(card.name);
785788 const fileName = preservedFileName || getPngName(card.name, request.user.directories);
@@ -803,7 +806,7 @@ async function importFromJson(uploadPath, { request }, preservedFileName) {
803806 if (jsonData.spec !== undefined) {
804807 console.info(`Importing from ${jsonData.spec} json`);
805808 importRisuSprites(request.user.directories, jsonData);
806809 unsetFavFlagunsetPrivateFields(jsonData);
807810 jsonData = readFromV2(jsonData);
808811 jsonData['create_date'] = humanizedISO8601DateTime();
809812 const pngName = preservedFileName || getPngName(jsonData.data?.name || jsonData.name, request.user.directories);
@@ -886,7 +889,7 @@ async function importFromPng(uploadPath, { request }, preservedFileName) {
886889 if (jsonData.spec !== undefined) {
887890 console.info(`Found a ${jsonData.spec} character file.`);
888891 importRisuSprites(request.user.directories, jsonData);
889892 unsetFavFlagunsetPrivateFields(jsonData);
890893 jsonData = readFromV2(jsonData);
891894 jsonData['create_date'] = humanizedISO8601DateTime();
892895 const char = JSON.stringify(jsonData);
@@ -1423,11 +1426,14 @@ router.post('/export', validateAvatarUrlMiddleware, async function (request, res
14231426
14241427 switch (request.body.format) {
14251428 case 'png': {
14261429 const fileContentrawBuffer = await fsPromises.readFile(filename);
1430+ const rawData = read(rawBuffer);
1431+ const mutatedData = mutateJsonString(rawData, unsetPrivateFields);
1432+ const mutatedBuffer = write(rawBuffer, mutatedData);
14271433 const contentType = mime.lookup(filename) || 'image/png';
14281434 response.setHeader('Content-Type', contentType);
14291435 response.setHeader('Content-Disposition', `attachment; filename="${encodeURI(path.basename(filename))}"`);
14301436 return response.send(fileContentmutatedBuffer);
14311437 }
14321438 case 'json': {
14331439 try {
src/util.js+17 -0
@@ -1054,3 +1054,20 @@ export function setWindowTitle(title) {
10541054 process.stdout.write(`\x1b]2;${title}\x1b\x5c`);
10551055 }
10561056}
1057+
1058+/**
1059+ * Parses a JSON string and applies a mutation function to the parsed object.
1060+ * @param {string} jsonString JSON string to parse
1061+ * @param {function(any): void} mutation Mutation function to apply to the parsed JSON object
1062+ * @returns {string} Mutated JSON string
1063+ */
1064+export function mutateJsonString(jsonString, mutation) {
1065+ try {
1066+ const json = JSON.parse(jsonString);
1067+ mutation(json);
1068+ return JSON.stringify(json);
1069+ } catch (error) {
1070+ console.error('Error parsing or mutating JSON:', error);
1071+ return jsonString;
1072+ }
1073+}