diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index b2c21a157..29dad9de0 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -266,7 +266,7 @@ const EditPage = createClass({ brew.text = brew.text.normalize('NFC'); this.savedBrew.text = this.savedBrew.text.normalize('NFC'); brew.pageCount = ((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; - brew.patches = stringifyPatches(makePatches(this.savedBrew.text, brew.text)); + brew.patches = stringifyPatches(makePatches(encodeURI(this.savedBrew.text), encodeURI(brew.text))); brew.hash = await md5(this.savedBrew.text); //brew.text = undefined; - Temporary parallel path brew.textBin = undefined; diff --git a/server/app.js b/server/app.js index 7b12baacd..869fe6555 100644 --- a/server/app.js +++ b/server/app.js @@ -383,6 +383,7 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), asyncHandler(async(req, res, title : req.brew.title || 'Untitled Brew', description : req.brew.description || 'No description.', image : req.brew.thumbnail || defaultMetaTags.image, + locale : req.brew.lang, type : 'article' }; diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 29c9f3301..99ce0f1c4 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -52,13 +52,13 @@ const api = { // ID Validation Checks // Homebrewery ID // Typically 12 characters, but the DB shows a range of 7 to 14 characters - if(!id.match(/^[A-Za-z0-9_-]{7,14}$/)){ + if(!id.match(/^[a-zA-Z0-9-_]{7,14}$/)){ throw { name: 'ID Error', message: 'Invalid ID', status: 404, HBErrorCode: '11', brewId: id }; } // Google ID // Typically 33 characters, old format is 44 - always starts with a 1 // Managed by Google, may change outside of our control, so any length between 33 and 44 is acceptable - if(googleId && !googleId.match(/^1(?:[A-Za-z0-9+\/]{32,43})$/)){ + if(googleId && !googleId.match(/^1(?:[a-zA-Z0-9-_]{32,43})$/)){ throw { name: 'Google ID Error', message: 'Invalid ID', status: 404, HBErrorCode: '12', brewId: id }; } @@ -372,14 +372,14 @@ const api = { try { const patches = parsePatch(brewFromClient.patches); // Patch to a throwaway variable while parallelizing - we're more concerned with error/no error. - const patchedResult = applyPatches(patches, brewFromServer.text, { allowExceedingIndices: true })[0]; + const patchedResult = decodeURI(applyPatches(patches, encodeURI(brewFromServer.text))[0]); if(patchedResult != brewFromClient.text) throw("Patches did not apply cleanly, text mismatch detected"); // brew.text = applyPatches(patches, brewFromServer.text)[0]; } catch (err) { //debugTextMismatch(brewFromClient.text, brewFromServer.text, `edit/${brewFromClient.editId}`); console.error('Failed to apply patches:', { - patches : brewFromClient.patches, + //patches : brewFromClient.patches, brewId : brewFromClient.editId || 'unknown', error : err }); @@ -534,4 +534,4 @@ router.delete('/api/:id', checkClientVersion, asyncHandler(api.deleteBrew)); router.get('/api/remove/:id', checkClientVersion, asyncHandler(api.deleteBrew)); router.get('/api/theme/:renderer/:id', asyncHandler(api.getThemeBundle)); -export default api; \ No newline at end of file +export default api;