From f3d2f474a75d367e04a5b9e379541c5298a588ca Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Thu, 15 Dec 2022 18:49:23 +0400 Subject: [PATCH] Handling of suggestions containing special symbols This change fixes two issues: 1. Presence of URL-specific special symbols (such as ? or #) in the book and/or article name resulted in a wrong suggestion link. This is fixed by URI-encoding the book name and the path, too. 2. Presence of a single quote symbol in the book and/or article name resulted in invalid javascript code in the href attribute of the suggestion link. The single quote (') symbol is not URL-encoded (unlike its double quote counterpart). As a result, enclosing a URL-encoded string in single quotes may result in invalid javascript. Using double quotes instead is safe, since both double quote (") and backslash (\) symbols (which are the only special symbols for such quoting) undergo URL-encoding. --- static/skin/viewer.js | 14 ++++++++++---- test/server.cpp | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/static/skin/viewer.js b/static/skin/viewer.js index 9571b1eea..24050a3b7 100644 --- a/static/skin/viewer.js +++ b/static/skin/viewer.js @@ -346,13 +346,19 @@ function setupSuggestions() { }, resultItem: { element: (item, data) => { - let searchLink; + const uriEncodedBookName = encodeURIComponent(currentBook); + let url; if (data.value.kind == "path") { - searchLink = `/${currentBook}/${htmlDecode(data.value.path)}`; + const path = encodeURIComponent(htmlDecode(data.value.path)); + url = `/${uriEncodedBookName}/${path}`; } else { - searchLink = `/search?content=${encodeURIComponent(currentBook)}&pattern=${encodeURIComponent(htmlDecode(data.value.value))}`; + const pattern = encodeURIComponent(htmlDecode(data.value.value)); + url = `/search?content=${uriEncodedBookName}&pattern=${pattern}`; } - const jsAction = `gotoUrl('${searchLink}')`; + // url can't contain any double quote and/or backslash symbols + // since they should have been URI-encoded. Therefore putting it + // inside double quotes should result in valid javascript. + const jsAction = `gotoUrl("${url}")`; const linkText = htmlDecode(data.value.label); item.innerHTML = makeJSLink(jsAction, linkText, 'class="suggest"'); }, diff --git a/test/server.cpp b/test/server.cpp index a166fa0ae..9b2da29a8 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -69,7 +69,7 @@ const ResourceCollection resources200Compressible{ { DYNAMIC_CONTENT, "/ROOT/skin/taskbar.css" }, { STATIC_CONTENT, "/ROOT/skin/taskbar.css?cacheid=216d6b5d" }, { DYNAMIC_CONTENT, "/ROOT/skin/viewer.js" }, - { STATIC_CONTENT, "/ROOT/skin/viewer.js?cacheid=e250a5c9" }, + { STATIC_CONTENT, "/ROOT/skin/viewer.js?cacheid=23966598" }, { DYNAMIC_CONTENT, "/ROOT/skin/fonts/Poppins.ttf" }, { STATIC_CONTENT, "/ROOT/skin/fonts/Poppins.ttf?cacheid=af705837" }, { DYNAMIC_CONTENT, "/ROOT/skin/fonts/Roboto.ttf" }, @@ -291,7 +291,7 @@ R"EXPECTEDRESULT( - + const blankPageUrl = root + "/skin/blank.html?cacheid=6b1fa032";