From 0210e4f9a4be2f3e6eb99103581e6c0613e4fde6 Mon Sep 17 00:00:00 2001 From: zefie Date: Sun, 9 Oct 2022 10:00:38 -0400 Subject: [PATCH] fixes to wtv-favorites --- .../ServiceVault/wtv-favorite/add.js | 141 +++++++++++++++--- .../wtv-favorite/canned/favorite_default.gif | Bin 0 -> 770 bytes .../wtv-favorite/commit-discard-favorites.js | 2 - .../wtv-favorite/serve-add-folder-page.js | 4 +- .../wtv-favorite/serve-arrange-favorites.js | 3 +- .../wtv-favorite/serve-browser.js | 2 +- .../wtv-favorite/serve-move-favorites.js | 3 +- .../wtv-favorite/serve-organize-favorites.js | 3 +- .../wtv-favorite/serve-rename-favorites.js | 3 +- .../wtv-favorite/serve-samples-page.js | 3 +- .../wtv-favorite/serve-shortcuts-favorites.js | 3 +- zefie_wtvp_minisrv/WTVFavorites.js | 126 ++++++++-------- 12 files changed, 196 insertions(+), 97 deletions(-) create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-favorite/canned/favorite_default.gif diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/add.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/add.js index 6b0f9555..d86e9209 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/add.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/add.js @@ -1,4 +1,8 @@ var minisrv_service_file = true; +var request_is_async = true; + +var max_redirects = 3; +var redirects = 0; function hex_to_ascii(POST) { @@ -8,38 +12,127 @@ function hex_to_ascii(POST) str += String.fromCharCode(parseInt(hex.substr(n, 2), 16)); } return str; - } +} +if (request_headers.post_data) { + var POST = request_headers.post_data; + var image = hex_to_ascii(POST); +} -var POST = request_headers.post_data; -var image = hex_to_ascii(POST); +function getTitle(url) { + return new Promise(function (resolve, reject) { + var page_title = "Web Page"; + var request_type = (url.substring(0, 5) == "https") ? "https" : "http"; + var proxy_agent = null; + switch (request_type) { + case "https": + var proxy_agent = require('https'); + break; + case "http": + var proxy_agent = require('http');; + break; + } + if (proxy_agent) { + var options = { + method: 'GET' + } + const request = proxy_agent.get(url, options, (response) => { + let req_data = ''; + if (response.statusCode == 301 || response.statusCode == 302) { + redirects++; + if (redirects < max_redirects) resolve(getTitle(response.headers.location)); + else reject(`Too many redirects. Max: ${max_redirects}, Current: ${redirects}`); + } + response.on('data', (chunk) => { + req_data += chunk.toString(); + }); -var url = request_headers.request; + response.on('end', () => { + let match = req_data.match(/([^<]*)<\/title>/) // regular expression to parse contents of the <title> tag + if (match && typeof match[1] === 'string') page_title = match[1]; + resolve(page_title); + }); + }); -var title = url.split('favorite-title=')[1] -title = title.split('&')[0] + request.on('error', (error) => { + console.log(' *** Error getting title for wtv-favorite', error); + reject(); + }); + } + }); +} -var folder = url.split('favorite-category=')[1] -folder = folder.split('&')[0] -folder = folder.replaceAll("+", " ") +async function saveFavorite(favstore, title, folder, imagetype, favurl) { + var headers, data = ''; + if (!favstore.favstoreExists()) { + // create favstore if the user hasn't already navigated to favorites + favstore.createFavstore(); + } + if (favstore.favstoreExists()) { + var default_folder = "Personal"; // default to "Personal" + var favoritenum = 0; -var imagetype = url.split('favorite-thumbnail-type=')[1] -imagetype = imagetype.split('&')[0] + if (!folder) folder = default_folder; + if (!favstore.folderExists(folder)) { + // user did not define a folder, and the default folder does not exist + // so choose the user's first available folder + var favfolders = favstore.listFolders(); + if (favfolders.length > 0) folder = favfolders[0]; + } + if (!folder) { + // user has no folders, forcefully recreate "Personal" + folder = default_folder; + favstore.createTemplateFolder(folder); + } -var favurl = url.split('favorite-url=')[1] -favurl = favurl.split('&')[0] + var favarray = favstore.listFavorites(folder); + favoritenum = Object.keys(favarray).length; -var favoritenum = 0; -var favstore_exists = ssid_sessions[socket.ssid].favstore.favstoreExists(); -var favarray = ssid_sessions[socket.ssid].favstore.listFavorites(folder); -favoritenum = Object.keys(favarray).length; -if (favoritenum == minisrv_config.services[service_name].max_favorites_per_folder) -{ - headers = `400 You can only have ${minisrv_config.services[service_name].max_favorites_per_folder} favorites in a folder. Discard some favorites or choose a different folder, then try again.` -} else { + if (!title) { + try { + await getTitle(favurl).then(function (res) { + title = res; + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Client sent favorite-url without title, got title:", title); + }); + } catch (e) { + console.error(" * Error: Client sent favorite-url without title, and we could not get the title from the server:", e); + } + } -var createresult = ssid_sessions[socket.ssid].favstore.createFavorite(title, favurl, folder, image, imagetype); + if (!image) { + imagetype = "url"; + image = "canned/favorite_default.gif" + } -headers = `200 OK + if (favoritenum == minisrv_config.services[service_name].max_favorites_per_folder) { + headers = `400 You can only have ${minisrv_config.services[service_name].max_favorites_per_folder} favorites in a folder. Discard some favorites or choose a different folder, then try again.` + } else { + + var createresult = favstore.createFavorite(title, favurl, folder, image, imagetype); + if (!createresult) { // true if fail + headers = `200 OK wtv-expire: wtv-favorite:/serve-browser?favorite_folder_name=${folder}` -} \ No newline at end of file + } else { + var err = wtvshared.doErrorPage(500); + headers = err[0]; + data = err[1]; + } + + sendToClient(socket, headers, data); + } + } else { + var err = wtvshared.doErrorPage(500); + headers = err[0]; + data = err[1]; + sendToClient(socket, headers, data); + } +} + + +var title = request_headers.query['favorite-title']; +var folder = request_headers.query['favorite-category']; +if (folder) folder = folder.replaceAll("+", " ") +var imagetype = request_headers.query['favorite-thumbnail-type'] +var favurl = request_headers.query['favorite-url']; + +saveFavorite(ssid_sessions[socket.ssid].favstore, title, folder, imagetype, favurl); \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/canned/favorite_default.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/canned/favorite_default.gif new file mode 100644 index 0000000000000000000000000000000000000000..66fa31842ac5e5ffdaff9976cd74605637372155 GIT binary patch literal 770 zcmchU`%er20LMRFEv;5^m8hgH)m&*wkE_<y^`bN#Lpx(#YgiLojPjUtJ&()vq#_kF zZ8Z*&vmP96(KyxESWmCC=pm6GO#Kr+`~Ld*<@<@<93u%<#NbbtoCPdlIXHm`JU|RS z;0FO9flvs8aF9Y2#6SYbU>hvhyI~LP1qJMbgOCn~AOns-CS<`0I0dKS3>1J0)S!Vf zsDK)%hX%L?H=zld;TCA&F0{aXcnCUZgAV9~$Iu1c&;thOg}3k?24E0|U<5|t1AK(f z@CClYI84Ad_zsgW1=BDCKVTMq!W{hi?{l3uF*09x#(S~EViT79%_c{go0nfuSfo04 zUR``aQ&L)1UQv1RQdM=$<tw#UOO5PTJD975E^hX9#Wo>{a_uguN1?ILCapHX-=e9= zbGuG2-*_X}Hs+~ri(^N=d(sPiq?yugYoAWG;+4`;_D&y`BZwZ=MH>yWVNAb<b(6Za z6S1>esZsp=vq8a~-+fO~l7)w@P173v3`If4=5}Jm60ekYmx=789#7?fN<AyN?WM82 z9w?eHY4dGNh>pW}O6znibs&D3V1HV-aP*UlV@S)`RPcdLO;w!GdR0_}s@u!CQYcmQ z=JiX11OK$j3n?j#EzfXIJ^MUdyt2z7ZoQ#a9+@0EGo5+TETZ&ytd$|Ge?-;l^>WTx z<!Y6m93^P?aTE>vHdyxND_##vWN#D_v1f*hccraqwatKGhuhHxvz_-6vyww(OY56$ bsth7gphysq?lxZc=)vSrr_v(G){M}9x99a@ literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/commit-discard-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/commit-discard-favorites.js index b4701981..c0d6e030 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/commit-discard-favorites.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/commit-discard-favorites.js @@ -56,7 +56,6 @@ if (errpage) { Connection: Keep-Alive Content-Type: text/html wtv-expire-all: wtv-favorite: -wtv-visit: ${confirmAlert} Location: ${confirmAlert}` } else { @@ -72,7 +71,6 @@ Location: ${confirmAlert}` Connection: Keep-Alive Content-Type: text/html wtv-expire-all: wtv-favorite: -wtv-visit: ${gourl} Location: ${gourl}` } } diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-add-folder-page.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-add-folder-page.js index 8314a03d..614ac988 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-add-folder-page.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-add-folder-page.js @@ -2,7 +2,9 @@ var minisrv_service_file = true; headers = `200 OK Connection: Keep-Alive -Content-Type: text/html` +Content-Type: text/html +wtv-expire-all: wtv-favorite:/serve- +wtv-expire-all: wtv-favorite:/favorite` data = `<HTML> diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-arrange-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-arrange-favorites.js index d474618f..64caed6f 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-arrange-favorites.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-arrange-favorites.js @@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length; headers = `200 OK Connection: Keep-Alive -Content-Type: text/html` +Content-Type: text/html +wtv-expire-all: wtv-favorite:/serve-` data = `<html><head> diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-browser.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-browser.js index c5e26252..05ac1a37 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-browser.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-browser.js @@ -17,7 +17,7 @@ favoritenum = Object.keys(favarray).length; headers = `200 OK Connection: Keep-Alive Content-Type: text/html -wtv-expire-all: wtv-favorite:/serve-browser +wtv-expire-all: wtv-favorite:/serve- wtv-expire-all: wtv-favorite:/favorite ` diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-move-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-move-favorites.js index f9f26738..ecbca854 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-move-favorites.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-move-favorites.js @@ -32,7 +32,8 @@ folderlist += "</select>" headers = `200 OK Connection: Keep-Alive -Content-Type: text/html` +Content-Type: text/html +wtv-expire-all: wtv-favorite:/serve-` data = `<html><head> diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-organize-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-organize-favorites.js index 7f1e2d9d..6980031d 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-organize-favorites.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-organize-favorites.js @@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length; headers = `200 OK Connection: Keep-Alive -Content-Type: text/html` +Content-Type: text/html +wtv-expire-all: wtv-favorite:/serve-` data = `<html><head> diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-rename-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-rename-favorites.js index 79c5c1f5..b73b7284 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-rename-favorites.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-rename-favorites.js @@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length; headers = `200 OK Connection: Keep-Alive -Content-Type: text/html` +Content-Type: text/html +wtv-expire-all: wtv-favorite:/serve-` data = `<html><head> diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-samples-page.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-samples-page.js index 45f0f955..5739915d 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-samples-page.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-samples-page.js @@ -2,7 +2,8 @@ var minisrv_service_file = true; headers = `200 OK Connection: Keep-Alive -Content-Type: text/html` +Content-Type: text/html +wtv-expire-all: wtv-favorite:/serve-` data = `<HTML> diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-shortcuts-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-shortcuts-favorites.js index 267ce3ad..579648ae 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-shortcuts-favorites.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-shortcuts-favorites.js @@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length; headers = `200 OK Connection: Keep-Alive -Content-Type: text/html` +Content-Type: text/html +wtv-expire-all: wtv-favorite:/serve-` data = `<html> diff --git a/zefie_wtvp_minisrv/WTVFavorites.js b/zefie_wtvp_minisrv/WTVFavorites.js index 99ed4099..8aa9c9f7 100644 --- a/zefie_wtvp_minisrv/WTVFavorites.js +++ b/zefie_wtvp_minisrv/WTVFavorites.js @@ -135,78 +135,78 @@ class WTVFavorites { } createFavorite(title, url, folder, image, imagetype) { - var folderpath = this.getFolderDir(folder); - var favoriteid = this.createFavoriteID(); - var favoritefile = favoriteid + this.favFileExt; - var favoritefileout = folderpath + favoritefile; - if (imagetype != "url") - image = btoa(image); - - title = decodeURIComponent(title).replaceAll("+", " "); - url = decodeURIComponent(url) - var favoritedata = { - "title": title, - "url": url, - "folder": folder, - "image": image, - "imagetype": imagetype, - "id": favoriteid - } - try { - if (this.fs.existsSync(favoritefileout)) { - console.log(" * ERROR: Favorite with this UUID (" + favoriteid + ") already exists (should never happen). Favorite lost."); - return false; - } + var folderpath = this.getFolderDir(folder); + var favoriteid = this.createFavoriteID(); + var favoritefile = favoriteid + this.favFileExt; + var favoritefileout = folderpath + favoritefile; + if (imagetype != "url") + image = btoa(image); - // encode favorite into json - var result = this.fs.writeFileSync(favoritefileout, JSON.stringify(favoritedata)); - if (!result) return false; + title = decodeURIComponent(title).replaceAll("+", " "); + url = decodeURIComponent(url) + var favoritedata = { + "title": title, + "url": url, + "folder": folder, + "image": image, + "imagetype": imagetype, + "id": favoriteid + } + try { + if (this.fs.existsSync(favoritefileout)) { + console.log(" * ERROR: Favorite with this UUID (" + favoriteid + ") already exists (should never happen). Favorite lost."); + return false; + } - } catch (e) { - console.error(" # FavErr: Favorite Store failed\n", e, "\n", favoritefileout, "\n", favorite ,"\n"); - } - return false; - } + // encode favorite into json + var result = this.fs.writeFileSync(favoritefileout, JSON.stringify(favoritedata)); + if (!result) return false; + + } catch (e) { + console.error(" # FavErr: Favorite Store failed\n", e, "\n", favoritefileout, "\n", favorite, "\n"); + } + return false; + } listFavorites(folder) { - var folderpath = this.getFolderDir(folder); - var self = this; - self.messageArr = []; - var files = this.fs.readdirSync(folderpath) - .map(function (v) { - var favorite_data_raw = null; - var favoritepath = folderpath + self.path.sep + v; - if (self.fs.existsSync(favoritepath)) favorite_data_raw = self.fs.readFileSync(favoritepath); - if (favorite_data_raw) { - var favorite_data = JSON.parse(favorite_data_raw); - self.messageArr.push(favorite_data); - } - - }) - return self.messageArr; - } + var folderpath = this.getFolderDir(folder); + var self = this; + self.messageArr = []; + this.fs.readdirSync(folderpath) + .map(function (v) { + var favorite_data_raw = null; + var favoritepath = folderpath + self.path.sep + v; + if (self.fs.existsSync(favoritepath)) favorite_data_raw = self.fs.readFileSync(favoritepath); + if (favorite_data_raw) { + var favorite_data = JSON.parse(favorite_data_raw); + self.messageArr.push(favorite_data); + } + + }) + return self.messageArr; + } getFavorite(folder, favoriteid) { - var folder_path = this.getFolderDir(folder); - var folder_file = favoriteid + this.favFileExt; - var folder_file_in = folder_path + this.path.sep + folder_file; - var folder_data_raw = null; + var folder_path = this.getFolderDir(folder); + var folder_file = favoriteid + this.favFileExt; + var folder_file_in = folder_path + this.path.sep + folder_file; + var folder_data_raw = null; - if (this.fs.existsSync(folder_file_in)) folder_data_raw = this.fs.readFileSync(folder_file_in); - else console.error(" # FavErr: could not find ", folder_file_in); + if (this.fs.existsSync(folder_file_in)) folder_data_raw = this.fs.readFileSync(folder_file_in); + else console.error(" # FavErr: could not find ", folder_file_in); - if (folder_data_raw) { - var folder_data = JSON.parse(folder_data_raw); - folder_data.folder_path = folder_path; - folder_data.folder_file = folder_file; - if (folder_data) { - folder_data.id = favoriteid; + if (folder_data_raw) { + var folder_data = JSON.parse(folder_data_raw); + folder_data.folder_path = folder_path; + folder_data.folder_file = folder_file; + if (folder_data) { + folder_data.id = favoriteid; - return folder_data; - } - else console.error(" # FavErr: could not parse json in ", folder_file_in); - } - return false; + return folder_data; + } + else console.error(" # FavErr: could not parse json in ", folder_file_in); + } + return false; } deleteFolder(folder){